1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998, 1999 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
31 /* Define BFD64 here, even if our default architecture is 32 bit ELF
32 as this will allow us to read in and parse 64bit and 32bit ELF files.
33 Only do this if we belive that the compiler can support a 64 bit
34 data type. For now we only rely on GCC being able to do this. */
40 #include "elf/common.h"
41 #include "elf/external.h"
42 #include "elf/internal.h"
43 #include "elf/dwarf2.h"
45 /* The following headers use the elf/reloc-macros.h file to
46 automatically generate relocation recognition functions
47 such as elf_mips_reloc_type() */
49 #define RELOC_MACROS_GEN_FUNC
55 #include "elf/alpha.h"
58 #include "elf/sparc.h"
63 #include "elf/mn10200.h"
64 #include "elf/mn10300.h"
68 #include "elf/mcore.h"
75 #ifdef ANSI_PROTOTYPES
81 char * program_name = "readelf";
82 unsigned int dynamic_addr;
83 bfd_size_type dynamic_size;
84 unsigned int rela_addr;
85 unsigned int rela_size;
86 char * dynamic_strings;
88 unsigned long num_dynamic_syms;
89 Elf_Internal_Sym * dynamic_symbols;
90 Elf_Internal_Syminfo * dynamic_syminfo;
91 unsigned long dynamic_syminfo_offset;
92 unsigned int dynamic_syminfo_nent;
93 char program_interpreter [64];
94 int dynamic_info[DT_JMPREL + 1];
97 Elf_Internal_Ehdr elf_header;
98 Elf_Internal_Shdr * section_headers;
99 Elf_Internal_Dyn * dynamic_segment;
106 int do_using_dynamic;
113 int do_debug_abbrevs;
115 int do_debug_pubnames;
116 int do_debug_aranges;
121 /* A dynamic array of flags indicating which sections require dumping. */
122 char * dump_sects = NULL;
123 unsigned int num_dump_sects = 0;
125 #define HEX_DUMP (1 << 0)
126 #define DISASS_DUMP (1 << 1)
127 #define DEBUG_DUMP (1 << 2)
129 /* Forward declarations for dumb compilers. */
130 static bfd_vma (* byte_get) PARAMS ((unsigned char *, int));
131 static bfd_vma byte_get_little_endian PARAMS ((unsigned char *, int));
132 static bfd_vma byte_get_big_endian PARAMS ((unsigned char *, int));
133 static const char * get_mips_dynamic_type PARAMS ((unsigned long));
134 static const char * get_sparc64_dynamic_type PARAMS ((unsigned long));
135 static const char * get_parisc_dynamic_type PARAMS ((unsigned long));
136 static const char * get_dynamic_type PARAMS ((unsigned long));
137 static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
138 static char * get_file_type PARAMS ((unsigned));
139 static char * get_machine_name PARAMS ((unsigned));
140 static char * get_machine_flags PARAMS ((unsigned, unsigned));
141 static const char * get_mips_segment_type PARAMS ((unsigned long));
142 static const char * get_parisc_segment_type PARAMS ((unsigned long));
143 static const char * get_segment_type PARAMS ((unsigned long));
144 static const char * get_mips_section_type_name PARAMS ((unsigned int));
145 static const char * get_parisc_section_type_name PARAMS ((unsigned int));
146 static const char * get_section_type_name PARAMS ((unsigned int));
147 static char * get_symbol_binding PARAMS ((unsigned int));
148 static char * get_symbol_type PARAMS ((unsigned int));
149 static void usage PARAMS ((void));
150 static void parse_args PARAMS ((int, char **));
151 static int process_file_header PARAMS ((void));
152 static int process_program_headers PARAMS ((FILE *));
153 static int process_section_headers PARAMS ((FILE *));
154 static void dynamic_segment_mips_val PARAMS ((Elf_Internal_Dyn *));
155 static void dynamic_segment_parisc_val PARAMS ((Elf_Internal_Dyn *));
156 static int process_dynamic_segment PARAMS ((FILE *));
157 static int process_symbol_table PARAMS ((FILE *));
158 static int process_section_contents PARAMS ((FILE *));
159 static void process_file PARAMS ((char *));
160 static int process_relocs PARAMS ((FILE *));
161 static int process_version_sections PARAMS ((FILE *));
162 static char * get_ver_flags PARAMS ((unsigned int));
163 static char * get_symbol_index_type PARAMS ((unsigned int));
164 static int get_32bit_section_headers PARAMS ((FILE *));
165 static int get_64bit_section_headers PARAMS ((FILE *));
166 static int get_32bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
167 static int get_64bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
168 static int get_file_header PARAMS ((FILE *));
169 static Elf_Internal_Sym * get_32bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
170 static Elf_Internal_Sym * get_64bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
171 static int * get_dynamic_data PARAMS ((FILE *, unsigned int));
172 static int get_32bit_dynamic_segment PARAMS ((FILE *));
173 static int get_64bit_dynamic_segment PARAMS ((FILE *));
174 #ifdef SUPPORT_DISASSEMBLY
175 static int disassemble_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
177 static int dump_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
178 static int display_debug_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
179 static int display_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
180 static int display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
181 static int display_debug_lines PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
182 static int display_debug_abbrev PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
183 static int display_debug_aranges PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
184 static unsigned char * process_abbrev_section PARAMS ((unsigned char *, unsigned char *));
185 static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int));
186 static int process_extended_line_op PARAMS ((unsigned char *, int, int));
187 static void reset_state_machine PARAMS ((int));
188 static char * get_TAG_name PARAMS ((unsigned long));
189 static char * get_AT_name PARAMS ((unsigned long));
190 static char * get_FORM_name PARAMS ((unsigned long));
191 static void free_abbrevs PARAMS ((void));
192 static void add_abbrev PARAMS ((unsigned long, unsigned long, int));
193 static void add_abbrev_attr PARAMS ((unsigned long, unsigned long));
194 static unsigned char * read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long));
195 static unsigned char * display_block PARAMS ((unsigned char *, unsigned long));
196 static void decode_location_expression PARAMS ((unsigned char *, unsigned int));
197 static void request_dump PARAMS ((unsigned int, char));
198 static const char * get_elf_class PARAMS ((unsigned char));
199 static const char * get_data_encoding PARAMS ((unsigned char));
200 static const char * get_osabi_name PARAMS ((unsigned char));
201 static int guess_is_rela PARAMS ((unsigned long));
202 static char * get_note_type PARAMS ((unsigned int));
203 static int process_note PARAMS ((Elf32_Internal_Note *));
204 static int process_corefile_note_segment PARAMS ((FILE *, bfd_vma, bfd_vma));
205 static int process_corefile_note_segments PARAMS ((FILE *));
206 static int process_corefile_contents PARAMS ((FILE *));
208 typedef int Elf32_Word;
216 #define SECTION_NAME(X) (string_table + (X)->sh_name)
218 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
220 #define BYTE_GET(field) byte_get (field, sizeof (field))
222 /* If we can support a 64 bit data type then BFD64 should be defined
223 and sizeof (bfd_vma) == 8. In this case when translating from an
224 external 8 byte field to an internal field, we can assume that the
225 internal field is also 8 bytes wide and so we can extact all the data.
226 If, however, BFD64 is not defined, then we must assume that the
227 internal data structure only has 4 byte wide fields that are the
228 equivalent of the 8 byte wide external counterparts, and so we must
229 truncate the data. */
231 #define BYTE_GET8(field) byte_get (field, -8)
233 #define BYTE_GET8(field) byte_get (field, 8)
236 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
238 #define GET_DATA_ALLOC(offset, size, var, type, reason) \
239 if (fseek (file, offset, SEEK_SET)) \
241 error (_("Unable to seek to start of %s at %x\n"), reason, offset); \
245 var = (type) malloc (size); \
249 error (_("Out of memory allocating %d bytes for %s\n"), size, reason); \
253 if (fread (var, size, 1, file) != 1) \
255 error (_("Unable to read in %d bytes of %s\n"), size, reason); \
262 #define GET_DATA(offset, var, reason) \
263 if (fseek (file, offset, SEEK_SET)) \
265 error (_("Unable to seek to %x for %s\n"), offset, reason); \
268 else if (fread (& var, sizeof (var), 1, file) != 1) \
270 error (_("Unable to read data at %x for %s\n"), offset, reason); \
274 #define GET_ELF_SYMBOLS(file, offset, size) \
275 (is_32bit_elf ? get_32bit_elf_symbols (file, offset, size) \
276 : get_64bit_elf_symbols (file, offset, size))
279 #ifdef ANSI_PROTOTYPES
281 error (const char * message, ...)
285 fprintf (stderr, _("%s: Error: "), program_name);
286 va_start (args, message);
287 vfprintf (stderr, message, args);
293 warn (const char * message, ...)
297 fprintf (stderr, _("%s: Warning: "), program_name);
298 va_start (args, message);
299 vfprintf (stderr, message, args);
311 fprintf (stderr, _("%s: Error: "), program_name);
313 message = va_arg (args, char *);
314 vfprintf (stderr, message, args);
326 fprintf (stderr, _("%s: Warning: "), program_name);
328 message = va_arg (args, char *);
329 vfprintf (stderr, message, args);
336 byte_get_little_endian (field, size)
337 unsigned char * field;
346 return ((unsigned int) (field [0]))
347 | (((unsigned int) (field [1])) << 8);
350 /* We want to extract data from an 8 byte wide field and
351 place it into a 4 byte wide field. Since this is a little
352 endian source we can juts use the 4 byte extraction code. */
355 return ((unsigned long) (field [0]))
356 | (((unsigned long) (field [1])) << 8)
357 | (((unsigned long) (field [2])) << 16)
358 | (((unsigned long) (field [3])) << 24);
362 /* This is a special case, generated by the BYTE_GET8 macro.
363 It means that we are loading an 8 byte value from a field
364 in an external structure into an 8 byte value in a field
365 in an internal strcuture. */
366 return ((bfd_vma) (field [0]))
367 | (((bfd_vma) (field [1])) << 8)
368 | (((bfd_vma) (field [2])) << 16)
369 | (((bfd_vma) (field [3])) << 24)
370 | (((bfd_vma) (field [4])) << 32)
371 | (((bfd_vma) (field [5])) << 40)
372 | (((bfd_vma) (field [6])) << 48)
373 | (((bfd_vma) (field [7])) << 56);
376 error (_("Unhandled data length: %d\n"), size);
381 /* Print a VMA value. */
382 typedef enum print_mode
394 static void print_vma PARAMS ((bfd_vma, print_mode));
397 print_vma (vma, mode)
407 case FULL_HEX: printf ("0x"); /* drop through */
408 case LONG_HEX: printf ("%08.8lx", vma); break;
409 case PREFIX_HEX: printf ("0x"); /* drop through */
410 case HEX: printf ("%lx", vma); break;
411 case DEC: printf ("%ld", vma); break;
412 case DEC_5: printf ("%5ld", vma); break;
413 case UNSIGNED: printf ("%lu", 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_int64_high (vma))
447 printf ("++%ld", _bfd_int64_low (vma));
449 printf ("%ld", _bfd_int64_low (vma));
453 if (_bfd_int64_high (vma))
455 printf ("++%ld", _bfd_int64_low (vma));
457 printf ("%5ld", _bfd_int64_low (vma));
461 if (_bfd_int64_high (vma))
463 printf ("++%lu", _bfd_int64_low (vma));
465 printf ("%lu", _bfd_int64_low (vma));
473 byte_get_big_endian (field, size)
474 unsigned char * field;
483 return ((unsigned int) (field [1])) | (((int) (field [0])) << 8);
486 return ((unsigned long) (field [3]))
487 | (((unsigned long) (field [2])) << 8)
488 | (((unsigned long) (field [1])) << 16)
489 | (((unsigned long) (field [0])) << 24);
492 /* Although we are extracing data from an 8 byte wide field, we
493 are returning only 4 bytes of data. */
494 return ((unsigned long) (field [7]))
495 | (((unsigned long) (field [6])) << 8)
496 | (((unsigned long) (field [5])) << 16)
497 | (((unsigned long) (field [4])) << 24);
501 /* This is a special case, generated by the BYTE_GET8 macro.
502 It means that we are loading an 8 byte value from a field
503 in an external structure into an 8 byte value in a field
504 in an internal strcuture. */
505 return ((bfd_vma) (field [7]))
506 | (((bfd_vma) (field [6])) << 8)
507 | (((bfd_vma) (field [5])) << 16)
508 | (((bfd_vma) (field [4])) << 24)
509 | (((bfd_vma) (field [3])) << 32)
510 | (((bfd_vma) (field [2])) << 40)
511 | (((bfd_vma) (field [1])) << 48)
512 | (((bfd_vma) (field [0])) << 56);
516 error (_("Unhandled data length: %d\n"), size);
522 /* Guess the relocation sized based on the sized commonly used by the specific machine. */
524 guess_is_rela (e_machine)
525 unsigned long e_machine;
529 /* Targets that use REL relocations. */
540 /* Targets that use RELA relocations. */
548 case EM_CYGNUS_MN10200:
549 case EM_CYGNUS_MN10300:
557 warn (_("Don't know about relocations on this machine architecture\n"));
562 /* Display the contents of the relocation data found at the specified offset. */
564 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
566 unsigned long rel_offset;
567 unsigned long rel_size;
568 Elf_Internal_Sym * symtab;
574 Elf_Internal_Rel * rels;
575 Elf_Internal_Rela * relas;
578 if (is_rela == UNKNOWN)
579 is_rela = guess_is_rela (elf_header.e_machine);
585 Elf32_External_Rela * erelas;
587 GET_DATA_ALLOC (rel_offset, rel_size, erelas,
588 Elf32_External_Rela *, "relocs");
590 rel_size = rel_size / sizeof (Elf32_External_Rela);
592 relas = (Elf_Internal_Rela *)
593 malloc (rel_size * sizeof (Elf_Internal_Rela));
597 error(_("out of memory parsing relocs"));
601 for (i = 0; i < rel_size; i++)
603 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
604 relas[i].r_info = BYTE_GET (erelas[i].r_info);
605 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
610 rels = (Elf_Internal_Rel *) relas;
614 Elf64_External_Rela * erelas;
616 GET_DATA_ALLOC (rel_offset, rel_size, erelas,
617 Elf64_External_Rela *, "relocs");
619 rel_size = rel_size / sizeof (Elf64_External_Rela);
621 relas = (Elf_Internal_Rela *)
622 malloc (rel_size * sizeof (Elf_Internal_Rela));
626 error(_("out of memory parsing relocs"));
630 for (i = 0; i < rel_size; i++)
632 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
633 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
634 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
639 rels = (Elf_Internal_Rel *) relas;
646 Elf32_External_Rel * erels;
648 GET_DATA_ALLOC (rel_offset, rel_size, erels,
649 Elf32_External_Rel *, "relocs");
651 rel_size = rel_size / sizeof (Elf32_External_Rel);
653 rels = (Elf_Internal_Rel *)
654 malloc (rel_size * sizeof (Elf_Internal_Rel));
658 error(_("out of memory parsing relocs"));
662 for (i = 0; i < rel_size; i++)
664 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
665 rels[i].r_info = BYTE_GET (erels[i].r_info);
670 relas = (Elf_Internal_Rela *) rels;
674 Elf64_External_Rel * erels;
676 GET_DATA_ALLOC (rel_offset, rel_size, erels,
677 Elf64_External_Rel *, "relocs");
679 rel_size = rel_size / sizeof (Elf64_External_Rel);
681 rels = (Elf_Internal_Rel *)
682 malloc (rel_size * sizeof (Elf_Internal_Rel));
686 error(_("out of memory parsing relocs"));
690 for (i = 0; i < rel_size; i++)
692 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
693 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
698 relas = (Elf_Internal_Rela *) rels;
704 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
707 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
709 for (i = 0; i < rel_size; i++)
714 bfd_vma symtab_index;
719 offset = relas [i].r_offset;
720 info = relas [i].r_info;
724 offset = rels [i].r_offset;
725 info = rels [i].r_info;
730 type = ELF32_R_TYPE (info);
731 symtab_index = ELF32_R_SYM (info);
735 if (elf_header.e_machine == EM_SPARCV9)
736 type = ELF64_R_TYPE_ID (info);
738 type = ELF64_R_TYPE (info);
739 /* The #ifdef BFD64 below is to prevent a compile time warning.
740 We know that if we do not have a 64 bit data type that we
741 will never execute this code anyway. */
743 symtab_index = ELF64_R_SYM (info);
747 #ifdef _bfd_int64_low
748 printf (" %8.8lx %5.5lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
750 printf (" %8.8lx %5.5lx ", offset, info);
753 switch (elf_header.e_machine)
760 rtype = elf_m32r_reloc_type (type);
765 rtype = elf_i386_reloc_type (type);
769 rtype = elf_m68k_reloc_type (type);
773 rtype = elf_i960_reloc_type (type);
780 rtype = elf_sparc_reloc_type (type);
784 rtype = v850_reloc_type (type);
788 rtype = elf_d10v_reloc_type (type);
792 rtype = elf_d30v_reloc_type (type);
796 rtype = elf_sh_reloc_type (type);
799 case EM_CYGNUS_MN10300:
800 rtype = elf_mn10300_reloc_type (type);
803 case EM_CYGNUS_MN10200:
804 rtype = elf_mn10200_reloc_type (type);
808 rtype = elf_fr30_reloc_type (type);
812 rtype = elf_mcore_reloc_type (type);
816 rtype = elf_ppc_reloc_type (type);
821 rtype = elf_mips_reloc_type (type);
825 rtype = elf_alpha_reloc_type (type);
829 rtype = elf_arm_reloc_type (type);
833 rtype = elf_arc_reloc_type (type);
837 rtype = elf_hppa_reloc_type (type);
841 rtype = elf_pj_reloc_type (type);
846 #ifdef _bfd_int64_low
847 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type));
849 printf (_("unrecognised: %-7lx"), type);
852 printf ("%-21.21s", rtype);
858 if (symtab_index >= nsyms)
859 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
862 Elf_Internal_Sym * psym;
864 psym = symtab + symtab_index;
867 print_vma (psym->st_value, LONG_HEX);
870 if (psym->st_name == 0)
872 SECTION_NAME (section_headers + psym->st_shndx));
873 else if (strtab == NULL)
874 printf (_("<string table index %3ld>"), psym->st_name);
876 printf ("%-25.25s", strtab + psym->st_name);
879 printf (" + %lx", (unsigned long) relas [i].r_addend);
885 printf ("%*c", is_32bit_elf ? 34 : 26, ' ');
886 print_vma (relas[i].r_addend, LONG_HEX);
889 if (elf_header.e_machine == EM_SPARCV9
890 && !strcmp (rtype, "R_SPARC_OLO10"))
891 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
902 get_mips_dynamic_type (type)
907 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
908 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
909 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
910 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
911 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
912 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
913 case DT_MIPS_MSYM: return "MIPS_MSYM";
914 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
915 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
916 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
917 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
918 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
919 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
920 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
921 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
922 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
923 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
924 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
925 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
926 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
927 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
928 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
929 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
930 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
931 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
932 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
933 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
934 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
935 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
936 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
937 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
938 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
939 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
940 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
941 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
942 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
943 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
944 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
945 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
946 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
947 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
948 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
949 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
956 get_sparc64_dynamic_type (type)
961 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
968 get_parisc_dynamic_type (type)
973 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
974 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
975 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
976 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
977 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
978 case DT_HP_PREINIT: return "HP_PREINIT";
979 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
980 case DT_HP_NEEDED: return "HP_NEEDED";
981 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
982 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
983 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
984 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
985 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
992 get_dynamic_type (type)
995 static char buff [32];
999 case DT_NULL: return "NULL";
1000 case DT_NEEDED: return "NEEDED";
1001 case DT_PLTRELSZ: return "PLTRELSZ";
1002 case DT_PLTGOT: return "PLTGOT";
1003 case DT_HASH: return "HASH";
1004 case DT_STRTAB: return "STRTAB";
1005 case DT_SYMTAB: return "SYMTAB";
1006 case DT_RELA: return "RELA";
1007 case DT_RELASZ: return "RELASZ";
1008 case DT_RELAENT: return "RELAENT";
1009 case DT_STRSZ: return "STRSZ";
1010 case DT_SYMENT: return "SYMENT";
1011 case DT_INIT: return "INIT";
1012 case DT_FINI: return "FINI";
1013 case DT_SONAME: return "SONAME";
1014 case DT_RPATH: return "RPATH";
1015 case DT_SYMBOLIC: return "SYMBOLIC";
1016 case DT_REL: return "REL";
1017 case DT_RELSZ: return "RELSZ";
1018 case DT_RELENT: return "RELENT";
1019 case DT_PLTREL: return "PLTREL";
1020 case DT_DEBUG: return "DEBUG";
1021 case DT_TEXTREL: return "TEXTREL";
1022 case DT_JMPREL: return "JMPREL";
1023 case DT_BIND_NOW: return "BIND_NOW";
1024 case DT_INIT_ARRAY: return "INIT_ARRAY";
1025 case DT_FINI_ARRAY: return "FINI_ARRAY";
1026 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1027 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1029 case DT_PLTPADSZ: return "PLTPADSZ";
1030 case DT_MOVEENT: return "MOVEENT";
1031 case DT_MOVESZ: return "MOVESZ";
1032 case DT_FEATURE_1: return "FEATURE_1";
1033 case DT_POSFLAG_1: return "POSFLAG_1";
1034 case DT_SYMINSZ: return "SYMINSZ";
1035 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1037 case DT_ADDRRNGLO: return "ADDRRNGLO";
1038 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1040 case DT_VERSYM: return "VERSYM";
1042 case DT_RELACOUNT: return "RELACOUNT";
1043 case DT_RELCOUNT: return "RELCOUNT";
1044 case DT_FLAGS_1: return "FLAGS_1";
1045 case DT_VERDEF: return "VERDEF";
1046 case DT_VERDEFNUM: return "VERDEFNUM";
1047 case DT_VERNEED: return "VERNEED";
1048 case DT_VERNEEDNUM: return "VERNEEDNUM";
1050 case DT_AUXILIARY: return "AUXILARY";
1051 case DT_USED: return "USED";
1052 case DT_FILTER: return "FILTER";
1055 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1057 const char * result;
1059 switch (elf_header.e_machine)
1062 case EM_MIPS_RS4_BE:
1063 result = get_mips_dynamic_type (type);
1066 result = get_sparc64_dynamic_type (type);
1076 sprintf (buff, _("Processor Specific: %lx"), type);
1078 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1080 const char * result;
1082 switch (elf_header.e_machine)
1085 result = get_parisc_dynamic_type (type);
1095 sprintf (buff, _("Operating System specific: %lx"), type);
1098 sprintf (buff, _("<unknown>: %lx"), type);
1105 get_file_type (e_type)
1108 static char buff [32];
1112 case ET_NONE: return _("NONE (None)");
1113 case ET_REL: return _("REL (Relocatable file)");
1114 case ET_EXEC: return _("EXEC (Executable file)");
1115 case ET_DYN: return _("DYN (Shared object file)");
1116 case ET_CORE: return _("CORE (Core file)");
1119 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1120 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1121 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1122 sprintf (buff, _("OS Specific: (%x)"), e_type);
1124 sprintf (buff, _("<unknown>: %x"), e_type);
1130 get_machine_name (e_machine)
1133 static char buff [32];
1137 case EM_NONE: return _("None");
1138 case EM_M32: return "WE32100";
1139 case EM_SPARC: return "Sparc";
1140 case EM_386: return "Intel 80386";
1141 case EM_68K: return "MC68000";
1142 case EM_88K: return "MC88000";
1143 case EM_486: return "Intel 80486";
1144 case EM_860: return "Intel 80860";
1145 case EM_MIPS: return "MIPS R3000 big-endian";
1146 case EM_S370: return "Amdahl";
1147 case EM_MIPS_RS4_BE: return "MIPS R4000 big-endian";
1148 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1149 case EM_PARISC: return "HPPA";
1150 case EM_PPC_OLD: return "Power PC (old)";
1151 case EM_SPARC32PLUS: return "Sparc v8+" ;
1152 case EM_960: return "Intel 90860";
1153 case EM_PPC: return "PowerPC";
1154 case EM_V800: return "NEC V800";
1155 case EM_FR20: return "Fujitsu FR20";
1156 case EM_RH32: return "TRW RH32";
1157 case EM_MCORE: return "MCORE";
1158 case EM_ARM: return "ARM";
1159 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1160 case EM_SH: return "Hitachi SH";
1161 case EM_SPARCV9: return "Sparc v9";
1162 case EM_TRICORE: return "Siemens Tricore";
1163 case EM_ARC: return "Argonaut RISC Core";
1164 case EM_H8_300: return "Hitachi H8/300";
1165 case EM_H8_300H: return "Hitachi H8/300H";
1166 case EM_H8S: return "Hitachi H8S";
1167 case EM_H8_500: return "Hitachi H8/500";
1168 case EM_IA_64: return "Intel Merced";
1169 case EM_MIPS_X: return "Stanford MIPS-X";
1170 case EM_COLDFIRE: return "Motorola Coldfire";
1171 case EM_68HC12: return "Motorola M68HC12";
1172 case EM_ALPHA: return "Alpha";
1173 case EM_CYGNUS_D10V: return "d10v";
1174 case EM_CYGNUS_D30V: return "d30v";
1175 case EM_CYGNUS_ARC: return "Arc";
1176 case EM_CYGNUS_M32R: return "Mitsubishi M32r";
1177 case EM_CYGNUS_V850: return "NEC v850";
1178 case EM_CYGNUS_MN10300: return "mn10300";
1179 case EM_CYGNUS_MN10200: return "mn10200";
1180 case EM_CYGNUS_FR30: return "Fujitsu FR30";
1181 case EM_PJ: return "picoJava";
1183 sprintf (buff, _("<unknown>: %x"), e_machine);
1189 get_machine_flags (e_flags, e_machine)
1193 static char buf [1024];
1204 if (e_flags & EF_CPU32)
1205 strcat (buf, ", cpu32");
1209 if (e_flags & EF_PPC_EMB)
1210 strcat (buf, ", emb");
1212 if (e_flags & EF_PPC_RELOCATABLE)
1213 strcat (buf, ", relocatable");
1215 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1216 strcat (buf, ", relocatable-lib");
1219 case EM_CYGNUS_V850:
1220 switch (e_flags & EF_V850_ARCH)
1223 strcat (buf, ", v850e");
1226 strcat (buf, ", v850ea");
1229 strcat (buf, ", v850");
1232 strcat (buf, ", unknown v850 architecture variant");
1237 case EM_CYGNUS_M32R:
1238 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1239 strcat (buf, ", m32r");
1244 case EM_MIPS_RS4_BE:
1245 if (e_flags & EF_MIPS_NOREORDER)
1246 strcat (buf, ", noreorder");
1248 if (e_flags & EF_MIPS_PIC)
1249 strcat (buf, ", pic");
1251 if (e_flags & EF_MIPS_CPIC)
1252 strcat (buf, ", cpic");
1254 if (e_flags & EF_MIPS_ABI2)
1255 strcat (buf, ", abi2");
1257 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
1258 strcat (buf, ", mips1");
1260 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
1261 strcat (buf, ", mips2");
1263 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
1264 strcat (buf, ", mips3");
1266 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
1267 strcat (buf, ", mips4");
1271 if (e_flags & EF_SPARC_32PLUS)
1272 strcat (buf, ", v8+");
1274 if (e_flags & EF_SPARC_SUN_US1)
1275 strcat (buf, ", ultrasparcI");
1277 if (e_flags & EF_SPARC_SUN_US3)
1278 strcat (buf, ", ultrasparcIII");
1280 if (e_flags & EF_SPARC_HAL_R1)
1281 strcat (buf, ", halr1");
1283 if (e_flags & EF_SPARC_LEDATA)
1284 strcat (buf, ", ledata");
1286 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
1287 strcat (buf, ", tso");
1289 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
1290 strcat (buf, ", pso");
1292 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
1293 strcat (buf, ", rmo");
1297 switch (e_flags & EF_PARISC_ARCH)
1299 case EFA_PARISC_1_0:
1300 strcpy (buf, ", PA-RISC 1.0");
1302 case EFA_PARISC_1_1:
1303 strcpy (buf, ", PA-RISC 1.1");
1305 case EFA_PARISC_2_0:
1306 strcpy (buf, ", PA-RISC 2.0");
1311 if (e_flags & EF_PARISC_TRAPNIL)
1312 strcat (buf, ", trapnil");
1313 if (e_flags & EF_PARISC_EXT)
1314 strcat (buf, ", ext");
1315 if (e_flags & EF_PARISC_LSB)
1316 strcat (buf, ", lsb");
1317 if (e_flags & EF_PARISC_WIDE)
1318 strcat (buf, ", wide");
1319 if (e_flags & EF_PARISC_NO_KABP)
1320 strcat (buf, ", no kabp");
1321 if (e_flags & EF_PARISC_LAZYSWAP)
1322 strcat (buf, ", lazyswap");
1325 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
1326 strcat (buf, ", new calling convention");
1328 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
1329 strcat (buf, ", gnu calling convention");
1338 get_mips_segment_type (type)
1343 case PT_MIPS_REGINFO:
1345 case PT_MIPS_RTPROC:
1347 case PT_MIPS_OPTIONS:
1357 get_parisc_segment_type (type)
1362 case PT_HP_TLS: return "HP_TLS";
1363 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
1364 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
1365 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
1366 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
1367 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
1368 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
1369 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
1370 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
1371 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
1372 case PT_HP_PARALLEL: return "HP_PARALLEL";
1373 case PT_HP_FASTBIND: return "HP_FASTBIND";
1374 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
1375 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
1384 get_segment_type (p_type)
1385 unsigned long p_type;
1387 static char buff [32];
1391 case PT_NULL: return "NULL";
1392 case PT_LOAD: return "LOAD";
1393 case PT_DYNAMIC: return "DYNAMIC";
1394 case PT_INTERP: return "INTERP";
1395 case PT_NOTE: return "NOTE";
1396 case PT_SHLIB: return "SHLIB";
1397 case PT_PHDR: return "PHDR";
1400 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
1402 const char * result;
1404 switch (elf_header.e_machine)
1407 case EM_MIPS_RS4_BE:
1408 result = get_mips_segment_type (p_type);
1411 result = get_parisc_segment_type (p_type);
1421 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
1423 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
1425 const char * result;
1427 switch (elf_header.e_machine)
1430 result = get_parisc_segment_type (p_type);
1440 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
1443 sprintf (buff, _("<unknown>: %lx"), p_type);
1450 get_mips_section_type_name (sh_type)
1451 unsigned int sh_type;
1455 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1456 case SHT_MIPS_MSYM: return "MIPS_MSYM";
1457 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1458 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
1459 case SHT_MIPS_UCODE: return "MIPS_UCODE";
1460 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
1461 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
1462 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
1463 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
1464 case SHT_MIPS_RELD: return "MIPS_RELD";
1465 case SHT_MIPS_IFACE: return "MIPS_IFACE";
1466 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
1467 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1468 case SHT_MIPS_SHDR: return "MIPS_SHDR";
1469 case SHT_MIPS_FDESC: return "MIPS_FDESC";
1470 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
1471 case SHT_MIPS_DENSE: return "MIPS_DENSE";
1472 case SHT_MIPS_PDESC: return "MIPS_PDESC";
1473 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
1474 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
1475 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
1476 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
1477 case SHT_MIPS_LINE: return "MIPS_LINE";
1478 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
1479 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
1480 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
1481 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
1482 case SHT_MIPS_DWARF: return "MIPS_DWARF";
1483 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
1484 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1485 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
1486 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
1487 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
1488 case SHT_MIPS_XLATE: return "MIPS_XLATE";
1489 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
1490 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
1491 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
1492 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
1493 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
1501 get_parisc_section_type_name (sh_type)
1502 unsigned int sh_type;
1506 case SHT_PARISC_EXT: return "PARISC_EXT";
1507 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
1508 case SHT_PARISC_DOC: return "PARISC_DOC";
1516 get_section_type_name (sh_type)
1517 unsigned int sh_type;
1519 static char buff [32];
1523 case SHT_NULL: return "NULL";
1524 case SHT_PROGBITS: return "PROGBITS";
1525 case SHT_SYMTAB: return "SYMTAB";
1526 case SHT_STRTAB: return "STRTAB";
1527 case SHT_RELA: return "RELA";
1528 case SHT_HASH: return "HASH";
1529 case SHT_DYNAMIC: return "DYNAMIC";
1530 case SHT_NOTE: return "NOTE";
1531 case SHT_NOBITS: return "NOBITS";
1532 case SHT_REL: return "REL";
1533 case SHT_SHLIB: return "SHLIB";
1534 case SHT_DYNSYM: return "DYNSYM";
1535 case SHT_GNU_verdef: return "VERDEF";
1536 case SHT_GNU_verneed: return "VERNEED";
1537 case SHT_GNU_versym: return "VERSYM";
1538 case 0x6ffffff0: return "VERSYM";
1539 case 0x6ffffffc: return "VERDEF";
1540 case 0x7ffffffd: return "AUXILIARY";
1541 case 0x7fffffff: return "FILTER";
1544 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
1546 const char * result;
1548 switch (elf_header.e_machine)
1551 case EM_MIPS_RS4_BE:
1552 result = get_mips_section_type_name (sh_type);
1555 result = get_parisc_section_type_name (sh_type);
1565 sprintf (buff, "SHT_LOPROC+%x", sh_type - SHT_LOPROC);
1567 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
1568 sprintf (buff, "SHT_LOOS+%x", sh_type - SHT_LOOS);
1569 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
1570 sprintf (buff, "SHT_LOUSER+%x", sh_type - SHT_LOUSER);
1572 sprintf (buff, _("<unknown>: %x"), sh_type);
1578 struct option options [] =
1580 {"all", no_argument, 0, 'a'},
1581 {"file-header", no_argument, 0, 'h'},
1582 {"program-headers", no_argument, 0, 'l'},
1583 {"headers", no_argument, 0, 'e'},
1584 {"histogram", no_argument, 0, 'I'},
1585 {"segments", no_argument, 0, 'l'},
1586 {"sections", no_argument, 0, 'S'},
1587 {"section-headers", no_argument, 0, 'S'},
1588 {"symbols", no_argument, 0, 's'},
1589 {"syms", no_argument, 0, 's'},
1590 {"relocs", no_argument, 0, 'r'},
1591 {"notes", no_argument, 0, 'n'},
1592 {"dynamic", no_argument, 0, 'd'},
1593 {"arch-specific", no_argument, 0, 'A'},
1594 {"version-info", no_argument, 0, 'V'},
1595 {"use-dynamic", no_argument, 0, 'D'},
1596 {"hex-dump", required_argument, 0, 'x'},
1597 {"debug-dump", optional_argument, 0, 'w'},
1598 #ifdef SUPPORT_DISASSEMBLY
1599 {"instruction-dump", required_argument, 0, 'i'},
1602 {"version", no_argument, 0, 'v'},
1603 {"help", no_argument, 0, 'H'},
1604 {0, no_argument, 0, 0}
1610 fprintf (stdout, _("Usage: readelf {options} elf-file(s)\n"));
1611 fprintf (stdout, _(" Options are:\n"));
1612 fprintf (stdout, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
1613 fprintf (stdout, _(" -h or --file-header Display the ELF file header\n"));
1614 fprintf (stdout, _(" -l or --program-headers or --segments\n"));
1615 fprintf (stdout, _(" Display the program headers\n"));
1616 fprintf (stdout, _(" -S or --section-headers or --sections\n"));
1617 fprintf (stdout, _(" Display the sections' header\n"));
1618 fprintf (stdout, _(" -e or --headers Equivalent to: -h -l -S\n"));
1619 fprintf (stdout, _(" -s or --syms or --symbols Display the symbol table\n"));
1620 fprintf (stdout, _(" -n or --notes Display the core notes (if present)\n"));
1621 fprintf (stdout, _(" -r or --relocs Display the relocations (if present)\n"));
1622 fprintf (stdout, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
1623 fprintf (stdout, _(" -V or --version-info Display the version sections (if present)\n"));
1624 fprintf (stdout, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
1625 fprintf (stdout, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
1626 fprintf (stdout, _(" -x <number> or --hex-dump=<number>\n"));
1627 fprintf (stdout, _(" Dump the contents of section <number>\n"));
1628 fprintf (stdout, _(" -w[liapr] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges]\n"));
1629 fprintf (stdout, _(" Display the contents of DWARF2 debug sections\n"));
1630 #ifdef SUPPORT_DISASSEMBLY
1631 fprintf (stdout, _(" -i <number> or --instruction-dump=<number>\n"));
1632 fprintf (stdout, _(" Disassemble the contents of section <number>\n"));
1634 fprintf (stdout, _(" -I or --histogram Display histogram of bucket list lengths\n"));
1635 fprintf (stdout, _(" -v or --version Display the version number of readelf\n"));
1636 fprintf (stdout, _(" -H or --help Display this information\n"));
1637 fprintf (stdout, _("Report bugs to bug-gnu-utils@gnu.org\n"));
1643 request_dump (section, type)
1644 unsigned int section;
1647 if (section >= num_dump_sects)
1649 char * new_dump_sects;
1651 new_dump_sects = (char *) calloc (section + 1, 1);
1653 if (new_dump_sects == NULL)
1654 error (_("Out of memory allocating dump request table."));
1657 /* Copy current flag settings. */
1658 memcpy (new_dump_sects, dump_sects, num_dump_sects);
1662 dump_sects = new_dump_sects;
1663 num_dump_sects = section + 1;
1668 dump_sects [section] |= type;
1674 parse_args (argc, argv)
1683 while ((c = getopt_long
1684 (argc, argv, "ersahnldSDAIw::x:i:vV", options, NULL)) != EOF)
1719 do_using_dynamic ++;
1747 section = strtoul (optarg, & cp, 0);
1748 if (! * cp && section >= 0)
1750 request_dump (section, HEX_DUMP);
1770 do_debug_abbrevs = 1;
1780 do_debug_pubnames = 1;
1785 do_debug_aranges = 1;
1789 warn (_("Unrecognised debug option '%s'\n"), optarg);
1794 #ifdef SUPPORT_DISASSEMBLY
1797 section = strtoul (optarg, & cp, 0);
1798 if (! * cp && section >= 0)
1800 request_dump (section, DISASS_DUMP);
1806 print_version (program_name);
1813 /* xgettext:c-format */
1814 error (_("Invalid option '-%c'\n"), c);
1821 if (!do_dynamic && !do_syms && !do_reloc && !do_sections
1822 && !do_segments && !do_header && !do_dump && !do_version
1823 && !do_histogram && !do_debugging && !do_arch && !do_notes)
1827 warn (_("Nothing to do.\n"));
1833 get_elf_class (elf_class)
1834 unsigned char elf_class;
1836 static char buff [32];
1840 case ELFCLASSNONE: return _("none");
1841 case ELFCLASS32: return _("ELF32");
1842 case ELFCLASS64: return _("ELF64");
1844 sprintf (buff, _("<unknown: %x>"), elf_class);
1850 get_data_encoding (encoding)
1851 unsigned char encoding;
1853 static char buff [32];
1857 case ELFDATANONE: return _("none");
1858 case ELFDATA2LSB: return _("2's complement, little endian");
1859 case ELFDATA2MSB: return _("2's complement, big endian");
1861 sprintf (buff, _("<unknown: %x>"), encoding);
1867 get_osabi_name (osabi)
1868 unsigned char osabi;
1870 static char buff [32];
1874 case ELFOSABI_SYSV: return _("UNIX - System V");
1875 case ELFOSABI_HPUX: return _("UNIX - HP-UX");
1876 case ELFOSABI_STANDALONE: return _("Standalone App");
1878 sprintf (buff, _("<unknown: %x>"), osabi);
1883 /* Decode the data held in 'elf_header'. */
1885 process_file_header ()
1887 if ( elf_header.e_ident [EI_MAG0] != ELFMAG0
1888 || elf_header.e_ident [EI_MAG1] != ELFMAG1
1889 || elf_header.e_ident [EI_MAG2] != ELFMAG2
1890 || elf_header.e_ident [EI_MAG3] != ELFMAG3)
1893 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
1901 printf (_("ELF Header:\n"));
1902 printf (_(" Magic: "));
1903 for (i = 0; i < EI_NIDENT; i ++)
1904 printf ("%2.2x ", elf_header.e_ident [i]);
1906 printf (_(" Class: %s\n"),
1907 get_elf_class (elf_header.e_ident [EI_CLASS]));
1908 printf (_(" Data: %s\n"),
1909 get_data_encoding (elf_header.e_ident [EI_DATA]));
1910 printf (_(" Version: %d %s\n"),
1911 elf_header.e_ident [EI_VERSION],
1912 (elf_header.e_ident [EI_VERSION] == EV_CURRENT
1914 : (elf_header.e_ident [EI_VERSION] != EV_NONE
1917 printf (_(" OS/ABI: %s\n"),
1918 get_osabi_name (elf_header.e_ident [EI_OSABI]));
1919 printf (_(" ABI Version: %d\n"),
1920 elf_header.e_ident [EI_ABIVERSION]);
1921 printf (_(" Type: %s\n"),
1922 get_file_type (elf_header.e_type));
1923 printf (_(" Machine: %s\n"),
1924 get_machine_name (elf_header.e_machine));
1925 printf (_(" Version: 0x%lx\n"),
1926 (unsigned long) elf_header.e_version);
1928 printf (_(" Entry point address: "));
1929 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
1930 printf (_("\n Start of program headers: "));
1931 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
1932 printf (_(" (bytes into file)\n Start of section headers: "));
1933 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
1934 printf (_(" (bytes into file)\n"));
1936 printf (_(" Flags: 0x%lx%s\n"),
1937 (unsigned long) elf_header.e_flags,
1938 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
1939 printf (_(" Size of this header: %ld (bytes)\n"),
1940 (long) elf_header.e_ehsize);
1941 printf (_(" Size of program headers: %ld (bytes)\n"),
1942 (long) elf_header.e_phentsize);
1943 printf (_(" Number of program headers: %ld\n"),
1944 (long) elf_header.e_phnum);
1945 printf (_(" Size of section headers: %ld (bytes)\n"),
1946 (long) elf_header.e_shentsize);
1947 printf (_(" Number of section headers: %ld\n"),
1948 (long) elf_header.e_shnum);
1949 printf (_(" Section header string table index: %ld\n"),
1950 (long) elf_header.e_shstrndx);
1958 get_32bit_program_headers (file, program_headers)
1960 Elf_Internal_Phdr * program_headers;
1962 Elf32_External_Phdr * phdrs;
1963 Elf32_External_Phdr * external;
1964 Elf32_Internal_Phdr * internal;
1967 GET_DATA_ALLOC (elf_header.e_phoff,
1968 elf_header.e_phentsize * elf_header.e_phnum,
1969 phdrs, Elf32_External_Phdr *, "program headers");
1971 for (i = 0, internal = program_headers, external = phdrs;
1972 i < elf_header.e_phnum;
1973 i ++, internal ++, external ++)
1975 internal->p_type = BYTE_GET (external->p_type);
1976 internal->p_offset = BYTE_GET (external->p_offset);
1977 internal->p_vaddr = BYTE_GET (external->p_vaddr);
1978 internal->p_paddr = BYTE_GET (external->p_paddr);
1979 internal->p_filesz = BYTE_GET (external->p_filesz);
1980 internal->p_memsz = BYTE_GET (external->p_memsz);
1981 internal->p_flags = BYTE_GET (external->p_flags);
1982 internal->p_align = BYTE_GET (external->p_align);
1991 get_64bit_program_headers (file, program_headers)
1993 Elf_Internal_Phdr * program_headers;
1995 Elf64_External_Phdr * phdrs;
1996 Elf64_External_Phdr * external;
1997 Elf64_Internal_Phdr * internal;
2000 GET_DATA_ALLOC (elf_header.e_phoff,
2001 elf_header.e_phentsize * elf_header.e_phnum,
2002 phdrs, Elf64_External_Phdr *, "program headers");
2004 for (i = 0, internal = program_headers, external = phdrs;
2005 i < elf_header.e_phnum;
2006 i ++, internal ++, external ++)
2008 internal->p_type = BYTE_GET (external->p_type);
2009 internal->p_flags = BYTE_GET (external->p_flags);
2010 internal->p_offset = BYTE_GET8 (external->p_offset);
2011 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2012 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2013 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2014 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2015 internal->p_align = BYTE_GET8 (external->p_align);
2024 process_program_headers (file)
2027 Elf_Internal_Phdr * program_headers;
2028 Elf_Internal_Phdr * segment;
2031 if (elf_header.e_phnum == 0)
2034 printf (_("\nThere are no program headers in this file.\n"));
2038 if (do_segments && !do_header)
2040 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2041 printf (_("Entry point "));
2042 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2043 printf (_("\nThere are %d program headers, starting at offset "),
2044 elf_header.e_phnum);
2045 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2049 program_headers = (Elf_Internal_Phdr *) malloc
2050 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2052 if (program_headers == NULL)
2054 error (_("Out of memory\n"));
2059 i = get_32bit_program_headers (file, program_headers);
2061 i = get_64bit_program_headers (file, program_headers);
2065 free (program_headers);
2072 (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2076 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2080 (_(" Type Offset VirtAddr PhysAddr\n"));
2082 (_(" FileSiz MemSiz Flags Align\n"));
2090 for (i = 0, segment = program_headers;
2091 i < elf_header.e_phnum;
2096 printf (" %-14.14s ", get_segment_type (segment->p_type));
2100 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2101 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2102 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2103 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2104 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2106 (segment->p_flags & PF_R ? 'R' : ' '),
2107 (segment->p_flags & PF_W ? 'W' : ' '),
2108 (segment->p_flags & PF_X ? 'E' : ' '));
2109 printf ("%#lx", (unsigned long) segment->p_align);
2113 print_vma (segment->p_offset, FULL_HEX);
2115 print_vma (segment->p_vaddr, FULL_HEX);
2117 print_vma (segment->p_paddr, FULL_HEX);
2119 print_vma (segment->p_filesz, FULL_HEX);
2121 print_vma (segment->p_memsz, FULL_HEX);
2123 (segment->p_flags & PF_R ? 'R' : ' '),
2124 (segment->p_flags & PF_W ? 'W' : ' '),
2125 (segment->p_flags & PF_X ? 'E' : ' '));
2126 print_vma (segment->p_align, HEX);
2130 switch (segment->p_type)
2134 loadaddr = (segment->p_vaddr & 0xfffff000)
2135 - (segment->p_offset & 0xfffff000);
2140 error (_("more than one dynamic segment\n"));
2142 dynamic_addr = segment->p_offset;
2143 dynamic_size = segment->p_filesz;
2147 if (fseek (file, (long) segment->p_offset, SEEK_SET))
2148 error (_("Unable to find program interpreter name\n"));
2151 program_interpreter[0] = 0;
2152 fscanf (file, "%63s", program_interpreter);
2155 printf (_("\n [Requesting program interpreter: %s]"),
2156 program_interpreter);
2162 putc ('\n', stdout);
2171 if (do_segments && section_headers != NULL)
2173 printf (_("\n Section to Segment mapping:\n"));
2174 printf (_(" Segment Sections...\n"));
2176 assert (string_table != NULL);
2178 for (i = 0; i < elf_header.e_phnum; i++)
2181 Elf_Internal_Shdr * section;
2183 segment = program_headers + i;
2184 section = section_headers;
2186 printf (" %2.2d ", i);
2188 for (j = 0; j < elf_header.e_shnum; j++, section ++)
2190 if (section->sh_size > 0
2191 /* Compare allocated sections by VMA, unallocated
2192 sections by file offset. */
2193 && (section->sh_flags & SHF_ALLOC
2194 ? (section->sh_addr >= segment->p_vaddr
2195 && section->sh_addr + section->sh_size
2196 <= segment->p_vaddr + segment->p_memsz)
2197 : ((bfd_vma) section->sh_offset >= segment->p_offset
2198 && (section->sh_offset + section->sh_size
2199 <= segment->p_offset + segment->p_filesz))))
2200 printf ("%s ", SECTION_NAME (section));
2207 free (program_headers);
2214 get_32bit_section_headers (file)
2217 Elf32_External_Shdr * shdrs;
2218 Elf32_Internal_Shdr * internal;
2221 GET_DATA_ALLOC (elf_header.e_shoff,
2222 elf_header.e_shentsize * elf_header.e_shnum,
2223 shdrs, Elf32_External_Shdr *, "section headers");
2225 section_headers = (Elf_Internal_Shdr *) malloc
2226 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2228 if (section_headers == NULL)
2230 error (_("Out of memory\n"));
2234 for (i = 0, internal = section_headers;
2235 i < elf_header.e_shnum;
2238 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2239 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2240 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
2241 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
2242 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2243 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
2244 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2245 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2246 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2247 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
2256 get_64bit_section_headers (file)
2259 Elf64_External_Shdr * shdrs;
2260 Elf64_Internal_Shdr * internal;
2263 GET_DATA_ALLOC (elf_header.e_shoff,
2264 elf_header.e_shentsize * elf_header.e_shnum,
2265 shdrs, Elf64_External_Shdr *, "section headers");
2267 section_headers = (Elf_Internal_Shdr *) malloc
2268 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2270 if (section_headers == NULL)
2272 error (_("Out of memory\n"));
2276 for (i = 0, internal = section_headers;
2277 i < elf_header.e_shnum;
2280 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2281 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2282 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
2283 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
2284 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
2285 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
2286 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2287 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2288 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2289 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2297 static Elf_Internal_Sym *
2298 get_32bit_elf_symbols (file, offset, number)
2300 unsigned long offset;
2301 unsigned long number;
2303 Elf32_External_Sym * esyms;
2304 Elf_Internal_Sym * isyms;
2305 Elf_Internal_Sym * psym;
2308 GET_DATA_ALLOC (offset, number * sizeof (Elf32_External_Sym),
2309 esyms, Elf32_External_Sym *, "symbols");
2311 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2315 error (_("Out of memory\n"));
2321 for (j = 0, psym = isyms;
2325 psym->st_name = BYTE_GET (esyms[j].st_name);
2326 psym->st_value = BYTE_GET (esyms[j].st_value);
2327 psym->st_size = BYTE_GET (esyms[j].st_size);
2328 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2329 psym->st_info = BYTE_GET (esyms[j].st_info);
2330 psym->st_other = BYTE_GET (esyms[j].st_other);
2338 static Elf_Internal_Sym *
2339 get_64bit_elf_symbols (file, offset, number)
2341 unsigned long offset;
2342 unsigned long number;
2344 Elf64_External_Sym * esyms;
2345 Elf_Internal_Sym * isyms;
2346 Elf_Internal_Sym * psym;
2349 GET_DATA_ALLOC (offset, number * sizeof (Elf64_External_Sym),
2350 esyms, Elf64_External_Sym *, "symbols");
2352 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2356 error (_("Out of memory\n"));
2362 for (j = 0, psym = isyms;
2366 psym->st_name = BYTE_GET (esyms[j].st_name);
2367 psym->st_info = BYTE_GET (esyms[j].st_info);
2368 psym->st_other = BYTE_GET (esyms[j].st_other);
2369 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2370 psym->st_value = BYTE_GET8 (esyms[j].st_value);
2371 psym->st_size = BYTE_GET8 (esyms[j].st_size);
2380 process_section_headers (file)
2383 Elf_Internal_Shdr * section;
2386 section_headers = NULL;
2388 if (elf_header.e_shnum == 0)
2391 printf (_("\nThere are no sections in this file.\n"));
2396 if (do_sections && !do_header)
2397 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
2398 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
2402 if (! get_32bit_section_headers (file))
2405 else if (! get_64bit_section_headers (file))
2408 /* Read in the string table, so that we have names to display. */
2409 section = section_headers + elf_header.e_shstrndx;
2411 if (section->sh_size != 0)
2413 unsigned long string_table_offset;
2415 string_table_offset = section->sh_offset;
2417 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
2418 string_table, char *, "string table");
2421 /* Scan the sections for the dynamic symbol table
2422 and dynamic string table and debug sections. */
2423 dynamic_symbols = NULL;
2424 dynamic_strings = NULL;
2425 dynamic_syminfo = NULL;
2427 for (i = 0, section = section_headers;
2428 i < elf_header.e_shnum;
2431 char * name = SECTION_NAME (section);
2433 if (section->sh_type == SHT_DYNSYM)
2435 if (dynamic_symbols != NULL)
2437 error (_("File contains multiple dynamic symbol tables\n"));
2441 num_dynamic_syms = section->sh_size / section->sh_entsize;
2443 GET_ELF_SYMBOLS (file, section->sh_offset, num_dynamic_syms);
2445 else if (section->sh_type == SHT_STRTAB
2446 && strcmp (name, ".dynstr") == 0)
2448 if (dynamic_strings != NULL)
2450 error (_("File contains multiple dynamic string tables\n"));
2454 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
2455 dynamic_strings, char *, "dynamic strings");
2457 else if ((do_debugging || do_debug_info || do_debug_abbrevs
2458 || do_debug_lines || do_debug_pubnames || do_debug_aranges)
2459 && strncmp (name, ".debug_", 7) == 0)
2464 || (do_debug_info && (strcmp (name, "info") == 0))
2465 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
2466 || (do_debug_lines && (strcmp (name, "line") == 0))
2467 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
2468 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
2470 request_dump (i, DEBUG_DUMP);
2477 printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
2480 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
2483 printf (_(" [Nr] Name Type Address Offset\n"));
2484 printf (_(" Size EntSize Flags Link Info Align\n"));
2487 for (i = 0, section = section_headers;
2488 i < elf_header.e_shnum;
2491 printf (" [%2d] %-17.17s %-15.15s ",
2493 SECTION_NAME (section),
2494 get_section_type_name (section->sh_type));
2498 print_vma (section->sh_addr, LONG_HEX);
2500 printf ( " %6.6lx %6.6lx %2.2lx",
2501 (unsigned long) section->sh_offset,
2502 (unsigned long) section->sh_size,
2503 (unsigned long) section->sh_entsize);
2505 printf (" %c%c%c %2ld %3lx %ld\n",
2506 (section->sh_flags & SHF_WRITE ? 'W' : ' '),
2507 (section->sh_flags & SHF_ALLOC ? 'A' : ' '),
2508 (section->sh_flags & SHF_EXECINSTR ? 'X' : ' '),
2509 (unsigned long) section->sh_link,
2510 (unsigned long) section->sh_info,
2511 (unsigned long) section->sh_addralign);
2516 print_vma (section->sh_addr, LONG_HEX);
2517 printf (" %08.8lx", section->sh_offset);
2519 print_vma (section->sh_size, LONG_HEX);
2521 print_vma (section->sh_entsize, LONG_HEX);
2524 (section->sh_flags & SHF_WRITE ? 'W' : ' '),
2525 (section->sh_flags & SHF_ALLOC ? 'A' : ' '),
2526 (section->sh_flags & SHF_EXECINSTR ? 'X' : ' '));
2528 printf (" %2ld %3lx %ld\n",
2529 (unsigned long) section->sh_link,
2530 (unsigned long) section->sh_info,
2531 (unsigned long) section->sh_addralign);
2538 /* Process the reloc section. */
2540 process_relocs (file)
2543 unsigned long rel_size;
2544 unsigned long rel_offset;
2550 if (do_using_dynamic)
2552 int is_rela = FALSE;
2557 if (dynamic_info[DT_REL])
2559 rel_offset = dynamic_info[DT_REL];
2560 rel_size = dynamic_info[DT_RELSZ];
2563 else if (dynamic_info [DT_RELA])
2565 rel_offset = dynamic_info[DT_RELA];
2566 rel_size = dynamic_info[DT_RELASZ];
2569 else if (dynamic_info[DT_JMPREL])
2571 rel_offset = dynamic_info[DT_JMPREL];
2572 rel_size = dynamic_info[DT_PLTRELSZ];
2574 switch (dynamic_info[DT_PLTREL])
2591 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
2592 rel_offset, rel_size);
2594 dump_relocations (file, rel_offset - loadaddr, rel_size,
2595 dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
2598 printf (_("\nThere are no dynamic relocations in this file.\n"));
2602 Elf32_Internal_Shdr * section;
2606 for (i = 0, section = section_headers;
2607 i < elf_header.e_shnum;
2610 if ( section->sh_type != SHT_RELA
2611 && section->sh_type != SHT_REL)
2614 rel_offset = section->sh_offset;
2615 rel_size = section->sh_size;
2619 Elf32_Internal_Shdr * strsec;
2620 Elf32_Internal_Shdr * symsec;
2621 Elf_Internal_Sym * symtab;
2624 unsigned long nsyms;
2626 printf (_("\nRelocation section "));
2628 if (string_table == NULL)
2629 printf ("%d", section->sh_name);
2631 printf ("'%s'", SECTION_NAME (section));
2633 printf (_(" at offset 0x%lx contains %lu entries:\n"),
2634 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
2636 symsec = section_headers + section->sh_link;
2638 nsyms = symsec->sh_size / symsec->sh_entsize;
2639 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
2644 strsec = section_headers + symsec->sh_link;
2646 GET_DATA_ALLOC (strsec->sh_offset, strsec->sh_size, strtab,
2647 char *, "string table");
2649 is_rela = section->sh_type == SHT_RELA;
2651 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela);
2661 printf (_("\nThere are no relocations in this file.\n"));
2669 dynamic_segment_mips_val (entry)
2670 Elf_Internal_Dyn * entry;
2672 switch (entry->d_tag)
2675 if (entry->d_un.d_val == 0)
2679 static const char * opts[] =
2681 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
2682 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
2683 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
2684 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
2689 for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
2690 if (entry->d_un.d_val & (1 << cnt))
2692 printf ("%s%s", first ? "" : " ", opts[cnt]);
2699 case DT_MIPS_IVERSION:
2700 if (dynamic_strings != NULL)
2701 printf ("Interface Version: %s\n",
2702 dynamic_strings + entry->d_un.d_val);
2704 printf ("%ld\n", (long) entry->d_un.d_ptr);
2707 case DT_MIPS_TIME_STAMP:
2710 time_t time = entry->d_un.d_val;
2711 strftime (timebuf, 20, "%Y-%m-%dT%H:%M:%S", gmtime (&time));
2712 printf ("Time Stamp: %s\n", timebuf);
2716 case DT_MIPS_RLD_VERSION:
2717 case DT_MIPS_LOCAL_GOTNO:
2718 case DT_MIPS_CONFLICTNO:
2719 case DT_MIPS_LIBLISTNO:
2720 case DT_MIPS_SYMTABNO:
2721 case DT_MIPS_UNREFEXTNO:
2722 case DT_MIPS_HIPAGENO:
2723 case DT_MIPS_DELTA_CLASS_NO:
2724 case DT_MIPS_DELTA_INSTANCE_NO:
2725 case DT_MIPS_DELTA_RELOC_NO:
2726 case DT_MIPS_DELTA_SYM_NO:
2727 case DT_MIPS_DELTA_CLASSSYM_NO:
2728 case DT_MIPS_COMPACT_SIZE:
2729 printf ("%ld\n", (long) entry->d_un.d_ptr);
2733 printf ("%#lx\n", (long) entry->d_un.d_ptr);
2739 dynamic_segment_parisc_val (entry)
2740 Elf_Internal_Dyn * entry;
2742 switch (entry->d_tag)
2744 case DT_HP_DLD_FLAGS:
2752 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
2753 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
2754 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
2755 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
2756 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
2757 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
2758 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
2759 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
2760 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
2761 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
2762 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
2766 bfd_vma val = entry->d_un.d_val;
2768 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
2769 if (val & flags[cnt].bit)
2773 fputs (flags[cnt].str, stdout);
2775 val ^= flags[cnt].bit;
2777 if (val != 0 || first)
2781 print_vma (val, HEX);
2787 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
2793 get_32bit_dynamic_segment (file)
2796 Elf32_External_Dyn * edyn;
2797 Elf_Internal_Dyn * entry;
2800 GET_DATA_ALLOC (dynamic_addr, dynamic_size,
2801 edyn, Elf32_External_Dyn *, "dynamic segment");
2803 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
2804 how large this .dynamic is now. We can do this even before the byte
2805 swapping since the DT_NULL tag is recognizable. */
2807 while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
2810 dynamic_segment = (Elf_Internal_Dyn *)
2811 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
2813 if (dynamic_segment == NULL)
2815 error (_("Out of memory\n"));
2820 for (i = 0, entry = dynamic_segment;
2824 entry->d_tag = BYTE_GET (edyn [i].d_tag);
2825 entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
2834 get_64bit_dynamic_segment (file)
2837 Elf64_External_Dyn * edyn;
2838 Elf_Internal_Dyn * entry;
2841 GET_DATA_ALLOC (dynamic_addr, dynamic_size,
2842 edyn, Elf64_External_Dyn *, "dynamic segment");
2844 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
2845 how large this .dynamic is now. We can do this even before the byte
2846 swapping since the DT_NULL tag is recognizable. */
2848 while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
2851 dynamic_segment = (Elf_Internal_Dyn *)
2852 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
2854 if (dynamic_segment == NULL)
2856 error (_("Out of memory\n"));
2861 for (i = 0, entry = dynamic_segment;
2865 entry->d_tag = BYTE_GET8 (edyn [i].d_tag);
2866 entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
2874 /* Parse and display the contents of the dynamic segment. */
2876 process_dynamic_segment (file)
2879 Elf_Internal_Dyn * entry;
2882 if (dynamic_size == 0)
2885 printf (_("\nThere is no dynamic segment in this file.\n"));
2892 if (! get_32bit_dynamic_segment (file))
2895 else if (! get_64bit_dynamic_segment (file))
2898 /* Find the appropriate symbol table. */
2899 if (dynamic_symbols == NULL)
2901 for (i = 0, entry = dynamic_segment;
2905 unsigned long offset;
2907 if (entry->d_tag != DT_SYMTAB)
2910 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
2912 /* Since we do not know how big the symbol table is,
2913 we default to reading in the entire file (!) and
2914 processing that. This is overkill, I know, but it
2916 offset = entry->d_un.d_val - loadaddr;
2918 if (fseek (file, 0, SEEK_END))
2919 error (_("Unable to seek to end of file!"));
2922 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf32_External_Sym);
2924 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf64_External_Sym);
2926 if (num_dynamic_syms < 1)
2928 error (_("Unable to determine the number of symbols to load\n"));
2932 dynamic_symbols = GET_ELF_SYMBOLS (file, offset, num_dynamic_syms);
2936 /* Similarly find a string table. */
2937 if (dynamic_strings == NULL)
2939 for (i = 0, entry = dynamic_segment;
2943 unsigned long offset;
2946 if (entry->d_tag != DT_STRTAB)
2949 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
2951 /* Since we do not know how big the string table is,
2952 we default to reading in the entire file (!) and
2953 processing that. This is overkill, I know, but it
2956 offset = entry->d_un.d_val - loadaddr;
2957 if (fseek (file, 0, SEEK_END))
2958 error (_("Unable to seek to end of file\n"));
2959 str_tab_len = ftell (file) - offset;
2961 if (str_tab_len < 1)
2964 (_("Unable to determine the length of the dynamic string table\n"));
2968 GET_DATA_ALLOC (offset, str_tab_len, dynamic_strings, char *,
2969 "dynamic string table");
2975 /* And find the syminfo section if available. */
2976 if (dynamic_syminfo == NULL)
2978 unsigned int syminsz = 0;
2980 for (i = 0, entry = dynamic_segment;
2984 if (entry->d_tag == DT_SYMINENT)
2986 /* Note: these braces are necessary to avoid a syntax
2987 error from the SunOS4 C compiler. */
2988 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
2990 else if (entry->d_tag == DT_SYMINSZ)
2991 syminsz = entry->d_un.d_val;
2992 else if (entry->d_tag == DT_SYMINFO)
2993 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
2996 if (dynamic_syminfo_offset != 0 && syminsz != 0)
2998 Elf_External_Syminfo * extsyminfo;
2999 Elf_Internal_Syminfo * syminfo;
3001 /* There is a syminfo section. Read the data. */
3002 GET_DATA_ALLOC (dynamic_syminfo_offset, syminsz, extsyminfo,
3003 Elf_External_Syminfo *, "symbol information");
3005 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
3006 if (dynamic_syminfo == NULL)
3008 error (_("Out of memory\n"));
3012 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
3013 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
3016 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
3017 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
3024 if (do_dynamic && dynamic_addr)
3025 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
3026 dynamic_addr, (long) dynamic_size);
3028 printf (_(" Tag Type Name/Value\n"));
3030 for (i = 0, entry = dynamic_segment;
3037 print_vma (entry->d_tag, FULL_HEX);
3039 get_dynamic_type (entry->d_tag),
3040 (is_32bit_elf ? 27 : 19) - strlen (get_dynamic_type (entry->d_tag)),
3044 switch (entry->d_tag)
3050 if (entry->d_tag == DT_AUXILIARY)
3051 printf (_("Auxiliary library"));
3053 printf (_("Filter library"));
3055 if (dynamic_strings)
3056 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
3060 print_vma (entry->d_un.d_val, PREFIX_HEX);
3069 printf (_("Flags:"));
3070 if (entry->d_un.d_val == 0)
3071 printf (_(" None\n"));
3074 unsigned long int val = entry->d_un.d_val;
3075 if (val & DTF_1_PARINIT)
3077 printf (" PARINIT");
3078 val ^= DTF_1_PARINIT;
3081 printf (" %lx", val);
3090 printf (_("Flags:"));
3091 if (entry->d_un.d_val == 0)
3092 printf (_(" None\n"));
3095 unsigned long int val = entry->d_un.d_val;
3096 if (val & DF_P1_LAZYLOAD)
3098 printf (" LAZYLOAD");
3099 val ^= DF_P1_LAZYLOAD;
3101 if (val & DF_P1_GROUPPERM)
3103 printf (" GROUPPERM");
3104 val ^= DF_P1_GROUPPERM;
3107 printf (" %lx", val);
3116 printf (_("Flags:"));
3117 if (entry->d_un.d_val == 0)
3118 printf (_(" None\n"));
3121 unsigned long int val = entry->d_un.d_val;
3127 if (val & DF_1_GLOBAL)
3132 if (val & DF_1_GROUP)
3137 if (val & DF_1_NODELETE)
3139 printf (" NODELETE");
3140 val ^= DF_1_NODELETE;
3142 if (val & DF_1_LOADFLTR)
3144 printf (" LOADFLTR");
3145 val ^= DF_1_LOADFLTR;
3147 if (val & DF_1_INITFIRST)
3149 printf (" INITFIRST");
3150 val ^= DF_1_INITFIRST;
3152 if (val & DF_1_NOOPEN)
3157 if (val & DF_1_ORIGIN)
3162 if (val & DF_1_DIRECT)
3167 if (val & DF_1_TRANS)
3172 if (val & DF_1_INTERPOSE)
3174 printf (" INTERPOSE");
3175 val ^= DF_1_INTERPOSE;
3178 printf (" %lx", val);
3186 puts (get_dynamic_type (entry->d_un.d_val));
3205 dynamic_info[entry->d_tag] = entry->d_un.d_val;
3211 if (dynamic_strings == NULL)
3214 name = dynamic_strings + entry->d_un.d_val;
3218 switch (entry->d_tag)
3221 printf (_("Shared library: [%s]"), name);
3223 if (strcmp (name, program_interpreter) == 0)
3224 printf (_(" program interpreter"));
3228 printf (_("Library soname: [%s]"), name);
3232 printf (_("Library rpath: [%s]"), name);
3236 print_vma (entry->d_un.d_val, PREFIX_HEX);
3241 print_vma (entry->d_un.d_val, PREFIX_HEX);
3257 case DT_INIT_ARRAYSZ:
3258 case DT_FINI_ARRAYSZ:
3261 print_vma (entry->d_un.d_val, UNSIGNED);
3262 printf (" (bytes)\n");
3272 print_vma (entry->d_un.d_val, UNSIGNED);
3285 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
3289 name = dynamic_strings + entry->d_un.d_val;
3293 printf (_("Not needed object: [%s]\n"), name);
3298 print_vma (entry->d_un.d_val, PREFIX_HEX);
3304 /* The value of this entry is ignored. */
3308 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
3309 version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
3314 switch (elf_header.e_machine)
3317 case EM_MIPS_RS4_BE:
3318 dynamic_segment_mips_val (entry);
3321 dynamic_segment_parisc_val (entry);
3324 print_vma (entry->d_un.d_val, PREFIX_HEX);
3336 get_ver_flags (flags)
3339 static char buff [32];
3346 if (flags & VER_FLG_BASE)
3347 strcat (buff, "BASE ");
3349 if (flags & VER_FLG_WEAK)
3351 if (flags & VER_FLG_BASE)
3352 strcat (buff, "| ");
3354 strcat (buff, "WEAK ");
3357 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
3358 strcat (buff, "| <unknown>");
3363 /* Display the contents of the version sections. */
3365 process_version_sections (file)
3368 Elf32_Internal_Shdr * section;
3375 for (i = 0, section = section_headers;
3376 i < elf_header.e_shnum;
3379 switch (section->sh_type)
3381 case SHT_GNU_verdef:
3383 Elf_External_Verdef * edefs;
3390 (_("\nVersion definition section '%s' contains %ld entries:\n"),
3391 SECTION_NAME (section), section->sh_info);
3393 printf (_(" Addr: 0x"));
3394 printf_vma (section->sh_addr);
3395 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
3396 (unsigned long) section->sh_offset, section->sh_link,
3397 SECTION_NAME (section_headers + section->sh_link));
3399 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
3400 edefs, Elf_External_Verdef *,
3401 "version definition section");
3403 for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
3406 Elf_External_Verdef * edef;
3407 Elf_Internal_Verdef ent;
3408 Elf_External_Verdaux * eaux;
3409 Elf_Internal_Verdaux aux;
3413 vstart = ((char *) edefs) + idx;
3415 edef = (Elf_External_Verdef *) vstart;
3417 ent.vd_version = BYTE_GET (edef->vd_version);
3418 ent.vd_flags = BYTE_GET (edef->vd_flags);
3419 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
3420 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
3421 ent.vd_hash = BYTE_GET (edef->vd_hash);
3422 ent.vd_aux = BYTE_GET (edef->vd_aux);
3423 ent.vd_next = BYTE_GET (edef->vd_next);
3425 printf (_(" %#06x: Rev: %d Flags: %s"),
3426 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
3428 printf (_(" Index: %d Cnt: %d "),
3429 ent.vd_ndx, ent.vd_cnt);
3431 vstart += ent.vd_aux;
3433 eaux = (Elf_External_Verdaux *) vstart;
3435 aux.vda_name = BYTE_GET (eaux->vda_name);
3436 aux.vda_next = BYTE_GET (eaux->vda_next);
3438 if (dynamic_strings)
3439 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
3441 printf (_("Name index: %ld\n"), aux.vda_name);
3443 isum = idx + ent.vd_aux;
3445 for (j = 1; j < ent.vd_cnt; j ++)
3447 isum += aux.vda_next;
3448 vstart += aux.vda_next;
3450 eaux = (Elf_External_Verdaux *) vstart;
3452 aux.vda_name = BYTE_GET (eaux->vda_name);
3453 aux.vda_next = BYTE_GET (eaux->vda_next);
3455 if (dynamic_strings)
3456 printf (_(" %#06x: Parent %d: %s\n"),
3457 isum, j, dynamic_strings + aux.vda_name);
3459 printf (_(" %#06x: Parent %d, name index: %ld\n"),
3460 isum, j, aux.vda_name);
3470 case SHT_GNU_verneed:
3472 Elf_External_Verneed * eneed;
3478 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
3479 SECTION_NAME (section), section->sh_info);
3481 printf (_(" Addr: 0x"));
3482 printf_vma (section->sh_addr);
3483 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
3484 (unsigned long) section->sh_offset, section->sh_link,
3485 SECTION_NAME (section_headers + section->sh_link));
3487 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
3488 eneed, Elf_External_Verneed *,
3489 "version need section");
3491 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
3493 Elf_External_Verneed * entry;
3494 Elf_Internal_Verneed ent;
3499 vstart = ((char *) eneed) + idx;
3501 entry = (Elf_External_Verneed *) vstart;
3503 ent.vn_version = BYTE_GET (entry->vn_version);
3504 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
3505 ent.vn_file = BYTE_GET (entry->vn_file);
3506 ent.vn_aux = BYTE_GET (entry->vn_aux);
3507 ent.vn_next = BYTE_GET (entry->vn_next);
3509 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
3511 if (dynamic_strings)
3512 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
3514 printf (_(" File: %lx"), ent.vn_file);
3516 printf (_(" Cnt: %d\n"), ent.vn_cnt);
3518 vstart += ent.vn_aux;
3520 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
3522 Elf_External_Vernaux * eaux;
3523 Elf_Internal_Vernaux aux;
3525 eaux = (Elf_External_Vernaux *) vstart;
3527 aux.vna_hash = BYTE_GET (eaux->vna_hash);
3528 aux.vna_flags = BYTE_GET (eaux->vna_flags);
3529 aux.vna_other = BYTE_GET (eaux->vna_other);
3530 aux.vna_name = BYTE_GET (eaux->vna_name);
3531 aux.vna_next = BYTE_GET (eaux->vna_next);
3533 if (dynamic_strings)
3534 printf (_(" %#06x: Name: %s"),
3535 isum, dynamic_strings + aux.vna_name);
3537 printf (_(" %#06x: Name index: %lx"),
3538 isum, aux.vna_name);
3540 printf (_(" Flags: %s Version: %d\n"),
3541 get_ver_flags (aux.vna_flags), aux.vna_other);
3543 isum += aux.vna_next;
3544 vstart += aux.vna_next;
3554 case SHT_GNU_versym:
3556 Elf32_Internal_Shdr * link_section;
3559 unsigned char * edata;
3560 unsigned short * data;
3562 Elf_Internal_Sym * symbols;
3563 Elf32_Internal_Shdr * string_sec;
3565 link_section = section_headers + section->sh_link;
3566 total = section->sh_size / section->sh_entsize;
3570 symbols = GET_ELF_SYMBOLS (file, link_section->sh_offset,
3571 link_section->sh_size / link_section->sh_entsize);
3573 string_sec = section_headers + link_section->sh_link;
3575 GET_DATA_ALLOC (string_sec->sh_offset, string_sec->sh_size,
3576 strtab, char *, "version string table");
3578 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
3579 SECTION_NAME (section), total);
3581 printf (_(" Addr: "));
3582 printf_vma (section->sh_addr);
3583 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
3584 (unsigned long) section->sh_offset, section->sh_link,
3585 SECTION_NAME (link_section));
3587 GET_DATA_ALLOC (version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
3589 total * sizeof (short), edata,
3590 unsigned char *, "version symbol data");
3592 data = (unsigned short *) malloc (total * sizeof (short));
3594 for (cnt = total; cnt --;)
3595 data [cnt] = byte_get (edata + cnt * sizeof (short),
3600 for (cnt = 0; cnt < total; cnt += 4)
3604 printf (" %03x:", cnt);
3606 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
3607 switch (data [cnt + j])
3610 fputs (_(" 0 (*local*) "), stdout);
3614 fputs (_(" 1 (*global*) "), stdout);
3618 nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
3619 data [cnt + j] & 0x8000 ? 'h' : ' ');
3621 if (symbols [cnt + j].st_shndx < SHN_LORESERVE
3622 && section_headers[symbols [cnt + j].st_shndx].sh_type
3625 /* We must test both. */
3626 Elf_Internal_Verneed ivn;
3627 unsigned long offset;
3629 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
3634 Elf_External_Verneed evn;
3635 Elf_External_Vernaux evna;
3636 Elf_Internal_Vernaux ivna;
3637 unsigned long vna_off;
3639 GET_DATA (offset, evn, "version need");
3641 ivn.vn_aux = BYTE_GET (evn.vn_aux);
3642 ivn.vn_next = BYTE_GET (evn.vn_next);
3644 vna_off = offset + ivn.vn_aux;
3648 GET_DATA (vna_off, evna,
3649 "version need aux (1)");
3651 ivna.vna_next = BYTE_GET (evna.vna_next);
3652 ivna.vna_other = BYTE_GET (evna.vna_other);
3654 vna_off += ivna.vna_next;
3656 while (ivna.vna_other != data [cnt + j]
3657 && ivna.vna_next != 0);
3659 if (ivna.vna_other == data [cnt + j])
3661 ivna.vna_name = BYTE_GET (evna.vna_name);
3663 nn += printf ("(%s%-*s",
3664 strtab + ivna.vna_name,
3670 else if (ivn.vn_next == 0)
3672 if (data [cnt + j] != 0x8001)
3674 Elf_Internal_Verdef ivd;
3675 Elf_External_Verdef evd;
3677 offset = version_info
3678 [DT_VERSIONTAGIDX (DT_VERDEF)]
3683 GET_DATA (offset, evd,
3684 "version definition");
3686 ivd.vd_next = BYTE_GET (evd.vd_next);
3687 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
3689 offset += ivd.vd_next;
3692 != (data [cnt + j] & 0x7fff)
3693 && ivd.vd_next != 0);
3696 == (data [cnt + j] & 0x7fff))
3698 Elf_External_Verdaux evda;
3699 Elf_Internal_Verdaux ivda;
3701 ivd.vd_aux = BYTE_GET (evd.vd_aux);
3703 GET_DATA (offset + ivd.vd_aux, evda,
3704 "version definition aux");
3707 BYTE_GET (evda.vda_name);
3711 strtab + ivda.vda_name,
3722 offset += ivn.vn_next;
3724 while (ivn.vn_next);
3726 else if (symbols [cnt + j].st_shndx == SHN_UNDEF)
3728 Elf_Internal_Verneed ivn;
3729 unsigned long offset;
3731 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
3736 Elf_Internal_Vernaux ivna;
3737 Elf_External_Verneed evn;
3738 Elf_External_Vernaux evna;
3739 unsigned long a_off;
3741 GET_DATA (offset, evn, "version need");
3743 ivn.vn_aux = BYTE_GET (evn.vn_aux);
3744 ivn.vn_next = BYTE_GET (evn.vn_next);
3746 a_off = offset + ivn.vn_aux;
3750 GET_DATA (a_off, evna,
3751 "version need aux (2)");
3753 ivna.vna_next = BYTE_GET (evna.vna_next);
3754 ivna.vna_other = BYTE_GET (evna.vna_other);
3756 a_off += ivna.vna_next;
3758 while (ivna.vna_other != data [cnt + j]
3759 && ivna.vna_next != 0);
3761 if (ivna.vna_other == data [cnt + j])
3763 ivna.vna_name = BYTE_GET (evna.vna_name);
3765 nn += printf ("(%s%-*s",
3766 strtab + ivna.vna_name,
3773 offset += ivn.vn_next;
3775 while (ivn.vn_next);
3777 else if (data [cnt + j] != 0x8001)
3779 Elf_Internal_Verdef ivd;
3780 Elf_External_Verdef evd;
3781 unsigned long offset;
3783 offset = version_info
3784 [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
3788 GET_DATA (offset, evd, "version def");
3790 ivd.vd_next = BYTE_GET (evd.vd_next);
3791 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
3793 offset += ivd.vd_next;
3795 while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
3796 && ivd.vd_next != 0);
3798 if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
3800 Elf_External_Verdaux evda;
3801 Elf_Internal_Verdaux ivda;
3803 ivd.vd_aux = BYTE_GET (evd.vd_aux);
3805 GET_DATA (offset - ivd.vd_next + ivd.vd_aux,
3806 evda, "version def aux");
3808 ivda.vda_name = BYTE_GET (evda.vda_name);
3810 nn += printf ("(%s%-*s",
3811 strtab + ivda.vda_name,
3819 printf ("%*c", 18 - nn, ' ');
3837 printf (_("\nNo version information found in this file.\n"));
3843 get_symbol_binding (binding)
3844 unsigned int binding;
3846 static char buff [32];
3850 case STB_LOCAL: return "LOCAL";
3851 case STB_GLOBAL: return "GLOBAL";
3852 case STB_WEAK: return "WEAK";
3854 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
3855 sprintf (buff, _("<processor specific>: %d"), binding);
3856 else if (binding >= STB_LOOS && binding <= STB_HIOS)
3857 sprintf (buff, _("<OS specific>: %d"), binding);
3859 sprintf (buff, _("<unknown>: %d"), binding);
3865 get_symbol_type (type)
3868 static char buff [32];
3872 case STT_NOTYPE: return "NOTYPE";
3873 case STT_OBJECT: return "OBJECT";
3874 case STT_FUNC: return "FUNC";
3875 case STT_SECTION: return "SECTION";
3876 case STT_FILE: return "FILE";
3878 if (type >= STT_LOPROC && type <= STT_HIPROC)
3880 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
3881 return "THUMB_FUNC";
3883 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
3886 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
3887 return "PARISC_MILLI";
3889 sprintf (buff, _("<processor specific>: %d"), type);
3891 else if (type >= STT_LOOS && type <= STT_HIOS)
3893 if (elf_header.e_machine == EM_PARISC)
3895 if (type == STT_HP_OPAQUE)
3897 if (type == STT_HP_STUB)
3901 sprintf (buff, _("<OS specific>: %d"), type);
3904 sprintf (buff, _("<unknown>: %d"), type);
3910 get_symbol_index_type (type)
3915 case SHN_UNDEF: return "UND";
3916 case SHN_ABS: return "ABS";
3917 case SHN_COMMON: return "COM";
3919 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
3921 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
3923 else if (type >= SHN_LOOS && type <= SHN_HIOS)
3927 static char buff [32];
3929 sprintf (buff, "%3d", type);
3937 get_dynamic_data (file, number)
3939 unsigned int number;
3944 e_data = (char *) malloc (number * 4);
3948 error (_("Out of memory\n"));
3952 if (fread (e_data, 4, number, file) != number)
3954 error (_("Unable to read in dynamic data\n"));
3958 i_data = (int *) malloc (number * sizeof (* i_data));
3962 error (_("Out of memory\n"));
3968 i_data [number] = byte_get (e_data + number * 4, 4);
3975 /* Dump the symbol table */
3977 process_symbol_table (file)
3980 Elf32_Internal_Shdr * section;
3985 int * buckets = NULL;
3986 int * chains = NULL;
3988 if (! do_syms && !do_histogram)
3991 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
3994 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
3996 error (_("Unable to seek to start of dynamic information"));
4000 if (fread (nb, sizeof (nb), 1, file) != 1)
4002 error (_("Failed to read in number of buckets\n"));
4006 if (fread (nc, sizeof (nc), 1, file) != 1)
4008 error (_("Failed to read in number of chains\n"));
4012 nbuckets = byte_get (nb, 4);
4013 nchains = byte_get (nc, 4);
4015 buckets = get_dynamic_data (file, nbuckets);
4016 chains = get_dynamic_data (file, nchains);
4018 if (buckets == NULL || chains == NULL)
4023 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
4028 printf (_("\nSymbol table for image:\n"));
4030 printf (_(" Num Buc: Value Size Type Bind Ot Ndx Name\n"));
4032 printf (_(" Num Buc: Value Size Type Bind Ot Ndx Name\n"));
4034 for (hn = 0; hn < nbuckets; hn++)
4039 for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
4041 Elf_Internal_Sym * psym;
4043 psym = dynamic_symbols + si;
4045 printf (" %3d %3d: ", si, hn);
4046 print_vma (psym->st_value, LONG_HEX);
4048 print_vma (psym->st_size, DEC_5);
4050 printf (" %6s %6s %2d ",
4051 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
4052 get_symbol_binding (ELF_ST_BIND (psym->st_info)),
4055 printf ("%3.3s", get_symbol_index_type (psym->st_shndx));
4057 printf (" %s\n", dynamic_strings + psym->st_name);
4061 else if (do_syms && !do_using_dynamic)
4065 for (i = 0, section = section_headers;
4066 i < elf_header.e_shnum;
4071 Elf_Internal_Sym * symtab;
4072 Elf_Internal_Sym * psym;
4075 if ( section->sh_type != SHT_SYMTAB
4076 && section->sh_type != SHT_DYNSYM)
4079 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
4080 SECTION_NAME (section),
4081 (unsigned long) (section->sh_size / section->sh_entsize));
4083 printf (_(" Num: Value Size Type Bind Ot Ndx Name\n"));
4085 printf (_(" Num: Value Size Type Bind Ot Ndx Name\n"));
4087 symtab = GET_ELF_SYMBOLS (file, section->sh_offset,
4088 section->sh_size / section->sh_entsize);
4092 if (section->sh_link == elf_header.e_shstrndx)
4093 strtab = string_table;
4096 Elf32_Internal_Shdr * string_sec;
4098 string_sec = section_headers + section->sh_link;
4100 GET_DATA_ALLOC (string_sec->sh_offset, string_sec->sh_size,
4101 strtab, char *, "string table");
4104 for (si = 0, psym = symtab;
4105 si < section->sh_size / section->sh_entsize;
4108 printf (" %3d: ", si);
4109 print_vma (psym->st_value, LONG_HEX);
4111 print_vma (psym->st_size, DEC_5);
4112 printf (" %-7s %-6s %2d ",
4113 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
4114 get_symbol_binding (ELF_ST_BIND (psym->st_info)),
4117 printf ("%4s", get_symbol_index_type (psym->st_shndx));
4119 printf (" %s", strtab + psym->st_name);
4121 if (section->sh_type == SHT_DYNSYM &&
4122 version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
4124 unsigned char data[2];
4125 unsigned short vers_data;
4126 unsigned long offset;
4130 offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
4133 GET_DATA (offset + si * sizeof (vers_data), data,
4136 vers_data = byte_get (data, 2);
4138 is_nobits = psym->st_shndx < SHN_LORESERVE ?
4139 (section_headers [psym->st_shndx].sh_type == SHT_NOBITS)
4142 check_def = (psym->st_shndx != SHN_UNDEF);
4144 if ((vers_data & 0x8000) || vers_data > 1)
4146 if (is_nobits || ! check_def)
4148 Elf_External_Verneed evn;
4149 Elf_Internal_Verneed ivn;
4150 Elf_Internal_Vernaux ivna;
4152 /* We must test both. */
4153 offset = version_info
4154 [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
4156 GET_DATA (offset, evn, "version need");
4158 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4159 ivn.vn_next = BYTE_GET (evn.vn_next);
4163 unsigned long vna_off;
4165 vna_off = offset + ivn.vn_aux;
4169 Elf_External_Vernaux evna;
4171 GET_DATA (vna_off, evna,
4172 "version need aux (3)");
4174 ivna.vna_other = BYTE_GET (evna.vna_other);
4175 ivna.vna_next = BYTE_GET (evna.vna_next);
4176 ivna.vna_name = BYTE_GET (evna.vna_name);
4178 vna_off += ivna.vna_next;
4180 while (ivna.vna_other != vers_data
4181 && ivna.vna_next != 0);
4183 if (ivna.vna_other == vers_data)
4186 offset += ivn.vn_next;
4188 while (ivn.vn_next != 0);
4190 if (ivna.vna_other == vers_data)
4193 strtab + ivna.vna_name, ivna.vna_other);
4196 else if (! is_nobits)
4197 error (_("bad dynamic symbol"));
4204 if (vers_data != 0x8001)
4206 Elf_Internal_Verdef ivd;
4207 Elf_Internal_Verdaux ivda;
4208 Elf_External_Verdaux evda;
4209 unsigned long offset;
4212 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
4217 Elf_External_Verdef evd;
4219 GET_DATA (offset, evd, "version def");
4221 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4222 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4223 ivd.vd_next = BYTE_GET (evd.vd_next);
4225 offset += ivd.vd_next;
4227 while (ivd.vd_ndx != (vers_data & 0x7fff)
4228 && ivd.vd_next != 0);
4230 offset -= ivd.vd_next;
4231 offset += ivd.vd_aux;
4233 GET_DATA (offset, evda, "version def aux");
4235 ivda.vda_name = BYTE_GET (evda.vda_name);
4237 if (psym->st_name != ivda.vda_name)
4238 printf ((vers_data & 0x8000)
4240 strtab + ivda.vda_name);
4250 if (strtab != string_table)
4256 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
4258 if (do_histogram && buckets != NULL)
4265 int nzero_counts = 0;
4268 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
4270 printf (_(" Length Number %% of total Coverage\n"));
4272 lengths = (int *) calloc (nbuckets, sizeof (int));
4273 if (lengths == NULL)
4275 error (_("Out of memory"));
4278 for (hn = 0; hn < nbuckets; ++hn)
4283 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
4286 if (maxlength < ++lengths[hn])
4291 counts = (int *) calloc (maxlength + 1, sizeof (int));
4294 error (_("Out of memory"));
4298 for (hn = 0; hn < nbuckets; ++hn)
4299 ++counts[lengths [hn]];
4303 printf (" 0 %-10d (%5.1f%%)\n",
4304 counts[0], (counts[0] * 100.0) / nbuckets);
4305 for (si = 1; si <= maxlength; ++si)
4307 nzero_counts += counts[si] * si;
4308 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
4309 si, counts[si], (counts[si] * 100.0) / nbuckets,
4310 (nzero_counts * 100.0) / nsyms);
4318 if (buckets != NULL)
4328 process_syminfo (file)
4329 FILE * file ATTRIBUTE_UNUSED;
4333 if (dynamic_syminfo == NULL
4335 /* No syminfo, this is ok. */
4338 /* There better should be a dynamic symbol section. */
4339 if (dynamic_symbols == NULL || dynamic_strings == NULL)
4343 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
4344 dynamic_syminfo_offset, dynamic_syminfo_nent);
4346 printf (_(" Num: Name BoundTo Flags\n"));
4347 for (i = 0; i < dynamic_syminfo_nent; ++i)
4349 unsigned short int flags = dynamic_syminfo[i].si_flags;
4351 printf ("%4d: %-30s ", i,
4352 dynamic_strings + dynamic_symbols[i].st_name);
4354 switch (dynamic_syminfo[i].si_boundto)
4356 case SYMINFO_BT_SELF:
4357 fputs ("SELF ", stdout);
4359 case SYMINFO_BT_PARENT:
4360 fputs ("PARENT ", stdout);
4363 if (dynamic_syminfo[i].si_boundto > 0
4364 && dynamic_syminfo[i].si_boundto < dynamic_size)
4367 + dynamic_segment[dynamic_syminfo[i].si_boundto].d_un.d_val);
4369 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
4373 if (flags & SYMINFO_FLG_DIRECT)
4375 if (flags & SYMINFO_FLG_PASSTHRU)
4376 printf (" PASSTHRU");
4377 if (flags & SYMINFO_FLG_COPY)
4379 if (flags & SYMINFO_FLG_LAZYLOAD)
4380 printf (" LAZYLOAD");
4388 #ifdef SUPPORT_DISASSEMBLY
4390 disassemble_section (section, file)
4391 Elf32_Internal_Shdr * section;
4394 printf (_("\nAssembly dump of section %s\n"),
4395 SECTION_NAME (section));
4397 /* XXX -- to be done --- XXX */
4404 dump_section (section, file)
4405 Elf32_Internal_Shdr * section;
4408 bfd_size_type bytes;
4410 unsigned char * data;
4411 unsigned char * start;
4413 bytes = section->sh_size;
4417 printf (_("\nSection '%s' has no data to dump.\n"),
4418 SECTION_NAME (section));
4422 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
4424 addr = section->sh_addr;
4426 GET_DATA_ALLOC (section->sh_offset, bytes, start, unsigned char *,
4437 lbytes = (bytes > 16 ? 16 : bytes);
4439 printf (" 0x%8.8lx ", (unsigned long) addr);
4441 switch (elf_header.e_ident [EI_DATA])
4445 for (j = 15; j >= 0; j --)
4448 printf ("%2.2x", data [j]);
4458 for (j = 0; j < 16; j++)
4461 printf ("%2.2x", data [j]);
4471 for (j = 0; j < lbytes; j++)
4474 if (k >= ' ' && k < 0x80)
4493 static unsigned long int
4494 read_leb128 (data, length_return, sign)
4495 unsigned char * data;
4496 int * length_return;
4499 unsigned long int result = 0;
4500 unsigned int num_read = 0;
4509 result |= (byte & 0x7f) << shift;
4514 while (byte & 0x80);
4516 if (length_return != NULL)
4517 * length_return = num_read;
4519 if (sign && (shift < 32) && (byte & 0x40))
4520 result |= -1 << shift;
4525 typedef struct State_Machine_Registers
4527 unsigned long address;
4530 unsigned int column;
4534 /* This variable hold the number of the last entry seen
4535 in the File Table. */
4536 unsigned int last_file_entry;
4539 static SMR state_machine_regs;
4542 reset_state_machine (is_stmt)
4545 state_machine_regs.address = 0;
4546 state_machine_regs.file = 1;
4547 state_machine_regs.line = 1;
4548 state_machine_regs.column = 0;
4549 state_machine_regs.is_stmt = is_stmt;
4550 state_machine_regs.basic_block = 0;
4551 state_machine_regs.end_sequence = 0;
4552 state_machine_regs.last_file_entry = 0;
4555 /* Handled an extend line op. Returns true if this is the end
4558 process_extended_line_op (data, is_stmt, pointer_size)
4559 unsigned char * data;
4563 unsigned char op_code;
4566 unsigned char * name;
4569 len = read_leb128 (data, & bytes_read, 0);
4574 warn (_("badly formed extended line op encountered!"));
4579 op_code = * data ++;
4581 printf (_(" Extended opcode %d: "), op_code);
4585 case DW_LNE_end_sequence:
4586 printf (_("End of Sequence\n\n"));
4587 reset_state_machine (is_stmt);
4590 case DW_LNE_set_address:
4591 adr = byte_get (data, pointer_size);
4592 printf (_("set Address to 0x%lx\n"), adr);
4593 state_machine_regs.address = adr;
4596 case DW_LNE_define_file:
4597 printf (_(" define new File Table entry\n"));
4598 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
4600 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
4602 data += strlen (data) + 1;
4603 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4605 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4607 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4608 printf (_("%s\n\n"), name);
4612 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
4619 /* Size of pointers in the .debug_line section. This information is not
4620 really present in that section. It's obtained before dumping the debug
4621 sections by doing some pre-scan of the .debug_info section. */
4622 static int debug_line_pointer_size = 4;
4625 display_debug_lines (section, start, file)
4626 Elf32_Internal_Shdr * section;
4627 unsigned char * start;
4628 FILE * file ATTRIBUTE_UNUSED;
4630 DWARF2_External_LineInfo * external;
4631 DWARF2_Internal_LineInfo info;
4632 unsigned char * standard_opcodes;
4633 unsigned char * data = start;
4634 unsigned char * end = start + section->sh_size;
4635 unsigned char * end_of_sequence;
4638 printf (_("\nDump of debug contents of section %s:\n\n"),
4639 SECTION_NAME (section));
4643 external = (DWARF2_External_LineInfo *) data;
4645 /* Check the length of the block. */
4646 info.li_length = BYTE_GET (external->li_length);
4647 if (info.li_length > section->sh_size)
4650 (_("The line info appears to be corrupt - the section is too small\n"));
4654 /* Check its version number. */
4655 info.li_version = BYTE_GET (external->li_version);
4656 if (info.li_version != 2)
4658 warn (_("Only DWARF version 2 line info is currently supported.\n"));
4662 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
4663 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
4664 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
4665 info.li_line_base = BYTE_GET (external->li_line_base);
4666 info.li_line_range = BYTE_GET (external->li_line_range);
4667 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
4669 /* Sign extend the line base field. */
4670 info.li_line_base <<= 24;
4671 info.li_line_base >>= 24;
4673 printf (_(" Length: %ld\n"), info.li_length);
4674 printf (_(" DWARF Version: %d\n"), info.li_version);
4675 printf (_(" Prolgue Length: %d\n"), info.li_prologue_length);
4676 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
4677 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
4678 printf (_(" Line Base: %d\n"), info.li_line_base);
4679 printf (_(" Line Range: %d\n"), info.li_line_range);
4680 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
4682 end_of_sequence = data + info.li_length + sizeof (info.li_length);
4684 reset_state_machine (info.li_default_is_stmt);
4686 /* Display the contents of the Opcodes table. */
4687 standard_opcodes = data + sizeof (* external);
4689 printf (_("\n Opcodes:\n"));
4691 for (i = 1; i < info.li_opcode_base; i++)
4692 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
4694 /* Display the contents of the Directory table. */
4695 data = standard_opcodes + info.li_opcode_base - 1;
4698 printf (_("\n The Directory Table is empty.\n"));
4701 printf (_("\n The Directory Table:\n"));
4705 printf (_(" %s\n"), data);
4707 data += strlen (data) + 1;
4711 /* Skip the NUL at the end of the table. */
4714 /* Display the contents of the File Name table. */
4716 printf (_("\n The File Name Table is empty.\n"));
4719 printf (_("\n The File Name Table:\n"));
4720 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
4727 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
4730 data += strlen (data) + 1;
4732 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4734 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4736 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4738 printf (_("%s\n"), name);
4742 /* Skip the NUL at the end of the table. */
4745 /* Now display the statements. */
4746 printf (_("\n Line Number Statements:\n"));
4749 while (data < end_of_sequence)
4751 unsigned char op_code;
4755 op_code = * data ++;
4759 case DW_LNS_extended_op:
4760 data += process_extended_line_op (data, info.li_default_is_stmt,
4761 debug_line_pointer_size);
4765 printf (_(" Copy\n"));
4768 case DW_LNS_advance_pc:
4769 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
4771 state_machine_regs.address += adv;
4772 printf (_(" Advance PC by %d to %lx\n"), adv,
4773 state_machine_regs.address);
4776 case DW_LNS_advance_line:
4777 adv = read_leb128 (data, & bytes_read, 1);
4779 state_machine_regs.line += adv;
4780 printf (_(" Advance Line by %d to %d\n"), adv,
4781 state_machine_regs.line);
4784 case DW_LNS_set_file:
4785 adv = read_leb128 (data, & bytes_read, 0);
4787 printf (_(" Set File Name to entry %d in the File Name Table\n"),
4789 state_machine_regs.file = adv;
4792 case DW_LNS_set_column:
4793 adv = read_leb128 (data, & bytes_read, 0);
4795 printf (_(" Set column to %d\n"), adv);
4796 state_machine_regs.column = adv;
4799 case DW_LNS_negate_stmt:
4800 adv = state_machine_regs.is_stmt;
4802 printf (_(" Set is_stmt to %d\n"), adv);
4803 state_machine_regs.is_stmt = adv;
4806 case DW_LNS_set_basic_block:
4807 printf (_(" Set basic block\n"));
4808 state_machine_regs.basic_block = 1;
4811 case DW_LNS_const_add_pc:
4812 adv = (((255 - info.li_opcode_base) / info.li_line_range)
4813 * info.li_min_insn_length);
4814 state_machine_regs.address += adv;
4815 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
4816 state_machine_regs.address);
4819 case DW_LNS_fixed_advance_pc:
4820 adv = byte_get (data, 2);
4822 state_machine_regs.address += adv;
4823 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
4824 adv, state_machine_regs.address);
4828 op_code -= info.li_opcode_base;
4829 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
4830 state_machine_regs.address += adv;
4831 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
4832 op_code, adv, state_machine_regs.address);
4833 adv = (op_code % info.li_line_range) + info.li_line_base;
4834 state_machine_regs.line += adv;
4835 printf (_(" and Line by %d to %d\n"),
4836 adv, state_machine_regs.line);
4847 display_debug_pubnames (section, start, file)
4848 Elf32_Internal_Shdr * section;
4849 unsigned char * start;
4850 FILE * file ATTRIBUTE_UNUSED;
4852 DWARF2_External_PubNames * external;
4853 DWARF2_Internal_PubNames pubnames;
4854 unsigned char * end;
4856 end = start + section->sh_size;
4858 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
4862 unsigned char * data;
4863 unsigned long offset;
4865 external = (DWARF2_External_PubNames *) start;
4867 pubnames.pn_length = BYTE_GET (external->pn_length);
4868 pubnames.pn_version = BYTE_GET (external->pn_version);
4869 pubnames.pn_offset = BYTE_GET (external->pn_offset);
4870 pubnames.pn_size = BYTE_GET (external->pn_size);
4872 data = start + sizeof (* external);
4873 start += pubnames.pn_length + sizeof (external->pn_length);
4875 if (pubnames.pn_version != 2)
4877 warn (_("Only DWARF 2 pubnames are currently supported"));
4881 printf (_(" Length: %ld\n"),
4882 pubnames.pn_length);
4883 printf (_(" Version: %d\n"),
4884 pubnames.pn_version);
4885 printf (_(" Offset into .debug_info section: %ld\n"),
4886 pubnames.pn_offset);
4887 printf (_(" Size of area in .debug_info section: %ld\n"),
4890 printf (_("\n Offset\tName\n"));
4894 offset = byte_get (data, 4);
4899 printf (" %ld\t\t%s\n", offset, data);
4900 data += strlen (data) + 1;
4903 while (offset != 0);
4916 case DW_TAG_padding: return "DW_TAG_padding";
4917 case DW_TAG_array_type: return "DW_TAG_array_type";
4918 case DW_TAG_class_type: return "DW_TAG_class_type";
4919 case DW_TAG_entry_point: return "DW_TAG_entry_point";
4920 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
4921 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
4922 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
4923 case DW_TAG_label: return "DW_TAG_label";
4924 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
4925 case DW_TAG_member: return "DW_TAG_member";
4926 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
4927 case DW_TAG_reference_type: return "DW_TAG_reference_type";
4928 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
4929 case DW_TAG_string_type: return "DW_TAG_string_type";
4930 case DW_TAG_structure_type: return "DW_TAG_structure_type";
4931 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
4932 case DW_TAG_typedef: return "DW_TAG_typedef";
4933 case DW_TAG_union_type: return "DW_TAG_union_type";
4934 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
4935 case DW_TAG_variant: return "DW_TAG_variant";
4936 case DW_TAG_common_block: return "DW_TAG_common_block";
4937 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
4938 case DW_TAG_inheritance: return "DW_TAG_inheritance";
4939 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
4940 case DW_TAG_module: return "DW_TAG_module";
4941 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
4942 case DW_TAG_set_type: return "DW_TAG_set_type";
4943 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
4944 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
4945 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
4946 case DW_TAG_base_type: return "DW_TAG_base_type";
4947 case DW_TAG_catch_block: return "DW_TAG_catch_block";
4948 case DW_TAG_const_type: return "DW_TAG_const_type";
4949 case DW_TAG_constant: return "DW_TAG_constant";
4950 case DW_TAG_enumerator: return "DW_TAG_enumerator";
4951 case DW_TAG_file_type: return "DW_TAG_file_type";
4952 case DW_TAG_friend: return "DW_TAG_friend";
4953 case DW_TAG_namelist: return "DW_TAG_namelist";
4954 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
4955 case DW_TAG_packed_type: return "DW_TAG_packed_type";
4956 case DW_TAG_subprogram: return "DW_TAG_subprogram";
4957 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
4958 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
4959 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
4960 case DW_TAG_try_block: return "DW_TAG_try_block";
4961 case DW_TAG_variant_part: return "DW_TAG_variant_part";
4962 case DW_TAG_variable: return "DW_TAG_variable";
4963 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
4964 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
4965 case DW_TAG_format_label: return "DW_TAG_format_label";
4966 case DW_TAG_function_template: return "DW_TAG_function_template";
4967 case DW_TAG_class_template: return "DW_TAG_class_template";
4970 static char buffer [100];
4972 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
4979 get_AT_name (attribute)
4980 unsigned long attribute;
4984 case DW_AT_sibling: return "DW_AT_sibling";
4985 case DW_AT_location: return "DW_AT_location";
4986 case DW_AT_name: return "DW_AT_name";
4987 case DW_AT_ordering: return "DW_AT_ordering";
4988 case DW_AT_subscr_data: return "DW_AT_subscr_data";
4989 case DW_AT_byte_size: return "DW_AT_byte_size";
4990 case DW_AT_bit_offset: return "DW_AT_bit_offset";
4991 case DW_AT_bit_size: return "DW_AT_bit_size";
4992 case DW_AT_element_list: return "DW_AT_element_list";
4993 case DW_AT_stmt_list: return "DW_AT_stmt_list";
4994 case DW_AT_low_pc: return "DW_AT_low_pc";
4995 case DW_AT_high_pc: return "DW_AT_high_pc";
4996 case DW_AT_language: return "DW_AT_language";
4997 case DW_AT_member: return "DW_AT_member";
4998 case DW_AT_discr: return "DW_AT_discr";
4999 case DW_AT_discr_value: return "DW_AT_discr_value";
5000 case DW_AT_visibility: return "DW_AT_visibility";
5001 case DW_AT_import: return "DW_AT_import";
5002 case DW_AT_string_length: return "DW_AT_string_length";
5003 case DW_AT_common_reference: return "DW_AT_common_reference";
5004 case DW_AT_comp_dir: return "DW_AT_comp_dir";
5005 case DW_AT_const_value: return "DW_AT_const_value";
5006 case DW_AT_containing_type: return "DW_AT_containing_type";
5007 case DW_AT_default_value: return "DW_AT_default_value";
5008 case DW_AT_inline: return "DW_AT_inline";
5009 case DW_AT_is_optional: return "DW_AT_is_optional";
5010 case DW_AT_lower_bound: return "DW_AT_lower_bound";
5011 case DW_AT_producer: return "DW_AT_producer";
5012 case DW_AT_prototyped: return "DW_AT_prototyped";
5013 case DW_AT_return_addr: return "DW_AT_return_addr";
5014 case DW_AT_start_scope: return "DW_AT_start_scope";
5015 case DW_AT_stride_size: return "DW_AT_stride_size";
5016 case DW_AT_upper_bound: return "DW_AT_upper_bound";
5017 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
5018 case DW_AT_accessibility: return "DW_AT_accessibility";
5019 case DW_AT_address_class: return "DW_AT_address_class";
5020 case DW_AT_artificial: return "DW_AT_artificial";
5021 case DW_AT_base_types: return "DW_AT_base_types";
5022 case DW_AT_calling_convention: return "DW_AT_calling_convention";
5023 case DW_AT_count: return "DW_AT_count";
5024 case DW_AT_data_member_location: return "DW_AT_data_member_location";
5025 case DW_AT_decl_column: return "DW_AT_decl_column";
5026 case DW_AT_decl_file: return "DW_AT_decl_file";
5027 case DW_AT_decl_line: return "DW_AT_decl_line";
5028 case DW_AT_declaration: return "DW_AT_declaration";
5029 case DW_AT_discr_list: return "DW_AT_discr_list";
5030 case DW_AT_encoding: return "DW_AT_encoding";
5031 case DW_AT_external: return "DW_AT_external";
5032 case DW_AT_frame_base: return "DW_AT_frame_base";
5033 case DW_AT_friend: return "DW_AT_friend";
5034 case DW_AT_identifier_case: return "DW_AT_identifier_case";
5035 case DW_AT_macro_info: return "DW_AT_macro_info";
5036 case DW_AT_namelist_items: return "DW_AT_namelist_items";
5037 case DW_AT_priority: return "DW_AT_priority";
5038 case DW_AT_segment: return "DW_AT_segment";
5039 case DW_AT_specification: return "DW_AT_specification";
5040 case DW_AT_static_link: return "DW_AT_static_link";
5041 case DW_AT_type: return "DW_AT_type";
5042 case DW_AT_use_location: return "DW_AT_use_location";
5043 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
5044 case DW_AT_virtuality: return "DW_AT_virtuality";
5045 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
5046 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
5047 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
5048 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
5049 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
5050 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
5051 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
5052 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
5053 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
5054 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
5055 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
5056 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
5057 case DW_AT_sf_names: return "DW_AT_sf_names";
5058 case DW_AT_src_info: return "DW_AT_src_info";
5059 case DW_AT_mac_info: return "DW_AT_mac_info";
5060 case DW_AT_src_coords: return "DW_AT_src_coords";
5061 case DW_AT_body_begin: return "DW_AT_body_begin";
5062 case DW_AT_body_end: return "DW_AT_body_end";
5065 static char buffer [100];
5067 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
5074 get_FORM_name (form)
5079 case DW_FORM_addr: return "DW_FORM_addr";
5080 case DW_FORM_block2: return "DW_FORM_block2";
5081 case DW_FORM_block4: return "DW_FORM_block4";
5082 case DW_FORM_data2: return "DW_FORM_data2";
5083 case DW_FORM_data4: return "DW_FORM_data4";
5084 case DW_FORM_data8: return "DW_FORM_data8";
5085 case DW_FORM_string: return "DW_FORM_string";
5086 case DW_FORM_block: return "DW_FORM_block";
5087 case DW_FORM_block1: return "DW_FORM_block1";
5088 case DW_FORM_data1: return "DW_FORM_data1";
5089 case DW_FORM_flag: return "DW_FORM_flag";
5090 case DW_FORM_sdata: return "DW_FORM_sdata";
5091 case DW_FORM_strp: return "DW_FORM_strp";
5092 case DW_FORM_udata: return "DW_FORM_udata";
5093 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
5094 case DW_FORM_ref1: return "DW_FORM_ref1";
5095 case DW_FORM_ref2: return "DW_FORM_ref2";
5096 case DW_FORM_ref4: return "DW_FORM_ref4";
5097 case DW_FORM_ref8: return "DW_FORM_ref8";
5098 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
5099 case DW_FORM_indirect: return "DW_FORM_indirect";
5102 static char buffer [100];
5104 sprintf (buffer, _("Unknown FORM value: %lx"), form);
5110 /* FIXME: There are better and more effiecint ways to handle
5111 these structures. For now though, I just want something that
5112 is simple to implement. */
5113 typedef struct abbrev_attr
5115 unsigned long attribute;
5117 struct abbrev_attr * next;
5121 typedef struct abbrev_entry
5123 unsigned long entry;
5126 struct abbrev_attr * first_attr;
5127 struct abbrev_attr * last_attr;
5128 struct abbrev_entry * next;
5132 static abbrev_entry * first_abbrev = NULL;
5133 static abbrev_entry * last_abbrev = NULL;
5136 free_abbrevs PARAMS ((void))
5138 abbrev_entry * abbrev;
5140 for (abbrev = first_abbrev; abbrev;)
5142 abbrev_entry * next = abbrev->next;
5145 for (attr = abbrev->first_attr; attr;)
5147 abbrev_attr * next = attr->next;
5157 last_abbrev = first_abbrev = NULL;
5161 add_abbrev (number, tag, children)
5162 unsigned long number;
5166 abbrev_entry * entry;
5168 entry = (abbrev_entry *) malloc (sizeof (* entry));
5174 entry->entry = number;
5176 entry->children = children;
5177 entry->first_attr = NULL;
5178 entry->last_attr = NULL;
5181 if (first_abbrev == NULL)
5182 first_abbrev = entry;
5184 last_abbrev->next = entry;
5186 last_abbrev = entry;
5190 add_abbrev_attr (attribute, form)
5191 unsigned long attribute;
5196 attr = (abbrev_attr *) malloc (sizeof (* attr));
5202 attr->attribute = attribute;
5206 if (last_abbrev->first_attr == NULL)
5207 last_abbrev->first_attr = attr;
5209 last_abbrev->last_attr->next = attr;
5211 last_abbrev->last_attr = attr;
5214 /* Processes the (partial) contents of a .debug_abbrev section.
5215 Returns NULL if the end of the section was encountered.
5216 Returns the address after the last byte read if the end of
5217 an abbreviation set was found. */
5219 static unsigned char *
5220 process_abbrev_section (start, end)
5221 unsigned char * start;
5222 unsigned char * end;
5224 if (first_abbrev != NULL)
5230 unsigned long entry;
5232 unsigned long attribute;
5235 entry = read_leb128 (start, & bytes_read, 0);
5236 start += bytes_read;
5238 /* A single zero is supposed to end the section according
5239 to the standard. If there's more, then signal that to
5242 return start == end ? NULL : start;
5244 tag = read_leb128 (start, & bytes_read, 0);
5245 start += bytes_read;
5247 children = * start ++;
5249 add_abbrev (entry, tag, children);
5255 attribute = read_leb128 (start, & bytes_read, 0);
5256 start += bytes_read;
5258 form = read_leb128 (start, & bytes_read, 0);
5259 start += bytes_read;
5262 add_abbrev_attr (attribute, form);
5264 while (attribute != 0);
5272 display_debug_abbrev (section, start, file)
5273 Elf32_Internal_Shdr * section;
5274 unsigned char * start;
5275 FILE * file ATTRIBUTE_UNUSED;
5277 abbrev_entry * entry;
5278 unsigned char * end = start + section->sh_size;
5280 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
5284 start = process_abbrev_section (start, end);
5286 printf (_(" Number TAG\n"));
5288 for (entry = first_abbrev; entry; entry = entry->next)
5292 printf (_(" %ld %s [%s]\n"),
5294 get_TAG_name (entry->tag),
5295 entry->children ? _("has children") : _("no children"));
5297 for (attr = entry->first_attr; attr; attr = attr->next)
5299 printf (_(" %-18s %s\n"),
5300 get_AT_name (attr->attribute),
5301 get_FORM_name (attr->form));
5313 static unsigned char *
5314 display_block (data, length)
5315 unsigned char * data;
5316 unsigned long length;
5318 printf (_(" %lu byte block: "), length);
5321 printf ("%lx ", (unsigned long) byte_get (data ++, 1));
5327 decode_location_expression (data, pointer_size)
5328 unsigned char * data;
5329 unsigned int pointer_size;
5333 unsigned long uvalue;
5340 printf ("DW_OP_addr: %lx", (unsigned long) byte_get (data, pointer_size));
5343 printf ("DW_OP_deref");
5346 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data, 1));
5349 printf ("DW_OP_const1s: %ld", (long) byte_get (data, 1));
5352 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
5355 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
5358 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
5361 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
5364 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
5365 (unsigned long) byte_get (data + 4, 4));
5368 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
5369 (long) byte_get (data + 4, 4));
5372 printf ("DW_OP_constu: %lu", read_leb128 (data, NULL, 0));
5375 printf ("DW_OP_consts: %ld", read_leb128 (data, NULL, 1));
5378 printf ("DW_OP_dup");
5381 printf ("DW_OP_drop");
5384 printf ("DW_OP_over");
5387 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data, 1));
5390 printf ("DW_OP_swap");
5393 printf ("DW_OP_rot");
5396 printf ("DW_OP_xderef");
5399 printf ("DW_OP_abs");
5402 printf ("DW_OP_and");
5405 printf ("DW_OP_div");
5408 printf ("DW_OP_minus");
5411 printf ("DW_OP_mod");
5414 printf ("DW_OP_mul");
5417 printf ("DW_OP_neg");
5420 printf ("DW_OP_not");
5423 printf ("DW_OP_or");
5426 printf ("DW_OP_plus");
5428 case DW_OP_plus_uconst:
5429 printf ("DW_OP_plus_uconst: %lu", read_leb128 (data, NULL, 0));
5432 printf ("DW_OP_shl");
5435 printf ("DW_OP_shr");
5438 printf ("DW_OP_shra");
5441 printf ("DW_OP_xor");
5444 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
5447 printf ("DW_OP_eq");
5450 printf ("DW_OP_ge");
5453 printf ("DW_OP_gt");
5456 printf ("DW_OP_le");
5459 printf ("DW_OP_lt");
5462 printf ("DW_OP_ne");
5465 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
5468 printf ("DW_OP_lit0");
5471 printf ("DW_OP_lit1");
5474 printf ("DW_OP_lit2");
5477 printf ("DW_OP_lit3");
5480 printf ("DW_OP_lit4");
5483 printf ("DW_OP_lit5");
5486 printf ("DW_OP_lit6");
5489 printf ("DW_OP_lit7");
5492 printf ("DW_OP_lit8");
5495 printf ("DW_OP_lit9");
5498 printf ("DW_OP_lit10");
5501 printf ("DW_OP_lit11");
5504 printf ("DW_OP_lit12");
5507 printf ("DW_OP_lit13");
5510 printf ("DW_OP_lit14");
5513 printf ("DW_OP_lit15");
5516 printf ("DW_OP_lit16");
5519 printf ("DW_OP_lit17");
5522 printf ("DW_OP_lit18");
5525 printf ("DW_OP_lit19");
5528 printf ("DW_OP_lit20");
5531 printf ("DW_OP_lit21");
5534 printf ("DW_OP_lit22");
5537 printf ("DW_OP_lit23");
5540 printf ("DW_OP_lit24");
5543 printf ("DW_OP_lit25");
5546 printf ("DW_OP_lit26");
5549 printf ("DW_OP_lit27");
5552 printf ("DW_OP_lit28");
5555 printf ("DW_OP_lit29");
5558 printf ("DW_OP_lit30");
5561 printf ("DW_OP_lit31");
5564 printf ("DW_OP_reg0");
5567 printf ("DW_OP_reg1");
5570 printf ("DW_OP_reg2");
5573 printf ("DW_OP_reg3");
5576 printf ("DW_OP_reg4");
5579 printf ("DW_OP_reg5");
5582 printf ("DW_OP_reg6");
5585 printf ("DW_OP_reg7");
5588 printf ("DW_OP_reg8");
5591 printf ("DW_OP_reg9");
5594 printf ("DW_OP_reg10");
5597 printf ("DW_OP_reg11");
5600 printf ("DW_OP_reg12");
5603 printf ("DW_OP_reg13");
5606 printf ("DW_OP_reg14");
5609 printf ("DW_OP_reg15");
5612 printf ("DW_OP_reg16");
5615 printf ("DW_OP_reg17");
5618 printf ("DW_OP_reg18");
5621 printf ("DW_OP_reg19");
5624 printf ("DW_OP_reg20");
5627 printf ("DW_OP_reg21");
5630 printf ("DW_OP_reg22");
5633 printf ("DW_OP_reg23");
5636 printf ("DW_OP_reg24");
5639 printf ("DW_OP_reg25");
5642 printf ("DW_OP_reg26");
5645 printf ("DW_OP_reg27");
5648 printf ("DW_OP_reg28");
5651 printf ("DW_OP_reg29");
5654 printf ("DW_OP_reg30");
5657 printf ("DW_OP_reg31");
5660 printf ("DW_OP_breg0: %ld", read_leb128 (data, NULL, 1));
5663 printf ("DW_OP_breg1: %ld", read_leb128 (data, NULL, 1));
5666 printf ("DW_OP_breg2: %ld", read_leb128 (data, NULL, 1));
5669 printf ("DW_OP_breg3: %ld", read_leb128 (data, NULL, 1));
5672 printf ("DW_OP_breg4: %ld", read_leb128 (data, NULL, 1));
5675 printf ("DW_OP_breg5: %ld", read_leb128 (data, NULL, 1));
5678 printf ("DW_OP_breg6: %ld", read_leb128 (data, NULL, 1));
5681 printf ("DW_OP_breg7: %ld", read_leb128 (data, NULL, 1));
5684 printf ("DW_OP_breg8: %ld", read_leb128 (data, NULL, 1));
5687 printf ("DW_OP_breg9: %ld", read_leb128 (data, NULL, 1));
5690 printf ("DW_OP_breg10: %ld", read_leb128 (data, NULL, 1));
5693 printf ("DW_OP_breg11: %ld", read_leb128 (data, NULL, 1));
5696 printf ("DW_OP_breg12: %ld", read_leb128 (data, NULL, 1));
5699 printf ("DW_OP_breg13: %ld", read_leb128 (data, NULL, 1));
5702 printf ("DW_OP_breg14: %ld", read_leb128 (data, NULL, 1));
5705 printf ("DW_OP_breg15: %ld", read_leb128 (data, NULL, 1));
5708 printf ("DW_OP_breg16: %ld", read_leb128 (data, NULL, 1));
5711 printf ("DW_OP_breg17: %ld", read_leb128 (data, NULL, 1));
5714 printf ("DW_OP_breg18: %ld", read_leb128 (data, NULL, 1));
5717 printf ("DW_OP_breg19: %ld", read_leb128 (data, NULL, 1));
5720 printf ("DW_OP_breg20: %ld", read_leb128 (data, NULL, 1));
5723 printf ("DW_OP_breg21: %ld", read_leb128 (data, NULL, 1));
5726 printf ("DW_OP_breg22: %ld", read_leb128 (data, NULL, 1));
5729 printf ("DW_OP_breg23: %ld", read_leb128 (data, NULL, 1));
5732 printf ("DW_OP_breg24: %ld", read_leb128 (data, NULL, 1));
5735 printf ("DW_OP_breg25: %ld", read_leb128 (data, NULL, 1));
5738 printf ("DW_OP_breg26: %ld", read_leb128 (data, NULL, 1));
5741 printf ("DW_OP_breg27: %ld", read_leb128 (data, NULL, 1));
5744 printf ("DW_OP_breg28: %ld", read_leb128 (data, NULL, 1));
5747 printf ("DW_OP_breg29: %ld", read_leb128 (data, NULL, 1));
5750 printf ("DW_OP_breg30: %ld", read_leb128 (data, NULL, 1));
5753 printf ("DW_OP_breg31: %ld", read_leb128 (data, NULL, 1));
5756 printf ("DW_OP_regx: %lu", read_leb128 (data, NULL, 0));
5759 printf ("DW_OP_fbreg: %ld", read_leb128 (data, NULL, 1));
5762 uvalue = read_leb128 (data, &bytes_read, 0);
5763 printf ("DW_OP_bregx: %lu %ld", uvalue,
5764 read_leb128 (data + bytes_read, NULL, 1));
5767 printf ("DW_OP_piece: %lu", read_leb128 (data, NULL, 0));
5769 case DW_OP_deref_size:
5770 printf ("DW_OP_deref_size: %ld", (long) byte_get (data, 1));
5772 case DW_OP_xderef_size:
5773 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data, 1));
5776 printf ("DW_OP_nop");
5780 if (op >= DW_OP_lo_user
5781 && op <= DW_OP_hi_user)
5782 printf (_("(User defined location op)"));
5784 printf (_("(Unknown location op)"));
5790 static unsigned char *
5791 read_and_display_attr (attribute, form, data, pointer_size)
5792 unsigned long attribute;
5794 unsigned char * data;
5795 unsigned long pointer_size;
5797 unsigned long uvalue = 0;
5798 unsigned char * block_start = NULL;
5802 printf (" %-18s:", get_AT_name (attribute));
5806 case DW_FORM_ref_addr:
5811 case DW_FORM_ref_udata:
5817 case DW_FORM_ref_addr:
5819 uvalue = byte_get (data, pointer_size);
5820 printf (is_ref ? " <%x>" : " %#x", uvalue);
5821 data += pointer_size;
5827 uvalue = byte_get (data ++, 1);
5828 printf (is_ref ? " <%x>" : " %d", uvalue);
5833 uvalue = byte_get (data, 2);
5835 printf (is_ref ? " <%x>" : " %d", uvalue);
5840 uvalue = byte_get (data, 4);
5842 printf (is_ref ? " <%x>" : " %d", uvalue);
5847 uvalue = byte_get (data, 4);
5848 printf (" %lx", uvalue);
5849 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
5853 case DW_FORM_string:
5854 printf (" %s", data);
5855 data += strlen (data) + 1;
5859 uvalue = read_leb128 (data, & bytes_read, 1);
5861 printf (" %ld", (long) uvalue);
5864 case DW_FORM_ref_udata:
5866 uvalue = read_leb128 (data, & bytes_read, 0);
5868 printf (is_ref ? " <%lx>" : " %ld", uvalue);
5872 uvalue = read_leb128 (data, & bytes_read, 0);
5873 block_start = data + bytes_read;
5874 data = display_block (block_start, uvalue);
5875 uvalue = * block_start;
5878 case DW_FORM_block1:
5879 uvalue = byte_get (data, 1);
5880 block_start = data + 1;
5881 data = display_block (block_start, uvalue);
5882 uvalue = * block_start;
5885 case DW_FORM_block2:
5886 uvalue = byte_get (data, 2);
5887 block_start = data + 2;
5888 data = display_block (block_start, uvalue);
5889 uvalue = * block_start;
5892 case DW_FORM_block4:
5893 uvalue = byte_get (data, 4);
5894 block_start = data + 4;
5895 data = display_block (block_start, uvalue);
5896 uvalue = * block_start;
5900 case DW_FORM_indirect:
5901 warn (_("Unable to handle FORM: %d"), form);
5905 warn (_("Unrecognised form: %d"), form);
5909 /* For some attributes we can display futher information. */
5918 case DW_INL_not_inlined: printf (_("(not inlined)")); break;
5919 case DW_INL_inlined: printf (_("(inlined)")); break;
5920 case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
5921 case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break;
5922 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break;
5926 case DW_AT_frame_base:
5927 if (uvalue >= DW_OP_reg0 && uvalue <= DW_OP_reg31)
5928 printf ("(reg %ld)", uvalue - DW_OP_reg0);
5931 case DW_AT_language:
5934 case DW_LANG_C: printf ("(non-ANSI C)"); break;
5935 case DW_LANG_C89: printf ("(ANSI C)"); break;
5936 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
5937 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
5938 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
5939 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
5940 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
5941 case DW_LANG_Ada83: printf ("(Ada)"); break;
5942 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
5943 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
5944 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
5945 default: printf ("(Unknown: %lx)", uvalue); break;
5949 case DW_AT_encoding:
5952 case DW_ATE_void: printf ("(void)"); break;
5953 case DW_ATE_address: printf ("(machine address)"); break;
5954 case DW_ATE_boolean: printf ("(boolean)"); break;
5955 case DW_ATE_complex_float: printf ("(complex float)"); break;
5956 case DW_ATE_float: printf ("(float)"); break;
5957 case DW_ATE_signed: printf ("(signed)"); break;
5958 case DW_ATE_signed_char: printf ("(signed char)"); break;
5959 case DW_ATE_unsigned: printf ("(unsigned)"); break;
5960 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
5962 if (uvalue >= DW_ATE_lo_user
5963 && uvalue <= DW_ATE_hi_user)
5964 printf ("(user defined type)");
5966 printf ("(unknown type)");
5971 case DW_AT_accessibility:
5974 case DW_ACCESS_public: printf ("(public)"); break;
5975 case DW_ACCESS_protected: printf ("(protected)"); break;
5976 case DW_ACCESS_private: printf ("(private)"); break;
5977 default: printf ("(unknown accessibility)"); break;
5981 case DW_AT_visibility:
5984 case DW_VIS_local: printf ("(local)"); break;
5985 case DW_VIS_exported: printf ("(exported)"); break;
5986 case DW_VIS_qualified: printf ("(qualified)"); break;
5987 default: printf ("(unknown visibility)"); break;
5991 case DW_AT_virtuality:
5994 case DW_VIRTUALITY_none: printf ("(none)"); break;
5995 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
5996 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
5997 default: printf ("(unknown virtuality)"); break;
6001 case DW_AT_identifier_case:
6004 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
6005 case DW_ID_up_case: printf ("(up_case)"); break;
6006 case DW_ID_down_case: printf ("(down_case)"); break;
6007 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
6008 default: printf ("(unknown case)"); break;
6012 case DW_AT_calling_convention:
6015 case DW_CC_normal: printf ("(normal)"); break;
6016 case DW_CC_program: printf ("(program)"); break;
6017 case DW_CC_nocall: printf ("(nocall)"); break;
6019 if (uvalue >= DW_CC_lo_user
6020 && uvalue <= DW_CC_hi_user)
6021 printf ("(user defined)");
6023 printf ("(unknown convention)");
6027 case DW_AT_location:
6028 case DW_AT_data_member_location:
6029 case DW_AT_vtable_elem_location:
6031 decode_location_expression (block_start, pointer_size);
6044 display_debug_info (section, start, file)
6045 Elf32_Internal_Shdr * section;
6046 unsigned char * start;
6049 unsigned char * end = start + section->sh_size;
6050 unsigned char * section_begin = start;
6052 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
6056 DWARF2_External_CompUnit * external;
6057 DWARF2_Internal_CompUnit compunit;
6058 unsigned char * tags;
6062 external = (DWARF2_External_CompUnit *) start;
6064 compunit.cu_length = BYTE_GET (external->cu_length);
6065 compunit.cu_version = BYTE_GET (external->cu_version);
6066 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
6067 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
6069 tags = start + sizeof (* external);
6070 start += compunit.cu_length + sizeof (external->cu_length);
6072 if (compunit.cu_version != 2)
6074 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
6078 printf (_(" Compilation Unit:\n"));
6079 printf (_(" Length: %ld\n"), compunit.cu_length);
6080 printf (_(" Version: %d\n"), compunit.cu_version);
6081 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
6082 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
6084 if (first_abbrev != NULL)
6087 /* Read in the abbrevs used by this compilation unit. */
6090 Elf32_Internal_Shdr * sec;
6091 unsigned char * begin;
6093 /* Locate the .debug_abbrev section and process it. */
6094 for (i = 0, sec = section_headers;
6095 i < elf_header.e_shnum;
6097 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
6100 if (i == -1 || sec->sh_size == 0)
6102 warn (_("Unable to locate .debug_abbrev section!\n"));
6106 GET_DATA_ALLOC (sec->sh_offset, sec->sh_size, begin, unsigned char *,
6107 "debug_abbrev section data");
6109 process_abbrev_section (begin + compunit.cu_abbrev_offset,
6110 begin + sec->sh_size);
6116 while (tags < start)
6119 unsigned long abbrev_number;
6120 abbrev_entry * entry;
6123 abbrev_number = read_leb128 (tags, & bytes_read, 0);
6126 /* A null DIE marks the end of a list of children. */
6127 if (abbrev_number == 0)
6133 /* Scan through the abbreviation list until we reach the
6135 for (entry = first_abbrev;
6136 entry && entry->entry != abbrev_number;
6137 entry = entry->next)
6142 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
6147 printf (_(" <%d><%x>: Abbrev Number: %lu (%s)\n"),
6148 level, tags - section_begin - bytes_read,
6150 get_TAG_name (entry->tag));
6152 for (attr = entry->first_attr; attr; attr = attr->next)
6153 tags = read_and_display_attr (attr->attribute,
6156 compunit.cu_pointer_size);
6158 if (entry->children)
6169 display_debug_aranges (section, start, file)
6170 Elf32_Internal_Shdr * section;
6171 unsigned char * start;
6172 FILE * file ATTRIBUTE_UNUSED;
6174 unsigned char * end = start + section->sh_size;
6176 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
6180 DWARF2_External_ARange * external;
6181 DWARF2_Internal_ARange arange;
6182 unsigned char * ranges;
6183 unsigned long length;
6184 unsigned long address;
6187 external = (DWARF2_External_ARange *) start;
6189 arange.ar_length = BYTE_GET (external->ar_length);
6190 arange.ar_version = BYTE_GET (external->ar_version);
6191 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
6192 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
6193 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
6195 printf (_(" Length: %ld\n"), arange.ar_length);
6196 printf (_(" Version: %d\n"), arange.ar_version);
6197 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
6198 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
6199 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
6201 printf (_("\n Address Length\n"));
6203 ranges = start + sizeof (* external);
6205 /* Must pad to an alignment boundary that is twice the pointer size. */
6206 excess = sizeof (*external) % (2 * arange.ar_pointer_size);
6208 ranges += (2 * arange.ar_pointer_size) - excess;
6212 address = byte_get (ranges, arange.ar_pointer_size);
6214 ranges += arange.ar_pointer_size;
6216 length = byte_get (ranges, arange.ar_pointer_size);
6218 ranges += arange.ar_pointer_size;
6220 /* A pair of zeros marks the end of the list. */
6221 if (address == 0 && length == 0)
6224 printf (" %8.8lx %lu\n", address, length);
6227 start += arange.ar_length + sizeof (external->ar_length);
6237 display_debug_not_supported (section, start, file)
6238 Elf32_Internal_Shdr * section;
6239 unsigned char * start ATTRIBUTE_UNUSED;
6240 FILE * file ATTRIBUTE_UNUSED;
6242 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
6243 SECTION_NAME (section));
6248 /* Pre-scan the .debug_info section to record the size of address.
6249 When dumping the .debug_line, we use that size information, assuming
6250 that all compilation units have the same address size. */
6252 prescan_debug_info (section, start, file)
6253 Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
6254 unsigned char * start;
6255 FILE * file ATTRIBUTE_UNUSED;
6257 DWARF2_External_CompUnit * external;
6259 external = (DWARF2_External_CompUnit *) start;
6261 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
6265 /* A structure containing the name of a debug section and a pointer
6266 to a function that can decode it. The third field is a prescan
6267 function to be run over the section before displaying any of the
6272 int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
6273 int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
6277 { ".debug_info", display_debug_info, prescan_debug_info },
6278 { ".debug_abbrev", display_debug_abbrev, NULL },
6279 { ".debug_line", display_debug_lines, NULL },
6280 { ".debug_aranges", display_debug_aranges, NULL },
6281 { ".debug_pubnames", display_debug_pubnames, NULL },
6282 { ".debug_macinfo", display_debug_not_supported, NULL },
6283 { ".debug_frame", display_debug_not_supported, NULL },
6284 { ".debug_str", display_debug_not_supported, NULL },
6285 { ".debug_static_func", display_debug_not_supported, NULL },
6286 { ".debug_static_vars", display_debug_not_supported, NULL },
6287 { ".debug_types", display_debug_not_supported, NULL },
6288 { ".debug_weaknames", display_debug_not_supported, NULL }
6292 display_debug_section (section, file)
6293 Elf32_Internal_Shdr * section;
6296 char * name = SECTION_NAME (section);
6297 bfd_size_type length;
6298 unsigned char * start;
6301 length = section->sh_size;
6304 printf (_("\nSection '%s' has no debugging data.\n"), name);
6308 GET_DATA_ALLOC (section->sh_offset, length, start, unsigned char *,
6309 "debug section data");
6311 /* See if we know how to display the contents of this section. */
6312 for (i = NUM_ELEM (debug_displays); i--;)
6313 if (strcmp (debug_displays[i].name, name) == 0)
6315 debug_displays[i].display (section, start, file);
6320 printf (_("Unrecognised debug section: %s\n"), name);
6324 /* If we loaded in the abbrev section at some point,
6325 we must release it here. */
6326 if (first_abbrev != NULL)
6333 process_section_contents (file)
6336 Elf32_Internal_Shdr * section;
6342 /* Pre-scan the debug sections to find some debug information not
6343 present in some of them. For the .debug_line, we must find out the
6344 size of address (specified in .debug_info and .debug_aranges). */
6345 for (i = 0, section = section_headers;
6346 i < elf_header.e_shnum && i < num_dump_sects;
6349 char * name = SECTION_NAME (section);
6352 if (section->sh_size == 0)
6355 /* See if there is some pre-scan operation for this section. */
6356 for (j = NUM_ELEM (debug_displays); j--;)
6357 if (strcmp (debug_displays[j].name, name) == 0)
6359 if (debug_displays[j].prescan != NULL)
6361 bfd_size_type length;
6362 unsigned char * start;
6364 length = section->sh_size;
6365 GET_DATA_ALLOC (section->sh_offset, length, start, unsigned char *,
6366 "debug section data");
6368 debug_displays[j].prescan (section, start, file);
6376 for (i = 0, section = section_headers;
6377 i < elf_header.e_shnum && i < num_dump_sects;
6380 #ifdef SUPPORT_DISASSEMBLY
6381 if (dump_sects[i] & DISASS_DUMP)
6382 disassemble_section (section, file);
6384 if (dump_sects[i] & HEX_DUMP)
6385 dump_section (section, file);
6387 if (dump_sects[i] & DEBUG_DUMP)
6388 display_debug_section (section, file);
6391 if (i < num_dump_sects)
6392 warn (_("Some sections were not dumped because they do not exist!\n"));
6398 process_mips_fpe_exception (mask)
6404 if (mask & OEX_FPU_INEX)
6405 fputs ("INEX", stdout), first = 0;
6406 if (mask & OEX_FPU_UFLO)
6407 printf ("%sUFLO", first ? "" : "|"), first = 0;
6408 if (mask & OEX_FPU_OFLO)
6409 printf ("%sOFLO", first ? "" : "|"), first = 0;
6410 if (mask & OEX_FPU_DIV0)
6411 printf ("%sDIV0", first ? "" : "|"), first = 0;
6412 if (mask & OEX_FPU_INVAL)
6413 printf ("%sINVAL", first ? "" : "|");
6416 fputs ("0", stdout);
6420 process_mips_specific (file)
6423 Elf_Internal_Dyn * entry;
6424 size_t liblist_offset = 0;
6425 size_t liblistno = 0;
6426 size_t conflictsno = 0;
6427 size_t options_offset = 0;
6428 size_t conflicts_offset = 0;
6430 /* We have a lot of special sections. Thanks SGI! */
6431 if (dynamic_segment == NULL)
6432 /* No information available. */
6435 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
6436 switch (entry->d_tag)
6438 case DT_MIPS_LIBLIST:
6439 liblist_offset = entry->d_un.d_val - loadaddr;
6441 case DT_MIPS_LIBLISTNO:
6442 liblistno = entry->d_un.d_val;
6444 case DT_MIPS_OPTIONS:
6445 options_offset = entry->d_un.d_val - loadaddr;
6447 case DT_MIPS_CONFLICT:
6448 conflicts_offset = entry->d_un.d_val - loadaddr;
6450 case DT_MIPS_CONFLICTNO:
6451 conflictsno = entry->d_un.d_val;
6457 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
6459 Elf32_External_Lib * elib;
6462 GET_DATA_ALLOC (liblist_offset, liblistno * sizeof (Elf32_External_Lib),
6463 elib, Elf32_External_Lib *, "liblist");
6465 printf ("\nSection '.liblist' contains %d entries:\n", liblistno);
6466 fputs (" Library Time Stamp Checksum Version Flags\n",
6469 for (cnt = 0; cnt < liblistno; ++cnt)
6475 liblist.l_name = BYTE_GET (elib[cnt].l_name);
6476 time = BYTE_GET (elib[cnt].l_time_stamp);
6477 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
6478 liblist.l_version = BYTE_GET (elib[cnt].l_version);
6479 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
6481 strftime (timebuf, 20, "%Y-%m-%dT%H:%M:%S", gmtime (&time));
6483 printf ("%3d: %-20s %s %#10lx %-7ld", cnt,
6484 dynamic_strings + liblist.l_name, timebuf,
6485 liblist.l_checksum, liblist.l_version);
6487 if (liblist.l_flags == 0)
6497 { " EXACT_MATCH", LL_EXACT_MATCH },
6498 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
6499 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
6500 { " EXPORTS", LL_EXPORTS },
6501 { " DELAY_LOAD", LL_DELAY_LOAD },
6502 { " DELTA", LL_DELTA }
6504 int flags = liblist.l_flags;
6508 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
6510 if ((flags & l_flags_vals[fcnt].bit) != 0)
6512 fputs (l_flags_vals[fcnt].name, stdout);
6513 flags ^= l_flags_vals[fcnt].bit;
6516 printf (" %#x", (unsigned int) flags);
6525 if (options_offset != 0)
6527 Elf_External_Options * eopt;
6528 Elf_Internal_Shdr * sect = section_headers;
6529 Elf_Internal_Options * iopt;
6530 Elf_Internal_Options * option;
6534 /* Find the section header so that we get the size. */
6535 while (sect->sh_type != SHT_MIPS_OPTIONS)
6538 GET_DATA_ALLOC (options_offset, sect->sh_size, eopt,
6539 Elf_External_Options *, "options");
6541 iopt = (Elf_Internal_Options *) malloc ((sect->sh_size / sizeof (eopt))
6545 error (_("Out of memory"));
6551 while (offset < sect->sh_size)
6553 Elf_External_Options * eoption;
6555 eoption = (Elf_External_Options *) ((char *) eopt + offset);
6557 option->kind = BYTE_GET (eoption->kind);
6558 option->size = BYTE_GET (eoption->size);
6559 option->section = BYTE_GET (eoption->section);
6560 option->info = BYTE_GET (eoption->info);
6562 offset += option->size;
6567 printf (_("\nSection '%s' contains %d entries:\n"),
6568 string_table + sect->sh_name, cnt);
6575 switch (option->kind)
6578 /* This shouldn't happen. */
6579 printf (" NULL %d %lx", option->section, option->info);
6582 printf (" REGINFO ");
6583 if (elf_header.e_machine == EM_MIPS)
6586 Elf32_External_RegInfo *ereg;
6587 Elf32_RegInfo reginfo;
6589 ereg = (Elf32_External_RegInfo *) (option + 1);
6590 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
6591 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
6592 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
6593 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
6594 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
6595 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
6597 printf ("GPR %08lx GP 0x%lx\n",
6599 (unsigned long) reginfo.ri_gp_value);
6600 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
6601 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
6602 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
6607 Elf64_External_RegInfo * ereg;
6608 Elf64_Internal_RegInfo reginfo;
6610 ereg = (Elf64_External_RegInfo *) (option + 1);
6611 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
6612 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
6613 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
6614 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
6615 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
6616 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
6618 printf ("GPR %08lx GP 0x",
6619 reginfo.ri_gprmask);
6620 printf_vma (reginfo.ri_gp_value);
6623 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
6624 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
6625 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
6629 case ODK_EXCEPTIONS:
6630 fputs (" EXCEPTIONS fpe_min(", stdout);
6631 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
6632 fputs (") fpe_max(", stdout);
6633 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
6634 fputs (")", stdout);
6636 if (option->info & OEX_PAGE0)
6637 fputs (" PAGE0", stdout);
6638 if (option->info & OEX_SMM)
6639 fputs (" SMM", stdout);
6640 if (option->info & OEX_FPDBUG)
6641 fputs (" FPDBUG", stdout);
6642 if (option->info & OEX_DISMISS)
6643 fputs (" DISMISS", stdout);
6646 fputs (" PAD ", stdout);
6647 if (option->info & OPAD_PREFIX)
6648 fputs (" PREFIX", stdout);
6649 if (option->info & OPAD_POSTFIX)
6650 fputs (" POSTFIX", stdout);
6651 if (option->info & OPAD_SYMBOL)
6652 fputs (" SYMBOL", stdout);
6655 fputs (" HWPATCH ", stdout);
6656 if (option->info & OHW_R4KEOP)
6657 fputs (" R4KEOP", stdout);
6658 if (option->info & OHW_R8KPFETCH)
6659 fputs (" R8KPFETCH", stdout);
6660 if (option->info & OHW_R5KEOP)
6661 fputs (" R5KEOP", stdout);
6662 if (option->info & OHW_R5KCVTL)
6663 fputs (" R5KCVTL", stdout);
6666 fputs (" FILL ", stdout);
6667 /* XXX Print content of info word? */
6670 fputs (" TAGS ", stdout);
6671 /* XXX Print content of info word? */
6674 fputs (" HWAND ", stdout);
6675 if (option->info & OHWA0_R4KEOP_CHECKED)
6676 fputs (" R4KEOP_CHECKED", stdout);
6677 if (option->info & OHWA0_R4KEOP_CLEAN)
6678 fputs (" R4KEOP_CLEAN", stdout);
6681 fputs (" HWOR ", stdout);
6682 if (option->info & OHWA0_R4KEOP_CHECKED)
6683 fputs (" R4KEOP_CHECKED", stdout);
6684 if (option->info & OHWA0_R4KEOP_CLEAN)
6685 fputs (" R4KEOP_CLEAN", stdout);
6688 printf (" GP_GROUP %#06lx self-contained %#06lx",
6689 option->info & OGP_GROUP,
6690 (option->info & OGP_SELF) >> 16);
6693 printf (" IDENT %#06lx self-contained %#06lx",
6694 option->info & OGP_GROUP,
6695 (option->info & OGP_SELF) >> 16);
6698 /* This shouldn't happen. */
6699 printf (" %3d ??? %d %lx",
6700 option->kind, option->section, option->info);
6704 len = sizeof (*eopt);
6705 while (len < option->size)
6706 if (((char *) option)[len] >= ' '
6707 && ((char *) option)[len] < 0x7f)
6708 printf ("%c", ((char *) option)[len++]);
6710 printf ("\\%03o", ((char *) option)[len++]);
6712 fputs ("\n", stdout);
6719 if (conflicts_offset != 0 && conflictsno != 0)
6721 Elf32_External_Conflict * econf32;
6722 Elf64_External_Conflict * econf64;
6723 Elf32_Conflict * iconf;
6726 if (dynamic_symbols == NULL)
6728 error (_("conflict list with without table"));
6732 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (*iconf));
6735 error (_("Out of memory"));
6741 GET_DATA_ALLOC (conflicts_offset, conflictsno * sizeof (*econf32),
6742 econf32, Elf32_External_Conflict *, "conflict");
6744 for (cnt = 0; cnt < conflictsno; ++cnt)
6745 iconf[cnt] = BYTE_GET (econf32[cnt]);
6749 GET_DATA_ALLOC (conflicts_offset, conflictsno * sizeof (*econf64),
6750 econf64, Elf64_External_Conflict *, "conflict");
6752 for (cnt = 0; cnt < conflictsno; ++cnt)
6753 iconf[cnt] = BYTE_GET (econf64[cnt]);
6756 printf (_("\nSection '.conflict' contains %d entries:\n"), conflictsno);
6757 puts (_(" Num: Index Value Name"));
6759 for (cnt = 0; cnt < conflictsno; ++cnt)
6761 Elf_Internal_Sym * psym = &dynamic_symbols[iconf[cnt]];
6763 printf ("%5u: %8lu ", cnt, iconf[cnt]);
6764 print_vma (psym->st_value, FULL_HEX);
6765 printf (" %s\n", dynamic_strings + psym->st_name);
6775 get_note_type (e_type)
6778 static char buff[64];
6782 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
6783 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
6784 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
6785 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
6786 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
6787 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
6788 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
6789 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
6790 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
6792 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
6797 /* Note that by the ELF standard, the name field is already null byte
6798 terminated, and namesz includes the terminating null byte.
6799 I.E. the value of namesz for the name "FSF" is 4.
6801 If the value of namesz is zero, there is no name present. */
6803 process_note (pnote)
6804 Elf32_Internal_Note * pnote;
6806 printf (" %s\t\t0x%08lx\t%s\n",
6807 pnote->namesz ? pnote->namedata : "(NONE)",
6808 pnote->descsz, get_note_type (pnote->type));
6814 process_corefile_note_segment (file, offset, length)
6819 Elf_External_Note * pnotes;
6820 Elf_External_Note * external;
6826 GET_DATA_ALLOC (offset, length, pnotes, Elf_External_Note *, "notes");
6830 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"), offset, length);
6831 printf (_(" Owner\t\tData size\tDescription\n"));
6833 while (external < (Elf_External_Note *)((char *) pnotes + length))
6835 Elf32_Internal_Note inote;
6838 inote.type = BYTE_GET (external->type);
6839 inote.namesz = BYTE_GET (external->namesz);
6840 inote.namedata = external->name;
6841 inote.descsz = BYTE_GET (external->descsz);
6842 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
6843 inote.descpos = offset + (inote.descdata - (char *) pnotes);
6845 external = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
6847 /* Verify that name is null terminated. It appears that at least
6848 one version of Linux (RedHat 6.0) generates corefiles that don't
6849 comply with the ELF spec by failing to include the null byte in
6851 if (inote.namedata[inote.namesz] != '\0')
6853 temp = malloc (inote.namesz + 1);
6857 error (_("Out of memory\n"));
6862 strncpy (temp, inote.namedata, inote.namesz);
6863 temp[inote.namesz] = 0;
6865 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
6866 inote.namedata = temp;
6869 res &= process_note (& inote);
6884 process_corefile_note_segments (file)
6887 Elf_Internal_Phdr * program_headers;
6888 Elf_Internal_Phdr * segment;
6892 program_headers = (Elf_Internal_Phdr *) malloc
6893 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
6895 if (program_headers == NULL)
6897 error (_("Out of memory\n"));
6902 i = get_32bit_program_headers (file, program_headers);
6904 i = get_64bit_program_headers (file, program_headers);
6908 free (program_headers);
6912 for (i = 0, segment = program_headers;
6913 i < elf_header.e_phnum;
6916 if (segment->p_type == PT_NOTE)
6917 res &= process_corefile_note_segment (file,
6918 (bfd_vma)segment->p_offset,
6919 (bfd_vma)segment->p_filesz);
6922 free (program_headers);
6928 process_corefile_contents (file)
6931 /* If we have not been asked to display the notes then do nothing. */
6935 /* If file is not a core file then exit. */
6936 if (elf_header.e_type != ET_CORE)
6939 /* No program headers means no NOTE segment. */
6940 if (elf_header.e_phnum == 0)
6942 printf (_("No note segments present in the core file.\n"));
6946 return process_corefile_note_segments (file);
6950 process_arch_specific (file)
6956 switch (elf_header.e_machine)
6959 case EM_MIPS_RS4_BE:
6960 return process_mips_specific (file);
6969 get_file_header (file)
6972 /* Read in the identity array. */
6973 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
6976 /* Determine how to read the rest of the header. */
6977 switch (elf_header.e_ident [EI_DATA])
6979 default: /* fall through */
6980 case ELFDATANONE: /* fall through */
6981 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
6982 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
6985 /* For now we only support 32 bit and 64 bit ELF files. */
6986 is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
6988 /* Read in the rest of the header. */
6991 Elf32_External_Ehdr ehdr32;
6993 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
6996 elf_header.e_type = BYTE_GET (ehdr32.e_type);
6997 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
6998 elf_header.e_version = BYTE_GET (ehdr32.e_version);
6999 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
7000 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
7001 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
7002 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
7003 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
7004 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
7005 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
7006 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
7007 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
7008 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
7012 Elf64_External_Ehdr ehdr64;
7014 /* If we have been compiled with sizeof (bfd_vma) == 4, then
7015 we will not be able to cope with the 64bit data found in
7016 64 ELF files. Detect this now and abort before we start
7017 overwritting things. */
7018 if (sizeof (bfd_vma) < 8)
7020 error (_("This instance of readelf has been built without support for a\n"));
7021 error (_("64 bit data type and so it cannot read 64 bit ELF files.\n"));
7025 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
7028 elf_header.e_type = BYTE_GET (ehdr64.e_type);
7029 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
7030 elf_header.e_version = BYTE_GET (ehdr64.e_version);
7031 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
7032 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
7033 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
7034 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
7035 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
7036 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
7037 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
7038 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
7039 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
7040 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
7047 process_file (file_name)
7051 struct stat statbuf;
7054 if (stat (file_name, & statbuf) < 0)
7056 error (_("Cannot stat input file %s.\n"), file_name);
7060 file = fopen (file_name, "rb");
7063 error (_("Input file %s not found.\n"), file_name);
7067 if (! get_file_header (file))
7069 error (_("%s: Failed to read file header\n"), file_name);
7074 /* Initialise per file variables. */
7075 for (i = NUM_ELEM (version_info); i--;)
7076 version_info[i] = 0;
7078 for (i = NUM_ELEM (dynamic_info); i--;)
7079 dynamic_info[i] = 0;
7081 /* Process the file. */
7083 printf (_("\nFile: %s\n"), file_name);
7085 if (! process_file_header ())
7091 process_section_headers (file);
7093 process_program_headers (file);
7095 process_dynamic_segment (file);
7097 process_relocs (file);
7099 process_symbol_table (file);
7101 process_syminfo (file);
7103 process_version_sections (file);
7105 process_section_contents (file);
7107 process_corefile_contents (file);
7109 process_arch_specific (file);
7113 if (section_headers)
7115 free (section_headers);
7116 section_headers = NULL;
7121 free (string_table);
7122 string_table = NULL;
7125 if (dynamic_strings)
7127 free (dynamic_strings);
7128 dynamic_strings = NULL;
7131 if (dynamic_symbols)
7133 free (dynamic_symbols);
7134 dynamic_symbols = NULL;
7135 num_dynamic_syms = 0;
7138 if (dynamic_syminfo)
7140 free (dynamic_syminfo);
7141 dynamic_syminfo = NULL;
7145 #ifdef SUPPORT_DISASSEMBLY
7146 /* Needed by the i386 disassembler. For extra credit, someone could
7147 fix this so that we insert symbolic addresses here, esp for GOT/PLT
7151 print_address (unsigned int addr, FILE * outfile)
7153 fprintf (outfile,"0x%8.8x", addr);
7156 /* Needed by the i386 disassembler. */
7158 db_task_printsym (unsigned int addr)
7160 print_address (addr, stderr);
7169 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
7170 setlocale (LC_MESSAGES, "");
7172 bindtextdomain (PACKAGE, LOCALEDIR);
7173 textdomain (PACKAGE);
7175 parse_args (argc, argv);
7177 if (optind < (argc - 1))
7180 while (optind < argc)
7181 process_file (argv [optind ++]);
7183 if (dump_sects != NULL)