1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998, 99, 2000 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@cygnus.com>
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
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"
76 #ifdef ANSI_PROTOTYPES
82 char * program_name = "readelf";
83 unsigned int dynamic_addr;
84 bfd_size_type dynamic_size;
85 unsigned int rela_addr;
86 unsigned int rela_size;
87 char * dynamic_strings;
89 unsigned long num_dynamic_syms;
90 Elf_Internal_Sym * dynamic_symbols;
91 Elf_Internal_Syminfo * dynamic_syminfo;
92 unsigned long dynamic_syminfo_offset;
93 unsigned int dynamic_syminfo_nent;
94 char program_interpreter [64];
95 int dynamic_info[DT_JMPREL + 1];
98 Elf_Internal_Ehdr elf_header;
99 Elf_Internal_Shdr * section_headers;
100 Elf_Internal_Dyn * dynamic_segment;
107 int do_using_dynamic;
114 int do_debug_abbrevs;
116 int do_debug_pubnames;
117 int do_debug_aranges;
122 /* A dynamic array of flags indicating which sections require dumping. */
123 char * dump_sects = NULL;
124 unsigned int num_dump_sects = 0;
126 #define HEX_DUMP (1 << 0)
127 #define DISASS_DUMP (1 << 1)
128 #define DEBUG_DUMP (1 << 2)
130 /* How to rpint a vma value. */
131 typedef enum print_mode
143 /* Forward declarations for dumb compilers. */
144 static void print_vma PARAMS ((bfd_vma, print_mode));
145 static bfd_vma (* byte_get) PARAMS ((unsigned char *, int));
146 static bfd_vma byte_get_little_endian PARAMS ((unsigned char *, int));
147 static bfd_vma byte_get_big_endian PARAMS ((unsigned char *, int));
148 static const char * get_mips_dynamic_type PARAMS ((unsigned long));
149 static const char * get_sparc64_dynamic_type PARAMS ((unsigned long));
150 static const char * get_parisc_dynamic_type PARAMS ((unsigned long));
151 static const char * get_dynamic_type PARAMS ((unsigned long));
152 static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
153 static char * get_file_type PARAMS ((unsigned));
154 static char * get_machine_name PARAMS ((unsigned));
155 static char * get_machine_flags PARAMS ((unsigned, unsigned));
156 static const char * get_mips_segment_type PARAMS ((unsigned long));
157 static const char * get_parisc_segment_type PARAMS ((unsigned long));
158 static const char * get_segment_type PARAMS ((unsigned long));
159 static const char * get_mips_section_type_name PARAMS ((unsigned int));
160 static const char * get_parisc_section_type_name PARAMS ((unsigned int));
161 static const char * get_section_type_name PARAMS ((unsigned int));
162 static const char * get_symbol_binding PARAMS ((unsigned int));
163 static const char * get_symbol_type PARAMS ((unsigned int));
164 static const char * get_symbol_visibility PARAMS ((unsigned int));
165 static const char * get_symbol_index_type PARAMS ((unsigned int));
166 static const char * get_dynamic_flags PARAMS ((bfd_vma));
167 static void usage PARAMS ((void));
168 static void parse_args PARAMS ((int, char **));
169 static int process_file_header PARAMS ((void));
170 static int process_program_headers PARAMS ((FILE *));
171 static int process_section_headers PARAMS ((FILE *));
172 static void dynamic_segment_mips_val PARAMS ((Elf_Internal_Dyn *));
173 static void dynamic_segment_parisc_val PARAMS ((Elf_Internal_Dyn *));
174 static int process_dynamic_segment PARAMS ((FILE *));
175 static int process_symbol_table PARAMS ((FILE *));
176 static int process_section_contents PARAMS ((FILE *));
177 static void process_file PARAMS ((char *));
178 static int process_relocs PARAMS ((FILE *));
179 static int process_version_sections PARAMS ((FILE *));
180 static char * get_ver_flags PARAMS ((unsigned int));
181 static int get_32bit_section_headers PARAMS ((FILE *));
182 static int get_64bit_section_headers PARAMS ((FILE *));
183 static int get_32bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
184 static int get_64bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
185 static int get_file_header PARAMS ((FILE *));
186 static Elf_Internal_Sym * get_32bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
187 static Elf_Internal_Sym * get_64bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
188 static int * get_dynamic_data PARAMS ((FILE *, unsigned int));
189 static int get_32bit_dynamic_segment PARAMS ((FILE *));
190 static int get_64bit_dynamic_segment PARAMS ((FILE *));
191 #ifdef SUPPORT_DISASSEMBLY
192 static int disassemble_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
194 static int dump_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
195 static int display_debug_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
196 static int display_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
197 static int display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
198 static int display_debug_lines PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
199 static int display_debug_abbrev PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
200 static int display_debug_aranges PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
201 static unsigned char * process_abbrev_section PARAMS ((unsigned char *, unsigned char *));
202 static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int));
203 static int process_extended_line_op PARAMS ((unsigned char *, int, int));
204 static void reset_state_machine PARAMS ((int));
205 static char * get_TAG_name PARAMS ((unsigned long));
206 static char * get_AT_name PARAMS ((unsigned long));
207 static char * get_FORM_name PARAMS ((unsigned long));
208 static void free_abbrevs PARAMS ((void));
209 static void add_abbrev PARAMS ((unsigned long, unsigned long, int));
210 static void add_abbrev_attr PARAMS ((unsigned long, unsigned long));
211 static unsigned char * read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long));
212 static unsigned char * display_block PARAMS ((unsigned char *, unsigned long));
213 static void decode_location_expression PARAMS ((unsigned char *, unsigned int));
214 static void request_dump PARAMS ((unsigned int, char));
215 static const char * get_elf_class PARAMS ((unsigned char));
216 static const char * get_data_encoding PARAMS ((unsigned char));
217 static const char * get_osabi_name PARAMS ((unsigned char));
218 static int guess_is_rela PARAMS ((unsigned long));
219 static char * get_note_type PARAMS ((unsigned int));
220 static int process_note PARAMS ((Elf32_Internal_Note *));
221 static int process_corefile_note_segment PARAMS ((FILE *, bfd_vma, bfd_vma));
222 static int process_corefile_note_segments PARAMS ((FILE *));
223 static int process_corefile_contents PARAMS ((FILE *));
225 typedef int Elf32_Word;
233 #define SECTION_NAME(X) (string_table + (X)->sh_name)
235 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
237 #define BYTE_GET(field) byte_get (field, sizeof (field))
239 /* If we can support a 64 bit data type then BFD64 should be defined
240 and sizeof (bfd_vma) == 8. In this case when translating from an
241 external 8 byte field to an internal field, we can assume that the
242 internal field is also 8 bytes wide and so we can extact all the data.
243 If, however, BFD64 is not defined, then we must assume that the
244 internal data structure only has 4 byte wide fields that are the
245 equivalent of the 8 byte wide external counterparts, and so we must
246 truncate the data. */
248 #define BYTE_GET8(field) byte_get (field, -8)
250 #define BYTE_GET8(field) byte_get (field, 8)
253 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
255 #define GET_DATA_ALLOC(offset, size, var, type, reason) \
256 if (fseek (file, offset, SEEK_SET)) \
258 error (_("Unable to seek to start of %s at %x\n"), reason, offset); \
262 var = (type) malloc (size); \
266 error (_("Out of memory allocating %d bytes for %s\n"), size, reason); \
270 if (fread (var, size, 1, file) != 1) \
272 error (_("Unable to read in %d bytes of %s\n"), size, reason); \
279 #define GET_DATA(offset, var, reason) \
280 if (fseek (file, offset, SEEK_SET)) \
282 error (_("Unable to seek to %x for %s\n"), offset, reason); \
285 else if (fread (& var, sizeof (var), 1, file) != 1) \
287 error (_("Unable to read data at %x for %s\n"), offset, reason); \
291 #define GET_ELF_SYMBOLS(file, offset, size) \
292 (is_32bit_elf ? get_32bit_elf_symbols (file, offset, size) \
293 : get_64bit_elf_symbols (file, offset, size))
296 #ifdef ANSI_PROTOTYPES
298 error (const char * message, ...)
302 fprintf (stderr, _("%s: Error: "), program_name);
303 va_start (args, message);
304 vfprintf (stderr, message, args);
310 warn (const char * message, ...)
314 fprintf (stderr, _("%s: Warning: "), program_name);
315 va_start (args, message);
316 vfprintf (stderr, message, args);
328 fprintf (stderr, _("%s: Error: "), program_name);
330 message = va_arg (args, char *);
331 vfprintf (stderr, message, args);
343 fprintf (stderr, _("%s: Warning: "), program_name);
345 message = va_arg (args, char *);
346 vfprintf (stderr, message, args);
353 byte_get_little_endian (field, size)
354 unsigned char * field;
363 return ((unsigned int) (field [0]))
364 | (((unsigned int) (field [1])) << 8);
367 /* We want to extract data from an 8 byte wide field and
368 place it into a 4 byte wide field. Since this is a little
369 endian source we can juts use the 4 byte extraction code. */
372 return ((unsigned long) (field [0]))
373 | (((unsigned long) (field [1])) << 8)
374 | (((unsigned long) (field [2])) << 16)
375 | (((unsigned long) (field [3])) << 24);
379 /* This is a special case, generated by the BYTE_GET8 macro.
380 It means that we are loading an 8 byte value from a field
381 in an external structure into an 8 byte value in a field
382 in an internal strcuture. */
383 return ((bfd_vma) (field [0]))
384 | (((bfd_vma) (field [1])) << 8)
385 | (((bfd_vma) (field [2])) << 16)
386 | (((bfd_vma) (field [3])) << 24)
387 | (((bfd_vma) (field [4])) << 32)
388 | (((bfd_vma) (field [5])) << 40)
389 | (((bfd_vma) (field [6])) << 48)
390 | (((bfd_vma) (field [7])) << 56);
393 error (_("Unhandled data length: %d\n"), size);
398 /* Print a VMA value. */
400 print_vma (vma, mode)
410 case FULL_HEX: printf ("0x"); /* drop through */
411 case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
412 case PREFIX_HEX: printf ("0x"); /* drop through */
413 case HEX: printf ("%lx", (unsigned long) vma); break;
414 case DEC: printf ("%ld", (unsigned long) vma); break;
415 case DEC_5: printf ("%5ld", (long) vma); break;
416 case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
437 #if BFD_HOST_64BIT_LONG
440 if (_bfd_int64_high (vma))
441 printf ("%lx%lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
443 printf ("%lx", _bfd_int64_low (vma));
448 #if BFD_HOST_64BIT_LONG
451 if (_bfd_int64_high (vma))
453 printf ("++%ld", _bfd_int64_low (vma));
455 printf ("%ld", _bfd_int64_low (vma));
460 #if BFD_HOST_64BIT_LONG
461 printf ("%5ld", vma);
463 if (_bfd_int64_high (vma))
465 printf ("++%ld", _bfd_int64_low (vma));
467 printf ("%5ld", _bfd_int64_low (vma));
472 #if BFD_HOST_64BIT_LONG
475 if (_bfd_int64_high (vma))
477 printf ("++%lu", _bfd_int64_low (vma));
479 printf ("%lu", _bfd_int64_low (vma));
488 byte_get_big_endian (field, size)
489 unsigned char * field;
498 return ((unsigned int) (field [1])) | (((int) (field [0])) << 8);
501 return ((unsigned long) (field [3]))
502 | (((unsigned long) (field [2])) << 8)
503 | (((unsigned long) (field [1])) << 16)
504 | (((unsigned long) (field [0])) << 24);
507 /* Although we are extracing data from an 8 byte wide field, we
508 are returning only 4 bytes of data. */
509 return ((unsigned long) (field [7]))
510 | (((unsigned long) (field [6])) << 8)
511 | (((unsigned long) (field [5])) << 16)
512 | (((unsigned long) (field [4])) << 24);
516 /* This is a special case, generated by the BYTE_GET8 macro.
517 It means that we are loading an 8 byte value from a field
518 in an external structure into an 8 byte value in a field
519 in an internal strcuture. */
520 return ((bfd_vma) (field [7]))
521 | (((bfd_vma) (field [6])) << 8)
522 | (((bfd_vma) (field [5])) << 16)
523 | (((bfd_vma) (field [4])) << 24)
524 | (((bfd_vma) (field [3])) << 32)
525 | (((bfd_vma) (field [2])) << 40)
526 | (((bfd_vma) (field [1])) << 48)
527 | (((bfd_vma) (field [0])) << 56);
531 error (_("Unhandled data length: %d\n"), size);
537 /* Guess the relocation sized based on the sized commonly used by the specific machine. */
539 guess_is_rela (e_machine)
540 unsigned long e_machine;
544 /* Targets that use REL relocations. */
555 /* Targets that use RELA relocations. */
563 case EM_CYGNUS_MN10200:
564 case EM_CYGNUS_MN10300:
590 warn (_("Don't know about relocations on this machine architecture\n"));
595 /* Display the contents of the relocation data found at the specified offset. */
597 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
599 unsigned long rel_offset;
600 unsigned long rel_size;
601 Elf_Internal_Sym * symtab;
607 Elf_Internal_Rel * rels;
608 Elf_Internal_Rela * relas;
611 if (is_rela == UNKNOWN)
612 is_rela = guess_is_rela (elf_header.e_machine);
618 Elf32_External_Rela * erelas;
620 GET_DATA_ALLOC (rel_offset, rel_size, erelas,
621 Elf32_External_Rela *, "relocs");
623 rel_size = rel_size / sizeof (Elf32_External_Rela);
625 relas = (Elf_Internal_Rela *)
626 malloc (rel_size * sizeof (Elf_Internal_Rela));
630 error(_("out of memory parsing relocs"));
634 for (i = 0; i < rel_size; i++)
636 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
637 relas[i].r_info = BYTE_GET (erelas[i].r_info);
638 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
643 rels = (Elf_Internal_Rel *) relas;
647 Elf64_External_Rela * erelas;
649 GET_DATA_ALLOC (rel_offset, rel_size, erelas,
650 Elf64_External_Rela *, "relocs");
652 rel_size = rel_size / sizeof (Elf64_External_Rela);
654 relas = (Elf_Internal_Rela *)
655 malloc (rel_size * sizeof (Elf_Internal_Rela));
659 error(_("out of memory parsing relocs"));
663 for (i = 0; i < rel_size; i++)
665 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
666 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
667 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
672 rels = (Elf_Internal_Rel *) relas;
679 Elf32_External_Rel * erels;
681 GET_DATA_ALLOC (rel_offset, rel_size, erels,
682 Elf32_External_Rel *, "relocs");
684 rel_size = rel_size / sizeof (Elf32_External_Rel);
686 rels = (Elf_Internal_Rel *)
687 malloc (rel_size * sizeof (Elf_Internal_Rel));
691 error(_("out of memory parsing relocs"));
695 for (i = 0; i < rel_size; i++)
697 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
698 rels[i].r_info = BYTE_GET (erels[i].r_info);
703 relas = (Elf_Internal_Rela *) rels;
707 Elf64_External_Rel * erels;
709 GET_DATA_ALLOC (rel_offset, rel_size, erels,
710 Elf64_External_Rel *, "relocs");
712 rel_size = rel_size / sizeof (Elf64_External_Rel);
714 rels = (Elf_Internal_Rel *)
715 malloc (rel_size * sizeof (Elf_Internal_Rel));
719 error(_("out of memory parsing relocs"));
723 for (i = 0; i < rel_size; i++)
725 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
726 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
731 relas = (Elf_Internal_Rela *) rels;
737 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
740 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
742 for (i = 0; i < rel_size; i++)
747 bfd_vma symtab_index;
752 offset = relas [i].r_offset;
753 info = relas [i].r_info;
757 offset = rels [i].r_offset;
758 info = rels [i].r_info;
763 type = ELF32_R_TYPE (info);
764 symtab_index = ELF32_R_SYM (info);
768 if (elf_header.e_machine == EM_SPARCV9)
769 type = ELF64_R_TYPE_ID (info);
771 type = ELF64_R_TYPE (info);
772 /* The #ifdef BFD64 below is to prevent a compile time warning.
773 We know that if we do not have a 64 bit data type that we
774 will never execute this code anyway. */
776 symtab_index = ELF64_R_SYM (info);
780 #ifdef _bfd_int64_low
781 printf (" %8.8lx %5.5lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
783 printf (" %8.8lx %5.5lx ", offset, info);
786 switch (elf_header.e_machine)
793 rtype = elf_m32r_reloc_type (type);
798 rtype = elf_i386_reloc_type (type);
802 rtype = elf_m68k_reloc_type (type);
806 rtype = elf_i960_reloc_type (type);
810 rtype = elf_avr_reloc_type (type);
817 rtype = elf_sparc_reloc_type (type);
821 rtype = v850_reloc_type (type);
825 rtype = elf_d10v_reloc_type (type);
829 rtype = elf_d30v_reloc_type (type);
833 rtype = elf_sh_reloc_type (type);
836 case EM_CYGNUS_MN10300:
837 rtype = elf_mn10300_reloc_type (type);
840 case EM_CYGNUS_MN10200:
841 rtype = elf_mn10200_reloc_type (type);
845 rtype = elf_fr30_reloc_type (type);
849 rtype = elf_mcore_reloc_type (type);
853 rtype = elf_ppc_reloc_type (type);
858 rtype = elf_mips_reloc_type (type);
862 rtype = elf_alpha_reloc_type (type);
866 rtype = elf_arm_reloc_type (type);
870 rtype = elf_arc_reloc_type (type);
874 rtype = elf_hppa_reloc_type (type);
878 rtype = elf_pj_reloc_type (type);
883 #ifdef _bfd_int64_low
884 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type));
886 printf (_("unrecognised: %-7lx"), type);
889 printf ("%-21.21s", rtype);
895 if (symtab_index >= nsyms)
896 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
899 Elf_Internal_Sym * psym;
901 psym = symtab + symtab_index;
904 print_vma (psym->st_value, LONG_HEX);
907 if (psym->st_name == 0)
909 SECTION_NAME (section_headers + psym->st_shndx));
910 else if (strtab == NULL)
911 printf (_("<string table index %3ld>"), psym->st_name);
913 printf ("%-25.25s", strtab + psym->st_name);
916 printf (" + %lx", (unsigned long) relas [i].r_addend);
922 printf ("%*c", is_32bit_elf ? 34 : 26, ' ');
923 print_vma (relas[i].r_addend, LONG_HEX);
926 if (elf_header.e_machine == EM_SPARCV9
927 && !strcmp (rtype, "R_SPARC_OLO10"))
928 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
939 get_mips_dynamic_type (type)
944 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
945 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
946 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
947 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
948 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
949 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
950 case DT_MIPS_MSYM: return "MIPS_MSYM";
951 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
952 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
953 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
954 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
955 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
956 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
957 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
958 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
959 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
960 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
961 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
962 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
963 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
964 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
965 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
966 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
967 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
968 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
969 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
970 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
971 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
972 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
973 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
974 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
975 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
976 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
977 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
978 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
979 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
980 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
981 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
982 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
983 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
984 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
985 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
986 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
993 get_sparc64_dynamic_type (type)
998 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1005 get_parisc_dynamic_type (type)
1010 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1011 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1012 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1013 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1014 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1015 case DT_HP_PREINIT: return "HP_PREINIT";
1016 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1017 case DT_HP_NEEDED: return "HP_NEEDED";
1018 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1019 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1020 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1021 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1022 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1029 get_dynamic_type (type)
1032 static char buff [32];
1036 case DT_NULL: return "NULL";
1037 case DT_NEEDED: return "NEEDED";
1038 case DT_PLTRELSZ: return "PLTRELSZ";
1039 case DT_PLTGOT: return "PLTGOT";
1040 case DT_HASH: return "HASH";
1041 case DT_STRTAB: return "STRTAB";
1042 case DT_SYMTAB: return "SYMTAB";
1043 case DT_RELA: return "RELA";
1044 case DT_RELASZ: return "RELASZ";
1045 case DT_RELAENT: return "RELAENT";
1046 case DT_STRSZ: return "STRSZ";
1047 case DT_SYMENT: return "SYMENT";
1048 case DT_INIT: return "INIT";
1049 case DT_FINI: return "FINI";
1050 case DT_SONAME: return "SONAME";
1051 case DT_RPATH: return "RPATH";
1052 case DT_SYMBOLIC: return "SYMBOLIC";
1053 case DT_REL: return "REL";
1054 case DT_RELSZ: return "RELSZ";
1055 case DT_RELENT: return "RELENT";
1056 case DT_PLTREL: return "PLTREL";
1057 case DT_DEBUG: return "DEBUG";
1058 case DT_TEXTREL: return "TEXTREL";
1059 case DT_JMPREL: return "JMPREL";
1060 case DT_BIND_NOW: return "BIND_NOW";
1061 case DT_INIT_ARRAY: return "INIT_ARRAY";
1062 case DT_FINI_ARRAY: return "FINI_ARRAY";
1063 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1064 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1065 case DT_RUNPATH: return "RUNPATH";
1066 case DT_FLAGS: return "FLAGS";
1068 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1069 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1071 case DT_PLTPADSZ: return "PLTPADSZ";
1072 case DT_MOVEENT: return "MOVEENT";
1073 case DT_MOVESZ: return "MOVESZ";
1074 case DT_FEATURE_1: return "FEATURE_1";
1075 case DT_POSFLAG_1: return "POSFLAG_1";
1076 case DT_SYMINSZ: return "SYMINSZ";
1077 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1079 case DT_ADDRRNGLO: return "ADDRRNGLO";
1080 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1082 case DT_VERSYM: return "VERSYM";
1084 case DT_RELACOUNT: return "RELACOUNT";
1085 case DT_RELCOUNT: return "RELCOUNT";
1086 case DT_FLAGS_1: return "FLAGS_1";
1087 case DT_VERDEF: return "VERDEF";
1088 case DT_VERDEFNUM: return "VERDEFNUM";
1089 case DT_VERNEED: return "VERNEED";
1090 case DT_VERNEEDNUM: return "VERNEEDNUM";
1092 case DT_AUXILIARY: return "AUXILARY";
1093 case DT_USED: return "USED";
1094 case DT_FILTER: return "FILTER";
1097 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1099 const char * result;
1101 switch (elf_header.e_machine)
1104 case EM_MIPS_RS4_BE:
1105 result = get_mips_dynamic_type (type);
1108 result = get_sparc64_dynamic_type (type);
1118 sprintf (buff, _("Processor Specific: %lx"), type);
1120 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1122 const char * result;
1124 switch (elf_header.e_machine)
1127 result = get_parisc_dynamic_type (type);
1137 sprintf (buff, _("Operating System specific: %lx"), type);
1140 sprintf (buff, _("<unknown>: %lx"), type);
1147 get_file_type (e_type)
1150 static char buff [32];
1154 case ET_NONE: return _("NONE (None)");
1155 case ET_REL: return _("REL (Relocatable file)");
1156 case ET_EXEC: return _("EXEC (Executable file)");
1157 case ET_DYN: return _("DYN (Shared object file)");
1158 case ET_CORE: return _("CORE (Core file)");
1161 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1162 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1163 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1164 sprintf (buff, _("OS Specific: (%x)"), e_type);
1166 sprintf (buff, _("<unknown>: %x"), e_type);
1172 get_machine_name (e_machine)
1175 static char buff [64]; /* XXX */
1179 case EM_NONE: return _("None");
1180 case EM_M32: return "WE32100";
1181 case EM_SPARC: return "Sparc";
1182 case EM_386: return "Intel 80386";
1183 case EM_68K: return "MC68000";
1184 case EM_88K: return "MC88000";
1185 case EM_486: return "Intel 80486";
1186 case EM_860: return "Intel 80860";
1187 case EM_MIPS: return "MIPS R3000";
1188 case EM_S370: return "IBM System/370";
1189 case EM_MIPS_RS4_BE: return "MIPS R4000 big-endian";
1190 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1191 case EM_PARISC: return "HPPA";
1192 case EM_PPC_OLD: return "Power PC (old)";
1193 case EM_SPARC32PLUS: return "Sparc v8+" ;
1194 case EM_960: return "Intel 90860";
1195 case EM_PPC: return "PowerPC";
1196 case EM_V800: return "NEC V800";
1197 case EM_FR20: return "Fujitsu FR20";
1198 case EM_RH32: return "TRW RH32";
1199 case EM_MCORE: return "MCORE";
1200 case EM_ARM: return "ARM";
1201 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1202 case EM_SH: return "Hitachi SH";
1203 case EM_SPARCV9: return "Sparc v9";
1204 case EM_TRICORE: return "Siemens Tricore";
1205 case EM_ARC: return "Argonaut RISC Core";
1206 case EM_H8_300: return "Hitachi H8/300";
1207 case EM_H8_300H: return "Hitachi H8/300H";
1208 case EM_H8S: return "Hitachi H8S";
1209 case EM_H8_500: return "Hitachi H8/500";
1210 case EM_IA_64: return "Intel IA-64";
1211 case EM_MIPS_X: return "Stanford MIPS-X";
1212 case EM_COLDFIRE: return "Motorola Coldfire";
1213 case EM_68HC12: return "Motorola M68HC12";
1214 case EM_ALPHA: return "Alpha";
1215 case EM_CYGNUS_D10V: return "d10v";
1216 case EM_CYGNUS_D30V: return "d30v";
1217 case EM_CYGNUS_ARC: return "Arc";
1218 case EM_CYGNUS_M32R: return "Mitsubishi M32r";
1219 case EM_CYGNUS_V850: return "NEC v850";
1220 case EM_CYGNUS_MN10300: return "mn10300";
1221 case EM_CYGNUS_MN10200: return "mn10200";
1222 case EM_CYGNUS_FR30: return "Fujitsu FR30";
1223 case EM_PJ: return "picoJava";
1224 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1225 case EM_PCP: return "Siemens PCP";
1226 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1227 case EM_NDR1: return "Denso NDR1 microprocesspr";
1228 case EM_STARCORE: return "Motorola Star*Core processor";
1229 case EM_ME16: return "Toyota ME16 processor";
1230 case EM_ST100: return "STMicroelectronics ST100 processor";
1231 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1232 case EM_FX66: return "Siemens FX66 microcontroller";
1233 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1234 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1235 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1236 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1237 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1238 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1239 case EM_SVX: return "Silicon Graphics SVx";
1240 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1241 case EM_VAX: return "Digital VAX";
1243 sprintf (buff, _("<unknown>: %x"), e_machine);
1249 get_machine_flags (e_flags, e_machine)
1253 static char buf [1024];
1265 if (e_flags & EF_CPU32)
1266 strcat (buf, ", cpu32");
1270 if (e_flags & EF_PPC_EMB)
1271 strcat (buf, ", emb");
1273 if (e_flags & EF_PPC_RELOCATABLE)
1274 strcat (buf, ", relocatable");
1276 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1277 strcat (buf, ", relocatable-lib");
1280 case EM_CYGNUS_V850:
1281 switch (e_flags & EF_V850_ARCH)
1284 strcat (buf, ", v850e");
1287 strcat (buf, ", v850ea");
1290 strcat (buf, ", v850");
1293 strcat (buf, ", unknown v850 architecture variant");
1298 case EM_CYGNUS_M32R:
1299 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1300 strcat (buf, ", m32r");
1305 case EM_MIPS_RS4_BE:
1306 if (e_flags & EF_MIPS_NOREORDER)
1307 strcat (buf, ", noreorder");
1309 if (e_flags & EF_MIPS_PIC)
1310 strcat (buf, ", pic");
1312 if (e_flags & EF_MIPS_CPIC)
1313 strcat (buf, ", cpic");
1315 if (e_flags & EF_MIPS_ABI2)
1316 strcat (buf, ", abi2");
1318 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
1319 strcat (buf, ", mips1");
1321 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
1322 strcat (buf, ", mips2");
1324 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
1325 strcat (buf, ", mips3");
1327 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
1328 strcat (buf, ", mips4");
1332 if (e_flags & EF_SPARC_32PLUS)
1333 strcat (buf, ", v8+");
1335 if (e_flags & EF_SPARC_SUN_US1)
1336 strcat (buf, ", ultrasparcI");
1338 if (e_flags & EF_SPARC_SUN_US3)
1339 strcat (buf, ", ultrasparcIII");
1341 if (e_flags & EF_SPARC_HAL_R1)
1342 strcat (buf, ", halr1");
1344 if (e_flags & EF_SPARC_LEDATA)
1345 strcat (buf, ", ledata");
1347 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
1348 strcat (buf, ", tso");
1350 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
1351 strcat (buf, ", pso");
1353 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
1354 strcat (buf, ", rmo");
1358 switch (e_flags & EF_PARISC_ARCH)
1360 case EFA_PARISC_1_0:
1361 strcpy (buf, ", PA-RISC 1.0");
1363 case EFA_PARISC_1_1:
1364 strcpy (buf, ", PA-RISC 1.1");
1366 case EFA_PARISC_2_0:
1367 strcpy (buf, ", PA-RISC 2.0");
1372 if (e_flags & EF_PARISC_TRAPNIL)
1373 strcat (buf, ", trapnil");
1374 if (e_flags & EF_PARISC_EXT)
1375 strcat (buf, ", ext");
1376 if (e_flags & EF_PARISC_LSB)
1377 strcat (buf, ", lsb");
1378 if (e_flags & EF_PARISC_WIDE)
1379 strcat (buf, ", wide");
1380 if (e_flags & EF_PARISC_NO_KABP)
1381 strcat (buf, ", no kabp");
1382 if (e_flags & EF_PARISC_LAZYSWAP)
1383 strcat (buf, ", lazyswap");
1387 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
1388 strcat (buf, ", new calling convention");
1390 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
1391 strcat (buf, ", gnu calling convention");
1400 get_mips_segment_type (type)
1405 case PT_MIPS_REGINFO:
1407 case PT_MIPS_RTPROC:
1409 case PT_MIPS_OPTIONS:
1419 get_parisc_segment_type (type)
1424 case PT_HP_TLS: return "HP_TLS";
1425 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
1426 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
1427 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
1428 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
1429 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
1430 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
1431 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
1432 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
1433 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
1434 case PT_HP_PARALLEL: return "HP_PARALLEL";
1435 case PT_HP_FASTBIND: return "HP_FASTBIND";
1436 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
1437 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
1446 get_segment_type (p_type)
1447 unsigned long p_type;
1449 static char buff [32];
1453 case PT_NULL: return "NULL";
1454 case PT_LOAD: return "LOAD";
1455 case PT_DYNAMIC: return "DYNAMIC";
1456 case PT_INTERP: return "INTERP";
1457 case PT_NOTE: return "NOTE";
1458 case PT_SHLIB: return "SHLIB";
1459 case PT_PHDR: return "PHDR";
1462 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
1464 const char * result;
1466 switch (elf_header.e_machine)
1469 case EM_MIPS_RS4_BE:
1470 result = get_mips_segment_type (p_type);
1473 result = get_parisc_segment_type (p_type);
1483 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
1485 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
1487 const char * result;
1489 switch (elf_header.e_machine)
1492 result = get_parisc_segment_type (p_type);
1502 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
1505 sprintf (buff, _("<unknown>: %lx"), p_type);
1512 get_mips_section_type_name (sh_type)
1513 unsigned int sh_type;
1517 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1518 case SHT_MIPS_MSYM: return "MIPS_MSYM";
1519 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1520 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
1521 case SHT_MIPS_UCODE: return "MIPS_UCODE";
1522 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
1523 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
1524 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
1525 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
1526 case SHT_MIPS_RELD: return "MIPS_RELD";
1527 case SHT_MIPS_IFACE: return "MIPS_IFACE";
1528 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
1529 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1530 case SHT_MIPS_SHDR: return "MIPS_SHDR";
1531 case SHT_MIPS_FDESC: return "MIPS_FDESC";
1532 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
1533 case SHT_MIPS_DENSE: return "MIPS_DENSE";
1534 case SHT_MIPS_PDESC: return "MIPS_PDESC";
1535 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
1536 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
1537 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
1538 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
1539 case SHT_MIPS_LINE: return "MIPS_LINE";
1540 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
1541 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
1542 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
1543 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
1544 case SHT_MIPS_DWARF: return "MIPS_DWARF";
1545 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
1546 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1547 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
1548 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
1549 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
1550 case SHT_MIPS_XLATE: return "MIPS_XLATE";
1551 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
1552 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
1553 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
1554 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
1555 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
1563 get_parisc_section_type_name (sh_type)
1564 unsigned int sh_type;
1568 case SHT_PARISC_EXT: return "PARISC_EXT";
1569 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
1570 case SHT_PARISC_DOC: return "PARISC_DOC";
1578 get_section_type_name (sh_type)
1579 unsigned int sh_type;
1581 static char buff [32];
1585 case SHT_NULL: return "NULL";
1586 case SHT_PROGBITS: return "PROGBITS";
1587 case SHT_SYMTAB: return "SYMTAB";
1588 case SHT_STRTAB: return "STRTAB";
1589 case SHT_RELA: return "RELA";
1590 case SHT_HASH: return "HASH";
1591 case SHT_DYNAMIC: return "DYNAMIC";
1592 case SHT_NOTE: return "NOTE";
1593 case SHT_NOBITS: return "NOBITS";
1594 case SHT_REL: return "REL";
1595 case SHT_SHLIB: return "SHLIB";
1596 case SHT_DYNSYM: return "DYNSYM";
1597 case SHT_INIT_ARRAY: return "INIT_ARRAY";
1598 case SHT_FINI_ARRAY: return "FINI_ARRAY";
1599 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1600 case SHT_GNU_verdef: return "VERDEF";
1601 case SHT_GNU_verneed: return "VERNEED";
1602 case SHT_GNU_versym: return "VERSYM";
1603 case 0x6ffffff0: return "VERSYM";
1604 case 0x6ffffffc: return "VERDEF";
1605 case 0x7ffffffd: return "AUXILIARY";
1606 case 0x7fffffff: return "FILTER";
1609 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
1611 const char * result;
1613 switch (elf_header.e_machine)
1616 case EM_MIPS_RS4_BE:
1617 result = get_mips_section_type_name (sh_type);
1620 result = get_parisc_section_type_name (sh_type);
1630 sprintf (buff, "SHT_LOPROC+%x", sh_type - SHT_LOPROC);
1632 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
1633 sprintf (buff, "SHT_LOOS+%x", sh_type - SHT_LOOS);
1634 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
1635 sprintf (buff, "SHT_LOUSER+%x", sh_type - SHT_LOUSER);
1637 sprintf (buff, _("<unknown>: %x"), sh_type);
1643 struct option options [] =
1645 {"all", no_argument, 0, 'a'},
1646 {"file-header", no_argument, 0, 'h'},
1647 {"program-headers", no_argument, 0, 'l'},
1648 {"headers", no_argument, 0, 'e'},
1649 {"histogram", no_argument, 0, 'I'},
1650 {"segments", no_argument, 0, 'l'},
1651 {"sections", no_argument, 0, 'S'},
1652 {"section-headers", no_argument, 0, 'S'},
1653 {"symbols", no_argument, 0, 's'},
1654 {"syms", no_argument, 0, 's'},
1655 {"relocs", no_argument, 0, 'r'},
1656 {"notes", no_argument, 0, 'n'},
1657 {"dynamic", no_argument, 0, 'd'},
1658 {"arch-specific", no_argument, 0, 'A'},
1659 {"version-info", no_argument, 0, 'V'},
1660 {"use-dynamic", no_argument, 0, 'D'},
1661 {"hex-dump", required_argument, 0, 'x'},
1662 {"debug-dump", optional_argument, 0, 'w'},
1663 #ifdef SUPPORT_DISASSEMBLY
1664 {"instruction-dump", required_argument, 0, 'i'},
1667 {"version", no_argument, 0, 'v'},
1668 {"help", no_argument, 0, 'H'},
1669 {0, no_argument, 0, 0}
1675 fprintf (stdout, _("Usage: readelf {options} elf-file(s)\n"));
1676 fprintf (stdout, _(" Options are:\n"));
1677 fprintf (stdout, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
1678 fprintf (stdout, _(" -h or --file-header Display the ELF file header\n"));
1679 fprintf (stdout, _(" -l or --program-headers or --segments\n"));
1680 fprintf (stdout, _(" Display the program headers\n"));
1681 fprintf (stdout, _(" -S or --section-headers or --sections\n"));
1682 fprintf (stdout, _(" Display the sections' header\n"));
1683 fprintf (stdout, _(" -e or --headers Equivalent to: -h -l -S\n"));
1684 fprintf (stdout, _(" -s or --syms or --symbols Display the symbol table\n"));
1685 fprintf (stdout, _(" -n or --notes Display the core notes (if present)\n"));
1686 fprintf (stdout, _(" -r or --relocs Display the relocations (if present)\n"));
1687 fprintf (stdout, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
1688 fprintf (stdout, _(" -V or --version-info Display the version sections (if present)\n"));
1689 fprintf (stdout, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
1690 fprintf (stdout, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
1691 fprintf (stdout, _(" -x <number> or --hex-dump=<number>\n"));
1692 fprintf (stdout, _(" Dump the contents of section <number>\n"));
1693 fprintf (stdout, _(" -w[liapr] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges]\n"));
1694 fprintf (stdout, _(" Display the contents of DWARF2 debug sections\n"));
1695 #ifdef SUPPORT_DISASSEMBLY
1696 fprintf (stdout, _(" -i <number> or --instruction-dump=<number>\n"));
1697 fprintf (stdout, _(" Disassemble the contents of section <number>\n"));
1699 fprintf (stdout, _(" -I or --histogram Display histogram of bucket list lengths\n"));
1700 fprintf (stdout, _(" -v or --version Display the version number of readelf\n"));
1701 fprintf (stdout, _(" -H or --help Display this information\n"));
1702 fprintf (stdout, _("Report bugs to bug-gnu-utils@gnu.org\n"));
1708 request_dump (section, type)
1709 unsigned int section;
1712 if (section >= num_dump_sects)
1714 char * new_dump_sects;
1716 new_dump_sects = (char *) calloc (section + 1, 1);
1718 if (new_dump_sects == NULL)
1719 error (_("Out of memory allocating dump request table."));
1722 /* Copy current flag settings. */
1723 memcpy (new_dump_sects, dump_sects, num_dump_sects);
1727 dump_sects = new_dump_sects;
1728 num_dump_sects = section + 1;
1733 dump_sects [section] |= type;
1739 parse_args (argc, argv)
1748 while ((c = getopt_long
1749 (argc, argv, "ersahnldSDAIw::x:i:vV", options, NULL)) != EOF)
1784 do_using_dynamic ++;
1812 section = strtoul (optarg, & cp, 0);
1813 if (! * cp && section >= 0)
1815 request_dump (section, HEX_DUMP);
1835 do_debug_abbrevs = 1;
1845 do_debug_pubnames = 1;
1850 do_debug_aranges = 1;
1854 warn (_("Unrecognised debug option '%s'\n"), optarg);
1859 #ifdef SUPPORT_DISASSEMBLY
1862 section = strtoul (optarg, & cp, 0);
1863 if (! * cp && section >= 0)
1865 request_dump (section, DISASS_DUMP);
1871 print_version (program_name);
1878 /* xgettext:c-format */
1879 error (_("Invalid option '-%c'\n"), c);
1886 if (!do_dynamic && !do_syms && !do_reloc && !do_sections
1887 && !do_segments && !do_header && !do_dump && !do_version
1888 && !do_histogram && !do_debugging && !do_arch && !do_notes)
1892 warn (_("Nothing to do.\n"));
1898 get_elf_class (elf_class)
1899 unsigned char elf_class;
1901 static char buff [32];
1905 case ELFCLASSNONE: return _("none");
1906 case ELFCLASS32: return _("ELF32");
1907 case ELFCLASS64: return _("ELF64");
1909 sprintf (buff, _("<unknown: %x>"), elf_class);
1915 get_data_encoding (encoding)
1916 unsigned char encoding;
1918 static char buff [32];
1922 case ELFDATANONE: return _("none");
1923 case ELFDATA2LSB: return _("2's complement, little endian");
1924 case ELFDATA2MSB: return _("2's complement, big endian");
1926 sprintf (buff, _("<unknown: %x>"), encoding);
1932 get_osabi_name (osabi)
1933 unsigned char osabi;
1935 static char buff [32];
1939 case ELFOSABI_SYSV: return _("UNIX - System V");
1940 case ELFOSABI_HPUX: return _("UNIX - HP-UX");
1941 case ELFOSABI_LINUX: return _("UNIX - Linux");
1942 case ELFOSABI_STANDALONE: return _("Standalone App");
1943 case ELFOSABI_ARM: return _("ARM");
1945 sprintf (buff, _("<unknown: %x>"), osabi);
1950 /* Decode the data held in 'elf_header'. */
1952 process_file_header ()
1954 if ( elf_header.e_ident [EI_MAG0] != ELFMAG0
1955 || elf_header.e_ident [EI_MAG1] != ELFMAG1
1956 || elf_header.e_ident [EI_MAG2] != ELFMAG2
1957 || elf_header.e_ident [EI_MAG3] != ELFMAG3)
1960 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
1968 printf (_("ELF Header:\n"));
1969 printf (_(" Magic: "));
1970 for (i = 0; i < EI_NIDENT; i ++)
1971 printf ("%2.2x ", elf_header.e_ident [i]);
1973 printf (_(" Class: %s\n"),
1974 get_elf_class (elf_header.e_ident [EI_CLASS]));
1975 printf (_(" Data: %s\n"),
1976 get_data_encoding (elf_header.e_ident [EI_DATA]));
1977 printf (_(" Version: %d %s\n"),
1978 elf_header.e_ident [EI_VERSION],
1979 (elf_header.e_ident [EI_VERSION] == EV_CURRENT
1981 : (elf_header.e_ident [EI_VERSION] != EV_NONE
1984 printf (_(" OS/ABI: %s\n"),
1985 get_osabi_name (elf_header.e_ident [EI_OSABI]));
1986 printf (_(" ABI Version: %d\n"),
1987 elf_header.e_ident [EI_ABIVERSION]);
1988 printf (_(" Type: %s\n"),
1989 get_file_type (elf_header.e_type));
1990 printf (_(" Machine: %s\n"),
1991 get_machine_name (elf_header.e_machine));
1992 printf (_(" Version: 0x%lx\n"),
1993 (unsigned long) elf_header.e_version);
1995 printf (_(" Entry point address: "));
1996 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
1997 printf (_("\n Start of program headers: "));
1998 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
1999 printf (_(" (bytes into file)\n Start of section headers: "));
2000 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2001 printf (_(" (bytes into file)\n"));
2003 printf (_(" Flags: 0x%lx%s\n"),
2004 (unsigned long) elf_header.e_flags,
2005 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2006 printf (_(" Size of this header: %ld (bytes)\n"),
2007 (long) elf_header.e_ehsize);
2008 printf (_(" Size of program headers: %ld (bytes)\n"),
2009 (long) elf_header.e_phentsize);
2010 printf (_(" Number of program headers: %ld\n"),
2011 (long) elf_header.e_phnum);
2012 printf (_(" Size of section headers: %ld (bytes)\n"),
2013 (long) elf_header.e_shentsize);
2014 printf (_(" Number of section headers: %ld\n"),
2015 (long) elf_header.e_shnum);
2016 printf (_(" Section header string table index: %ld\n"),
2017 (long) elf_header.e_shstrndx);
2025 get_32bit_program_headers (file, program_headers)
2027 Elf_Internal_Phdr * program_headers;
2029 Elf32_External_Phdr * phdrs;
2030 Elf32_External_Phdr * external;
2031 Elf32_Internal_Phdr * internal;
2034 GET_DATA_ALLOC (elf_header.e_phoff,
2035 elf_header.e_phentsize * elf_header.e_phnum,
2036 phdrs, Elf32_External_Phdr *, "program headers");
2038 for (i = 0, internal = program_headers, external = phdrs;
2039 i < elf_header.e_phnum;
2040 i ++, internal ++, external ++)
2042 internal->p_type = BYTE_GET (external->p_type);
2043 internal->p_offset = BYTE_GET (external->p_offset);
2044 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2045 internal->p_paddr = BYTE_GET (external->p_paddr);
2046 internal->p_filesz = BYTE_GET (external->p_filesz);
2047 internal->p_memsz = BYTE_GET (external->p_memsz);
2048 internal->p_flags = BYTE_GET (external->p_flags);
2049 internal->p_align = BYTE_GET (external->p_align);
2058 get_64bit_program_headers (file, program_headers)
2060 Elf_Internal_Phdr * program_headers;
2062 Elf64_External_Phdr * phdrs;
2063 Elf64_External_Phdr * external;
2064 Elf64_Internal_Phdr * internal;
2067 GET_DATA_ALLOC (elf_header.e_phoff,
2068 elf_header.e_phentsize * elf_header.e_phnum,
2069 phdrs, Elf64_External_Phdr *, "program headers");
2071 for (i = 0, internal = program_headers, external = phdrs;
2072 i < elf_header.e_phnum;
2073 i ++, internal ++, external ++)
2075 internal->p_type = BYTE_GET (external->p_type);
2076 internal->p_flags = BYTE_GET (external->p_flags);
2077 internal->p_offset = BYTE_GET8 (external->p_offset);
2078 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2079 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2080 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2081 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2082 internal->p_align = BYTE_GET8 (external->p_align);
2091 process_program_headers (file)
2094 Elf_Internal_Phdr * program_headers;
2095 Elf_Internal_Phdr * segment;
2098 if (elf_header.e_phnum == 0)
2101 printf (_("\nThere are no program headers in this file.\n"));
2105 if (do_segments && !do_header)
2107 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2108 printf (_("Entry point "));
2109 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2110 printf (_("\nThere are %d program headers, starting at offset "),
2111 elf_header.e_phnum);
2112 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2116 program_headers = (Elf_Internal_Phdr *) malloc
2117 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2119 if (program_headers == NULL)
2121 error (_("Out of memory\n"));
2126 i = get_32bit_program_headers (file, program_headers);
2128 i = get_64bit_program_headers (file, program_headers);
2132 free (program_headers);
2139 (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2143 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2147 (_(" Type Offset VirtAddr PhysAddr\n"));
2149 (_(" FileSiz MemSiz Flags Align\n"));
2157 for (i = 0, segment = program_headers;
2158 i < elf_header.e_phnum;
2163 printf (" %-14.14s ", get_segment_type (segment->p_type));
2167 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2168 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2169 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2170 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2171 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2173 (segment->p_flags & PF_R ? 'R' : ' '),
2174 (segment->p_flags & PF_W ? 'W' : ' '),
2175 (segment->p_flags & PF_X ? 'E' : ' '));
2176 printf ("%#lx", (unsigned long) segment->p_align);
2180 print_vma (segment->p_offset, FULL_HEX);
2182 print_vma (segment->p_vaddr, FULL_HEX);
2184 print_vma (segment->p_paddr, FULL_HEX);
2186 print_vma (segment->p_filesz, FULL_HEX);
2188 print_vma (segment->p_memsz, FULL_HEX);
2190 (segment->p_flags & PF_R ? 'R' : ' '),
2191 (segment->p_flags & PF_W ? 'W' : ' '),
2192 (segment->p_flags & PF_X ? 'E' : ' '));
2193 print_vma (segment->p_align, HEX);
2197 switch (segment->p_type)
2201 loadaddr = (segment->p_vaddr & 0xfffff000)
2202 - (segment->p_offset & 0xfffff000);
2207 error (_("more than one dynamic segment\n"));
2209 dynamic_addr = segment->p_offset;
2210 dynamic_size = segment->p_filesz;
2214 if (fseek (file, (long) segment->p_offset, SEEK_SET))
2215 error (_("Unable to find program interpreter name\n"));
2218 program_interpreter[0] = 0;
2219 fscanf (file, "%63s", program_interpreter);
2222 printf (_("\n [Requesting program interpreter: %s]"),
2223 program_interpreter);
2229 putc ('\n', stdout);
2238 if (do_segments && section_headers != NULL)
2240 printf (_("\n Section to Segment mapping:\n"));
2241 printf (_(" Segment Sections...\n"));
2243 assert (string_table != NULL);
2245 for (i = 0; i < elf_header.e_phnum; i++)
2248 Elf_Internal_Shdr * section;
2250 segment = program_headers + i;
2251 section = section_headers;
2253 printf (" %2.2d ", i);
2255 for (j = 0; j < elf_header.e_shnum; j++, section ++)
2257 if (section->sh_size > 0
2258 /* Compare allocated sections by VMA, unallocated
2259 sections by file offset. */
2260 && (section->sh_flags & SHF_ALLOC
2261 ? (section->sh_addr >= segment->p_vaddr
2262 && section->sh_addr + section->sh_size
2263 <= segment->p_vaddr + segment->p_memsz)
2264 : ((bfd_vma) section->sh_offset >= segment->p_offset
2265 && (section->sh_offset + section->sh_size
2266 <= segment->p_offset + segment->p_filesz))))
2267 printf ("%s ", SECTION_NAME (section));
2274 free (program_headers);
2281 get_32bit_section_headers (file)
2284 Elf32_External_Shdr * shdrs;
2285 Elf32_Internal_Shdr * internal;
2288 GET_DATA_ALLOC (elf_header.e_shoff,
2289 elf_header.e_shentsize * elf_header.e_shnum,
2290 shdrs, Elf32_External_Shdr *, "section headers");
2292 section_headers = (Elf_Internal_Shdr *) malloc
2293 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2295 if (section_headers == NULL)
2297 error (_("Out of memory\n"));
2301 for (i = 0, internal = section_headers;
2302 i < elf_header.e_shnum;
2305 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2306 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2307 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
2308 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
2309 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2310 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
2311 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2312 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2313 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2314 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
2323 get_64bit_section_headers (file)
2326 Elf64_External_Shdr * shdrs;
2327 Elf64_Internal_Shdr * internal;
2330 GET_DATA_ALLOC (elf_header.e_shoff,
2331 elf_header.e_shentsize * elf_header.e_shnum,
2332 shdrs, Elf64_External_Shdr *, "section headers");
2334 section_headers = (Elf_Internal_Shdr *) malloc
2335 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2337 if (section_headers == NULL)
2339 error (_("Out of memory\n"));
2343 for (i = 0, internal = section_headers;
2344 i < elf_header.e_shnum;
2347 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2348 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2349 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
2350 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
2351 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
2352 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
2353 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2354 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2355 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2356 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2364 static Elf_Internal_Sym *
2365 get_32bit_elf_symbols (file, offset, number)
2367 unsigned long offset;
2368 unsigned long number;
2370 Elf32_External_Sym * esyms;
2371 Elf_Internal_Sym * isyms;
2372 Elf_Internal_Sym * psym;
2375 GET_DATA_ALLOC (offset, number * sizeof (Elf32_External_Sym),
2376 esyms, Elf32_External_Sym *, "symbols");
2378 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2382 error (_("Out of memory\n"));
2388 for (j = 0, psym = isyms;
2392 psym->st_name = BYTE_GET (esyms[j].st_name);
2393 psym->st_value = BYTE_GET (esyms[j].st_value);
2394 psym->st_size = BYTE_GET (esyms[j].st_size);
2395 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2396 psym->st_info = BYTE_GET (esyms[j].st_info);
2397 psym->st_other = BYTE_GET (esyms[j].st_other);
2405 static Elf_Internal_Sym *
2406 get_64bit_elf_symbols (file, offset, number)
2408 unsigned long offset;
2409 unsigned long number;
2411 Elf64_External_Sym * esyms;
2412 Elf_Internal_Sym * isyms;
2413 Elf_Internal_Sym * psym;
2416 GET_DATA_ALLOC (offset, number * sizeof (Elf64_External_Sym),
2417 esyms, Elf64_External_Sym *, "symbols");
2419 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2423 error (_("Out of memory\n"));
2429 for (j = 0, psym = isyms;
2433 psym->st_name = BYTE_GET (esyms[j].st_name);
2434 psym->st_info = BYTE_GET (esyms[j].st_info);
2435 psym->st_other = BYTE_GET (esyms[j].st_other);
2436 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2437 psym->st_value = BYTE_GET8 (esyms[j].st_value);
2438 psym->st_size = BYTE_GET8 (esyms[j].st_size);
2447 get_elf_section_flags (sh_flags)
2450 static char buff [32];
2458 flag = sh_flags & - sh_flags;
2463 case SHF_WRITE: strcat (buff, "W"); break;
2464 case SHF_ALLOC: strcat (buff, "A"); break;
2465 case SHF_EXECINSTR: strcat (buff, "X"); break;
2466 case SHF_MERGE: strcat (buff, "M"); break;
2467 case SHF_STRINGS: strcat (buff, "S"); break;
2468 case SHF_INFO_LINK: strcat (buff, "I"); break;
2469 case SHF_LINK_ORDER: strcat (buff, "L"); break;
2470 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
2473 if (flag & SHF_MASKOS)
2476 sh_flags &= ~ SHF_MASKOS;
2478 else if (flag & SHF_MASKPROC)
2481 sh_flags &= ~ SHF_MASKPROC;
2493 process_section_headers (file)
2496 Elf_Internal_Shdr * section;
2499 section_headers = NULL;
2501 if (elf_header.e_shnum == 0)
2504 printf (_("\nThere are no sections in this file.\n"));
2509 if (do_sections && !do_header)
2510 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
2511 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
2515 if (! get_32bit_section_headers (file))
2518 else if (! get_64bit_section_headers (file))
2521 /* Read in the string table, so that we have names to display. */
2522 section = section_headers + elf_header.e_shstrndx;
2524 if (section->sh_size != 0)
2526 unsigned long string_table_offset;
2528 string_table_offset = section->sh_offset;
2530 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
2531 string_table, char *, "string table");
2534 /* Scan the sections for the dynamic symbol table
2535 and dynamic string table and debug sections. */
2536 dynamic_symbols = NULL;
2537 dynamic_strings = NULL;
2538 dynamic_syminfo = NULL;
2540 for (i = 0, section = section_headers;
2541 i < elf_header.e_shnum;
2544 char * name = SECTION_NAME (section);
2546 if (section->sh_type == SHT_DYNSYM)
2548 if (dynamic_symbols != NULL)
2550 error (_("File contains multiple dynamic symbol tables\n"));
2554 num_dynamic_syms = section->sh_size / section->sh_entsize;
2556 GET_ELF_SYMBOLS (file, section->sh_offset, num_dynamic_syms);
2558 else if (section->sh_type == SHT_STRTAB
2559 && strcmp (name, ".dynstr") == 0)
2561 if (dynamic_strings != NULL)
2563 error (_("File contains multiple dynamic string tables\n"));
2567 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
2568 dynamic_strings, char *, "dynamic strings");
2570 else if ((do_debugging || do_debug_info || do_debug_abbrevs
2571 || do_debug_lines || do_debug_pubnames || do_debug_aranges)
2572 && strncmp (name, ".debug_", 7) == 0)
2577 || (do_debug_info && (strcmp (name, "info") == 0))
2578 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
2579 || (do_debug_lines && (strcmp (name, "line") == 0))
2580 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
2581 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
2583 request_dump (i, DEBUG_DUMP);
2590 printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
2594 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
2597 printf (_(" [Nr] Name Type Address Offset\n"));
2598 printf (_(" Size EntSize Flags Link Info Align\n"));
2601 for (i = 0, section = section_headers;
2602 i < elf_header.e_shnum;
2605 printf (" [%2d] %-17.17s %-15.15s ",
2607 SECTION_NAME (section),
2608 get_section_type_name (section->sh_type));
2612 print_vma (section->sh_addr, LONG_HEX);
2614 printf ( " %6.6lx %6.6lx %2.2lx",
2615 (unsigned long) section->sh_offset,
2616 (unsigned long) section->sh_size,
2617 (unsigned long) section->sh_entsize);
2619 printf (" %3s ", get_elf_section_flags (section->sh_flags));
2621 printf (" %2ld %3lx %ld\n",
2622 (unsigned long) section->sh_link,
2623 (unsigned long) section->sh_info,
2624 (unsigned long) section->sh_addralign);
2629 print_vma (section->sh_addr, LONG_HEX);
2630 printf (" %8.8lx", section->sh_offset);
2632 print_vma (section->sh_size, LONG_HEX);
2634 print_vma (section->sh_entsize, LONG_HEX);
2636 printf (" %3s ", get_elf_section_flags (section->sh_flags));
2638 printf (" %2ld %3lx %ld\n",
2639 (unsigned long) section->sh_link,
2640 (unsigned long) section->sh_info,
2641 (unsigned long) section->sh_addralign);
2645 printf (_("Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings)\n"));
2646 printf (_(" I (info), L (link order), O (extra OS processing required)\n"));
2647 printf (_(" o (os specific), p (processor specific) x (unknown)\n"));
2652 /* Process the reloc section. */
2654 process_relocs (file)
2657 unsigned long rel_size;
2658 unsigned long rel_offset;
2664 if (do_using_dynamic)
2666 int is_rela = FALSE;
2671 if (dynamic_info[DT_REL])
2673 rel_offset = dynamic_info[DT_REL];
2674 rel_size = dynamic_info[DT_RELSZ];
2677 else if (dynamic_info [DT_RELA])
2679 rel_offset = dynamic_info[DT_RELA];
2680 rel_size = dynamic_info[DT_RELASZ];
2683 else if (dynamic_info[DT_JMPREL])
2685 rel_offset = dynamic_info[DT_JMPREL];
2686 rel_size = dynamic_info[DT_PLTRELSZ];
2688 switch (dynamic_info[DT_PLTREL])
2705 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
2706 rel_offset, rel_size);
2708 dump_relocations (file, rel_offset - loadaddr, rel_size,
2709 dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
2712 printf (_("\nThere are no dynamic relocations in this file.\n"));
2716 Elf32_Internal_Shdr * section;
2720 for (i = 0, section = section_headers;
2721 i < elf_header.e_shnum;
2724 if ( section->sh_type != SHT_RELA
2725 && section->sh_type != SHT_REL)
2728 rel_offset = section->sh_offset;
2729 rel_size = section->sh_size;
2733 Elf32_Internal_Shdr * strsec;
2734 Elf32_Internal_Shdr * symsec;
2735 Elf_Internal_Sym * symtab;
2738 unsigned long nsyms;
2740 printf (_("\nRelocation section "));
2742 if (string_table == NULL)
2743 printf ("%d", section->sh_name);
2745 printf ("'%s'", SECTION_NAME (section));
2747 printf (_(" at offset 0x%lx contains %lu entries:\n"),
2748 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
2750 symsec = section_headers + section->sh_link;
2752 nsyms = symsec->sh_size / symsec->sh_entsize;
2753 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
2758 strsec = section_headers + symsec->sh_link;
2760 GET_DATA_ALLOC (strsec->sh_offset, strsec->sh_size, strtab,
2761 char *, "string table");
2763 is_rela = section->sh_type == SHT_RELA;
2765 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela);
2775 printf (_("\nThere are no relocations in this file.\n"));
2783 dynamic_segment_mips_val (entry)
2784 Elf_Internal_Dyn * entry;
2786 switch (entry->d_tag)
2789 if (entry->d_un.d_val == 0)
2793 static const char * opts[] =
2795 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
2796 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
2797 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
2798 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
2803 for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
2804 if (entry->d_un.d_val & (1 << cnt))
2806 printf ("%s%s", first ? "" : " ", opts[cnt]);
2813 case DT_MIPS_IVERSION:
2814 if (dynamic_strings != NULL)
2815 printf ("Interface Version: %s\n",
2816 dynamic_strings + entry->d_un.d_val);
2818 printf ("%ld\n", (long) entry->d_un.d_ptr);
2821 case DT_MIPS_TIME_STAMP:
2824 time_t time = entry->d_un.d_val;
2825 strftime (timebuf, 20, "%Y-%m-%dT%H:%M:%S", gmtime (&time));
2826 printf ("Time Stamp: %s\n", timebuf);
2830 case DT_MIPS_RLD_VERSION:
2831 case DT_MIPS_LOCAL_GOTNO:
2832 case DT_MIPS_CONFLICTNO:
2833 case DT_MIPS_LIBLISTNO:
2834 case DT_MIPS_SYMTABNO:
2835 case DT_MIPS_UNREFEXTNO:
2836 case DT_MIPS_HIPAGENO:
2837 case DT_MIPS_DELTA_CLASS_NO:
2838 case DT_MIPS_DELTA_INSTANCE_NO:
2839 case DT_MIPS_DELTA_RELOC_NO:
2840 case DT_MIPS_DELTA_SYM_NO:
2841 case DT_MIPS_DELTA_CLASSSYM_NO:
2842 case DT_MIPS_COMPACT_SIZE:
2843 printf ("%ld\n", (long) entry->d_un.d_ptr);
2847 printf ("%#lx\n", (long) entry->d_un.d_ptr);
2853 dynamic_segment_parisc_val (entry)
2854 Elf_Internal_Dyn * entry;
2856 switch (entry->d_tag)
2858 case DT_HP_DLD_FLAGS:
2867 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
2868 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
2869 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
2870 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
2871 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
2872 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
2873 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
2874 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
2875 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
2876 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
2877 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
2881 bfd_vma val = entry->d_un.d_val;
2883 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
2884 if (val & flags[cnt].bit)
2888 fputs (flags[cnt].str, stdout);
2890 val ^= flags[cnt].bit;
2893 if (val != 0 || first)
2897 print_vma (val, HEX);
2903 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
2909 get_32bit_dynamic_segment (file)
2912 Elf32_External_Dyn * edyn;
2913 Elf_Internal_Dyn * entry;
2916 GET_DATA_ALLOC (dynamic_addr, dynamic_size,
2917 edyn, Elf32_External_Dyn *, "dynamic segment");
2919 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
2920 how large this .dynamic is now. We can do this even before the byte
2921 swapping since the DT_NULL tag is recognizable. */
2923 while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
2926 dynamic_segment = (Elf_Internal_Dyn *)
2927 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
2929 if (dynamic_segment == NULL)
2931 error (_("Out of memory\n"));
2936 for (i = 0, entry = dynamic_segment;
2940 entry->d_tag = BYTE_GET (edyn [i].d_tag);
2941 entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
2950 get_64bit_dynamic_segment (file)
2953 Elf64_External_Dyn * edyn;
2954 Elf_Internal_Dyn * entry;
2957 GET_DATA_ALLOC (dynamic_addr, dynamic_size,
2958 edyn, Elf64_External_Dyn *, "dynamic segment");
2960 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
2961 how large this .dynamic is now. We can do this even before the byte
2962 swapping since the DT_NULL tag is recognizable. */
2964 while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
2967 dynamic_segment = (Elf_Internal_Dyn *)
2968 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
2970 if (dynamic_segment == NULL)
2972 error (_("Out of memory\n"));
2977 for (i = 0, entry = dynamic_segment;
2981 entry->d_tag = BYTE_GET8 (edyn [i].d_tag);
2982 entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
2991 get_dynamic_flags (flags)
2994 static char buff [64];
2999 flag = flags & - flags;
3004 case DF_ORIGIN: strcat (buff, "ORIGIN "); break;
3005 case DF_SYMBOLIC: strcat (buff, "SYMBOLIC "); break;
3006 case DF_TEXTREL: strcat (buff, "TEXTREL "); break;
3007 case DF_BIND_NOW: strcat (buff, "BIND_NOW "); break;
3008 default: strcat (buff, "unknown "); break;
3014 /* Parse and display the contents of the dynamic segment. */
3016 process_dynamic_segment (file)
3019 Elf_Internal_Dyn * entry;
3022 if (dynamic_size == 0)
3025 printf (_("\nThere is no dynamic segment in this file.\n"));
3032 if (! get_32bit_dynamic_segment (file))
3035 else if (! get_64bit_dynamic_segment (file))
3038 /* Find the appropriate symbol table. */
3039 if (dynamic_symbols == NULL)
3041 for (i = 0, entry = dynamic_segment;
3045 unsigned long offset;
3047 if (entry->d_tag != DT_SYMTAB)
3050 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
3052 /* Since we do not know how big the symbol table is,
3053 we default to reading in the entire file (!) and
3054 processing that. This is overkill, I know, but it
3056 offset = entry->d_un.d_val - loadaddr;
3058 if (fseek (file, 0, SEEK_END))
3059 error (_("Unable to seek to end of file!"));
3062 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf32_External_Sym);
3064 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf64_External_Sym);
3066 if (num_dynamic_syms < 1)
3068 error (_("Unable to determine the number of symbols to load\n"));
3072 dynamic_symbols = GET_ELF_SYMBOLS (file, offset, num_dynamic_syms);
3076 /* Similarly find a string table. */
3077 if (dynamic_strings == NULL)
3079 for (i = 0, entry = dynamic_segment;
3083 unsigned long offset;
3086 if (entry->d_tag != DT_STRTAB)
3089 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
3091 /* Since we do not know how big the string table is,
3092 we default to reading in the entire file (!) and
3093 processing that. This is overkill, I know, but it
3096 offset = entry->d_un.d_val - loadaddr;
3097 if (fseek (file, 0, SEEK_END))
3098 error (_("Unable to seek to end of file\n"));
3099 str_tab_len = ftell (file) - offset;
3101 if (str_tab_len < 1)
3104 (_("Unable to determine the length of the dynamic string table\n"));
3108 GET_DATA_ALLOC (offset, str_tab_len, dynamic_strings, char *,
3109 "dynamic string table");
3115 /* And find the syminfo section if available. */
3116 if (dynamic_syminfo == NULL)
3118 unsigned int syminsz = 0;
3120 for (i = 0, entry = dynamic_segment;
3124 if (entry->d_tag == DT_SYMINENT)
3126 /* Note: these braces are necessary to avoid a syntax
3127 error from the SunOS4 C compiler. */
3128 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
3130 else if (entry->d_tag == DT_SYMINSZ)
3131 syminsz = entry->d_un.d_val;
3132 else if (entry->d_tag == DT_SYMINFO)
3133 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
3136 if (dynamic_syminfo_offset != 0 && syminsz != 0)
3138 Elf_External_Syminfo * extsyminfo;
3139 Elf_Internal_Syminfo * syminfo;
3141 /* There is a syminfo section. Read the data. */
3142 GET_DATA_ALLOC (dynamic_syminfo_offset, syminsz, extsyminfo,
3143 Elf_External_Syminfo *, "symbol information");
3145 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
3146 if (dynamic_syminfo == NULL)
3148 error (_("Out of memory\n"));
3152 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
3153 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
3156 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
3157 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
3164 if (do_dynamic && dynamic_addr)
3165 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
3166 dynamic_addr, (long) dynamic_size);
3168 printf (_(" Tag Type Name/Value\n"));
3170 for (i = 0, entry = dynamic_segment;
3179 print_vma (entry->d_tag, FULL_HEX);
3180 dtype = get_dynamic_type (entry->d_tag);
3181 printf (" (%s)%*s", dtype,
3182 ((is_32bit_elf ? 27 : 19)
3183 - (int) strlen (dtype)),
3187 switch (entry->d_tag)
3191 printf ("%s", get_dynamic_flags (entry->d_un.d_val));
3198 if (entry->d_tag == DT_AUXILIARY)
3199 printf (_("Auxiliary library"));
3201 printf (_("Filter library"));
3203 if (dynamic_strings)
3204 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
3208 print_vma (entry->d_un.d_val, PREFIX_HEX);
3217 printf (_("Flags:"));
3218 if (entry->d_un.d_val == 0)
3219 printf (_(" None\n"));
3222 unsigned long int val = entry->d_un.d_val;
3223 if (val & DTF_1_PARINIT)
3225 printf (" PARINIT");
3226 val ^= DTF_1_PARINIT;
3229 printf (" %lx", val);
3238 printf (_("Flags:"));
3239 if (entry->d_un.d_val == 0)
3240 printf (_(" None\n"));
3243 unsigned long int val = entry->d_un.d_val;
3244 if (val & DF_P1_LAZYLOAD)
3246 printf (" LAZYLOAD");
3247 val ^= DF_P1_LAZYLOAD;
3249 if (val & DF_P1_GROUPPERM)
3251 printf (" GROUPPERM");
3252 val ^= DF_P1_GROUPPERM;
3255 printf (" %lx", val);
3264 printf (_("Flags:"));
3265 if (entry->d_un.d_val == 0)
3266 printf (_(" None\n"));
3269 unsigned long int val = entry->d_un.d_val;
3275 if (val & DF_1_GLOBAL)
3280 if (val & DF_1_GROUP)
3285 if (val & DF_1_NODELETE)
3287 printf (" NODELETE");
3288 val ^= DF_1_NODELETE;
3290 if (val & DF_1_LOADFLTR)
3292 printf (" LOADFLTR");
3293 val ^= DF_1_LOADFLTR;
3295 if (val & DF_1_INITFIRST)
3297 printf (" INITFIRST");
3298 val ^= DF_1_INITFIRST;
3300 if (val & DF_1_NOOPEN)
3305 if (val & DF_1_ORIGIN)
3310 if (val & DF_1_DIRECT)
3315 if (val & DF_1_TRANS)
3320 if (val & DF_1_INTERPOSE)
3322 printf (" INTERPOSE");
3323 val ^= DF_1_INTERPOSE;
3326 printf (" %lx", val);
3334 puts (get_dynamic_type (entry->d_un.d_val));
3353 dynamic_info[entry->d_tag] = entry->d_un.d_val;
3359 if (dynamic_strings == NULL)
3362 name = dynamic_strings + entry->d_un.d_val;
3366 switch (entry->d_tag)
3369 printf (_("Shared library: [%s]"), name);
3371 if (strcmp (name, program_interpreter) == 0)
3372 printf (_(" program interpreter"));
3376 printf (_("Library soname: [%s]"), name);
3380 printf (_("Library rpath: [%s]"), name);
3384 print_vma (entry->d_un.d_val, PREFIX_HEX);
3389 print_vma (entry->d_un.d_val, PREFIX_HEX);
3405 case DT_INIT_ARRAYSZ:
3406 case DT_FINI_ARRAYSZ:
3409 print_vma (entry->d_un.d_val, UNSIGNED);
3410 printf (" (bytes)\n");
3420 print_vma (entry->d_un.d_val, UNSIGNED);
3433 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
3437 name = dynamic_strings + entry->d_un.d_val;
3441 printf (_("Not needed object: [%s]\n"), name);
3446 print_vma (entry->d_un.d_val, PREFIX_HEX);
3452 /* The value of this entry is ignored. */
3456 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
3457 version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
3462 switch (elf_header.e_machine)
3465 case EM_MIPS_RS4_BE:
3466 dynamic_segment_mips_val (entry);
3469 dynamic_segment_parisc_val (entry);
3472 print_vma (entry->d_un.d_val, PREFIX_HEX);
3484 get_ver_flags (flags)
3487 static char buff [32];
3494 if (flags & VER_FLG_BASE)
3495 strcat (buff, "BASE ");
3497 if (flags & VER_FLG_WEAK)
3499 if (flags & VER_FLG_BASE)
3500 strcat (buff, "| ");
3502 strcat (buff, "WEAK ");
3505 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
3506 strcat (buff, "| <unknown>");
3511 /* Display the contents of the version sections. */
3513 process_version_sections (file)
3516 Elf32_Internal_Shdr * section;
3523 for (i = 0, section = section_headers;
3524 i < elf_header.e_shnum;
3527 switch (section->sh_type)
3529 case SHT_GNU_verdef:
3531 Elf_External_Verdef * edefs;
3538 (_("\nVersion definition section '%s' contains %ld entries:\n"),
3539 SECTION_NAME (section), section->sh_info);
3541 printf (_(" Addr: 0x"));
3542 printf_vma (section->sh_addr);
3543 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
3544 (unsigned long) section->sh_offset, section->sh_link,
3545 SECTION_NAME (section_headers + section->sh_link));
3547 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
3548 edefs, Elf_External_Verdef *,
3549 "version definition section");
3551 for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
3554 Elf_External_Verdef * edef;
3555 Elf_Internal_Verdef ent;
3556 Elf_External_Verdaux * eaux;
3557 Elf_Internal_Verdaux aux;
3561 vstart = ((char *) edefs) + idx;
3563 edef = (Elf_External_Verdef *) vstart;
3565 ent.vd_version = BYTE_GET (edef->vd_version);
3566 ent.vd_flags = BYTE_GET (edef->vd_flags);
3567 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
3568 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
3569 ent.vd_hash = BYTE_GET (edef->vd_hash);
3570 ent.vd_aux = BYTE_GET (edef->vd_aux);
3571 ent.vd_next = BYTE_GET (edef->vd_next);
3573 printf (_(" %#06x: Rev: %d Flags: %s"),
3574 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
3576 printf (_(" Index: %d Cnt: %d "),
3577 ent.vd_ndx, ent.vd_cnt);
3579 vstart += ent.vd_aux;
3581 eaux = (Elf_External_Verdaux *) vstart;
3583 aux.vda_name = BYTE_GET (eaux->vda_name);
3584 aux.vda_next = BYTE_GET (eaux->vda_next);
3586 if (dynamic_strings)
3587 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
3589 printf (_("Name index: %ld\n"), aux.vda_name);
3591 isum = idx + ent.vd_aux;
3593 for (j = 1; j < ent.vd_cnt; j ++)
3595 isum += aux.vda_next;
3596 vstart += aux.vda_next;
3598 eaux = (Elf_External_Verdaux *) vstart;
3600 aux.vda_name = BYTE_GET (eaux->vda_name);
3601 aux.vda_next = BYTE_GET (eaux->vda_next);
3603 if (dynamic_strings)
3604 printf (_(" %#06x: Parent %d: %s\n"),
3605 isum, j, dynamic_strings + aux.vda_name);
3607 printf (_(" %#06x: Parent %d, name index: %ld\n"),
3608 isum, j, aux.vda_name);
3618 case SHT_GNU_verneed:
3620 Elf_External_Verneed * eneed;
3626 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
3627 SECTION_NAME (section), section->sh_info);
3629 printf (_(" Addr: 0x"));
3630 printf_vma (section->sh_addr);
3631 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
3632 (unsigned long) section->sh_offset, section->sh_link,
3633 SECTION_NAME (section_headers + section->sh_link));
3635 GET_DATA_ALLOC (section->sh_offset, section->sh_size,
3636 eneed, Elf_External_Verneed *,
3637 "version need section");
3639 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
3641 Elf_External_Verneed * entry;
3642 Elf_Internal_Verneed ent;
3647 vstart = ((char *) eneed) + idx;
3649 entry = (Elf_External_Verneed *) vstart;
3651 ent.vn_version = BYTE_GET (entry->vn_version);
3652 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
3653 ent.vn_file = BYTE_GET (entry->vn_file);
3654 ent.vn_aux = BYTE_GET (entry->vn_aux);
3655 ent.vn_next = BYTE_GET (entry->vn_next);
3657 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
3659 if (dynamic_strings)
3660 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
3662 printf (_(" File: %lx"), ent.vn_file);
3664 printf (_(" Cnt: %d\n"), ent.vn_cnt);
3666 vstart += ent.vn_aux;
3668 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
3670 Elf_External_Vernaux * eaux;
3671 Elf_Internal_Vernaux aux;
3673 eaux = (Elf_External_Vernaux *) vstart;
3675 aux.vna_hash = BYTE_GET (eaux->vna_hash);
3676 aux.vna_flags = BYTE_GET (eaux->vna_flags);
3677 aux.vna_other = BYTE_GET (eaux->vna_other);
3678 aux.vna_name = BYTE_GET (eaux->vna_name);
3679 aux.vna_next = BYTE_GET (eaux->vna_next);
3681 if (dynamic_strings)
3682 printf (_(" %#06x: Name: %s"),
3683 isum, dynamic_strings + aux.vna_name);
3685 printf (_(" %#06x: Name index: %lx"),
3686 isum, aux.vna_name);
3688 printf (_(" Flags: %s Version: %d\n"),
3689 get_ver_flags (aux.vna_flags), aux.vna_other);
3691 isum += aux.vna_next;
3692 vstart += aux.vna_next;
3702 case SHT_GNU_versym:
3704 Elf32_Internal_Shdr * link_section;
3707 unsigned char * edata;
3708 unsigned short * data;
3710 Elf_Internal_Sym * symbols;
3711 Elf32_Internal_Shdr * string_sec;
3713 link_section = section_headers + section->sh_link;
3714 total = section->sh_size / section->sh_entsize;
3718 symbols = GET_ELF_SYMBOLS (file, link_section->sh_offset,
3719 link_section->sh_size / link_section->sh_entsize);
3721 string_sec = section_headers + link_section->sh_link;
3723 GET_DATA_ALLOC (string_sec->sh_offset, string_sec->sh_size,
3724 strtab, char *, "version string table");
3726 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
3727 SECTION_NAME (section), total);
3729 printf (_(" Addr: "));
3730 printf_vma (section->sh_addr);
3731 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
3732 (unsigned long) section->sh_offset, section->sh_link,
3733 SECTION_NAME (link_section));
3735 GET_DATA_ALLOC (version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
3737 total * sizeof (short), edata,
3738 unsigned char *, "version symbol data");
3740 data = (unsigned short *) malloc (total * sizeof (short));
3742 for (cnt = total; cnt --;)
3743 data [cnt] = byte_get (edata + cnt * sizeof (short),
3748 for (cnt = 0; cnt < total; cnt += 4)
3753 printf (" %03x:", cnt);
3755 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
3756 switch (data [cnt + j])
3759 fputs (_(" 0 (*local*) "), stdout);
3763 fputs (_(" 1 (*global*) "), stdout);
3767 nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
3768 data [cnt + j] & 0x8000 ? 'h' : ' ');
3770 if (symbols [cnt + j].st_shndx < SHN_LORESERVE
3771 && section_headers[symbols [cnt + j].st_shndx].sh_type
3774 /* We must test both. */
3775 Elf_Internal_Verneed ivn;
3776 unsigned long offset;
3778 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
3783 Elf_External_Verneed evn;
3784 Elf_External_Vernaux evna;
3785 Elf_Internal_Vernaux ivna;
3786 unsigned long vna_off;
3788 GET_DATA (offset, evn, "version need");
3790 ivn.vn_aux = BYTE_GET (evn.vn_aux);
3791 ivn.vn_next = BYTE_GET (evn.vn_next);
3793 vna_off = offset + ivn.vn_aux;
3797 GET_DATA (vna_off, evna,
3798 "version need aux (1)");
3800 ivna.vna_next = BYTE_GET (evna.vna_next);
3801 ivna.vna_other = BYTE_GET (evna.vna_other);
3803 vna_off += ivna.vna_next;
3805 while (ivna.vna_other != data [cnt + j]
3806 && ivna.vna_next != 0);
3808 if (ivna.vna_other == data [cnt + j])
3810 ivna.vna_name = BYTE_GET (evna.vna_name);
3812 name = strtab + ivna.vna_name;
3813 nn += printf ("(%s%-*s",
3815 12 - (int) strlen (name),
3819 else if (ivn.vn_next == 0)
3821 if (data [cnt + j] != 0x8001)
3823 Elf_Internal_Verdef ivd;
3824 Elf_External_Verdef evd;
3826 offset = version_info
3827 [DT_VERSIONTAGIDX (DT_VERDEF)]
3832 GET_DATA (offset, evd,
3833 "version definition");
3835 ivd.vd_next = BYTE_GET (evd.vd_next);
3836 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
3838 offset += ivd.vd_next;
3841 != (data [cnt + j] & 0x7fff)
3842 && ivd.vd_next != 0);
3845 == (data [cnt + j] & 0x7fff))
3847 Elf_External_Verdaux evda;
3848 Elf_Internal_Verdaux ivda;
3850 ivd.vd_aux = BYTE_GET (evd.vd_aux);
3852 GET_DATA (offset + ivd.vd_aux, evda,
3853 "version definition aux");
3856 BYTE_GET (evda.vda_name);
3858 name = strtab + ivda.vda_name;
3862 12 - (int) strlen (name),
3870 offset += ivn.vn_next;
3872 while (ivn.vn_next);
3874 else if (symbols [cnt + j].st_shndx == SHN_UNDEF)
3876 Elf_Internal_Verneed ivn;
3877 unsigned long offset;
3879 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
3884 Elf_Internal_Vernaux ivna;
3885 Elf_External_Verneed evn;
3886 Elf_External_Vernaux evna;
3887 unsigned long a_off;
3889 GET_DATA (offset, evn, "version need");
3891 ivn.vn_aux = BYTE_GET (evn.vn_aux);
3892 ivn.vn_next = BYTE_GET (evn.vn_next);
3894 a_off = offset + ivn.vn_aux;
3898 GET_DATA (a_off, evna,
3899 "version need aux (2)");
3901 ivna.vna_next = BYTE_GET (evna.vna_next);
3902 ivna.vna_other = BYTE_GET (evna.vna_other);
3904 a_off += ivna.vna_next;
3906 while (ivna.vna_other != data [cnt + j]
3907 && ivna.vna_next != 0);
3909 if (ivna.vna_other == data [cnt + j])
3911 ivna.vna_name = BYTE_GET (evna.vna_name);
3913 name = strtab + ivna.vna_name;
3914 nn += printf ("(%s%-*s",
3916 12 - (int) strlen (name),
3921 offset += ivn.vn_next;
3923 while (ivn.vn_next);
3925 else if (data [cnt + j] != 0x8001)
3927 Elf_Internal_Verdef ivd;
3928 Elf_External_Verdef evd;
3929 unsigned long offset;
3931 offset = version_info
3932 [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
3936 GET_DATA (offset, evd, "version def");
3938 ivd.vd_next = BYTE_GET (evd.vd_next);
3939 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
3941 offset += ivd.vd_next;
3943 while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
3944 && ivd.vd_next != 0);
3946 if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
3948 Elf_External_Verdaux evda;
3949 Elf_Internal_Verdaux ivda;
3951 ivd.vd_aux = BYTE_GET (evd.vd_aux);
3953 GET_DATA (offset - ivd.vd_next + ivd.vd_aux,
3954 evda, "version def aux");
3956 ivda.vda_name = BYTE_GET (evda.vda_name);
3958 name = strtab + ivda.vda_name;
3959 nn += printf ("(%s%-*s",
3961 12 - (int) strlen (name),
3967 printf ("%*c", 18 - nn, ' ');
3985 printf (_("\nNo version information found in this file.\n"));
3991 get_symbol_binding (binding)
3992 unsigned int binding;
3994 static char buff [32];
3998 case STB_LOCAL: return "LOCAL";
3999 case STB_GLOBAL: return "GLOBAL";
4000 case STB_WEAK: return "WEAK";
4002 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
4003 sprintf (buff, _("<processor specific>: %d"), binding);
4004 else if (binding >= STB_LOOS && binding <= STB_HIOS)
4005 sprintf (buff, _("<OS specific>: %d"), binding);
4007 sprintf (buff, _("<unknown>: %d"), binding);
4013 get_symbol_type (type)
4016 static char buff [32];
4020 case STT_NOTYPE: return "NOTYPE";
4021 case STT_OBJECT: return "OBJECT";
4022 case STT_FUNC: return "FUNC";
4023 case STT_SECTION: return "SECTION";
4024 case STT_FILE: return "FILE";
4025 case STT_COMMON: return "COMMON";
4027 if (type >= STT_LOPROC && type <= STT_HIPROC)
4029 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
4030 return "THUMB_FUNC";
4032 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
4035 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
4036 return "PARISC_MILLI";
4038 sprintf (buff, _("<processor specific>: %d"), type);
4040 else if (type >= STT_LOOS && type <= STT_HIOS)
4042 if (elf_header.e_machine == EM_PARISC)
4044 if (type == STT_HP_OPAQUE)
4046 if (type == STT_HP_STUB)
4050 sprintf (buff, _("<OS specific>: %d"), type);
4053 sprintf (buff, _("<unknown>: %d"), type);
4059 get_symbol_visibility (visibility)
4060 unsigned int visibility;
4064 case STV_DEFAULT: return "DEFAULT";
4065 case STV_INTERNAL: return "INTERNAL";
4066 case STV_HIDDEN: return "HIDDEN";
4067 case STV_PROTECTED: return "PROTECTED";
4073 get_symbol_index_type (type)
4078 case SHN_UNDEF: return "UND";
4079 case SHN_ABS: return "ABS";
4080 case SHN_COMMON: return "COM";
4082 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
4084 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
4086 else if (type >= SHN_LOOS && type <= SHN_HIOS)
4090 static char buff [32];
4092 sprintf (buff, "%3d", type);
4099 get_dynamic_data (file, number)
4101 unsigned int number;
4106 e_data = (char *) malloc (number * 4);
4110 error (_("Out of memory\n"));
4114 if (fread (e_data, 4, number, file) != number)
4116 error (_("Unable to read in dynamic data\n"));
4120 i_data = (int *) malloc (number * sizeof (* i_data));
4124 error (_("Out of memory\n"));
4130 i_data [number] = byte_get (e_data + number * 4, 4);
4137 /* Dump the symbol table */
4139 process_symbol_table (file)
4142 Elf32_Internal_Shdr * section;
4147 int * buckets = NULL;
4148 int * chains = NULL;
4150 if (! do_syms && !do_histogram)
4153 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
4156 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
4158 error (_("Unable to seek to start of dynamic information"));
4162 if (fread (nb, sizeof (nb), 1, file) != 1)
4164 error (_("Failed to read in number of buckets\n"));
4168 if (fread (nc, sizeof (nc), 1, file) != 1)
4170 error (_("Failed to read in number of chains\n"));
4174 nbuckets = byte_get (nb, 4);
4175 nchains = byte_get (nc, 4);
4177 buckets = get_dynamic_data (file, nbuckets);
4178 chains = get_dynamic_data (file, nchains);
4180 if (buckets == NULL || chains == NULL)
4185 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
4190 printf (_("\nSymbol table for image:\n"));
4192 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4194 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
4196 for (hn = 0; hn < nbuckets; hn++)
4201 for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
4203 Elf_Internal_Sym * psym;
4205 psym = dynamic_symbols + si;
4207 printf (" %3d %3d: ", si, hn);
4208 print_vma (psym->st_value, LONG_HEX);
4210 print_vma (psym->st_size, DEC_5);
4212 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
4213 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
4214 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
4215 printf (" %3.3s", get_symbol_index_type (psym->st_shndx));
4216 printf (" %s\n", dynamic_strings + psym->st_name);
4220 else if (do_syms && !do_using_dynamic)
4224 for (i = 0, section = section_headers;
4225 i < elf_header.e_shnum;
4230 Elf_Internal_Sym * symtab;
4231 Elf_Internal_Sym * psym;
4234 if ( section->sh_type != SHT_SYMTAB
4235 && section->sh_type != SHT_DYNSYM)
4238 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
4239 SECTION_NAME (section),
4240 (unsigned long) (section->sh_size / section->sh_entsize));
4242 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4244 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
4246 symtab = GET_ELF_SYMBOLS (file, section->sh_offset,
4247 section->sh_size / section->sh_entsize);
4251 if (section->sh_link == elf_header.e_shstrndx)
4252 strtab = string_table;
4255 Elf32_Internal_Shdr * string_sec;
4257 string_sec = section_headers + section->sh_link;
4259 GET_DATA_ALLOC (string_sec->sh_offset, string_sec->sh_size,
4260 strtab, char *, "string table");
4263 for (si = 0, psym = symtab;
4264 si < section->sh_size / section->sh_entsize;
4267 printf ("%6d: ", si);
4268 print_vma (psym->st_value, LONG_HEX);
4270 print_vma (psym->st_size, DEC_5);
4271 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
4272 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
4273 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
4274 printf (" %4s", get_symbol_index_type (psym->st_shndx));
4275 printf (" %s", strtab + psym->st_name);
4277 if (section->sh_type == SHT_DYNSYM &&
4278 version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
4280 unsigned char data[2];
4281 unsigned short vers_data;
4282 unsigned long offset;
4286 offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
4289 GET_DATA (offset + si * sizeof (vers_data), data,
4292 vers_data = byte_get (data, 2);
4294 is_nobits = psym->st_shndx < SHN_LORESERVE ?
4295 (section_headers [psym->st_shndx].sh_type == SHT_NOBITS)
4298 check_def = (psym->st_shndx != SHN_UNDEF);
4300 if ((vers_data & 0x8000) || vers_data > 1)
4302 if (is_nobits || ! check_def)
4304 Elf_External_Verneed evn;
4305 Elf_Internal_Verneed ivn;
4306 Elf_Internal_Vernaux ivna;
4308 /* We must test both. */
4309 offset = version_info
4310 [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
4312 GET_DATA (offset, evn, "version need");
4314 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4315 ivn.vn_next = BYTE_GET (evn.vn_next);
4319 unsigned long vna_off;
4321 vna_off = offset + ivn.vn_aux;
4325 Elf_External_Vernaux evna;
4327 GET_DATA (vna_off, evna,
4328 "version need aux (3)");
4330 ivna.vna_other = BYTE_GET (evna.vna_other);
4331 ivna.vna_next = BYTE_GET (evna.vna_next);
4332 ivna.vna_name = BYTE_GET (evna.vna_name);
4334 vna_off += ivna.vna_next;
4336 while (ivna.vna_other != vers_data
4337 && ivna.vna_next != 0);
4339 if (ivna.vna_other == vers_data)
4342 offset += ivn.vn_next;
4344 while (ivn.vn_next != 0);
4346 if (ivna.vna_other == vers_data)
4349 strtab + ivna.vna_name, ivna.vna_other);
4352 else if (! is_nobits)
4353 error (_("bad dynamic symbol"));
4360 if (vers_data != 0x8001)
4362 Elf_Internal_Verdef ivd;
4363 Elf_Internal_Verdaux ivda;
4364 Elf_External_Verdaux evda;
4365 unsigned long offset;
4368 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
4373 Elf_External_Verdef evd;
4375 GET_DATA (offset, evd, "version def");
4377 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4378 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4379 ivd.vd_next = BYTE_GET (evd.vd_next);
4381 offset += ivd.vd_next;
4383 while (ivd.vd_ndx != (vers_data & 0x7fff)
4384 && ivd.vd_next != 0);
4386 offset -= ivd.vd_next;
4387 offset += ivd.vd_aux;
4389 GET_DATA (offset, evda, "version def aux");
4391 ivda.vda_name = BYTE_GET (evda.vda_name);
4393 if (psym->st_name != ivda.vda_name)
4394 printf ((vers_data & 0x8000)
4396 strtab + ivda.vda_name);
4406 if (strtab != string_table)
4412 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
4414 if (do_histogram && buckets != NULL)
4421 int nzero_counts = 0;
4424 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
4426 printf (_(" Length Number %% of total Coverage\n"));
4428 lengths = (int *) calloc (nbuckets, sizeof (int));
4429 if (lengths == NULL)
4431 error (_("Out of memory"));
4434 for (hn = 0; hn < nbuckets; ++hn)
4439 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
4442 if (maxlength < ++lengths[hn])
4447 counts = (int *) calloc (maxlength + 1, sizeof (int));
4450 error (_("Out of memory"));
4454 for (hn = 0; hn < nbuckets; ++hn)
4455 ++ counts [lengths [hn]];
4459 printf (" 0 %-10d (%5.1f%%)\n",
4460 counts[0], (counts[0] * 100.0) / nbuckets);
4461 for (si = 1; si <= maxlength; ++si)
4463 nzero_counts += counts[si] * si;
4464 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
4465 si, counts[si], (counts[si] * 100.0) / nbuckets,
4466 (nzero_counts * 100.0) / nsyms);
4474 if (buckets != NULL)
4484 process_syminfo (file)
4485 FILE * file ATTRIBUTE_UNUSED;
4489 if (dynamic_syminfo == NULL
4491 /* No syminfo, this is ok. */
4494 /* There better should be a dynamic symbol section. */
4495 if (dynamic_symbols == NULL || dynamic_strings == NULL)
4499 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
4500 dynamic_syminfo_offset, dynamic_syminfo_nent);
4502 printf (_(" Num: Name BoundTo Flags\n"));
4503 for (i = 0; i < dynamic_syminfo_nent; ++i)
4505 unsigned short int flags = dynamic_syminfo[i].si_flags;
4507 printf ("%4d: %-30s ", i,
4508 dynamic_strings + dynamic_symbols[i].st_name);
4510 switch (dynamic_syminfo[i].si_boundto)
4512 case SYMINFO_BT_SELF:
4513 fputs ("SELF ", stdout);
4515 case SYMINFO_BT_PARENT:
4516 fputs ("PARENT ", stdout);
4519 if (dynamic_syminfo[i].si_boundto > 0
4520 && dynamic_syminfo[i].si_boundto < dynamic_size)
4523 + dynamic_segment[dynamic_syminfo[i].si_boundto].d_un.d_val);
4525 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
4529 if (flags & SYMINFO_FLG_DIRECT)
4531 if (flags & SYMINFO_FLG_PASSTHRU)
4532 printf (" PASSTHRU");
4533 if (flags & SYMINFO_FLG_COPY)
4535 if (flags & SYMINFO_FLG_LAZYLOAD)
4536 printf (" LAZYLOAD");
4544 #ifdef SUPPORT_DISASSEMBLY
4546 disassemble_section (section, file)
4547 Elf32_Internal_Shdr * section;
4550 printf (_("\nAssembly dump of section %s\n"),
4551 SECTION_NAME (section));
4553 /* XXX -- to be done --- XXX */
4560 dump_section (section, file)
4561 Elf32_Internal_Shdr * section;
4564 bfd_size_type bytes;
4566 unsigned char * data;
4567 unsigned char * start;
4569 bytes = section->sh_size;
4573 printf (_("\nSection '%s' has no data to dump.\n"),
4574 SECTION_NAME (section));
4578 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
4580 addr = section->sh_addr;
4582 GET_DATA_ALLOC (section->sh_offset, bytes, start, unsigned char *,
4593 lbytes = (bytes > 16 ? 16 : bytes);
4595 printf (" 0x%8.8lx ", (unsigned long) addr);
4597 switch (elf_header.e_ident [EI_DATA])
4601 for (j = 15; j >= 0; j --)
4604 printf ("%2.2x", data [j]);
4614 for (j = 0; j < 16; j++)
4617 printf ("%2.2x", data [j]);
4627 for (j = 0; j < lbytes; j++)
4630 if (k >= ' ' && k < 0x80)
4649 static unsigned long int
4650 read_leb128 (data, length_return, sign)
4651 unsigned char * data;
4652 int * length_return;
4655 unsigned long int result = 0;
4656 unsigned int num_read = 0;
4665 result |= (byte & 0x7f) << shift;
4670 while (byte & 0x80);
4672 if (length_return != NULL)
4673 * length_return = num_read;
4675 if (sign && (shift < 32) && (byte & 0x40))
4676 result |= -1 << shift;
4681 typedef struct State_Machine_Registers
4683 unsigned long address;
4686 unsigned int column;
4690 /* This variable hold the number of the last entry seen
4691 in the File Table. */
4692 unsigned int last_file_entry;
4695 static SMR state_machine_regs;
4698 reset_state_machine (is_stmt)
4701 state_machine_regs.address = 0;
4702 state_machine_regs.file = 1;
4703 state_machine_regs.line = 1;
4704 state_machine_regs.column = 0;
4705 state_machine_regs.is_stmt = is_stmt;
4706 state_machine_regs.basic_block = 0;
4707 state_machine_regs.end_sequence = 0;
4708 state_machine_regs.last_file_entry = 0;
4711 /* Handled an extend line op. Returns true if this is the end
4714 process_extended_line_op (data, is_stmt, pointer_size)
4715 unsigned char * data;
4719 unsigned char op_code;
4722 unsigned char * name;
4725 len = read_leb128 (data, & bytes_read, 0);
4730 warn (_("badly formed extended line op encountered!"));
4735 op_code = * data ++;
4737 printf (_(" Extended opcode %d: "), op_code);
4741 case DW_LNE_end_sequence:
4742 printf (_("End of Sequence\n\n"));
4743 reset_state_machine (is_stmt);
4746 case DW_LNE_set_address:
4747 adr = byte_get (data, pointer_size);
4748 printf (_("set Address to 0x%lx\n"), adr);
4749 state_machine_regs.address = adr;
4752 case DW_LNE_define_file:
4753 printf (_(" define new File Table entry\n"));
4754 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
4756 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
4758 data += strlen (data) + 1;
4759 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4761 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4763 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4764 printf (_("%s\n\n"), name);
4768 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
4775 /* Size of pointers in the .debug_line section. This information is not
4776 really present in that section. It's obtained before dumping the debug
4777 sections by doing some pre-scan of the .debug_info section. */
4778 static int debug_line_pointer_size = 4;
4781 display_debug_lines (section, start, file)
4782 Elf32_Internal_Shdr * section;
4783 unsigned char * start;
4784 FILE * file ATTRIBUTE_UNUSED;
4786 DWARF2_External_LineInfo * external;
4787 DWARF2_Internal_LineInfo info;
4788 unsigned char * standard_opcodes;
4789 unsigned char * data = start;
4790 unsigned char * end = start + section->sh_size;
4791 unsigned char * end_of_sequence;
4794 printf (_("\nDump of debug contents of section %s:\n\n"),
4795 SECTION_NAME (section));
4799 external = (DWARF2_External_LineInfo *) data;
4801 /* Check the length of the block. */
4802 info.li_length = BYTE_GET (external->li_length);
4803 if (info.li_length > section->sh_size)
4806 (_("The line info appears to be corrupt - the section is too small\n"));
4810 /* Check its version number. */
4811 info.li_version = BYTE_GET (external->li_version);
4812 if (info.li_version != 2)
4814 warn (_("Only DWARF version 2 line info is currently supported.\n"));
4818 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
4819 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
4820 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
4821 info.li_line_base = BYTE_GET (external->li_line_base);
4822 info.li_line_range = BYTE_GET (external->li_line_range);
4823 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
4825 /* Sign extend the line base field. */
4826 info.li_line_base <<= 24;
4827 info.li_line_base >>= 24;
4829 printf (_(" Length: %ld\n"), info.li_length);
4830 printf (_(" DWARF Version: %d\n"), info.li_version);
4831 printf (_(" Prolgue Length: %d\n"), info.li_prologue_length);
4832 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
4833 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
4834 printf (_(" Line Base: %d\n"), info.li_line_base);
4835 printf (_(" Line Range: %d\n"), info.li_line_range);
4836 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
4838 end_of_sequence = data + info.li_length + sizeof (info.li_length);
4840 reset_state_machine (info.li_default_is_stmt);
4842 /* Display the contents of the Opcodes table. */
4843 standard_opcodes = data + sizeof (* external);
4845 printf (_("\n Opcodes:\n"));
4847 for (i = 1; i < info.li_opcode_base; i++)
4848 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
4850 /* Display the contents of the Directory table. */
4851 data = standard_opcodes + info.li_opcode_base - 1;
4854 printf (_("\n The Directory Table is empty.\n"));
4857 printf (_("\n The Directory Table:\n"));
4861 printf (_(" %s\n"), data);
4863 data += strlen (data) + 1;
4867 /* Skip the NUL at the end of the table. */
4870 /* Display the contents of the File Name table. */
4872 printf (_("\n The File Name Table is empty.\n"));
4875 printf (_("\n The File Name Table:\n"));
4876 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
4883 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
4886 data += strlen (data) + 1;
4888 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4890 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4892 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4894 printf (_("%s\n"), name);
4898 /* Skip the NUL at the end of the table. */
4901 /* Now display the statements. */
4902 printf (_("\n Line Number Statements:\n"));
4905 while (data < end_of_sequence)
4907 unsigned char op_code;
4911 op_code = * data ++;
4915 case DW_LNS_extended_op:
4916 data += process_extended_line_op (data, info.li_default_is_stmt,
4917 debug_line_pointer_size);
4921 printf (_(" Copy\n"));
4924 case DW_LNS_advance_pc:
4925 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
4927 state_machine_regs.address += adv;
4928 printf (_(" Advance PC by %d to %lx\n"), adv,
4929 state_machine_regs.address);
4932 case DW_LNS_advance_line:
4933 adv = read_leb128 (data, & bytes_read, 1);
4935 state_machine_regs.line += adv;
4936 printf (_(" Advance Line by %d to %d\n"), adv,
4937 state_machine_regs.line);
4940 case DW_LNS_set_file:
4941 adv = read_leb128 (data, & bytes_read, 0);
4943 printf (_(" Set File Name to entry %d in the File Name Table\n"),
4945 state_machine_regs.file = adv;
4948 case DW_LNS_set_column:
4949 adv = read_leb128 (data, & bytes_read, 0);
4951 printf (_(" Set column to %d\n"), adv);
4952 state_machine_regs.column = adv;
4955 case DW_LNS_negate_stmt:
4956 adv = state_machine_regs.is_stmt;
4958 printf (_(" Set is_stmt to %d\n"), adv);
4959 state_machine_regs.is_stmt = adv;
4962 case DW_LNS_set_basic_block:
4963 printf (_(" Set basic block\n"));
4964 state_machine_regs.basic_block = 1;
4967 case DW_LNS_const_add_pc:
4968 adv = (((255 - info.li_opcode_base) / info.li_line_range)
4969 * info.li_min_insn_length);
4970 state_machine_regs.address += adv;
4971 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
4972 state_machine_regs.address);
4975 case DW_LNS_fixed_advance_pc:
4976 adv = byte_get (data, 2);
4978 state_machine_regs.address += adv;
4979 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
4980 adv, state_machine_regs.address);
4984 op_code -= info.li_opcode_base;
4985 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
4986 state_machine_regs.address += adv;
4987 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
4988 op_code, adv, state_machine_regs.address);
4989 adv = (op_code % info.li_line_range) + info.li_line_base;
4990 state_machine_regs.line += adv;
4991 printf (_(" and Line by %d to %d\n"),
4992 adv, state_machine_regs.line);
5003 display_debug_pubnames (section, start, file)
5004 Elf32_Internal_Shdr * section;
5005 unsigned char * start;
5006 FILE * file ATTRIBUTE_UNUSED;
5008 DWARF2_External_PubNames * external;
5009 DWARF2_Internal_PubNames pubnames;
5010 unsigned char * end;
5012 end = start + section->sh_size;
5014 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
5018 unsigned char * data;
5019 unsigned long offset;
5021 external = (DWARF2_External_PubNames *) start;
5023 pubnames.pn_length = BYTE_GET (external->pn_length);
5024 pubnames.pn_version = BYTE_GET (external->pn_version);
5025 pubnames.pn_offset = BYTE_GET (external->pn_offset);
5026 pubnames.pn_size = BYTE_GET (external->pn_size);
5028 data = start + sizeof (* external);
5029 start += pubnames.pn_length + sizeof (external->pn_length);
5031 if (pubnames.pn_version != 2)
5033 warn (_("Only DWARF 2 pubnames are currently supported"));
5037 printf (_(" Length: %ld\n"),
5038 pubnames.pn_length);
5039 printf (_(" Version: %d\n"),
5040 pubnames.pn_version);
5041 printf (_(" Offset into .debug_info section: %ld\n"),
5042 pubnames.pn_offset);
5043 printf (_(" Size of area in .debug_info section: %ld\n"),
5046 printf (_("\n Offset\tName\n"));
5050 offset = byte_get (data, 4);
5055 printf (" %ld\t\t%s\n", offset, data);
5056 data += strlen (data) + 1;
5059 while (offset != 0);
5072 case DW_TAG_padding: return "DW_TAG_padding";
5073 case DW_TAG_array_type: return "DW_TAG_array_type";
5074 case DW_TAG_class_type: return "DW_TAG_class_type";
5075 case DW_TAG_entry_point: return "DW_TAG_entry_point";
5076 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
5077 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
5078 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
5079 case DW_TAG_label: return "DW_TAG_label";
5080 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
5081 case DW_TAG_member: return "DW_TAG_member";
5082 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
5083 case DW_TAG_reference_type: return "DW_TAG_reference_type";
5084 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
5085 case DW_TAG_string_type: return "DW_TAG_string_type";
5086 case DW_TAG_structure_type: return "DW_TAG_structure_type";
5087 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
5088 case DW_TAG_typedef: return "DW_TAG_typedef";
5089 case DW_TAG_union_type: return "DW_TAG_union_type";
5090 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
5091 case DW_TAG_variant: return "DW_TAG_variant";
5092 case DW_TAG_common_block: return "DW_TAG_common_block";
5093 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
5094 case DW_TAG_inheritance: return "DW_TAG_inheritance";
5095 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
5096 case DW_TAG_module: return "DW_TAG_module";
5097 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
5098 case DW_TAG_set_type: return "DW_TAG_set_type";
5099 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
5100 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
5101 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
5102 case DW_TAG_base_type: return "DW_TAG_base_type";
5103 case DW_TAG_catch_block: return "DW_TAG_catch_block";
5104 case DW_TAG_const_type: return "DW_TAG_const_type";
5105 case DW_TAG_constant: return "DW_TAG_constant";
5106 case DW_TAG_enumerator: return "DW_TAG_enumerator";
5107 case DW_TAG_file_type: return "DW_TAG_file_type";
5108 case DW_TAG_friend: return "DW_TAG_friend";
5109 case DW_TAG_namelist: return "DW_TAG_namelist";
5110 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
5111 case DW_TAG_packed_type: return "DW_TAG_packed_type";
5112 case DW_TAG_subprogram: return "DW_TAG_subprogram";
5113 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
5114 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
5115 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
5116 case DW_TAG_try_block: return "DW_TAG_try_block";
5117 case DW_TAG_variant_part: return "DW_TAG_variant_part";
5118 case DW_TAG_variable: return "DW_TAG_variable";
5119 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
5120 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
5121 case DW_TAG_format_label: return "DW_TAG_format_label";
5122 case DW_TAG_function_template: return "DW_TAG_function_template";
5123 case DW_TAG_class_template: return "DW_TAG_class_template";
5126 static char buffer [100];
5128 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
5135 get_AT_name (attribute)
5136 unsigned long attribute;
5140 case DW_AT_sibling: return "DW_AT_sibling";
5141 case DW_AT_location: return "DW_AT_location";
5142 case DW_AT_name: return "DW_AT_name";
5143 case DW_AT_ordering: return "DW_AT_ordering";
5144 case DW_AT_subscr_data: return "DW_AT_subscr_data";
5145 case DW_AT_byte_size: return "DW_AT_byte_size";
5146 case DW_AT_bit_offset: return "DW_AT_bit_offset";
5147 case DW_AT_bit_size: return "DW_AT_bit_size";
5148 case DW_AT_element_list: return "DW_AT_element_list";
5149 case DW_AT_stmt_list: return "DW_AT_stmt_list";
5150 case DW_AT_low_pc: return "DW_AT_low_pc";
5151 case DW_AT_high_pc: return "DW_AT_high_pc";
5152 case DW_AT_language: return "DW_AT_language";
5153 case DW_AT_member: return "DW_AT_member";
5154 case DW_AT_discr: return "DW_AT_discr";
5155 case DW_AT_discr_value: return "DW_AT_discr_value";
5156 case DW_AT_visibility: return "DW_AT_visibility";
5157 case DW_AT_import: return "DW_AT_import";
5158 case DW_AT_string_length: return "DW_AT_string_length";
5159 case DW_AT_common_reference: return "DW_AT_common_reference";
5160 case DW_AT_comp_dir: return "DW_AT_comp_dir";
5161 case DW_AT_const_value: return "DW_AT_const_value";
5162 case DW_AT_containing_type: return "DW_AT_containing_type";
5163 case DW_AT_default_value: return "DW_AT_default_value";
5164 case DW_AT_inline: return "DW_AT_inline";
5165 case DW_AT_is_optional: return "DW_AT_is_optional";
5166 case DW_AT_lower_bound: return "DW_AT_lower_bound";
5167 case DW_AT_producer: return "DW_AT_producer";
5168 case DW_AT_prototyped: return "DW_AT_prototyped";
5169 case DW_AT_return_addr: return "DW_AT_return_addr";
5170 case DW_AT_start_scope: return "DW_AT_start_scope";
5171 case DW_AT_stride_size: return "DW_AT_stride_size";
5172 case DW_AT_upper_bound: return "DW_AT_upper_bound";
5173 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
5174 case DW_AT_accessibility: return "DW_AT_accessibility";
5175 case DW_AT_address_class: return "DW_AT_address_class";
5176 case DW_AT_artificial: return "DW_AT_artificial";
5177 case DW_AT_base_types: return "DW_AT_base_types";
5178 case DW_AT_calling_convention: return "DW_AT_calling_convention";
5179 case DW_AT_count: return "DW_AT_count";
5180 case DW_AT_data_member_location: return "DW_AT_data_member_location";
5181 case DW_AT_decl_column: return "DW_AT_decl_column";
5182 case DW_AT_decl_file: return "DW_AT_decl_file";
5183 case DW_AT_decl_line: return "DW_AT_decl_line";
5184 case DW_AT_declaration: return "DW_AT_declaration";
5185 case DW_AT_discr_list: return "DW_AT_discr_list";
5186 case DW_AT_encoding: return "DW_AT_encoding";
5187 case DW_AT_external: return "DW_AT_external";
5188 case DW_AT_frame_base: return "DW_AT_frame_base";
5189 case DW_AT_friend: return "DW_AT_friend";
5190 case DW_AT_identifier_case: return "DW_AT_identifier_case";
5191 case DW_AT_macro_info: return "DW_AT_macro_info";
5192 case DW_AT_namelist_items: return "DW_AT_namelist_items";
5193 case DW_AT_priority: return "DW_AT_priority";
5194 case DW_AT_segment: return "DW_AT_segment";
5195 case DW_AT_specification: return "DW_AT_specification";
5196 case DW_AT_static_link: return "DW_AT_static_link";
5197 case DW_AT_type: return "DW_AT_type";
5198 case DW_AT_use_location: return "DW_AT_use_location";
5199 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
5200 case DW_AT_virtuality: return "DW_AT_virtuality";
5201 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
5202 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
5203 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
5204 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
5205 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
5206 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
5207 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
5208 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
5209 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
5210 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
5211 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
5212 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
5213 case DW_AT_sf_names: return "DW_AT_sf_names";
5214 case DW_AT_src_info: return "DW_AT_src_info";
5215 case DW_AT_mac_info: return "DW_AT_mac_info";
5216 case DW_AT_src_coords: return "DW_AT_src_coords";
5217 case DW_AT_body_begin: return "DW_AT_body_begin";
5218 case DW_AT_body_end: return "DW_AT_body_end";
5221 static char buffer [100];
5223 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
5230 get_FORM_name (form)
5235 case DW_FORM_addr: return "DW_FORM_addr";
5236 case DW_FORM_block2: return "DW_FORM_block2";
5237 case DW_FORM_block4: return "DW_FORM_block4";
5238 case DW_FORM_data2: return "DW_FORM_data2";
5239 case DW_FORM_data4: return "DW_FORM_data4";
5240 case DW_FORM_data8: return "DW_FORM_data8";
5241 case DW_FORM_string: return "DW_FORM_string";
5242 case DW_FORM_block: return "DW_FORM_block";
5243 case DW_FORM_block1: return "DW_FORM_block1";
5244 case DW_FORM_data1: return "DW_FORM_data1";
5245 case DW_FORM_flag: return "DW_FORM_flag";
5246 case DW_FORM_sdata: return "DW_FORM_sdata";
5247 case DW_FORM_strp: return "DW_FORM_strp";
5248 case DW_FORM_udata: return "DW_FORM_udata";
5249 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
5250 case DW_FORM_ref1: return "DW_FORM_ref1";
5251 case DW_FORM_ref2: return "DW_FORM_ref2";
5252 case DW_FORM_ref4: return "DW_FORM_ref4";
5253 case DW_FORM_ref8: return "DW_FORM_ref8";
5254 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
5255 case DW_FORM_indirect: return "DW_FORM_indirect";
5258 static char buffer [100];
5260 sprintf (buffer, _("Unknown FORM value: %lx"), form);
5266 /* FIXME: There are better and more effiecint ways to handle
5267 these structures. For now though, I just want something that
5268 is simple to implement. */
5269 typedef struct abbrev_attr
5271 unsigned long attribute;
5273 struct abbrev_attr * next;
5277 typedef struct abbrev_entry
5279 unsigned long entry;
5282 struct abbrev_attr * first_attr;
5283 struct abbrev_attr * last_attr;
5284 struct abbrev_entry * next;
5288 static abbrev_entry * first_abbrev = NULL;
5289 static abbrev_entry * last_abbrev = NULL;
5292 free_abbrevs PARAMS ((void))
5294 abbrev_entry * abbrev;
5296 for (abbrev = first_abbrev; abbrev;)
5298 abbrev_entry * next = abbrev->next;
5301 for (attr = abbrev->first_attr; attr;)
5303 abbrev_attr * next = attr->next;
5313 last_abbrev = first_abbrev = NULL;
5317 add_abbrev (number, tag, children)
5318 unsigned long number;
5322 abbrev_entry * entry;
5324 entry = (abbrev_entry *) malloc (sizeof (* entry));
5330 entry->entry = number;
5332 entry->children = children;
5333 entry->first_attr = NULL;
5334 entry->last_attr = NULL;
5337 if (first_abbrev == NULL)
5338 first_abbrev = entry;
5340 last_abbrev->next = entry;
5342 last_abbrev = entry;
5346 add_abbrev_attr (attribute, form)
5347 unsigned long attribute;
5352 attr = (abbrev_attr *) malloc (sizeof (* attr));
5358 attr->attribute = attribute;
5362 if (last_abbrev->first_attr == NULL)
5363 last_abbrev->first_attr = attr;
5365 last_abbrev->last_attr->next = attr;
5367 last_abbrev->last_attr = attr;
5370 /* Processes the (partial) contents of a .debug_abbrev section.
5371 Returns NULL if the end of the section was encountered.
5372 Returns the address after the last byte read if the end of
5373 an abbreviation set was found. */
5375 static unsigned char *
5376 process_abbrev_section (start, end)
5377 unsigned char * start;
5378 unsigned char * end;
5380 if (first_abbrev != NULL)
5386 unsigned long entry;
5388 unsigned long attribute;
5391 entry = read_leb128 (start, & bytes_read, 0);
5392 start += bytes_read;
5394 /* A single zero is supposed to end the section according
5395 to the standard. If there's more, then signal that to
5398 return start == end ? NULL : start;
5400 tag = read_leb128 (start, & bytes_read, 0);
5401 start += bytes_read;
5403 children = * start ++;
5405 add_abbrev (entry, tag, children);
5411 attribute = read_leb128 (start, & bytes_read, 0);
5412 start += bytes_read;
5414 form = read_leb128 (start, & bytes_read, 0);
5415 start += bytes_read;
5418 add_abbrev_attr (attribute, form);
5420 while (attribute != 0);
5428 display_debug_abbrev (section, start, file)
5429 Elf32_Internal_Shdr * section;
5430 unsigned char * start;
5431 FILE * file ATTRIBUTE_UNUSED;
5433 abbrev_entry * entry;
5434 unsigned char * end = start + section->sh_size;
5436 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
5440 start = process_abbrev_section (start, end);
5442 printf (_(" Number TAG\n"));
5444 for (entry = first_abbrev; entry; entry = entry->next)
5448 printf (_(" %ld %s [%s]\n"),
5450 get_TAG_name (entry->tag),
5451 entry->children ? _("has children") : _("no children"));
5453 for (attr = entry->first_attr; attr; attr = attr->next)
5455 printf (_(" %-18s %s\n"),
5456 get_AT_name (attr->attribute),
5457 get_FORM_name (attr->form));
5469 static unsigned char *
5470 display_block (data, length)
5471 unsigned char * data;
5472 unsigned long length;
5474 printf (_(" %lu byte block: "), length);
5477 printf ("%lx ", (unsigned long) byte_get (data ++, 1));
5483 decode_location_expression (data, pointer_size)
5484 unsigned char * data;
5485 unsigned int pointer_size;
5489 unsigned long uvalue;
5496 printf ("DW_OP_addr: %lx", (unsigned long) byte_get (data, pointer_size));
5499 printf ("DW_OP_deref");
5502 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data, 1));
5505 printf ("DW_OP_const1s: %ld", (long) byte_get (data, 1));
5508 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
5511 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
5514 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
5517 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
5520 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
5521 (unsigned long) byte_get (data + 4, 4));
5524 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
5525 (long) byte_get (data + 4, 4));
5528 printf ("DW_OP_constu: %lu", read_leb128 (data, NULL, 0));
5531 printf ("DW_OP_consts: %ld", read_leb128 (data, NULL, 1));
5534 printf ("DW_OP_dup");
5537 printf ("DW_OP_drop");
5540 printf ("DW_OP_over");
5543 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data, 1));
5546 printf ("DW_OP_swap");
5549 printf ("DW_OP_rot");
5552 printf ("DW_OP_xderef");
5555 printf ("DW_OP_abs");
5558 printf ("DW_OP_and");
5561 printf ("DW_OP_div");
5564 printf ("DW_OP_minus");
5567 printf ("DW_OP_mod");
5570 printf ("DW_OP_mul");
5573 printf ("DW_OP_neg");
5576 printf ("DW_OP_not");
5579 printf ("DW_OP_or");
5582 printf ("DW_OP_plus");
5584 case DW_OP_plus_uconst:
5585 printf ("DW_OP_plus_uconst: %lu", read_leb128 (data, NULL, 0));
5588 printf ("DW_OP_shl");
5591 printf ("DW_OP_shr");
5594 printf ("DW_OP_shra");
5597 printf ("DW_OP_xor");
5600 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
5603 printf ("DW_OP_eq");
5606 printf ("DW_OP_ge");
5609 printf ("DW_OP_gt");
5612 printf ("DW_OP_le");
5615 printf ("DW_OP_lt");
5618 printf ("DW_OP_ne");
5621 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
5624 printf ("DW_OP_lit0");
5627 printf ("DW_OP_lit1");
5630 printf ("DW_OP_lit2");
5633 printf ("DW_OP_lit3");
5636 printf ("DW_OP_lit4");
5639 printf ("DW_OP_lit5");
5642 printf ("DW_OP_lit6");
5645 printf ("DW_OP_lit7");
5648 printf ("DW_OP_lit8");
5651 printf ("DW_OP_lit9");
5654 printf ("DW_OP_lit10");
5657 printf ("DW_OP_lit11");
5660 printf ("DW_OP_lit12");
5663 printf ("DW_OP_lit13");
5666 printf ("DW_OP_lit14");
5669 printf ("DW_OP_lit15");
5672 printf ("DW_OP_lit16");
5675 printf ("DW_OP_lit17");
5678 printf ("DW_OP_lit18");
5681 printf ("DW_OP_lit19");
5684 printf ("DW_OP_lit20");
5687 printf ("DW_OP_lit21");
5690 printf ("DW_OP_lit22");
5693 printf ("DW_OP_lit23");
5696 printf ("DW_OP_lit24");
5699 printf ("DW_OP_lit25");
5702 printf ("DW_OP_lit26");
5705 printf ("DW_OP_lit27");
5708 printf ("DW_OP_lit28");
5711 printf ("DW_OP_lit29");
5714 printf ("DW_OP_lit30");
5717 printf ("DW_OP_lit31");
5720 printf ("DW_OP_reg0");
5723 printf ("DW_OP_reg1");
5726 printf ("DW_OP_reg2");
5729 printf ("DW_OP_reg3");
5732 printf ("DW_OP_reg4");
5735 printf ("DW_OP_reg5");
5738 printf ("DW_OP_reg6");
5741 printf ("DW_OP_reg7");
5744 printf ("DW_OP_reg8");
5747 printf ("DW_OP_reg9");
5750 printf ("DW_OP_reg10");
5753 printf ("DW_OP_reg11");
5756 printf ("DW_OP_reg12");
5759 printf ("DW_OP_reg13");
5762 printf ("DW_OP_reg14");
5765 printf ("DW_OP_reg15");
5768 printf ("DW_OP_reg16");
5771 printf ("DW_OP_reg17");
5774 printf ("DW_OP_reg18");
5777 printf ("DW_OP_reg19");
5780 printf ("DW_OP_reg20");
5783 printf ("DW_OP_reg21");
5786 printf ("DW_OP_reg22");
5789 printf ("DW_OP_reg23");
5792 printf ("DW_OP_reg24");
5795 printf ("DW_OP_reg25");
5798 printf ("DW_OP_reg26");
5801 printf ("DW_OP_reg27");
5804 printf ("DW_OP_reg28");
5807 printf ("DW_OP_reg29");
5810 printf ("DW_OP_reg30");
5813 printf ("DW_OP_reg31");
5816 printf ("DW_OP_breg0: %ld", read_leb128 (data, NULL, 1));
5819 printf ("DW_OP_breg1: %ld", read_leb128 (data, NULL, 1));
5822 printf ("DW_OP_breg2: %ld", read_leb128 (data, NULL, 1));
5825 printf ("DW_OP_breg3: %ld", read_leb128 (data, NULL, 1));
5828 printf ("DW_OP_breg4: %ld", read_leb128 (data, NULL, 1));
5831 printf ("DW_OP_breg5: %ld", read_leb128 (data, NULL, 1));
5834 printf ("DW_OP_breg6: %ld", read_leb128 (data, NULL, 1));
5837 printf ("DW_OP_breg7: %ld", read_leb128 (data, NULL, 1));
5840 printf ("DW_OP_breg8: %ld", read_leb128 (data, NULL, 1));
5843 printf ("DW_OP_breg9: %ld", read_leb128 (data, NULL, 1));
5846 printf ("DW_OP_breg10: %ld", read_leb128 (data, NULL, 1));
5849 printf ("DW_OP_breg11: %ld", read_leb128 (data, NULL, 1));
5852 printf ("DW_OP_breg12: %ld", read_leb128 (data, NULL, 1));
5855 printf ("DW_OP_breg13: %ld", read_leb128 (data, NULL, 1));
5858 printf ("DW_OP_breg14: %ld", read_leb128 (data, NULL, 1));
5861 printf ("DW_OP_breg15: %ld", read_leb128 (data, NULL, 1));
5864 printf ("DW_OP_breg16: %ld", read_leb128 (data, NULL, 1));
5867 printf ("DW_OP_breg17: %ld", read_leb128 (data, NULL, 1));
5870 printf ("DW_OP_breg18: %ld", read_leb128 (data, NULL, 1));
5873 printf ("DW_OP_breg19: %ld", read_leb128 (data, NULL, 1));
5876 printf ("DW_OP_breg20: %ld", read_leb128 (data, NULL, 1));
5879 printf ("DW_OP_breg21: %ld", read_leb128 (data, NULL, 1));
5882 printf ("DW_OP_breg22: %ld", read_leb128 (data, NULL, 1));
5885 printf ("DW_OP_breg23: %ld", read_leb128 (data, NULL, 1));
5888 printf ("DW_OP_breg24: %ld", read_leb128 (data, NULL, 1));
5891 printf ("DW_OP_breg25: %ld", read_leb128 (data, NULL, 1));
5894 printf ("DW_OP_breg26: %ld", read_leb128 (data, NULL, 1));
5897 printf ("DW_OP_breg27: %ld", read_leb128 (data, NULL, 1));
5900 printf ("DW_OP_breg28: %ld", read_leb128 (data, NULL, 1));
5903 printf ("DW_OP_breg29: %ld", read_leb128 (data, NULL, 1));
5906 printf ("DW_OP_breg30: %ld", read_leb128 (data, NULL, 1));
5909 printf ("DW_OP_breg31: %ld", read_leb128 (data, NULL, 1));
5912 printf ("DW_OP_regx: %lu", read_leb128 (data, NULL, 0));
5915 printf ("DW_OP_fbreg: %ld", read_leb128 (data, NULL, 1));
5918 uvalue = read_leb128 (data, &bytes_read, 0);
5919 printf ("DW_OP_bregx: %lu %ld", uvalue,
5920 read_leb128 (data + bytes_read, NULL, 1));
5923 printf ("DW_OP_piece: %lu", read_leb128 (data, NULL, 0));
5925 case DW_OP_deref_size:
5926 printf ("DW_OP_deref_size: %ld", (long) byte_get (data, 1));
5928 case DW_OP_xderef_size:
5929 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data, 1));
5932 printf ("DW_OP_nop");
5936 if (op >= DW_OP_lo_user
5937 && op <= DW_OP_hi_user)
5938 printf (_("(User defined location op)"));
5940 printf (_("(Unknown location op)"));
5946 static unsigned char *
5947 read_and_display_attr (attribute, form, data, pointer_size)
5948 unsigned long attribute;
5950 unsigned char * data;
5951 unsigned long pointer_size;
5953 unsigned long uvalue = 0;
5954 unsigned char * block_start = NULL;
5958 printf (" %-18s:", get_AT_name (attribute));
5962 case DW_FORM_ref_addr:
5967 case DW_FORM_ref_udata:
5973 case DW_FORM_ref_addr:
5975 uvalue = byte_get (data, pointer_size);
5976 printf (is_ref ? " <%lx>" : " %#lx", uvalue);
5977 data += pointer_size;
5983 uvalue = byte_get (data ++, 1);
5984 printf (is_ref ? " <%lx>" : " %ld", uvalue);
5989 uvalue = byte_get (data, 2);
5991 printf (is_ref ? " <%lx>" : " %ld", uvalue);
5996 uvalue = byte_get (data, 4);
5998 printf (is_ref ? " <%lx>" : " %ld", uvalue);
6003 uvalue = byte_get (data, 4);
6004 printf (" %lx", uvalue);
6005 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
6009 case DW_FORM_string:
6010 printf (" %s", data);
6011 data += strlen (data) + 1;
6015 uvalue = read_leb128 (data, & bytes_read, 1);
6017 printf (" %ld", (long) uvalue);
6020 case DW_FORM_ref_udata:
6022 uvalue = read_leb128 (data, & bytes_read, 0);
6024 printf (is_ref ? " <%lx>" : " %ld", uvalue);
6028 uvalue = read_leb128 (data, & bytes_read, 0);
6029 block_start = data + bytes_read;
6030 data = display_block (block_start, uvalue);
6031 uvalue = * block_start;
6034 case DW_FORM_block1:
6035 uvalue = byte_get (data, 1);
6036 block_start = data + 1;
6037 data = display_block (block_start, uvalue);
6038 uvalue = * block_start;
6041 case DW_FORM_block2:
6042 uvalue = byte_get (data, 2);
6043 block_start = data + 2;
6044 data = display_block (block_start, uvalue);
6045 uvalue = * block_start;
6048 case DW_FORM_block4:
6049 uvalue = byte_get (data, 4);
6050 block_start = data + 4;
6051 data = display_block (block_start, uvalue);
6052 uvalue = * block_start;
6056 case DW_FORM_indirect:
6057 warn (_("Unable to handle FORM: %d"), form);
6061 warn (_("Unrecognised form: %d"), form);
6065 /* For some attributes we can display futher information. */
6074 case DW_INL_not_inlined: printf (_("(not inlined)")); break;
6075 case DW_INL_inlined: printf (_("(inlined)")); break;
6076 case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
6077 case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break;
6078 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break;
6082 case DW_AT_frame_base:
6083 if (uvalue >= DW_OP_reg0 && uvalue <= DW_OP_reg31)
6084 printf ("(reg %ld)", uvalue - DW_OP_reg0);
6087 case DW_AT_language:
6090 case DW_LANG_C: printf ("(non-ANSI C)"); break;
6091 case DW_LANG_C89: printf ("(ANSI C)"); break;
6092 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
6093 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
6094 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
6095 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
6096 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
6097 case DW_LANG_Ada83: printf ("(Ada)"); break;
6098 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
6099 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
6100 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
6101 default: printf ("(Unknown: %lx)", uvalue); break;
6105 case DW_AT_encoding:
6108 case DW_ATE_void: printf ("(void)"); break;
6109 case DW_ATE_address: printf ("(machine address)"); break;
6110 case DW_ATE_boolean: printf ("(boolean)"); break;
6111 case DW_ATE_complex_float: printf ("(complex float)"); break;
6112 case DW_ATE_float: printf ("(float)"); break;
6113 case DW_ATE_signed: printf ("(signed)"); break;
6114 case DW_ATE_signed_char: printf ("(signed char)"); break;
6115 case DW_ATE_unsigned: printf ("(unsigned)"); break;
6116 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
6118 if (uvalue >= DW_ATE_lo_user
6119 && uvalue <= DW_ATE_hi_user)
6120 printf ("(user defined type)");
6122 printf ("(unknown type)");
6127 case DW_AT_accessibility:
6130 case DW_ACCESS_public: printf ("(public)"); break;
6131 case DW_ACCESS_protected: printf ("(protected)"); break;
6132 case DW_ACCESS_private: printf ("(private)"); break;
6133 default: printf ("(unknown accessibility)"); break;
6137 case DW_AT_visibility:
6140 case DW_VIS_local: printf ("(local)"); break;
6141 case DW_VIS_exported: printf ("(exported)"); break;
6142 case DW_VIS_qualified: printf ("(qualified)"); break;
6143 default: printf ("(unknown visibility)"); break;
6147 case DW_AT_virtuality:
6150 case DW_VIRTUALITY_none: printf ("(none)"); break;
6151 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
6152 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
6153 default: printf ("(unknown virtuality)"); break;
6157 case DW_AT_identifier_case:
6160 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
6161 case DW_ID_up_case: printf ("(up_case)"); break;
6162 case DW_ID_down_case: printf ("(down_case)"); break;
6163 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
6164 default: printf ("(unknown case)"); break;
6168 case DW_AT_calling_convention:
6171 case DW_CC_normal: printf ("(normal)"); break;
6172 case DW_CC_program: printf ("(program)"); break;
6173 case DW_CC_nocall: printf ("(nocall)"); break;
6175 if (uvalue >= DW_CC_lo_user
6176 && uvalue <= DW_CC_hi_user)
6177 printf ("(user defined)");
6179 printf ("(unknown convention)");
6183 case DW_AT_location:
6184 case DW_AT_data_member_location:
6185 case DW_AT_vtable_elem_location:
6187 decode_location_expression (block_start, pointer_size);
6200 display_debug_info (section, start, file)
6201 Elf32_Internal_Shdr * section;
6202 unsigned char * start;
6205 unsigned char * end = start + section->sh_size;
6206 unsigned char * section_begin = start;
6208 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
6212 DWARF2_External_CompUnit * external;
6213 DWARF2_Internal_CompUnit compunit;
6214 unsigned char * tags;
6218 external = (DWARF2_External_CompUnit *) start;
6220 compunit.cu_length = BYTE_GET (external->cu_length);
6221 compunit.cu_version = BYTE_GET (external->cu_version);
6222 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
6223 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
6225 tags = start + sizeof (* external);
6226 start += compunit.cu_length + sizeof (external->cu_length);
6228 if (compunit.cu_version != 2)
6230 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
6234 printf (_(" Compilation Unit:\n"));
6235 printf (_(" Length: %ld\n"), compunit.cu_length);
6236 printf (_(" Version: %d\n"), compunit.cu_version);
6237 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
6238 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
6240 if (first_abbrev != NULL)
6243 /* Read in the abbrevs used by this compilation unit. */
6246 Elf32_Internal_Shdr * sec;
6247 unsigned char * begin;
6249 /* Locate the .debug_abbrev section and process it. */
6250 for (i = 0, sec = section_headers;
6251 i < elf_header.e_shnum;
6253 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
6256 if (i == -1 || sec->sh_size == 0)
6258 warn (_("Unable to locate .debug_abbrev section!\n"));
6262 GET_DATA_ALLOC (sec->sh_offset, sec->sh_size, begin, unsigned char *,
6263 "debug_abbrev section data");
6265 process_abbrev_section (begin + compunit.cu_abbrev_offset,
6266 begin + sec->sh_size);
6272 while (tags < start)
6275 unsigned long abbrev_number;
6276 abbrev_entry * entry;
6279 abbrev_number = read_leb128 (tags, & bytes_read, 0);
6282 /* A null DIE marks the end of a list of children. */
6283 if (abbrev_number == 0)
6289 /* Scan through the abbreviation list until we reach the
6291 for (entry = first_abbrev;
6292 entry && entry->entry != abbrev_number;
6293 entry = entry->next)
6298 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
6303 printf (_(" <%d><%x>: Abbrev Number: %lu (%s)\n"),
6304 level, tags - section_begin - bytes_read,
6306 get_TAG_name (entry->tag));
6308 for (attr = entry->first_attr; attr; attr = attr->next)
6309 tags = read_and_display_attr (attr->attribute,
6312 compunit.cu_pointer_size);
6314 if (entry->children)
6325 display_debug_aranges (section, start, file)
6326 Elf32_Internal_Shdr * section;
6327 unsigned char * start;
6328 FILE * file ATTRIBUTE_UNUSED;
6330 unsigned char * end = start + section->sh_size;
6332 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
6336 DWARF2_External_ARange * external;
6337 DWARF2_Internal_ARange arange;
6338 unsigned char * ranges;
6339 unsigned long length;
6340 unsigned long address;
6343 external = (DWARF2_External_ARange *) start;
6345 arange.ar_length = BYTE_GET (external->ar_length);
6346 arange.ar_version = BYTE_GET (external->ar_version);
6347 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
6348 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
6349 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
6351 printf (_(" Length: %ld\n"), arange.ar_length);
6352 printf (_(" Version: %d\n"), arange.ar_version);
6353 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
6354 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
6355 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
6357 printf (_("\n Address Length\n"));
6359 ranges = start + sizeof (* external);
6361 /* Must pad to an alignment boundary that is twice the pointer size. */
6362 excess = sizeof (*external) % (2 * arange.ar_pointer_size);
6364 ranges += (2 * arange.ar_pointer_size) - excess;
6368 address = byte_get (ranges, arange.ar_pointer_size);
6370 ranges += arange.ar_pointer_size;
6372 length = byte_get (ranges, arange.ar_pointer_size);
6374 ranges += arange.ar_pointer_size;
6376 /* A pair of zeros marks the end of the list. */
6377 if (address == 0 && length == 0)
6380 printf (" %8.8lx %lu\n", address, length);
6383 start += arange.ar_length + sizeof (external->ar_length);
6393 display_debug_not_supported (section, start, file)
6394 Elf32_Internal_Shdr * section;
6395 unsigned char * start ATTRIBUTE_UNUSED;
6396 FILE * file ATTRIBUTE_UNUSED;
6398 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
6399 SECTION_NAME (section));
6404 /* Pre-scan the .debug_info section to record the size of address.
6405 When dumping the .debug_line, we use that size information, assuming
6406 that all compilation units have the same address size. */
6408 prescan_debug_info (section, start, file)
6409 Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
6410 unsigned char * start;
6411 FILE * file ATTRIBUTE_UNUSED;
6413 DWARF2_External_CompUnit * external;
6415 external = (DWARF2_External_CompUnit *) start;
6417 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
6421 /* A structure containing the name of a debug section and a pointer
6422 to a function that can decode it. The third field is a prescan
6423 function to be run over the section before displaying any of the
6428 int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
6429 int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
6433 { ".debug_info", display_debug_info, prescan_debug_info },
6434 { ".debug_abbrev", display_debug_abbrev, NULL },
6435 { ".debug_line", display_debug_lines, NULL },
6436 { ".debug_aranges", display_debug_aranges, NULL },
6437 { ".debug_pubnames", display_debug_pubnames, NULL },
6438 { ".debug_macinfo", display_debug_not_supported, NULL },
6439 { ".debug_frame", display_debug_not_supported, NULL },
6440 { ".debug_str", display_debug_not_supported, NULL },
6441 { ".debug_static_func", display_debug_not_supported, NULL },
6442 { ".debug_static_vars", display_debug_not_supported, NULL },
6443 { ".debug_types", display_debug_not_supported, NULL },
6444 { ".debug_weaknames", display_debug_not_supported, NULL }
6448 display_debug_section (section, file)
6449 Elf32_Internal_Shdr * section;
6452 char * name = SECTION_NAME (section);
6453 bfd_size_type length;
6454 unsigned char * start;
6457 length = section->sh_size;
6460 printf (_("\nSection '%s' has no debugging data.\n"), name);
6464 GET_DATA_ALLOC (section->sh_offset, length, start, unsigned char *,
6465 "debug section data");
6467 /* See if we know how to display the contents of this section. */
6468 for (i = NUM_ELEM (debug_displays); i--;)
6469 if (strcmp (debug_displays[i].name, name) == 0)
6471 debug_displays[i].display (section, start, file);
6476 printf (_("Unrecognised debug section: %s\n"), name);
6480 /* If we loaded in the abbrev section at some point,
6481 we must release it here. */
6482 if (first_abbrev != NULL)
6489 process_section_contents (file)
6492 Elf32_Internal_Shdr * section;
6498 /* Pre-scan the debug sections to find some debug information not
6499 present in some of them. For the .debug_line, we must find out the
6500 size of address (specified in .debug_info and .debug_aranges). */
6501 for (i = 0, section = section_headers;
6502 i < elf_header.e_shnum && i < num_dump_sects;
6505 char * name = SECTION_NAME (section);
6508 if (section->sh_size == 0)
6511 /* See if there is some pre-scan operation for this section. */
6512 for (j = NUM_ELEM (debug_displays); j--;)
6513 if (strcmp (debug_displays[j].name, name) == 0)
6515 if (debug_displays[j].prescan != NULL)
6517 bfd_size_type length;
6518 unsigned char * start;
6520 length = section->sh_size;
6521 GET_DATA_ALLOC (section->sh_offset, length, start, unsigned char *,
6522 "debug section data");
6524 debug_displays[j].prescan (section, start, file);
6532 for (i = 0, section = section_headers;
6533 i < elf_header.e_shnum && i < num_dump_sects;
6536 #ifdef SUPPORT_DISASSEMBLY
6537 if (dump_sects[i] & DISASS_DUMP)
6538 disassemble_section (section, file);
6540 if (dump_sects[i] & HEX_DUMP)
6541 dump_section (section, file);
6543 if (dump_sects[i] & DEBUG_DUMP)
6544 display_debug_section (section, file);
6547 if (i < num_dump_sects)
6548 warn (_("Some sections were not dumped because they do not exist!\n"));
6554 process_mips_fpe_exception (mask)
6560 if (mask & OEX_FPU_INEX)
6561 fputs ("INEX", stdout), first = 0;
6562 if (mask & OEX_FPU_UFLO)
6563 printf ("%sUFLO", first ? "" : "|"), first = 0;
6564 if (mask & OEX_FPU_OFLO)
6565 printf ("%sOFLO", first ? "" : "|"), first = 0;
6566 if (mask & OEX_FPU_DIV0)
6567 printf ("%sDIV0", first ? "" : "|"), first = 0;
6568 if (mask & OEX_FPU_INVAL)
6569 printf ("%sINVAL", first ? "" : "|");
6572 fputs ("0", stdout);
6576 process_mips_specific (file)
6579 Elf_Internal_Dyn * entry;
6580 size_t liblist_offset = 0;
6581 size_t liblistno = 0;
6582 size_t conflictsno = 0;
6583 size_t options_offset = 0;
6584 size_t conflicts_offset = 0;
6586 /* We have a lot of special sections. Thanks SGI! */
6587 if (dynamic_segment == NULL)
6588 /* No information available. */
6591 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
6592 switch (entry->d_tag)
6594 case DT_MIPS_LIBLIST:
6595 liblist_offset = entry->d_un.d_val - loadaddr;
6597 case DT_MIPS_LIBLISTNO:
6598 liblistno = entry->d_un.d_val;
6600 case DT_MIPS_OPTIONS:
6601 options_offset = entry->d_un.d_val - loadaddr;
6603 case DT_MIPS_CONFLICT:
6604 conflicts_offset = entry->d_un.d_val - loadaddr;
6606 case DT_MIPS_CONFLICTNO:
6607 conflictsno = entry->d_un.d_val;
6613 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
6615 Elf32_External_Lib * elib;
6618 GET_DATA_ALLOC (liblist_offset, liblistno * sizeof (Elf32_External_Lib),
6619 elib, Elf32_External_Lib *, "liblist");
6621 printf ("\nSection '.liblist' contains %lu entries:\n",
6622 (unsigned long) liblistno);
6623 fputs (" Library Time Stamp Checksum Version Flags\n",
6626 for (cnt = 0; cnt < liblistno; ++cnt)
6632 liblist.l_name = BYTE_GET (elib[cnt].l_name);
6633 time = BYTE_GET (elib[cnt].l_time_stamp);
6634 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
6635 liblist.l_version = BYTE_GET (elib[cnt].l_version);
6636 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
6638 strftime (timebuf, 20, "%Y-%m-%dT%H:%M:%S", gmtime (&time));
6640 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt,
6641 dynamic_strings + liblist.l_name, timebuf,
6642 liblist.l_checksum, liblist.l_version);
6644 if (liblist.l_flags == 0)
6655 { " EXACT_MATCH", LL_EXACT_MATCH },
6656 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
6657 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
6658 { " EXPORTS", LL_EXPORTS },
6659 { " DELAY_LOAD", LL_DELAY_LOAD },
6660 { " DELTA", LL_DELTA }
6662 int flags = liblist.l_flags;
6666 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
6668 if ((flags & l_flags_vals[fcnt].bit) != 0)
6670 fputs (l_flags_vals[fcnt].name, stdout);
6671 flags ^= l_flags_vals[fcnt].bit;
6674 printf (" %#x", (unsigned int) flags);
6683 if (options_offset != 0)
6685 Elf_External_Options * eopt;
6686 Elf_Internal_Shdr * sect = section_headers;
6687 Elf_Internal_Options * iopt;
6688 Elf_Internal_Options * option;
6692 /* Find the section header so that we get the size. */
6693 while (sect->sh_type != SHT_MIPS_OPTIONS)
6696 GET_DATA_ALLOC (options_offset, sect->sh_size, eopt,
6697 Elf_External_Options *, "options");
6699 iopt = (Elf_Internal_Options *) malloc ((sect->sh_size / sizeof (eopt))
6703 error (_("Out of memory"));
6710 while (offset < sect->sh_size)
6712 Elf_External_Options * eoption;
6714 eoption = (Elf_External_Options *) ((char *) eopt + offset);
6716 option->kind = BYTE_GET (eoption->kind);
6717 option->size = BYTE_GET (eoption->size);
6718 option->section = BYTE_GET (eoption->section);
6719 option->info = BYTE_GET (eoption->info);
6721 offset += option->size;
6727 printf (_("\nSection '%s' contains %d entries:\n"),
6728 string_table + sect->sh_name, cnt);
6736 switch (option->kind)
6739 /* This shouldn't happen. */
6740 printf (" NULL %d %lx", option->section, option->info);
6743 printf (" REGINFO ");
6744 if (elf_header.e_machine == EM_MIPS)
6747 Elf32_External_RegInfo *ereg;
6748 Elf32_RegInfo reginfo;
6750 ereg = (Elf32_External_RegInfo *) (option + 1);
6751 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
6752 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
6753 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
6754 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
6755 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
6756 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
6758 printf ("GPR %08lx GP 0x%lx\n",
6760 (unsigned long) reginfo.ri_gp_value);
6761 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
6762 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
6763 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
6768 Elf64_External_RegInfo * ereg;
6769 Elf64_Internal_RegInfo reginfo;
6771 ereg = (Elf64_External_RegInfo *) (option + 1);
6772 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
6773 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
6774 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
6775 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
6776 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
6777 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
6779 printf ("GPR %08lx GP 0x",
6780 reginfo.ri_gprmask);
6781 printf_vma (reginfo.ri_gp_value);
6784 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
6785 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
6786 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
6790 case ODK_EXCEPTIONS:
6791 fputs (" EXCEPTIONS fpe_min(", stdout);
6792 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
6793 fputs (") fpe_max(", stdout);
6794 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
6795 fputs (")", stdout);
6797 if (option->info & OEX_PAGE0)
6798 fputs (" PAGE0", stdout);
6799 if (option->info & OEX_SMM)
6800 fputs (" SMM", stdout);
6801 if (option->info & OEX_FPDBUG)
6802 fputs (" FPDBUG", stdout);
6803 if (option->info & OEX_DISMISS)
6804 fputs (" DISMISS", stdout);
6807 fputs (" PAD ", stdout);
6808 if (option->info & OPAD_PREFIX)
6809 fputs (" PREFIX", stdout);
6810 if (option->info & OPAD_POSTFIX)
6811 fputs (" POSTFIX", stdout);
6812 if (option->info & OPAD_SYMBOL)
6813 fputs (" SYMBOL", stdout);
6816 fputs (" HWPATCH ", stdout);
6817 if (option->info & OHW_R4KEOP)
6818 fputs (" R4KEOP", stdout);
6819 if (option->info & OHW_R8KPFETCH)
6820 fputs (" R8KPFETCH", stdout);
6821 if (option->info & OHW_R5KEOP)
6822 fputs (" R5KEOP", stdout);
6823 if (option->info & OHW_R5KCVTL)
6824 fputs (" R5KCVTL", stdout);
6827 fputs (" FILL ", stdout);
6828 /* XXX Print content of info word? */
6831 fputs (" TAGS ", stdout);
6832 /* XXX Print content of info word? */
6835 fputs (" HWAND ", stdout);
6836 if (option->info & OHWA0_R4KEOP_CHECKED)
6837 fputs (" R4KEOP_CHECKED", stdout);
6838 if (option->info & OHWA0_R4KEOP_CLEAN)
6839 fputs (" R4KEOP_CLEAN", stdout);
6842 fputs (" HWOR ", stdout);
6843 if (option->info & OHWA0_R4KEOP_CHECKED)
6844 fputs (" R4KEOP_CHECKED", stdout);
6845 if (option->info & OHWA0_R4KEOP_CLEAN)
6846 fputs (" R4KEOP_CLEAN", stdout);
6849 printf (" GP_GROUP %#06lx self-contained %#06lx",
6850 option->info & OGP_GROUP,
6851 (option->info & OGP_SELF) >> 16);
6854 printf (" IDENT %#06lx self-contained %#06lx",
6855 option->info & OGP_GROUP,
6856 (option->info & OGP_SELF) >> 16);
6859 /* This shouldn't happen. */
6860 printf (" %3d ??? %d %lx",
6861 option->kind, option->section, option->info);
6865 len = sizeof (*eopt);
6866 while (len < option->size)
6867 if (((char *) option)[len] >= ' '
6868 && ((char *) option)[len] < 0x7f)
6869 printf ("%c", ((char *) option)[len++]);
6871 printf ("\\%03o", ((char *) option)[len++]);
6873 fputs ("\n", stdout);
6880 if (conflicts_offset != 0 && conflictsno != 0)
6882 Elf32_External_Conflict * econf32;
6883 Elf64_External_Conflict * econf64;
6884 Elf32_Conflict * iconf;
6887 if (dynamic_symbols == NULL)
6889 error (_("conflict list with without table"));
6893 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (*iconf));
6896 error (_("Out of memory"));
6902 GET_DATA_ALLOC (conflicts_offset, conflictsno * sizeof (*econf32),
6903 econf32, Elf32_External_Conflict *, "conflict");
6905 for (cnt = 0; cnt < conflictsno; ++cnt)
6906 iconf[cnt] = BYTE_GET (econf32[cnt]);
6910 GET_DATA_ALLOC (conflicts_offset, conflictsno * sizeof (*econf64),
6911 econf64, Elf64_External_Conflict *, "conflict");
6913 for (cnt = 0; cnt < conflictsno; ++cnt)
6914 iconf[cnt] = BYTE_GET (econf64[cnt]);
6917 printf (_("\nSection '.conflict' contains %d entries:\n"), conflictsno);
6918 puts (_(" Num: Index Value Name"));
6920 for (cnt = 0; cnt < conflictsno; ++cnt)
6922 Elf_Internal_Sym * psym = &dynamic_symbols[iconf[cnt]];
6924 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
6925 print_vma (psym->st_value, FULL_HEX);
6926 printf (" %s\n", dynamic_strings + psym->st_name);
6936 get_note_type (e_type)
6939 static char buff[64];
6943 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
6944 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
6945 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
6946 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
6947 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
6948 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
6949 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
6950 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
6951 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
6952 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
6953 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
6955 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
6960 /* Note that by the ELF standard, the name field is already null byte
6961 terminated, and namesz includes the terminating null byte.
6962 I.E. the value of namesz for the name "FSF" is 4.
6964 If the value of namesz is zero, there is no name present. */
6966 process_note (pnote)
6967 Elf32_Internal_Note * pnote;
6969 printf (" %s\t\t0x%08lx\t%s\n",
6970 pnote->namesz ? pnote->namedata : "(NONE)",
6971 pnote->descsz, get_note_type (pnote->type));
6977 process_corefile_note_segment (file, offset, length)
6982 Elf_External_Note * pnotes;
6983 Elf_External_Note * external;
6989 GET_DATA_ALLOC (offset, length, pnotes, Elf_External_Note *, "notes");
6993 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
6994 (unsigned long) offset,
6995 (unsigned long) length);
6996 printf (_(" Owner\t\tData size\tDescription\n"));
6998 while (external < (Elf_External_Note *)((char *) pnotes + length))
7000 Elf32_Internal_Note inote;
7003 inote.type = BYTE_GET (external->type);
7004 inote.namesz = BYTE_GET (external->namesz);
7005 inote.namedata = external->name;
7006 inote.descsz = BYTE_GET (external->descsz);
7007 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
7008 inote.descpos = offset + (inote.descdata - (char *) pnotes);
7010 external = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
7012 /* Verify that name is null terminated. It appears that at least
7013 one version of Linux (RedHat 6.0) generates corefiles that don't
7014 comply with the ELF spec by failing to include the null byte in
7016 if (inote.namedata[inote.namesz] != '\0')
7018 temp = malloc (inote.namesz + 1);
7022 error (_("Out of memory\n"));
7027 strncpy (temp, inote.namedata, inote.namesz);
7028 temp[inote.namesz] = 0;
7030 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
7031 inote.namedata = temp;
7034 res &= process_note (& inote);
7049 process_corefile_note_segments (file)
7052 Elf_Internal_Phdr * program_headers;
7053 Elf_Internal_Phdr * segment;
7057 program_headers = (Elf_Internal_Phdr *) malloc
7058 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
7060 if (program_headers == NULL)
7062 error (_("Out of memory\n"));
7067 i = get_32bit_program_headers (file, program_headers);
7069 i = get_64bit_program_headers (file, program_headers);
7073 free (program_headers);
7077 for (i = 0, segment = program_headers;
7078 i < elf_header.e_phnum;
7081 if (segment->p_type == PT_NOTE)
7082 res &= process_corefile_note_segment (file,
7083 (bfd_vma) segment->p_offset,
7084 (bfd_vma) segment->p_filesz);
7087 free (program_headers);
7093 process_corefile_contents (file)
7096 /* If we have not been asked to display the notes then do nothing. */
7100 /* If file is not a core file then exit. */
7101 if (elf_header.e_type != ET_CORE)
7104 /* No program headers means no NOTE segment. */
7105 if (elf_header.e_phnum == 0)
7107 printf (_("No note segments present in the core file.\n"));
7111 return process_corefile_note_segments (file);
7115 process_arch_specific (file)
7121 switch (elf_header.e_machine)
7124 case EM_MIPS_RS4_BE:
7125 return process_mips_specific (file);
7134 get_file_header (file)
7137 /* Read in the identity array. */
7138 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
7141 /* Determine how to read the rest of the header. */
7142 switch (elf_header.e_ident [EI_DATA])
7144 default: /* fall through */
7145 case ELFDATANONE: /* fall through */
7146 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
7147 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
7150 /* For now we only support 32 bit and 64 bit ELF files. */
7151 is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
7153 /* Read in the rest of the header. */
7156 Elf32_External_Ehdr ehdr32;
7158 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
7161 elf_header.e_type = BYTE_GET (ehdr32.e_type);
7162 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
7163 elf_header.e_version = BYTE_GET (ehdr32.e_version);
7164 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
7165 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
7166 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
7167 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
7168 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
7169 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
7170 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
7171 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
7172 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
7173 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
7177 Elf64_External_Ehdr ehdr64;
7179 /* If we have been compiled with sizeof (bfd_vma) == 4, then
7180 we will not be able to cope with the 64bit data found in
7181 64 ELF files. Detect this now and abort before we start
7182 overwritting things. */
7183 if (sizeof (bfd_vma) < 8)
7185 error (_("This instance of readelf has been built without support for a\n"));
7186 error (_("64 bit data type and so it cannot read 64 bit ELF files.\n"));
7190 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
7193 elf_header.e_type = BYTE_GET (ehdr64.e_type);
7194 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
7195 elf_header.e_version = BYTE_GET (ehdr64.e_version);
7196 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
7197 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
7198 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
7199 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
7200 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
7201 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
7202 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
7203 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
7204 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
7205 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
7212 process_file (file_name)
7216 struct stat statbuf;
7219 if (stat (file_name, & statbuf) < 0)
7221 error (_("Cannot stat input file %s.\n"), file_name);
7225 file = fopen (file_name, "rb");
7228 error (_("Input file %s not found.\n"), file_name);
7232 if (! get_file_header (file))
7234 error (_("%s: Failed to read file header\n"), file_name);
7239 /* Initialise per file variables. */
7240 for (i = NUM_ELEM (version_info); i--;)
7241 version_info[i] = 0;
7243 for (i = NUM_ELEM (dynamic_info); i--;)
7244 dynamic_info[i] = 0;
7246 /* Process the file. */
7248 printf (_("\nFile: %s\n"), file_name);
7250 if (! process_file_header ())
7256 process_section_headers (file);
7258 process_program_headers (file);
7260 process_dynamic_segment (file);
7262 process_relocs (file);
7264 process_symbol_table (file);
7266 process_syminfo (file);
7268 process_version_sections (file);
7270 process_section_contents (file);
7272 process_corefile_contents (file);
7274 process_arch_specific (file);
7278 if (section_headers)
7280 free (section_headers);
7281 section_headers = NULL;
7286 free (string_table);
7287 string_table = NULL;
7290 if (dynamic_strings)
7292 free (dynamic_strings);
7293 dynamic_strings = NULL;
7296 if (dynamic_symbols)
7298 free (dynamic_symbols);
7299 dynamic_symbols = NULL;
7300 num_dynamic_syms = 0;
7303 if (dynamic_syminfo)
7305 free (dynamic_syminfo);
7306 dynamic_syminfo = NULL;
7310 #ifdef SUPPORT_DISASSEMBLY
7311 /* Needed by the i386 disassembler. For extra credit, someone could
7312 fix this so that we insert symbolic addresses here, esp for GOT/PLT
7316 print_address (unsigned int addr, FILE * outfile)
7318 fprintf (outfile,"0x%8.8x", addr);
7321 /* Needed by the i386 disassembler. */
7323 db_task_printsym (unsigned int addr)
7325 print_address (addr, stderr);
7334 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
7335 setlocale (LC_MESSAGES, "");
7337 bindtextdomain (PACKAGE, LOCALEDIR);
7338 textdomain (PACKAGE);
7340 parse_args (argc, argv);
7342 if (optind < (argc - 1))
7345 while (optind < argc)
7346 process_file (argv [optind ++]);
7348 if (dump_sects != NULL)