1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 #include <sys/types.h>
32 /* Define BFD64 here, even if our default architecture is 32 bit ELF
33 as this will allow us to read in and parse 64bit and 32bit ELF files.
34 Only do this if we belive that the compiler can support a 64 bit
35 data type. For now we only rely on GCC being able to do this. */
41 #include "elf/common.h"
42 #include "elf/external.h"
43 #include "elf/internal.h"
44 #include "elf/dwarf2.h"
46 /* The following headers use the elf/reloc-macros.h file to
47 automatically generate relocation recognition functions
48 such as elf_mips_reloc_type() */
50 #define RELOC_MACROS_GEN_FUNC
52 #include "elf/alpha.h"
68 #include "elf/mcore.h"
71 #include "elf/mn10200.h"
72 #include "elf/mn10300.h"
78 #include "elf/sparc.h"
80 #include "elf/x86-64.h"
81 #include "elf/xstormy16.h"
86 char * program_name = "readelf";
87 unsigned int dynamic_addr;
88 bfd_size_type dynamic_size;
89 unsigned int rela_addr;
90 unsigned int rela_size;
91 char * dynamic_strings;
93 unsigned long string_table_length;
94 unsigned long num_dynamic_syms;
95 Elf_Internal_Sym * dynamic_symbols;
96 Elf_Internal_Syminfo * dynamic_syminfo;
97 unsigned long dynamic_syminfo_offset;
98 unsigned int dynamic_syminfo_nent;
99 char program_interpreter [64];
100 int dynamic_info[DT_JMPREL + 1];
101 int version_info[16];
103 Elf_Internal_Ehdr elf_header;
104 Elf_Internal_Shdr * section_headers;
105 Elf_Internal_Dyn * dynamic_segment;
106 Elf_Internal_Shdr * symtab_shndx_hdr;
114 int do_using_dynamic;
122 int do_debug_abbrevs;
124 int do_debug_pubnames;
125 int do_debug_aranges;
127 int do_debug_frames_interp;
128 int do_debug_macinfo;
135 /* A dynamic array of flags indicating which sections require dumping. */
136 char * dump_sects = NULL;
137 unsigned int num_dump_sects = 0;
139 #define HEX_DUMP (1 << 0)
140 #define DISASS_DUMP (1 << 1)
141 #define DEBUG_DUMP (1 << 2)
143 /* How to rpint a vma value. */
144 typedef enum print_mode
156 /* Forward declarations for dumb compilers. */
157 static void print_vma PARAMS ((bfd_vma, print_mode));
158 static void print_symbol PARAMS ((int, char *));
159 static bfd_vma (* byte_get) PARAMS ((unsigned char *, int));
160 static bfd_vma byte_get_little_endian PARAMS ((unsigned char *, int));
161 static bfd_vma byte_get_big_endian PARAMS ((unsigned char *, int));
162 static const char * get_mips_dynamic_type PARAMS ((unsigned long));
163 static const char * get_sparc64_dynamic_type PARAMS ((unsigned long));
164 static const char * get_ppc64_dynamic_type PARAMS ((unsigned long));
165 static const char * get_parisc_dynamic_type PARAMS ((unsigned long));
166 static const char * get_dynamic_type PARAMS ((unsigned long));
167 static int slurp_rela_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **, unsigned long *));
168 static int slurp_rel_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rel **, unsigned long *));
169 static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
170 static char * get_file_type PARAMS ((unsigned));
171 static char * get_machine_name PARAMS ((unsigned));
172 static void decode_ARM_machine_flags PARAMS ((unsigned, char []));
173 static char * get_machine_flags PARAMS ((unsigned, unsigned));
174 static const char * get_mips_segment_type PARAMS ((unsigned long));
175 static const char * get_parisc_segment_type PARAMS ((unsigned long));
176 static const char * get_ia64_segment_type PARAMS ((unsigned long));
177 static const char * get_segment_type PARAMS ((unsigned long));
178 static const char * get_mips_section_type_name PARAMS ((unsigned int));
179 static const char * get_parisc_section_type_name PARAMS ((unsigned int));
180 static const char * get_ia64_section_type_name PARAMS ((unsigned int));
181 static const char * get_section_type_name PARAMS ((unsigned int));
182 static const char * get_symbol_binding PARAMS ((unsigned int));
183 static const char * get_symbol_type PARAMS ((unsigned int));
184 static const char * get_symbol_visibility PARAMS ((unsigned int));
185 static const char * get_symbol_index_type PARAMS ((unsigned int));
186 static const char * get_dynamic_flags PARAMS ((bfd_vma));
187 static void usage PARAMS ((void));
188 static void parse_args PARAMS ((int, char **));
189 static int process_file_header PARAMS ((void));
190 static int process_program_headers PARAMS ((FILE *));
191 static int process_section_headers PARAMS ((FILE *));
192 static int process_unwind PARAMS ((FILE *));
193 static void dynamic_segment_mips_val PARAMS ((Elf_Internal_Dyn *));
194 static void dynamic_segment_parisc_val PARAMS ((Elf_Internal_Dyn *));
195 static int process_dynamic_segment PARAMS ((FILE *));
196 static int process_symbol_table PARAMS ((FILE *));
197 static int process_syminfo PARAMS ((FILE *));
198 static int process_section_contents PARAMS ((FILE *));
199 static void process_mips_fpe_exception PARAMS ((int));
200 static int process_mips_specific PARAMS ((FILE *));
201 static int process_file PARAMS ((char *));
202 static int process_relocs PARAMS ((FILE *));
203 static int process_version_sections PARAMS ((FILE *));
204 static char * get_ver_flags PARAMS ((unsigned int));
205 static int get_32bit_section_headers PARAMS ((FILE *, unsigned int));
206 static int get_64bit_section_headers PARAMS ((FILE *, unsigned int));
207 static int get_32bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
208 static int get_64bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
209 static int get_file_header PARAMS ((FILE *));
210 static Elf_Internal_Sym * get_32bit_elf_symbols PARAMS ((FILE *, Elf_Internal_Shdr *));
211 static Elf_Internal_Sym * get_64bit_elf_symbols PARAMS ((FILE *, Elf_Internal_Shdr *));
212 static const char * get_elf_section_flags PARAMS ((bfd_vma));
213 static int * get_dynamic_data PARAMS ((FILE *, unsigned int));
214 static int get_32bit_dynamic_segment PARAMS ((FILE *));
215 static int get_64bit_dynamic_segment PARAMS ((FILE *));
216 #ifdef SUPPORT_DISASSEMBLY
217 static int disassemble_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
219 static int dump_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
220 static int display_debug_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
221 static int display_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
222 static int display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
223 static int prescan_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
224 static int display_debug_lines PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
225 static int display_debug_pubnames PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
226 static int display_debug_abbrev PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
227 static int display_debug_aranges PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
228 static int display_debug_frames PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
229 static int display_debug_macinfo PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
230 static int display_debug_str PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
231 static int display_debug_loc PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
232 static unsigned char * process_abbrev_section PARAMS ((unsigned char *, unsigned char *));
233 static void load_debug_str PARAMS ((FILE *));
234 static void free_debug_str PARAMS ((void));
235 static const char * fetch_indirect_string PARAMS ((unsigned long));
236 static void load_debug_loc PARAMS ((FILE *));
237 static void free_debug_loc PARAMS ((void));
238 static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int));
239 static int process_extended_line_op PARAMS ((unsigned char *, int, int));
240 static void reset_state_machine PARAMS ((int));
241 static char * get_TAG_name PARAMS ((unsigned long));
242 static char * get_AT_name PARAMS ((unsigned long));
243 static char * get_FORM_name PARAMS ((unsigned long));
244 static void free_abbrevs PARAMS ((void));
245 static void add_abbrev PARAMS ((unsigned long, unsigned long, int));
246 static void add_abbrev_attr PARAMS ((unsigned long, unsigned long));
247 static unsigned char * read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
248 static unsigned char * read_and_display_attr_value PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
249 static unsigned char * display_block PARAMS ((unsigned char *, unsigned long));
250 static void decode_location_expression PARAMS ((unsigned char *, unsigned int, unsigned long));
251 static void request_dump PARAMS ((unsigned int, int));
252 static const char * get_elf_class PARAMS ((unsigned int));
253 static const char * get_data_encoding PARAMS ((unsigned int));
254 static const char * get_osabi_name PARAMS ((unsigned int));
255 static int guess_is_rela PARAMS ((unsigned long));
256 static const char * get_note_type PARAMS ((unsigned int));
257 static const char * get_netbsd_elfcore_note_type PARAMS ((unsigned int));
258 static int process_note PARAMS ((Elf32_Internal_Note *));
259 static int process_corefile_note_segment PARAMS ((FILE *, bfd_vma, bfd_vma));
260 static int process_corefile_note_segments PARAMS ((FILE *));
261 static int process_corefile_contents PARAMS ((FILE *));
262 static int process_arch_specific PARAMS ((FILE *));
264 typedef int Elf32_Word;
272 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
273 ((X)->sh_name >= string_table_length \
274 ? "<corrupt>" : string_table + (X)->sh_name))
276 /* Given st_shndx I, map to section_headers index. */
277 #define SECTION_HEADER_INDEX(I) \
278 ((I) < SHN_LORESERVE \
280 : ((I) <= SHN_HIRESERVE \
282 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
284 /* Reverse of the above. */
285 #define SECTION_HEADER_NUM(N) \
286 ((N) < SHN_LORESERVE \
288 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
290 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
292 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
294 #define BYTE_GET(field) byte_get (field, sizeof (field))
296 /* If we can support a 64 bit data type then BFD64 should be defined
297 and sizeof (bfd_vma) == 8. In this case when translating from an
298 external 8 byte field to an internal field, we can assume that the
299 internal field is also 8 bytes wide and so we can extract all the data.
300 If, however, BFD64 is not defined, then we must assume that the
301 internal data structure only has 4 byte wide fields that are the
302 equivalent of the 8 byte wide external counterparts, and so we must
303 truncate the data. */
305 #define BYTE_GET8(field) byte_get (field, -8)
307 #define BYTE_GET8(field) byte_get (field, 8)
310 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
312 #define GET_ELF_SYMBOLS(file, section) \
313 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
314 : get_64bit_elf_symbols (file, section))
318 error VPARAMS ((const char *message, ...))
320 VA_OPEN (args, message);
321 VA_FIXEDARG (args, const char *, message);
323 fprintf (stderr, _("%s: Error: "), program_name);
324 vfprintf (stderr, message, args);
329 warn VPARAMS ((const char *message, ...))
331 VA_OPEN (args, message);
332 VA_FIXEDARG (args, const char *, message);
334 fprintf (stderr, _("%s: Warning: "), program_name);
335 vfprintf (stderr, message, args);
339 static PTR get_data PARAMS ((PTR, FILE *, long, size_t, const char *));
342 get_data (var, file, offset, size, reason)
354 if (fseek (file, offset, SEEK_SET))
356 error (_("Unable to seek to %x for %s\n"), offset, reason);
363 mvar = (PTR) malloc (size);
367 error (_("Out of memory allocating %d bytes for %s\n"),
373 if (fread (mvar, size, 1, file) != 1)
375 error (_("Unable to read in %d bytes of %s\n"), size, reason);
385 byte_get_little_endian (field, size)
386 unsigned char * field;
395 return ((unsigned int) (field [0]))
396 | (((unsigned int) (field [1])) << 8);
400 /* We want to extract data from an 8 byte wide field and
401 place it into a 4 byte wide field. Since this is a little
402 endian source we can juts use the 4 byte extraction code. */
406 return ((unsigned long) (field [0]))
407 | (((unsigned long) (field [1])) << 8)
408 | (((unsigned long) (field [2])) << 16)
409 | (((unsigned long) (field [3])) << 24);
414 /* This is a special case, generated by the BYTE_GET8 macro.
415 It means that we are loading an 8 byte value from a field
416 in an external structure into an 8 byte value in a field
417 in an internal strcuture. */
418 return ((bfd_vma) (field [0]))
419 | (((bfd_vma) (field [1])) << 8)
420 | (((bfd_vma) (field [2])) << 16)
421 | (((bfd_vma) (field [3])) << 24)
422 | (((bfd_vma) (field [4])) << 32)
423 | (((bfd_vma) (field [5])) << 40)
424 | (((bfd_vma) (field [6])) << 48)
425 | (((bfd_vma) (field [7])) << 56);
428 error (_("Unhandled data length: %d\n"), size);
433 /* Print a VMA value. */
435 print_vma (vma, mode)
445 case FULL_HEX: printf ("0x"); /* drop through */
446 case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
447 case PREFIX_HEX: printf ("0x"); /* drop through */
448 case HEX: printf ("%lx", (unsigned long) vma); break;
449 case DEC: printf ("%ld", (unsigned long) vma); break;
450 case DEC_5: printf ("%5ld", (long) vma); break;
451 case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
472 #if BFD_HOST_64BIT_LONG
475 if (_bfd_int64_high (vma))
476 printf ("%lx%8.8lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
478 printf ("%lx", _bfd_int64_low (vma));
483 #if BFD_HOST_64BIT_LONG
486 if (_bfd_int64_high (vma))
488 printf ("++%ld", _bfd_int64_low (vma));
490 printf ("%ld", _bfd_int64_low (vma));
495 #if BFD_HOST_64BIT_LONG
496 printf ("%5ld", vma);
498 if (_bfd_int64_high (vma))
500 printf ("++%ld", _bfd_int64_low (vma));
502 printf ("%5ld", _bfd_int64_low (vma));
507 #if BFD_HOST_64BIT_LONG
510 if (_bfd_int64_high (vma))
512 printf ("++%lu", _bfd_int64_low (vma));
514 printf ("%lu", _bfd_int64_low (vma));
522 /* Display a symbol on stdout. If do_wide is not true then
523 format the symbol to be at most WIDTH characters,
524 truhncating as necessary. If WIDTH is negative then
525 format the string to be exactly - WIDTH characters,
526 truncating or padding as necessary. */
529 print_symbol (width, symbol)
536 printf ("%-*.*s", width, width, symbol);
538 printf ("%-.*s", width, symbol);
542 byte_get_big_endian (field, size)
543 unsigned char * field;
552 return ((unsigned int) (field [1])) | (((int) (field [0])) << 8);
555 return ((unsigned long) (field [3]))
556 | (((unsigned long) (field [2])) << 8)
557 | (((unsigned long) (field [1])) << 16)
558 | (((unsigned long) (field [0])) << 24);
562 /* Although we are extracing data from an 8 byte wide field, we
563 are returning only 4 bytes of data. */
564 return ((unsigned long) (field [7]))
565 | (((unsigned long) (field [6])) << 8)
566 | (((unsigned long) (field [5])) << 16)
567 | (((unsigned long) (field [4])) << 24);
571 /* This is a special case, generated by the BYTE_GET8 macro.
572 It means that we are loading an 8 byte value from a field
573 in an external structure into an 8 byte value in a field
574 in an internal strcuture. */
575 return ((bfd_vma) (field [7]))
576 | (((bfd_vma) (field [6])) << 8)
577 | (((bfd_vma) (field [5])) << 16)
578 | (((bfd_vma) (field [4])) << 24)
579 | (((bfd_vma) (field [3])) << 32)
580 | (((bfd_vma) (field [2])) << 40)
581 | (((bfd_vma) (field [1])) << 48)
582 | (((bfd_vma) (field [0])) << 56);
586 error (_("Unhandled data length: %d\n"), size);
591 /* Guess the relocation size commonly used by the specific machines. */
594 guess_is_rela (e_machine)
595 unsigned long e_machine;
599 /* Targets that use REL relocations. */
614 /* Targets that use RELA relocations. */
629 case EM_CYGNUS_MN10200:
631 case EM_CYGNUS_MN10300:
668 warn (_("Don't know about relocations on this machine architecture\n"));
674 slurp_rela_relocs (file, rel_offset, rel_size, relasp, nrelasp)
676 unsigned long rel_offset;
677 unsigned long rel_size;
678 Elf_Internal_Rela **relasp;
679 unsigned long *nrelasp;
681 Elf_Internal_Rela *relas;
682 unsigned long nrelas;
687 Elf32_External_Rela * erelas;
689 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset,
690 rel_size, _("relocs"));
694 nrelas = rel_size / sizeof (Elf32_External_Rela);
696 relas = (Elf_Internal_Rela *)
697 malloc (nrelas * sizeof (Elf_Internal_Rela));
701 error(_("out of memory parsing relocs"));
705 for (i = 0; i < nrelas; i++)
707 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
708 relas[i].r_info = BYTE_GET (erelas[i].r_info);
709 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
716 Elf64_External_Rela * erelas;
718 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset,
719 rel_size, _("relocs"));
723 nrelas = rel_size / sizeof (Elf64_External_Rela);
725 relas = (Elf_Internal_Rela *)
726 malloc (nrelas * sizeof (Elf_Internal_Rela));
730 error(_("out of memory parsing relocs"));
734 for (i = 0; i < nrelas; i++)
736 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
737 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
738 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
749 slurp_rel_relocs (file, rel_offset, rel_size, relsp, nrelsp)
751 unsigned long rel_offset;
752 unsigned long rel_size;
753 Elf_Internal_Rel **relsp;
754 unsigned long *nrelsp;
756 Elf_Internal_Rel *rels;
762 Elf32_External_Rel * erels;
764 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset,
765 rel_size, _("relocs"));
769 nrels = rel_size / sizeof (Elf32_External_Rel);
771 rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
775 error(_("out of memory parsing relocs"));
779 for (i = 0; i < nrels; i++)
781 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
782 rels[i].r_info = BYTE_GET (erels[i].r_info);
789 Elf64_External_Rel * erels;
791 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset,
792 rel_size, _("relocs"));
796 nrels = rel_size / sizeof (Elf64_External_Rel);
798 rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
802 error(_("out of memory parsing relocs"));
806 for (i = 0; i < nrels; i++)
808 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
809 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
819 /* Display the contents of the relocation data found at the specified offset. */
821 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
823 unsigned long rel_offset;
824 unsigned long rel_size;
825 Elf_Internal_Sym * symtab;
831 Elf_Internal_Rel * rels;
832 Elf_Internal_Rela * relas;
835 if (is_rela == UNKNOWN)
836 is_rela = guess_is_rela (elf_header.e_machine);
840 if (!slurp_rela_relocs (file, rel_offset, rel_size, &relas, &rel_size))
845 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
854 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
856 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
861 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
863 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
871 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
873 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
878 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
880 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
884 for (i = 0; i < rel_size; i++)
887 const char * rtype2 = NULL;
888 const char * rtype3 = NULL;
891 bfd_vma symtab_index;
893 bfd_vma type2 = (bfd_vma) NULL;
894 bfd_vma type3 = (bfd_vma) NULL;
898 offset = relas [i].r_offset;
899 info = relas [i].r_info;
903 offset = rels [i].r_offset;
904 info = rels [i].r_info;
909 type = ELF32_R_TYPE (info);
910 symtab_index = ELF32_R_SYM (info);
914 if (elf_header.e_machine == EM_MIPS)
916 type = ELF64_MIPS_R_TYPE (info);
917 type2 = ELF64_MIPS_R_TYPE2 (info);
918 type3 = ELF64_MIPS_R_TYPE3 (info);
920 else if (elf_header.e_machine == EM_SPARCV9)
921 type = ELF64_R_TYPE_ID (info);
923 type = ELF64_R_TYPE (info);
924 /* The #ifdef BFD64 below is to prevent a compile time warning.
925 We know that if we do not have a 64 bit data type that we
926 will never execute this code anyway. */
928 symtab_index = ELF64_R_SYM (info);
934 #ifdef _bfd_int64_low
935 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
937 printf ("%8.8lx %8.8lx ", offset, info);
942 #ifdef _bfd_int64_low
944 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
945 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
946 _bfd_int64_high (offset),
947 _bfd_int64_low (offset),
948 _bfd_int64_high (info),
949 _bfd_int64_low (info));
952 ? "%16.16lx %16.16lx "
953 : "%12.12lx %12.12lx ",
958 switch (elf_header.e_machine)
966 rtype = elf_m32r_reloc_type (type);
971 rtype = elf_i386_reloc_type (type);
975 rtype = elf_m68k_reloc_type (type);
979 rtype = elf_i960_reloc_type (type);
984 rtype = elf_avr_reloc_type (type);
991 rtype = elf_sparc_reloc_type (type);
996 rtype = v850_reloc_type (type);
1000 case EM_CYGNUS_D10V:
1001 rtype = elf_d10v_reloc_type (type);
1005 case EM_CYGNUS_D30V:
1006 rtype = elf_d30v_reloc_type (type);
1010 rtype = elf_sh_reloc_type (type);
1014 case EM_CYGNUS_MN10300:
1015 rtype = elf_mn10300_reloc_type (type);
1019 case EM_CYGNUS_MN10200:
1020 rtype = elf_mn10200_reloc_type (type);
1024 case EM_CYGNUS_FR30:
1025 rtype = elf_fr30_reloc_type (type);
1029 rtype = elf_mcore_reloc_type (type);
1033 rtype = elf_mmix_reloc_type (type);
1038 rtype = elf_ppc_reloc_type (type);
1042 case EM_MIPS_RS3_LE:
1043 rtype = elf_mips_reloc_type (type);
1046 rtype2 = elf_mips_reloc_type (type2);
1047 rtype3 = elf_mips_reloc_type (type3);
1052 rtype = elf_alpha_reloc_type (type);
1056 rtype = elf_arm_reloc_type (type);
1060 rtype = elf_arc_reloc_type (type);
1064 rtype = elf_hppa_reloc_type (type);
1070 rtype = elf_h8_reloc_type (type);
1075 rtype = elf_or32_reloc_type (type);
1080 rtype = elf_pj_reloc_type (type);
1083 rtype = elf_ia64_reloc_type (type);
1087 rtype = elf_cris_reloc_type (type);
1091 rtype = elf_i860_reloc_type (type);
1095 rtype = elf_x86_64_reloc_type (type);
1100 rtype = elf_s390_reloc_type (type);
1104 rtype = elf_xstormy16_reloc_type (type);
1109 #ifdef _bfd_int64_low
1110 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type));
1112 printf (_("unrecognized: %-7lx"), type);
1115 printf (do_wide ? "%-21.21s" : "%-17.17s", rtype);
1119 if (symtab == NULL || symtab_index >= nsyms)
1120 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
1123 Elf_Internal_Sym * psym;
1125 psym = symtab + symtab_index;
1128 print_vma (psym->st_value, LONG_HEX);
1129 printf (is_32bit_elf ? " " : " ");
1131 if (psym->st_name == 0)
1132 print_symbol (22, SECTION_NAME (section_headers + psym->st_shndx));
1133 else if (strtab == NULL)
1134 printf (_("<string table index %3ld>"), psym->st_name);
1136 print_symbol (22, strtab + psym->st_name);
1139 printf (" + %lx", (unsigned long) relas [i].r_addend);
1144 printf ("%*c", is_32bit_elf ? (do_wide ? 34 : 28) : (do_wide ? 26 : 20), ' ');
1145 print_vma (relas[i].r_addend, LONG_HEX);
1148 if (elf_header.e_machine == EM_SPARCV9
1149 && !strcmp (rtype, "R_SPARC_OLO10"))
1150 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1154 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1156 printf (" Type2: ");
1159 #ifdef _bfd_int64_low
1160 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2));
1162 printf (_("unrecognized: %-7lx"), type2);
1165 printf ("%-17.17s", rtype2);
1167 printf("\n Type3: ");
1170 #ifdef _bfd_int64_low
1171 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3));
1173 printf (_("unrecognized: %-7lx"), type3);
1176 printf ("%-17.17s", rtype3);
1191 get_mips_dynamic_type (type)
1196 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1197 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1198 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1199 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1200 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1201 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1202 case DT_MIPS_MSYM: return "MIPS_MSYM";
1203 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1204 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1205 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1206 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1207 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1208 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1209 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1210 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1211 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1212 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1213 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1214 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1215 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1216 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1217 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1218 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1219 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1220 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1221 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1222 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1223 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1224 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1225 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1226 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1227 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1228 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1229 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1230 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1231 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1232 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1233 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1234 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1235 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1236 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1237 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1238 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1245 get_sparc64_dynamic_type (type)
1250 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1257 get_ppc64_dynamic_type (type)
1262 case DT_PPC64_GLINK: return "PPC64_GLINK";
1263 case DT_PPC64_OPD: return "PPC64_OPD";
1264 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1271 get_parisc_dynamic_type (type)
1276 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1277 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1278 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1279 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1280 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1281 case DT_HP_PREINIT: return "HP_PREINIT";
1282 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1283 case DT_HP_NEEDED: return "HP_NEEDED";
1284 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1285 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1286 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1287 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1288 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1295 get_dynamic_type (type)
1298 static char buff [32];
1302 case DT_NULL: return "NULL";
1303 case DT_NEEDED: return "NEEDED";
1304 case DT_PLTRELSZ: return "PLTRELSZ";
1305 case DT_PLTGOT: return "PLTGOT";
1306 case DT_HASH: return "HASH";
1307 case DT_STRTAB: return "STRTAB";
1308 case DT_SYMTAB: return "SYMTAB";
1309 case DT_RELA: return "RELA";
1310 case DT_RELASZ: return "RELASZ";
1311 case DT_RELAENT: return "RELAENT";
1312 case DT_STRSZ: return "STRSZ";
1313 case DT_SYMENT: return "SYMENT";
1314 case DT_INIT: return "INIT";
1315 case DT_FINI: return "FINI";
1316 case DT_SONAME: return "SONAME";
1317 case DT_RPATH: return "RPATH";
1318 case DT_SYMBOLIC: return "SYMBOLIC";
1319 case DT_REL: return "REL";
1320 case DT_RELSZ: return "RELSZ";
1321 case DT_RELENT: return "RELENT";
1322 case DT_PLTREL: return "PLTREL";
1323 case DT_DEBUG: return "DEBUG";
1324 case DT_TEXTREL: return "TEXTREL";
1325 case DT_JMPREL: return "JMPREL";
1326 case DT_BIND_NOW: return "BIND_NOW";
1327 case DT_INIT_ARRAY: return "INIT_ARRAY";
1328 case DT_FINI_ARRAY: return "FINI_ARRAY";
1329 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1330 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1331 case DT_RUNPATH: return "RUNPATH";
1332 case DT_FLAGS: return "FLAGS";
1334 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1335 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1337 case DT_CHECKSUM: return "CHECKSUM";
1338 case DT_PLTPADSZ: return "PLTPADSZ";
1339 case DT_MOVEENT: return "MOVEENT";
1340 case DT_MOVESZ: return "MOVESZ";
1341 case DT_FEATURE: return "FEATURE";
1342 case DT_POSFLAG_1: return "POSFLAG_1";
1343 case DT_SYMINSZ: return "SYMINSZ";
1344 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1346 case DT_ADDRRNGLO: return "ADDRRNGLO";
1347 case DT_CONFIG: return "CONFIG";
1348 case DT_DEPAUDIT: return "DEPAUDIT";
1349 case DT_AUDIT: return "AUDIT";
1350 case DT_PLTPAD: return "PLTPAD";
1351 case DT_MOVETAB: return "MOVETAB";
1352 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1354 case DT_VERSYM: return "VERSYM";
1356 case DT_RELACOUNT: return "RELACOUNT";
1357 case DT_RELCOUNT: return "RELCOUNT";
1358 case DT_FLAGS_1: return "FLAGS_1";
1359 case DT_VERDEF: return "VERDEF";
1360 case DT_VERDEFNUM: return "VERDEFNUM";
1361 case DT_VERNEED: return "VERNEED";
1362 case DT_VERNEEDNUM: return "VERNEEDNUM";
1364 case DT_AUXILIARY: return "AUXILIARY";
1365 case DT_USED: return "USED";
1366 case DT_FILTER: return "FILTER";
1369 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1371 const char * result;
1373 switch (elf_header.e_machine)
1376 case EM_MIPS_RS3_LE:
1377 result = get_mips_dynamic_type (type);
1380 result = get_sparc64_dynamic_type (type);
1383 result = get_ppc64_dynamic_type (type);
1393 sprintf (buff, _("Processor Specific: %lx"), type);
1395 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1397 const char * result;
1399 switch (elf_header.e_machine)
1402 result = get_parisc_dynamic_type (type);
1412 sprintf (buff, _("Operating System specific: %lx"), type);
1415 sprintf (buff, _("<unknown>: %lx"), type);
1422 get_file_type (e_type)
1425 static char buff [32];
1429 case ET_NONE: return _("NONE (None)");
1430 case ET_REL: return _("REL (Relocatable file)");
1431 case ET_EXEC: return _("EXEC (Executable file)");
1432 case ET_DYN: return _("DYN (Shared object file)");
1433 case ET_CORE: return _("CORE (Core file)");
1436 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1437 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1438 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1439 sprintf (buff, _("OS Specific: (%x)"), e_type);
1441 sprintf (buff, _("<unknown>: %x"), e_type);
1447 get_machine_name (e_machine)
1450 static char buff [64]; /* XXX */
1454 case EM_NONE: return _("None");
1455 case EM_M32: return "WE32100";
1456 case EM_SPARC: return "Sparc";
1457 case EM_386: return "Intel 80386";
1458 case EM_68K: return "MC68000";
1459 case EM_88K: return "MC88000";
1460 case EM_486: return "Intel 80486";
1461 case EM_860: return "Intel 80860";
1462 case EM_MIPS: return "MIPS R3000";
1463 case EM_S370: return "IBM System/370";
1464 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1465 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1466 case EM_PARISC: return "HPPA";
1467 case EM_PPC_OLD: return "Power PC (old)";
1468 case EM_SPARC32PLUS: return "Sparc v8+" ;
1469 case EM_960: return "Intel 90860";
1470 case EM_PPC: return "PowerPC";
1471 case EM_PPC64: return "PowerPC64";
1472 case EM_V800: return "NEC V800";
1473 case EM_FR20: return "Fujitsu FR20";
1474 case EM_RH32: return "TRW RH32";
1475 case EM_MCORE: return "MCORE";
1476 case EM_ARM: return "ARM";
1477 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1478 case EM_SH: return "Hitachi SH";
1479 case EM_SPARCV9: return "Sparc v9";
1480 case EM_TRICORE: return "Siemens Tricore";
1481 case EM_ARC: return "ARC";
1482 case EM_H8_300: return "Hitachi H8/300";
1483 case EM_H8_300H: return "Hitachi H8/300H";
1484 case EM_H8S: return "Hitachi H8S";
1485 case EM_H8_500: return "Hitachi H8/500";
1486 case EM_IA_64: return "Intel IA-64";
1487 case EM_MIPS_X: return "Stanford MIPS-X";
1488 case EM_COLDFIRE: return "Motorola Coldfire";
1489 case EM_68HC12: return "Motorola M68HC12";
1490 case EM_ALPHA: return "Alpha";
1491 case EM_CYGNUS_D10V:
1492 case EM_D10V: return "d10v";
1493 case EM_CYGNUS_D30V:
1494 case EM_D30V: return "d30v";
1495 case EM_CYGNUS_M32R:
1496 case EM_M32R: return "Mitsubishi M32r";
1497 case EM_CYGNUS_V850:
1498 case EM_V850: return "NEC v850";
1499 case EM_CYGNUS_MN10300:
1500 case EM_MN10300: return "mn10300";
1501 case EM_CYGNUS_MN10200:
1502 case EM_MN10200: return "mn10200";
1503 case EM_CYGNUS_FR30:
1504 case EM_FR30: return "Fujitsu FR30";
1506 case EM_PJ: return "picoJava";
1507 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1508 case EM_PCP: return "Siemens PCP";
1509 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1510 case EM_NDR1: return "Denso NDR1 microprocesspr";
1511 case EM_STARCORE: return "Motorola Star*Core processor";
1512 case EM_ME16: return "Toyota ME16 processor";
1513 case EM_ST100: return "STMicroelectronics ST100 processor";
1514 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1515 case EM_FX66: return "Siemens FX66 microcontroller";
1516 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1517 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1518 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1519 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1520 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1521 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1522 case EM_SVX: return "Silicon Graphics SVx";
1523 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1524 case EM_VAX: return "Digital VAX";
1526 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1527 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1528 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1529 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1530 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1531 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1532 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1533 case EM_PRISM: return "SiTera Prism";
1534 case EM_X86_64: return "Advanced Micro Devices X86-64";
1536 case EM_S390: return "IBM S/390";
1537 case EM_XSTORMY16: return "Sanyo Xstormy16 CPU core";
1539 case EM_OR32: return "OpenRISC";
1541 sprintf (buff, _("<unknown>: %x"), e_machine);
1547 decode_ARM_machine_flags (e_flags, buf)
1554 eabi = EF_ARM_EABI_VERSION (e_flags);
1555 e_flags &= ~ EF_ARM_EABIMASK;
1557 /* Handle "generic" ARM flags. */
1558 if (e_flags & EF_ARM_RELEXEC)
1560 strcat (buf, ", relocatable executable");
1561 e_flags &= ~ EF_ARM_RELEXEC;
1564 if (e_flags & EF_ARM_HASENTRY)
1566 strcat (buf, ", has entry point");
1567 e_flags &= ~ EF_ARM_HASENTRY;
1570 /* Now handle EABI specific flags. */
1574 strcat (buf, ", <unrecognized EABI>");
1579 case EF_ARM_EABI_VER1:
1580 strcat (buf, ", Version1 EABI");
1585 /* Process flags one bit at a time. */
1586 flag = e_flags & - e_flags;
1591 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1592 strcat (buf, ", sorted symbol tables");
1602 case EF_ARM_EABI_VER2:
1603 strcat (buf, ", Version2 EABI");
1608 /* Process flags one bit at a time. */
1609 flag = e_flags & - e_flags;
1614 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1615 strcat (buf, ", sorted symbol tables");
1618 case EF_ARM_DYNSYMSUSESEGIDX:
1619 strcat (buf, ", dynamic symbols use segment index");
1622 case EF_ARM_MAPSYMSFIRST:
1623 strcat (buf, ", mapping symbols precede others");
1633 case EF_ARM_EABI_UNKNOWN:
1634 strcat (buf, ", GNU EABI");
1639 /* Process flags one bit at a time. */
1640 flag = e_flags & - e_flags;
1645 case EF_ARM_INTERWORK:
1646 strcat (buf, ", interworking enabled");
1649 case EF_ARM_APCS_26:
1650 strcat (buf, ", uses APCS/26");
1653 case EF_ARM_APCS_FLOAT:
1654 strcat (buf, ", uses APCS/float");
1658 strcat (buf, ", position independent");
1662 strcat (buf, ", 8 bit structure alignment");
1665 case EF_ARM_NEW_ABI:
1666 strcat (buf, ", uses new ABI");
1669 case EF_ARM_OLD_ABI:
1670 strcat (buf, ", uses old ABI");
1673 case EF_ARM_SOFT_FLOAT:
1674 strcat (buf, ", software FP");
1685 strcat (buf,", <unknown>");
1689 get_machine_flags (e_flags, e_machine)
1693 static char buf [1024];
1705 decode_ARM_machine_flags (e_flags, buf);
1709 if (e_flags & EF_CPU32)
1710 strcat (buf, ", cpu32");
1711 if (e_flags & EF_M68000)
1712 strcat (buf, ", m68000");
1716 if (e_flags & EF_PPC_EMB)
1717 strcat (buf, ", emb");
1719 if (e_flags & EF_PPC_RELOCATABLE)
1720 strcat (buf, ", relocatable");
1722 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1723 strcat (buf, ", relocatable-lib");
1727 case EM_CYGNUS_V850:
1728 switch (e_flags & EF_V850_ARCH)
1731 strcat (buf, ", v850e");
1734 strcat (buf, ", v850ea");
1737 strcat (buf, ", v850");
1740 strcat (buf, ", unknown v850 architecture variant");
1746 case EM_CYGNUS_M32R:
1747 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1748 strcat (buf, ", m32r");
1753 case EM_MIPS_RS3_LE:
1754 if (e_flags & EF_MIPS_NOREORDER)
1755 strcat (buf, ", noreorder");
1757 if (e_flags & EF_MIPS_PIC)
1758 strcat (buf, ", pic");
1760 if (e_flags & EF_MIPS_CPIC)
1761 strcat (buf, ", cpic");
1763 if (e_flags & EF_MIPS_UCODE)
1764 strcat (buf, ", ugen_reserved");
1766 if (e_flags & EF_MIPS_ABI2)
1767 strcat (buf, ", abi2");
1769 if (e_flags & EF_MIPS_OPTIONS_FIRST)
1770 strcat (buf, ", odk first");
1772 if (e_flags & EF_MIPS_32BITMODE)
1773 strcat (buf, ", 32bitmode");
1775 switch ((e_flags & EF_MIPS_MACH))
1777 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
1778 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
1779 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
1780 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
1781 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
1782 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
1784 /* We simply ignore the field in this case to avoid confusion:
1785 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
1788 default: strcat (buf, ", unknown CPU"); break;
1791 switch ((e_flags & EF_MIPS_ABI))
1793 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
1794 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
1795 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
1796 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
1798 /* We simply ignore the field in this case to avoid confusion:
1799 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
1800 This means it is likely to be an o32 file, but not for
1803 default: strcat (buf, ", unknown ABI"); break;
1806 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
1807 strcat (buf, ", mdmx");
1809 if (e_flags & EF_MIPS_ARCH_ASE_M16)
1810 strcat (buf, ", mips16");
1812 switch ((e_flags & EF_MIPS_ARCH))
1814 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
1815 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
1816 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
1817 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
1818 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
1819 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
1820 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
1821 default: strcat (buf, ", unknown ISA"); break;
1827 if (e_flags & EF_SPARC_32PLUS)
1828 strcat (buf, ", v8+");
1830 if (e_flags & EF_SPARC_SUN_US1)
1831 strcat (buf, ", ultrasparcI");
1833 if (e_flags & EF_SPARC_SUN_US3)
1834 strcat (buf, ", ultrasparcIII");
1836 if (e_flags & EF_SPARC_HAL_R1)
1837 strcat (buf, ", halr1");
1839 if (e_flags & EF_SPARC_LEDATA)
1840 strcat (buf, ", ledata");
1842 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
1843 strcat (buf, ", tso");
1845 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
1846 strcat (buf, ", pso");
1848 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
1849 strcat (buf, ", rmo");
1853 switch (e_flags & EF_PARISC_ARCH)
1855 case EFA_PARISC_1_0:
1856 strcpy (buf, ", PA-RISC 1.0");
1858 case EFA_PARISC_1_1:
1859 strcpy (buf, ", PA-RISC 1.1");
1861 case EFA_PARISC_2_0:
1862 strcpy (buf, ", PA-RISC 2.0");
1867 if (e_flags & EF_PARISC_TRAPNIL)
1868 strcat (buf, ", trapnil");
1869 if (e_flags & EF_PARISC_EXT)
1870 strcat (buf, ", ext");
1871 if (e_flags & EF_PARISC_LSB)
1872 strcat (buf, ", lsb");
1873 if (e_flags & EF_PARISC_WIDE)
1874 strcat (buf, ", wide");
1875 if (e_flags & EF_PARISC_NO_KABP)
1876 strcat (buf, ", no kabp");
1877 if (e_flags & EF_PARISC_LAZYSWAP)
1878 strcat (buf, ", lazyswap");
1883 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
1884 strcat (buf, ", new calling convention");
1886 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
1887 strcat (buf, ", gnu calling convention");
1891 if ((e_flags & EF_IA_64_ABI64))
1892 strcat (buf, ", 64-bit");
1894 strcat (buf, ", 32-bit");
1895 if ((e_flags & EF_IA_64_REDUCEDFP))
1896 strcat (buf, ", reduced fp model");
1897 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
1898 strcat (buf, ", no function descriptors, constant gp");
1899 else if ((e_flags & EF_IA_64_CONS_GP))
1900 strcat (buf, ", constant gp");
1901 if ((e_flags & EF_IA_64_ABSOLUTE))
1902 strcat (buf, ", absolute");
1911 get_mips_segment_type (type)
1916 case PT_MIPS_REGINFO:
1918 case PT_MIPS_RTPROC:
1920 case PT_MIPS_OPTIONS:
1930 get_parisc_segment_type (type)
1935 case PT_HP_TLS: return "HP_TLS";
1936 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
1937 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
1938 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
1939 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
1940 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
1941 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
1942 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
1943 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
1944 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
1945 case PT_HP_PARALLEL: return "HP_PARALLEL";
1946 case PT_HP_FASTBIND: return "HP_FASTBIND";
1947 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
1948 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
1957 get_ia64_segment_type (type)
1962 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
1963 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
1964 case PT_HP_TLS: return "HP_TLS";
1965 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
1966 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
1967 case PT_IA_64_HP_STACK: return "HP_STACK";
1976 get_segment_type (p_type)
1977 unsigned long p_type;
1979 static char buff [32];
1983 case PT_NULL: return "NULL";
1984 case PT_LOAD: return "LOAD";
1985 case PT_DYNAMIC: return "DYNAMIC";
1986 case PT_INTERP: return "INTERP";
1987 case PT_NOTE: return "NOTE";
1988 case PT_SHLIB: return "SHLIB";
1989 case PT_PHDR: return "PHDR";
1991 case PT_GNU_EH_FRAME:
1992 return "GNU_EH_FRAME";
1995 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
1997 const char * result;
1999 switch (elf_header.e_machine)
2002 case EM_MIPS_RS3_LE:
2003 result = get_mips_segment_type (p_type);
2006 result = get_parisc_segment_type (p_type);
2009 result = get_ia64_segment_type (p_type);
2019 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
2021 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
2023 const char * result;
2025 switch (elf_header.e_machine)
2028 result = get_parisc_segment_type (p_type);
2031 result = get_ia64_segment_type (p_type);
2041 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
2044 sprintf (buff, _("<unknown>: %lx"), p_type);
2051 get_mips_section_type_name (sh_type)
2052 unsigned int sh_type;
2056 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
2057 case SHT_MIPS_MSYM: return "MIPS_MSYM";
2058 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
2059 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
2060 case SHT_MIPS_UCODE: return "MIPS_UCODE";
2061 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
2062 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
2063 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
2064 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
2065 case SHT_MIPS_RELD: return "MIPS_RELD";
2066 case SHT_MIPS_IFACE: return "MIPS_IFACE";
2067 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
2068 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
2069 case SHT_MIPS_SHDR: return "MIPS_SHDR";
2070 case SHT_MIPS_FDESC: return "MIPS_FDESC";
2071 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
2072 case SHT_MIPS_DENSE: return "MIPS_DENSE";
2073 case SHT_MIPS_PDESC: return "MIPS_PDESC";
2074 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
2075 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
2076 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
2077 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
2078 case SHT_MIPS_LINE: return "MIPS_LINE";
2079 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
2080 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
2081 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
2082 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
2083 case SHT_MIPS_DWARF: return "MIPS_DWARF";
2084 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
2085 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
2086 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
2087 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
2088 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
2089 case SHT_MIPS_XLATE: return "MIPS_XLATE";
2090 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
2091 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
2092 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
2093 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
2094 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
2102 get_parisc_section_type_name (sh_type)
2103 unsigned int sh_type;
2107 case SHT_PARISC_EXT: return "PARISC_EXT";
2108 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
2109 case SHT_PARISC_DOC: return "PARISC_DOC";
2117 get_ia64_section_type_name (sh_type)
2118 unsigned int sh_type;
2122 case SHT_IA_64_EXT: return "IA_64_EXT";
2123 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
2131 get_section_type_name (sh_type)
2132 unsigned int sh_type;
2134 static char buff [32];
2138 case SHT_NULL: return "NULL";
2139 case SHT_PROGBITS: return "PROGBITS";
2140 case SHT_SYMTAB: return "SYMTAB";
2141 case SHT_STRTAB: return "STRTAB";
2142 case SHT_RELA: return "RELA";
2143 case SHT_HASH: return "HASH";
2144 case SHT_DYNAMIC: return "DYNAMIC";
2145 case SHT_NOTE: return "NOTE";
2146 case SHT_NOBITS: return "NOBITS";
2147 case SHT_REL: return "REL";
2148 case SHT_SHLIB: return "SHLIB";
2149 case SHT_DYNSYM: return "DYNSYM";
2150 case SHT_INIT_ARRAY: return "INIT_ARRAY";
2151 case SHT_FINI_ARRAY: return "FINI_ARRAY";
2152 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2153 case SHT_GROUP: return "GROUP";
2154 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
2155 case SHT_GNU_verdef: return "VERDEF";
2156 case SHT_GNU_verneed: return "VERNEED";
2157 case SHT_GNU_versym: return "VERSYM";
2158 case 0x6ffffff0: return "VERSYM";
2159 case 0x6ffffffc: return "VERDEF";
2160 case 0x7ffffffd: return "AUXILIARY";
2161 case 0x7fffffff: return "FILTER";
2164 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
2166 const char * result;
2168 switch (elf_header.e_machine)
2171 case EM_MIPS_RS3_LE:
2172 result = get_mips_section_type_name (sh_type);
2175 result = get_parisc_section_type_name (sh_type);
2178 result = get_ia64_section_type_name (sh_type);
2188 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
2190 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
2191 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
2192 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
2193 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
2195 sprintf (buff, _("<unknown>: %x"), sh_type);
2201 struct option options [] =
2203 {"all", no_argument, 0, 'a'},
2204 {"file-header", no_argument, 0, 'h'},
2205 {"program-headers", no_argument, 0, 'l'},
2206 {"headers", no_argument, 0, 'e'},
2207 {"histogram", no_argument, 0, 'I'},
2208 {"segments", no_argument, 0, 'l'},
2209 {"sections", no_argument, 0, 'S'},
2210 {"section-headers", no_argument, 0, 'S'},
2211 {"symbols", no_argument, 0, 's'},
2212 {"syms", no_argument, 0, 's'},
2213 {"relocs", no_argument, 0, 'r'},
2214 {"notes", no_argument, 0, 'n'},
2215 {"dynamic", no_argument, 0, 'd'},
2216 {"arch-specific", no_argument, 0, 'A'},
2217 {"version-info", no_argument, 0, 'V'},
2218 {"use-dynamic", no_argument, 0, 'D'},
2219 {"hex-dump", required_argument, 0, 'x'},
2220 {"debug-dump", optional_argument, 0, 'w'},
2221 {"unwind", no_argument, 0, 'u'},
2222 #ifdef SUPPORT_DISASSEMBLY
2223 {"instruction-dump", required_argument, 0, 'i'},
2226 {"version", no_argument, 0, 'v'},
2227 {"wide", no_argument, 0, 'W'},
2228 {"help", no_argument, 0, 'H'},
2229 {0, no_argument, 0, 0}
2235 fprintf (stdout, _("Usage: readelf <option(s)> elf-file(s)\n"));
2236 fprintf (stdout, _(" Display information about the contents of ELF format files\n"));
2237 fprintf (stdout, _(" Options are:\n\
2238 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2239 -h --file-header Display the ELF file header\n\
2240 -l --program-headers Display the program headers\n\
2241 --segments An alias for --program-headers\n\
2242 -S --section-headers Display the sections' header\n\
2243 --sections An alias for --section-headers\n\
2244 -e --headers Equivalent to: -h -l -S\n\
2245 -s --syms Display the symbol table\n\
2246 --symbols An alias for --syms\n\
2247 -n --notes Display the core notes (if present)\n\
2248 -r --relocs Display the relocations (if present)\n\
2249 -u --unwind Display the unwind info (if present)\n\
2250 -d --dynamic Display the dynamic segment (if present)\n\
2251 -V --version-info Display the version sections (if present)\n\
2252 -A --arch-specific Display architecture specific information (if any).\n\
2253 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2254 -x --hex-dump=<number> Dump the contents of section <number>\n\
2255 -w --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]\n\
2256 Display the contents of DWARF2 debug sections\n"));
2257 #ifdef SUPPORT_DISASSEMBLY
2258 fprintf (stdout, _("\
2259 -i --instruction-dump=<number>\n\
2260 Disassemble the contents of section <number>\n"));
2262 fprintf (stdout, _("\
2263 -I --histogram Display histogram of bucket list lengths\n\
2264 -W --wide Allow output width to exceed 80 characters\n\
2265 -H --help Display this information\n\
2266 -v --version Display the version number of readelf\n"));
2267 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2273 request_dump (section, type)
2274 unsigned int section;
2277 if (section >= num_dump_sects)
2279 char * new_dump_sects;
2281 new_dump_sects = (char *) calloc (section + 1, 1);
2283 if (new_dump_sects == NULL)
2284 error (_("Out of memory allocating dump request table."));
2287 /* Copy current flag settings. */
2288 memcpy (new_dump_sects, dump_sects, num_dump_sects);
2292 dump_sects = new_dump_sects;
2293 num_dump_sects = section + 1;
2298 dump_sects [section] |= type;
2304 parse_args (argc, argv)
2313 while ((c = getopt_long
2314 (argc, argv, "ersuahnldSDAIw::x:i:vVW", options, NULL)) != EOF)
2350 do_using_dynamic ++;
2381 section = strtoul (optarg, & cp, 0);
2382 if (! * cp && section >= 0)
2384 request_dump (section, HEX_DUMP);
2394 unsigned int index = 0;
2398 while (optarg[index])
2399 switch (optarg[index++])
2408 do_debug_abbrevs = 1;
2418 do_debug_pubnames = 1;
2423 do_debug_aranges = 1;
2427 do_debug_frames_interp = 1;
2429 do_debug_frames = 1;
2434 do_debug_macinfo = 1;
2448 warn (_("Unrecognized debug option '%s'\n"), optarg);
2453 #ifdef SUPPORT_DISASSEMBLY
2456 section = strtoul (optarg, & cp, 0);
2457 if (! * cp && section >= 0)
2459 request_dump (section, DISASS_DUMP);
2465 print_version (program_name);
2475 /* xgettext:c-format */
2476 error (_("Invalid option '-%c'\n"), c);
2483 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
2484 && !do_segments && !do_header && !do_dump && !do_version
2485 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2489 warn (_("Nothing to do.\n"));
2495 get_elf_class (elf_class)
2496 unsigned int elf_class;
2498 static char buff [32];
2502 case ELFCLASSNONE: return _("none");
2503 case ELFCLASS32: return "ELF32";
2504 case ELFCLASS64: return "ELF64";
2506 sprintf (buff, _("<unknown: %x>"), elf_class);
2512 get_data_encoding (encoding)
2513 unsigned int encoding;
2515 static char buff [32];
2519 case ELFDATANONE: return _("none");
2520 case ELFDATA2LSB: return _("2's complement, little endian");
2521 case ELFDATA2MSB: return _("2's complement, big endian");
2523 sprintf (buff, _("<unknown: %x>"), encoding);
2529 get_osabi_name (osabi)
2532 static char buff [32];
2536 case ELFOSABI_NONE: return "UNIX - System V";
2537 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2538 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2539 case ELFOSABI_LINUX: return "UNIX - Linux";
2540 case ELFOSABI_HURD: return "GNU/Hurd";
2541 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2542 case ELFOSABI_AIX: return "UNIX - AIX";
2543 case ELFOSABI_IRIX: return "UNIX - IRIX";
2544 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2545 case ELFOSABI_TRU64: return "UNIX - TRU64";
2546 case ELFOSABI_MODESTO: return "Novell - Modesto";
2547 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2548 case ELFOSABI_STANDALONE: return _("Standalone App");
2549 case ELFOSABI_ARM: return "ARM";
2551 sprintf (buff, _("<unknown: %x>"), osabi);
2556 /* Decode the data held in 'elf_header'. */
2558 process_file_header ()
2560 if ( elf_header.e_ident [EI_MAG0] != ELFMAG0
2561 || elf_header.e_ident [EI_MAG1] != ELFMAG1
2562 || elf_header.e_ident [EI_MAG2] != ELFMAG2
2563 || elf_header.e_ident [EI_MAG3] != ELFMAG3)
2566 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2574 printf (_("ELF Header:\n"));
2575 printf (_(" Magic: "));
2576 for (i = 0; i < EI_NIDENT; i ++)
2577 printf ("%2.2x ", elf_header.e_ident [i]);
2579 printf (_(" Class: %s\n"),
2580 get_elf_class (elf_header.e_ident [EI_CLASS]));
2581 printf (_(" Data: %s\n"),
2582 get_data_encoding (elf_header.e_ident [EI_DATA]));
2583 printf (_(" Version: %d %s\n"),
2584 elf_header.e_ident [EI_VERSION],
2585 (elf_header.e_ident [EI_VERSION] == EV_CURRENT
2587 : (elf_header.e_ident [EI_VERSION] != EV_NONE
2590 printf (_(" OS/ABI: %s\n"),
2591 get_osabi_name (elf_header.e_ident [EI_OSABI]));
2592 printf (_(" ABI Version: %d\n"),
2593 elf_header.e_ident [EI_ABIVERSION]);
2594 printf (_(" Type: %s\n"),
2595 get_file_type (elf_header.e_type));
2596 printf (_(" Machine: %s\n"),
2597 get_machine_name (elf_header.e_machine));
2598 printf (_(" Version: 0x%lx\n"),
2599 (unsigned long) elf_header.e_version);
2601 printf (_(" Entry point address: "));
2602 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2603 printf (_("\n Start of program headers: "));
2604 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2605 printf (_(" (bytes into file)\n Start of section headers: "));
2606 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2607 printf (_(" (bytes into file)\n"));
2609 printf (_(" Flags: 0x%lx%s\n"),
2610 (unsigned long) elf_header.e_flags,
2611 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2612 printf (_(" Size of this header: %ld (bytes)\n"),
2613 (long) elf_header.e_ehsize);
2614 printf (_(" Size of program headers: %ld (bytes)\n"),
2615 (long) elf_header.e_phentsize);
2616 printf (_(" Number of program headers: %ld\n"),
2617 (long) elf_header.e_phnum);
2618 printf (_(" Size of section headers: %ld (bytes)\n"),
2619 (long) elf_header.e_shentsize);
2620 printf (_(" Number of section headers: %ld"),
2621 (long) elf_header.e_shnum);
2622 if (section_headers != NULL && elf_header.e_shnum == 0)
2623 printf (" (%ld)", (long) section_headers[0].sh_size);
2624 putc ('\n', stdout);
2625 printf (_(" Section header string table index: %ld"),
2626 (long) elf_header.e_shstrndx);
2627 if (section_headers != NULL && elf_header.e_shstrndx == SHN_XINDEX)
2628 printf (" (%ld)", (long) section_headers[0].sh_link);
2629 putc ('\n', stdout);
2632 if (section_headers != NULL)
2634 if (elf_header.e_shnum == 0)
2635 elf_header.e_shnum = section_headers[0].sh_size;
2636 if (elf_header.e_shstrndx == SHN_XINDEX)
2637 elf_header.e_shstrndx = section_headers[0].sh_link;
2638 free (section_headers);
2639 section_headers = NULL;
2647 get_32bit_program_headers (file, program_headers)
2649 Elf_Internal_Phdr * program_headers;
2651 Elf32_External_Phdr * phdrs;
2652 Elf32_External_Phdr * external;
2653 Elf32_Internal_Phdr * internal;
2656 phdrs = ((Elf32_External_Phdr *)
2657 get_data (NULL, file, elf_header.e_phoff,
2658 elf_header.e_phentsize * elf_header.e_phnum,
2659 _("program headers")));
2663 for (i = 0, internal = program_headers, external = phdrs;
2664 i < elf_header.e_phnum;
2665 i ++, internal ++, external ++)
2667 internal->p_type = BYTE_GET (external->p_type);
2668 internal->p_offset = BYTE_GET (external->p_offset);
2669 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2670 internal->p_paddr = BYTE_GET (external->p_paddr);
2671 internal->p_filesz = BYTE_GET (external->p_filesz);
2672 internal->p_memsz = BYTE_GET (external->p_memsz);
2673 internal->p_flags = BYTE_GET (external->p_flags);
2674 internal->p_align = BYTE_GET (external->p_align);
2683 get_64bit_program_headers (file, program_headers)
2685 Elf_Internal_Phdr * program_headers;
2687 Elf64_External_Phdr * phdrs;
2688 Elf64_External_Phdr * external;
2689 Elf64_Internal_Phdr * internal;
2692 phdrs = ((Elf64_External_Phdr *)
2693 get_data (NULL, file, elf_header.e_phoff,
2694 elf_header.e_phentsize * elf_header.e_phnum,
2695 _("program headers")));
2699 for (i = 0, internal = program_headers, external = phdrs;
2700 i < elf_header.e_phnum;
2701 i ++, internal ++, external ++)
2703 internal->p_type = BYTE_GET (external->p_type);
2704 internal->p_flags = BYTE_GET (external->p_flags);
2705 internal->p_offset = BYTE_GET8 (external->p_offset);
2706 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2707 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2708 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2709 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2710 internal->p_align = BYTE_GET8 (external->p_align);
2719 process_program_headers (file)
2722 Elf_Internal_Phdr * program_headers;
2723 Elf_Internal_Phdr * segment;
2726 if (elf_header.e_phnum == 0)
2729 printf (_("\nThere are no program headers in this file.\n"));
2733 if (do_segments && !do_header)
2735 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2736 printf (_("Entry point "));
2737 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2738 printf (_("\nThere are %d program headers, starting at offset "),
2739 elf_header.e_phnum);
2740 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2744 program_headers = (Elf_Internal_Phdr *) malloc
2745 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2747 if (program_headers == NULL)
2749 error (_("Out of memory\n"));
2754 i = get_32bit_program_headers (file, program_headers);
2756 i = get_64bit_program_headers (file, program_headers);
2760 free (program_headers);
2767 (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2771 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2774 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2778 (_(" Type Offset VirtAddr PhysAddr\n"));
2780 (_(" FileSiz MemSiz Flags Align\n"));
2788 for (i = 0, segment = program_headers;
2789 i < elf_header.e_phnum;
2794 printf (" %-14.14s ", get_segment_type (segment->p_type));
2798 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2799 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2800 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2801 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2802 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2804 (segment->p_flags & PF_R ? 'R' : ' '),
2805 (segment->p_flags & PF_W ? 'W' : ' '),
2806 (segment->p_flags & PF_X ? 'E' : ' '));
2807 printf ("%#lx", (unsigned long) segment->p_align);
2811 if ((unsigned long) segment->p_offset == segment->p_offset)
2812 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2815 print_vma (segment->p_offset, FULL_HEX);
2819 print_vma (segment->p_vaddr, FULL_HEX);
2821 print_vma (segment->p_paddr, FULL_HEX);
2824 if ((unsigned long) segment->p_filesz == segment->p_filesz)
2825 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
2828 print_vma (segment->p_filesz, FULL_HEX);
2832 if ((unsigned long) segment->p_memsz == segment->p_memsz)
2833 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
2836 print_vma (segment->p_offset, FULL_HEX);
2840 (segment->p_flags & PF_R ? 'R' : ' '),
2841 (segment->p_flags & PF_W ? 'W' : ' '),
2842 (segment->p_flags & PF_X ? 'E' : ' '));
2844 if ((unsigned long) segment->p_align == segment->p_align)
2845 printf ("%#lx", (unsigned long) segment->p_align);
2848 print_vma (segment->p_align, PREFIX_HEX);
2853 print_vma (segment->p_offset, FULL_HEX);
2855 print_vma (segment->p_vaddr, FULL_HEX);
2857 print_vma (segment->p_paddr, FULL_HEX);
2859 print_vma (segment->p_filesz, FULL_HEX);
2861 print_vma (segment->p_memsz, FULL_HEX);
2863 (segment->p_flags & PF_R ? 'R' : ' '),
2864 (segment->p_flags & PF_W ? 'W' : ' '),
2865 (segment->p_flags & PF_X ? 'E' : ' '));
2866 print_vma (segment->p_align, HEX);
2870 switch (segment->p_type)
2874 loadaddr = (segment->p_vaddr & 0xfffff000)
2875 - (segment->p_offset & 0xfffff000);
2880 error (_("more than one dynamic segment\n"));
2882 dynamic_addr = segment->p_offset;
2883 dynamic_size = segment->p_filesz;
2887 if (fseek (file, (long) segment->p_offset, SEEK_SET))
2888 error (_("Unable to find program interpreter name\n"));
2891 program_interpreter[0] = 0;
2892 fscanf (file, "%63s", program_interpreter);
2895 printf (_("\n [Requesting program interpreter: %s]"),
2896 program_interpreter);
2902 putc ('\n', stdout);
2911 if (do_segments && section_headers != NULL)
2913 printf (_("\n Section to Segment mapping:\n"));
2914 printf (_(" Segment Sections...\n"));
2916 assert (string_table != NULL);
2918 for (i = 0; i < elf_header.e_phnum; i++)
2921 Elf_Internal_Shdr * section;
2923 segment = program_headers + i;
2924 section = section_headers;
2926 printf (" %2.2d ", i);
2928 for (j = 1; j < elf_header.e_shnum; j++, section ++)
2930 if (section->sh_size > 0
2931 /* Compare allocated sections by VMA, unallocated
2932 sections by file offset. */
2933 && (section->sh_flags & SHF_ALLOC
2934 ? (section->sh_addr >= segment->p_vaddr
2935 && section->sh_addr + section->sh_size
2936 <= segment->p_vaddr + segment->p_memsz)
2937 : ((bfd_vma) section->sh_offset >= segment->p_offset
2938 && (section->sh_offset + section->sh_size
2939 <= segment->p_offset + segment->p_filesz))))
2940 printf ("%s ", SECTION_NAME (section));
2947 free (program_headers);
2954 get_32bit_section_headers (file, num)
2958 Elf32_External_Shdr * shdrs;
2959 Elf32_Internal_Shdr * internal;
2962 shdrs = ((Elf32_External_Shdr *)
2963 get_data (NULL, file, elf_header.e_shoff,
2964 elf_header.e_shentsize * num,
2965 _("section headers")));
2969 section_headers = ((Elf_Internal_Shdr *)
2970 malloc (num * sizeof (Elf_Internal_Shdr)));
2972 if (section_headers == NULL)
2974 error (_("Out of memory\n"));
2978 for (i = 0, internal = section_headers;
2982 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2983 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2984 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
2985 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
2986 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2987 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
2988 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2989 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2990 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2991 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
3000 get_64bit_section_headers (file, num)
3004 Elf64_External_Shdr * shdrs;
3005 Elf64_Internal_Shdr * internal;
3008 shdrs = ((Elf64_External_Shdr *)
3009 get_data (NULL, file, elf_header.e_shoff,
3010 elf_header.e_shentsize * num,
3011 _("section headers")));
3015 section_headers = ((Elf_Internal_Shdr *)
3016 malloc (num * sizeof (Elf_Internal_Shdr)));
3018 if (section_headers == NULL)
3020 error (_("Out of memory\n"));
3024 for (i = 0, internal = section_headers;
3028 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3029 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3030 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
3031 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
3032 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
3033 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
3034 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3035 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3036 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3037 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3045 static Elf_Internal_Sym *
3046 get_32bit_elf_symbols (file, section)
3048 Elf_Internal_Shdr *section;
3050 unsigned long number;
3051 Elf32_External_Sym * esyms;
3052 Elf_External_Sym_Shndx *shndx;
3053 Elf_Internal_Sym * isyms;
3054 Elf_Internal_Sym * psym;
3057 esyms = ((Elf32_External_Sym *)
3058 get_data (NULL, file, section->sh_offset,
3059 section->sh_size, _("symbols")));
3064 if (symtab_shndx_hdr != NULL
3065 && (symtab_shndx_hdr->sh_link
3066 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3068 shndx = ((Elf_External_Sym_Shndx *)
3069 get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3070 symtab_shndx_hdr->sh_size, _("symtab shndx")));
3078 number = section->sh_size / section->sh_entsize;
3079 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
3083 error (_("Out of memory\n"));
3090 for (j = 0, psym = isyms;
3094 psym->st_name = BYTE_GET (esyms[j].st_name);
3095 psym->st_value = BYTE_GET (esyms[j].st_value);
3096 psym->st_size = BYTE_GET (esyms[j].st_size);
3097 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3098 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3100 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3101 psym->st_info = BYTE_GET (esyms[j].st_info);
3102 psym->st_other = BYTE_GET (esyms[j].st_other);
3112 static Elf_Internal_Sym *
3113 get_64bit_elf_symbols (file, section)
3115 Elf_Internal_Shdr *section;
3117 unsigned long number;
3118 Elf64_External_Sym * esyms;
3119 Elf_External_Sym_Shndx *shndx;
3120 Elf_Internal_Sym * isyms;
3121 Elf_Internal_Sym * psym;
3124 esyms = ((Elf64_External_Sym *)
3125 get_data (NULL, file, section->sh_offset,
3126 section->sh_size, _("symbols")));
3131 if (symtab_shndx_hdr != NULL
3132 && (symtab_shndx_hdr->sh_link
3133 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3135 shndx = ((Elf_External_Sym_Shndx *)
3136 get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3137 symtab_shndx_hdr->sh_size, _("symtab shndx")));
3145 number = section->sh_size / section->sh_entsize;
3146 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
3150 error (_("Out of memory\n"));
3157 for (j = 0, psym = isyms;
3161 psym->st_name = BYTE_GET (esyms[j].st_name);
3162 psym->st_info = BYTE_GET (esyms[j].st_info);
3163 psym->st_other = BYTE_GET (esyms[j].st_other);
3164 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3165 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3167 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3168 psym->st_value = BYTE_GET8 (esyms[j].st_value);
3169 psym->st_size = BYTE_GET8 (esyms[j].st_size);
3180 get_elf_section_flags (sh_flags)
3183 static char buff [32];
3191 flag = sh_flags & - sh_flags;
3196 case SHF_WRITE: strcat (buff, "W"); break;
3197 case SHF_ALLOC: strcat (buff, "A"); break;
3198 case SHF_EXECINSTR: strcat (buff, "X"); break;
3199 case SHF_MERGE: strcat (buff, "M"); break;
3200 case SHF_STRINGS: strcat (buff, "S"); break;
3201 case SHF_INFO_LINK: strcat (buff, "I"); break;
3202 case SHF_LINK_ORDER: strcat (buff, "L"); break;
3203 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
3204 case SHF_GROUP: strcat (buff, "G"); break;
3207 if (flag & SHF_MASKOS)
3210 sh_flags &= ~ SHF_MASKOS;
3212 else if (flag & SHF_MASKPROC)
3215 sh_flags &= ~ SHF_MASKPROC;
3227 process_section_headers (file)
3230 Elf_Internal_Shdr * section;
3233 section_headers = NULL;
3235 if (elf_header.e_shnum == 0)
3238 printf (_("\nThere are no sections in this file.\n"));
3243 if (do_sections && !do_header)
3244 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3245 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
3249 if (! get_32bit_section_headers (file, elf_header.e_shnum))
3252 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
3255 /* Read in the string table, so that we have names to display. */
3256 section = SECTION_HEADER (elf_header.e_shstrndx);
3258 if (section->sh_size != 0)
3260 string_table = (char *) get_data (NULL, file, section->sh_offset,
3261 section->sh_size, _("string table"));
3263 string_table_length = section->sh_size;
3266 /* Scan the sections for the dynamic symbol table
3267 and dynamic string table and debug sections. */
3268 dynamic_symbols = NULL;
3269 dynamic_strings = NULL;
3270 dynamic_syminfo = NULL;
3272 for (i = 0, section = section_headers;
3273 i < elf_header.e_shnum;
3276 char * name = SECTION_NAME (section);
3278 if (section->sh_type == SHT_DYNSYM)
3280 if (dynamic_symbols != NULL)
3282 error (_("File contains multiple dynamic symbol tables\n"));
3286 num_dynamic_syms = section->sh_size / section->sh_entsize;
3287 dynamic_symbols = GET_ELF_SYMBOLS (file, section);
3289 else if (section->sh_type == SHT_STRTAB
3290 && strcmp (name, ".dynstr") == 0)
3292 if (dynamic_strings != NULL)
3294 error (_("File contains multiple dynamic string tables\n"));
3298 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
3300 _("dynamic strings"));
3302 else if (section->sh_type == SHT_SYMTAB_SHNDX)
3304 if (symtab_shndx_hdr != NULL)
3306 error (_("File contains multiple symtab shndx tables\n"));
3309 symtab_shndx_hdr = section;
3311 else if ((do_debugging || do_debug_info || do_debug_abbrevs
3312 || do_debug_lines || do_debug_pubnames || do_debug_aranges
3313 || do_debug_frames || do_debug_macinfo || do_debug_str
3315 && strncmp (name, ".debug_", 7) == 0)
3320 || (do_debug_info && (strcmp (name, "info") == 0))
3321 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
3322 || (do_debug_lines && (strcmp (name, "line") == 0))
3323 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
3324 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
3325 || (do_debug_frames && (strcmp (name, "frame") == 0))
3326 || (do_debug_macinfo && (strcmp (name, "macinfo") == 0))
3327 || (do_debug_str && (strcmp (name, "str") == 0))
3328 || (do_debug_loc && (strcmp (name, "loc") == 0))
3330 request_dump (i, DEBUG_DUMP);
3332 /* linkonce section to be combined with .debug_info at link time. */
3333 else if ((do_debugging || do_debug_info)
3334 && strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
3335 request_dump (i, DEBUG_DUMP);
3336 else if (do_debug_frames && strcmp (name, ".eh_frame") == 0)
3337 request_dump (i, DEBUG_DUMP);
3343 printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
3347 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3350 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3353 printf (_(" [Nr] Name Type Address Offset\n"));
3354 printf (_(" Size EntSize Flags Link Info Align\n"));
3357 for (i = 0, section = section_headers;
3358 i < elf_header.e_shnum;
3361 printf (" [%2u] %-17.17s %-15.15s ",
3362 SECTION_HEADER_NUM (i),
3363 SECTION_NAME (section),
3364 get_section_type_name (section->sh_type));
3368 print_vma (section->sh_addr, LONG_HEX);
3370 printf ( " %6.6lx %6.6lx %2.2lx",
3371 (unsigned long) section->sh_offset,
3372 (unsigned long) section->sh_size,
3373 (unsigned long) section->sh_entsize);
3375 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3377 printf ("%2ld %3lx %2ld\n",
3378 (unsigned long) section->sh_link,
3379 (unsigned long) section->sh_info,
3380 (unsigned long) section->sh_addralign);
3384 print_vma (section->sh_addr, LONG_HEX);
3386 if ((long) section->sh_offset == section->sh_offset)
3387 printf (" %6.6lx", (unsigned long) section->sh_offset);
3391 print_vma (section->sh_offset, LONG_HEX);
3394 if ((unsigned long) section->sh_size == section->sh_size)
3395 printf (" %6.6lx", (unsigned long) section->sh_size);
3399 print_vma (section->sh_size, LONG_HEX);
3402 if ((unsigned long) section->sh_entsize == section->sh_entsize)
3403 printf (" %2.2lx", (unsigned long) section->sh_entsize);
3407 print_vma (section->sh_entsize, LONG_HEX);
3410 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3412 printf ("%2ld %3lx ",
3413 (unsigned long) section->sh_link,
3414 (unsigned long) section->sh_info);
3416 if ((unsigned long) section->sh_addralign == section->sh_addralign)
3417 printf ("%2ld\n", (unsigned long) section->sh_addralign);
3420 print_vma (section->sh_addralign, DEC);
3427 print_vma (section->sh_addr, LONG_HEX);
3428 if ((long) section->sh_offset == section->sh_offset)
3429 printf (" %8.8lx", (unsigned long) section->sh_offset);
3433 print_vma (section->sh_offset, LONG_HEX);
3436 print_vma (section->sh_size, LONG_HEX);
3438 print_vma (section->sh_entsize, LONG_HEX);
3440 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3442 printf (" %2ld %3lx %ld\n",
3443 (unsigned long) section->sh_link,
3444 (unsigned long) section->sh_info,
3445 (unsigned long) section->sh_addralign);
3449 printf (_("Key to Flags:\n\
3450 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3451 I (info), L (link order), G (group), x (unknown)\n\
3452 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3457 /* Process the reloc section. */
3459 process_relocs (file)
3462 unsigned long rel_size;
3463 unsigned long rel_offset;
3469 if (do_using_dynamic)
3471 int is_rela = FALSE;
3476 if (dynamic_info[DT_REL])
3478 rel_offset = dynamic_info[DT_REL];
3479 rel_size = dynamic_info[DT_RELSZ];
3482 else if (dynamic_info [DT_RELA])
3484 rel_offset = dynamic_info[DT_RELA];
3485 rel_size = dynamic_info[DT_RELASZ];
3488 else if (dynamic_info[DT_JMPREL])
3490 rel_offset = dynamic_info[DT_JMPREL];
3491 rel_size = dynamic_info[DT_PLTRELSZ];
3493 switch (dynamic_info[DT_PLTREL])
3510 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3511 rel_offset, rel_size);
3513 dump_relocations (file, rel_offset - loadaddr, rel_size,
3514 dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
3517 printf (_("\nThere are no dynamic relocations in this file.\n"));
3521 Elf32_Internal_Shdr * section;
3525 for (i = 0, section = section_headers;
3526 i < elf_header.e_shnum;
3529 if ( section->sh_type != SHT_RELA
3530 && section->sh_type != SHT_REL)
3533 rel_offset = section->sh_offset;
3534 rel_size = section->sh_size;
3538 Elf32_Internal_Shdr * strsec;
3539 Elf_Internal_Sym * symtab;
3542 unsigned long nsyms;
3544 printf (_("\nRelocation section "));
3546 if (string_table == NULL)
3547 printf ("%d", section->sh_name);
3549 printf ("'%s'", SECTION_NAME (section));
3551 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3552 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
3557 if (section->sh_link)
3559 Elf32_Internal_Shdr * symsec;
3561 symsec = SECTION_HEADER (section->sh_link);
3562 nsyms = symsec->sh_size / symsec->sh_entsize;
3563 symtab = GET_ELF_SYMBOLS (file, symsec);
3568 strsec = SECTION_HEADER (symsec->sh_link);
3570 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3574 is_rela = section->sh_type == SHT_RELA;
3576 dump_relocations (file, rel_offset, rel_size,
3577 symtab, nsyms, strtab, is_rela);
3589 printf (_("\nThere are no relocations in this file.\n"));
3595 #include "unwind-ia64.h"
3597 /* An absolute address consists of a section and an offset. If the
3598 section is NULL, the offset itself is the address, otherwise, the
3599 address equals to LOAD_ADDRESS(section) + offset. */
3603 unsigned short section;
3609 struct unw_table_entry
3611 struct absaddr start;
3613 struct absaddr info;
3615 *table; /* Unwind table. */
3616 unsigned long table_len; /* Length of unwind table. */
3617 unsigned char * info; /* Unwind info. */
3618 unsigned long info_size; /* Size of unwind info. */
3619 bfd_vma info_addr; /* starting address of unwind info. */
3620 bfd_vma seg_base; /* Starting address of segment. */
3621 Elf_Internal_Sym * symtab; /* The symbol table. */
3622 unsigned long nsyms; /* Number of symbols. */
3623 char * strtab; /* The string table. */
3624 unsigned long strtab_size; /* Size of string table. */
3627 static void find_symbol_for_address PARAMS ((struct unw_aux_info *,
3628 struct absaddr, const char **,
3630 static void dump_ia64_unwind PARAMS ((struct unw_aux_info *));
3631 static int slurp_ia64_unwind_table PARAMS ((FILE *, struct unw_aux_info *,
3632 Elf32_Internal_Shdr *));
3635 find_symbol_for_address (aux, addr, symname, offset)
3636 struct unw_aux_info *aux;
3637 struct absaddr addr;
3638 const char **symname;
3641 bfd_vma dist = (bfd_vma) 0x100000;
3642 Elf_Internal_Sym *sym, *best = NULL;
3645 for (i = 0, sym = aux->symtab; i < aux->nsyms; ++i, ++sym)
3647 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
3648 && sym->st_name != 0
3649 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
3650 && addr.offset >= sym->st_value
3651 && addr.offset - sym->st_value < dist)
3654 dist = addr.offset - sym->st_value;
3661 *symname = (best->st_name >= aux->strtab_size
3662 ? "<corrupt>" : aux->strtab + best->st_name);
3667 *offset = addr.offset;
3671 dump_ia64_unwind (aux)
3672 struct unw_aux_info *aux;
3675 struct unw_table_entry * tp;
3678 addr_size = is_32bit_elf ? 4 : 8;
3680 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
3684 const unsigned char * dp;
3685 const unsigned char * head;
3686 const char * procname;
3688 find_symbol_for_address (aux, tp->start, &procname, &offset);
3690 fputs ("\n<", stdout);
3694 fputs (procname, stdout);
3697 printf ("+%lx", (unsigned long) offset);
3700 fputs (">: [", stdout);
3701 print_vma (tp->start.offset, PREFIX_HEX);
3702 fputc ('-', stdout);
3703 print_vma (tp->end.offset, PREFIX_HEX);
3704 printf ("), info at +0x%lx\n",
3705 (unsigned long) (tp->info.offset - aux->seg_base));
3707 head = aux->info + (tp->info.offset - aux->info_addr);
3708 stamp = BYTE_GET8 ((unsigned char *) head);
3710 printf (" v%u, flags=0x%lx (%s%s ), len=%lu bytes\n",
3711 (unsigned) UNW_VER (stamp),
3712 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
3713 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
3714 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
3715 (unsigned long) (addr_size * UNW_LENGTH (stamp)));
3717 if (UNW_VER (stamp) != 1)
3719 printf ("\tUnknown version.\n");
3724 for (dp = head + 8; dp < head + 8 + addr_size * UNW_LENGTH (stamp);)
3725 dp = unw_decode (dp, in_body, & in_body);
3730 slurp_ia64_unwind_table (file, aux, sec)
3732 struct unw_aux_info *aux;
3733 Elf32_Internal_Shdr *sec;
3735 unsigned long size, addr_size, nrelas, i;
3736 Elf_Internal_Phdr *prog_hdrs, *seg;
3737 struct unw_table_entry *tep;
3738 Elf32_Internal_Shdr *relsec;
3739 Elf_Internal_Rela *rela, *rp;
3740 unsigned char *table, *tp;
3741 Elf_Internal_Sym *sym;
3742 const char *relname;
3745 addr_size = is_32bit_elf ? 4 : 8;
3747 /* First, find the starting address of the segment that includes
3750 if (elf_header.e_phnum)
3752 prog_hdrs = (Elf_Internal_Phdr *)
3753 xmalloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
3756 result = get_32bit_program_headers (file, prog_hdrs);
3758 result = get_64bit_program_headers (file, prog_hdrs);
3766 for (seg = prog_hdrs; seg < prog_hdrs + elf_header.e_phnum; ++seg)
3768 if (seg->p_type != PT_LOAD)
3771 if (sec->sh_addr >= seg->p_vaddr
3772 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
3774 aux->seg_base = seg->p_vaddr;
3782 /* Second, build the unwind table from the contents of the unwind section: */
3783 size = sec->sh_size;
3784 table = (char *) get_data (NULL, file, sec->sh_offset,
3785 size, _("unwind table"));
3789 tep = aux->table = xmalloc (size / (3 * addr_size) * sizeof (aux->table[0]));
3790 for (tp = table; tp < table + size; tp += 3 * addr_size, ++ tep)
3792 tep->start.section = SHN_UNDEF;
3793 tep->end.section = SHN_UNDEF;
3794 tep->info.section = SHN_UNDEF;
3797 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
3798 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
3799 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
3803 tep->start.offset = BYTE_GET8 ((unsigned char *) tp + 0);
3804 tep->end.offset = BYTE_GET8 ((unsigned char *) tp + 8);
3805 tep->info.offset = BYTE_GET8 ((unsigned char *) tp + 16);
3807 tep->start.offset += aux->seg_base;
3808 tep->end.offset += aux->seg_base;
3809 tep->info.offset += aux->seg_base;
3813 /* Third, apply any relocations to the unwind table: */
3815 for (relsec = section_headers;
3816 relsec < section_headers + elf_header.e_shnum;
3819 if (relsec->sh_type != SHT_RELA
3820 || SECTION_HEADER (relsec->sh_info) != sec)
3823 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
3827 for (rp = rela; rp < rela + nrelas; ++rp)
3831 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
3832 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
3834 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
3836 warn (_("Skipping unexpected symbol type %u\n"),
3837 ELF32_ST_TYPE (sym->st_info));
3843 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
3844 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
3846 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
3848 warn (_("Skipping unexpected symbol type %u\n"),
3849 ELF64_ST_TYPE (sym->st_info));
3854 if (strncmp (relname, "R_IA64_SEGREL", 13) != 0)
3856 warn (_("Skipping unexpected relocation type %s\n"), relname);
3860 i = rp->r_offset / (3 * addr_size);
3862 switch (rp->r_offset/addr_size % 3)
3865 aux->table[i].start.section = sym->st_shndx;
3866 aux->table[i].start.offset += rp->r_addend;
3869 aux->table[i].end.section = sym->st_shndx;
3870 aux->table[i].end.offset += rp->r_addend;
3873 aux->table[i].info.section = sym->st_shndx;
3874 aux->table[i].info.offset += rp->r_addend;
3884 aux->table_len = size / (3 * addr_size);
3889 process_unwind (file)
3892 Elf32_Internal_Shdr *sec, *unwsec = NULL, *strsec;
3893 unsigned long i, addr_size, unwcount = 0, unwstart = 0;
3894 struct unw_aux_info aux;
3899 if (elf_header.e_machine != EM_IA_64)
3901 printf (_("\nThere are no unwind sections in this file.\n"));
3905 memset (& aux, 0, sizeof (aux));
3907 addr_size = is_32bit_elf ? 4 : 8;
3909 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
3911 if (sec->sh_type == SHT_SYMTAB)
3913 aux.nsyms = sec->sh_size / sec->sh_entsize;
3914 aux.symtab = GET_ELF_SYMBOLS (file, sec);
3916 strsec = SECTION_HEADER (sec->sh_link);
3917 aux.strtab_size = strsec->sh_size;
3918 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3919 aux.strtab_size, _("string table"));
3921 else if (sec->sh_type == SHT_IA_64_UNWIND)
3926 printf (_("\nThere are no unwind sections in this file.\n"));
3928 while (unwcount-- > 0)
3933 for (i = unwstart, sec = section_headers + unwstart;
3934 i < elf_header.e_shnum; ++i, ++sec)
3935 if (sec->sh_type == SHT_IA_64_UNWIND)
3942 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
3944 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once,
3947 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
3948 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
3949 suffix = SECTION_NAME (unwsec) + len;
3950 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3952 if (strncmp (SECTION_NAME (sec),
3953 ELF_STRING_ia64_unwind_info_once, len2) == 0
3954 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3959 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
3960 .IA_64.unwind or BAR -> .IA_64.unwind_info */
3961 len = sizeof (ELF_STRING_ia64_unwind) - 1;
3962 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
3964 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind,
3966 suffix = SECTION_NAME (unwsec) + len;
3967 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3969 if (strncmp (SECTION_NAME (sec),
3970 ELF_STRING_ia64_unwind_info, len2) == 0
3971 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3975 if (i == elf_header.e_shnum)
3977 printf (_("\nCould not find unwind info section for "));
3979 if (string_table == NULL)
3980 printf ("%d", unwsec->sh_name);
3982 printf ("'%s'", SECTION_NAME (unwsec));
3986 aux.info_size = sec->sh_size;
3987 aux.info_addr = sec->sh_addr;
3988 aux.info = (char *) get_data (NULL, file, sec->sh_offset,
3989 aux.info_size, _("unwind info"));
3991 printf (_("\nUnwind section "));
3993 if (string_table == NULL)
3994 printf ("%d", unwsec->sh_name);
3996 printf ("'%s'", SECTION_NAME (unwsec));
3998 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3999 (unsigned long) unwsec->sh_offset,
4000 (unsigned long) (unwsec->sh_size / (3 * addr_size)));
4002 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
4004 if (aux.table_len > 0)
4005 dump_ia64_unwind (& aux);
4008 free ((char *) aux.table);
4010 free ((char *) aux.info);
4019 free ((char *) aux.strtab);
4025 dynamic_segment_mips_val (entry)
4026 Elf_Internal_Dyn * entry;
4028 switch (entry->d_tag)
4031 if (entry->d_un.d_val == 0)
4035 static const char * opts[] =
4037 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
4038 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
4039 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
4040 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
4045 for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
4046 if (entry->d_un.d_val & (1 << cnt))
4048 printf ("%s%s", first ? "" : " ", opts[cnt]);
4055 case DT_MIPS_IVERSION:
4056 if (dynamic_strings != NULL)
4057 printf ("Interface Version: %s\n",
4058 dynamic_strings + entry->d_un.d_val);
4060 printf ("%ld\n", (long) entry->d_un.d_ptr);
4063 case DT_MIPS_TIME_STAMP:
4068 time_t time = entry->d_un.d_val;
4069 tmp = gmtime (&time);
4070 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
4071 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
4072 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
4073 printf ("Time Stamp: %s\n", timebuf);
4077 case DT_MIPS_RLD_VERSION:
4078 case DT_MIPS_LOCAL_GOTNO:
4079 case DT_MIPS_CONFLICTNO:
4080 case DT_MIPS_LIBLISTNO:
4081 case DT_MIPS_SYMTABNO:
4082 case DT_MIPS_UNREFEXTNO:
4083 case DT_MIPS_HIPAGENO:
4084 case DT_MIPS_DELTA_CLASS_NO:
4085 case DT_MIPS_DELTA_INSTANCE_NO:
4086 case DT_MIPS_DELTA_RELOC_NO:
4087 case DT_MIPS_DELTA_SYM_NO:
4088 case DT_MIPS_DELTA_CLASSSYM_NO:
4089 case DT_MIPS_COMPACT_SIZE:
4090 printf ("%ld\n", (long) entry->d_un.d_ptr);
4094 printf ("%#lx\n", (long) entry->d_un.d_ptr);
4100 dynamic_segment_parisc_val (entry)
4101 Elf_Internal_Dyn * entry;
4103 switch (entry->d_tag)
4105 case DT_HP_DLD_FLAGS:
4114 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
4115 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
4116 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
4117 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
4118 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
4119 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
4120 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
4121 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
4122 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
4123 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
4124 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
4128 bfd_vma val = entry->d_un.d_val;
4130 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
4131 if (val & flags[cnt].bit)
4135 fputs (flags[cnt].str, stdout);
4137 val ^= flags[cnt].bit;
4140 if (val != 0 || first)
4144 print_vma (val, HEX);
4150 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
4156 get_32bit_dynamic_segment (file)
4159 Elf32_External_Dyn * edyn;
4160 Elf_Internal_Dyn * entry;
4163 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr,
4164 dynamic_size, _("dynamic segment"));
4168 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4169 how large this .dynamic is now. We can do this even before the byte
4170 swapping since the DT_NULL tag is recognizable. */
4172 while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
4175 dynamic_segment = (Elf_Internal_Dyn *)
4176 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
4178 if (dynamic_segment == NULL)
4180 error (_("Out of memory\n"));
4185 for (i = 0, entry = dynamic_segment;
4189 entry->d_tag = BYTE_GET (edyn [i].d_tag);
4190 entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
4199 get_64bit_dynamic_segment (file)
4202 Elf64_External_Dyn * edyn;
4203 Elf_Internal_Dyn * entry;
4206 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr,
4207 dynamic_size, _("dynamic segment"));
4211 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4212 how large this .dynamic is now. We can do this even before the byte
4213 swapping since the DT_NULL tag is recognizable. */
4215 while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
4218 dynamic_segment = (Elf_Internal_Dyn *)
4219 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
4221 if (dynamic_segment == NULL)
4223 error (_("Out of memory\n"));
4228 for (i = 0, entry = dynamic_segment;
4232 entry->d_tag = BYTE_GET8 (edyn [i].d_tag);
4233 entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
4242 get_dynamic_flags (flags)
4245 static char buff [64];
4250 flag = flags & - flags;
4255 case DF_ORIGIN: strcat (buff, "ORIGIN "); break;
4256 case DF_SYMBOLIC: strcat (buff, "SYMBOLIC "); break;
4257 case DF_TEXTREL: strcat (buff, "TEXTREL "); break;
4258 case DF_BIND_NOW: strcat (buff, "BIND_NOW "); break;
4259 default: strcat (buff, "unknown "); break;
4265 /* Parse and display the contents of the dynamic segment. */
4267 process_dynamic_segment (file)
4270 Elf_Internal_Dyn * entry;
4273 if (dynamic_size == 0)
4276 printf (_("\nThere is no dynamic segment in this file.\n"));
4283 if (! get_32bit_dynamic_segment (file))
4286 else if (! get_64bit_dynamic_segment (file))
4289 /* Find the appropriate symbol table. */
4290 if (dynamic_symbols == NULL)
4292 for (i = 0, entry = dynamic_segment;
4296 Elf32_Internal_Shdr section;
4298 if (entry->d_tag != DT_SYMTAB)
4301 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
4303 /* Since we do not know how big the symbol table is,
4304 we default to reading in the entire file (!) and
4305 processing that. This is overkill, I know, but it
4307 section.sh_offset = entry->d_un.d_val - loadaddr;
4309 if (fseek (file, 0, SEEK_END))
4310 error (_("Unable to seek to end of file!"));
4312 section.sh_size = ftell (file) - section.sh_offset;
4314 section.sh_entsize = sizeof (Elf32_External_Sym);
4316 section.sh_entsize = sizeof (Elf64_External_Sym);
4318 num_dynamic_syms = section.sh_size / section.sh_entsize;
4319 if (num_dynamic_syms < 1)
4321 error (_("Unable to determine the number of symbols to load\n"));
4325 dynamic_symbols = GET_ELF_SYMBOLS (file, §ion);
4329 /* Similarly find a string table. */
4330 if (dynamic_strings == NULL)
4332 for (i = 0, entry = dynamic_segment;
4336 unsigned long offset;
4339 if (entry->d_tag != DT_STRTAB)
4342 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
4344 /* Since we do not know how big the string table is,
4345 we default to reading in the entire file (!) and
4346 processing that. This is overkill, I know, but it
4349 offset = entry->d_un.d_val - loadaddr;
4350 if (fseek (file, 0, SEEK_END))
4351 error (_("Unable to seek to end of file\n"));
4352 str_tab_len = ftell (file) - offset;
4354 if (str_tab_len < 1)
4357 (_("Unable to determine the length of the dynamic string table\n"));
4361 dynamic_strings = (char *) get_data (NULL, file, offset, str_tab_len,
4362 _("dynamic string table"));
4367 /* And find the syminfo section if available. */
4368 if (dynamic_syminfo == NULL)
4370 unsigned int syminsz = 0;
4372 for (i = 0, entry = dynamic_segment;
4376 if (entry->d_tag == DT_SYMINENT)
4378 /* Note: these braces are necessary to avoid a syntax
4379 error from the SunOS4 C compiler. */
4380 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
4382 else if (entry->d_tag == DT_SYMINSZ)
4383 syminsz = entry->d_un.d_val;
4384 else if (entry->d_tag == DT_SYMINFO)
4385 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
4388 if (dynamic_syminfo_offset != 0 && syminsz != 0)
4390 Elf_External_Syminfo * extsyminfo;
4391 Elf_Internal_Syminfo * syminfo;
4393 /* There is a syminfo section. Read the data. */
4394 extsyminfo = ((Elf_External_Syminfo *)
4395 get_data (NULL, file, dynamic_syminfo_offset,
4396 syminsz, _("symbol information")));
4400 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
4401 if (dynamic_syminfo == NULL)
4403 error (_("Out of memory\n"));
4407 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
4408 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
4411 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
4412 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
4419 if (do_dynamic && dynamic_addr)
4420 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
4421 dynamic_addr, (long) dynamic_size);
4423 printf (_(" Tag Type Name/Value\n"));
4425 for (i = 0, entry = dynamic_segment;
4434 print_vma (entry->d_tag, FULL_HEX);
4435 dtype = get_dynamic_type (entry->d_tag);
4436 printf (" (%s)%*s", dtype,
4437 ((is_32bit_elf ? 27 : 19)
4438 - (int) strlen (dtype)),
4442 switch (entry->d_tag)
4446 printf ("%s", get_dynamic_flags (entry->d_un.d_val));
4456 switch (entry->d_tag)
4459 printf (_("Auxiliary library"));
4463 printf (_("Filter library"));
4467 printf (_("Configuration file"));
4471 printf (_("Dependency audit library"));
4475 printf (_("Audit library"));
4479 if (dynamic_strings)
4480 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
4484 print_vma (entry->d_un.d_val, PREFIX_HEX);
4493 printf (_("Flags:"));
4494 if (entry->d_un.d_val == 0)
4495 printf (_(" None\n"));
4498 unsigned long int val = entry->d_un.d_val;
4499 if (val & DTF_1_PARINIT)
4501 printf (" PARINIT");
4502 val ^= DTF_1_PARINIT;
4504 if (val & DTF_1_CONFEXP)
4506 printf (" CONFEXP");
4507 val ^= DTF_1_CONFEXP;
4510 printf (" %lx", val);
4519 printf (_("Flags:"));
4520 if (entry->d_un.d_val == 0)
4521 printf (_(" None\n"));
4524 unsigned long int val = entry->d_un.d_val;
4525 if (val & DF_P1_LAZYLOAD)
4527 printf (" LAZYLOAD");
4528 val ^= DF_P1_LAZYLOAD;
4530 if (val & DF_P1_GROUPPERM)
4532 printf (" GROUPPERM");
4533 val ^= DF_P1_GROUPPERM;
4536 printf (" %lx", val);
4545 printf (_("Flags:"));
4546 if (entry->d_un.d_val == 0)
4547 printf (_(" None\n"));
4550 unsigned long int val = entry->d_un.d_val;
4556 if (val & DF_1_GLOBAL)
4561 if (val & DF_1_GROUP)
4566 if (val & DF_1_NODELETE)
4568 printf (" NODELETE");
4569 val ^= DF_1_NODELETE;
4571 if (val & DF_1_LOADFLTR)
4573 printf (" LOADFLTR");
4574 val ^= DF_1_LOADFLTR;
4576 if (val & DF_1_INITFIRST)
4578 printf (" INITFIRST");
4579 val ^= DF_1_INITFIRST;
4581 if (val & DF_1_NOOPEN)
4586 if (val & DF_1_ORIGIN)
4591 if (val & DF_1_DIRECT)
4596 if (val & DF_1_TRANS)
4601 if (val & DF_1_INTERPOSE)
4603 printf (" INTERPOSE");
4604 val ^= DF_1_INTERPOSE;
4606 if (val & DF_1_NODEFLIB)
4608 printf (" NODEFLIB");
4609 val ^= DF_1_NODEFLIB;
4611 if (val & DF_1_NODUMP)
4616 if (val & DF_1_CONLFAT)
4618 printf (" CONLFAT");
4619 val ^= DF_1_CONLFAT;
4622 printf (" %lx", val);
4630 puts (get_dynamic_type (entry->d_un.d_val));
4650 dynamic_info[entry->d_tag] = entry->d_un.d_val;
4656 if (dynamic_strings == NULL)
4659 name = dynamic_strings + entry->d_un.d_val;
4663 switch (entry->d_tag)
4666 printf (_("Shared library: [%s]"), name);
4668 if (strcmp (name, program_interpreter) == 0)
4669 printf (_(" program interpreter"));
4673 printf (_("Library soname: [%s]"), name);
4677 printf (_("Library rpath: [%s]"), name);
4681 printf (_("Library runpath: [%s]"), name);
4685 print_vma (entry->d_un.d_val, PREFIX_HEX);
4690 print_vma (entry->d_un.d_val, PREFIX_HEX);
4706 case DT_INIT_ARRAYSZ:
4707 case DT_FINI_ARRAYSZ:
4710 print_vma (entry->d_un.d_val, UNSIGNED);
4711 printf (" (bytes)\n");
4721 print_vma (entry->d_un.d_val, UNSIGNED);
4734 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
4738 name = dynamic_strings + entry->d_un.d_val;
4742 printf (_("Not needed object: [%s]\n"), name);
4747 print_vma (entry->d_un.d_val, PREFIX_HEX);
4753 /* The value of this entry is ignored. */
4757 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
4758 version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
4763 switch (elf_header.e_machine)
4766 case EM_MIPS_RS3_LE:
4767 dynamic_segment_mips_val (entry);
4770 dynamic_segment_parisc_val (entry);
4773 print_vma (entry->d_un.d_val, PREFIX_HEX);
4785 get_ver_flags (flags)
4788 static char buff [32];
4795 if (flags & VER_FLG_BASE)
4796 strcat (buff, "BASE ");
4798 if (flags & VER_FLG_WEAK)
4800 if (flags & VER_FLG_BASE)
4801 strcat (buff, "| ");
4803 strcat (buff, "WEAK ");
4806 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
4807 strcat (buff, "| <unknown>");
4812 /* Display the contents of the version sections. */
4814 process_version_sections (file)
4817 Elf32_Internal_Shdr * section;
4824 for (i = 0, section = section_headers;
4825 i < elf_header.e_shnum;
4828 switch (section->sh_type)
4830 case SHT_GNU_verdef:
4832 Elf_External_Verdef * edefs;
4839 (_("\nVersion definition section '%s' contains %ld entries:\n"),
4840 SECTION_NAME (section), section->sh_info);
4842 printf (_(" Addr: 0x"));
4843 printf_vma (section->sh_addr);
4844 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4845 (unsigned long) section->sh_offset, section->sh_link,
4846 SECTION_NAME (SECTION_HEADER (section->sh_link)));
4848 edefs = ((Elf_External_Verdef *)
4849 get_data (NULL, file, section->sh_offset,
4851 _("version definition section")));
4855 for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
4858 Elf_External_Verdef * edef;
4859 Elf_Internal_Verdef ent;
4860 Elf_External_Verdaux * eaux;
4861 Elf_Internal_Verdaux aux;
4865 vstart = ((char *) edefs) + idx;
4867 edef = (Elf_External_Verdef *) vstart;
4869 ent.vd_version = BYTE_GET (edef->vd_version);
4870 ent.vd_flags = BYTE_GET (edef->vd_flags);
4871 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
4872 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
4873 ent.vd_hash = BYTE_GET (edef->vd_hash);
4874 ent.vd_aux = BYTE_GET (edef->vd_aux);
4875 ent.vd_next = BYTE_GET (edef->vd_next);
4877 printf (_(" %#06x: Rev: %d Flags: %s"),
4878 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
4880 printf (_(" Index: %d Cnt: %d "),
4881 ent.vd_ndx, ent.vd_cnt);
4883 vstart += ent.vd_aux;
4885 eaux = (Elf_External_Verdaux *) vstart;
4887 aux.vda_name = BYTE_GET (eaux->vda_name);
4888 aux.vda_next = BYTE_GET (eaux->vda_next);
4890 if (dynamic_strings)
4891 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
4893 printf (_("Name index: %ld\n"), aux.vda_name);
4895 isum = idx + ent.vd_aux;
4897 for (j = 1; j < ent.vd_cnt; j ++)
4899 isum += aux.vda_next;
4900 vstart += aux.vda_next;
4902 eaux = (Elf_External_Verdaux *) vstart;
4904 aux.vda_name = BYTE_GET (eaux->vda_name);
4905 aux.vda_next = BYTE_GET (eaux->vda_next);
4907 if (dynamic_strings)
4908 printf (_(" %#06x: Parent %d: %s\n"),
4909 isum, j, dynamic_strings + aux.vda_name);
4911 printf (_(" %#06x: Parent %d, name index: %ld\n"),
4912 isum, j, aux.vda_name);
4922 case SHT_GNU_verneed:
4924 Elf_External_Verneed * eneed;
4930 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
4931 SECTION_NAME (section), section->sh_info);
4933 printf (_(" Addr: 0x"));
4934 printf_vma (section->sh_addr);
4935 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
4936 (unsigned long) section->sh_offset, section->sh_link,
4937 SECTION_NAME (SECTION_HEADER (section->sh_link)));
4939 eneed = ((Elf_External_Verneed *)
4940 get_data (NULL, file, section->sh_offset,
4941 section->sh_size, _("version need section")));
4945 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
4947 Elf_External_Verneed * entry;
4948 Elf_Internal_Verneed ent;
4953 vstart = ((char *) eneed) + idx;
4955 entry = (Elf_External_Verneed *) vstart;
4957 ent.vn_version = BYTE_GET (entry->vn_version);
4958 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
4959 ent.vn_file = BYTE_GET (entry->vn_file);
4960 ent.vn_aux = BYTE_GET (entry->vn_aux);
4961 ent.vn_next = BYTE_GET (entry->vn_next);
4963 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
4965 if (dynamic_strings)
4966 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
4968 printf (_(" File: %lx"), ent.vn_file);
4970 printf (_(" Cnt: %d\n"), ent.vn_cnt);
4972 vstart += ent.vn_aux;
4974 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
4976 Elf_External_Vernaux * eaux;
4977 Elf_Internal_Vernaux aux;
4979 eaux = (Elf_External_Vernaux *) vstart;
4981 aux.vna_hash = BYTE_GET (eaux->vna_hash);
4982 aux.vna_flags = BYTE_GET (eaux->vna_flags);
4983 aux.vna_other = BYTE_GET (eaux->vna_other);
4984 aux.vna_name = BYTE_GET (eaux->vna_name);
4985 aux.vna_next = BYTE_GET (eaux->vna_next);
4987 if (dynamic_strings)
4988 printf (_(" %#06x: Name: %s"),
4989 isum, dynamic_strings + aux.vna_name);
4991 printf (_(" %#06x: Name index: %lx"),
4992 isum, aux.vna_name);
4994 printf (_(" Flags: %s Version: %d\n"),
4995 get_ver_flags (aux.vna_flags), aux.vna_other);
4997 isum += aux.vna_next;
4998 vstart += aux.vna_next;
5008 case SHT_GNU_versym:
5010 Elf32_Internal_Shdr * link_section;
5013 unsigned char * edata;
5014 unsigned short * data;
5016 Elf_Internal_Sym * symbols;
5017 Elf32_Internal_Shdr * string_sec;
5019 link_section = SECTION_HEADER (section->sh_link);
5020 total = section->sh_size / section->sh_entsize;
5024 symbols = GET_ELF_SYMBOLS (file, link_section);
5026 string_sec = SECTION_HEADER (link_section->sh_link);
5028 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5029 string_sec->sh_size,
5030 _("version string table"));
5034 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
5035 SECTION_NAME (section), total);
5037 printf (_(" Addr: "));
5038 printf_vma (section->sh_addr);
5039 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5040 (unsigned long) section->sh_offset, section->sh_link,
5041 SECTION_NAME (link_section));
5045 get_data (NULL, file,
5046 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] - loadaddr,
5047 total * sizeof (short), _("version symbol data")));
5054 data = (unsigned short *) malloc (total * sizeof (short));
5056 for (cnt = total; cnt --;)
5057 data [cnt] = byte_get (edata + cnt * sizeof (short),
5062 for (cnt = 0; cnt < total; cnt += 4)
5065 int check_def, check_need;
5068 printf (" %03x:", cnt);
5070 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
5071 switch (data [cnt + j])
5074 fputs (_(" 0 (*local*) "), stdout);
5078 fputs (_(" 1 (*global*) "), stdout);
5082 nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
5083 data [cnt + j] & 0x8000 ? 'h' : ' ');
5087 if (SECTION_HEADER (symbols [cnt + j].st_shndx)->sh_type
5090 if (symbols [cnt + j].st_shndx == SHN_UNDEF)
5097 && version_info [DT_VERSIONTAGIDX (DT_VERNEED)])
5099 Elf_Internal_Verneed ivn;
5100 unsigned long offset;
5102 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
5107 Elf_Internal_Vernaux ivna;
5108 Elf_External_Verneed evn;
5109 Elf_External_Vernaux evna;
5110 unsigned long a_off;
5112 get_data (&evn, file, offset, sizeof (evn),
5115 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5116 ivn.vn_next = BYTE_GET (evn.vn_next);
5118 a_off = offset + ivn.vn_aux;
5122 get_data (&evna, file, a_off, sizeof (evna),
5123 _("version need aux (2)"));
5125 ivna.vna_next = BYTE_GET (evna.vna_next);
5126 ivna.vna_other = BYTE_GET (evna.vna_other);
5128 a_off += ivna.vna_next;
5130 while (ivna.vna_other != data [cnt + j]
5131 && ivna.vna_next != 0);
5133 if (ivna.vna_other == data [cnt + j])
5135 ivna.vna_name = BYTE_GET (evna.vna_name);
5137 name = strtab + ivna.vna_name;
5138 nn += printf ("(%s%-*s",
5140 12 - (int) strlen (name),
5146 offset += ivn.vn_next;
5148 while (ivn.vn_next);
5151 if (check_def && data [cnt + j] != 0x8001
5152 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
5154 Elf_Internal_Verdef ivd;
5155 Elf_External_Verdef evd;
5156 unsigned long offset;
5158 offset = version_info
5159 [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
5163 get_data (&evd, file, offset, sizeof (evd),
5166 ivd.vd_next = BYTE_GET (evd.vd_next);
5167 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5169 offset += ivd.vd_next;
5171 while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
5172 && ivd.vd_next != 0);
5174 if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
5176 Elf_External_Verdaux evda;
5177 Elf_Internal_Verdaux ivda;
5179 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5181 get_data (&evda, file,
5182 offset - ivd.vd_next + ivd.vd_aux,
5183 sizeof (evda), _("version def aux"));
5185 ivda.vda_name = BYTE_GET (evda.vda_name);
5187 name = strtab + ivda.vda_name;
5188 nn += printf ("(%s%-*s",
5190 12 - (int) strlen (name),
5196 printf ("%*c", 18 - nn, ' ');
5214 printf (_("\nNo version information found in this file.\n"));
5220 get_symbol_binding (binding)
5221 unsigned int binding;
5223 static char buff [32];
5227 case STB_LOCAL: return "LOCAL";
5228 case STB_GLOBAL: return "GLOBAL";
5229 case STB_WEAK: return "WEAK";
5231 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
5232 sprintf (buff, _("<processor specific>: %d"), binding);
5233 else if (binding >= STB_LOOS && binding <= STB_HIOS)
5234 sprintf (buff, _("<OS specific>: %d"), binding);
5236 sprintf (buff, _("<unknown>: %d"), binding);
5242 get_symbol_type (type)
5245 static char buff [32];
5249 case STT_NOTYPE: return "NOTYPE";
5250 case STT_OBJECT: return "OBJECT";
5251 case STT_FUNC: return "FUNC";
5252 case STT_SECTION: return "SECTION";
5253 case STT_FILE: return "FILE";
5254 case STT_COMMON: return "COMMON";
5256 if (type >= STT_LOPROC && type <= STT_HIPROC)
5258 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
5259 return "THUMB_FUNC";
5261 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
5264 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
5265 return "PARISC_MILLI";
5267 sprintf (buff, _("<processor specific>: %d"), type);
5269 else if (type >= STT_LOOS && type <= STT_HIOS)
5271 if (elf_header.e_machine == EM_PARISC)
5273 if (type == STT_HP_OPAQUE)
5275 if (type == STT_HP_STUB)
5279 sprintf (buff, _("<OS specific>: %d"), type);
5282 sprintf (buff, _("<unknown>: %d"), type);
5288 get_symbol_visibility (visibility)
5289 unsigned int visibility;
5293 case STV_DEFAULT: return "DEFAULT";
5294 case STV_INTERNAL: return "INTERNAL";
5295 case STV_HIDDEN: return "HIDDEN";
5296 case STV_PROTECTED: return "PROTECTED";
5302 get_symbol_index_type (type)
5307 case SHN_UNDEF: return "UND";
5308 case SHN_ABS: return "ABS";
5309 case SHN_COMMON: return "COM";
5311 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
5313 else if (type >= SHN_LOOS && type <= SHN_HIOS)
5315 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
5319 static char buff [32];
5321 sprintf (buff, "%3d", type);
5328 get_dynamic_data (file, number)
5330 unsigned int number;
5332 unsigned char * e_data;
5335 e_data = (unsigned char *) malloc (number * 4);
5339 error (_("Out of memory\n"));
5343 if (fread (e_data, 4, number, file) != number)
5345 error (_("Unable to read in dynamic data\n"));
5349 i_data = (int *) malloc (number * sizeof (* i_data));
5353 error (_("Out of memory\n"));
5359 i_data [number] = byte_get (e_data + number * 4, 4);
5366 /* Dump the symbol table. */
5368 process_symbol_table (file)
5371 Elf32_Internal_Shdr * section;
5372 unsigned char nb [4];
5373 unsigned char nc [4];
5376 int * buckets = NULL;
5377 int * chains = NULL;
5379 if (! do_syms && !do_histogram)
5382 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
5385 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
5387 error (_("Unable to seek to start of dynamic information"));
5391 if (fread (nb, sizeof (nb), 1, file) != 1)
5393 error (_("Failed to read in number of buckets\n"));
5397 if (fread (nc, sizeof (nc), 1, file) != 1)
5399 error (_("Failed to read in number of chains\n"));
5403 nbuckets = byte_get (nb, 4);
5404 nchains = byte_get (nc, 4);
5406 buckets = get_dynamic_data (file, nbuckets);
5407 chains = get_dynamic_data (file, nchains);
5409 if (buckets == NULL || chains == NULL)
5414 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
5419 printf (_("\nSymbol table for image:\n"));
5421 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5423 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5425 for (hn = 0; hn < nbuckets; hn++)
5430 for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
5432 Elf_Internal_Sym * psym;
5434 psym = dynamic_symbols + si;
5436 printf (" %3d %3d: ", si, hn);
5437 print_vma (psym->st_value, LONG_HEX);
5439 print_vma (psym->st_size, DEC_5);
5441 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5442 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5443 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5444 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
5445 print_symbol (25, dynamic_strings + psym->st_name);
5450 else if (do_syms && !do_using_dynamic)
5454 for (i = 0, section = section_headers;
5455 i < elf_header.e_shnum;
5460 Elf_Internal_Sym * symtab;
5461 Elf_Internal_Sym * psym;
5464 if ( section->sh_type != SHT_SYMTAB
5465 && section->sh_type != SHT_DYNSYM)
5468 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5469 SECTION_NAME (section),
5470 (unsigned long) (section->sh_size / section->sh_entsize));
5472 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5474 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5476 symtab = GET_ELF_SYMBOLS (file, section);
5480 if (section->sh_link == elf_header.e_shstrndx)
5481 strtab = string_table;
5484 Elf32_Internal_Shdr * string_sec;
5486 string_sec = SECTION_HEADER (section->sh_link);
5488 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5489 string_sec->sh_size,
5493 for (si = 0, psym = symtab;
5494 si < section->sh_size / section->sh_entsize;
5497 printf ("%6d: ", si);
5498 print_vma (psym->st_value, LONG_HEX);
5500 print_vma (psym->st_size, DEC_5);
5501 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5502 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5503 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5504 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
5505 print_symbol (25, strtab + psym->st_name);
5507 if (section->sh_type == SHT_DYNSYM &&
5508 version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
5510 unsigned char data[2];
5511 unsigned short vers_data;
5512 unsigned long offset;
5516 offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
5519 get_data (&data, file, offset + si * sizeof (vers_data),
5520 sizeof (data), _("version data"));
5522 vers_data = byte_get (data, 2);
5524 is_nobits = (SECTION_HEADER (psym->st_shndx)->sh_type
5527 check_def = (psym->st_shndx != SHN_UNDEF);
5529 if ((vers_data & 0x8000) || vers_data > 1)
5531 if (version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
5532 && (is_nobits || ! check_def))
5534 Elf_External_Verneed evn;
5535 Elf_Internal_Verneed ivn;
5536 Elf_Internal_Vernaux ivna;
5538 /* We must test both. */
5539 offset = version_info
5540 [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
5544 unsigned long vna_off;
5546 get_data (&evn, file, offset, sizeof (evn),
5549 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5550 ivn.vn_next = BYTE_GET (evn.vn_next);
5552 vna_off = offset + ivn.vn_aux;
5556 Elf_External_Vernaux evna;
5558 get_data (&evna, file, vna_off,
5560 _("version need aux (3)"));
5562 ivna.vna_other = BYTE_GET (evna.vna_other);
5563 ivna.vna_next = BYTE_GET (evna.vna_next);
5564 ivna.vna_name = BYTE_GET (evna.vna_name);
5566 vna_off += ivna.vna_next;
5568 while (ivna.vna_other != vers_data
5569 && ivna.vna_next != 0);
5571 if (ivna.vna_other == vers_data)
5574 offset += ivn.vn_next;
5576 while (ivn.vn_next != 0);
5578 if (ivna.vna_other == vers_data)
5581 strtab + ivna.vna_name, ivna.vna_other);
5584 else if (! is_nobits)
5585 error (_("bad dynamic symbol"));
5592 if (vers_data != 0x8001
5593 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
5595 Elf_Internal_Verdef ivd;
5596 Elf_Internal_Verdaux ivda;
5597 Elf_External_Verdaux evda;
5598 unsigned long offset;
5601 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
5606 Elf_External_Verdef evd;
5608 get_data (&evd, file, offset, sizeof (evd),
5611 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5612 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5613 ivd.vd_next = BYTE_GET (evd.vd_next);
5615 offset += ivd.vd_next;
5617 while (ivd.vd_ndx != (vers_data & 0x7fff)
5618 && ivd.vd_next != 0);
5620 offset -= ivd.vd_next;
5621 offset += ivd.vd_aux;
5623 get_data (&evda, file, offset, sizeof (evda),
5624 _("version def aux"));
5626 ivda.vda_name = BYTE_GET (evda.vda_name);
5628 if (psym->st_name != ivda.vda_name)
5629 printf ((vers_data & 0x8000)
5631 strtab + ivda.vda_name);
5641 if (strtab != string_table)
5647 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5649 if (do_histogram && buckets != NULL)
5656 int nzero_counts = 0;
5659 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5661 printf (_(" Length Number %% of total Coverage\n"));
5663 lengths = (int *) calloc (nbuckets, sizeof (int));
5664 if (lengths == NULL)
5666 error (_("Out of memory"));
5669 for (hn = 0; hn < nbuckets; ++hn)
5674 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
5677 if (maxlength < ++lengths[hn])
5682 counts = (int *) calloc (maxlength + 1, sizeof (int));
5685 error (_("Out of memory"));
5689 for (hn = 0; hn < nbuckets; ++hn)
5690 ++ counts [lengths [hn]];
5694 printf (" 0 %-10d (%5.1f%%)\n",
5695 counts[0], (counts[0] * 100.0) / nbuckets);
5696 for (si = 1; si <= maxlength; ++si)
5698 nzero_counts += counts[si] * si;
5699 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5700 si, counts[si], (counts[si] * 100.0) / nbuckets,
5701 (nzero_counts * 100.0) / nsyms);
5709 if (buckets != NULL)
5719 process_syminfo (file)
5720 FILE * file ATTRIBUTE_UNUSED;
5724 if (dynamic_syminfo == NULL
5726 /* No syminfo, this is ok. */
5729 /* There better should be a dynamic symbol section. */
5730 if (dynamic_symbols == NULL || dynamic_strings == NULL)
5734 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5735 dynamic_syminfo_offset, dynamic_syminfo_nent);
5737 printf (_(" Num: Name BoundTo Flags\n"));
5738 for (i = 0; i < dynamic_syminfo_nent; ++i)
5740 unsigned short int flags = dynamic_syminfo[i].si_flags;
5742 printf ("%4d: ", i);
5743 print_symbol (30, dynamic_strings + dynamic_symbols[i].st_name);
5746 switch (dynamic_syminfo[i].si_boundto)
5748 case SYMINFO_BT_SELF:
5749 fputs ("SELF ", stdout);
5751 case SYMINFO_BT_PARENT:
5752 fputs ("PARENT ", stdout);
5755 if (dynamic_syminfo[i].si_boundto > 0
5756 && dynamic_syminfo[i].si_boundto < dynamic_size)
5758 print_symbol (10, dynamic_strings
5760 [dynamic_syminfo[i].si_boundto].d_un.d_val);
5764 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
5768 if (flags & SYMINFO_FLG_DIRECT)
5770 if (flags & SYMINFO_FLG_PASSTHRU)
5771 printf (" PASSTHRU");
5772 if (flags & SYMINFO_FLG_COPY)
5774 if (flags & SYMINFO_FLG_LAZYLOAD)
5775 printf (" LAZYLOAD");
5783 #ifdef SUPPORT_DISASSEMBLY
5785 disassemble_section (section, file)
5786 Elf32_Internal_Shdr * section;
5789 printf (_("\nAssembly dump of section %s\n"),
5790 SECTION_NAME (section));
5792 /* XXX -- to be done --- XXX */
5799 dump_section (section, file)
5800 Elf32_Internal_Shdr * section;
5803 bfd_size_type bytes;
5805 unsigned char * data;
5806 unsigned char * start;
5808 bytes = section->sh_size;
5812 printf (_("\nSection '%s' has no data to dump.\n"),
5813 SECTION_NAME (section));
5817 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
5819 addr = section->sh_addr;
5821 start = (unsigned char *) get_data (NULL, file, section->sh_offset, bytes,
5834 lbytes = (bytes > 16 ? 16 : bytes);
5836 printf (" 0x%8.8lx ", (unsigned long) addr);
5838 switch (elf_header.e_ident [EI_DATA])
5842 for (j = 15; j >= 0; j --)
5845 printf ("%2.2x", data [j]);
5855 for (j = 0; j < 16; j++)
5858 printf ("%2.2x", data [j]);
5868 for (j = 0; j < lbytes; j++)
5871 if (k >= ' ' && k < 0x80)
5890 static unsigned long int
5891 read_leb128 (data, length_return, sign)
5892 unsigned char * data;
5893 int * length_return;
5896 unsigned long int result = 0;
5897 unsigned int num_read = 0;
5906 result |= (byte & 0x7f) << shift;
5911 while (byte & 0x80);
5913 if (length_return != NULL)
5914 * length_return = num_read;
5916 if (sign && (shift < 32) && (byte & 0x40))
5917 result |= -1 << shift;
5922 typedef struct State_Machine_Registers
5924 unsigned long address;
5927 unsigned int column;
5931 /* This variable hold the number of the last entry seen
5932 in the File Table. */
5933 unsigned int last_file_entry;
5936 static SMR state_machine_regs;
5939 reset_state_machine (is_stmt)
5942 state_machine_regs.address = 0;
5943 state_machine_regs.file = 1;
5944 state_machine_regs.line = 1;
5945 state_machine_regs.column = 0;
5946 state_machine_regs.is_stmt = is_stmt;
5947 state_machine_regs.basic_block = 0;
5948 state_machine_regs.end_sequence = 0;
5949 state_machine_regs.last_file_entry = 0;
5952 /* Handled an extend line op. Returns true if this is the end
5955 process_extended_line_op (data, is_stmt, pointer_size)
5956 unsigned char * data;
5960 unsigned char op_code;
5963 unsigned char * name;
5966 len = read_leb128 (data, & bytes_read, 0);
5971 warn (_("badly formed extended line op encountered!\n"));
5976 op_code = * data ++;
5978 printf (_(" Extended opcode %d: "), op_code);
5982 case DW_LNE_end_sequence:
5983 printf (_("End of Sequence\n\n"));
5984 reset_state_machine (is_stmt);
5987 case DW_LNE_set_address:
5988 adr = byte_get (data, pointer_size);
5989 printf (_("set Address to 0x%lx\n"), adr);
5990 state_machine_regs.address = adr;
5993 case DW_LNE_define_file:
5994 printf (_(" define new File Table entry\n"));
5995 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5997 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5999 data += strlen ((char *) data) + 1;
6000 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6002 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6004 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6005 printf (_("%s\n\n"), name);
6009 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
6016 /* Size of pointers in the .debug_line section. This information is not
6017 really present in that section. It's obtained before dumping the debug
6018 sections by doing some pre-scan of the .debug_info section. */
6019 static int debug_line_pointer_size = 4;
6022 display_debug_lines (section, start, file)
6023 Elf32_Internal_Shdr * section;
6024 unsigned char * start;
6025 FILE * file ATTRIBUTE_UNUSED;
6027 DWARF2_External_LineInfo * external;
6028 DWARF2_Internal_LineInfo info;
6029 unsigned char * standard_opcodes;
6030 unsigned char * data = start;
6031 unsigned char * end = start + section->sh_size;
6032 unsigned char * end_of_sequence;
6035 printf (_("\nDump of debug contents of section %s:\n\n"),
6036 SECTION_NAME (section));
6040 external = (DWARF2_External_LineInfo *) data;
6042 /* Check the length of the block. */
6043 info.li_length = BYTE_GET (external->li_length);
6045 if (info.li_length == 0xffffffff)
6047 warn (_("64-bit DWARF line info is not supported yet.\n"));
6051 if (info.li_length + sizeof (external->li_length) > section->sh_size)
6054 (_("The line info appears to be corrupt - the section is too small\n"));
6058 /* Check its version number. */
6059 info.li_version = BYTE_GET (external->li_version);
6060 if (info.li_version != 2)
6062 warn (_("Only DWARF version 2 line info is currently supported.\n"));
6066 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
6067 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
6068 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
6069 info.li_line_base = BYTE_GET (external->li_line_base);
6070 info.li_line_range = BYTE_GET (external->li_line_range);
6071 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
6073 /* Sign extend the line base field. */
6074 info.li_line_base <<= 24;
6075 info.li_line_base >>= 24;
6077 printf (_(" Length: %ld\n"), info.li_length);
6078 printf (_(" DWARF Version: %d\n"), info.li_version);
6079 printf (_(" Prologue Length: %d\n"), info.li_prologue_length);
6080 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
6081 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
6082 printf (_(" Line Base: %d\n"), info.li_line_base);
6083 printf (_(" Line Range: %d\n"), info.li_line_range);
6084 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
6086 end_of_sequence = data + info.li_length + sizeof (external->li_length);
6088 reset_state_machine (info.li_default_is_stmt);
6090 /* Display the contents of the Opcodes table. */
6091 standard_opcodes = data + sizeof (* external);
6093 printf (_("\n Opcodes:\n"));
6095 for (i = 1; i < info.li_opcode_base; i++)
6096 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
6098 /* Display the contents of the Directory table. */
6099 data = standard_opcodes + info.li_opcode_base - 1;
6102 printf (_("\n The Directory Table is empty.\n"));
6105 printf (_("\n The Directory Table:\n"));
6109 printf (_(" %s\n"), data);
6111 data += strlen ((char *) data) + 1;
6115 /* Skip the NUL at the end of the table. */
6118 /* Display the contents of the File Name table. */
6120 printf (_("\n The File Name Table is empty.\n"));
6123 printf (_("\n The File Name Table:\n"));
6124 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6128 unsigned char * name;
6131 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
6134 data += strlen ((char *) data) + 1;
6136 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6138 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6140 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6142 printf (_("%s\n"), name);
6146 /* Skip the NUL at the end of the table. */
6149 /* Now display the statements. */
6150 printf (_("\n Line Number Statements:\n"));
6153 while (data < end_of_sequence)
6155 unsigned char op_code;
6159 op_code = * data ++;
6161 if (op_code >= info.li_opcode_base)
6163 op_code -= info.li_opcode_base;
6164 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
6165 state_machine_regs.address += adv;
6166 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6167 op_code, adv, state_machine_regs.address);
6168 adv = (op_code % info.li_line_range) + info.li_line_base;
6169 state_machine_regs.line += adv;
6170 printf (_(" and Line by %d to %d\n"),
6171 adv, state_machine_regs.line);
6173 else switch (op_code)
6175 case DW_LNS_extended_op:
6176 data += process_extended_line_op (data, info.li_default_is_stmt,
6177 debug_line_pointer_size);
6181 printf (_(" Copy\n"));
6184 case DW_LNS_advance_pc:
6185 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
6187 state_machine_regs.address += adv;
6188 printf (_(" Advance PC by %d to %lx\n"), adv,
6189 state_machine_regs.address);
6192 case DW_LNS_advance_line:
6193 adv = read_leb128 (data, & bytes_read, 1);
6195 state_machine_regs.line += adv;
6196 printf (_(" Advance Line by %d to %d\n"), adv,
6197 state_machine_regs.line);
6200 case DW_LNS_set_file:
6201 adv = read_leb128 (data, & bytes_read, 0);
6203 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6205 state_machine_regs.file = adv;
6208 case DW_LNS_set_column:
6209 adv = read_leb128 (data, & bytes_read, 0);
6211 printf (_(" Set column to %d\n"), adv);
6212 state_machine_regs.column = adv;
6215 case DW_LNS_negate_stmt:
6216 adv = state_machine_regs.is_stmt;
6218 printf (_(" Set is_stmt to %d\n"), adv);
6219 state_machine_regs.is_stmt = adv;
6222 case DW_LNS_set_basic_block:
6223 printf (_(" Set basic block\n"));
6224 state_machine_regs.basic_block = 1;
6227 case DW_LNS_const_add_pc:
6228 adv = (((255 - info.li_opcode_base) / info.li_line_range)
6229 * info.li_min_insn_length);
6230 state_machine_regs.address += adv;
6231 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
6232 state_machine_regs.address);
6235 case DW_LNS_fixed_advance_pc:
6236 adv = byte_get (data, 2);
6238 state_machine_regs.address += adv;
6239 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6240 adv, state_machine_regs.address);
6243 case DW_LNS_set_prologue_end:
6244 printf (_(" Set prologue_end to true\n"));
6247 case DW_LNS_set_epilogue_begin:
6248 printf (_(" Set epilogue_begin to true\n"));
6251 case DW_LNS_set_isa:
6252 adv = read_leb128 (data, & bytes_read, 0);
6254 printf (_(" Set ISA to %d\n"), adv);
6258 printf (_(" Unknown opcode %d with operands: "), op_code);
6261 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
6263 printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
6264 i == 1 ? "" : ", ");
6279 display_debug_pubnames (section, start, file)
6280 Elf32_Internal_Shdr * section;
6281 unsigned char * start;
6282 FILE * file ATTRIBUTE_UNUSED;
6284 DWARF2_External_PubNames * external;
6285 DWARF2_Internal_PubNames pubnames;
6286 unsigned char * end;
6288 end = start + section->sh_size;
6290 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6294 unsigned char * data;
6295 unsigned long offset;
6297 external = (DWARF2_External_PubNames *) start;
6299 pubnames.pn_length = BYTE_GET (external->pn_length);
6300 pubnames.pn_version = BYTE_GET (external->pn_version);
6301 pubnames.pn_offset = BYTE_GET (external->pn_offset);
6302 pubnames.pn_size = BYTE_GET (external->pn_size);
6304 data = start + sizeof (* external);
6305 start += pubnames.pn_length + sizeof (external->pn_length);
6307 if (pubnames.pn_length == 0xffffffff)
6309 warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6313 if (pubnames.pn_version != 2)
6315 static int warned = 0;
6319 warn (_("Only DWARF 2 pubnames are currently supported\n"));
6326 printf (_(" Length: %ld\n"),
6327 pubnames.pn_length);
6328 printf (_(" Version: %d\n"),
6329 pubnames.pn_version);
6330 printf (_(" Offset into .debug_info section: %ld\n"),
6331 pubnames.pn_offset);
6332 printf (_(" Size of area in .debug_info section: %ld\n"),
6335 printf (_("\n Offset\tName\n"));
6339 offset = byte_get (data, 4);
6344 printf (" %ld\t\t%s\n", offset, data);
6345 data += strlen ((char *) data) + 1;
6348 while (offset != 0);
6361 case DW_TAG_padding: return "DW_TAG_padding";
6362 case DW_TAG_array_type: return "DW_TAG_array_type";
6363 case DW_TAG_class_type: return "DW_TAG_class_type";
6364 case DW_TAG_entry_point: return "DW_TAG_entry_point";
6365 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
6366 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
6367 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
6368 case DW_TAG_label: return "DW_TAG_label";
6369 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
6370 case DW_TAG_member: return "DW_TAG_member";
6371 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
6372 case DW_TAG_reference_type: return "DW_TAG_reference_type";
6373 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
6374 case DW_TAG_string_type: return "DW_TAG_string_type";
6375 case DW_TAG_structure_type: return "DW_TAG_structure_type";
6376 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
6377 case DW_TAG_typedef: return "DW_TAG_typedef";
6378 case DW_TAG_union_type: return "DW_TAG_union_type";
6379 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
6380 case DW_TAG_variant: return "DW_TAG_variant";
6381 case DW_TAG_common_block: return "DW_TAG_common_block";
6382 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
6383 case DW_TAG_inheritance: return "DW_TAG_inheritance";
6384 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
6385 case DW_TAG_module: return "DW_TAG_module";
6386 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
6387 case DW_TAG_set_type: return "DW_TAG_set_type";
6388 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
6389 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
6390 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
6391 case DW_TAG_base_type: return "DW_TAG_base_type";
6392 case DW_TAG_catch_block: return "DW_TAG_catch_block";
6393 case DW_TAG_const_type: return "DW_TAG_const_type";
6394 case DW_TAG_constant: return "DW_TAG_constant";
6395 case DW_TAG_enumerator: return "DW_TAG_enumerator";
6396 case DW_TAG_file_type: return "DW_TAG_file_type";
6397 case DW_TAG_friend: return "DW_TAG_friend";
6398 case DW_TAG_namelist: return "DW_TAG_namelist";
6399 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
6400 case DW_TAG_packed_type: return "DW_TAG_packed_type";
6401 case DW_TAG_subprogram: return "DW_TAG_subprogram";
6402 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
6403 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
6404 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
6405 case DW_TAG_try_block: return "DW_TAG_try_block";
6406 case DW_TAG_variant_part: return "DW_TAG_variant_part";
6407 case DW_TAG_variable: return "DW_TAG_variable";
6408 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
6409 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
6410 case DW_TAG_format_label: return "DW_TAG_format_label";
6411 case DW_TAG_function_template: return "DW_TAG_function_template";
6412 case DW_TAG_class_template: return "DW_TAG_class_template";
6413 /* DWARF 2.1 values. */
6414 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
6415 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
6416 case DW_TAG_interface_type: return "DW_TAG_interface_type";
6417 case DW_TAG_namespace: return "DW_TAG_namespace";
6418 case DW_TAG_imported_module: return "DW_TAG_imported_module";
6419 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
6420 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
6421 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
6424 static char buffer [100];
6426 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
6433 get_AT_name (attribute)
6434 unsigned long attribute;
6438 case DW_AT_sibling: return "DW_AT_sibling";
6439 case DW_AT_location: return "DW_AT_location";
6440 case DW_AT_name: return "DW_AT_name";
6441 case DW_AT_ordering: return "DW_AT_ordering";
6442 case DW_AT_subscr_data: return "DW_AT_subscr_data";
6443 case DW_AT_byte_size: return "DW_AT_byte_size";
6444 case DW_AT_bit_offset: return "DW_AT_bit_offset";
6445 case DW_AT_bit_size: return "DW_AT_bit_size";
6446 case DW_AT_element_list: return "DW_AT_element_list";
6447 case DW_AT_stmt_list: return "DW_AT_stmt_list";
6448 case DW_AT_low_pc: return "DW_AT_low_pc";
6449 case DW_AT_high_pc: return "DW_AT_high_pc";
6450 case DW_AT_language: return "DW_AT_language";
6451 case DW_AT_member: return "DW_AT_member";
6452 case DW_AT_discr: return "DW_AT_discr";
6453 case DW_AT_discr_value: return "DW_AT_discr_value";
6454 case DW_AT_visibility: return "DW_AT_visibility";
6455 case DW_AT_import: return "DW_AT_import";
6456 case DW_AT_string_length: return "DW_AT_string_length";
6457 case DW_AT_common_reference: return "DW_AT_common_reference";
6458 case DW_AT_comp_dir: return "DW_AT_comp_dir";
6459 case DW_AT_const_value: return "DW_AT_const_value";
6460 case DW_AT_containing_type: return "DW_AT_containing_type";
6461 case DW_AT_default_value: return "DW_AT_default_value";
6462 case DW_AT_inline: return "DW_AT_inline";
6463 case DW_AT_is_optional: return "DW_AT_is_optional";
6464 case DW_AT_lower_bound: return "DW_AT_lower_bound";
6465 case DW_AT_producer: return "DW_AT_producer";
6466 case DW_AT_prototyped: return "DW_AT_prototyped";
6467 case DW_AT_return_addr: return "DW_AT_return_addr";
6468 case DW_AT_start_scope: return "DW_AT_start_scope";
6469 case DW_AT_stride_size: return "DW_AT_stride_size";
6470 case DW_AT_upper_bound: return "DW_AT_upper_bound";
6471 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
6472 case DW_AT_accessibility: return "DW_AT_accessibility";
6473 case DW_AT_address_class: return "DW_AT_address_class";
6474 case DW_AT_artificial: return "DW_AT_artificial";
6475 case DW_AT_base_types: return "DW_AT_base_types";
6476 case DW_AT_calling_convention: return "DW_AT_calling_convention";
6477 case DW_AT_count: return "DW_AT_count";
6478 case DW_AT_data_member_location: return "DW_AT_data_member_location";
6479 case DW_AT_decl_column: return "DW_AT_decl_column";
6480 case DW_AT_decl_file: return "DW_AT_decl_file";
6481 case DW_AT_decl_line: return "DW_AT_decl_line";
6482 case DW_AT_declaration: return "DW_AT_declaration";
6483 case DW_AT_discr_list: return "DW_AT_discr_list";
6484 case DW_AT_encoding: return "DW_AT_encoding";
6485 case DW_AT_external: return "DW_AT_external";
6486 case DW_AT_frame_base: return "DW_AT_frame_base";
6487 case DW_AT_friend: return "DW_AT_friend";
6488 case DW_AT_identifier_case: return "DW_AT_identifier_case";
6489 case DW_AT_macro_info: return "DW_AT_macro_info";
6490 case DW_AT_namelist_items: return "DW_AT_namelist_items";
6491 case DW_AT_priority: return "DW_AT_priority";
6492 case DW_AT_segment: return "DW_AT_segment";
6493 case DW_AT_specification: return "DW_AT_specification";
6494 case DW_AT_static_link: return "DW_AT_static_link";
6495 case DW_AT_type: return "DW_AT_type";
6496 case DW_AT_use_location: return "DW_AT_use_location";
6497 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
6498 case DW_AT_virtuality: return "DW_AT_virtuality";
6499 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
6500 /* DWARF 2.1 values. */
6501 case DW_AT_allocated: return "DW_AT_allocated";
6502 case DW_AT_associated: return "DW_AT_associated";
6503 case DW_AT_data_location: return "DW_AT_data_location";
6504 case DW_AT_stride: return "DW_AT_stride";
6505 case DW_AT_entry_pc: return "DW_AT_entry_pc";
6506 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
6507 case DW_AT_extension: return "DW_AT_extension";
6508 case DW_AT_ranges: return "DW_AT_ranges";
6509 case DW_AT_trampoline: return "DW_AT_trampoline";
6510 case DW_AT_call_column: return "DW_AT_call_column";
6511 case DW_AT_call_file: return "DW_AT_call_file";
6512 case DW_AT_call_line: return "DW_AT_call_line";
6513 /* SGI/MIPS extensions. */
6514 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
6515 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
6516 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
6517 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
6518 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
6519 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
6520 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
6521 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
6522 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
6523 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
6524 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
6525 /* GNU extensions. */
6526 case DW_AT_sf_names: return "DW_AT_sf_names";
6527 case DW_AT_src_info: return "DW_AT_src_info";
6528 case DW_AT_mac_info: return "DW_AT_mac_info";
6529 case DW_AT_src_coords: return "DW_AT_src_coords";
6530 case DW_AT_body_begin: return "DW_AT_body_begin";
6531 case DW_AT_body_end: return "DW_AT_body_end";
6534 static char buffer [100];
6536 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
6543 get_FORM_name (form)
6548 case DW_FORM_addr: return "DW_FORM_addr";
6549 case DW_FORM_block2: return "DW_FORM_block2";
6550 case DW_FORM_block4: return "DW_FORM_block4";
6551 case DW_FORM_data2: return "DW_FORM_data2";
6552 case DW_FORM_data4: return "DW_FORM_data4";
6553 case DW_FORM_data8: return "DW_FORM_data8";
6554 case DW_FORM_string: return "DW_FORM_string";
6555 case DW_FORM_block: return "DW_FORM_block";
6556 case DW_FORM_block1: return "DW_FORM_block1";
6557 case DW_FORM_data1: return "DW_FORM_data1";
6558 case DW_FORM_flag: return "DW_FORM_flag";
6559 case DW_FORM_sdata: return "DW_FORM_sdata";
6560 case DW_FORM_strp: return "DW_FORM_strp";
6561 case DW_FORM_udata: return "DW_FORM_udata";
6562 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
6563 case DW_FORM_ref1: return "DW_FORM_ref1";
6564 case DW_FORM_ref2: return "DW_FORM_ref2";
6565 case DW_FORM_ref4: return "DW_FORM_ref4";
6566 case DW_FORM_ref8: return "DW_FORM_ref8";
6567 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
6568 case DW_FORM_indirect: return "DW_FORM_indirect";
6571 static char buffer [100];
6573 sprintf (buffer, _("Unknown FORM value: %lx"), form);
6579 /* FIXME: There are better and more effiecint ways to handle
6580 these structures. For now though, I just want something that
6581 is simple to implement. */
6582 typedef struct abbrev_attr
6584 unsigned long attribute;
6586 struct abbrev_attr * next;
6590 typedef struct abbrev_entry
6592 unsigned long entry;
6595 struct abbrev_attr * first_attr;
6596 struct abbrev_attr * last_attr;
6597 struct abbrev_entry * next;
6601 static abbrev_entry * first_abbrev = NULL;
6602 static abbrev_entry * last_abbrev = NULL;
6605 free_abbrevs PARAMS ((void))
6607 abbrev_entry * abbrev;
6609 for (abbrev = first_abbrev; abbrev;)
6611 abbrev_entry * next = abbrev->next;
6614 for (attr = abbrev->first_attr; attr;)
6616 abbrev_attr * next = attr->next;
6626 last_abbrev = first_abbrev = NULL;
6630 add_abbrev (number, tag, children)
6631 unsigned long number;
6635 abbrev_entry * entry;
6637 entry = (abbrev_entry *) malloc (sizeof (* entry));
6643 entry->entry = number;
6645 entry->children = children;
6646 entry->first_attr = NULL;
6647 entry->last_attr = NULL;
6650 if (first_abbrev == NULL)
6651 first_abbrev = entry;
6653 last_abbrev->next = entry;
6655 last_abbrev = entry;
6659 add_abbrev_attr (attribute, form)
6660 unsigned long attribute;
6665 attr = (abbrev_attr *) malloc (sizeof (* attr));
6671 attr->attribute = attribute;
6675 if (last_abbrev->first_attr == NULL)
6676 last_abbrev->first_attr = attr;
6678 last_abbrev->last_attr->next = attr;
6680 last_abbrev->last_attr = attr;
6683 /* Processes the (partial) contents of a .debug_abbrev section.
6684 Returns NULL if the end of the section was encountered.
6685 Returns the address after the last byte read if the end of
6686 an abbreviation set was found. */
6688 static unsigned char *
6689 process_abbrev_section (start, end)
6690 unsigned char * start;
6691 unsigned char * end;
6693 if (first_abbrev != NULL)
6699 unsigned long entry;
6701 unsigned long attribute;
6704 entry = read_leb128 (start, & bytes_read, 0);
6705 start += bytes_read;
6707 /* A single zero is supposed to end the section according
6708 to the standard. If there's more, then signal that to
6711 return start == end ? NULL : start;
6713 tag = read_leb128 (start, & bytes_read, 0);
6714 start += bytes_read;
6716 children = * start ++;
6718 add_abbrev (entry, tag, children);
6724 attribute = read_leb128 (start, & bytes_read, 0);
6725 start += bytes_read;
6727 form = read_leb128 (start, & bytes_read, 0);
6728 start += bytes_read;
6731 add_abbrev_attr (attribute, form);
6733 while (attribute != 0);
6741 display_debug_macinfo (section, start, file)
6742 Elf32_Internal_Shdr * section;
6743 unsigned char * start;
6744 FILE * file ATTRIBUTE_UNUSED;
6746 unsigned char * end = start + section->sh_size;
6747 unsigned char * curr = start;
6748 unsigned int bytes_read;
6749 enum dwarf_macinfo_record_type op;
6751 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6755 unsigned int lineno;
6756 const char * string;
6763 case DW_MACINFO_start_file:
6765 unsigned int filenum;
6767 lineno = read_leb128 (curr, & bytes_read, 0);
6769 filenum = read_leb128 (curr, & bytes_read, 0);
6772 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno, filenum);
6776 case DW_MACINFO_end_file:
6777 printf (_(" DW_MACINFO_end_file\n"));
6780 case DW_MACINFO_define:
6781 lineno = read_leb128 (curr, & bytes_read, 0);
6784 curr += strlen (string) + 1;
6785 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno, string);
6788 case DW_MACINFO_undef:
6789 lineno = read_leb128 (curr, & bytes_read, 0);
6792 curr += strlen (string) + 1;
6793 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno, string);
6796 case DW_MACINFO_vendor_ext:
6798 unsigned int constant;
6800 constant = read_leb128 (curr, & bytes_read, 0);
6803 curr += strlen (string) + 1;
6804 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant, string);
6815 display_debug_abbrev (section, start, file)
6816 Elf32_Internal_Shdr * section;
6817 unsigned char * start;
6818 FILE * file ATTRIBUTE_UNUSED;
6820 abbrev_entry * entry;
6821 unsigned char * end = start + section->sh_size;
6823 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6827 start = process_abbrev_section (start, end);
6829 if (first_abbrev == NULL)
6832 printf (_(" Number TAG\n"));
6834 for (entry = first_abbrev; entry; entry = entry->next)
6838 printf (_(" %ld %s [%s]\n"),
6840 get_TAG_name (entry->tag),
6841 entry->children ? _("has children") : _("no children"));
6843 for (attr = entry->first_attr; attr; attr = attr->next)
6845 printf (_(" %-18s %s\n"),
6846 get_AT_name (attr->attribute),
6847 get_FORM_name (attr->form));
6861 static unsigned char *
6862 display_block (data, length)
6863 unsigned char * data;
6864 unsigned long length;
6866 printf (_(" %lu byte block: "), length);
6869 printf ("%lx ", (unsigned long) byte_get (data ++, 1));
6875 decode_location_expression (data, pointer_size, length)
6876 unsigned char * data;
6877 unsigned int pointer_size;
6878 unsigned long length;
6882 unsigned long uvalue;
6883 unsigned char * end = data + length;
6892 printf ("DW_OP_addr: %lx",
6893 (unsigned long) byte_get (data, pointer_size));
6894 data += pointer_size;
6897 printf ("DW_OP_deref");
6900 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
6903 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
6906 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
6910 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
6914 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
6918 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
6922 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
6923 (unsigned long) byte_get (data + 4, 4));
6927 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
6928 (long) byte_get (data + 4, 4));
6932 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
6936 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
6940 printf ("DW_OP_dup");
6943 printf ("DW_OP_drop");
6946 printf ("DW_OP_over");
6949 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
6952 printf ("DW_OP_swap");
6955 printf ("DW_OP_rot");
6958 printf ("DW_OP_xderef");
6961 printf ("DW_OP_abs");
6964 printf ("DW_OP_and");
6967 printf ("DW_OP_div");
6970 printf ("DW_OP_minus");
6973 printf ("DW_OP_mod");
6976 printf ("DW_OP_mul");
6979 printf ("DW_OP_neg");
6982 printf ("DW_OP_not");
6985 printf ("DW_OP_or");
6988 printf ("DW_OP_plus");
6990 case DW_OP_plus_uconst:
6991 printf ("DW_OP_plus_uconst: %lu",
6992 read_leb128 (data, &bytes_read, 0));
6996 printf ("DW_OP_shl");
6999 printf ("DW_OP_shr");
7002 printf ("DW_OP_shra");
7005 printf ("DW_OP_xor");
7008 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
7012 printf ("DW_OP_eq");
7015 printf ("DW_OP_ge");
7018 printf ("DW_OP_gt");
7021 printf ("DW_OP_le");
7024 printf ("DW_OP_lt");
7027 printf ("DW_OP_ne");
7030 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
7066 printf ("DW_OP_lit%d", op - DW_OP_lit0);
7101 printf ("DW_OP_reg%d", op - DW_OP_reg0);
7136 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
7137 read_leb128 (data, &bytes_read, 1));
7142 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
7146 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
7150 uvalue = read_leb128 (data, &bytes_read, 0);
7152 printf ("DW_OP_bregx: %lu %ld", uvalue,
7153 read_leb128 (data, &bytes_read, 1));
7157 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
7160 case DW_OP_deref_size:
7161 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
7163 case DW_OP_xderef_size:
7164 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
7167 printf ("DW_OP_nop");
7170 /* DWARF 2.1 extensions. */
7171 case DW_OP_push_object_address:
7172 printf ("DW_OP_push_object_address");
7175 printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2));
7179 printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4));
7183 printf ("DW_OP_calli");
7187 if (op >= DW_OP_lo_user
7188 && op <= DW_OP_hi_user)
7189 printf (_("(User defined location op)"));
7191 printf (_("(Unknown location op)"));
7192 /* No way to tell where the next op is, so just bail. */
7196 /* Separate the ops. */
7201 static const char * debug_loc_contents;
7202 static bfd_vma debug_loc_size;
7205 load_debug_loc (file)
7208 Elf32_Internal_Shdr * sec;
7211 /* If it is already loaded, do nothing. */
7212 if (debug_loc_contents != NULL)
7215 /* Locate the .debug_loc section. */
7216 for (i = 0, sec = section_headers;
7217 i < elf_header.e_shnum;
7219 if (strcmp (SECTION_NAME (sec), ".debug_loc") == 0)
7222 if (i == elf_header.e_shnum || sec->sh_size == 0)
7225 debug_loc_size = sec->sh_size;
7227 debug_loc_contents = ((char *)
7228 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7229 _("debug_loc section data")));
7235 if (debug_loc_contents == NULL)
7238 free ((char *) debug_loc_contents);
7239 debug_loc_contents = NULL;
7245 display_debug_loc (section, start, file)
7246 Elf32_Internal_Shdr * section;
7247 unsigned char * start;
7248 FILE * file ATTRIBUTE_UNUSED;
7250 unsigned char *section_end;
7251 unsigned long bytes;
7252 unsigned char *section_begin = start;
7255 addr = section->sh_addr;
7256 bytes = section->sh_size;
7257 section_end = start + bytes;
7260 printf (_("\nThe .debug_loc section is empty.\n"));
7263 printf (_("Contents of the .debug_loc section:\n\n"));
7264 printf (_("\n Offset Begin End Expression\n"));
7265 while (start < section_end)
7267 unsigned long begin;
7269 unsigned short length;
7270 unsigned long offset;
7272 offset = start - section_begin;
7276 /* Normally, the lists in the debug_loc section are related to a
7277 given compilation unit, and thus, we would use the
7278 pointer size of that compilation unit. However, since we are
7279 displaying it seperately here, we either have to store
7280 pointer sizes of all compilation units, or assume they don't
7281 change. We assume, like the debug_line display, that
7282 it doesn't change. */
7283 begin = byte_get (start, debug_line_pointer_size);
7284 start += debug_line_pointer_size;
7285 end = byte_get (start, debug_line_pointer_size);
7286 start += debug_line_pointer_size;
7288 if (begin == 0 && end == 0)
7294 length = byte_get (start, 2);
7297 printf (" %8.8lx %8.8lx %8.8lx (", offset, begin, end);
7298 decode_location_expression (start, debug_line_pointer_size, length);
7308 static const char * debug_str_contents;
7309 static bfd_vma debug_str_size;
7312 load_debug_str (file)
7315 Elf32_Internal_Shdr * sec;
7318 /* If it is already loaded, do nothing. */
7319 if (debug_str_contents != NULL)
7322 /* Locate the .debug_str section. */
7323 for (i = 0, sec = section_headers;
7324 i < elf_header.e_shnum;
7326 if (strcmp (SECTION_NAME (sec), ".debug_str") == 0)
7329 if (i == elf_header.e_shnum || sec->sh_size == 0)
7332 debug_str_size = sec->sh_size;
7334 debug_str_contents = ((char *)
7335 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7336 _("debug_str section data")));
7342 if (debug_str_contents == NULL)
7345 free ((char *) debug_str_contents);
7346 debug_str_contents = NULL;
7351 fetch_indirect_string (offset)
7352 unsigned long offset;
7354 if (debug_str_contents == NULL)
7355 return _("<no .debug_str section>");
7357 if (offset > debug_str_size)
7358 return _("<offset is too big>");
7360 return debug_str_contents + offset;
7365 display_debug_str (section, start, file)
7366 Elf32_Internal_Shdr * section;
7367 unsigned char * start;
7368 FILE * file ATTRIBUTE_UNUSED;
7370 unsigned long bytes;
7373 addr = section->sh_addr;
7374 bytes = section->sh_size;
7378 printf (_("\nThe .debug_str section is empty.\n"));
7382 printf (_("Contents of the .debug_str section:\n\n"));
7390 lbytes = (bytes > 16 ? 16 : bytes);
7392 printf (" 0x%8.8lx ", (unsigned long) addr);
7394 for (j = 0; j < 16; j++)
7397 printf ("%2.2x", start [j]);
7405 for (j = 0; j < lbytes; j++)
7408 if (k >= ' ' && k < 0x80)
7425 static unsigned char *
7426 read_and_display_attr_value (attribute, form, data, cu_offset, pointer_size)
7427 unsigned long attribute;
7429 unsigned char * data;
7430 unsigned long cu_offset;
7431 unsigned long pointer_size;
7433 unsigned long uvalue = 0;
7434 unsigned char * block_start = NULL;
7442 case DW_FORM_ref_addr:
7444 uvalue = byte_get (data, pointer_size);
7445 data += pointer_size;
7449 uvalue = byte_get (data, /* offset_size */ 4);
7450 data += /* offset_size */ 4;
7456 uvalue = byte_get (data ++, 1);
7461 uvalue = byte_get (data, 2);
7467 uvalue = byte_get (data, 4);
7472 uvalue = read_leb128 (data, & bytes_read, 1);
7476 case DW_FORM_ref_udata:
7478 uvalue = read_leb128 (data, & bytes_read, 0);
7482 case DW_FORM_indirect:
7483 form = read_leb128 (data, & bytes_read, 0);
7485 printf (" %s", get_FORM_name (form));
7486 return read_and_display_attr_value (attribute, form, data, cu_offset,
7492 case DW_FORM_ref_addr:
7493 printf (" <#%lx>", uvalue);
7499 case DW_FORM_ref_udata:
7500 printf (" <%lx>", uvalue + cu_offset);
7504 printf (" %#lx", uvalue);
7512 printf (" %ld", uvalue);
7517 uvalue = byte_get (data, 4);
7518 printf (" %lx", uvalue);
7519 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
7523 case DW_FORM_string:
7524 printf (" %s", data);
7525 data += strlen ((char *) data) + 1;
7529 uvalue = read_leb128 (data, & bytes_read, 0);
7530 block_start = data + bytes_read;
7531 data = display_block (block_start, uvalue);
7534 case DW_FORM_block1:
7535 uvalue = byte_get (data, 1);
7536 block_start = data + 1;
7537 data = display_block (block_start, uvalue);
7540 case DW_FORM_block2:
7541 uvalue = byte_get (data, 2);
7542 block_start = data + 2;
7543 data = display_block (block_start, uvalue);
7546 case DW_FORM_block4:
7547 uvalue = byte_get (data, 4);
7548 block_start = data + 4;
7549 data = display_block (block_start, uvalue);
7553 printf (_(" (indirect string, offset: 0x%lx): "), uvalue);
7554 printf (fetch_indirect_string (uvalue));
7557 case DW_FORM_indirect:
7558 /* Handled above. */
7562 warn (_("Unrecognized form: %d\n"), form);
7566 /* For some attributes we can display futher information. */
7575 case DW_INL_not_inlined: printf (_("(not inlined)")); break;
7576 case DW_INL_inlined: printf (_("(inlined)")); break;
7577 case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
7578 case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break;
7579 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break;
7583 case DW_AT_language:
7586 case DW_LANG_C: printf ("(non-ANSI C)"); break;
7587 case DW_LANG_C89: printf ("(ANSI C)"); break;
7588 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
7589 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
7590 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
7591 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
7592 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
7593 case DW_LANG_Ada83: printf ("(Ada)"); break;
7594 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
7595 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
7596 /* DWARF 2.1 values. */
7597 case DW_LANG_C99: printf ("(ANSI C99)"); break;
7598 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
7599 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
7600 /* MIPS extension. */
7601 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
7602 default: printf ("(Unknown: %lx)", uvalue); break;
7606 case DW_AT_encoding:
7609 case DW_ATE_void: printf ("(void)"); break;
7610 case DW_ATE_address: printf ("(machine address)"); break;
7611 case DW_ATE_boolean: printf ("(boolean)"); break;
7612 case DW_ATE_complex_float: printf ("(complex float)"); break;
7613 case DW_ATE_float: printf ("(float)"); break;
7614 case DW_ATE_signed: printf ("(signed)"); break;
7615 case DW_ATE_signed_char: printf ("(signed char)"); break;
7616 case DW_ATE_unsigned: printf ("(unsigned)"); break;
7617 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
7618 /* DWARF 2.1 value. */
7619 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
7621 if (uvalue >= DW_ATE_lo_user
7622 && uvalue <= DW_ATE_hi_user)
7623 printf ("(user defined type)");
7625 printf ("(unknown type)");
7630 case DW_AT_accessibility:
7633 case DW_ACCESS_public: printf ("(public)"); break;
7634 case DW_ACCESS_protected: printf ("(protected)"); break;
7635 case DW_ACCESS_private: printf ("(private)"); break;
7636 default: printf ("(unknown accessibility)"); break;
7640 case DW_AT_visibility:
7643 case DW_VIS_local: printf ("(local)"); break;
7644 case DW_VIS_exported: printf ("(exported)"); break;
7645 case DW_VIS_qualified: printf ("(qualified)"); break;
7646 default: printf ("(unknown visibility)"); break;
7650 case DW_AT_virtuality:
7653 case DW_VIRTUALITY_none: printf ("(none)"); break;
7654 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
7655 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
7656 default: printf ("(unknown virtuality)"); break;
7660 case DW_AT_identifier_case:
7663 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
7664 case DW_ID_up_case: printf ("(up_case)"); break;
7665 case DW_ID_down_case: printf ("(down_case)"); break;
7666 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
7667 default: printf ("(unknown case)"); break;
7671 case DW_AT_calling_convention:
7674 case DW_CC_normal: printf ("(normal)"); break;
7675 case DW_CC_program: printf ("(program)"); break;
7676 case DW_CC_nocall: printf ("(nocall)"); break;
7678 if (uvalue >= DW_CC_lo_user
7679 && uvalue <= DW_CC_hi_user)
7680 printf ("(user defined)");
7682 printf ("(unknown convention)");
7686 case DW_AT_ordering:
7689 case -1: printf ("(undefined)"); break;
7690 case 0: printf ("(row major)"); break;
7691 case 1: printf ("(column major)"); break;
7695 case DW_AT_frame_base:
7696 case DW_AT_location:
7697 case DW_AT_data_member_location:
7698 case DW_AT_vtable_elem_location:
7699 case DW_AT_allocated:
7700 case DW_AT_associated:
7701 case DW_AT_data_location:
7703 case DW_AT_upper_bound:
7704 case DW_AT_lower_bound:
7708 decode_location_expression (block_start, pointer_size, uvalue);
7711 else if (form == DW_FORM_data4)
7714 printf ("location list");
7726 static unsigned char *
7727 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
7728 unsigned long attribute;
7730 unsigned char * data;
7731 unsigned long cu_offset;
7732 unsigned long pointer_size;
7734 printf (" %-18s:", get_AT_name (attribute));
7735 data = read_and_display_attr_value (attribute, form, data, cu_offset,
7742 display_debug_info (section, start, file)
7743 Elf32_Internal_Shdr * section;
7744 unsigned char * start;
7747 unsigned char * end = start + section->sh_size;
7748 unsigned char * section_begin = start;
7750 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7752 load_debug_str (file);
7753 load_debug_loc (file);
7757 DWARF2_External_CompUnit * external;
7758 DWARF2_Internal_CompUnit compunit;
7759 Elf32_Internal_Shdr * relsec;
7760 unsigned char * tags;
7763 unsigned long cu_offset;
7765 external = (DWARF2_External_CompUnit *) start;
7767 compunit.cu_length = BYTE_GET (external->cu_length);
7768 compunit.cu_version = BYTE_GET (external->cu_version);
7769 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
7770 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
7772 if (compunit.cu_length == 0xffffffff)
7774 warn (_("64-bit DWARF debug info is not supported yet.\n"));
7778 /* Check for RELA relocations in the abbrev_offset address, and
7780 for (relsec = section_headers;
7781 relsec < section_headers + elf_header.e_shnum;
7784 unsigned long nrelas;
7785 Elf_Internal_Rela *rela, *rp;
7786 Elf32_Internal_Shdr *symsec;
7787 Elf_Internal_Sym *symtab;
7788 Elf_Internal_Sym *sym;
7790 if (relsec->sh_type != SHT_RELA
7791 || SECTION_HEADER (relsec->sh_info) != section)
7794 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7798 symsec = SECTION_HEADER (relsec->sh_link);
7799 symtab = GET_ELF_SYMBOLS (file, symsec);
7801 for (rp = rela; rp < rela + nrelas; ++rp)
7804 != (bfd_vma) ((unsigned char *) &external->cu_abbrev_offset
7810 sym = symtab + ELF32_R_SYM (rp->r_info);
7812 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
7814 warn (_("Skipping unexpected symbol type %u\n"),
7815 ELF32_ST_TYPE (sym->st_info));
7821 sym = symtab + ELF64_R_SYM (rp->r_info);
7823 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
7825 warn (_("Skipping unexpected symbol type %u\n"),
7826 ELF64_ST_TYPE (sym->st_info));
7831 compunit.cu_abbrev_offset += rp->r_addend;
7839 tags = start + sizeof (* external);
7840 cu_offset = start - section_begin;
7841 start += compunit.cu_length + sizeof (external->cu_length);
7843 printf (_(" Compilation Unit @ %lx:\n"), cu_offset);
7844 printf (_(" Length: %ld\n"), compunit.cu_length);
7845 printf (_(" Version: %d\n"), compunit.cu_version);
7846 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
7847 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
7849 if (compunit.cu_version != 2)
7851 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
7857 /* Read in the abbrevs used by this compilation unit. */
7860 Elf32_Internal_Shdr * sec;
7861 unsigned char * begin;
7863 /* Locate the .debug_abbrev section and process it. */
7864 for (i = 0, sec = section_headers;
7865 i < elf_header.e_shnum;
7867 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
7870 if (i == elf_header.e_shnum || sec->sh_size == 0)
7872 warn (_("Unable to locate .debug_abbrev section!\n"));
7876 begin = ((unsigned char *)
7877 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7878 _("debug_abbrev section data")));
7882 process_abbrev_section (begin + compunit.cu_abbrev_offset,
7883 begin + sec->sh_size);
7889 while (tags < start)
7892 unsigned long abbrev_number;
7893 abbrev_entry * entry;
7896 abbrev_number = read_leb128 (tags, & bytes_read, 0);
7899 /* A null DIE marks the end of a list of children. */
7900 if (abbrev_number == 0)
7906 /* Scan through the abbreviation list until we reach the
7908 for (entry = first_abbrev;
7909 entry && entry->entry != abbrev_number;
7910 entry = entry->next)
7915 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
7920 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
7922 (unsigned long) (tags - section_begin - bytes_read),
7924 get_TAG_name (entry->tag));
7926 for (attr = entry->first_attr; attr; attr = attr->next)
7927 tags = read_and_display_attr (attr->attribute,
7930 compunit.cu_pointer_size);
7932 if (entry->children)
7946 display_debug_aranges (section, start, file)
7947 Elf32_Internal_Shdr * section;
7948 unsigned char * start;
7949 FILE * file ATTRIBUTE_UNUSED;
7951 unsigned char * end = start + section->sh_size;
7953 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7957 DWARF2_External_ARange * external;
7958 DWARF2_Internal_ARange arange;
7959 unsigned char * ranges;
7960 unsigned long length;
7961 unsigned long address;
7964 external = (DWARF2_External_ARange *) start;
7966 arange.ar_length = BYTE_GET (external->ar_length);
7967 arange.ar_version = BYTE_GET (external->ar_version);
7968 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
7969 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
7970 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
7972 if (arange.ar_length == 0xffffffff)
7974 warn (_("64-bit DWARF aranges are not supported yet.\n"));
7978 if (arange.ar_version != 2)
7980 warn (_("Only DWARF 2 aranges are currently supported.\n"));
7984 printf (_(" Length: %ld\n"), arange.ar_length);
7985 printf (_(" Version: %d\n"), arange.ar_version);
7986 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
7987 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
7988 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
7990 printf (_("\n Address Length\n"));
7992 ranges = start + sizeof (* external);
7994 /* Must pad to an alignment boundary that is twice the pointer size. */
7995 excess = sizeof (* external) % (2 * arange.ar_pointer_size);
7997 ranges += (2 * arange.ar_pointer_size) - excess;
8001 address = byte_get (ranges, arange.ar_pointer_size);
8003 ranges += arange.ar_pointer_size;
8005 length = byte_get (ranges, arange.ar_pointer_size);
8007 ranges += arange.ar_pointer_size;
8009 /* A pair of zeros marks the end of the list. */
8010 if (address == 0 && length == 0)
8013 printf (" %8.8lx %lu\n", address, length);
8016 start += arange.ar_length + sizeof (external->ar_length);
8024 typedef struct Frame_Chunk
8026 struct Frame_Chunk * next;
8027 unsigned char * chunk_start;
8029 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
8030 short int * col_type;
8032 char * augmentation;
8033 unsigned int code_factor;
8035 unsigned long pc_begin;
8036 unsigned long pc_range;
8040 unsigned char fde_encoding;
8044 /* A marker for a col_type that means this column was never referenced
8045 in the frame info. */
8046 #define DW_CFA_unreferenced (-1)
8048 static void frame_need_space PARAMS ((Frame_Chunk *, int));
8049 static void frame_display_row PARAMS ((Frame_Chunk *, int *, int *));
8050 static int size_of_encoded_value PARAMS ((int));
8053 frame_need_space (fc, reg)
8057 int prev = fc->ncols;
8059 if (reg < fc->ncols)
8062 fc->ncols = reg + 1;
8063 fc->col_type = (short int *) xrealloc (fc->col_type,
8064 fc->ncols * sizeof (short int));
8065 fc->col_offset = (int *) xrealloc (fc->col_offset,
8066 fc->ncols * sizeof (int));
8068 while (prev < fc->ncols)
8070 fc->col_type[prev] = DW_CFA_unreferenced;
8071 fc->col_offset[prev] = 0;
8077 frame_display_row (fc, need_col_headers, max_regs)
8079 int * need_col_headers;
8085 if (* max_regs < fc->ncols)
8086 * max_regs = fc->ncols;
8088 if (* need_col_headers)
8090 * need_col_headers = 0;
8092 printf (" LOC CFA ");
8094 for (r = 0; r < * max_regs; r++)
8095 if (fc->col_type[r] != DW_CFA_unreferenced)
8100 printf ("r%-4d", r);
8106 printf ("%08lx ", fc->pc_begin);
8107 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
8108 printf ("%-8s ", tmp);
8110 for (r = 0; r < fc->ncols; r++)
8112 if (fc->col_type[r] != DW_CFA_unreferenced)
8114 switch (fc->col_type[r])
8116 case DW_CFA_undefined:
8119 case DW_CFA_same_value:
8123 sprintf (tmp, "c%+d", fc->col_offset[r]);
8125 case DW_CFA_register:
8126 sprintf (tmp, "r%d", fc->col_offset[r]);
8129 strcpy (tmp, "n/a");
8132 printf ("%-5s", tmp);
8139 size_of_encoded_value (encoding)
8142 switch (encoding & 0x7)
8145 case 0: return is_32bit_elf ? 4 : 8;
8152 #define GET(N) byte_get (start, N); start += N
8153 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
8154 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
8157 display_debug_frames (section, start, file)
8158 Elf32_Internal_Shdr * section;
8159 unsigned char * start;
8160 FILE * file ATTRIBUTE_UNUSED;
8162 unsigned char * end = start + section->sh_size;
8163 unsigned char * section_start = start;
8164 Frame_Chunk * chunks = 0;
8165 Frame_Chunk * remembered_state = 0;
8167 int is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
8170 int addr_size = is_32bit_elf ? 4 : 8;
8172 printf (_("The section %s contains:\n"), SECTION_NAME (section));
8176 unsigned char * saved_start;
8177 unsigned char * block_end;
8178 unsigned long length;
8179 unsigned long cie_id;
8182 int need_col_headers = 1;
8183 unsigned char * augmentation_data = NULL;
8184 unsigned long augmentation_data_len = 0;
8185 int encoded_ptr_size = addr_size;
8187 saved_start = start;
8188 length = byte_get (start, 4); start += 4;
8193 if (length == 0xffffffff)
8195 warn (_("64-bit DWARF format frames are not supported yet.\n"));
8199 block_end = saved_start + length + 4;
8200 cie_id = byte_get (start, 4); start += 4;
8202 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
8206 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8207 memset (fc, 0, sizeof (Frame_Chunk));
8211 fc->chunk_start = saved_start;
8213 fc->col_type = (short int *) xmalloc (sizeof (short int));
8214 fc->col_offset = (int *) xmalloc (sizeof (int));
8215 frame_need_space (fc, max_regs-1);
8219 fc->augmentation = start;
8220 start = strchr (start, '\0') + 1;
8222 if (fc->augmentation[0] == 'z')
8224 fc->code_factor = LEB ();
8225 fc->data_factor = SLEB ();
8226 fc->ra = byte_get (start, 1); start += 1;
8227 augmentation_data_len = LEB ();
8228 augmentation_data = start;
8229 start += augmentation_data_len;
8231 else if (strcmp (fc->augmentation, "eh") == 0)
8234 fc->code_factor = LEB ();
8235 fc->data_factor = SLEB ();
8236 fc->ra = byte_get (start, 1); start += 1;
8240 fc->code_factor = LEB ();
8241 fc->data_factor = SLEB ();
8242 fc->ra = byte_get (start, 1); start += 1;
8246 if (do_debug_frames_interp)
8247 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
8248 (unsigned long)(saved_start - section_start), length, cie_id,
8249 fc->augmentation, fc->code_factor, fc->data_factor,
8253 printf ("\n%08lx %08lx %08lx CIE\n",
8254 (unsigned long)(saved_start - section_start), length, cie_id);
8255 printf (" Version: %d\n", version);
8256 printf (" Augmentation: \"%s\"\n", fc->augmentation);
8257 printf (" Code alignment factor: %u\n", fc->code_factor);
8258 printf (" Data alignment factor: %d\n", fc->data_factor);
8259 printf (" Return address column: %d\n", fc->ra);
8261 if (augmentation_data_len)
8264 printf (" Augmentation data: ");
8265 for (i = 0; i < augmentation_data_len; ++i)
8266 printf (" %02x", augmentation_data[i]);
8272 if (augmentation_data_len)
8274 unsigned char *p, *q;
8275 p = fc->augmentation + 1;
8276 q = augmentation_data;
8283 q += 1 + size_of_encoded_value (*q);
8285 fc->fde_encoding = *q++;
8291 if (fc->fde_encoding)
8292 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8295 frame_need_space (fc, fc->ra);
8299 unsigned char * look_for;
8300 static Frame_Chunk fde_fc;
8303 memset (fc, 0, sizeof (Frame_Chunk));
8305 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
8307 for (cie = chunks; cie ; cie = cie->next)
8308 if (cie->chunk_start == look_for)
8313 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
8314 cie_id, saved_start);
8317 fc->col_type = (short int *) xmalloc (sizeof (short int));
8318 fc->col_offset = (int *) xmalloc (sizeof (int));
8319 frame_need_space (fc, max_regs - 1);
8321 fc->augmentation = "";
8322 fc->fde_encoding = 0;
8326 fc->ncols = cie->ncols;
8327 fc->col_type = (short int *) xmalloc (fc->ncols * sizeof (short int));
8328 fc->col_offset = (int *) xmalloc (fc->ncols * sizeof (int));
8329 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
8330 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
8331 fc->augmentation = cie->augmentation;
8332 fc->code_factor = cie->code_factor;
8333 fc->data_factor = cie->data_factor;
8334 fc->cfa_reg = cie->cfa_reg;
8335 fc->cfa_offset = cie->cfa_offset;
8337 frame_need_space (fc, max_regs-1);
8338 fc->fde_encoding = cie->fde_encoding;
8341 if (fc->fde_encoding)
8342 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8344 fc->pc_begin = byte_get (start, encoded_ptr_size);
8345 start += encoded_ptr_size;
8346 fc->pc_range = byte_get (start, encoded_ptr_size);
8347 start += encoded_ptr_size;
8349 if (cie->augmentation[0] == 'z')
8351 augmentation_data_len = LEB ();
8352 augmentation_data = start;
8353 start += augmentation_data_len;
8356 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
8357 (unsigned long)(saved_start - section_start), length, cie_id,
8358 (unsigned long)(cie->chunk_start - section_start),
8359 fc->pc_begin, fc->pc_begin + fc->pc_range);
8360 if (! do_debug_frames_interp && augmentation_data_len)
8363 printf (" Augmentation data: ");
8364 for (i = 0; i < augmentation_data_len; ++i)
8365 printf (" %02x", augmentation_data[i]);
8371 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8372 about to interpret instructions for the chunk. */
8374 if (do_debug_frames_interp)
8376 /* Start by making a pass over the chunk, allocating storage
8377 and taking note of what registers are used. */
8378 unsigned char * tmp = start;
8380 while (start < block_end)
8390 /* Warning: if you add any more cases to this switch, be
8391 sure to add them to the corresponding switch below. */
8394 case DW_CFA_advance_loc:
8398 frame_need_space (fc, opa);
8399 fc->col_type[opa] = DW_CFA_undefined;
8401 case DW_CFA_restore:
8402 frame_need_space (fc, opa);
8403 fc->col_type[opa] = DW_CFA_undefined;
8405 case DW_CFA_set_loc:
8406 start += encoded_ptr_size;
8408 case DW_CFA_advance_loc1:
8411 case DW_CFA_advance_loc2:
8414 case DW_CFA_advance_loc4:
8417 case DW_CFA_offset_extended:
8418 reg = LEB (); LEB ();
8419 frame_need_space (fc, reg);
8420 fc->col_type[reg] = DW_CFA_undefined;
8422 case DW_CFA_restore_extended:
8424 frame_need_space (fc, reg);
8425 fc->col_type[reg] = DW_CFA_undefined;
8427 case DW_CFA_undefined:
8429 frame_need_space (fc, reg);
8430 fc->col_type[reg] = DW_CFA_undefined;
8432 case DW_CFA_same_value:
8434 frame_need_space (fc, reg);
8435 fc->col_type[reg] = DW_CFA_undefined;
8437 case DW_CFA_register:
8438 reg = LEB (); LEB ();
8439 frame_need_space (fc, reg);
8440 fc->col_type[reg] = DW_CFA_undefined;
8442 case DW_CFA_def_cfa:
8445 case DW_CFA_def_cfa_register:
8448 case DW_CFA_def_cfa_offset:
8451 #ifndef DW_CFA_GNU_args_size
8452 #define DW_CFA_GNU_args_size 0x2e
8454 case DW_CFA_GNU_args_size:
8457 #ifndef DW_CFA_GNU_negative_offset_extended
8458 #define DW_CFA_GNU_negative_offset_extended 0x2f
8460 case DW_CFA_GNU_negative_offset_extended:
8461 reg = LEB (); LEB ();
8462 frame_need_space (fc, reg);
8463 fc->col_type[reg] = DW_CFA_undefined;
8472 /* Now we know what registers are used, make a second pass over
8473 the chunk, this time actually printing out the info. */
8475 while (start < block_end)
8478 unsigned long ul, reg, roffs;
8487 /* Warning: if you add any more cases to this switch, be
8488 sure to add them to the corresponding switch above. */
8491 case DW_CFA_advance_loc:
8492 if (do_debug_frames_interp)
8493 frame_display_row (fc, &need_col_headers, &max_regs);
8495 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8496 opa * fc->code_factor,
8497 fc->pc_begin + opa * fc->code_factor);
8498 fc->pc_begin += opa * fc->code_factor;
8503 if (! do_debug_frames_interp)
8504 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8505 opa, roffs * fc->data_factor);
8506 fc->col_type[opa] = DW_CFA_offset;
8507 fc->col_offset[opa] = roffs * fc->data_factor;
8510 case DW_CFA_restore:
8511 if (! do_debug_frames_interp)
8512 printf (" DW_CFA_restore: r%d\n", opa);
8513 fc->col_type[opa] = cie->col_type[opa];
8514 fc->col_offset[opa] = cie->col_offset[opa];
8517 case DW_CFA_set_loc:
8518 vma = byte_get (start, encoded_ptr_size);
8519 start += encoded_ptr_size;
8520 if (do_debug_frames_interp)
8521 frame_display_row (fc, &need_col_headers, &max_regs);
8523 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
8527 case DW_CFA_advance_loc1:
8528 ofs = byte_get (start, 1); start += 1;
8529 if (do_debug_frames_interp)
8530 frame_display_row (fc, &need_col_headers, &max_regs);
8532 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8533 ofs * fc->code_factor,
8534 fc->pc_begin + ofs * fc->code_factor);
8535 fc->pc_begin += ofs * fc->code_factor;
8538 case DW_CFA_advance_loc2:
8539 ofs = byte_get (start, 2); start += 2;
8540 if (do_debug_frames_interp)
8541 frame_display_row (fc, &need_col_headers, &max_regs);
8543 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8544 ofs * fc->code_factor,
8545 fc->pc_begin + ofs * fc->code_factor);
8546 fc->pc_begin += ofs * fc->code_factor;
8549 case DW_CFA_advance_loc4:
8550 ofs = byte_get (start, 4); start += 4;
8551 if (do_debug_frames_interp)
8552 frame_display_row (fc, &need_col_headers, &max_regs);
8554 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8555 ofs * fc->code_factor,
8556 fc->pc_begin + ofs * fc->code_factor);
8557 fc->pc_begin += ofs * fc->code_factor;
8560 case DW_CFA_offset_extended:
8563 if (! do_debug_frames_interp)
8564 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8565 reg, roffs * fc->data_factor);
8566 fc->col_type[reg] = DW_CFA_offset;
8567 fc->col_offset[reg] = roffs * fc->data_factor;
8570 case DW_CFA_restore_extended:
8572 if (! do_debug_frames_interp)
8573 printf (" DW_CFA_restore_extended: r%ld\n", reg);
8574 fc->col_type[reg] = cie->col_type[reg];
8575 fc->col_offset[reg] = cie->col_offset[reg];
8578 case DW_CFA_undefined:
8580 if (! do_debug_frames_interp)
8581 printf (" DW_CFA_undefined: r%ld\n", reg);
8582 fc->col_type[reg] = DW_CFA_undefined;
8583 fc->col_offset[reg] = 0;
8586 case DW_CFA_same_value:
8588 if (! do_debug_frames_interp)
8589 printf (" DW_CFA_same_value: r%ld\n", reg);
8590 fc->col_type[reg] = DW_CFA_same_value;
8591 fc->col_offset[reg] = 0;
8594 case DW_CFA_register:
8597 if (! do_debug_frames_interp)
8598 printf (" DW_CFA_register: r%ld\n", reg);
8599 fc->col_type[reg] = DW_CFA_register;
8600 fc->col_offset[reg] = roffs;
8603 case DW_CFA_remember_state:
8604 if (! do_debug_frames_interp)
8605 printf (" DW_CFA_remember_state\n");
8606 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8607 rs->ncols = fc->ncols;
8608 rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
8609 rs->col_offset = (int *) xmalloc (rs->ncols * sizeof (int));
8610 memcpy (rs->col_type, fc->col_type, rs->ncols);
8611 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
8612 rs->next = remembered_state;
8613 remembered_state = rs;
8616 case DW_CFA_restore_state:
8617 if (! do_debug_frames_interp)
8618 printf (" DW_CFA_restore_state\n");
8619 rs = remembered_state;
8620 remembered_state = rs->next;
8621 frame_need_space (fc, rs->ncols-1);
8622 memcpy (fc->col_type, rs->col_type, rs->ncols);
8623 memcpy (fc->col_offset, rs->col_offset, rs->ncols * sizeof (int));
8624 free (rs->col_type);
8625 free (rs->col_offset);
8629 case DW_CFA_def_cfa:
8630 fc->cfa_reg = LEB ();
8631 fc->cfa_offset = LEB ();
8632 if (! do_debug_frames_interp)
8633 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
8634 fc->cfa_reg, fc->cfa_offset);
8637 case DW_CFA_def_cfa_register:
8638 fc->cfa_reg = LEB ();
8639 if (! do_debug_frames_interp)
8640 printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
8643 case DW_CFA_def_cfa_offset:
8644 fc->cfa_offset = LEB ();
8645 if (! do_debug_frames_interp)
8646 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
8650 if (! do_debug_frames_interp)
8651 printf (" DW_CFA_nop\n");
8654 #ifndef DW_CFA_GNU_window_save
8655 #define DW_CFA_GNU_window_save 0x2d
8657 case DW_CFA_GNU_window_save:
8658 if (! do_debug_frames_interp)
8659 printf (" DW_CFA_GNU_window_save\n");
8662 case DW_CFA_GNU_args_size:
8664 if (! do_debug_frames_interp)
8665 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
8668 case DW_CFA_GNU_negative_offset_extended:
8671 frame_need_space (fc, reg);
8672 if (! do_debug_frames_interp)
8673 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
8674 reg, l * fc->data_factor);
8675 fc->col_type[reg] = DW_CFA_offset;
8676 fc->col_offset[reg] = l * fc->data_factor;
8680 fprintf (stderr, "unsupported or unknown DW_CFA_%d\n", op);
8685 if (do_debug_frames_interp)
8686 frame_display_row (fc, &need_col_headers, &max_regs);
8701 display_debug_not_supported (section, start, file)
8702 Elf32_Internal_Shdr * section;
8703 unsigned char * start ATTRIBUTE_UNUSED;
8704 FILE * file ATTRIBUTE_UNUSED;
8706 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
8707 SECTION_NAME (section));
8712 /* Pre-scan the .debug_info section to record the size of address.
8713 When dumping the .debug_line, we use that size information, assuming
8714 that all compilation units have the same address size. */
8716 prescan_debug_info (section, start, file)
8717 Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
8718 unsigned char * start;
8719 FILE * file ATTRIBUTE_UNUSED;
8721 DWARF2_External_CompUnit * external;
8723 external = (DWARF2_External_CompUnit *) start;
8725 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
8729 /* A structure containing the name of a debug section and a pointer
8730 to a function that can decode it. The third field is a prescan
8731 function to be run over the section before displaying any of the
8735 const char * const name;
8736 int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8737 int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8741 { ".debug_abbrev", display_debug_abbrev, NULL },
8742 { ".debug_aranges", display_debug_aranges, NULL },
8743 { ".debug_frame", display_debug_frames, NULL },
8744 { ".debug_info", display_debug_info, prescan_debug_info },
8745 { ".debug_line", display_debug_lines, NULL },
8746 { ".debug_pubnames", display_debug_pubnames, NULL },
8747 { ".eh_frame", display_debug_frames, NULL },
8748 { ".debug_macinfo", display_debug_macinfo, NULL },
8749 { ".debug_str", display_debug_str, NULL },
8750 { ".debug_loc", display_debug_loc, NULL },
8751 { ".debug_pubtypes", display_debug_not_supported, NULL },
8752 { ".debug_ranges", display_debug_not_supported, NULL },
8753 { ".debug_static_func", display_debug_not_supported, NULL },
8754 { ".debug_static_vars", display_debug_not_supported, NULL },
8755 { ".debug_types", display_debug_not_supported, NULL },
8756 { ".debug_weaknames", display_debug_not_supported, NULL }
8760 display_debug_section (section, file)
8761 Elf32_Internal_Shdr * section;
8764 char * name = SECTION_NAME (section);
8765 bfd_size_type length;
8766 unsigned char * start;
8769 length = section->sh_size;
8772 printf (_("\nSection '%s' has no debugging data.\n"), name);
8776 start = (unsigned char *) get_data (NULL, file, section->sh_offset, length,
8777 _("debug section data"));
8781 /* See if we know how to display the contents of this section. */
8782 if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
8783 name = ".debug_info";
8785 for (i = NUM_ELEM (debug_displays); i--;)
8786 if (strcmp (debug_displays[i].name, name) == 0)
8788 debug_displays[i].display (section, start, file);
8793 printf (_("Unrecognized debug section: %s\n"), name);
8797 /* If we loaded in the abbrev section at some point,
8798 we must release it here. */
8805 process_section_contents (file)
8808 Elf32_Internal_Shdr * section;
8814 /* Pre-scan the debug sections to find some debug information not
8815 present in some of them. For the .debug_line, we must find out the
8816 size of address (specified in .debug_info and .debug_aranges). */
8817 for (i = 0, section = section_headers;
8818 i < elf_header.e_shnum && i < num_dump_sects;
8821 char * name = SECTION_NAME (section);
8824 if (section->sh_size == 0)
8827 /* See if there is some pre-scan operation for this section. */
8828 for (j = NUM_ELEM (debug_displays); j--;)
8829 if (strcmp (debug_displays[j].name, name) == 0)
8831 if (debug_displays[j].prescan != NULL)
8833 bfd_size_type length;
8834 unsigned char * start;
8836 length = section->sh_size;
8837 start = ((unsigned char *)
8838 get_data (NULL, file, section->sh_offset, length,
8839 _("debug section data")));
8843 debug_displays[j].prescan (section, start, file);
8851 for (i = 0, section = section_headers;
8852 i < elf_header.e_shnum && i < num_dump_sects;
8855 #ifdef SUPPORT_DISASSEMBLY
8856 if (dump_sects[i] & DISASS_DUMP)
8857 disassemble_section (section, file);
8859 if (dump_sects[i] & HEX_DUMP)
8860 dump_section (section, file);
8862 if (dump_sects[i] & DEBUG_DUMP)
8863 display_debug_section (section, file);
8866 if (i < num_dump_sects)
8867 warn (_("Some sections were not dumped because they do not exist!\n"));
8873 process_mips_fpe_exception (mask)
8879 if (mask & OEX_FPU_INEX)
8880 fputs ("INEX", stdout), first = 0;
8881 if (mask & OEX_FPU_UFLO)
8882 printf ("%sUFLO", first ? "" : "|"), first = 0;
8883 if (mask & OEX_FPU_OFLO)
8884 printf ("%sOFLO", first ? "" : "|"), first = 0;
8885 if (mask & OEX_FPU_DIV0)
8886 printf ("%sDIV0", first ? "" : "|"), first = 0;
8887 if (mask & OEX_FPU_INVAL)
8888 printf ("%sINVAL", first ? "" : "|");
8891 fputs ("0", stdout);
8895 process_mips_specific (file)
8898 Elf_Internal_Dyn * entry;
8899 size_t liblist_offset = 0;
8900 size_t liblistno = 0;
8901 size_t conflictsno = 0;
8902 size_t options_offset = 0;
8903 size_t conflicts_offset = 0;
8905 /* We have a lot of special sections. Thanks SGI! */
8906 if (dynamic_segment == NULL)
8907 /* No information available. */
8910 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
8911 switch (entry->d_tag)
8913 case DT_MIPS_LIBLIST:
8914 liblist_offset = entry->d_un.d_val - loadaddr;
8916 case DT_MIPS_LIBLISTNO:
8917 liblistno = entry->d_un.d_val;
8919 case DT_MIPS_OPTIONS:
8920 options_offset = entry->d_un.d_val - loadaddr;
8922 case DT_MIPS_CONFLICT:
8923 conflicts_offset = entry->d_un.d_val - loadaddr;
8925 case DT_MIPS_CONFLICTNO:
8926 conflictsno = entry->d_un.d_val;
8932 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
8934 Elf32_External_Lib * elib;
8937 elib = ((Elf32_External_Lib *)
8938 get_data (NULL, file, liblist_offset,
8939 liblistno * sizeof (Elf32_External_Lib),
8943 printf ("\nSection '.liblist' contains %lu entries:\n",
8944 (unsigned long) liblistno);
8945 fputs (" Library Time Stamp Checksum Version Flags\n",
8948 for (cnt = 0; cnt < liblistno; ++cnt)
8955 liblist.l_name = BYTE_GET (elib[cnt].l_name);
8956 time = BYTE_GET (elib[cnt].l_time_stamp);
8957 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
8958 liblist.l_version = BYTE_GET (elib[cnt].l_version);
8959 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
8961 tmp = gmtime (&time);
8962 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
8963 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8964 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8966 printf ("%3lu: ", (unsigned long) cnt);
8967 print_symbol (20, dynamic_strings + liblist.l_name);
8968 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
8971 if (liblist.l_flags == 0)
8982 { " EXACT_MATCH", LL_EXACT_MATCH },
8983 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
8984 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
8985 { " EXPORTS", LL_EXPORTS },
8986 { " DELAY_LOAD", LL_DELAY_LOAD },
8987 { " DELTA", LL_DELTA }
8989 int flags = liblist.l_flags;
8993 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
8995 if ((flags & l_flags_vals[fcnt].bit) != 0)
8997 fputs (l_flags_vals[fcnt].name, stdout);
8998 flags ^= l_flags_vals[fcnt].bit;
9001 printf (" %#x", (unsigned int) flags);
9011 if (options_offset != 0)
9013 Elf_External_Options * eopt;
9014 Elf_Internal_Shdr * sect = section_headers;
9015 Elf_Internal_Options * iopt;
9016 Elf_Internal_Options * option;
9020 /* Find the section header so that we get the size. */
9021 while (sect->sh_type != SHT_MIPS_OPTIONS)
9024 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset,
9025 sect->sh_size, _("options"));
9028 iopt = ((Elf_Internal_Options *)
9029 malloc ((sect->sh_size / sizeof (eopt)) * sizeof (* iopt)));
9032 error (_("Out of memory"));
9039 while (offset < sect->sh_size)
9041 Elf_External_Options * eoption;
9043 eoption = (Elf_External_Options *) ((char *) eopt + offset);
9045 option->kind = BYTE_GET (eoption->kind);
9046 option->size = BYTE_GET (eoption->size);
9047 option->section = BYTE_GET (eoption->section);
9048 option->info = BYTE_GET (eoption->info);
9050 offset += option->size;
9056 printf (_("\nSection '%s' contains %d entries:\n"),
9057 SECTION_NAME (sect), cnt);
9065 switch (option->kind)
9068 /* This shouldn't happen. */
9069 printf (" NULL %d %lx", option->section, option->info);
9072 printf (" REGINFO ");
9073 if (elf_header.e_machine == EM_MIPS)
9076 Elf32_External_RegInfo * ereg;
9077 Elf32_RegInfo reginfo;
9079 ereg = (Elf32_External_RegInfo *) (option + 1);
9080 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
9081 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
9082 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
9083 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
9084 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
9085 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
9087 printf ("GPR %08lx GP 0x%lx\n",
9089 (unsigned long) reginfo.ri_gp_value);
9090 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9091 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
9092 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
9097 Elf64_External_RegInfo * ereg;
9098 Elf64_Internal_RegInfo reginfo;
9100 ereg = (Elf64_External_RegInfo *) (option + 1);
9101 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
9102 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
9103 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
9104 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
9105 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
9106 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
9108 printf ("GPR %08lx GP 0x",
9109 reginfo.ri_gprmask);
9110 printf_vma (reginfo.ri_gp_value);
9113 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9114 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
9115 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
9119 case ODK_EXCEPTIONS:
9120 fputs (" EXCEPTIONS fpe_min(", stdout);
9121 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
9122 fputs (") fpe_max(", stdout);
9123 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
9124 fputs (")", stdout);
9126 if (option->info & OEX_PAGE0)
9127 fputs (" PAGE0", stdout);
9128 if (option->info & OEX_SMM)
9129 fputs (" SMM", stdout);
9130 if (option->info & OEX_FPDBUG)
9131 fputs (" FPDBUG", stdout);
9132 if (option->info & OEX_DISMISS)
9133 fputs (" DISMISS", stdout);
9136 fputs (" PAD ", stdout);
9137 if (option->info & OPAD_PREFIX)
9138 fputs (" PREFIX", stdout);
9139 if (option->info & OPAD_POSTFIX)
9140 fputs (" POSTFIX", stdout);
9141 if (option->info & OPAD_SYMBOL)
9142 fputs (" SYMBOL", stdout);
9145 fputs (" HWPATCH ", stdout);
9146 if (option->info & OHW_R4KEOP)
9147 fputs (" R4KEOP", stdout);
9148 if (option->info & OHW_R8KPFETCH)
9149 fputs (" R8KPFETCH", stdout);
9150 if (option->info & OHW_R5KEOP)
9151 fputs (" R5KEOP", stdout);
9152 if (option->info & OHW_R5KCVTL)
9153 fputs (" R5KCVTL", stdout);
9156 fputs (" FILL ", stdout);
9157 /* XXX Print content of info word? */
9160 fputs (" TAGS ", stdout);
9161 /* XXX Print content of info word? */
9164 fputs (" HWAND ", stdout);
9165 if (option->info & OHWA0_R4KEOP_CHECKED)
9166 fputs (" R4KEOP_CHECKED", stdout);
9167 if (option->info & OHWA0_R4KEOP_CLEAN)
9168 fputs (" R4KEOP_CLEAN", stdout);
9171 fputs (" HWOR ", stdout);
9172 if (option->info & OHWA0_R4KEOP_CHECKED)
9173 fputs (" R4KEOP_CHECKED", stdout);
9174 if (option->info & OHWA0_R4KEOP_CLEAN)
9175 fputs (" R4KEOP_CLEAN", stdout);
9178 printf (" GP_GROUP %#06lx self-contained %#06lx",
9179 option->info & OGP_GROUP,
9180 (option->info & OGP_SELF) >> 16);
9183 printf (" IDENT %#06lx self-contained %#06lx",
9184 option->info & OGP_GROUP,
9185 (option->info & OGP_SELF) >> 16);
9188 /* This shouldn't happen. */
9189 printf (" %3d ??? %d %lx",
9190 option->kind, option->section, option->info);
9194 len = sizeof (* eopt);
9195 while (len < option->size)
9196 if (((char *) option)[len] >= ' '
9197 && ((char *) option)[len] < 0x7f)
9198 printf ("%c", ((char *) option)[len++]);
9200 printf ("\\%03o", ((char *) option)[len++]);
9202 fputs ("\n", stdout);
9210 if (conflicts_offset != 0 && conflictsno != 0)
9212 Elf32_Conflict * iconf;
9215 if (dynamic_symbols == NULL)
9217 error (_("conflict list with without table"));
9221 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (* iconf));
9224 error (_("Out of memory"));
9230 Elf32_External_Conflict * econf32;
9232 econf32 = ((Elf32_External_Conflict *)
9233 get_data (NULL, file, conflicts_offset,
9234 conflictsno * sizeof (* econf32),
9239 for (cnt = 0; cnt < conflictsno; ++cnt)
9240 iconf[cnt] = BYTE_GET (econf32[cnt]);
9246 Elf64_External_Conflict * econf64;
9248 econf64 = ((Elf64_External_Conflict *)
9249 get_data (NULL, file, conflicts_offset,
9250 conflictsno * sizeof (* econf64),
9255 for (cnt = 0; cnt < conflictsno; ++cnt)
9256 iconf[cnt] = BYTE_GET (econf64[cnt]);
9261 printf (_("\nSection '.conflict' contains %ld entries:\n"),
9262 (long) conflictsno);
9263 puts (_(" Num: Index Value Name"));
9265 for (cnt = 0; cnt < conflictsno; ++cnt)
9267 Elf_Internal_Sym * psym = & dynamic_symbols [iconf [cnt]];
9269 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf [cnt]);
9270 print_vma (psym->st_value, FULL_HEX);
9272 print_symbol (25, dynamic_strings + psym->st_name);
9283 get_note_type (e_type)
9286 static char buff[64];
9290 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
9291 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
9292 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
9293 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
9294 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
9295 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
9296 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
9297 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
9298 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
9299 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
9300 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
9302 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
9308 get_netbsd_elfcore_note_type (e_type)
9311 static char buff[64];
9313 if (e_type == NT_NETBSDCORE_PROCINFO)
9315 /* NetBSD core "procinfo" structure. */
9316 return _("NetBSD procinfo structure");
9319 /* As of Jan 2002 there are no other machine-independent notes
9320 defined for NetBSD core files. If the note type is less
9321 than the start of the machine-dependent note types, we don't
9324 if (e_type < NT_NETBSDCORE_FIRSTMACH)
9326 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
9330 switch (elf_header.e_machine)
9332 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
9333 and PT_GETFPREGS == mach+2. */
9338 case EM_SPARC32PLUS:
9342 case NT_NETBSDCORE_FIRSTMACH+0:
9343 return _("PT_GETREGS (reg structure)");
9344 case NT_NETBSDCORE_FIRSTMACH+2:
9345 return _("PT_GETFPREGS (fpreg structure)");
9351 /* On all other arch's, PT_GETREGS == mach+1 and
9352 PT_GETFPREGS == mach+3. */
9356 case NT_NETBSDCORE_FIRSTMACH+1:
9357 return _("PT_GETREGS (reg structure)");
9358 case NT_NETBSDCORE_FIRSTMACH+3:
9359 return _("PT_GETFPREGS (fpreg structure)");
9365 sprintf (buff, _("PT_FIRSTMACH+%d"), e_type - NT_NETBSDCORE_FIRSTMACH);
9369 /* Note that by the ELF standard, the name field is already null byte
9370 terminated, and namesz includes the terminating null byte.
9371 I.E. the value of namesz for the name "FSF" is 4.
9373 If the value of namesz is zero, there is no name present. */
9375 process_note (pnote)
9376 Elf32_Internal_Note * pnote;
9380 if (pnote->namesz == 0)
9382 /* If there is no note name, then use the default set of
9383 note type strings. */
9384 nt = get_note_type (pnote->type);
9386 else if (strncmp (pnote->namedata, "NetBSD-CORE", 11) == 0)
9388 /* NetBSD-specific core file notes. */
9389 nt = get_netbsd_elfcore_note_type (pnote->type);
9393 /* Don't recognize this note name; just use the default set of
9394 note type strings. */
9395 nt = get_note_type (pnote->type);
9398 printf (" %s\t\t0x%08lx\t%s\n",
9399 pnote->namesz ? pnote->namedata : "(NONE)",
9406 process_corefile_note_segment (file, offset, length)
9411 Elf_External_Note * pnotes;
9412 Elf_External_Note * external;
9418 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, length,
9425 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9426 (unsigned long) offset, (unsigned long) length);
9427 printf (_(" Owner\t\tData size\tDescription\n"));
9429 while (external < (Elf_External_Note *)((char *) pnotes + length))
9431 Elf_External_Note * next;
9432 Elf32_Internal_Note inote;
9435 inote.type = BYTE_GET (external->type);
9436 inote.namesz = BYTE_GET (external->namesz);
9437 inote.namedata = external->name;
9438 inote.descsz = BYTE_GET (external->descsz);
9439 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
9440 inote.descpos = offset + (inote.descdata - (char *) pnotes);
9442 next = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
9444 if (((char *) next) > (((char *) pnotes) + length))
9446 warn (_("corrupt note found at offset %x into core notes\n"),
9447 ((char *) external) - ((char *) pnotes));
9448 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
9449 inote.type, inote.namesz, inote.descsz);
9455 /* Verify that name is null terminated. It appears that at least
9456 one version of Linux (RedHat 6.0) generates corefiles that don't
9457 comply with the ELF spec by failing to include the null byte in
9459 if (inote.namedata[inote.namesz] != '\0')
9461 temp = malloc (inote.namesz + 1);
9465 error (_("Out of memory\n"));
9470 strncpy (temp, inote.namedata, inote.namesz);
9471 temp[inote.namesz] = 0;
9473 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9474 inote.namedata = temp;
9477 res &= process_note (& inote);
9492 process_corefile_note_segments (file)
9495 Elf_Internal_Phdr * program_headers;
9496 Elf_Internal_Phdr * segment;
9500 program_headers = (Elf_Internal_Phdr *) malloc
9501 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
9503 if (program_headers == NULL)
9505 error (_("Out of memory\n"));
9510 i = get_32bit_program_headers (file, program_headers);
9512 i = get_64bit_program_headers (file, program_headers);
9516 free (program_headers);
9520 for (i = 0, segment = program_headers;
9521 i < elf_header.e_phnum;
9524 if (segment->p_type == PT_NOTE)
9525 res &= process_corefile_note_segment (file,
9526 (bfd_vma) segment->p_offset,
9527 (bfd_vma) segment->p_filesz);
9530 free (program_headers);
9536 process_corefile_contents (file)
9539 /* If we have not been asked to display the notes then do nothing. */
9543 /* If file is not a core file then exit. */
9544 if (elf_header.e_type != ET_CORE)
9547 /* No program headers means no NOTE segment. */
9548 if (elf_header.e_phnum == 0)
9550 printf (_("No note segments present in the core file.\n"));
9554 return process_corefile_note_segments (file);
9558 process_arch_specific (file)
9564 switch (elf_header.e_machine)
9567 case EM_MIPS_RS3_LE:
9568 return process_mips_specific (file);
9577 get_file_header (file)
9580 /* Read in the identity array. */
9581 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
9584 /* Determine how to read the rest of the header. */
9585 switch (elf_header.e_ident [EI_DATA])
9587 default: /* fall through */
9588 case ELFDATANONE: /* fall through */
9589 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
9590 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
9593 /* For now we only support 32 bit and 64 bit ELF files. */
9594 is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
9596 /* Read in the rest of the header. */
9599 Elf32_External_Ehdr ehdr32;
9601 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
9604 elf_header.e_type = BYTE_GET (ehdr32.e_type);
9605 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
9606 elf_header.e_version = BYTE_GET (ehdr32.e_version);
9607 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
9608 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
9609 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
9610 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
9611 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
9612 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
9613 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
9614 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
9615 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
9616 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
9620 Elf64_External_Ehdr ehdr64;
9622 /* If we have been compiled with sizeof (bfd_vma) == 4, then
9623 we will not be able to cope with the 64bit data found in
9624 64 ELF files. Detect this now and abort before we start
9625 overwritting things. */
9626 if (sizeof (bfd_vma) < 8)
9628 error (_("This instance of readelf has been built without support for a\n\
9629 64 bit data type and so it cannot read 64 bit ELF files.\n"));
9633 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
9636 elf_header.e_type = BYTE_GET (ehdr64.e_type);
9637 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
9638 elf_header.e_version = BYTE_GET (ehdr64.e_version);
9639 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
9640 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
9641 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
9642 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
9643 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
9644 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
9645 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
9646 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
9647 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
9648 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
9651 /* There may be some extensions in the first section header. Don't
9652 bomb if we can't read it. */
9654 get_32bit_section_headers (file, 1);
9656 get_64bit_section_headers (file, 1);
9662 process_file (file_name)
9666 struct stat statbuf;
9669 if (stat (file_name, & statbuf) < 0)
9671 error (_("Cannot stat input file %s.\n"), file_name);
9675 file = fopen (file_name, "rb");
9678 error (_("Input file %s not found.\n"), file_name);
9682 if (! get_file_header (file))
9684 error (_("%s: Failed to read file header\n"), file_name);
9689 /* Initialise per file variables. */
9690 for (i = NUM_ELEM (version_info); i--;)
9691 version_info[i] = 0;
9693 for (i = NUM_ELEM (dynamic_info); i--;)
9694 dynamic_info[i] = 0;
9696 /* Process the file. */
9698 printf (_("\nFile: %s\n"), file_name);
9700 if (! process_file_header ())
9706 process_section_headers (file);
9708 process_program_headers (file);
9710 process_dynamic_segment (file);
9712 process_relocs (file);
9714 process_unwind (file);
9716 process_symbol_table (file);
9718 process_syminfo (file);
9720 process_version_sections (file);
9722 process_section_contents (file);
9724 process_corefile_contents (file);
9726 process_arch_specific (file);
9730 if (section_headers)
9732 free (section_headers);
9733 section_headers = NULL;
9738 free (string_table);
9739 string_table = NULL;
9740 string_table_length = 0;
9743 if (dynamic_strings)
9745 free (dynamic_strings);
9746 dynamic_strings = NULL;
9749 if (dynamic_symbols)
9751 free (dynamic_symbols);
9752 dynamic_symbols = NULL;
9753 num_dynamic_syms = 0;
9756 if (dynamic_syminfo)
9758 free (dynamic_syminfo);
9759 dynamic_syminfo = NULL;
9765 #ifdef SUPPORT_DISASSEMBLY
9766 /* Needed by the i386 disassembler. For extra credit, someone could
9767 fix this so that we insert symbolic addresses here, esp for GOT/PLT
9771 print_address (unsigned int addr, FILE * outfile)
9773 fprintf (outfile,"0x%8.8x", addr);
9776 /* Needed by the i386 disassembler. */
9778 db_task_printsym (unsigned int addr)
9780 print_address (addr, stderr);
9784 int main PARAMS ((int, char **));
9793 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9794 setlocale (LC_MESSAGES, "");
9796 #if defined (HAVE_SETLOCALE)
9797 setlocale (LC_CTYPE, "");
9799 bindtextdomain (PACKAGE, LOCALEDIR);
9800 textdomain (PACKAGE);
9802 parse_args (argc, argv);
9804 if (optind < (argc - 1))
9808 while (optind < argc)
9809 err |= process_file (argv [optind ++]);
9811 if (dump_sects != NULL)