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"
78 char * program_name = "readelf";
79 unsigned int dynamic_addr;
80 bfd_size_type dynamic_size;
81 unsigned int rela_addr;
82 unsigned int rela_size;
83 char * dynamic_strings;
85 unsigned long num_dynamic_syms;
86 Elf_Internal_Sym * dynamic_symbols;
87 Elf_Internal_Syminfo * dynamic_syminfo;
88 unsigned long dynamic_syminfo_offset;
89 unsigned int dynamic_syminfo_nent;
90 char program_interpreter [64];
91 int dynamic_info[DT_JMPREL + 1];
94 Elf_Internal_Ehdr elf_header;
95 Elf_Internal_Shdr * section_headers;
96 Elf_Internal_Dyn * dynamic_segment;
103 int do_using_dynamic;
110 int do_debug_abbrevs;
112 int do_debug_pubnames;
113 int do_debug_aranges;
118 /* A dynamic array of flags indicating which sections require dumping. */
119 char * dump_sects = NULL;
120 unsigned int num_dump_sects = 0;
122 #define HEX_DUMP (1 << 0)
123 #define DISASS_DUMP (1 << 1)
124 #define DEBUG_DUMP (1 << 2)
126 /* How to rpint a vma value. */
127 typedef enum print_mode
139 /* Forward declarations for dumb compilers. */
140 static void print_vma PARAMS ((bfd_vma, print_mode));
141 static bfd_vma (* byte_get) PARAMS ((unsigned char *, int));
142 static bfd_vma byte_get_little_endian PARAMS ((unsigned char *, int));
143 static bfd_vma byte_get_big_endian PARAMS ((unsigned char *, int));
144 static const char * get_mips_dynamic_type PARAMS ((unsigned long));
145 static const char * get_sparc64_dynamic_type PARAMS ((unsigned long));
146 static const char * get_parisc_dynamic_type PARAMS ((unsigned long));
147 static const char * get_dynamic_type PARAMS ((unsigned long));
148 static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
149 static char * get_file_type PARAMS ((unsigned));
150 static char * get_machine_name PARAMS ((unsigned));
151 static void decode_ARM_machine_flags PARAMS ((unsigned, char []));
152 static char * get_machine_flags PARAMS ((unsigned, unsigned));
153 static const char * get_mips_segment_type PARAMS ((unsigned long));
154 static const char * get_parisc_segment_type PARAMS ((unsigned long));
155 static const char * get_segment_type PARAMS ((unsigned long));
156 static const char * get_mips_section_type_name PARAMS ((unsigned int));
157 static const char * get_parisc_section_type_name PARAMS ((unsigned int));
158 static const char * get_section_type_name PARAMS ((unsigned int));
159 static const char * get_symbol_binding PARAMS ((unsigned int));
160 static const char * get_symbol_type PARAMS ((unsigned int));
161 static const char * get_symbol_visibility PARAMS ((unsigned int));
162 static const char * get_symbol_index_type PARAMS ((unsigned int));
163 static const char * get_dynamic_flags PARAMS ((bfd_vma));
164 static void usage PARAMS ((void));
165 static void parse_args PARAMS ((int, char **));
166 static int process_file_header PARAMS ((void));
167 static int process_program_headers PARAMS ((FILE *));
168 static int process_section_headers PARAMS ((FILE *));
169 static void dynamic_segment_mips_val PARAMS ((Elf_Internal_Dyn *));
170 static void dynamic_segment_parisc_val PARAMS ((Elf_Internal_Dyn *));
171 static int process_dynamic_segment PARAMS ((FILE *));
172 static int process_symbol_table PARAMS ((FILE *));
173 static int process_section_contents PARAMS ((FILE *));
174 static void process_file PARAMS ((char *));
175 static int process_relocs PARAMS ((FILE *));
176 static int process_version_sections PARAMS ((FILE *));
177 static char * get_ver_flags PARAMS ((unsigned int));
178 static int get_32bit_section_headers PARAMS ((FILE *));
179 static int get_64bit_section_headers PARAMS ((FILE *));
180 static int get_32bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
181 static int get_64bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
182 static int get_file_header PARAMS ((FILE *));
183 static Elf_Internal_Sym * get_32bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
184 static Elf_Internal_Sym * get_64bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
185 static int * get_dynamic_data PARAMS ((FILE *, unsigned int));
186 static int get_32bit_dynamic_segment PARAMS ((FILE *));
187 static int get_64bit_dynamic_segment PARAMS ((FILE *));
188 #ifdef SUPPORT_DISASSEMBLY
189 static int disassemble_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
191 static int dump_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
192 static int display_debug_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
193 static int display_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
194 static int display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
195 static int display_debug_lines PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
196 static int display_debug_abbrev PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
197 static int display_debug_aranges PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
198 static unsigned char * process_abbrev_section PARAMS ((unsigned char *, unsigned char *));
199 static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int));
200 static int process_extended_line_op PARAMS ((unsigned char *, int, int));
201 static void reset_state_machine PARAMS ((int));
202 static char * get_TAG_name PARAMS ((unsigned long));
203 static char * get_AT_name PARAMS ((unsigned long));
204 static char * get_FORM_name PARAMS ((unsigned long));
205 static void free_abbrevs PARAMS ((void));
206 static void add_abbrev PARAMS ((unsigned long, unsigned long, int));
207 static void add_abbrev_attr PARAMS ((unsigned long, unsigned long));
208 static unsigned char * read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
209 static unsigned char * display_block PARAMS ((unsigned char *, unsigned long));
210 static void decode_location_expression PARAMS ((unsigned char *, unsigned int, unsigned long));
211 static void request_dump PARAMS ((unsigned int, char));
212 static const char * get_elf_class PARAMS ((unsigned char));
213 static const char * get_data_encoding PARAMS ((unsigned char));
214 static const char * get_osabi_name PARAMS ((unsigned char));
215 static int guess_is_rela PARAMS ((unsigned long));
216 static char * get_note_type PARAMS ((unsigned int));
217 static int process_note PARAMS ((Elf32_Internal_Note *));
218 static int process_corefile_note_segment PARAMS ((FILE *, bfd_vma, bfd_vma));
219 static int process_corefile_note_segments PARAMS ((FILE *));
220 static int process_corefile_contents PARAMS ((FILE *));
222 typedef int Elf32_Word;
230 #define SECTION_NAME(X) (string_table + (X)->sh_name)
232 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
234 #define BYTE_GET(field) byte_get (field, sizeof (field))
236 /* If we can support a 64 bit data type then BFD64 should be defined
237 and sizeof (bfd_vma) == 8. In this case when translating from an
238 external 8 byte field to an internal field, we can assume that the
239 internal field is also 8 bytes wide and so we can extact all the data.
240 If, however, BFD64 is not defined, then we must assume that the
241 internal data structure only has 4 byte wide fields that are the
242 equivalent of the 8 byte wide external counterparts, and so we must
243 truncate the data. */
245 #define BYTE_GET8(field) byte_get (field, -8)
247 #define BYTE_GET8(field) byte_get (field, 8)
250 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
252 #define GET_DATA_ALLOC(offset, size, var, type, reason) \
253 if (fseek (file, offset, SEEK_SET)) \
255 error (_("Unable to seek to start of %s at %x\n"), reason, offset); \
259 var = (type) malloc (size); \
263 error (_("Out of memory allocating %d bytes for %s\n"), size, reason); \
267 if (fread (var, size, 1, file) != 1) \
269 error (_("Unable to read in %d bytes of %s\n"), size, reason); \
276 #define GET_DATA(offset, var, reason) \
277 if (fseek (file, offset, SEEK_SET)) \
279 error (_("Unable to seek to %x for %s\n"), offset, reason); \
282 else if (fread (& var, sizeof (var), 1, file) != 1) \
284 error (_("Unable to read data at %x for %s\n"), offset, reason); \
288 #define GET_ELF_SYMBOLS(file, offset, size) \
289 (is_32bit_elf ? get_32bit_elf_symbols (file, offset, size) \
290 : get_64bit_elf_symbols (file, offset, size))
293 #ifdef ANSI_PROTOTYPES
295 error (const char * message, ...)
299 fprintf (stderr, _("%s: Error: "), program_name);
300 va_start (args, message);
301 vfprintf (stderr, message, args);
307 warn (const char * message, ...)
311 fprintf (stderr, _("%s: Warning: "), program_name);
312 va_start (args, message);
313 vfprintf (stderr, message, args);
325 fprintf (stderr, _("%s: Error: "), program_name);
327 message = va_arg (args, char *);
328 vfprintf (stderr, message, args);
340 fprintf (stderr, _("%s: Warning: "), program_name);
342 message = va_arg (args, char *);
343 vfprintf (stderr, message, args);
350 byte_get_little_endian (field, size)
351 unsigned char * field;
360 return ((unsigned int) (field [0]))
361 | (((unsigned int) (field [1])) << 8);
364 /* We want to extract data from an 8 byte wide field and
365 place it into a 4 byte wide field. Since this is a little
366 endian source we can juts use the 4 byte extraction code. */
369 return ((unsigned long) (field [0]))
370 | (((unsigned long) (field [1])) << 8)
371 | (((unsigned long) (field [2])) << 16)
372 | (((unsigned long) (field [3])) << 24);
376 /* This is a special case, generated by the BYTE_GET8 macro.
377 It means that we are loading an 8 byte value from a field
378 in an external structure into an 8 byte value in a field
379 in an internal strcuture. */
380 return ((bfd_vma) (field [0]))
381 | (((bfd_vma) (field [1])) << 8)
382 | (((bfd_vma) (field [2])) << 16)
383 | (((bfd_vma) (field [3])) << 24)
384 | (((bfd_vma) (field [4])) << 32)
385 | (((bfd_vma) (field [5])) << 40)
386 | (((bfd_vma) (field [6])) << 48)
387 | (((bfd_vma) (field [7])) << 56);
390 error (_("Unhandled data length: %d\n"), size);
395 /* Print a VMA value. */
397 print_vma (vma, mode)
407 case FULL_HEX: printf ("0x"); /* drop through */
408 case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
409 case PREFIX_HEX: printf ("0x"); /* drop through */
410 case HEX: printf ("%lx", (unsigned long) vma); break;
411 case DEC: printf ("%ld", (unsigned long) vma); break;
412 case DEC_5: printf ("%5ld", (long) vma); break;
413 case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
434 #if BFD_HOST_64BIT_LONG
437 if (_bfd_int64_high (vma))
438 printf ("%lx%lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
440 printf ("%lx", _bfd_int64_low (vma));
445 #if BFD_HOST_64BIT_LONG
448 if (_bfd_int64_high (vma))
450 printf ("++%ld", _bfd_int64_low (vma));
452 printf ("%ld", _bfd_int64_low (vma));
457 #if BFD_HOST_64BIT_LONG
458 printf ("%5ld", vma);
460 if (_bfd_int64_high (vma))
462 printf ("++%ld", _bfd_int64_low (vma));
464 printf ("%5ld", _bfd_int64_low (vma));
469 #if BFD_HOST_64BIT_LONG
472 if (_bfd_int64_high (vma))
474 printf ("++%lu", _bfd_int64_low (vma));
476 printf ("%lu", _bfd_int64_low (vma));
485 byte_get_big_endian (field, size)
486 unsigned char * field;
495 return ((unsigned int) (field [1])) | (((int) (field [0])) << 8);
498 return ((unsigned long) (field [3]))
499 | (((unsigned long) (field [2])) << 8)
500 | (((unsigned long) (field [1])) << 16)
501 | (((unsigned long) (field [0])) << 24);
504 /* Although we are extracing data from an 8 byte wide field, we
505 are returning only 4 bytes of data. */
506 return ((unsigned long) (field [7]))
507 | (((unsigned long) (field [6])) << 8)
508 | (((unsigned long) (field [5])) << 16)
509 | (((unsigned long) (field [4])) << 24);
513 /* This is a special case, generated by the BYTE_GET8 macro.
514 It means that we are loading an 8 byte value from a field
515 in an external structure into an 8 byte value in a field
516 in an internal strcuture. */
517 return ((bfd_vma) (field [7]))
518 | (((bfd_vma) (field [6])) << 8)
519 | (((bfd_vma) (field [5])) << 16)
520 | (((bfd_vma) (field [4])) << 24)
521 | (((bfd_vma) (field [3])) << 32)
522 | (((bfd_vma) (field [2])) << 40)
523 | (((bfd_vma) (field [1])) << 48)
524 | (((bfd_vma) (field [0])) << 56);
528 error (_("Unhandled data length: %d\n"), size);
534 /* Guess the relocation sized based on the sized commonly used by the specific machine. */
536 guess_is_rela (e_machine)
537 unsigned long e_machine;
541 /* Targets that use REL relocations. */
552 /* Targets that use RELA relocations. */
560 case EM_CYGNUS_MN10200:
561 case EM_CYGNUS_MN10300:
589 warn (_("Don't know about relocations on this machine architecture\n"));
594 /* Display the contents of the relocation data found at the specified offset. */
596 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
598 unsigned long rel_offset;
599 unsigned long rel_size;
600 Elf_Internal_Sym * symtab;
606 Elf_Internal_Rel * rels;
607 Elf_Internal_Rela * relas;
610 if (is_rela == UNKNOWN)
611 is_rela = guess_is_rela (elf_header.e_machine);
617 Elf32_External_Rela * erelas;
619 GET_DATA_ALLOC (rel_offset, rel_size, erelas,
620 Elf32_External_Rela *, "relocs");
622 rel_size = rel_size / sizeof (Elf32_External_Rela);
624 relas = (Elf_Internal_Rela *)
625 malloc (rel_size * sizeof (Elf_Internal_Rela));
629 error(_("out of memory parsing relocs"));
633 for (i = 0; i < rel_size; i++)
635 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
636 relas[i].r_info = BYTE_GET (erelas[i].r_info);
637 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
642 rels = (Elf_Internal_Rel *) relas;
646 Elf64_External_Rela * erelas;
648 GET_DATA_ALLOC (rel_offset, rel_size, erelas,
649 Elf64_External_Rela *, "relocs");
651 rel_size = rel_size / sizeof (Elf64_External_Rela);
653 relas = (Elf_Internal_Rela *)
654 malloc (rel_size * sizeof (Elf_Internal_Rela));
658 error(_("out of memory parsing relocs"));
662 for (i = 0; i < rel_size; i++)
664 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
665 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
666 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
671 rels = (Elf_Internal_Rel *) relas;
678 Elf32_External_Rel * erels;
680 GET_DATA_ALLOC (rel_offset, rel_size, erels,
681 Elf32_External_Rel *, "relocs");
683 rel_size = rel_size / sizeof (Elf32_External_Rel);
685 rels = (Elf_Internal_Rel *)
686 malloc (rel_size * sizeof (Elf_Internal_Rel));
690 error(_("out of memory parsing relocs"));
694 for (i = 0; i < rel_size; i++)
696 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
697 rels[i].r_info = BYTE_GET (erels[i].r_info);
702 relas = (Elf_Internal_Rela *) rels;
706 Elf64_External_Rel * erels;
708 GET_DATA_ALLOC (rel_offset, rel_size, erels,
709 Elf64_External_Rel *, "relocs");
711 rel_size = rel_size / sizeof (Elf64_External_Rel);
713 rels = (Elf_Internal_Rel *)
714 malloc (rel_size * sizeof (Elf_Internal_Rel));
718 error(_("out of memory parsing relocs"));
722 for (i = 0; i < rel_size; i++)
724 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
725 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
730 relas = (Elf_Internal_Rela *) rels;
736 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
739 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
741 for (i = 0; i < rel_size; i++)
746 bfd_vma symtab_index;
751 offset = relas [i].r_offset;
752 info = relas [i].r_info;
756 offset = rels [i].r_offset;
757 info = rels [i].r_info;
762 type = ELF32_R_TYPE (info);
763 symtab_index = ELF32_R_SYM (info);
767 if (elf_header.e_machine == EM_SPARCV9)
768 type = ELF64_R_TYPE_ID (info);
770 type = ELF64_R_TYPE (info);
771 /* The #ifdef BFD64 below is to prevent a compile time warning.
772 We know that if we do not have a 64 bit data type that we
773 will never execute this code anyway. */
775 symtab_index = ELF64_R_SYM (info);
779 #ifdef _bfd_int64_low
780 printf (" %8.8lx %5.5lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
782 printf (" %8.8lx %5.5lx ", offset, info);
785 switch (elf_header.e_machine)
792 rtype = elf_m32r_reloc_type (type);
797 rtype = elf_i386_reloc_type (type);
801 rtype = elf_m68k_reloc_type (type);
805 rtype = elf_i960_reloc_type (type);
809 rtype = elf_avr_reloc_type (type);
816 rtype = elf_sparc_reloc_type (type);
820 rtype = v850_reloc_type (type);
824 rtype = elf_d10v_reloc_type (type);
828 rtype = elf_d30v_reloc_type (type);
832 rtype = elf_sh_reloc_type (type);
835 case EM_CYGNUS_MN10300:
836 rtype = elf_mn10300_reloc_type (type);
839 case EM_CYGNUS_MN10200:
840 rtype = elf_mn10200_reloc_type (type);
844 rtype = elf_fr30_reloc_type (type);
848 rtype = elf_mcore_reloc_type (type);
852 rtype = elf_ppc_reloc_type (type);
857 rtype = elf_mips_reloc_type (type);
861 rtype = elf_alpha_reloc_type (type);
865 rtype = elf_arm_reloc_type (type);
869 rtype = elf_arc_reloc_type (type);
873 rtype = elf_hppa_reloc_type (type);
877 rtype = elf_pj_reloc_type (type);
880 rtype = elf_ia64_reloc_type (type);
885 #ifdef _bfd_int64_low
886 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type));
888 printf (_("unrecognised: %-7lx"), type);
891 printf ("%-21.21s", rtype);
897 if (symtab_index >= nsyms)
898 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
901 Elf_Internal_Sym * psym;
903 psym = symtab + symtab_index;
906 print_vma (psym->st_value, LONG_HEX);
909 if (psym->st_name == 0)
911 SECTION_NAME (section_headers + psym->st_shndx));
912 else if (strtab == NULL)
913 printf (_("<string table index %3ld>"), psym->st_name);
915 printf ("%-25.25s", strtab + psym->st_name);
918 printf (" + %lx", (unsigned long) relas [i].r_addend);
924 printf ("%*c", is_32bit_elf ? 34 : 26, ' ');
925 print_vma (relas[i].r_addend, LONG_HEX);
928 if (elf_header.e_machine == EM_SPARCV9
929 && !strcmp (rtype, "R_SPARC_OLO10"))
930 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
941 get_mips_dynamic_type (type)
946 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
947 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
948 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
949 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
950 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
951 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
952 case DT_MIPS_MSYM: return "MIPS_MSYM";
953 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
954 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
955 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
956 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
957 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
958 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
959 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
960 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
961 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
962 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
963 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
964 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
965 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
966 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
967 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
968 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
969 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
970 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
971 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
972 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
973 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
974 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
975 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
976 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
977 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
978 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
979 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
980 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
981 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
982 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
983 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
984 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
985 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
986 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
987 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
988 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
995 get_sparc64_dynamic_type (type)
1000 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1007 get_parisc_dynamic_type (type)
1012 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1013 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1014 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1015 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1016 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1017 case DT_HP_PREINIT: return "HP_PREINIT";
1018 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1019 case DT_HP_NEEDED: return "HP_NEEDED";
1020 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1021 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1022 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1023 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1024 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1031 get_dynamic_type (type)
1034 static char buff [32];
1038 case DT_NULL: return "NULL";
1039 case DT_NEEDED: return "NEEDED";
1040 case DT_PLTRELSZ: return "PLTRELSZ";
1041 case DT_PLTGOT: return "PLTGOT";
1042 case DT_HASH: return "HASH";
1043 case DT_STRTAB: return "STRTAB";
1044 case DT_SYMTAB: return "SYMTAB";
1045 case DT_RELA: return "RELA";
1046 case DT_RELASZ: return "RELASZ";
1047 case DT_RELAENT: return "RELAENT";
1048 case DT_STRSZ: return "STRSZ";
1049 case DT_SYMENT: return "SYMENT";
1050 case DT_INIT: return "INIT";
1051 case DT_FINI: return "FINI";
1052 case DT_SONAME: return "SONAME";
1053 case DT_RPATH: return "RPATH";
1054 case DT_SYMBOLIC: return "SYMBOLIC";
1055 case DT_REL: return "REL";
1056 case DT_RELSZ: return "RELSZ";
1057 case DT_RELENT: return "RELENT";
1058 case DT_PLTREL: return "PLTREL";
1059 case DT_DEBUG: return "DEBUG";
1060 case DT_TEXTREL: return "TEXTREL";
1061 case DT_JMPREL: return "JMPREL";
1062 case DT_BIND_NOW: return "BIND_NOW";
1063 case DT_INIT_ARRAY: return "INIT_ARRAY";
1064 case DT_FINI_ARRAY: return "FINI_ARRAY";
1065 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1066 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1067 case DT_RUNPATH: return "RUNPATH";
1068 case DT_FLAGS: return "FLAGS";
1070 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1071 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1073 case DT_CHECKSUM: return "CHECKSUM";
1074 case DT_PLTPADSZ: return "PLTPADSZ";
1075 case DT_MOVEENT: return "MOVEENT";
1076 case DT_MOVESZ: return "MOVESZ";
1077 case DT_FEATURE: return "FEATURE";
1078 case DT_POSFLAG_1: return "POSFLAG_1";
1079 case DT_SYMINSZ: return "SYMINSZ";
1080 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1082 case DT_ADDRRNGLO: return "ADDRRNGLO";
1083 case DT_CONFIG: return "CONFIG";
1084 case DT_DEPAUDIT: return "DEPAUDIT";
1085 case DT_AUDIT: return "AUDIT";
1086 case DT_PLTPAD: return "PLTPAD";
1087 case DT_MOVETAB: return "MOVETAB";
1088 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1090 case DT_VERSYM: return "VERSYM";
1092 case DT_RELACOUNT: return "RELACOUNT";
1093 case DT_RELCOUNT: return "RELCOUNT";
1094 case DT_FLAGS_1: return "FLAGS_1";
1095 case DT_VERDEF: return "VERDEF";
1096 case DT_VERDEFNUM: return "VERDEFNUM";
1097 case DT_VERNEED: return "VERNEED";
1098 case DT_VERNEEDNUM: return "VERNEEDNUM";
1100 case DT_AUXILIARY: return "AUXILARY";
1101 case DT_USED: return "USED";
1102 case DT_FILTER: return "FILTER";
1105 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1107 const char * result;
1109 switch (elf_header.e_machine)
1112 case EM_MIPS_RS4_BE:
1113 result = get_mips_dynamic_type (type);
1116 result = get_sparc64_dynamic_type (type);
1126 sprintf (buff, _("Processor Specific: %lx"), type);
1128 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1130 const char * result;
1132 switch (elf_header.e_machine)
1135 result = get_parisc_dynamic_type (type);
1145 sprintf (buff, _("Operating System specific: %lx"), type);
1148 sprintf (buff, _("<unknown>: %lx"), type);
1155 get_file_type (e_type)
1158 static char buff [32];
1162 case ET_NONE: return _("NONE (None)");
1163 case ET_REL: return _("REL (Relocatable file)");
1164 case ET_EXEC: return _("EXEC (Executable file)");
1165 case ET_DYN: return _("DYN (Shared object file)");
1166 case ET_CORE: return _("CORE (Core file)");
1169 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1170 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1171 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1172 sprintf (buff, _("OS Specific: (%x)"), e_type);
1174 sprintf (buff, _("<unknown>: %x"), e_type);
1180 get_machine_name (e_machine)
1183 static char buff [64]; /* XXX */
1187 case EM_NONE: return _("None");
1188 case EM_M32: return "WE32100";
1189 case EM_SPARC: return "Sparc";
1190 case EM_386: return "Intel 80386";
1191 case EM_68K: return "MC68000";
1192 case EM_88K: return "MC88000";
1193 case EM_486: return "Intel 80486";
1194 case EM_860: return "Intel 80860";
1195 case EM_MIPS: return "MIPS R3000";
1196 case EM_S370: return "IBM System/370";
1197 case EM_MIPS_RS4_BE: return "MIPS R4000 big-endian";
1198 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1199 case EM_PARISC: return "HPPA";
1200 case EM_PPC_OLD: return "Power PC (old)";
1201 case EM_SPARC32PLUS: return "Sparc v8+" ;
1202 case EM_960: return "Intel 90860";
1203 case EM_PPC: return "PowerPC";
1204 case EM_V800: return "NEC V800";
1205 case EM_FR20: return "Fujitsu FR20";
1206 case EM_RH32: return "TRW RH32";
1207 case EM_MCORE: return "MCORE";
1208 case EM_ARM: return "ARM";
1209 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1210 case EM_SH: return "Hitachi SH";
1211 case EM_SPARCV9: return "Sparc v9";
1212 case EM_TRICORE: return "Siemens Tricore";
1213 case EM_ARC: return "Argonaut RISC Core";
1214 case EM_H8_300: return "Hitachi H8/300";
1215 case EM_H8_300H: return "Hitachi H8/300H";
1216 case EM_H8S: return "Hitachi H8S";
1217 case EM_H8_500: return "Hitachi H8/500";
1218 case EM_IA_64: return "Intel IA-64";
1219 case EM_MIPS_X: return "Stanford MIPS-X";
1220 case EM_COLDFIRE: return "Motorola Coldfire";
1221 case EM_68HC12: return "Motorola M68HC12";
1222 case EM_ALPHA: return "Alpha";
1223 case EM_CYGNUS_D10V: return "d10v";
1224 case EM_CYGNUS_D30V: return "d30v";
1225 case EM_CYGNUS_ARC: return "Arc";
1226 case EM_CYGNUS_M32R: return "Mitsubishi M32r";
1227 case EM_CYGNUS_V850: return "NEC v850";
1228 case EM_CYGNUS_MN10300: return "mn10300";
1229 case EM_CYGNUS_MN10200: return "mn10200";
1230 case EM_CYGNUS_FR30: return "Fujitsu FR30";
1231 case EM_PJ: return "picoJava";
1232 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1233 case EM_PCP: return "Siemens PCP";
1234 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1235 case EM_NDR1: return "Denso NDR1 microprocesspr";
1236 case EM_STARCORE: return "Motorola Star*Core processor";
1237 case EM_ME16: return "Toyota ME16 processor";
1238 case EM_ST100: return "STMicroelectronics ST100 processor";
1239 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1240 case EM_FX66: return "Siemens FX66 microcontroller";
1241 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1242 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1243 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1244 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1245 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1246 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1247 case EM_SVX: return "Silicon Graphics SVx";
1248 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1249 case EM_VAX: return "Digital VAX";
1250 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1252 sprintf (buff, _("<unknown>: %x"), e_machine);
1258 decode_ARM_machine_flags (e_flags, buf)
1265 eabi = EF_ARM_EABI_VERSION (e_flags);
1266 e_flags &= ~ EF_ARM_EABIMASK;
1268 /* Handle "generic" ARM flags. */
1269 if (e_flags & EF_ARM_RELEXEC)
1271 strcat (buf, ", relocatable executable");
1272 e_flags &= ~ EF_ARM_RELEXEC;
1275 if (e_flags & EF_ARM_HASENTRY)
1277 strcat (buf, ", has entry point");
1278 e_flags &= ~ EF_ARM_HASENTRY;
1281 /* Now handle EABI specific flags. */
1285 strcat (buf, ", <unknown EABI>");
1290 case EF_ARM_EABI_VER1:
1295 /* Process flags one bit at a time. */
1296 flag = e_flags & - e_flags;
1301 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_INTERWORK. */
1302 strcat (buf, ", sorted symbol tables");
1312 case EF_ARM_EABI_UNKNOWN:
1317 /* Process flags one bit at a time. */
1318 flag = e_flags & - e_flags;
1324 strcat (buf, ", interworking enabled");
1328 strcat (buf, ", uses APCS/26");
1332 strcat (buf, ", uses APCS/float");
1336 strcat (buf, ", position independent");
1340 strcat (buf, ", 8 bit structure alignment");
1344 strcat (buf, ", uses new ABI");
1348 strcat (buf, ", uses old ABI");
1352 strcat (buf, ", software FP");
1363 strcat (buf,", <unknown>");
1367 get_machine_flags (e_flags, e_machine)
1371 static char buf [1024];
1383 decode_ARM_machine_flags (e_flags, buf);
1387 if (e_flags & EF_CPU32)
1388 strcat (buf, ", cpu32");
1392 if (e_flags & EF_PPC_EMB)
1393 strcat (buf, ", emb");
1395 if (e_flags & EF_PPC_RELOCATABLE)
1396 strcat (buf, ", relocatable");
1398 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1399 strcat (buf, ", relocatable-lib");
1402 case EM_CYGNUS_V850:
1403 switch (e_flags & EF_V850_ARCH)
1406 strcat (buf, ", v850e");
1409 strcat (buf, ", v850ea");
1412 strcat (buf, ", v850");
1415 strcat (buf, ", unknown v850 architecture variant");
1420 case EM_CYGNUS_M32R:
1421 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1422 strcat (buf, ", m32r");
1427 case EM_MIPS_RS4_BE:
1428 if (e_flags & EF_MIPS_NOREORDER)
1429 strcat (buf, ", noreorder");
1431 if (e_flags & EF_MIPS_PIC)
1432 strcat (buf, ", pic");
1434 if (e_flags & EF_MIPS_CPIC)
1435 strcat (buf, ", cpic");
1437 if (e_flags & EF_MIPS_ABI2)
1438 strcat (buf, ", abi2");
1440 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
1441 strcat (buf, ", mips1");
1443 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
1444 strcat (buf, ", mips2");
1446 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
1447 strcat (buf, ", mips3");
1449 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
1450 strcat (buf, ", mips4");
1454 if (e_flags & EF_SPARC_32PLUS)
1455 strcat (buf, ", v8+");
1457 if (e_flags & EF_SPARC_SUN_US1)
1458 strcat (buf, ", ultrasparcI");
1460 if (e_flags & EF_SPARC_SUN_US3)
1461 strcat (buf, ", ultrasparcIII");
1463 if (e_flags & EF_SPARC_HAL_R1)
1464 strcat (buf, ", halr1");
1466 if (e_flags & EF_SPARC_LEDATA)
1467 strcat (buf, ", ledata");
1469 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
1470 strcat (buf, ", tso");
1472 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
1473 strcat (buf, ", pso");
1475 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
1476 strcat (buf, ", rmo");
1480 switch (e_flags & EF_PARISC_ARCH)
1482 case EFA_PARISC_1_0:
1483 strcpy (buf, ", PA-RISC 1.0");
1485 case EFA_PARISC_1_1:
1486 strcpy (buf, ", PA-RISC 1.1");
1488 case EFA_PARISC_2_0:
1489 strcpy (buf, ", PA-RISC 2.0");
1494 if (e_flags & EF_PARISC_TRAPNIL)
1495 strcat (buf, ", trapnil");
1496 if (e_flags & EF_PARISC_EXT)
1497 strcat (buf, ", ext");
1498 if (e_flags & EF_PARISC_LSB)
1499 strcat (buf, ", lsb");
1500 if (e_flags & EF_PARISC_WIDE)
1501 strcat (buf, ", wide");
1502 if (e_flags & EF_PARISC_NO_KABP)
1503 strcat (buf, ", no kabp");
1504 if (e_flags & EF_PARISC_LAZYSWAP)
1505 strcat (buf, ", lazyswap");
1509 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
1510 strcat (buf, ", new calling convention");
1512 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
1513 strcat (buf, ", gnu calling convention");
1522 get_mips_segment_type (type)
1527 case PT_MIPS_REGINFO:
1529 case PT_MIPS_RTPROC:
1531 case PT_MIPS_OPTIONS:
1541 get_parisc_segment_type (type)
1546 case PT_HP_TLS: return "HP_TLS";
1547 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
1548 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
1549 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
1550 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
1551 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
1552 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
1553 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
1554 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
1555 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
1556 case PT_HP_PARALLEL: return "HP_PARALLEL";
1557 case PT_HP_FASTBIND: return "HP_FASTBIND";
1558 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
1559 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
1568 get_segment_type (p_type)
1569 unsigned long p_type;
1571 static char buff [32];
1575 case PT_NULL: return "NULL";
1576 case PT_LOAD: return "LOAD";
1577 case PT_DYNAMIC: return "DYNAMIC";
1578 case PT_INTERP: return "INTERP";
1579 case PT_NOTE: return "NOTE";
1580 case PT_SHLIB: return "SHLIB";
1581 case PT_PHDR: return "PHDR";
1584 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
1586 const char * result;
1588 switch (elf_header.e_machine)
1591 case EM_MIPS_RS4_BE:
1592 result = get_mips_segment_type (p_type);
1595 result = get_parisc_segment_type (p_type);
1605 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
1607 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
1609 const char * result;
1611 switch (elf_header.e_machine)
1614 result = get_parisc_segment_type (p_type);
1624 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
1627 sprintf (buff, _("<unknown>: %lx"), p_type);
1634 get_mips_section_type_name (sh_type)
1635 unsigned int sh_type;
1639 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1640 case SHT_MIPS_MSYM: return "MIPS_MSYM";
1641 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1642 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
1643 case SHT_MIPS_UCODE: return "MIPS_UCODE";
1644 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
1645 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
1646 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
1647 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
1648 case SHT_MIPS_RELD: return "MIPS_RELD";
1649 case SHT_MIPS_IFACE: return "MIPS_IFACE";
1650 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
1651 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1652 case SHT_MIPS_SHDR: return "MIPS_SHDR";
1653 case SHT_MIPS_FDESC: return "MIPS_FDESC";
1654 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
1655 case SHT_MIPS_DENSE: return "MIPS_DENSE";
1656 case SHT_MIPS_PDESC: return "MIPS_PDESC";
1657 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
1658 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
1659 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
1660 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
1661 case SHT_MIPS_LINE: return "MIPS_LINE";
1662 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
1663 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
1664 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
1665 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
1666 case SHT_MIPS_DWARF: return "MIPS_DWARF";
1667 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
1668 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1669 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
1670 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
1671 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
1672 case SHT_MIPS_XLATE: return "MIPS_XLATE";
1673 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
1674 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
1675 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
1676 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
1677 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
1685 get_parisc_section_type_name (sh_type)
1686 unsigned int sh_type;
1690 case SHT_PARISC_EXT: return "PARISC_EXT";
1691 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
1692 case SHT_PARISC_DOC: return "PARISC_DOC";
1700 get_section_type_name (sh_type)
1701 unsigned int sh_type;
1703 static char buff [32];
1707 case SHT_NULL: return "NULL";
1708 case SHT_PROGBITS: return "PROGBITS";
1709 case SHT_SYMTAB: return "SYMTAB";
1710 case SHT_STRTAB: return "STRTAB";
1711 case SHT_RELA: return "RELA";
1712 case SHT_HASH: return "HASH";
1713 case SHT_DYNAMIC: return "DYNAMIC";
1714 case SHT_NOTE: return "NOTE";
1715 case SHT_NOBITS: return "NOBITS";
1716 case SHT_REL: return "REL";
1717 case SHT_SHLIB: return "SHLIB";
1718 case SHT_DYNSYM: return "DYNSYM";
1719 case SHT_INIT_ARRAY: return "INIT_ARRAY";
1720 case SHT_FINI_ARRAY: return "FINI_ARRAY";
1721 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1722 case SHT_GNU_verdef: return "VERDEF";
1723 case SHT_GNU_verneed: return "VERNEED";
1724 case SHT_GNU_versym: return "VERSYM";
1725 case 0x6ffffff0: return "VERSYM";
1726 case 0x6ffffffc: return "VERDEF";
1727 case 0x7ffffffd: return "AUXILIARY";
1728 case 0x7fffffff: return "FILTER";
1731 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
1733 const char * result;
1735 switch (elf_header.e_machine)
1738 case EM_MIPS_RS4_BE:
1739 result = get_mips_section_type_name (sh_type);
1742 result = get_parisc_section_type_name (sh_type);
1752 sprintf (buff, "SHT_LOPROC+%x", sh_type - SHT_LOPROC);
1754 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
1755 sprintf (buff, "SHT_LOOS+%x", sh_type - SHT_LOOS);
1756 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
1757 sprintf (buff, "SHT_LOUSER+%x", sh_type - SHT_LOUSER);
1759 sprintf (buff, _("<unknown>: %x"), sh_type);
1765 struct option options [] =
1767 {"all", no_argument, 0, 'a'},
1768 {"file-header", no_argument, 0, 'h'},
1769 {"program-headers", no_argument, 0, 'l'},
1770 {"headers", no_argument, 0, 'e'},
1771 {"histogram", no_argument, 0, 'I'},
1772 {"segments", no_argument, 0, 'l'},
1773 {"sections", no_argument, 0, 'S'},
1774 {"section-headers", no_argument, 0, 'S'},
1775 {"symbols", no_argument, 0, 's'},
1776 {"syms", no_argument, 0, 's'},
1777 {"relocs", no_argument, 0, 'r'},
1778 {"notes", no_argument, 0, 'n'},
1779 {"dynamic", no_argument, 0, 'd'},
1780 {"arch-specific", no_argument, 0, 'A'},
1781 {"version-info", no_argument, 0, 'V'},
1782 {"use-dynamic", no_argument, 0, 'D'},
1783 {"hex-dump", required_argument, 0, 'x'},
1784 {"debug-dump", optional_argument, 0, 'w'},
1785 #ifdef SUPPORT_DISASSEMBLY
1786 {"instruction-dump", required_argument, 0, 'i'},
1789 {"version", no_argument, 0, 'v'},
1790 {"help", no_argument, 0, 'H'},
1791 {0, no_argument, 0, 0}
1797 fprintf (stdout, _("Usage: readelf {options} elf-file(s)\n"));
1798 fprintf (stdout, _(" Options are:\n"));
1799 fprintf (stdout, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
1800 fprintf (stdout, _(" -h or --file-header Display the ELF file header\n"));
1801 fprintf (stdout, _(" -l or --program-headers or --segments\n"));
1802 fprintf (stdout, _(" Display the program headers\n"));
1803 fprintf (stdout, _(" -S or --section-headers or --sections\n"));
1804 fprintf (stdout, _(" Display the sections' header\n"));
1805 fprintf (stdout, _(" -e or --headers Equivalent to: -h -l -S\n"));
1806 fprintf (stdout, _(" -s or --syms or --symbols Display the symbol table\n"));
1807 fprintf (stdout, _(" -n or --notes Display the core notes (if present)\n"));
1808 fprintf (stdout, _(" -r or --relocs Display the relocations (if present)\n"));
1809 fprintf (stdout, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
1810 fprintf (stdout, _(" -V or --version-info Display the version sections (if present)\n"));
1811 fprintf (stdout, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
1812 fprintf (stdout, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
1813 fprintf (stdout, _(" -x <number> or --hex-dump=<number>\n"));
1814 fprintf (stdout, _(" Dump the contents of section <number>\n"));
1815 fprintf (stdout, _(" -w[liapr] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges]\n"));
1816 fprintf (stdout, _(" Display the contents of DWARF2 debug sections\n"));
1817 #ifdef SUPPORT_DISASSEMBLY
1818 fprintf (stdout, _(" -i <number> or --instruction-dump=<number>\n"));
1819 fprintf (stdout, _(" Disassemble the contents of section <number>\n"));
1821 fprintf (stdout, _(" -I or --histogram Display histogram of bucket list lengths\n"));
1822 fprintf (stdout, _(" -v or --version Display the version number of readelf\n"));
1823 fprintf (stdout, _(" -H or --help Display this information\n"));
1824 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
1830 request_dump (section, type)
1831 unsigned int section;
1834 if (section >= num_dump_sects)
1836 char * new_dump_sects;
1838 new_dump_sects = (char *) calloc (section + 1, 1);
1840 if (new_dump_sects == NULL)
1841 error (_("Out of memory allocating dump request table."));
1844 /* Copy current flag settings. */
1845 memcpy (new_dump_sects, dump_sects, num_dump_sects);
1849 dump_sects = new_dump_sects;
1850 num_dump_sects = section + 1;
1855 dump_sects [section] |= type;
1861 parse_args (argc, argv)
1870 while ((c = getopt_long
1871 (argc, argv, "ersahnldSDAIw::x:i:vV", options, NULL)) != EOF)
1906 do_using_dynamic ++;
1934 section = strtoul (optarg, & cp, 0);
1935 if (! * cp && section >= 0)
1937 request_dump (section, HEX_DUMP);
1957 do_debug_abbrevs = 1;
1967 do_debug_pubnames = 1;
1972 do_debug_aranges = 1;
1976 warn (_("Unrecognised debug option '%s'\n"), optarg);
1981 #ifdef SUPPORT_DISASSEMBLY
1984 section = strtoul (optarg, & cp, 0);
1985 if (! * cp && section >= 0)
1987 request_dump (section, DISASS_DUMP);
1993 print_version (program_name);
2000 /* xgettext:c-format */
2001 error (_("Invalid option '-%c'\n"), c);
2008 if (!do_dynamic && !do_syms && !do_reloc && !do_sections
2009 && !do_segments && !do_header && !do_dump && !do_version
2010 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2014 warn (_("Nothing to do.\n"));
2020 get_elf_class (elf_class)
2021 unsigned char elf_class;
2023 static char buff [32];
2027 case ELFCLASSNONE: return _("none");
2028 case ELFCLASS32: return _("ELF32");
2029 case ELFCLASS64: return _("ELF64");
2031 sprintf (buff, _("<unknown: %x>"), elf_class);
2037 get_data_encoding (encoding)
2038 unsigned char encoding;
2040 static char buff [32];
2044 case ELFDATANONE: return _("none");
2045 case ELFDATA2LSB: return _("2's complement, little endian");
2046 case ELFDATA2MSB: return _("2's complement, big endian");
2048 sprintf (buff, _("<unknown: %x>"), encoding);
2054 get_osabi_name (osabi)
2055 unsigned char osabi;
2057 static char buff [32];
2061 case ELFOSABI_NONE: return _("UNIX - System V");
2062 case ELFOSABI_HPUX: return _("UNIX - HP-UX");
2063 case ELFOSABI_NETBSD: return _("UNIX - NetBSD");
2064 case ELFOSABI_LINUX: return _("UNIX - Linux");
2065 case ELFOSABI_HURD: return _("GNU/Hurd");
2066 case ELFOSABI_SOLARIS: return _("UNIX - Solaris");
2067 case ELFOSABI_MONTEREY: return _("UNIX - Monterey");
2068 case ELFOSABI_IRIX: return _("UNIX - IRIX");
2069 case ELFOSABI_FREEBSD: return _("UNIX - FreeBSD");
2070 case ELFOSABI_TRU64: return _("UNIX - TRU64");
2071 case ELFOSABI_MODESTO: return _("Novell - Modesto");
2072 case ELFOSABI_OPENBSD: return _("UNIX - OpenBSD");
2073 case ELFOSABI_STANDALONE: return _("Standalone App");
2074 case ELFOSABI_ARM: return _("ARM");
2076 sprintf (buff, _("<unknown: %x>"), osabi);
2081 /* Decode the data held in 'elf_header'. */
2083 process_file_header ()
2085 if ( elf_header.e_ident [EI_MAG0] != ELFMAG0
2086 || elf_header.e_ident [EI_MAG1] != ELFMAG1
2087 || elf_header.e_ident [EI_MAG2] != ELFMAG2
2088 || elf_header.e_ident [EI_MAG3] != ELFMAG3)
2091 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2099 printf (_("ELF Header:\n"));
2100 printf (_(" Magic: "));
2101 for (i = 0; i < EI_NIDENT; i ++)
2102 printf ("%2.2x ", elf_header.e_ident [i]);
2104 printf (_(" Class: %s\n"),
2105 get_elf_class (elf_header.e_ident [EI_CLASS]));
2106 printf (_(" Data: %s\n"),
2107 get_data_encoding (elf_header.e_ident [EI_DATA]));
2108 printf (_(" Version: %d %s\n"),
2109 elf_header.e_ident [EI_VERSION],
2110 (elf_header.e_ident [EI_VERSION] == EV_CURRENT
2112 : (elf_header.e_ident [EI_VERSION] != EV_NONE
2115 printf (_(" OS/ABI: %s\n"),
2116 get_osabi_name (elf_header.e_ident [EI_OSABI]));
2117 printf (_(" ABI Version: %d\n"),
2118 elf_header.e_ident [EI_ABIVERSION]);
2119 printf (_(" Type: %s\n"),
2120 get_file_type (elf_header.e_type));
2121 printf (_(" Machine: %s\n"),
2122 get_machine_name (elf_header.e_machine));
2123 printf (_(" Version: 0x%lx\n"),
2124 (unsigned long) elf_header.e_version);
2126 printf (_(" Entry point address: "));
2127 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2128 printf (_("\n Start of program headers: "));
2129 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2130 printf (_(" (bytes into file)\n Start of section headers: "));
2131 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2132 printf (_(" (bytes into file)\n"));
2134 printf (_(" Flags: 0x%lx%s\n"),
2135 (unsigned long) elf_header.e_flags,
2136 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2137 printf (_(" Size of this header: %ld (bytes)\n"),
2138 (long) elf_header.e_ehsize);
2139 printf (_(" Size of program headers: %ld (bytes)\n"),
2140 (long) elf_header.e_phentsize);
2141 printf (_(" Number of program headers: %ld\n"),
2142 (long) elf_header.e_phnum);
2143 printf (_(" Size of section headers: %ld (bytes)\n"),
2144 (long) elf_header.e_shentsize);
2145 printf (_(" Number of section headers: %ld\n"),
2146 (long) elf_header.e_shnum);
2147 printf (_(" Section header string table index: %ld\n"),
2148 (long) elf_header.e_shstrndx);
2156 get_32bit_program_headers (file, program_headers)
2158 Elf_Internal_Phdr * program_headers;
2160 Elf32_External_Phdr * phdrs;
2161 Elf32_External_Phdr * external;
2162 Elf32_Internal_Phdr * internal;
2165 GET_DATA_ALLOC (elf_header.e_phoff,
2166 elf_header.e_phentsize * elf_header.e_phnum,
2167 phdrs, Elf32_External_Phdr *, "program headers");
2169 for (i = 0, internal = program_headers, external = phdrs;
2170 i < elf_header.e_phnum;
2171 i ++, internal ++, external ++)
2173 internal->p_type = BYTE_GET (external->p_type);
2174 internal->p_offset = BYTE_GET (external->p_offset);
2175 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2176 internal->p_paddr = BYTE_GET (external->p_paddr);
2177 internal->p_filesz = BYTE_GET (external->p_filesz);
2178 internal->p_memsz = BYTE_GET (external->p_memsz);
2179 internal->p_flags = BYTE_GET (external->p_flags);
2180 internal->p_align = BYTE_GET (external->p_align);
2189 get_64bit_program_headers (file, program_headers)
2191 Elf_Internal_Phdr * program_headers;
2193 Elf64_External_Phdr * phdrs;
2194 Elf64_External_Phdr * external;
2195 Elf64_Internal_Phdr * internal;
2198 GET_DATA_ALLOC (elf_header.e_phoff,
2199 elf_header.e_phentsize * elf_header.e_phnum,
2200 phdrs, Elf64_External_Phdr *, "program headers");
2202 for (i = 0, internal = program_headers, external = phdrs;
2203 i < elf_header.e_phnum;
2204 i ++, internal ++, external ++)
2206 internal->p_type = BYTE_GET (external->p_type);
2207 internal->p_flags = BYTE_GET (external->p_flags);
2208 internal->p_offset = BYTE_GET8 (external->p_offset);
2209 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2210 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2211 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2212 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2213 internal->p_align = BYTE_GET8 (external->p_align);
2222 process_program_headers (file)
2225 Elf_Internal_Phdr * program_headers;
2226 Elf_Internal_Phdr * segment;
2229 if (elf_header.e_phnum == 0)
2232 printf (_("\nThere are no program headers in this file.\n"));
2236 if (do_segments && !do_header)
2238 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2239 printf (_("Entry point "));
2240 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2241 printf (_("\nThere are %d program headers, starting at offset "),
2242 elf_header.e_phnum);
2243 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2247 program_headers = (Elf_Internal_Phdr *) malloc
2248 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2250 if (program_headers == NULL)
2252 error (_("Out of memory\n"));
2257 i = get_32bit_program_headers (file, program_headers);
2259 i = get_64bit_program_headers (file, program_headers);
2263 free (program_headers);
2270 (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2274 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2278 (_(" Type Offset VirtAddr PhysAddr\n"));
2280 (_(" FileSiz MemSiz Flags Align\n"));
2288 for (i = 0, segment = program_headers;
2289 i < elf_header.e_phnum;
2294 printf (" %-14.14s ", get_segment_type (segment->p_type));
2298 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2299 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2300 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2301 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2302 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2304 (segment->p_flags & PF_R ? 'R' : ' '),
2305 (segment->p_flags & PF_W ? 'W' : ' '),
2306 (segment->p_flags & PF_X ? 'E' : ' '));
2307 printf ("%#lx", (unsigned long) segment->p_align);
2311 print_vma (segment->p_offset, FULL_HEX);
2313 print_vma (segment->p_vaddr, FULL_HEX);
2315 print_vma (segment->p_paddr, FULL_HEX);
2317 print_vma (segment->p_filesz, FULL_HEX);
2319 print_vma (segment->p_memsz, FULL_HEX);
2321 (segment->p_flags & PF_R ? 'R' : ' '),
2322 (segment->p_flags & PF_W ? 'W' : ' '),
2323 (segment->p_flags & PF_X ? 'E' : ' '));
2324 print_vma (segment->p_align, HEX);
2328 switch (segment->p_type)
2332 loadaddr = (segment->p_vaddr & 0xfffff000)
2333 - (segment->p_offset & 0xfffff000);
2338 error (_("more than one dynamic segment\n"));
2340 dynamic_addr = segment->p_offset;
2341 dynamic_size = segment->p_filesz;
2345 if (fseek (file, (long) segment->p_offset, SEEK_SET))
2346 error (_("Unable to find program interpreter name\n"));
2349 program_interpreter[0] = 0;
2350 fscanf (file, "%63s", program_interpreter);
2353 printf (_("\n [Requesting program interpreter: %s]"),
2354 program_interpreter);
2360 putc ('\n', stdout);
2369 if (do_segments && section_headers != NULL)
2371 printf (_("\n Section to Segment mapping:\n"));
2372 printf (_(" Segment Sections...\n"));
2374 assert (string_table != NULL);
2376 for (i = 0; i < elf_header.e_phnum; i++)
2379 Elf_Internal_Shdr * section;
2381 segment = program_headers + i;
2382 section = section_headers;
2384 printf (" %2.2d ", i);
2386 for (j = 0; j < elf_header.e_shnum; j++, section ++)
2388 if (section->sh_size > 0
2389 /* Compare allocated sections by VMA, unallocated
2390 sections by file offset. */
2391 && (section->sh_flags & SHF_ALLOC
2392 ? (section->sh_addr >= segment->p_vaddr
2393 && section->sh_addr + section->sh_size
2394 <= segment->p_vaddr + segment->p_memsz)
2395 : ((bfd_vma) section->sh_offset >= segment->p_offset
2396 && (section->sh_offset + section->sh_size
2397 <= segment->p_offset + segment->p_filesz))))
2398 printf ("%s ", SECTION_NAME (section));
2405 free (program_headers);
2412 get_32bit_section_headers (file)
2415 Elf32_External_Shdr * shdrs;
2416 Elf32_Internal_Shdr * internal;
2419 GET_DATA_ALLOC (elf_header.e_shoff,
2420 elf_header.e_shentsize * elf_header.e_shnum,
2421 shdrs, Elf32_External_Shdr *, "section headers");
2423 section_headers = (Elf_Internal_Shdr *) malloc
2424 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2426 if (section_headers == NULL)
2428 error (_("Out of memory\n"));
2432 for (i = 0, internal = section_headers;
2433 i < elf_header.e_shnum;
2436 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2437 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2438 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
2439 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
2440 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2441 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
2442 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2443 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2444 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2445 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
2454 get_64bit_section_headers (file)
2457 Elf64_External_Shdr * shdrs;
2458 Elf64_Internal_Shdr * internal;
2461 GET_DATA_ALLOC (elf_header.e_shoff,
2462 elf_header.e_shentsize * elf_header.e_shnum,
2463 shdrs, Elf64_External_Shdr *, "section headers");
2465 section_headers = (Elf_Internal_Shdr *) malloc
2466 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2468 if (section_headers == NULL)
2470 error (_("Out of memory\n"));
2474 for (i = 0, internal = section_headers;
2475 i < elf_header.e_shnum;
2478 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2479 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2480 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
2481 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
2482 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
2483 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
2484 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2485 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2486 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2487 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2495 static Elf_Internal_Sym *
2496 get_32bit_elf_symbols (file, offset, number)
2498 unsigned long offset;
2499 unsigned long number;
2501 Elf32_External_Sym * esyms;
2502 Elf_Internal_Sym * isyms;
2503 Elf_Internal_Sym * psym;
2506 GET_DATA_ALLOC (offset, number * sizeof (Elf32_External_Sym),
2507 esyms, Elf32_External_Sym *, "symbols");
2509 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2513 error (_("Out of memory\n"));
2519 for (j = 0, psym = isyms;
2523 psym->st_name = BYTE_GET (esyms[j].st_name);
2524 psym->st_value = BYTE_GET (esyms[j].st_value);
2525 psym->st_size = BYTE_GET (esyms[j].st_size);
2526 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2527 psym->st_info = BYTE_GET (esyms[j].st_info);
2528 psym->st_other = BYTE_GET (esyms[j].st_other);
2536 static Elf_Internal_Sym *
2537 get_64bit_elf_symbols (file, offset, number)
2539 unsigned long offset;
2540 unsigned long number;
2542 Elf64_External_Sym * esyms;
2543 Elf_Internal_Sym * isyms;
2544 Elf_Internal_Sym * psym;
2547 GET_DATA_ALLOC (offset, number * sizeof (Elf64_External_Sym),
2548 esyms, Elf64_External_Sym *, "symbols");
2550 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2554 error (_("Out of memory\n"));
2560 for (j = 0, psym = isyms;
2564 psym->st_name = BYTE_GET (esyms[j].st_name);
2565 psym->st_info = BYTE_GET (esyms[j].st_info);
2566 psym->st_other = BYTE_GET (esyms[j].st_other);
2567 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2568 psym->st_value = BYTE_GET8 (esyms[j].st_value);
2569 psym->st_size = BYTE_GET8 (esyms[j].st_size);
2578 get_elf_section_flags (sh_flags)
2581 static char buff [32];
2589 flag = sh_flags & - sh_flags;
2594 case SHF_WRITE: strcat (buff, "W"); break;
2595 case SHF_ALLOC: strcat (buff, "A"); break;
2596 case SHF_EXECINSTR: strcat (buff, "X"); break;
2597 case SHF_MERGE: strcat (buff, "M"); break;
2598 case SHF_STRINGS: strcat (buff, "S"); break;
2599 case SHF_INFO_LINK: strcat (buff, "I"); break;
2600 case SHF_LINK_ORDER: strcat (buff, "L"); break;
2601 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
2604 if (flag & SHF_MASKOS)
2607 sh_flags &= ~ SHF_MASKOS;
2609 else if (flag & SHF_MASKPROC)
2612 sh_flags &= ~ SHF_MASKPROC;
2624 process_section_headers (file)
2627 Elf_Internal_Shdr * section;
2630 section_headers = NULL;
2632 if (elf_header.e_shnum == 0)
2635 printf (_("\nThere are no sections in this file.\n"));
2640 if (do_sections && !do_header)
2641 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
2642 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
2646 if (! get_32bit_section_headers (file))
2649 else if (! get_64bit_section_headers (file))
2652 /* Read in the string table, so that we have names to display. */
2653 section = section_headers + elf_header.e_shstrndx;
2655 if (section->sh_size != 0)
2657 unsigned long string_table_offset;
2659 string_table_offset = section->sh_offset;
2661 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
2662 string_table, char *, "string table");
2665 /* Scan the sections for the dynamic symbol table
2666 and dynamic string table and debug sections. */
2667 dynamic_symbols = NULL;
2668 dynamic_strings = NULL;
2669 dynamic_syminfo = NULL;
2671 for (i = 0, section = section_headers;
2672 i < elf_header.e_shnum;
2675 char * name = SECTION_NAME (section);
2677 if (section->sh_type == SHT_DYNSYM)
2679 if (dynamic_symbols != NULL)
2681 error (_("File contains multiple dynamic symbol tables\n"));
2685 num_dynamic_syms = section->sh_size / section->sh_entsize;
2687 GET_ELF_SYMBOLS (file, section->sh_offset, num_dynamic_syms);
2689 else if (section->sh_type == SHT_STRTAB
2690 && strcmp (name, ".dynstr") == 0)
2692 if (dynamic_strings != NULL)
2694 error (_("File contains multiple dynamic string tables\n"));
2698 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
2699 dynamic_strings, char *, "dynamic strings");
2701 else if ((do_debugging || do_debug_info || do_debug_abbrevs
2702 || do_debug_lines || do_debug_pubnames || do_debug_aranges)
2703 && strncmp (name, ".debug_", 7) == 0)
2708 || (do_debug_info && (strcmp (name, "info") == 0))
2709 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
2710 || (do_debug_lines && (strcmp (name, "line") == 0))
2711 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
2712 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
2714 request_dump (i, DEBUG_DUMP);
2721 printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
2725 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
2728 printf (_(" [Nr] Name Type Address Offset\n"));
2729 printf (_(" Size EntSize Flags Link Info Align\n"));
2732 for (i = 0, section = section_headers;
2733 i < elf_header.e_shnum;
2736 printf (" [%2d] %-17.17s %-15.15s ",
2738 SECTION_NAME (section),
2739 get_section_type_name (section->sh_type));
2743 print_vma (section->sh_addr, LONG_HEX);
2745 printf ( " %6.6lx %6.6lx %2.2lx",
2746 (unsigned long) section->sh_offset,
2747 (unsigned long) section->sh_size,
2748 (unsigned long) section->sh_entsize);
2750 printf (" %3s ", get_elf_section_flags (section->sh_flags));
2752 printf (" %2ld %3lx %ld\n",
2753 (unsigned long) section->sh_link,
2754 (unsigned long) section->sh_info,
2755 (unsigned long) section->sh_addralign);
2760 print_vma (section->sh_addr, LONG_HEX);
2761 printf (" %8.8lx", section->sh_offset);
2763 print_vma (section->sh_size, LONG_HEX);
2765 print_vma (section->sh_entsize, LONG_HEX);
2767 printf (" %3s ", get_elf_section_flags (section->sh_flags));
2769 printf (" %2ld %3lx %ld\n",
2770 (unsigned long) section->sh_link,
2771 (unsigned long) section->sh_info,
2772 (unsigned long) section->sh_addralign);
2776 printf (_("Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings)\n"));
2777 printf (_(" I (info), L (link order), O (extra OS processing required)\n"));
2778 printf (_(" o (os specific), p (processor specific) x (unknown)\n"));
2783 /* Process the reloc section. */
2785 process_relocs (file)
2788 unsigned long rel_size;
2789 unsigned long rel_offset;
2795 if (do_using_dynamic)
2797 int is_rela = FALSE;
2802 if (dynamic_info[DT_REL])
2804 rel_offset = dynamic_info[DT_REL];
2805 rel_size = dynamic_info[DT_RELSZ];
2808 else if (dynamic_info [DT_RELA])
2810 rel_offset = dynamic_info[DT_RELA];
2811 rel_size = dynamic_info[DT_RELASZ];
2814 else if (dynamic_info[DT_JMPREL])
2816 rel_offset = dynamic_info[DT_JMPREL];
2817 rel_size = dynamic_info[DT_PLTRELSZ];
2819 switch (dynamic_info[DT_PLTREL])
2836 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
2837 rel_offset, rel_size);
2839 dump_relocations (file, rel_offset - loadaddr, rel_size,
2840 dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
2843 printf (_("\nThere are no dynamic relocations in this file.\n"));
2847 Elf32_Internal_Shdr * section;
2851 for (i = 0, section = section_headers;
2852 i < elf_header.e_shnum;
2855 if ( section->sh_type != SHT_RELA
2856 && section->sh_type != SHT_REL)
2859 rel_offset = section->sh_offset;
2860 rel_size = section->sh_size;
2864 Elf32_Internal_Shdr * strsec;
2865 Elf32_Internal_Shdr * symsec;
2866 Elf_Internal_Sym * symtab;
2869 unsigned long nsyms;
2871 printf (_("\nRelocation section "));
2873 if (string_table == NULL)
2874 printf ("%d", section->sh_name);
2876 printf ("'%s'", SECTION_NAME (section));
2878 printf (_(" at offset 0x%lx contains %lu entries:\n"),
2879 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
2881 symsec = section_headers + section->sh_link;
2883 nsyms = symsec->sh_size / symsec->sh_entsize;
2884 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
2889 strsec = section_headers + symsec->sh_link;
2891 GET_DATA_ALLOC (strsec->sh_offset, strsec->sh_size, strtab,
2892 char *, "string table");
2894 is_rela = section->sh_type == SHT_RELA;
2896 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela);
2906 printf (_("\nThere are no relocations in this file.\n"));
2914 dynamic_segment_mips_val (entry)
2915 Elf_Internal_Dyn * entry;
2917 switch (entry->d_tag)
2920 if (entry->d_un.d_val == 0)
2924 static const char * opts[] =
2926 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
2927 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
2928 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
2929 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
2934 for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
2935 if (entry->d_un.d_val & (1 << cnt))
2937 printf ("%s%s", first ? "" : " ", opts[cnt]);
2944 case DT_MIPS_IVERSION:
2945 if (dynamic_strings != NULL)
2946 printf ("Interface Version: %s\n",
2947 dynamic_strings + entry->d_un.d_val);
2949 printf ("%ld\n", (long) entry->d_un.d_ptr);
2952 case DT_MIPS_TIME_STAMP:
2957 time_t time = entry->d_un.d_val;
2958 tmp = gmtime (&time);
2959 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
2960 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
2961 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
2962 printf ("Time Stamp: %s\n", timebuf);
2966 case DT_MIPS_RLD_VERSION:
2967 case DT_MIPS_LOCAL_GOTNO:
2968 case DT_MIPS_CONFLICTNO:
2969 case DT_MIPS_LIBLISTNO:
2970 case DT_MIPS_SYMTABNO:
2971 case DT_MIPS_UNREFEXTNO:
2972 case DT_MIPS_HIPAGENO:
2973 case DT_MIPS_DELTA_CLASS_NO:
2974 case DT_MIPS_DELTA_INSTANCE_NO:
2975 case DT_MIPS_DELTA_RELOC_NO:
2976 case DT_MIPS_DELTA_SYM_NO:
2977 case DT_MIPS_DELTA_CLASSSYM_NO:
2978 case DT_MIPS_COMPACT_SIZE:
2979 printf ("%ld\n", (long) entry->d_un.d_ptr);
2983 printf ("%#lx\n", (long) entry->d_un.d_ptr);
2989 dynamic_segment_parisc_val (entry)
2990 Elf_Internal_Dyn * entry;
2992 switch (entry->d_tag)
2994 case DT_HP_DLD_FLAGS:
3003 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
3004 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
3005 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
3006 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
3007 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
3008 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
3009 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
3010 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
3011 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
3012 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
3013 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
3017 bfd_vma val = entry->d_un.d_val;
3019 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
3020 if (val & flags[cnt].bit)
3024 fputs (flags[cnt].str, stdout);
3026 val ^= flags[cnt].bit;
3029 if (val != 0 || first)
3033 print_vma (val, HEX);
3039 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
3045 get_32bit_dynamic_segment (file)
3048 Elf32_External_Dyn * edyn;
3049 Elf_Internal_Dyn * entry;
3052 GET_DATA_ALLOC (dynamic_addr, dynamic_size,
3053 edyn, Elf32_External_Dyn *, "dynamic segment");
3055 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3056 how large this .dynamic is now. We can do this even before the byte
3057 swapping since the DT_NULL tag is recognizable. */
3059 while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
3062 dynamic_segment = (Elf_Internal_Dyn *)
3063 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3065 if (dynamic_segment == NULL)
3067 error (_("Out of memory\n"));
3072 for (i = 0, entry = dynamic_segment;
3076 entry->d_tag = BYTE_GET (edyn [i].d_tag);
3077 entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
3086 get_64bit_dynamic_segment (file)
3089 Elf64_External_Dyn * edyn;
3090 Elf_Internal_Dyn * entry;
3093 GET_DATA_ALLOC (dynamic_addr, dynamic_size,
3094 edyn, Elf64_External_Dyn *, "dynamic segment");
3096 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3097 how large this .dynamic is now. We can do this even before the byte
3098 swapping since the DT_NULL tag is recognizable. */
3100 while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
3103 dynamic_segment = (Elf_Internal_Dyn *)
3104 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3106 if (dynamic_segment == NULL)
3108 error (_("Out of memory\n"));
3113 for (i = 0, entry = dynamic_segment;
3117 entry->d_tag = BYTE_GET8 (edyn [i].d_tag);
3118 entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
3127 get_dynamic_flags (flags)
3130 static char buff [64];
3135 flag = flags & - flags;
3140 case DF_ORIGIN: strcat (buff, "ORIGIN "); break;
3141 case DF_SYMBOLIC: strcat (buff, "SYMBOLIC "); break;
3142 case DF_TEXTREL: strcat (buff, "TEXTREL "); break;
3143 case DF_BIND_NOW: strcat (buff, "BIND_NOW "); break;
3144 default: strcat (buff, "unknown "); break;
3150 /* Parse and display the contents of the dynamic segment. */
3152 process_dynamic_segment (file)
3155 Elf_Internal_Dyn * entry;
3158 if (dynamic_size == 0)
3161 printf (_("\nThere is no dynamic segment in this file.\n"));
3168 if (! get_32bit_dynamic_segment (file))
3171 else if (! get_64bit_dynamic_segment (file))
3174 /* Find the appropriate symbol table. */
3175 if (dynamic_symbols == NULL)
3177 for (i = 0, entry = dynamic_segment;
3181 unsigned long offset;
3183 if (entry->d_tag != DT_SYMTAB)
3186 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
3188 /* Since we do not know how big the symbol table is,
3189 we default to reading in the entire file (!) and
3190 processing that. This is overkill, I know, but it
3192 offset = entry->d_un.d_val - loadaddr;
3194 if (fseek (file, 0, SEEK_END))
3195 error (_("Unable to seek to end of file!"));
3198 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf32_External_Sym);
3200 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf64_External_Sym);
3202 if (num_dynamic_syms < 1)
3204 error (_("Unable to determine the number of symbols to load\n"));
3208 dynamic_symbols = GET_ELF_SYMBOLS (file, offset, num_dynamic_syms);
3212 /* Similarly find a string table. */
3213 if (dynamic_strings == NULL)
3215 for (i = 0, entry = dynamic_segment;
3219 unsigned long offset;
3222 if (entry->d_tag != DT_STRTAB)
3225 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
3227 /* Since we do not know how big the string table is,
3228 we default to reading in the entire file (!) and
3229 processing that. This is overkill, I know, but it
3232 offset = entry->d_un.d_val - loadaddr;
3233 if (fseek (file, 0, SEEK_END))
3234 error (_("Unable to seek to end of file\n"));
3235 str_tab_len = ftell (file) - offset;
3237 if (str_tab_len < 1)
3240 (_("Unable to determine the length of the dynamic string table\n"));
3244 GET_DATA_ALLOC (offset, str_tab_len, dynamic_strings, char *,
3245 "dynamic string table");
3251 /* And find the syminfo section if available. */
3252 if (dynamic_syminfo == NULL)
3254 unsigned int syminsz = 0;
3256 for (i = 0, entry = dynamic_segment;
3260 if (entry->d_tag == DT_SYMINENT)
3262 /* Note: these braces are necessary to avoid a syntax
3263 error from the SunOS4 C compiler. */
3264 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
3266 else if (entry->d_tag == DT_SYMINSZ)
3267 syminsz = entry->d_un.d_val;
3268 else if (entry->d_tag == DT_SYMINFO)
3269 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
3272 if (dynamic_syminfo_offset != 0 && syminsz != 0)
3274 Elf_External_Syminfo * extsyminfo;
3275 Elf_Internal_Syminfo * syminfo;
3277 /* There is a syminfo section. Read the data. */
3278 GET_DATA_ALLOC (dynamic_syminfo_offset, syminsz, extsyminfo,
3279 Elf_External_Syminfo *, "symbol information");
3281 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
3282 if (dynamic_syminfo == NULL)
3284 error (_("Out of memory\n"));
3288 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
3289 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
3292 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
3293 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
3300 if (do_dynamic && dynamic_addr)
3301 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
3302 dynamic_addr, (long) dynamic_size);
3304 printf (_(" Tag Type Name/Value\n"));
3306 for (i = 0, entry = dynamic_segment;
3315 print_vma (entry->d_tag, FULL_HEX);
3316 dtype = get_dynamic_type (entry->d_tag);
3317 printf (" (%s)%*s", dtype,
3318 ((is_32bit_elf ? 27 : 19)
3319 - (int) strlen (dtype)),
3323 switch (entry->d_tag)
3327 printf ("%s", get_dynamic_flags (entry->d_un.d_val));
3334 if (entry->d_tag == DT_AUXILIARY)
3335 printf (_("Auxiliary library"));
3337 printf (_("Filter library"));
3339 if (dynamic_strings)
3340 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
3344 print_vma (entry->d_un.d_val, PREFIX_HEX);
3353 printf (_("Flags:"));
3354 if (entry->d_un.d_val == 0)
3355 printf (_(" None\n"));
3358 unsigned long int val = entry->d_un.d_val;
3359 if (val & DTF_1_PARINIT)
3361 printf (" PARINIT");
3362 val ^= DTF_1_PARINIT;
3364 if (val & DTF_1_CONFEXP)
3366 printf (" CONFEXP");
3367 val ^= DTF_1_CONFEXP;
3370 printf (" %lx", val);
3379 printf (_("Flags:"));
3380 if (entry->d_un.d_val == 0)
3381 printf (_(" None\n"));
3384 unsigned long int val = entry->d_un.d_val;
3385 if (val & DF_P1_LAZYLOAD)
3387 printf (" LAZYLOAD");
3388 val ^= DF_P1_LAZYLOAD;
3390 if (val & DF_P1_GROUPPERM)
3392 printf (" GROUPPERM");
3393 val ^= DF_P1_GROUPPERM;
3396 printf (" %lx", val);
3405 printf (_("Flags:"));
3406 if (entry->d_un.d_val == 0)
3407 printf (_(" None\n"));
3410 unsigned long int val = entry->d_un.d_val;
3416 if (val & DF_1_GLOBAL)
3421 if (val & DF_1_GROUP)
3426 if (val & DF_1_NODELETE)
3428 printf (" NODELETE");
3429 val ^= DF_1_NODELETE;
3431 if (val & DF_1_LOADFLTR)
3433 printf (" LOADFLTR");
3434 val ^= DF_1_LOADFLTR;
3436 if (val & DF_1_INITFIRST)
3438 printf (" INITFIRST");
3439 val ^= DF_1_INITFIRST;
3441 if (val & DF_1_NOOPEN)
3446 if (val & DF_1_ORIGIN)
3451 if (val & DF_1_DIRECT)
3456 if (val & DF_1_TRANS)
3461 if (val & DF_1_INTERPOSE)
3463 printf (" INTERPOSE");
3464 val ^= DF_1_INTERPOSE;
3466 if (val & DF_1_NODEFLIB)
3468 printf (" NODEFLIB");
3469 val ^= DF_1_NODEFLIB;
3471 if (val & DF_1_NODUMP)
3476 if (val & DF_1_CONLFAT)
3478 printf (" CONLFAT");
3479 val ^= DF_1_CONLFAT;
3482 printf (" %lx", val);
3490 puts (get_dynamic_type (entry->d_un.d_val));
3509 dynamic_info[entry->d_tag] = entry->d_un.d_val;
3515 if (dynamic_strings == NULL)
3518 name = dynamic_strings + entry->d_un.d_val;
3522 switch (entry->d_tag)
3525 printf (_("Shared library: [%s]"), name);
3527 if (strcmp (name, program_interpreter) == 0)
3528 printf (_(" program interpreter"));
3532 printf (_("Library soname: [%s]"), name);
3536 printf (_("Library rpath: [%s]"), name);
3540 print_vma (entry->d_un.d_val, PREFIX_HEX);
3545 print_vma (entry->d_un.d_val, PREFIX_HEX);
3561 case DT_INIT_ARRAYSZ:
3562 case DT_FINI_ARRAYSZ:
3565 print_vma (entry->d_un.d_val, UNSIGNED);
3566 printf (" (bytes)\n");
3576 print_vma (entry->d_un.d_val, UNSIGNED);
3589 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
3593 name = dynamic_strings + entry->d_un.d_val;
3597 printf (_("Not needed object: [%s]\n"), name);
3602 print_vma (entry->d_un.d_val, PREFIX_HEX);
3608 /* The value of this entry is ignored. */
3612 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
3613 version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
3618 switch (elf_header.e_machine)
3621 case EM_MIPS_RS4_BE:
3622 dynamic_segment_mips_val (entry);
3625 dynamic_segment_parisc_val (entry);
3628 print_vma (entry->d_un.d_val, PREFIX_HEX);
3640 get_ver_flags (flags)
3643 static char buff [32];
3650 if (flags & VER_FLG_BASE)
3651 strcat (buff, "BASE ");
3653 if (flags & VER_FLG_WEAK)
3655 if (flags & VER_FLG_BASE)
3656 strcat (buff, "| ");
3658 strcat (buff, "WEAK ");
3661 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
3662 strcat (buff, "| <unknown>");
3667 /* Display the contents of the version sections. */
3669 process_version_sections (file)
3672 Elf32_Internal_Shdr * section;
3679 for (i = 0, section = section_headers;
3680 i < elf_header.e_shnum;
3683 switch (section->sh_type)
3685 case SHT_GNU_verdef:
3687 Elf_External_Verdef * edefs;
3694 (_("\nVersion definition section '%s' contains %ld entries:\n"),
3695 SECTION_NAME (section), section->sh_info);
3697 printf (_(" Addr: 0x"));
3698 printf_vma (section->sh_addr);
3699 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
3700 (unsigned long) section->sh_offset, section->sh_link,
3701 SECTION_NAME (section_headers + section->sh_link));
3703 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
3704 edefs, Elf_External_Verdef *,
3705 "version definition section");
3707 for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
3710 Elf_External_Verdef * edef;
3711 Elf_Internal_Verdef ent;
3712 Elf_External_Verdaux * eaux;
3713 Elf_Internal_Verdaux aux;
3717 vstart = ((char *) edefs) + idx;
3719 edef = (Elf_External_Verdef *) vstart;
3721 ent.vd_version = BYTE_GET (edef->vd_version);
3722 ent.vd_flags = BYTE_GET (edef->vd_flags);
3723 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
3724 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
3725 ent.vd_hash = BYTE_GET (edef->vd_hash);
3726 ent.vd_aux = BYTE_GET (edef->vd_aux);
3727 ent.vd_next = BYTE_GET (edef->vd_next);
3729 printf (_(" %#06x: Rev: %d Flags: %s"),
3730 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
3732 printf (_(" Index: %d Cnt: %d "),
3733 ent.vd_ndx, ent.vd_cnt);
3735 vstart += ent.vd_aux;
3737 eaux = (Elf_External_Verdaux *) vstart;
3739 aux.vda_name = BYTE_GET (eaux->vda_name);
3740 aux.vda_next = BYTE_GET (eaux->vda_next);
3742 if (dynamic_strings)
3743 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
3745 printf (_("Name index: %ld\n"), aux.vda_name);
3747 isum = idx + ent.vd_aux;
3749 for (j = 1; j < ent.vd_cnt; j ++)
3751 isum += aux.vda_next;
3752 vstart += aux.vda_next;
3754 eaux = (Elf_External_Verdaux *) vstart;
3756 aux.vda_name = BYTE_GET (eaux->vda_name);
3757 aux.vda_next = BYTE_GET (eaux->vda_next);
3759 if (dynamic_strings)
3760 printf (_(" %#06x: Parent %d: %s\n"),
3761 isum, j, dynamic_strings + aux.vda_name);
3763 printf (_(" %#06x: Parent %d, name index: %ld\n"),
3764 isum, j, aux.vda_name);
3774 case SHT_GNU_verneed:
3776 Elf_External_Verneed * eneed;
3782 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
3783 SECTION_NAME (section), section->sh_info);
3785 printf (_(" Addr: 0x"));
3786 printf_vma (section->sh_addr);
3787 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
3788 (unsigned long) section->sh_offset, section->sh_link,
3789 SECTION_NAME (section_headers + section->sh_link));
3791 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
3792 eneed, Elf_External_Verneed *,
3793 "version need section");
3795 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
3797 Elf_External_Verneed * entry;
3798 Elf_Internal_Verneed ent;
3803 vstart = ((char *) eneed) + idx;
3805 entry = (Elf_External_Verneed *) vstart;
3807 ent.vn_version = BYTE_GET (entry->vn_version);
3808 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
3809 ent.vn_file = BYTE_GET (entry->vn_file);
3810 ent.vn_aux = BYTE_GET (entry->vn_aux);
3811 ent.vn_next = BYTE_GET (entry->vn_next);
3813 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
3815 if (dynamic_strings)
3816 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
3818 printf (_(" File: %lx"), ent.vn_file);
3820 printf (_(" Cnt: %d\n"), ent.vn_cnt);
3822 vstart += ent.vn_aux;
3824 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
3826 Elf_External_Vernaux * eaux;
3827 Elf_Internal_Vernaux aux;
3829 eaux = (Elf_External_Vernaux *) vstart;
3831 aux.vna_hash = BYTE_GET (eaux->vna_hash);
3832 aux.vna_flags = BYTE_GET (eaux->vna_flags);
3833 aux.vna_other = BYTE_GET (eaux->vna_other);
3834 aux.vna_name = BYTE_GET (eaux->vna_name);
3835 aux.vna_next = BYTE_GET (eaux->vna_next);
3837 if (dynamic_strings)
3838 printf (_(" %#06x: Name: %s"),
3839 isum, dynamic_strings + aux.vna_name);
3841 printf (_(" %#06x: Name index: %lx"),
3842 isum, aux.vna_name);
3844 printf (_(" Flags: %s Version: %d\n"),
3845 get_ver_flags (aux.vna_flags), aux.vna_other);
3847 isum += aux.vna_next;
3848 vstart += aux.vna_next;
3858 case SHT_GNU_versym:
3860 Elf32_Internal_Shdr * link_section;
3863 unsigned char * edata;
3864 unsigned short * data;
3866 Elf_Internal_Sym * symbols;
3867 Elf32_Internal_Shdr * string_sec;
3869 link_section = section_headers + section->sh_link;
3870 total = section->sh_size / section->sh_entsize;
3874 symbols = GET_ELF_SYMBOLS (file, link_section->sh_offset,
3875 link_section->sh_size / link_section->sh_entsize);
3877 string_sec = section_headers + link_section->sh_link;
3879 GET_DATA_ALLOC (string_sec->sh_offset, string_sec->sh_size,
3880 strtab, char *, "version string table");
3882 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
3883 SECTION_NAME (section), total);
3885 printf (_(" Addr: "));
3886 printf_vma (section->sh_addr);
3887 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
3888 (unsigned long) section->sh_offset, section->sh_link,
3889 SECTION_NAME (link_section));
3891 GET_DATA_ALLOC (version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
3893 total * sizeof (short), edata,
3894 unsigned char *, "version symbol data");
3896 data = (unsigned short *) malloc (total * sizeof (short));
3898 for (cnt = total; cnt --;)
3899 data [cnt] = byte_get (edata + cnt * sizeof (short),
3904 for (cnt = 0; cnt < total; cnt += 4)
3909 printf (" %03x:", cnt);
3911 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
3912 switch (data [cnt + j])
3915 fputs (_(" 0 (*local*) "), stdout);
3919 fputs (_(" 1 (*global*) "), stdout);
3923 nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
3924 data [cnt + j] & 0x8000 ? 'h' : ' ');
3926 if (symbols [cnt + j].st_shndx < SHN_LORESERVE
3927 && section_headers[symbols [cnt + j].st_shndx].sh_type
3930 /* We must test both. */
3931 Elf_Internal_Verneed ivn;
3932 unsigned long offset;
3934 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
3939 Elf_External_Verneed evn;
3940 Elf_External_Vernaux evna;
3941 Elf_Internal_Vernaux ivna;
3942 unsigned long vna_off;
3944 GET_DATA (offset, evn, "version need");
3946 ivn.vn_aux = BYTE_GET (evn.vn_aux);
3947 ivn.vn_next = BYTE_GET (evn.vn_next);
3949 vna_off = offset + ivn.vn_aux;
3953 GET_DATA (vna_off, evna,
3954 "version need aux (1)");
3956 ivna.vna_next = BYTE_GET (evna.vna_next);
3957 ivna.vna_other = BYTE_GET (evna.vna_other);
3959 vna_off += ivna.vna_next;
3961 while (ivna.vna_other != data [cnt + j]
3962 && ivna.vna_next != 0);
3964 if (ivna.vna_other == data [cnt + j])
3966 ivna.vna_name = BYTE_GET (evna.vna_name);
3968 name = strtab + ivna.vna_name;
3969 nn += printf ("(%s%-*s",
3971 12 - (int) strlen (name),
3975 else if (ivn.vn_next == 0)
3977 if (data [cnt + j] != 0x8001)
3979 Elf_Internal_Verdef ivd;
3980 Elf_External_Verdef evd;
3982 offset = version_info
3983 [DT_VERSIONTAGIDX (DT_VERDEF)]
3988 GET_DATA (offset, evd,
3989 "version definition");
3991 ivd.vd_next = BYTE_GET (evd.vd_next);
3992 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
3994 offset += ivd.vd_next;
3997 != (data [cnt + j] & 0x7fff)
3998 && ivd.vd_next != 0);
4001 == (data [cnt + j] & 0x7fff))
4003 Elf_External_Verdaux evda;
4004 Elf_Internal_Verdaux ivda;
4006 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4008 GET_DATA (offset + ivd.vd_aux, evda,
4009 "version definition aux");
4012 BYTE_GET (evda.vda_name);
4014 name = strtab + ivda.vda_name;
4018 12 - (int) strlen (name),
4026 offset += ivn.vn_next;
4028 while (ivn.vn_next);
4030 else if (symbols [cnt + j].st_shndx == SHN_UNDEF)
4032 Elf_Internal_Verneed ivn;
4033 unsigned long offset;
4035 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
4040 Elf_Internal_Vernaux ivna;
4041 Elf_External_Verneed evn;
4042 Elf_External_Vernaux evna;
4043 unsigned long a_off;
4045 GET_DATA (offset, evn, "version need");
4047 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4048 ivn.vn_next = BYTE_GET (evn.vn_next);
4050 a_off = offset + ivn.vn_aux;
4054 GET_DATA (a_off, evna,
4055 "version need aux (2)");
4057 ivna.vna_next = BYTE_GET (evna.vna_next);
4058 ivna.vna_other = BYTE_GET (evna.vna_other);
4060 a_off += ivna.vna_next;
4062 while (ivna.vna_other != data [cnt + j]
4063 && ivna.vna_next != 0);
4065 if (ivna.vna_other == data [cnt + j])
4067 ivna.vna_name = BYTE_GET (evna.vna_name);
4069 name = strtab + ivna.vna_name;
4070 nn += printf ("(%s%-*s",
4072 12 - (int) strlen (name),
4077 offset += ivn.vn_next;
4079 while (ivn.vn_next);
4081 else if (data [cnt + j] != 0x8001)
4083 Elf_Internal_Verdef ivd;
4084 Elf_External_Verdef evd;
4085 unsigned long offset;
4087 offset = version_info
4088 [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
4092 GET_DATA (offset, evd, "version def");
4094 ivd.vd_next = BYTE_GET (evd.vd_next);
4095 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4097 offset += ivd.vd_next;
4099 while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
4100 && ivd.vd_next != 0);
4102 if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
4104 Elf_External_Verdaux evda;
4105 Elf_Internal_Verdaux ivda;
4107 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4109 GET_DATA (offset - ivd.vd_next + ivd.vd_aux,
4110 evda, "version def aux");
4112 ivda.vda_name = BYTE_GET (evda.vda_name);
4114 name = strtab + ivda.vda_name;
4115 nn += printf ("(%s%-*s",
4117 12 - (int) strlen (name),
4123 printf ("%*c", 18 - nn, ' ');
4141 printf (_("\nNo version information found in this file.\n"));
4147 get_symbol_binding (binding)
4148 unsigned int binding;
4150 static char buff [32];
4154 case STB_LOCAL: return "LOCAL";
4155 case STB_GLOBAL: return "GLOBAL";
4156 case STB_WEAK: return "WEAK";
4158 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
4159 sprintf (buff, _("<processor specific>: %d"), binding);
4160 else if (binding >= STB_LOOS && binding <= STB_HIOS)
4161 sprintf (buff, _("<OS specific>: %d"), binding);
4163 sprintf (buff, _("<unknown>: %d"), binding);
4169 get_symbol_type (type)
4172 static char buff [32];
4176 case STT_NOTYPE: return "NOTYPE";
4177 case STT_OBJECT: return "OBJECT";
4178 case STT_FUNC: return "FUNC";
4179 case STT_SECTION: return "SECTION";
4180 case STT_FILE: return "FILE";
4181 case STT_COMMON: return "COMMON";
4183 if (type >= STT_LOPROC && type <= STT_HIPROC)
4185 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
4186 return "THUMB_FUNC";
4188 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
4191 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
4192 return "PARISC_MILLI";
4194 sprintf (buff, _("<processor specific>: %d"), type);
4196 else if (type >= STT_LOOS && type <= STT_HIOS)
4198 if (elf_header.e_machine == EM_PARISC)
4200 if (type == STT_HP_OPAQUE)
4202 if (type == STT_HP_STUB)
4206 sprintf (buff, _("<OS specific>: %d"), type);
4209 sprintf (buff, _("<unknown>: %d"), type);
4215 get_symbol_visibility (visibility)
4216 unsigned int visibility;
4220 case STV_DEFAULT: return "DEFAULT";
4221 case STV_INTERNAL: return "INTERNAL";
4222 case STV_HIDDEN: return "HIDDEN";
4223 case STV_PROTECTED: return "PROTECTED";
4229 get_symbol_index_type (type)
4234 case SHN_UNDEF: return "UND";
4235 case SHN_ABS: return "ABS";
4236 case SHN_COMMON: return "COM";
4238 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
4240 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
4242 else if (type >= SHN_LOOS && type <= SHN_HIOS)
4246 static char buff [32];
4248 sprintf (buff, "%3d", type);
4255 get_dynamic_data (file, number)
4257 unsigned int number;
4259 unsigned char * e_data;
4262 e_data = (unsigned char *) malloc (number * 4);
4266 error (_("Out of memory\n"));
4270 if (fread (e_data, 4, number, file) != number)
4272 error (_("Unable to read in dynamic data\n"));
4276 i_data = (int *) malloc (number * sizeof (* i_data));
4280 error (_("Out of memory\n"));
4286 i_data [number] = byte_get (e_data + number * 4, 4);
4293 /* Dump the symbol table */
4295 process_symbol_table (file)
4298 Elf32_Internal_Shdr * section;
4299 unsigned char nb [4];
4300 unsigned char nc [4];
4303 int * buckets = NULL;
4304 int * chains = NULL;
4306 if (! do_syms && !do_histogram)
4309 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
4312 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
4314 error (_("Unable to seek to start of dynamic information"));
4318 if (fread (nb, sizeof (nb), 1, file) != 1)
4320 error (_("Failed to read in number of buckets\n"));
4324 if (fread (nc, sizeof (nc), 1, file) != 1)
4326 error (_("Failed to read in number of chains\n"));
4330 nbuckets = byte_get (nb, 4);
4331 nchains = byte_get (nc, 4);
4333 buckets = get_dynamic_data (file, nbuckets);
4334 chains = get_dynamic_data (file, nchains);
4336 if (buckets == NULL || chains == NULL)
4341 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
4346 printf (_("\nSymbol table for image:\n"));
4348 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4350 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4352 for (hn = 0; hn < nbuckets; hn++)
4357 for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
4359 Elf_Internal_Sym * psym;
4361 psym = dynamic_symbols + si;
4363 printf (" %3d %3d: ", si, hn);
4364 print_vma (psym->st_value, LONG_HEX);
4366 print_vma (psym->st_size, DEC_5);
4368 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
4369 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
4370 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
4371 printf (" %3.3s", get_symbol_index_type (psym->st_shndx));
4372 printf (" %s\n", dynamic_strings + psym->st_name);
4376 else if (do_syms && !do_using_dynamic)
4380 for (i = 0, section = section_headers;
4381 i < elf_header.e_shnum;
4386 Elf_Internal_Sym * symtab;
4387 Elf_Internal_Sym * psym;
4390 if ( section->sh_type != SHT_SYMTAB
4391 && section->sh_type != SHT_DYNSYM)
4394 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
4395 SECTION_NAME (section),
4396 (unsigned long) (section->sh_size / section->sh_entsize));
4398 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4400 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4402 symtab = GET_ELF_SYMBOLS (file, section->sh_offset,
4403 section->sh_size / section->sh_entsize);
4407 if (section->sh_link == elf_header.e_shstrndx)
4408 strtab = string_table;
4411 Elf32_Internal_Shdr * string_sec;
4413 string_sec = section_headers + section->sh_link;
4415 GET_DATA_ALLOC (string_sec->sh_offset, string_sec->sh_size,
4416 strtab, char *, "string table");
4419 for (si = 0, psym = symtab;
4420 si < section->sh_size / section->sh_entsize;
4423 printf ("%6d: ", si);
4424 print_vma (psym->st_value, LONG_HEX);
4426 print_vma (psym->st_size, DEC_5);
4427 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
4428 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
4429 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
4430 printf (" %4s", get_symbol_index_type (psym->st_shndx));
4431 printf (" %s", strtab + psym->st_name);
4433 if (section->sh_type == SHT_DYNSYM &&
4434 version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
4436 unsigned char data[2];
4437 unsigned short vers_data;
4438 unsigned long offset;
4442 offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
4445 GET_DATA (offset + si * sizeof (vers_data), data,
4448 vers_data = byte_get (data, 2);
4450 is_nobits = psym->st_shndx < SHN_LORESERVE ?
4451 (section_headers [psym->st_shndx].sh_type == SHT_NOBITS)
4454 check_def = (psym->st_shndx != SHN_UNDEF);
4456 if ((vers_data & 0x8000) || vers_data > 1)
4458 if (is_nobits || ! check_def)
4460 Elf_External_Verneed evn;
4461 Elf_Internal_Verneed ivn;
4462 Elf_Internal_Vernaux ivna;
4464 /* We must test both. */
4465 offset = version_info
4466 [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
4470 unsigned long vna_off;
4472 GET_DATA (offset, evn, "version need");
4474 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4475 ivn.vn_next = BYTE_GET (evn.vn_next);
4477 vna_off = offset + ivn.vn_aux;
4481 Elf_External_Vernaux evna;
4483 GET_DATA (vna_off, evna,
4484 "version need aux (3)");
4486 ivna.vna_other = BYTE_GET (evna.vna_other);
4487 ivna.vna_next = BYTE_GET (evna.vna_next);
4488 ivna.vna_name = BYTE_GET (evna.vna_name);
4490 vna_off += ivna.vna_next;
4492 while (ivna.vna_other != vers_data
4493 && ivna.vna_next != 0);
4495 if (ivna.vna_other == vers_data)
4498 offset += ivn.vn_next;
4500 while (ivn.vn_next != 0);
4502 if (ivna.vna_other == vers_data)
4505 strtab + ivna.vna_name, ivna.vna_other);
4508 else if (! is_nobits)
4509 error (_("bad dynamic symbol"));
4516 if (vers_data != 0x8001)
4518 Elf_Internal_Verdef ivd;
4519 Elf_Internal_Verdaux ivda;
4520 Elf_External_Verdaux evda;
4521 unsigned long offset;
4524 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
4529 Elf_External_Verdef evd;
4531 GET_DATA (offset, evd, "version def");
4533 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4534 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4535 ivd.vd_next = BYTE_GET (evd.vd_next);
4537 offset += ivd.vd_next;
4539 while (ivd.vd_ndx != (vers_data & 0x7fff)
4540 && ivd.vd_next != 0);
4542 offset -= ivd.vd_next;
4543 offset += ivd.vd_aux;
4545 GET_DATA (offset, evda, "version def aux");
4547 ivda.vda_name = BYTE_GET (evda.vda_name);
4549 if (psym->st_name != ivda.vda_name)
4550 printf ((vers_data & 0x8000)
4552 strtab + ivda.vda_name);
4562 if (strtab != string_table)
4568 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
4570 if (do_histogram && buckets != NULL)
4577 int nzero_counts = 0;
4580 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
4582 printf (_(" Length Number %% of total Coverage\n"));
4584 lengths = (int *) calloc (nbuckets, sizeof (int));
4585 if (lengths == NULL)
4587 error (_("Out of memory"));
4590 for (hn = 0; hn < nbuckets; ++hn)
4595 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
4598 if (maxlength < ++lengths[hn])
4603 counts = (int *) calloc (maxlength + 1, sizeof (int));
4606 error (_("Out of memory"));
4610 for (hn = 0; hn < nbuckets; ++hn)
4611 ++ counts [lengths [hn]];
4615 printf (" 0 %-10d (%5.1f%%)\n",
4616 counts[0], (counts[0] * 100.0) / nbuckets);
4617 for (si = 1; si <= maxlength; ++si)
4619 nzero_counts += counts[si] * si;
4620 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
4621 si, counts[si], (counts[si] * 100.0) / nbuckets,
4622 (nzero_counts * 100.0) / nsyms);
4630 if (buckets != NULL)
4640 process_syminfo (file)
4641 FILE * file ATTRIBUTE_UNUSED;
4645 if (dynamic_syminfo == NULL
4647 /* No syminfo, this is ok. */
4650 /* There better should be a dynamic symbol section. */
4651 if (dynamic_symbols == NULL || dynamic_strings == NULL)
4655 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
4656 dynamic_syminfo_offset, dynamic_syminfo_nent);
4658 printf (_(" Num: Name BoundTo Flags\n"));
4659 for (i = 0; i < dynamic_syminfo_nent; ++i)
4661 unsigned short int flags = dynamic_syminfo[i].si_flags;
4663 printf ("%4d: %-30s ", i,
4664 dynamic_strings + dynamic_symbols[i].st_name);
4666 switch (dynamic_syminfo[i].si_boundto)
4668 case SYMINFO_BT_SELF:
4669 fputs ("SELF ", stdout);
4671 case SYMINFO_BT_PARENT:
4672 fputs ("PARENT ", stdout);
4675 if (dynamic_syminfo[i].si_boundto > 0
4676 && dynamic_syminfo[i].si_boundto < dynamic_size)
4679 + dynamic_segment[dynamic_syminfo[i].si_boundto].d_un.d_val);
4681 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
4685 if (flags & SYMINFO_FLG_DIRECT)
4687 if (flags & SYMINFO_FLG_PASSTHRU)
4688 printf (" PASSTHRU");
4689 if (flags & SYMINFO_FLG_COPY)
4691 if (flags & SYMINFO_FLG_LAZYLOAD)
4692 printf (" LAZYLOAD");
4700 #ifdef SUPPORT_DISASSEMBLY
4702 disassemble_section (section, file)
4703 Elf32_Internal_Shdr * section;
4706 printf (_("\nAssembly dump of section %s\n"),
4707 SECTION_NAME (section));
4709 /* XXX -- to be done --- XXX */
4716 dump_section (section, file)
4717 Elf32_Internal_Shdr * section;
4720 bfd_size_type bytes;
4722 unsigned char * data;
4723 unsigned char * start;
4725 bytes = section->sh_size;
4729 printf (_("\nSection '%s' has no data to dump.\n"),
4730 SECTION_NAME (section));
4734 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
4736 addr = section->sh_addr;
4738 GET_DATA_ALLOC (section->sh_offset, bytes, start, unsigned char *,
4749 lbytes = (bytes > 16 ? 16 : bytes);
4751 printf (" 0x%8.8lx ", (unsigned long) addr);
4753 switch (elf_header.e_ident [EI_DATA])
4757 for (j = 15; j >= 0; j --)
4760 printf ("%2.2x", data [j]);
4770 for (j = 0; j < 16; j++)
4773 printf ("%2.2x", data [j]);
4783 for (j = 0; j < lbytes; j++)
4786 if (k >= ' ' && k < 0x80)
4805 static unsigned long int
4806 read_leb128 (data, length_return, sign)
4807 unsigned char * data;
4808 int * length_return;
4811 unsigned long int result = 0;
4812 unsigned int num_read = 0;
4821 result |= (byte & 0x7f) << shift;
4826 while (byte & 0x80);
4828 if (length_return != NULL)
4829 * length_return = num_read;
4831 if (sign && (shift < 32) && (byte & 0x40))
4832 result |= -1 << shift;
4837 typedef struct State_Machine_Registers
4839 unsigned long address;
4842 unsigned int column;
4846 /* This variable hold the number of the last entry seen
4847 in the File Table. */
4848 unsigned int last_file_entry;
4851 static SMR state_machine_regs;
4854 reset_state_machine (is_stmt)
4857 state_machine_regs.address = 0;
4858 state_machine_regs.file = 1;
4859 state_machine_regs.line = 1;
4860 state_machine_regs.column = 0;
4861 state_machine_regs.is_stmt = is_stmt;
4862 state_machine_regs.basic_block = 0;
4863 state_machine_regs.end_sequence = 0;
4864 state_machine_regs.last_file_entry = 0;
4867 /* Handled an extend line op. Returns true if this is the end
4870 process_extended_line_op (data, is_stmt, pointer_size)
4871 unsigned char * data;
4875 unsigned char op_code;
4878 unsigned char * name;
4881 len = read_leb128 (data, & bytes_read, 0);
4886 warn (_("badly formed extended line op encountered!"));
4891 op_code = * data ++;
4893 printf (_(" Extended opcode %d: "), op_code);
4897 case DW_LNE_end_sequence:
4898 printf (_("End of Sequence\n\n"));
4899 reset_state_machine (is_stmt);
4902 case DW_LNE_set_address:
4903 adr = byte_get (data, pointer_size);
4904 printf (_("set Address to 0x%lx\n"), adr);
4905 state_machine_regs.address = adr;
4908 case DW_LNE_define_file:
4909 printf (_(" define new File Table entry\n"));
4910 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
4912 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
4914 data += strlen ((char *) data) + 1;
4915 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4917 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4919 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4920 printf (_("%s\n\n"), name);
4924 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
4931 /* Size of pointers in the .debug_line section. This information is not
4932 really present in that section. It's obtained before dumping the debug
4933 sections by doing some pre-scan of the .debug_info section. */
4934 static int debug_line_pointer_size = 4;
4937 display_debug_lines (section, start, file)
4938 Elf32_Internal_Shdr * section;
4939 unsigned char * start;
4940 FILE * file ATTRIBUTE_UNUSED;
4942 DWARF2_External_LineInfo * external;
4943 DWARF2_Internal_LineInfo info;
4944 unsigned char * standard_opcodes;
4945 unsigned char * data = start;
4946 unsigned char * end = start + section->sh_size;
4947 unsigned char * end_of_sequence;
4950 printf (_("\nDump of debug contents of section %s:\n\n"),
4951 SECTION_NAME (section));
4955 external = (DWARF2_External_LineInfo *) data;
4957 /* Check the length of the block. */
4958 info.li_length = BYTE_GET (external->li_length);
4959 if (info.li_length > section->sh_size)
4962 (_("The line info appears to be corrupt - the section is too small\n"));
4966 /* Check its version number. */
4967 info.li_version = BYTE_GET (external->li_version);
4968 if (info.li_version != 2)
4970 warn (_("Only DWARF version 2 line info is currently supported.\n"));
4974 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
4975 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
4976 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
4977 info.li_line_base = BYTE_GET (external->li_line_base);
4978 info.li_line_range = BYTE_GET (external->li_line_range);
4979 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
4981 /* Sign extend the line base field. */
4982 info.li_line_base <<= 24;
4983 info.li_line_base >>= 24;
4985 printf (_(" Length: %ld\n"), info.li_length);
4986 printf (_(" DWARF Version: %d\n"), info.li_version);
4987 printf (_(" Prolgue Length: %d\n"), info.li_prologue_length);
4988 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
4989 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
4990 printf (_(" Line Base: %d\n"), info.li_line_base);
4991 printf (_(" Line Range: %d\n"), info.li_line_range);
4992 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
4994 end_of_sequence = data + info.li_length + sizeof (info.li_length);
4996 reset_state_machine (info.li_default_is_stmt);
4998 /* Display the contents of the Opcodes table. */
4999 standard_opcodes = data + sizeof (* external);
5001 printf (_("\n Opcodes:\n"));
5003 for (i = 1; i < info.li_opcode_base; i++)
5004 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
5006 /* Display the contents of the Directory table. */
5007 data = standard_opcodes + info.li_opcode_base - 1;
5010 printf (_("\n The Directory Table is empty.\n"));
5013 printf (_("\n The Directory Table:\n"));
5017 printf (_(" %s\n"), data);
5019 data += strlen ((char *) data) + 1;
5023 /* Skip the NUL at the end of the table. */
5026 /* Display the contents of the File Name table. */
5028 printf (_("\n The File Name Table is empty.\n"));
5031 printf (_("\n The File Name Table:\n"));
5032 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5036 unsigned char * name;
5039 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5042 data += strlen ((char *) data) + 1;
5044 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5046 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5048 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5050 printf (_("%s\n"), name);
5054 /* Skip the NUL at the end of the table. */
5057 /* Now display the statements. */
5058 printf (_("\n Line Number Statements:\n"));
5061 while (data < end_of_sequence)
5063 unsigned char op_code;
5067 op_code = * data ++;
5071 case DW_LNS_extended_op:
5072 data += process_extended_line_op (data, info.li_default_is_stmt,
5073 debug_line_pointer_size);
5077 printf (_(" Copy\n"));
5080 case DW_LNS_advance_pc:
5081 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
5083 state_machine_regs.address += adv;
5084 printf (_(" Advance PC by %d to %lx\n"), adv,
5085 state_machine_regs.address);
5088 case DW_LNS_advance_line:
5089 adv = read_leb128 (data, & bytes_read, 1);
5091 state_machine_regs.line += adv;
5092 printf (_(" Advance Line by %d to %d\n"), adv,
5093 state_machine_regs.line);
5096 case DW_LNS_set_file:
5097 adv = read_leb128 (data, & bytes_read, 0);
5099 printf (_(" Set File Name to entry %d in the File Name Table\n"),
5101 state_machine_regs.file = adv;
5104 case DW_LNS_set_column:
5105 adv = read_leb128 (data, & bytes_read, 0);
5107 printf (_(" Set column to %d\n"), adv);
5108 state_machine_regs.column = adv;
5111 case DW_LNS_negate_stmt:
5112 adv = state_machine_regs.is_stmt;
5114 printf (_(" Set is_stmt to %d\n"), adv);
5115 state_machine_regs.is_stmt = adv;
5118 case DW_LNS_set_basic_block:
5119 printf (_(" Set basic block\n"));
5120 state_machine_regs.basic_block = 1;
5123 case DW_LNS_const_add_pc:
5124 adv = (((255 - info.li_opcode_base) / info.li_line_range)
5125 * info.li_min_insn_length);
5126 state_machine_regs.address += adv;
5127 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
5128 state_machine_regs.address);
5131 case DW_LNS_fixed_advance_pc:
5132 adv = byte_get (data, 2);
5134 state_machine_regs.address += adv;
5135 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
5136 adv, state_machine_regs.address);
5140 op_code -= info.li_opcode_base;
5141 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
5142 state_machine_regs.address += adv;
5143 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
5144 op_code, adv, state_machine_regs.address);
5145 adv = (op_code % info.li_line_range) + info.li_line_base;
5146 state_machine_regs.line += adv;
5147 printf (_(" and Line by %d to %d\n"),
5148 adv, state_machine_regs.line);
5159 display_debug_pubnames (section, start, file)
5160 Elf32_Internal_Shdr * section;
5161 unsigned char * start;
5162 FILE * file ATTRIBUTE_UNUSED;
5164 DWARF2_External_PubNames * external;
5165 DWARF2_Internal_PubNames pubnames;
5166 unsigned char * end;
5168 end = start + section->sh_size;
5170 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
5174 unsigned char * data;
5175 unsigned long offset;
5177 external = (DWARF2_External_PubNames *) start;
5179 pubnames.pn_length = BYTE_GET (external->pn_length);
5180 pubnames.pn_version = BYTE_GET (external->pn_version);
5181 pubnames.pn_offset = BYTE_GET (external->pn_offset);
5182 pubnames.pn_size = BYTE_GET (external->pn_size);
5184 data = start + sizeof (* external);
5185 start += pubnames.pn_length + sizeof (external->pn_length);
5187 if (pubnames.pn_version != 2)
5189 warn (_("Only DWARF 2 pubnames are currently supported"));
5193 printf (_(" Length: %ld\n"),
5194 pubnames.pn_length);
5195 printf (_(" Version: %d\n"),
5196 pubnames.pn_version);
5197 printf (_(" Offset into .debug_info section: %ld\n"),
5198 pubnames.pn_offset);
5199 printf (_(" Size of area in .debug_info section: %ld\n"),
5202 printf (_("\n Offset\tName\n"));
5206 offset = byte_get (data, 4);
5211 printf (" %ld\t\t%s\n", offset, data);
5212 data += strlen ((char *) data) + 1;
5215 while (offset != 0);
5228 case DW_TAG_padding: return "DW_TAG_padding";
5229 case DW_TAG_array_type: return "DW_TAG_array_type";
5230 case DW_TAG_class_type: return "DW_TAG_class_type";
5231 case DW_TAG_entry_point: return "DW_TAG_entry_point";
5232 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
5233 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
5234 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
5235 case DW_TAG_label: return "DW_TAG_label";
5236 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
5237 case DW_TAG_member: return "DW_TAG_member";
5238 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
5239 case DW_TAG_reference_type: return "DW_TAG_reference_type";
5240 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
5241 case DW_TAG_string_type: return "DW_TAG_string_type";
5242 case DW_TAG_structure_type: return "DW_TAG_structure_type";
5243 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
5244 case DW_TAG_typedef: return "DW_TAG_typedef";
5245 case DW_TAG_union_type: return "DW_TAG_union_type";
5246 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
5247 case DW_TAG_variant: return "DW_TAG_variant";
5248 case DW_TAG_common_block: return "DW_TAG_common_block";
5249 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
5250 case DW_TAG_inheritance: return "DW_TAG_inheritance";
5251 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
5252 case DW_TAG_module: return "DW_TAG_module";
5253 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
5254 case DW_TAG_set_type: return "DW_TAG_set_type";
5255 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
5256 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
5257 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
5258 case DW_TAG_base_type: return "DW_TAG_base_type";
5259 case DW_TAG_catch_block: return "DW_TAG_catch_block";
5260 case DW_TAG_const_type: return "DW_TAG_const_type";
5261 case DW_TAG_constant: return "DW_TAG_constant";
5262 case DW_TAG_enumerator: return "DW_TAG_enumerator";
5263 case DW_TAG_file_type: return "DW_TAG_file_type";
5264 case DW_TAG_friend: return "DW_TAG_friend";
5265 case DW_TAG_namelist: return "DW_TAG_namelist";
5266 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
5267 case DW_TAG_packed_type: return "DW_TAG_packed_type";
5268 case DW_TAG_subprogram: return "DW_TAG_subprogram";
5269 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
5270 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
5271 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
5272 case DW_TAG_try_block: return "DW_TAG_try_block";
5273 case DW_TAG_variant_part: return "DW_TAG_variant_part";
5274 case DW_TAG_variable: return "DW_TAG_variable";
5275 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
5276 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
5277 case DW_TAG_format_label: return "DW_TAG_format_label";
5278 case DW_TAG_function_template: return "DW_TAG_function_template";
5279 case DW_TAG_class_template: return "DW_TAG_class_template";
5282 static char buffer [100];
5284 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
5291 get_AT_name (attribute)
5292 unsigned long attribute;
5296 case DW_AT_sibling: return "DW_AT_sibling";
5297 case DW_AT_location: return "DW_AT_location";
5298 case DW_AT_name: return "DW_AT_name";
5299 case DW_AT_ordering: return "DW_AT_ordering";
5300 case DW_AT_subscr_data: return "DW_AT_subscr_data";
5301 case DW_AT_byte_size: return "DW_AT_byte_size";
5302 case DW_AT_bit_offset: return "DW_AT_bit_offset";
5303 case DW_AT_bit_size: return "DW_AT_bit_size";
5304 case DW_AT_element_list: return "DW_AT_element_list";
5305 case DW_AT_stmt_list: return "DW_AT_stmt_list";
5306 case DW_AT_low_pc: return "DW_AT_low_pc";
5307 case DW_AT_high_pc: return "DW_AT_high_pc";
5308 case DW_AT_language: return "DW_AT_language";
5309 case DW_AT_member: return "DW_AT_member";
5310 case DW_AT_discr: return "DW_AT_discr";
5311 case DW_AT_discr_value: return "DW_AT_discr_value";
5312 case DW_AT_visibility: return "DW_AT_visibility";
5313 case DW_AT_import: return "DW_AT_import";
5314 case DW_AT_string_length: return "DW_AT_string_length";
5315 case DW_AT_common_reference: return "DW_AT_common_reference";
5316 case DW_AT_comp_dir: return "DW_AT_comp_dir";
5317 case DW_AT_const_value: return "DW_AT_const_value";
5318 case DW_AT_containing_type: return "DW_AT_containing_type";
5319 case DW_AT_default_value: return "DW_AT_default_value";
5320 case DW_AT_inline: return "DW_AT_inline";
5321 case DW_AT_is_optional: return "DW_AT_is_optional";
5322 case DW_AT_lower_bound: return "DW_AT_lower_bound";
5323 case DW_AT_producer: return "DW_AT_producer";
5324 case DW_AT_prototyped: return "DW_AT_prototyped";
5325 case DW_AT_return_addr: return "DW_AT_return_addr";
5326 case DW_AT_start_scope: return "DW_AT_start_scope";
5327 case DW_AT_stride_size: return "DW_AT_stride_size";
5328 case DW_AT_upper_bound: return "DW_AT_upper_bound";
5329 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
5330 case DW_AT_accessibility: return "DW_AT_accessibility";
5331 case DW_AT_address_class: return "DW_AT_address_class";
5332 case DW_AT_artificial: return "DW_AT_artificial";
5333 case DW_AT_base_types: return "DW_AT_base_types";
5334 case DW_AT_calling_convention: return "DW_AT_calling_convention";
5335 case DW_AT_count: return "DW_AT_count";
5336 case DW_AT_data_member_location: return "DW_AT_data_member_location";
5337 case DW_AT_decl_column: return "DW_AT_decl_column";
5338 case DW_AT_decl_file: return "DW_AT_decl_file";
5339 case DW_AT_decl_line: return "DW_AT_decl_line";
5340 case DW_AT_declaration: return "DW_AT_declaration";
5341 case DW_AT_discr_list: return "DW_AT_discr_list";
5342 case DW_AT_encoding: return "DW_AT_encoding";
5343 case DW_AT_external: return "DW_AT_external";
5344 case DW_AT_frame_base: return "DW_AT_frame_base";
5345 case DW_AT_friend: return "DW_AT_friend";
5346 case DW_AT_identifier_case: return "DW_AT_identifier_case";
5347 case DW_AT_macro_info: return "DW_AT_macro_info";
5348 case DW_AT_namelist_items: return "DW_AT_namelist_items";
5349 case DW_AT_priority: return "DW_AT_priority";
5350 case DW_AT_segment: return "DW_AT_segment";
5351 case DW_AT_specification: return "DW_AT_specification";
5352 case DW_AT_static_link: return "DW_AT_static_link";
5353 case DW_AT_type: return "DW_AT_type";
5354 case DW_AT_use_location: return "DW_AT_use_location";
5355 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
5356 case DW_AT_virtuality: return "DW_AT_virtuality";
5357 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
5358 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
5359 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
5360 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
5361 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
5362 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
5363 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
5364 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
5365 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
5366 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
5367 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
5368 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
5369 case DW_AT_sf_names: return "DW_AT_sf_names";
5370 case DW_AT_src_info: return "DW_AT_src_info";
5371 case DW_AT_mac_info: return "DW_AT_mac_info";
5372 case DW_AT_src_coords: return "DW_AT_src_coords";
5373 case DW_AT_body_begin: return "DW_AT_body_begin";
5374 case DW_AT_body_end: return "DW_AT_body_end";
5377 static char buffer [100];
5379 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
5386 get_FORM_name (form)
5391 case DW_FORM_addr: return "DW_FORM_addr";
5392 case DW_FORM_block2: return "DW_FORM_block2";
5393 case DW_FORM_block4: return "DW_FORM_block4";
5394 case DW_FORM_data2: return "DW_FORM_data2";
5395 case DW_FORM_data4: return "DW_FORM_data4";
5396 case DW_FORM_data8: return "DW_FORM_data8";
5397 case DW_FORM_string: return "DW_FORM_string";
5398 case DW_FORM_block: return "DW_FORM_block";
5399 case DW_FORM_block1: return "DW_FORM_block1";
5400 case DW_FORM_data1: return "DW_FORM_data1";
5401 case DW_FORM_flag: return "DW_FORM_flag";
5402 case DW_FORM_sdata: return "DW_FORM_sdata";
5403 case DW_FORM_strp: return "DW_FORM_strp";
5404 case DW_FORM_udata: return "DW_FORM_udata";
5405 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
5406 case DW_FORM_ref1: return "DW_FORM_ref1";
5407 case DW_FORM_ref2: return "DW_FORM_ref2";
5408 case DW_FORM_ref4: return "DW_FORM_ref4";
5409 case DW_FORM_ref8: return "DW_FORM_ref8";
5410 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
5411 case DW_FORM_indirect: return "DW_FORM_indirect";
5414 static char buffer [100];
5416 sprintf (buffer, _("Unknown FORM value: %lx"), form);
5422 /* FIXME: There are better and more effiecint ways to handle
5423 these structures. For now though, I just want something that
5424 is simple to implement. */
5425 typedef struct abbrev_attr
5427 unsigned long attribute;
5429 struct abbrev_attr * next;
5433 typedef struct abbrev_entry
5435 unsigned long entry;
5438 struct abbrev_attr * first_attr;
5439 struct abbrev_attr * last_attr;
5440 struct abbrev_entry * next;
5444 static abbrev_entry * first_abbrev = NULL;
5445 static abbrev_entry * last_abbrev = NULL;
5448 free_abbrevs PARAMS ((void))
5450 abbrev_entry * abbrev;
5452 for (abbrev = first_abbrev; abbrev;)
5454 abbrev_entry * next = abbrev->next;
5457 for (attr = abbrev->first_attr; attr;)
5459 abbrev_attr * next = attr->next;
5469 last_abbrev = first_abbrev = NULL;
5473 add_abbrev (number, tag, children)
5474 unsigned long number;
5478 abbrev_entry * entry;
5480 entry = (abbrev_entry *) malloc (sizeof (* entry));
5486 entry->entry = number;
5488 entry->children = children;
5489 entry->first_attr = NULL;
5490 entry->last_attr = NULL;
5493 if (first_abbrev == NULL)
5494 first_abbrev = entry;
5496 last_abbrev->next = entry;
5498 last_abbrev = entry;
5502 add_abbrev_attr (attribute, form)
5503 unsigned long attribute;
5508 attr = (abbrev_attr *) malloc (sizeof (* attr));
5514 attr->attribute = attribute;
5518 if (last_abbrev->first_attr == NULL)
5519 last_abbrev->first_attr = attr;
5521 last_abbrev->last_attr->next = attr;
5523 last_abbrev->last_attr = attr;
5526 /* Processes the (partial) contents of a .debug_abbrev section.
5527 Returns NULL if the end of the section was encountered.
5528 Returns the address after the last byte read if the end of
5529 an abbreviation set was found. */
5531 static unsigned char *
5532 process_abbrev_section (start, end)
5533 unsigned char * start;
5534 unsigned char * end;
5536 if (first_abbrev != NULL)
5542 unsigned long entry;
5544 unsigned long attribute;
5547 entry = read_leb128 (start, & bytes_read, 0);
5548 start += bytes_read;
5550 /* A single zero is supposed to end the section according
5551 to the standard. If there's more, then signal that to
5554 return start == end ? NULL : start;
5556 tag = read_leb128 (start, & bytes_read, 0);
5557 start += bytes_read;
5559 children = * start ++;
5561 add_abbrev (entry, tag, children);
5567 attribute = read_leb128 (start, & bytes_read, 0);
5568 start += bytes_read;
5570 form = read_leb128 (start, & bytes_read, 0);
5571 start += bytes_read;
5574 add_abbrev_attr (attribute, form);
5576 while (attribute != 0);
5584 display_debug_abbrev (section, start, file)
5585 Elf32_Internal_Shdr * section;
5586 unsigned char * start;
5587 FILE * file ATTRIBUTE_UNUSED;
5589 abbrev_entry * entry;
5590 unsigned char * end = start + section->sh_size;
5592 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
5596 start = process_abbrev_section (start, end);
5598 printf (_(" Number TAG\n"));
5600 for (entry = first_abbrev; entry; entry = entry->next)
5604 printf (_(" %ld %s [%s]\n"),
5606 get_TAG_name (entry->tag),
5607 entry->children ? _("has children") : _("no children"));
5609 for (attr = entry->first_attr; attr; attr = attr->next)
5611 printf (_(" %-18s %s\n"),
5612 get_AT_name (attr->attribute),
5613 get_FORM_name (attr->form));
5625 static unsigned char *
5626 display_block (data, length)
5627 unsigned char * data;
5628 unsigned long length;
5630 printf (_(" %lu byte block: "), length);
5633 printf ("%lx ", (unsigned long) byte_get (data ++, 1));
5639 decode_location_expression (data, pointer_size, length)
5640 unsigned char * data;
5641 unsigned int pointer_size;
5642 unsigned long length;
5646 unsigned long uvalue;
5647 unsigned char *end = data + length;
5656 printf ("DW_OP_addr: %lx",
5657 (unsigned long) byte_get (data, pointer_size));
5658 data += pointer_size;
5661 printf ("DW_OP_deref");
5664 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
5667 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
5670 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
5674 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
5678 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
5682 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
5686 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
5687 (unsigned long) byte_get (data + 4, 4));
5691 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
5692 (long) byte_get (data + 4, 4));
5696 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
5700 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
5704 printf ("DW_OP_dup");
5707 printf ("DW_OP_drop");
5710 printf ("DW_OP_over");
5713 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
5716 printf ("DW_OP_swap");
5719 printf ("DW_OP_rot");
5722 printf ("DW_OP_xderef");
5725 printf ("DW_OP_abs");
5728 printf ("DW_OP_and");
5731 printf ("DW_OP_div");
5734 printf ("DW_OP_minus");
5737 printf ("DW_OP_mod");
5740 printf ("DW_OP_mul");
5743 printf ("DW_OP_neg");
5746 printf ("DW_OP_not");
5749 printf ("DW_OP_or");
5752 printf ("DW_OP_plus");
5754 case DW_OP_plus_uconst:
5755 printf ("DW_OP_plus_uconst: %lu",
5756 read_leb128 (data, &bytes_read, 0));
5760 printf ("DW_OP_shl");
5763 printf ("DW_OP_shr");
5766 printf ("DW_OP_shra");
5769 printf ("DW_OP_xor");
5772 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
5776 printf ("DW_OP_eq");
5779 printf ("DW_OP_ge");
5782 printf ("DW_OP_gt");
5785 printf ("DW_OP_le");
5788 printf ("DW_OP_lt");
5791 printf ("DW_OP_ne");
5794 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
5830 printf ("DW_OP_lit%d", op - DW_OP_lit0);
5865 printf ("DW_OP_reg%d", op - DW_OP_reg0);
5900 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
5901 read_leb128 (data, &bytes_read, 1));
5906 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
5910 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
5914 uvalue = read_leb128 (data, &bytes_read, 0);
5916 printf ("DW_OP_bregx: %lu %ld", uvalue,
5917 read_leb128 (data, &bytes_read, 1));
5921 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
5924 case DW_OP_deref_size:
5925 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
5927 case DW_OP_xderef_size:
5928 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
5931 printf ("DW_OP_nop");
5935 if (op >= DW_OP_lo_user
5936 && op <= DW_OP_hi_user)
5937 printf (_("(User defined location op)"));
5939 printf (_("(Unknown location op)"));
5940 /* No way to tell where the next op is, so just bail. */
5947 static unsigned char *
5948 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
5949 unsigned long attribute;
5951 unsigned char * data;
5952 unsigned long cu_offset;
5953 unsigned long pointer_size;
5955 unsigned long uvalue = 0;
5956 unsigned char * block_start = NULL;
5959 printf (" %-18s:", get_AT_name (attribute));
5966 case DW_FORM_ref_addr:
5968 uvalue = byte_get (data, pointer_size);
5969 data += pointer_size;
5975 uvalue = byte_get (data ++, 1);
5980 uvalue = byte_get (data, 2);
5986 uvalue = byte_get (data, 4);
5991 uvalue = read_leb128 (data, & bytes_read, 1);
5995 case DW_FORM_ref_udata:
5997 uvalue = read_leb128 (data, & bytes_read, 0);
6004 case DW_FORM_ref_addr:
6005 printf (" <#%lx>", uvalue);
6011 case DW_FORM_ref_udata:
6012 printf (" <%lx>", uvalue + cu_offset);
6016 printf (" %#lx", uvalue);
6024 printf (" %ld", uvalue);
6029 uvalue = byte_get (data, 4);
6030 printf (" %lx", uvalue);
6031 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
6035 case DW_FORM_string:
6036 printf (" %s", data);
6037 data += strlen ((char *) data) + 1;
6041 uvalue = read_leb128 (data, & bytes_read, 0);
6042 block_start = data + bytes_read;
6043 data = display_block (block_start, uvalue);
6046 case DW_FORM_block1:
6047 uvalue = byte_get (data, 1);
6048 block_start = data + 1;
6049 data = display_block (block_start, uvalue);
6052 case DW_FORM_block2:
6053 uvalue = byte_get (data, 2);
6054 block_start = data + 2;
6055 data = display_block (block_start, uvalue);
6058 case DW_FORM_block4:
6059 uvalue = byte_get (data, 4);
6060 block_start = data + 4;
6061 data = display_block (block_start, uvalue);
6065 case DW_FORM_indirect:
6066 warn (_("Unable to handle FORM: %d"), form);
6070 warn (_("Unrecognised form: %d"), form);
6074 /* For some attributes we can display futher information. */
6083 case DW_INL_not_inlined: printf (_("(not inlined)")); break;
6084 case DW_INL_inlined: printf (_("(inlined)")); break;
6085 case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
6086 case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break;
6087 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break;
6091 case DW_AT_language:
6094 case DW_LANG_C: printf ("(non-ANSI C)"); break;
6095 case DW_LANG_C89: printf ("(ANSI C)"); break;
6096 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
6097 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
6098 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
6099 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
6100 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
6101 case DW_LANG_Ada83: printf ("(Ada)"); break;
6102 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
6103 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
6104 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
6105 default: printf ("(Unknown: %lx)", uvalue); break;
6109 case DW_AT_encoding:
6112 case DW_ATE_void: printf ("(void)"); break;
6113 case DW_ATE_address: printf ("(machine address)"); break;
6114 case DW_ATE_boolean: printf ("(boolean)"); break;
6115 case DW_ATE_complex_float: printf ("(complex float)"); break;
6116 case DW_ATE_float: printf ("(float)"); break;
6117 case DW_ATE_signed: printf ("(signed)"); break;
6118 case DW_ATE_signed_char: printf ("(signed char)"); break;
6119 case DW_ATE_unsigned: printf ("(unsigned)"); break;
6120 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
6122 if (uvalue >= DW_ATE_lo_user
6123 && uvalue <= DW_ATE_hi_user)
6124 printf ("(user defined type)");
6126 printf ("(unknown type)");
6131 case DW_AT_accessibility:
6134 case DW_ACCESS_public: printf ("(public)"); break;
6135 case DW_ACCESS_protected: printf ("(protected)"); break;
6136 case DW_ACCESS_private: printf ("(private)"); break;
6137 default: printf ("(unknown accessibility)"); break;
6141 case DW_AT_visibility:
6144 case DW_VIS_local: printf ("(local)"); break;
6145 case DW_VIS_exported: printf ("(exported)"); break;
6146 case DW_VIS_qualified: printf ("(qualified)"); break;
6147 default: printf ("(unknown visibility)"); break;
6151 case DW_AT_virtuality:
6154 case DW_VIRTUALITY_none: printf ("(none)"); break;
6155 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
6156 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
6157 default: printf ("(unknown virtuality)"); break;
6161 case DW_AT_identifier_case:
6164 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
6165 case DW_ID_up_case: printf ("(up_case)"); break;
6166 case DW_ID_down_case: printf ("(down_case)"); break;
6167 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
6168 default: printf ("(unknown case)"); break;
6172 case DW_AT_calling_convention:
6175 case DW_CC_normal: printf ("(normal)"); break;
6176 case DW_CC_program: printf ("(program)"); break;
6177 case DW_CC_nocall: printf ("(nocall)"); break;
6179 if (uvalue >= DW_CC_lo_user
6180 && uvalue <= DW_CC_hi_user)
6181 printf ("(user defined)");
6183 printf ("(unknown convention)");
6187 case DW_AT_frame_base:
6188 case DW_AT_location:
6189 case DW_AT_data_member_location:
6190 case DW_AT_vtable_elem_location:
6194 decode_location_expression (block_start, pointer_size, uvalue);
6208 display_debug_info (section, start, file)
6209 Elf32_Internal_Shdr * section;
6210 unsigned char * start;
6213 unsigned char * end = start + section->sh_size;
6214 unsigned char * section_begin = start;
6216 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
6220 DWARF2_External_CompUnit * external;
6221 DWARF2_Internal_CompUnit compunit;
6222 unsigned char * tags;
6225 unsigned long cu_offset;
6227 external = (DWARF2_External_CompUnit *) start;
6229 compunit.cu_length = BYTE_GET (external->cu_length);
6230 compunit.cu_version = BYTE_GET (external->cu_version);
6231 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
6232 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
6234 tags = start + sizeof (* external);
6235 cu_offset = start - section_begin;
6236 start += compunit.cu_length + sizeof (external->cu_length);
6238 if (compunit.cu_version != 2)
6240 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
6244 printf (_(" Compilation Unit:\n"));
6245 printf (_(" Length: %ld\n"), compunit.cu_length);
6246 printf (_(" Version: %d\n"), compunit.cu_version);
6247 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
6248 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
6250 if (first_abbrev != NULL)
6253 /* Read in the abbrevs used by this compilation unit. */
6256 Elf32_Internal_Shdr * sec;
6257 unsigned char * begin;
6259 /* Locate the .debug_abbrev section and process it. */
6260 for (i = 0, sec = section_headers;
6261 i < elf_header.e_shnum;
6263 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
6266 if (i == -1 || sec->sh_size == 0)
6268 warn (_("Unable to locate .debug_abbrev section!\n"));
6272 GET_DATA_ALLOC (sec->sh_offset, sec->sh_size, begin, unsigned char *,
6273 "debug_abbrev section data");
6275 process_abbrev_section (begin + compunit.cu_abbrev_offset,
6276 begin + sec->sh_size);
6282 while (tags < start)
6285 unsigned long abbrev_number;
6286 abbrev_entry * entry;
6289 abbrev_number = read_leb128 (tags, & bytes_read, 0);
6292 /* A null DIE marks the end of a list of children. */
6293 if (abbrev_number == 0)
6299 /* Scan through the abbreviation list until we reach the
6301 for (entry = first_abbrev;
6302 entry && entry->entry != abbrev_number;
6303 entry = entry->next)
6308 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
6313 printf (_(" <%d><%x>: Abbrev Number: %lu (%s)\n"),
6314 level, tags - section_begin - bytes_read,
6316 get_TAG_name (entry->tag));
6318 for (attr = entry->first_attr; attr; attr = attr->next)
6319 tags = read_and_display_attr (attr->attribute,
6322 compunit.cu_pointer_size);
6324 if (entry->children)
6335 display_debug_aranges (section, start, file)
6336 Elf32_Internal_Shdr * section;
6337 unsigned char * start;
6338 FILE * file ATTRIBUTE_UNUSED;
6340 unsigned char * end = start + section->sh_size;
6342 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
6346 DWARF2_External_ARange * external;
6347 DWARF2_Internal_ARange arange;
6348 unsigned char * ranges;
6349 unsigned long length;
6350 unsigned long address;
6353 external = (DWARF2_External_ARange *) start;
6355 arange.ar_length = BYTE_GET (external->ar_length);
6356 arange.ar_version = BYTE_GET (external->ar_version);
6357 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
6358 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
6359 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
6361 printf (_(" Length: %ld\n"), arange.ar_length);
6362 printf (_(" Version: %d\n"), arange.ar_version);
6363 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
6364 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
6365 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
6367 printf (_("\n Address Length\n"));
6369 ranges = start + sizeof (* external);
6371 /* Must pad to an alignment boundary that is twice the pointer size. */
6372 excess = sizeof (*external) % (2 * arange.ar_pointer_size);
6374 ranges += (2 * arange.ar_pointer_size) - excess;
6378 address = byte_get (ranges, arange.ar_pointer_size);
6380 ranges += arange.ar_pointer_size;
6382 length = byte_get (ranges, arange.ar_pointer_size);
6384 ranges += arange.ar_pointer_size;
6386 /* A pair of zeros marks the end of the list. */
6387 if (address == 0 && length == 0)
6390 printf (" %8.8lx %lu\n", address, length);
6393 start += arange.ar_length + sizeof (external->ar_length);
6403 display_debug_not_supported (section, start, file)
6404 Elf32_Internal_Shdr * section;
6405 unsigned char * start ATTRIBUTE_UNUSED;
6406 FILE * file ATTRIBUTE_UNUSED;
6408 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
6409 SECTION_NAME (section));
6414 /* Pre-scan the .debug_info section to record the size of address.
6415 When dumping the .debug_line, we use that size information, assuming
6416 that all compilation units have the same address size. */
6418 prescan_debug_info (section, start, file)
6419 Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
6420 unsigned char * start;
6421 FILE * file ATTRIBUTE_UNUSED;
6423 DWARF2_External_CompUnit * external;
6425 external = (DWARF2_External_CompUnit *) start;
6427 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
6431 /* A structure containing the name of a debug section and a pointer
6432 to a function that can decode it. The third field is a prescan
6433 function to be run over the section before displaying any of the
6438 int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
6439 int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
6443 { ".debug_info", display_debug_info, prescan_debug_info },
6444 { ".debug_abbrev", display_debug_abbrev, NULL },
6445 { ".debug_line", display_debug_lines, NULL },
6446 { ".debug_aranges", display_debug_aranges, NULL },
6447 { ".debug_pubnames", display_debug_pubnames, NULL },
6448 { ".debug_macinfo", display_debug_not_supported, NULL },
6449 { ".debug_frame", display_debug_not_supported, NULL },
6450 { ".debug_str", display_debug_not_supported, NULL },
6451 { ".debug_static_func", display_debug_not_supported, NULL },
6452 { ".debug_static_vars", display_debug_not_supported, NULL },
6453 { ".debug_types", display_debug_not_supported, NULL },
6454 { ".debug_weaknames", display_debug_not_supported, NULL }
6458 display_debug_section (section, file)
6459 Elf32_Internal_Shdr * section;
6462 char * name = SECTION_NAME (section);
6463 bfd_size_type length;
6464 unsigned char * start;
6467 length = section->sh_size;
6470 printf (_("\nSection '%s' has no debugging data.\n"), name);
6474 GET_DATA_ALLOC (section->sh_offset, length, start, unsigned char *,
6475 "debug section data");
6477 /* See if we know how to display the contents of this section. */
6478 for (i = NUM_ELEM (debug_displays); i--;)
6479 if (strcmp (debug_displays[i].name, name) == 0)
6481 debug_displays[i].display (section, start, file);
6486 printf (_("Unrecognised debug section: %s\n"), name);
6490 /* If we loaded in the abbrev section at some point,
6491 we must release it here. */
6492 if (first_abbrev != NULL)
6499 process_section_contents (file)
6502 Elf32_Internal_Shdr * section;
6508 /* Pre-scan the debug sections to find some debug information not
6509 present in some of them. For the .debug_line, we must find out the
6510 size of address (specified in .debug_info and .debug_aranges). */
6511 for (i = 0, section = section_headers;
6512 i < elf_header.e_shnum && i < num_dump_sects;
6515 char * name = SECTION_NAME (section);
6518 if (section->sh_size == 0)
6521 /* See if there is some pre-scan operation for this section. */
6522 for (j = NUM_ELEM (debug_displays); j--;)
6523 if (strcmp (debug_displays[j].name, name) == 0)
6525 if (debug_displays[j].prescan != NULL)
6527 bfd_size_type length;
6528 unsigned char * start;
6530 length = section->sh_size;
6531 GET_DATA_ALLOC (section->sh_offset, length, start, unsigned char *,
6532 "debug section data");
6534 debug_displays[j].prescan (section, start, file);
6542 for (i = 0, section = section_headers;
6543 i < elf_header.e_shnum && i < num_dump_sects;
6546 #ifdef SUPPORT_DISASSEMBLY
6547 if (dump_sects[i] & DISASS_DUMP)
6548 disassemble_section (section, file);
6550 if (dump_sects[i] & HEX_DUMP)
6551 dump_section (section, file);
6553 if (dump_sects[i] & DEBUG_DUMP)
6554 display_debug_section (section, file);
6557 if (i < num_dump_sects)
6558 warn (_("Some sections were not dumped because they do not exist!\n"));
6564 process_mips_fpe_exception (mask)
6570 if (mask & OEX_FPU_INEX)
6571 fputs ("INEX", stdout), first = 0;
6572 if (mask & OEX_FPU_UFLO)
6573 printf ("%sUFLO", first ? "" : "|"), first = 0;
6574 if (mask & OEX_FPU_OFLO)
6575 printf ("%sOFLO", first ? "" : "|"), first = 0;
6576 if (mask & OEX_FPU_DIV0)
6577 printf ("%sDIV0", first ? "" : "|"), first = 0;
6578 if (mask & OEX_FPU_INVAL)
6579 printf ("%sINVAL", first ? "" : "|");
6582 fputs ("0", stdout);
6586 process_mips_specific (file)
6589 Elf_Internal_Dyn * entry;
6590 size_t liblist_offset = 0;
6591 size_t liblistno = 0;
6592 size_t conflictsno = 0;
6593 size_t options_offset = 0;
6594 size_t conflicts_offset = 0;
6596 /* We have a lot of special sections. Thanks SGI! */
6597 if (dynamic_segment == NULL)
6598 /* No information available. */
6601 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
6602 switch (entry->d_tag)
6604 case DT_MIPS_LIBLIST:
6605 liblist_offset = entry->d_un.d_val - loadaddr;
6607 case DT_MIPS_LIBLISTNO:
6608 liblistno = entry->d_un.d_val;
6610 case DT_MIPS_OPTIONS:
6611 options_offset = entry->d_un.d_val - loadaddr;
6613 case DT_MIPS_CONFLICT:
6614 conflicts_offset = entry->d_un.d_val - loadaddr;
6616 case DT_MIPS_CONFLICTNO:
6617 conflictsno = entry->d_un.d_val;
6623 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
6625 Elf32_External_Lib * elib;
6628 GET_DATA_ALLOC (liblist_offset, liblistno * sizeof (Elf32_External_Lib),
6629 elib, Elf32_External_Lib *, "liblist");
6631 printf ("\nSection '.liblist' contains %lu entries:\n",
6632 (unsigned long) liblistno);
6633 fputs (" Library Time Stamp Checksum Version Flags\n",
6636 for (cnt = 0; cnt < liblistno; ++cnt)
6643 liblist.l_name = BYTE_GET (elib[cnt].l_name);
6644 time = BYTE_GET (elib[cnt].l_time_stamp);
6645 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
6646 liblist.l_version = BYTE_GET (elib[cnt].l_version);
6647 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
6649 tmp = gmtime (&time);
6650 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
6651 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
6652 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
6654 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt,
6655 dynamic_strings + liblist.l_name, timebuf,
6656 liblist.l_checksum, liblist.l_version);
6658 if (liblist.l_flags == 0)
6669 { " EXACT_MATCH", LL_EXACT_MATCH },
6670 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
6671 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
6672 { " EXPORTS", LL_EXPORTS },
6673 { " DELAY_LOAD", LL_DELAY_LOAD },
6674 { " DELTA", LL_DELTA }
6676 int flags = liblist.l_flags;
6680 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
6682 if ((flags & l_flags_vals[fcnt].bit) != 0)
6684 fputs (l_flags_vals[fcnt].name, stdout);
6685 flags ^= l_flags_vals[fcnt].bit;
6688 printf (" %#x", (unsigned int) flags);
6697 if (options_offset != 0)
6699 Elf_External_Options * eopt;
6700 Elf_Internal_Shdr * sect = section_headers;
6701 Elf_Internal_Options * iopt;
6702 Elf_Internal_Options * option;
6706 /* Find the section header so that we get the size. */
6707 while (sect->sh_type != SHT_MIPS_OPTIONS)
6710 GET_DATA_ALLOC (options_offset, sect->sh_size, eopt,
6711 Elf_External_Options *, "options");
6713 iopt = (Elf_Internal_Options *) malloc ((sect->sh_size / sizeof (eopt))
6717 error (_("Out of memory"));
6724 while (offset < sect->sh_size)
6726 Elf_External_Options * eoption;
6728 eoption = (Elf_External_Options *) ((char *) eopt + offset);
6730 option->kind = BYTE_GET (eoption->kind);
6731 option->size = BYTE_GET (eoption->size);
6732 option->section = BYTE_GET (eoption->section);
6733 option->info = BYTE_GET (eoption->info);
6735 offset += option->size;
6741 printf (_("\nSection '%s' contains %d entries:\n"),
6742 string_table + sect->sh_name, cnt);
6750 switch (option->kind)
6753 /* This shouldn't happen. */
6754 printf (" NULL %d %lx", option->section, option->info);
6757 printf (" REGINFO ");
6758 if (elf_header.e_machine == EM_MIPS)
6761 Elf32_External_RegInfo *ereg;
6762 Elf32_RegInfo reginfo;
6764 ereg = (Elf32_External_RegInfo *) (option + 1);
6765 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
6766 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
6767 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
6768 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
6769 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
6770 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
6772 printf ("GPR %08lx GP 0x%lx\n",
6774 (unsigned long) reginfo.ri_gp_value);
6775 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
6776 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
6777 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
6782 Elf64_External_RegInfo * ereg;
6783 Elf64_Internal_RegInfo reginfo;
6785 ereg = (Elf64_External_RegInfo *) (option + 1);
6786 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
6787 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
6788 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
6789 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
6790 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
6791 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
6793 printf ("GPR %08lx GP 0x",
6794 reginfo.ri_gprmask);
6795 printf_vma (reginfo.ri_gp_value);
6798 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
6799 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
6800 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
6804 case ODK_EXCEPTIONS:
6805 fputs (" EXCEPTIONS fpe_min(", stdout);
6806 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
6807 fputs (") fpe_max(", stdout);
6808 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
6809 fputs (")", stdout);
6811 if (option->info & OEX_PAGE0)
6812 fputs (" PAGE0", stdout);
6813 if (option->info & OEX_SMM)
6814 fputs (" SMM", stdout);
6815 if (option->info & OEX_FPDBUG)
6816 fputs (" FPDBUG", stdout);
6817 if (option->info & OEX_DISMISS)
6818 fputs (" DISMISS", stdout);
6821 fputs (" PAD ", stdout);
6822 if (option->info & OPAD_PREFIX)
6823 fputs (" PREFIX", stdout);
6824 if (option->info & OPAD_POSTFIX)
6825 fputs (" POSTFIX", stdout);
6826 if (option->info & OPAD_SYMBOL)
6827 fputs (" SYMBOL", stdout);
6830 fputs (" HWPATCH ", stdout);
6831 if (option->info & OHW_R4KEOP)
6832 fputs (" R4KEOP", stdout);
6833 if (option->info & OHW_R8KPFETCH)
6834 fputs (" R8KPFETCH", stdout);
6835 if (option->info & OHW_R5KEOP)
6836 fputs (" R5KEOP", stdout);
6837 if (option->info & OHW_R5KCVTL)
6838 fputs (" R5KCVTL", stdout);
6841 fputs (" FILL ", stdout);
6842 /* XXX Print content of info word? */
6845 fputs (" TAGS ", stdout);
6846 /* XXX Print content of info word? */
6849 fputs (" HWAND ", stdout);
6850 if (option->info & OHWA0_R4KEOP_CHECKED)
6851 fputs (" R4KEOP_CHECKED", stdout);
6852 if (option->info & OHWA0_R4KEOP_CLEAN)
6853 fputs (" R4KEOP_CLEAN", stdout);
6856 fputs (" HWOR ", stdout);
6857 if (option->info & OHWA0_R4KEOP_CHECKED)
6858 fputs (" R4KEOP_CHECKED", stdout);
6859 if (option->info & OHWA0_R4KEOP_CLEAN)
6860 fputs (" R4KEOP_CLEAN", stdout);
6863 printf (" GP_GROUP %#06lx self-contained %#06lx",
6864 option->info & OGP_GROUP,
6865 (option->info & OGP_SELF) >> 16);
6868 printf (" IDENT %#06lx self-contained %#06lx",
6869 option->info & OGP_GROUP,
6870 (option->info & OGP_SELF) >> 16);
6873 /* This shouldn't happen. */
6874 printf (" %3d ??? %d %lx",
6875 option->kind, option->section, option->info);
6879 len = sizeof (*eopt);
6880 while (len < option->size)
6881 if (((char *) option)[len] >= ' '
6882 && ((char *) option)[len] < 0x7f)
6883 printf ("%c", ((char *) option)[len++]);
6885 printf ("\\%03o", ((char *) option)[len++]);
6887 fputs ("\n", stdout);
6894 if (conflicts_offset != 0 && conflictsno != 0)
6896 Elf32_External_Conflict * econf32;
6897 Elf64_External_Conflict * econf64;
6898 Elf32_Conflict * iconf;
6901 if (dynamic_symbols == NULL)
6903 error (_("conflict list with without table"));
6907 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (*iconf));
6910 error (_("Out of memory"));
6916 GET_DATA_ALLOC (conflicts_offset, conflictsno * sizeof (*econf32),
6917 econf32, Elf32_External_Conflict *, "conflict");
6919 for (cnt = 0; cnt < conflictsno; ++cnt)
6920 iconf[cnt] = BYTE_GET (econf32[cnt]);
6924 GET_DATA_ALLOC (conflicts_offset, conflictsno * sizeof (*econf64),
6925 econf64, Elf64_External_Conflict *, "conflict");
6927 for (cnt = 0; cnt < conflictsno; ++cnt)
6928 iconf[cnt] = BYTE_GET (econf64[cnt]);
6931 printf (_("\nSection '.conflict' contains %d entries:\n"), conflictsno);
6932 puts (_(" Num: Index Value Name"));
6934 for (cnt = 0; cnt < conflictsno; ++cnt)
6936 Elf_Internal_Sym * psym = &dynamic_symbols[iconf[cnt]];
6938 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
6939 print_vma (psym->st_value, FULL_HEX);
6940 printf (" %s\n", dynamic_strings + psym->st_name);
6950 get_note_type (e_type)
6953 static char buff[64];
6957 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
6958 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
6959 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
6960 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
6961 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
6962 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
6963 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
6964 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
6965 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
6966 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
6967 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
6969 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
6974 /* Note that by the ELF standard, the name field is already null byte
6975 terminated, and namesz includes the terminating null byte.
6976 I.E. the value of namesz for the name "FSF" is 4.
6978 If the value of namesz is zero, there is no name present. */
6980 process_note (pnote)
6981 Elf32_Internal_Note * pnote;
6983 printf (" %s\t\t0x%08lx\t%s\n",
6984 pnote->namesz ? pnote->namedata : "(NONE)",
6985 pnote->descsz, get_note_type (pnote->type));
6991 process_corefile_note_segment (file, offset, length)
6996 Elf_External_Note * pnotes;
6997 Elf_External_Note * external;
7003 GET_DATA_ALLOC (offset, length, pnotes, Elf_External_Note *, "notes");
7007 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
7008 (unsigned long) offset, (unsigned long) length);
7009 printf (_(" Owner\t\tData size\tDescription\n"));
7011 while (external < (Elf_External_Note *)((char *) pnotes + length))
7013 Elf32_Internal_Note inote;
7016 inote.type = BYTE_GET (external->type);
7017 inote.namesz = BYTE_GET (external->namesz);
7018 inote.namedata = external->name;
7019 inote.descsz = BYTE_GET (external->descsz);
7020 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
7021 inote.descpos = offset + (inote.descdata - (char *) pnotes);
7023 external = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
7025 /* Verify that name is null terminated. It appears that at least
7026 one version of Linux (RedHat 6.0) generates corefiles that don't
7027 comply with the ELF spec by failing to include the null byte in
7029 if (inote.namedata[inote.namesz] != '\0')
7031 temp = malloc (inote.namesz + 1);
7035 error (_("Out of memory\n"));
7040 strncpy (temp, inote.namedata, inote.namesz);
7041 temp[inote.namesz] = 0;
7043 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
7044 inote.namedata = temp;
7047 res &= process_note (& inote);
7062 process_corefile_note_segments (file)
7065 Elf_Internal_Phdr * program_headers;
7066 Elf_Internal_Phdr * segment;
7070 program_headers = (Elf_Internal_Phdr *) malloc
7071 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
7073 if (program_headers == NULL)
7075 error (_("Out of memory\n"));
7080 i = get_32bit_program_headers (file, program_headers);
7082 i = get_64bit_program_headers (file, program_headers);
7086 free (program_headers);
7090 for (i = 0, segment = program_headers;
7091 i < elf_header.e_phnum;
7094 if (segment->p_type == PT_NOTE)
7095 res &= process_corefile_note_segment (file,
7096 (bfd_vma) segment->p_offset,
7097 (bfd_vma) segment->p_filesz);
7100 free (program_headers);
7106 process_corefile_contents (file)
7109 /* If we have not been asked to display the notes then do nothing. */
7113 /* If file is not a core file then exit. */
7114 if (elf_header.e_type != ET_CORE)
7117 /* No program headers means no NOTE segment. */
7118 if (elf_header.e_phnum == 0)
7120 printf (_("No note segments present in the core file.\n"));
7124 return process_corefile_note_segments (file);
7128 process_arch_specific (file)
7134 switch (elf_header.e_machine)
7137 case EM_MIPS_RS4_BE:
7138 return process_mips_specific (file);
7147 get_file_header (file)
7150 /* Read in the identity array. */
7151 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
7154 /* Determine how to read the rest of the header. */
7155 switch (elf_header.e_ident [EI_DATA])
7157 default: /* fall through */
7158 case ELFDATANONE: /* fall through */
7159 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
7160 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
7163 /* For now we only support 32 bit and 64 bit ELF files. */
7164 is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
7166 /* Read in the rest of the header. */
7169 Elf32_External_Ehdr ehdr32;
7171 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
7174 elf_header.e_type = BYTE_GET (ehdr32.e_type);
7175 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
7176 elf_header.e_version = BYTE_GET (ehdr32.e_version);
7177 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
7178 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
7179 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
7180 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
7181 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
7182 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
7183 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
7184 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
7185 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
7186 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
7190 Elf64_External_Ehdr ehdr64;
7192 /* If we have been compiled with sizeof (bfd_vma) == 4, then
7193 we will not be able to cope with the 64bit data found in
7194 64 ELF files. Detect this now and abort before we start
7195 overwritting things. */
7196 if (sizeof (bfd_vma) < 8)
7198 error (_("This instance of readelf has been built without support for a\n"));
7199 error (_("64 bit data type and so it cannot read 64 bit ELF files.\n"));
7203 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
7206 elf_header.e_type = BYTE_GET (ehdr64.e_type);
7207 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
7208 elf_header.e_version = BYTE_GET (ehdr64.e_version);
7209 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
7210 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
7211 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
7212 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
7213 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
7214 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
7215 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
7216 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
7217 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
7218 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
7225 process_file (file_name)
7229 struct stat statbuf;
7232 if (stat (file_name, & statbuf) < 0)
7234 error (_("Cannot stat input file %s.\n"), file_name);
7238 file = fopen (file_name, "rb");
7241 error (_("Input file %s not found.\n"), file_name);
7245 if (! get_file_header (file))
7247 error (_("%s: Failed to read file header\n"), file_name);
7252 /* Initialise per file variables. */
7253 for (i = NUM_ELEM (version_info); i--;)
7254 version_info[i] = 0;
7256 for (i = NUM_ELEM (dynamic_info); i--;)
7257 dynamic_info[i] = 0;
7259 /* Process the file. */
7261 printf (_("\nFile: %s\n"), file_name);
7263 if (! process_file_header ())
7269 process_section_headers (file);
7271 process_program_headers (file);
7273 process_dynamic_segment (file);
7275 process_relocs (file);
7277 process_symbol_table (file);
7279 process_syminfo (file);
7281 process_version_sections (file);
7283 process_section_contents (file);
7285 process_corefile_contents (file);
7287 process_arch_specific (file);
7291 if (section_headers)
7293 free (section_headers);
7294 section_headers = NULL;
7299 free (string_table);
7300 string_table = NULL;
7303 if (dynamic_strings)
7305 free (dynamic_strings);
7306 dynamic_strings = NULL;
7309 if (dynamic_symbols)
7311 free (dynamic_symbols);
7312 dynamic_symbols = NULL;
7313 num_dynamic_syms = 0;
7316 if (dynamic_syminfo)
7318 free (dynamic_syminfo);
7319 dynamic_syminfo = NULL;
7323 #ifdef SUPPORT_DISASSEMBLY
7324 /* Needed by the i386 disassembler. For extra credit, someone could
7325 fix this so that we insert symbolic addresses here, esp for GOT/PLT
7329 print_address (unsigned int addr, FILE * outfile)
7331 fprintf (outfile,"0x%8.8x", addr);
7334 /* Needed by the i386 disassembler. */
7336 db_task_printsym (unsigned int addr)
7338 print_address (addr, stderr);
7347 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
7348 setlocale (LC_MESSAGES, "");
7350 bindtextdomain (PACKAGE, LOCALEDIR);
7351 textdomain (PACKAGE);
7353 parse_args (argc, argv);
7355 if (optind < (argc - 1))
7358 while (optind < argc)
7359 process_file (argv [optind ++]);
7361 if (dump_sects != NULL)