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";
1990 case PT_TLS: return "TLS";
1992 case PT_GNU_EH_FRAME:
1993 return "GNU_EH_FRAME";
1996 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
1998 const char * result;
2000 switch (elf_header.e_machine)
2003 case EM_MIPS_RS3_LE:
2004 result = get_mips_segment_type (p_type);
2007 result = get_parisc_segment_type (p_type);
2010 result = get_ia64_segment_type (p_type);
2020 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
2022 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
2024 const char * result;
2026 switch (elf_header.e_machine)
2029 result = get_parisc_segment_type (p_type);
2032 result = get_ia64_segment_type (p_type);
2042 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
2045 sprintf (buff, _("<unknown>: %lx"), p_type);
2052 get_mips_section_type_name (sh_type)
2053 unsigned int sh_type;
2057 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
2058 case SHT_MIPS_MSYM: return "MIPS_MSYM";
2059 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
2060 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
2061 case SHT_MIPS_UCODE: return "MIPS_UCODE";
2062 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
2063 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
2064 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
2065 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
2066 case SHT_MIPS_RELD: return "MIPS_RELD";
2067 case SHT_MIPS_IFACE: return "MIPS_IFACE";
2068 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
2069 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
2070 case SHT_MIPS_SHDR: return "MIPS_SHDR";
2071 case SHT_MIPS_FDESC: return "MIPS_FDESC";
2072 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
2073 case SHT_MIPS_DENSE: return "MIPS_DENSE";
2074 case SHT_MIPS_PDESC: return "MIPS_PDESC";
2075 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
2076 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
2077 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
2078 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
2079 case SHT_MIPS_LINE: return "MIPS_LINE";
2080 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
2081 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
2082 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
2083 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
2084 case SHT_MIPS_DWARF: return "MIPS_DWARF";
2085 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
2086 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
2087 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
2088 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
2089 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
2090 case SHT_MIPS_XLATE: return "MIPS_XLATE";
2091 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
2092 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
2093 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
2094 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
2095 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
2103 get_parisc_section_type_name (sh_type)
2104 unsigned int sh_type;
2108 case SHT_PARISC_EXT: return "PARISC_EXT";
2109 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
2110 case SHT_PARISC_DOC: return "PARISC_DOC";
2118 get_ia64_section_type_name (sh_type)
2119 unsigned int sh_type;
2123 case SHT_IA_64_EXT: return "IA_64_EXT";
2124 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
2132 get_section_type_name (sh_type)
2133 unsigned int sh_type;
2135 static char buff [32];
2139 case SHT_NULL: return "NULL";
2140 case SHT_PROGBITS: return "PROGBITS";
2141 case SHT_SYMTAB: return "SYMTAB";
2142 case SHT_STRTAB: return "STRTAB";
2143 case SHT_RELA: return "RELA";
2144 case SHT_HASH: return "HASH";
2145 case SHT_DYNAMIC: return "DYNAMIC";
2146 case SHT_NOTE: return "NOTE";
2147 case SHT_NOBITS: return "NOBITS";
2148 case SHT_REL: return "REL";
2149 case SHT_SHLIB: return "SHLIB";
2150 case SHT_DYNSYM: return "DYNSYM";
2151 case SHT_INIT_ARRAY: return "INIT_ARRAY";
2152 case SHT_FINI_ARRAY: return "FINI_ARRAY";
2153 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2154 case SHT_GROUP: return "GROUP";
2155 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
2156 case SHT_GNU_verdef: return "VERDEF";
2157 case SHT_GNU_verneed: return "VERNEED";
2158 case SHT_GNU_versym: return "VERSYM";
2159 case 0x6ffffff0: return "VERSYM";
2160 case 0x6ffffffc: return "VERDEF";
2161 case 0x7ffffffd: return "AUXILIARY";
2162 case 0x7fffffff: return "FILTER";
2165 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
2167 const char * result;
2169 switch (elf_header.e_machine)
2172 case EM_MIPS_RS3_LE:
2173 result = get_mips_section_type_name (sh_type);
2176 result = get_parisc_section_type_name (sh_type);
2179 result = get_ia64_section_type_name (sh_type);
2189 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
2191 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
2192 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
2193 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
2194 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
2196 sprintf (buff, _("<unknown>: %x"), sh_type);
2202 struct option options [] =
2204 {"all", no_argument, 0, 'a'},
2205 {"file-header", no_argument, 0, 'h'},
2206 {"program-headers", no_argument, 0, 'l'},
2207 {"headers", no_argument, 0, 'e'},
2208 {"histogram", no_argument, 0, 'I'},
2209 {"segments", no_argument, 0, 'l'},
2210 {"sections", no_argument, 0, 'S'},
2211 {"section-headers", no_argument, 0, 'S'},
2212 {"symbols", no_argument, 0, 's'},
2213 {"syms", no_argument, 0, 's'},
2214 {"relocs", no_argument, 0, 'r'},
2215 {"notes", no_argument, 0, 'n'},
2216 {"dynamic", no_argument, 0, 'd'},
2217 {"arch-specific", no_argument, 0, 'A'},
2218 {"version-info", no_argument, 0, 'V'},
2219 {"use-dynamic", no_argument, 0, 'D'},
2220 {"hex-dump", required_argument, 0, 'x'},
2221 {"debug-dump", optional_argument, 0, 'w'},
2222 {"unwind", no_argument, 0, 'u'},
2223 #ifdef SUPPORT_DISASSEMBLY
2224 {"instruction-dump", required_argument, 0, 'i'},
2227 {"version", no_argument, 0, 'v'},
2228 {"wide", no_argument, 0, 'W'},
2229 {"help", no_argument, 0, 'H'},
2230 {0, no_argument, 0, 0}
2236 fprintf (stdout, _("Usage: readelf <option(s)> elf-file(s)\n"));
2237 fprintf (stdout, _(" Display information about the contents of ELF format files\n"));
2238 fprintf (stdout, _(" Options are:\n\
2239 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2240 -h --file-header Display the ELF file header\n\
2241 -l --program-headers Display the program headers\n\
2242 --segments An alias for --program-headers\n\
2243 -S --section-headers Display the sections' header\n\
2244 --sections An alias for --section-headers\n\
2245 -e --headers Equivalent to: -h -l -S\n\
2246 -s --syms Display the symbol table\n\
2247 --symbols An alias for --syms\n\
2248 -n --notes Display the core notes (if present)\n\
2249 -r --relocs Display the relocations (if present)\n\
2250 -u --unwind Display the unwind info (if present)\n\
2251 -d --dynamic Display the dynamic segment (if present)\n\
2252 -V --version-info Display the version sections (if present)\n\
2253 -A --arch-specific Display architecture specific information (if any).\n\
2254 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2255 -x --hex-dump=<number> Dump the contents of section <number>\n\
2256 -w --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]\n\
2257 Display the contents of DWARF2 debug sections\n"));
2258 #ifdef SUPPORT_DISASSEMBLY
2259 fprintf (stdout, _("\
2260 -i --instruction-dump=<number>\n\
2261 Disassemble the contents of section <number>\n"));
2263 fprintf (stdout, _("\
2264 -I --histogram Display histogram of bucket list lengths\n\
2265 -W --wide Allow output width to exceed 80 characters\n\
2266 -H --help Display this information\n\
2267 -v --version Display the version number of readelf\n"));
2268 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2274 request_dump (section, type)
2275 unsigned int section;
2278 if (section >= num_dump_sects)
2280 char * new_dump_sects;
2282 new_dump_sects = (char *) calloc (section + 1, 1);
2284 if (new_dump_sects == NULL)
2285 error (_("Out of memory allocating dump request table."));
2288 /* Copy current flag settings. */
2289 memcpy (new_dump_sects, dump_sects, num_dump_sects);
2293 dump_sects = new_dump_sects;
2294 num_dump_sects = section + 1;
2299 dump_sects [section] |= type;
2305 parse_args (argc, argv)
2314 while ((c = getopt_long
2315 (argc, argv, "ersuahnldSDAIw::x:i:vVW", options, NULL)) != EOF)
2351 do_using_dynamic ++;
2382 section = strtoul (optarg, & cp, 0);
2383 if (! * cp && section >= 0)
2385 request_dump (section, HEX_DUMP);
2395 unsigned int index = 0;
2399 while (optarg[index])
2400 switch (optarg[index++])
2409 do_debug_abbrevs = 1;
2419 do_debug_pubnames = 1;
2424 do_debug_aranges = 1;
2428 do_debug_frames_interp = 1;
2430 do_debug_frames = 1;
2435 do_debug_macinfo = 1;
2449 warn (_("Unrecognized debug option '%s'\n"), optarg);
2454 #ifdef SUPPORT_DISASSEMBLY
2457 section = strtoul (optarg, & cp, 0);
2458 if (! * cp && section >= 0)
2460 request_dump (section, DISASS_DUMP);
2466 print_version (program_name);
2476 /* xgettext:c-format */
2477 error (_("Invalid option '-%c'\n"), c);
2484 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
2485 && !do_segments && !do_header && !do_dump && !do_version
2486 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2490 warn (_("Nothing to do.\n"));
2496 get_elf_class (elf_class)
2497 unsigned int elf_class;
2499 static char buff [32];
2503 case ELFCLASSNONE: return _("none");
2504 case ELFCLASS32: return "ELF32";
2505 case ELFCLASS64: return "ELF64";
2507 sprintf (buff, _("<unknown: %x>"), elf_class);
2513 get_data_encoding (encoding)
2514 unsigned int encoding;
2516 static char buff [32];
2520 case ELFDATANONE: return _("none");
2521 case ELFDATA2LSB: return _("2's complement, little endian");
2522 case ELFDATA2MSB: return _("2's complement, big endian");
2524 sprintf (buff, _("<unknown: %x>"), encoding);
2530 get_osabi_name (osabi)
2533 static char buff [32];
2537 case ELFOSABI_NONE: return "UNIX - System V";
2538 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2539 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2540 case ELFOSABI_LINUX: return "UNIX - Linux";
2541 case ELFOSABI_HURD: return "GNU/Hurd";
2542 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2543 case ELFOSABI_AIX: return "UNIX - AIX";
2544 case ELFOSABI_IRIX: return "UNIX - IRIX";
2545 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2546 case ELFOSABI_TRU64: return "UNIX - TRU64";
2547 case ELFOSABI_MODESTO: return "Novell - Modesto";
2548 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2549 case ELFOSABI_STANDALONE: return _("Standalone App");
2550 case ELFOSABI_ARM: return "ARM";
2552 sprintf (buff, _("<unknown: %x>"), osabi);
2557 /* Decode the data held in 'elf_header'. */
2559 process_file_header ()
2561 if ( elf_header.e_ident [EI_MAG0] != ELFMAG0
2562 || elf_header.e_ident [EI_MAG1] != ELFMAG1
2563 || elf_header.e_ident [EI_MAG2] != ELFMAG2
2564 || elf_header.e_ident [EI_MAG3] != ELFMAG3)
2567 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2575 printf (_("ELF Header:\n"));
2576 printf (_(" Magic: "));
2577 for (i = 0; i < EI_NIDENT; i ++)
2578 printf ("%2.2x ", elf_header.e_ident [i]);
2580 printf (_(" Class: %s\n"),
2581 get_elf_class (elf_header.e_ident [EI_CLASS]));
2582 printf (_(" Data: %s\n"),
2583 get_data_encoding (elf_header.e_ident [EI_DATA]));
2584 printf (_(" Version: %d %s\n"),
2585 elf_header.e_ident [EI_VERSION],
2586 (elf_header.e_ident [EI_VERSION] == EV_CURRENT
2588 : (elf_header.e_ident [EI_VERSION] != EV_NONE
2591 printf (_(" OS/ABI: %s\n"),
2592 get_osabi_name (elf_header.e_ident [EI_OSABI]));
2593 printf (_(" ABI Version: %d\n"),
2594 elf_header.e_ident [EI_ABIVERSION]);
2595 printf (_(" Type: %s\n"),
2596 get_file_type (elf_header.e_type));
2597 printf (_(" Machine: %s\n"),
2598 get_machine_name (elf_header.e_machine));
2599 printf (_(" Version: 0x%lx\n"),
2600 (unsigned long) elf_header.e_version);
2602 printf (_(" Entry point address: "));
2603 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2604 printf (_("\n Start of program headers: "));
2605 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2606 printf (_(" (bytes into file)\n Start of section headers: "));
2607 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2608 printf (_(" (bytes into file)\n"));
2610 printf (_(" Flags: 0x%lx%s\n"),
2611 (unsigned long) elf_header.e_flags,
2612 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2613 printf (_(" Size of this header: %ld (bytes)\n"),
2614 (long) elf_header.e_ehsize);
2615 printf (_(" Size of program headers: %ld (bytes)\n"),
2616 (long) elf_header.e_phentsize);
2617 printf (_(" Number of program headers: %ld\n"),
2618 (long) elf_header.e_phnum);
2619 printf (_(" Size of section headers: %ld (bytes)\n"),
2620 (long) elf_header.e_shentsize);
2621 printf (_(" Number of section headers: %ld"),
2622 (long) elf_header.e_shnum);
2623 if (section_headers != NULL && elf_header.e_shnum == 0)
2624 printf (" (%ld)", (long) section_headers[0].sh_size);
2625 putc ('\n', stdout);
2626 printf (_(" Section header string table index: %ld"),
2627 (long) elf_header.e_shstrndx);
2628 if (section_headers != NULL && elf_header.e_shstrndx == SHN_XINDEX)
2629 printf (" (%ld)", (long) section_headers[0].sh_link);
2630 putc ('\n', stdout);
2633 if (section_headers != NULL)
2635 if (elf_header.e_shnum == 0)
2636 elf_header.e_shnum = section_headers[0].sh_size;
2637 if (elf_header.e_shstrndx == SHN_XINDEX)
2638 elf_header.e_shstrndx = section_headers[0].sh_link;
2639 free (section_headers);
2640 section_headers = NULL;
2648 get_32bit_program_headers (file, program_headers)
2650 Elf_Internal_Phdr * program_headers;
2652 Elf32_External_Phdr * phdrs;
2653 Elf32_External_Phdr * external;
2654 Elf32_Internal_Phdr * internal;
2657 phdrs = ((Elf32_External_Phdr *)
2658 get_data (NULL, file, elf_header.e_phoff,
2659 elf_header.e_phentsize * elf_header.e_phnum,
2660 _("program headers")));
2664 for (i = 0, internal = program_headers, external = phdrs;
2665 i < elf_header.e_phnum;
2666 i ++, internal ++, external ++)
2668 internal->p_type = BYTE_GET (external->p_type);
2669 internal->p_offset = BYTE_GET (external->p_offset);
2670 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2671 internal->p_paddr = BYTE_GET (external->p_paddr);
2672 internal->p_filesz = BYTE_GET (external->p_filesz);
2673 internal->p_memsz = BYTE_GET (external->p_memsz);
2674 internal->p_flags = BYTE_GET (external->p_flags);
2675 internal->p_align = BYTE_GET (external->p_align);
2684 get_64bit_program_headers (file, program_headers)
2686 Elf_Internal_Phdr * program_headers;
2688 Elf64_External_Phdr * phdrs;
2689 Elf64_External_Phdr * external;
2690 Elf64_Internal_Phdr * internal;
2693 phdrs = ((Elf64_External_Phdr *)
2694 get_data (NULL, file, elf_header.e_phoff,
2695 elf_header.e_phentsize * elf_header.e_phnum,
2696 _("program headers")));
2700 for (i = 0, internal = program_headers, external = phdrs;
2701 i < elf_header.e_phnum;
2702 i ++, internal ++, external ++)
2704 internal->p_type = BYTE_GET (external->p_type);
2705 internal->p_flags = BYTE_GET (external->p_flags);
2706 internal->p_offset = BYTE_GET8 (external->p_offset);
2707 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2708 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2709 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2710 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2711 internal->p_align = BYTE_GET8 (external->p_align);
2720 process_program_headers (file)
2723 Elf_Internal_Phdr * program_headers;
2724 Elf_Internal_Phdr * segment;
2727 if (elf_header.e_phnum == 0)
2730 printf (_("\nThere are no program headers in this file.\n"));
2734 if (do_segments && !do_header)
2736 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2737 printf (_("Entry point "));
2738 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2739 printf (_("\nThere are %d program headers, starting at offset "),
2740 elf_header.e_phnum);
2741 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2745 program_headers = (Elf_Internal_Phdr *) malloc
2746 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2748 if (program_headers == NULL)
2750 error (_("Out of memory\n"));
2755 i = get_32bit_program_headers (file, program_headers);
2757 i = get_64bit_program_headers (file, program_headers);
2761 free (program_headers);
2768 (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2772 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2775 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2779 (_(" Type Offset VirtAddr PhysAddr\n"));
2781 (_(" FileSiz MemSiz Flags Align\n"));
2789 for (i = 0, segment = program_headers;
2790 i < elf_header.e_phnum;
2795 printf (" %-14.14s ", get_segment_type (segment->p_type));
2799 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2800 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2801 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2802 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2803 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2805 (segment->p_flags & PF_R ? 'R' : ' '),
2806 (segment->p_flags & PF_W ? 'W' : ' '),
2807 (segment->p_flags & PF_X ? 'E' : ' '));
2808 printf ("%#lx", (unsigned long) segment->p_align);
2812 if ((unsigned long) segment->p_offset == segment->p_offset)
2813 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2816 print_vma (segment->p_offset, FULL_HEX);
2820 print_vma (segment->p_vaddr, FULL_HEX);
2822 print_vma (segment->p_paddr, FULL_HEX);
2825 if ((unsigned long) segment->p_filesz == segment->p_filesz)
2826 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
2829 print_vma (segment->p_filesz, FULL_HEX);
2833 if ((unsigned long) segment->p_memsz == segment->p_memsz)
2834 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
2837 print_vma (segment->p_offset, FULL_HEX);
2841 (segment->p_flags & PF_R ? 'R' : ' '),
2842 (segment->p_flags & PF_W ? 'W' : ' '),
2843 (segment->p_flags & PF_X ? 'E' : ' '));
2845 if ((unsigned long) segment->p_align == segment->p_align)
2846 printf ("%#lx", (unsigned long) segment->p_align);
2849 print_vma (segment->p_align, PREFIX_HEX);
2854 print_vma (segment->p_offset, FULL_HEX);
2856 print_vma (segment->p_vaddr, FULL_HEX);
2858 print_vma (segment->p_paddr, FULL_HEX);
2860 print_vma (segment->p_filesz, FULL_HEX);
2862 print_vma (segment->p_memsz, FULL_HEX);
2864 (segment->p_flags & PF_R ? 'R' : ' '),
2865 (segment->p_flags & PF_W ? 'W' : ' '),
2866 (segment->p_flags & PF_X ? 'E' : ' '));
2867 print_vma (segment->p_align, HEX);
2871 switch (segment->p_type)
2875 loadaddr = (segment->p_vaddr & 0xfffff000)
2876 - (segment->p_offset & 0xfffff000);
2881 error (_("more than one dynamic segment\n"));
2883 dynamic_addr = segment->p_offset;
2884 dynamic_size = segment->p_filesz;
2888 if (fseek (file, (long) segment->p_offset, SEEK_SET))
2889 error (_("Unable to find program interpreter name\n"));
2892 program_interpreter[0] = 0;
2893 fscanf (file, "%63s", program_interpreter);
2896 printf (_("\n [Requesting program interpreter: %s]"),
2897 program_interpreter);
2903 putc ('\n', stdout);
2912 if (do_segments && section_headers != NULL)
2914 printf (_("\n Section to Segment mapping:\n"));
2915 printf (_(" Segment Sections...\n"));
2917 assert (string_table != NULL);
2919 for (i = 0; i < elf_header.e_phnum; i++)
2922 Elf_Internal_Shdr * section;
2924 segment = program_headers + i;
2925 section = section_headers;
2927 printf (" %2.2d ", i);
2929 for (j = 1; j < elf_header.e_shnum; j++, section ++)
2931 if (section->sh_size > 0
2932 /* Compare allocated sections by VMA, unallocated
2933 sections by file offset. */
2934 && (section->sh_flags & SHF_ALLOC
2935 ? (section->sh_addr >= segment->p_vaddr
2936 && section->sh_addr + section->sh_size
2937 <= segment->p_vaddr + segment->p_memsz)
2938 : ((bfd_vma) section->sh_offset >= segment->p_offset
2939 && (section->sh_offset + section->sh_size
2940 <= segment->p_offset + segment->p_filesz))))
2941 printf ("%s ", SECTION_NAME (section));
2948 free (program_headers);
2955 get_32bit_section_headers (file, num)
2959 Elf32_External_Shdr * shdrs;
2960 Elf32_Internal_Shdr * internal;
2963 shdrs = ((Elf32_External_Shdr *)
2964 get_data (NULL, file, elf_header.e_shoff,
2965 elf_header.e_shentsize * num,
2966 _("section headers")));
2970 section_headers = ((Elf_Internal_Shdr *)
2971 malloc (num * sizeof (Elf_Internal_Shdr)));
2973 if (section_headers == NULL)
2975 error (_("Out of memory\n"));
2979 for (i = 0, internal = section_headers;
2983 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2984 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2985 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
2986 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
2987 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2988 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
2989 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2990 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2991 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2992 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
3001 get_64bit_section_headers (file, num)
3005 Elf64_External_Shdr * shdrs;
3006 Elf64_Internal_Shdr * internal;
3009 shdrs = ((Elf64_External_Shdr *)
3010 get_data (NULL, file, elf_header.e_shoff,
3011 elf_header.e_shentsize * num,
3012 _("section headers")));
3016 section_headers = ((Elf_Internal_Shdr *)
3017 malloc (num * sizeof (Elf_Internal_Shdr)));
3019 if (section_headers == NULL)
3021 error (_("Out of memory\n"));
3025 for (i = 0, internal = section_headers;
3029 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3030 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3031 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
3032 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
3033 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
3034 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
3035 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3036 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3037 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3038 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3046 static Elf_Internal_Sym *
3047 get_32bit_elf_symbols (file, section)
3049 Elf_Internal_Shdr *section;
3051 unsigned long number;
3052 Elf32_External_Sym * esyms;
3053 Elf_External_Sym_Shndx *shndx;
3054 Elf_Internal_Sym * isyms;
3055 Elf_Internal_Sym * psym;
3058 esyms = ((Elf32_External_Sym *)
3059 get_data (NULL, file, section->sh_offset,
3060 section->sh_size, _("symbols")));
3065 if (symtab_shndx_hdr != NULL
3066 && (symtab_shndx_hdr->sh_link
3067 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3069 shndx = ((Elf_External_Sym_Shndx *)
3070 get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3071 symtab_shndx_hdr->sh_size, _("symtab shndx")));
3079 number = section->sh_size / section->sh_entsize;
3080 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
3084 error (_("Out of memory\n"));
3091 for (j = 0, psym = isyms;
3095 psym->st_name = BYTE_GET (esyms[j].st_name);
3096 psym->st_value = BYTE_GET (esyms[j].st_value);
3097 psym->st_size = BYTE_GET (esyms[j].st_size);
3098 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3099 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3101 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3102 psym->st_info = BYTE_GET (esyms[j].st_info);
3103 psym->st_other = BYTE_GET (esyms[j].st_other);
3113 static Elf_Internal_Sym *
3114 get_64bit_elf_symbols (file, section)
3116 Elf_Internal_Shdr *section;
3118 unsigned long number;
3119 Elf64_External_Sym * esyms;
3120 Elf_External_Sym_Shndx *shndx;
3121 Elf_Internal_Sym * isyms;
3122 Elf_Internal_Sym * psym;
3125 esyms = ((Elf64_External_Sym *)
3126 get_data (NULL, file, section->sh_offset,
3127 section->sh_size, _("symbols")));
3132 if (symtab_shndx_hdr != NULL
3133 && (symtab_shndx_hdr->sh_link
3134 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3136 shndx = ((Elf_External_Sym_Shndx *)
3137 get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3138 symtab_shndx_hdr->sh_size, _("symtab shndx")));
3146 number = section->sh_size / section->sh_entsize;
3147 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
3151 error (_("Out of memory\n"));
3158 for (j = 0, psym = isyms;
3162 psym->st_name = BYTE_GET (esyms[j].st_name);
3163 psym->st_info = BYTE_GET (esyms[j].st_info);
3164 psym->st_other = BYTE_GET (esyms[j].st_other);
3165 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3166 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3168 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3169 psym->st_value = BYTE_GET8 (esyms[j].st_value);
3170 psym->st_size = BYTE_GET8 (esyms[j].st_size);
3181 get_elf_section_flags (sh_flags)
3184 static char buff [32];
3192 flag = sh_flags & - sh_flags;
3197 case SHF_WRITE: strcat (buff, "W"); break;
3198 case SHF_ALLOC: strcat (buff, "A"); break;
3199 case SHF_EXECINSTR: strcat (buff, "X"); break;
3200 case SHF_MERGE: strcat (buff, "M"); break;
3201 case SHF_STRINGS: strcat (buff, "S"); break;
3202 case SHF_INFO_LINK: strcat (buff, "I"); break;
3203 case SHF_LINK_ORDER: strcat (buff, "L"); break;
3204 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
3205 case SHF_GROUP: strcat (buff, "G"); break;
3206 case SHF_TLS: strcat (buff, "T"); break;
3209 if (flag & SHF_MASKOS)
3212 sh_flags &= ~ SHF_MASKOS;
3214 else if (flag & SHF_MASKPROC)
3217 sh_flags &= ~ SHF_MASKPROC;
3229 process_section_headers (file)
3232 Elf_Internal_Shdr * section;
3235 section_headers = NULL;
3237 if (elf_header.e_shnum == 0)
3240 printf (_("\nThere are no sections in this file.\n"));
3245 if (do_sections && !do_header)
3246 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3247 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
3251 if (! get_32bit_section_headers (file, elf_header.e_shnum))
3254 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
3257 /* Read in the string table, so that we have names to display. */
3258 section = SECTION_HEADER (elf_header.e_shstrndx);
3260 if (section->sh_size != 0)
3262 string_table = (char *) get_data (NULL, file, section->sh_offset,
3263 section->sh_size, _("string table"));
3265 string_table_length = section->sh_size;
3268 /* Scan the sections for the dynamic symbol table
3269 and dynamic string table and debug sections. */
3270 dynamic_symbols = NULL;
3271 dynamic_strings = NULL;
3272 dynamic_syminfo = NULL;
3274 for (i = 0, section = section_headers;
3275 i < elf_header.e_shnum;
3278 char * name = SECTION_NAME (section);
3280 if (section->sh_type == SHT_DYNSYM)
3282 if (dynamic_symbols != NULL)
3284 error (_("File contains multiple dynamic symbol tables\n"));
3288 num_dynamic_syms = section->sh_size / section->sh_entsize;
3289 dynamic_symbols = GET_ELF_SYMBOLS (file, section);
3291 else if (section->sh_type == SHT_STRTAB
3292 && strcmp (name, ".dynstr") == 0)
3294 if (dynamic_strings != NULL)
3296 error (_("File contains multiple dynamic string tables\n"));
3300 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
3302 _("dynamic strings"));
3304 else if (section->sh_type == SHT_SYMTAB_SHNDX)
3306 if (symtab_shndx_hdr != NULL)
3308 error (_("File contains multiple symtab shndx tables\n"));
3311 symtab_shndx_hdr = section;
3313 else if ((do_debugging || do_debug_info || do_debug_abbrevs
3314 || do_debug_lines || do_debug_pubnames || do_debug_aranges
3315 || do_debug_frames || do_debug_macinfo || do_debug_str
3317 && strncmp (name, ".debug_", 7) == 0)
3322 || (do_debug_info && (strcmp (name, "info") == 0))
3323 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
3324 || (do_debug_lines && (strcmp (name, "line") == 0))
3325 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
3326 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
3327 || (do_debug_frames && (strcmp (name, "frame") == 0))
3328 || (do_debug_macinfo && (strcmp (name, "macinfo") == 0))
3329 || (do_debug_str && (strcmp (name, "str") == 0))
3330 || (do_debug_loc && (strcmp (name, "loc") == 0))
3332 request_dump (i, DEBUG_DUMP);
3334 /* linkonce section to be combined with .debug_info at link time. */
3335 else if ((do_debugging || do_debug_info)
3336 && strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
3337 request_dump (i, DEBUG_DUMP);
3338 else if (do_debug_frames && strcmp (name, ".eh_frame") == 0)
3339 request_dump (i, DEBUG_DUMP);
3345 printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
3349 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3352 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3355 printf (_(" [Nr] Name Type Address Offset\n"));
3356 printf (_(" Size EntSize Flags Link Info Align\n"));
3359 for (i = 0, section = section_headers;
3360 i < elf_header.e_shnum;
3363 printf (" [%2u] %-17.17s %-15.15s ",
3364 SECTION_HEADER_NUM (i),
3365 SECTION_NAME (section),
3366 get_section_type_name (section->sh_type));
3370 print_vma (section->sh_addr, LONG_HEX);
3372 printf ( " %6.6lx %6.6lx %2.2lx",
3373 (unsigned long) section->sh_offset,
3374 (unsigned long) section->sh_size,
3375 (unsigned long) section->sh_entsize);
3377 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3379 printf ("%2ld %3lx %2ld\n",
3380 (unsigned long) section->sh_link,
3381 (unsigned long) section->sh_info,
3382 (unsigned long) section->sh_addralign);
3386 print_vma (section->sh_addr, LONG_HEX);
3388 if ((long) section->sh_offset == section->sh_offset)
3389 printf (" %6.6lx", (unsigned long) section->sh_offset);
3393 print_vma (section->sh_offset, LONG_HEX);
3396 if ((unsigned long) section->sh_size == section->sh_size)
3397 printf (" %6.6lx", (unsigned long) section->sh_size);
3401 print_vma (section->sh_size, LONG_HEX);
3404 if ((unsigned long) section->sh_entsize == section->sh_entsize)
3405 printf (" %2.2lx", (unsigned long) section->sh_entsize);
3409 print_vma (section->sh_entsize, LONG_HEX);
3412 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3414 printf ("%2ld %3lx ",
3415 (unsigned long) section->sh_link,
3416 (unsigned long) section->sh_info);
3418 if ((unsigned long) section->sh_addralign == section->sh_addralign)
3419 printf ("%2ld\n", (unsigned long) section->sh_addralign);
3422 print_vma (section->sh_addralign, DEC);
3429 print_vma (section->sh_addr, LONG_HEX);
3430 if ((long) section->sh_offset == section->sh_offset)
3431 printf (" %8.8lx", (unsigned long) section->sh_offset);
3435 print_vma (section->sh_offset, LONG_HEX);
3438 print_vma (section->sh_size, LONG_HEX);
3440 print_vma (section->sh_entsize, LONG_HEX);
3442 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3444 printf (" %2ld %3lx %ld\n",
3445 (unsigned long) section->sh_link,
3446 (unsigned long) section->sh_info,
3447 (unsigned long) section->sh_addralign);
3451 printf (_("Key to Flags:\n\
3452 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3453 I (info), L (link order), G (group), x (unknown)\n\
3454 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3459 /* Process the reloc section. */
3461 process_relocs (file)
3464 unsigned long rel_size;
3465 unsigned long rel_offset;
3471 if (do_using_dynamic)
3473 int is_rela = FALSE;
3478 if (dynamic_info[DT_REL])
3480 rel_offset = dynamic_info[DT_REL];
3481 rel_size = dynamic_info[DT_RELSZ];
3484 else if (dynamic_info [DT_RELA])
3486 rel_offset = dynamic_info[DT_RELA];
3487 rel_size = dynamic_info[DT_RELASZ];
3490 else if (dynamic_info[DT_JMPREL])
3492 rel_offset = dynamic_info[DT_JMPREL];
3493 rel_size = dynamic_info[DT_PLTRELSZ];
3495 switch (dynamic_info[DT_PLTREL])
3512 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3513 rel_offset, rel_size);
3515 dump_relocations (file, rel_offset - loadaddr, rel_size,
3516 dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
3519 printf (_("\nThere are no dynamic relocations in this file.\n"));
3523 Elf32_Internal_Shdr * section;
3527 for (i = 0, section = section_headers;
3528 i < elf_header.e_shnum;
3531 if ( section->sh_type != SHT_RELA
3532 && section->sh_type != SHT_REL)
3535 rel_offset = section->sh_offset;
3536 rel_size = section->sh_size;
3540 Elf32_Internal_Shdr * strsec;
3541 Elf_Internal_Sym * symtab;
3544 unsigned long nsyms;
3546 printf (_("\nRelocation section "));
3548 if (string_table == NULL)
3549 printf ("%d", section->sh_name);
3551 printf ("'%s'", SECTION_NAME (section));
3553 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3554 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
3559 if (section->sh_link)
3561 Elf32_Internal_Shdr * symsec;
3563 symsec = SECTION_HEADER (section->sh_link);
3564 nsyms = symsec->sh_size / symsec->sh_entsize;
3565 symtab = GET_ELF_SYMBOLS (file, symsec);
3570 strsec = SECTION_HEADER (symsec->sh_link);
3572 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3576 is_rela = section->sh_type == SHT_RELA;
3578 dump_relocations (file, rel_offset, rel_size,
3579 symtab, nsyms, strtab, is_rela);
3591 printf (_("\nThere are no relocations in this file.\n"));
3597 #include "unwind-ia64.h"
3599 /* An absolute address consists of a section and an offset. If the
3600 section is NULL, the offset itself is the address, otherwise, the
3601 address equals to LOAD_ADDRESS(section) + offset. */
3605 unsigned short section;
3611 struct unw_table_entry
3613 struct absaddr start;
3615 struct absaddr info;
3617 *table; /* Unwind table. */
3618 unsigned long table_len; /* Length of unwind table. */
3619 unsigned char * info; /* Unwind info. */
3620 unsigned long info_size; /* Size of unwind info. */
3621 bfd_vma info_addr; /* starting address of unwind info. */
3622 bfd_vma seg_base; /* Starting address of segment. */
3623 Elf_Internal_Sym * symtab; /* The symbol table. */
3624 unsigned long nsyms; /* Number of symbols. */
3625 char * strtab; /* The string table. */
3626 unsigned long strtab_size; /* Size of string table. */
3629 static void find_symbol_for_address PARAMS ((struct unw_aux_info *,
3630 struct absaddr, const char **,
3632 static void dump_ia64_unwind PARAMS ((struct unw_aux_info *));
3633 static int slurp_ia64_unwind_table PARAMS ((FILE *, struct unw_aux_info *,
3634 Elf32_Internal_Shdr *));
3637 find_symbol_for_address (aux, addr, symname, offset)
3638 struct unw_aux_info *aux;
3639 struct absaddr addr;
3640 const char **symname;
3643 bfd_vma dist = (bfd_vma) 0x100000;
3644 Elf_Internal_Sym *sym, *best = NULL;
3647 for (i = 0, sym = aux->symtab; i < aux->nsyms; ++i, ++sym)
3649 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
3650 && sym->st_name != 0
3651 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
3652 && addr.offset >= sym->st_value
3653 && addr.offset - sym->st_value < dist)
3656 dist = addr.offset - sym->st_value;
3663 *symname = (best->st_name >= aux->strtab_size
3664 ? "<corrupt>" : aux->strtab + best->st_name);
3669 *offset = addr.offset;
3673 dump_ia64_unwind (aux)
3674 struct unw_aux_info *aux;
3677 struct unw_table_entry * tp;
3680 addr_size = is_32bit_elf ? 4 : 8;
3682 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
3686 const unsigned char * dp;
3687 const unsigned char * head;
3688 const char * procname;
3690 find_symbol_for_address (aux, tp->start, &procname, &offset);
3692 fputs ("\n<", stdout);
3696 fputs (procname, stdout);
3699 printf ("+%lx", (unsigned long) offset);
3702 fputs (">: [", stdout);
3703 print_vma (tp->start.offset, PREFIX_HEX);
3704 fputc ('-', stdout);
3705 print_vma (tp->end.offset, PREFIX_HEX);
3706 printf ("), info at +0x%lx\n",
3707 (unsigned long) (tp->info.offset - aux->seg_base));
3709 head = aux->info + (tp->info.offset - aux->info_addr);
3710 stamp = BYTE_GET8 ((unsigned char *) head);
3712 printf (" v%u, flags=0x%lx (%s%s ), len=%lu bytes\n",
3713 (unsigned) UNW_VER (stamp),
3714 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
3715 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
3716 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
3717 (unsigned long) (addr_size * UNW_LENGTH (stamp)));
3719 if (UNW_VER (stamp) != 1)
3721 printf ("\tUnknown version.\n");
3726 for (dp = head + 8; dp < head + 8 + addr_size * UNW_LENGTH (stamp);)
3727 dp = unw_decode (dp, in_body, & in_body);
3732 slurp_ia64_unwind_table (file, aux, sec)
3734 struct unw_aux_info *aux;
3735 Elf32_Internal_Shdr *sec;
3737 unsigned long size, addr_size, nrelas, i;
3738 Elf_Internal_Phdr *prog_hdrs, *seg;
3739 struct unw_table_entry *tep;
3740 Elf32_Internal_Shdr *relsec;
3741 Elf_Internal_Rela *rela, *rp;
3742 unsigned char *table, *tp;
3743 Elf_Internal_Sym *sym;
3744 const char *relname;
3747 addr_size = is_32bit_elf ? 4 : 8;
3749 /* First, find the starting address of the segment that includes
3752 if (elf_header.e_phnum)
3754 prog_hdrs = (Elf_Internal_Phdr *)
3755 xmalloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
3758 result = get_32bit_program_headers (file, prog_hdrs);
3760 result = get_64bit_program_headers (file, prog_hdrs);
3768 for (seg = prog_hdrs; seg < prog_hdrs + elf_header.e_phnum; ++seg)
3770 if (seg->p_type != PT_LOAD)
3773 if (sec->sh_addr >= seg->p_vaddr
3774 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
3776 aux->seg_base = seg->p_vaddr;
3784 /* Second, build the unwind table from the contents of the unwind section: */
3785 size = sec->sh_size;
3786 table = (char *) get_data (NULL, file, sec->sh_offset,
3787 size, _("unwind table"));
3791 tep = aux->table = xmalloc (size / (3 * addr_size) * sizeof (aux->table[0]));
3792 for (tp = table; tp < table + size; tp += 3 * addr_size, ++ tep)
3794 tep->start.section = SHN_UNDEF;
3795 tep->end.section = SHN_UNDEF;
3796 tep->info.section = SHN_UNDEF;
3799 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
3800 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
3801 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
3805 tep->start.offset = BYTE_GET8 ((unsigned char *) tp + 0);
3806 tep->end.offset = BYTE_GET8 ((unsigned char *) tp + 8);
3807 tep->info.offset = BYTE_GET8 ((unsigned char *) tp + 16);
3809 tep->start.offset += aux->seg_base;
3810 tep->end.offset += aux->seg_base;
3811 tep->info.offset += aux->seg_base;
3815 /* Third, apply any relocations to the unwind table: */
3817 for (relsec = section_headers;
3818 relsec < section_headers + elf_header.e_shnum;
3821 if (relsec->sh_type != SHT_RELA
3822 || SECTION_HEADER (relsec->sh_info) != sec)
3825 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
3829 for (rp = rela; rp < rela + nrelas; ++rp)
3833 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
3834 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
3836 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
3838 warn (_("Skipping unexpected symbol type %u\n"),
3839 ELF32_ST_TYPE (sym->st_info));
3845 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
3846 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
3848 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
3850 warn (_("Skipping unexpected symbol type %u\n"),
3851 ELF64_ST_TYPE (sym->st_info));
3856 if (strncmp (relname, "R_IA64_SEGREL", 13) != 0)
3858 warn (_("Skipping unexpected relocation type %s\n"), relname);
3862 i = rp->r_offset / (3 * addr_size);
3864 switch (rp->r_offset/addr_size % 3)
3867 aux->table[i].start.section = sym->st_shndx;
3868 aux->table[i].start.offset += rp->r_addend;
3871 aux->table[i].end.section = sym->st_shndx;
3872 aux->table[i].end.offset += rp->r_addend;
3875 aux->table[i].info.section = sym->st_shndx;
3876 aux->table[i].info.offset += rp->r_addend;
3886 aux->table_len = size / (3 * addr_size);
3891 process_unwind (file)
3894 Elf32_Internal_Shdr *sec, *unwsec = NULL, *strsec;
3895 unsigned long i, addr_size, unwcount = 0, unwstart = 0;
3896 struct unw_aux_info aux;
3901 if (elf_header.e_machine != EM_IA_64)
3903 printf (_("\nThere are no unwind sections in this file.\n"));
3907 memset (& aux, 0, sizeof (aux));
3909 addr_size = is_32bit_elf ? 4 : 8;
3911 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
3913 if (sec->sh_type == SHT_SYMTAB)
3915 aux.nsyms = sec->sh_size / sec->sh_entsize;
3916 aux.symtab = GET_ELF_SYMBOLS (file, sec);
3918 strsec = SECTION_HEADER (sec->sh_link);
3919 aux.strtab_size = strsec->sh_size;
3920 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3921 aux.strtab_size, _("string table"));
3923 else if (sec->sh_type == SHT_IA_64_UNWIND)
3928 printf (_("\nThere are no unwind sections in this file.\n"));
3930 while (unwcount-- > 0)
3935 for (i = unwstart, sec = section_headers + unwstart;
3936 i < elf_header.e_shnum; ++i, ++sec)
3937 if (sec->sh_type == SHT_IA_64_UNWIND)
3944 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
3946 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once,
3949 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
3950 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
3951 suffix = SECTION_NAME (unwsec) + len;
3952 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3954 if (strncmp (SECTION_NAME (sec),
3955 ELF_STRING_ia64_unwind_info_once, len2) == 0
3956 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3961 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
3962 .IA_64.unwind or BAR -> .IA_64.unwind_info */
3963 len = sizeof (ELF_STRING_ia64_unwind) - 1;
3964 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
3966 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind,
3968 suffix = SECTION_NAME (unwsec) + len;
3969 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3971 if (strncmp (SECTION_NAME (sec),
3972 ELF_STRING_ia64_unwind_info, len2) == 0
3973 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3977 if (i == elf_header.e_shnum)
3979 printf (_("\nCould not find unwind info section for "));
3981 if (string_table == NULL)
3982 printf ("%d", unwsec->sh_name);
3984 printf ("'%s'", SECTION_NAME (unwsec));
3988 aux.info_size = sec->sh_size;
3989 aux.info_addr = sec->sh_addr;
3990 aux.info = (char *) get_data (NULL, file, sec->sh_offset,
3991 aux.info_size, _("unwind info"));
3993 printf (_("\nUnwind section "));
3995 if (string_table == NULL)
3996 printf ("%d", unwsec->sh_name);
3998 printf ("'%s'", SECTION_NAME (unwsec));
4000 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4001 (unsigned long) unwsec->sh_offset,
4002 (unsigned long) (unwsec->sh_size / (3 * addr_size)));
4004 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
4006 if (aux.table_len > 0)
4007 dump_ia64_unwind (& aux);
4010 free ((char *) aux.table);
4012 free ((char *) aux.info);
4021 free ((char *) aux.strtab);
4027 dynamic_segment_mips_val (entry)
4028 Elf_Internal_Dyn * entry;
4030 switch (entry->d_tag)
4033 if (entry->d_un.d_val == 0)
4037 static const char * opts[] =
4039 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
4040 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
4041 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
4042 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
4047 for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
4048 if (entry->d_un.d_val & (1 << cnt))
4050 printf ("%s%s", first ? "" : " ", opts[cnt]);
4057 case DT_MIPS_IVERSION:
4058 if (dynamic_strings != NULL)
4059 printf ("Interface Version: %s\n",
4060 dynamic_strings + entry->d_un.d_val);
4062 printf ("%ld\n", (long) entry->d_un.d_ptr);
4065 case DT_MIPS_TIME_STAMP:
4070 time_t time = entry->d_un.d_val;
4071 tmp = gmtime (&time);
4072 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
4073 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
4074 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
4075 printf ("Time Stamp: %s\n", timebuf);
4079 case DT_MIPS_RLD_VERSION:
4080 case DT_MIPS_LOCAL_GOTNO:
4081 case DT_MIPS_CONFLICTNO:
4082 case DT_MIPS_LIBLISTNO:
4083 case DT_MIPS_SYMTABNO:
4084 case DT_MIPS_UNREFEXTNO:
4085 case DT_MIPS_HIPAGENO:
4086 case DT_MIPS_DELTA_CLASS_NO:
4087 case DT_MIPS_DELTA_INSTANCE_NO:
4088 case DT_MIPS_DELTA_RELOC_NO:
4089 case DT_MIPS_DELTA_SYM_NO:
4090 case DT_MIPS_DELTA_CLASSSYM_NO:
4091 case DT_MIPS_COMPACT_SIZE:
4092 printf ("%ld\n", (long) entry->d_un.d_ptr);
4096 printf ("%#lx\n", (long) entry->d_un.d_ptr);
4102 dynamic_segment_parisc_val (entry)
4103 Elf_Internal_Dyn * entry;
4105 switch (entry->d_tag)
4107 case DT_HP_DLD_FLAGS:
4116 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
4117 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
4118 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
4119 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
4120 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
4121 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
4122 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
4123 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
4124 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
4125 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
4126 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
4130 bfd_vma val = entry->d_un.d_val;
4132 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
4133 if (val & flags[cnt].bit)
4137 fputs (flags[cnt].str, stdout);
4139 val ^= flags[cnt].bit;
4142 if (val != 0 || first)
4146 print_vma (val, HEX);
4152 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
4158 get_32bit_dynamic_segment (file)
4161 Elf32_External_Dyn * edyn;
4162 Elf_Internal_Dyn * entry;
4165 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr,
4166 dynamic_size, _("dynamic segment"));
4170 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4171 how large this .dynamic is now. We can do this even before the byte
4172 swapping since the DT_NULL tag is recognizable. */
4174 while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
4177 dynamic_segment = (Elf_Internal_Dyn *)
4178 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
4180 if (dynamic_segment == NULL)
4182 error (_("Out of memory\n"));
4187 for (i = 0, entry = dynamic_segment;
4191 entry->d_tag = BYTE_GET (edyn [i].d_tag);
4192 entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
4201 get_64bit_dynamic_segment (file)
4204 Elf64_External_Dyn * edyn;
4205 Elf_Internal_Dyn * entry;
4208 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr,
4209 dynamic_size, _("dynamic segment"));
4213 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4214 how large this .dynamic is now. We can do this even before the byte
4215 swapping since the DT_NULL tag is recognizable. */
4217 while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
4220 dynamic_segment = (Elf_Internal_Dyn *)
4221 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
4223 if (dynamic_segment == NULL)
4225 error (_("Out of memory\n"));
4230 for (i = 0, entry = dynamic_segment;
4234 entry->d_tag = BYTE_GET8 (edyn [i].d_tag);
4235 entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
4244 get_dynamic_flags (flags)
4247 static char buff [128];
4255 flag = flags & - flags;
4263 case DF_ORIGIN: strcpy (p, "ORIGIN"); break;
4264 case DF_SYMBOLIC: strcpy (p, "SYMBOLIC"); break;
4265 case DF_TEXTREL: strcpy (p, "TEXTREL"); break;
4266 case DF_BIND_NOW: strcpy (p, "BIND_NOW"); break;
4267 case DF_STATIC_TLS: strcpy (p, "STATIC_TLS"); break;
4268 default: strcpy (p, "unknown"); break;
4271 p = strchr (p, '\0');
4276 /* Parse and display the contents of the dynamic segment. */
4278 process_dynamic_segment (file)
4281 Elf_Internal_Dyn * entry;
4284 if (dynamic_size == 0)
4287 printf (_("\nThere is no dynamic segment in this file.\n"));
4294 if (! get_32bit_dynamic_segment (file))
4297 else if (! get_64bit_dynamic_segment (file))
4300 /* Find the appropriate symbol table. */
4301 if (dynamic_symbols == NULL)
4303 for (i = 0, entry = dynamic_segment;
4307 Elf32_Internal_Shdr section;
4309 if (entry->d_tag != DT_SYMTAB)
4312 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
4314 /* Since we do not know how big the symbol table is,
4315 we default to reading in the entire file (!) and
4316 processing that. This is overkill, I know, but it
4318 section.sh_offset = entry->d_un.d_val - loadaddr;
4320 if (fseek (file, 0, SEEK_END))
4321 error (_("Unable to seek to end of file!"));
4323 section.sh_size = ftell (file) - section.sh_offset;
4325 section.sh_entsize = sizeof (Elf32_External_Sym);
4327 section.sh_entsize = sizeof (Elf64_External_Sym);
4329 num_dynamic_syms = section.sh_size / section.sh_entsize;
4330 if (num_dynamic_syms < 1)
4332 error (_("Unable to determine the number of symbols to load\n"));
4336 dynamic_symbols = GET_ELF_SYMBOLS (file, §ion);
4340 /* Similarly find a string table. */
4341 if (dynamic_strings == NULL)
4343 for (i = 0, entry = dynamic_segment;
4347 unsigned long offset;
4350 if (entry->d_tag != DT_STRTAB)
4353 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
4355 /* Since we do not know how big the string table is,
4356 we default to reading in the entire file (!) and
4357 processing that. This is overkill, I know, but it
4360 offset = entry->d_un.d_val - loadaddr;
4361 if (fseek (file, 0, SEEK_END))
4362 error (_("Unable to seek to end of file\n"));
4363 str_tab_len = ftell (file) - offset;
4365 if (str_tab_len < 1)
4368 (_("Unable to determine the length of the dynamic string table\n"));
4372 dynamic_strings = (char *) get_data (NULL, file, offset, str_tab_len,
4373 _("dynamic string table"));
4378 /* And find the syminfo section if available. */
4379 if (dynamic_syminfo == NULL)
4381 unsigned int syminsz = 0;
4383 for (i = 0, entry = dynamic_segment;
4387 if (entry->d_tag == DT_SYMINENT)
4389 /* Note: these braces are necessary to avoid a syntax
4390 error from the SunOS4 C compiler. */
4391 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
4393 else if (entry->d_tag == DT_SYMINSZ)
4394 syminsz = entry->d_un.d_val;
4395 else if (entry->d_tag == DT_SYMINFO)
4396 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
4399 if (dynamic_syminfo_offset != 0 && syminsz != 0)
4401 Elf_External_Syminfo * extsyminfo;
4402 Elf_Internal_Syminfo * syminfo;
4404 /* There is a syminfo section. Read the data. */
4405 extsyminfo = ((Elf_External_Syminfo *)
4406 get_data (NULL, file, dynamic_syminfo_offset,
4407 syminsz, _("symbol information")));
4411 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
4412 if (dynamic_syminfo == NULL)
4414 error (_("Out of memory\n"));
4418 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
4419 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
4422 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
4423 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
4430 if (do_dynamic && dynamic_addr)
4431 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
4432 dynamic_addr, (long) dynamic_size);
4434 printf (_(" Tag Type Name/Value\n"));
4436 for (i = 0, entry = dynamic_segment;
4445 print_vma (entry->d_tag, FULL_HEX);
4446 dtype = get_dynamic_type (entry->d_tag);
4447 printf (" (%s)%*s", dtype,
4448 ((is_32bit_elf ? 27 : 19)
4449 - (int) strlen (dtype)),
4453 switch (entry->d_tag)
4457 puts (get_dynamic_flags (entry->d_un.d_val));
4467 switch (entry->d_tag)
4470 printf (_("Auxiliary library"));
4474 printf (_("Filter library"));
4478 printf (_("Configuration file"));
4482 printf (_("Dependency audit library"));
4486 printf (_("Audit library"));
4490 if (dynamic_strings)
4491 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
4495 print_vma (entry->d_un.d_val, PREFIX_HEX);
4504 printf (_("Flags:"));
4505 if (entry->d_un.d_val == 0)
4506 printf (_(" None\n"));
4509 unsigned long int val = entry->d_un.d_val;
4510 if (val & DTF_1_PARINIT)
4512 printf (" PARINIT");
4513 val ^= DTF_1_PARINIT;
4515 if (val & DTF_1_CONFEXP)
4517 printf (" CONFEXP");
4518 val ^= DTF_1_CONFEXP;
4521 printf (" %lx", val);
4530 printf (_("Flags:"));
4531 if (entry->d_un.d_val == 0)
4532 printf (_(" None\n"));
4535 unsigned long int val = entry->d_un.d_val;
4536 if (val & DF_P1_LAZYLOAD)
4538 printf (" LAZYLOAD");
4539 val ^= DF_P1_LAZYLOAD;
4541 if (val & DF_P1_GROUPPERM)
4543 printf (" GROUPPERM");
4544 val ^= DF_P1_GROUPPERM;
4547 printf (" %lx", val);
4556 printf (_("Flags:"));
4557 if (entry->d_un.d_val == 0)
4558 printf (_(" None\n"));
4561 unsigned long int val = entry->d_un.d_val;
4567 if (val & DF_1_GLOBAL)
4572 if (val & DF_1_GROUP)
4577 if (val & DF_1_NODELETE)
4579 printf (" NODELETE");
4580 val ^= DF_1_NODELETE;
4582 if (val & DF_1_LOADFLTR)
4584 printf (" LOADFLTR");
4585 val ^= DF_1_LOADFLTR;
4587 if (val & DF_1_INITFIRST)
4589 printf (" INITFIRST");
4590 val ^= DF_1_INITFIRST;
4592 if (val & DF_1_NOOPEN)
4597 if (val & DF_1_ORIGIN)
4602 if (val & DF_1_DIRECT)
4607 if (val & DF_1_TRANS)
4612 if (val & DF_1_INTERPOSE)
4614 printf (" INTERPOSE");
4615 val ^= DF_1_INTERPOSE;
4617 if (val & DF_1_NODEFLIB)
4619 printf (" NODEFLIB");
4620 val ^= DF_1_NODEFLIB;
4622 if (val & DF_1_NODUMP)
4627 if (val & DF_1_CONLFAT)
4629 printf (" CONLFAT");
4630 val ^= DF_1_CONLFAT;
4633 printf (" %lx", val);
4641 puts (get_dynamic_type (entry->d_un.d_val));
4661 dynamic_info[entry->d_tag] = entry->d_un.d_val;
4667 if (dynamic_strings == NULL)
4670 name = dynamic_strings + entry->d_un.d_val;
4674 switch (entry->d_tag)
4677 printf (_("Shared library: [%s]"), name);
4679 if (strcmp (name, program_interpreter) == 0)
4680 printf (_(" program interpreter"));
4684 printf (_("Library soname: [%s]"), name);
4688 printf (_("Library rpath: [%s]"), name);
4692 printf (_("Library runpath: [%s]"), name);
4696 print_vma (entry->d_un.d_val, PREFIX_HEX);
4701 print_vma (entry->d_un.d_val, PREFIX_HEX);
4717 case DT_INIT_ARRAYSZ:
4718 case DT_FINI_ARRAYSZ:
4721 print_vma (entry->d_un.d_val, UNSIGNED);
4722 printf (" (bytes)\n");
4732 print_vma (entry->d_un.d_val, UNSIGNED);
4745 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
4749 name = dynamic_strings + entry->d_un.d_val;
4753 printf (_("Not needed object: [%s]\n"), name);
4758 print_vma (entry->d_un.d_val, PREFIX_HEX);
4764 /* The value of this entry is ignored. */
4768 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
4769 version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
4774 switch (elf_header.e_machine)
4777 case EM_MIPS_RS3_LE:
4778 dynamic_segment_mips_val (entry);
4781 dynamic_segment_parisc_val (entry);
4784 print_vma (entry->d_un.d_val, PREFIX_HEX);
4796 get_ver_flags (flags)
4799 static char buff [32];
4806 if (flags & VER_FLG_BASE)
4807 strcat (buff, "BASE ");
4809 if (flags & VER_FLG_WEAK)
4811 if (flags & VER_FLG_BASE)
4812 strcat (buff, "| ");
4814 strcat (buff, "WEAK ");
4817 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
4818 strcat (buff, "| <unknown>");
4823 /* Display the contents of the version sections. */
4825 process_version_sections (file)
4828 Elf32_Internal_Shdr * section;
4835 for (i = 0, section = section_headers;
4836 i < elf_header.e_shnum;
4839 switch (section->sh_type)
4841 case SHT_GNU_verdef:
4843 Elf_External_Verdef * edefs;
4850 (_("\nVersion definition section '%s' contains %ld entries:\n"),
4851 SECTION_NAME (section), section->sh_info);
4853 printf (_(" Addr: 0x"));
4854 printf_vma (section->sh_addr);
4855 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4856 (unsigned long) section->sh_offset, section->sh_link,
4857 SECTION_NAME (SECTION_HEADER (section->sh_link)));
4859 edefs = ((Elf_External_Verdef *)
4860 get_data (NULL, file, section->sh_offset,
4862 _("version definition section")));
4866 for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
4869 Elf_External_Verdef * edef;
4870 Elf_Internal_Verdef ent;
4871 Elf_External_Verdaux * eaux;
4872 Elf_Internal_Verdaux aux;
4876 vstart = ((char *) edefs) + idx;
4878 edef = (Elf_External_Verdef *) vstart;
4880 ent.vd_version = BYTE_GET (edef->vd_version);
4881 ent.vd_flags = BYTE_GET (edef->vd_flags);
4882 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
4883 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
4884 ent.vd_hash = BYTE_GET (edef->vd_hash);
4885 ent.vd_aux = BYTE_GET (edef->vd_aux);
4886 ent.vd_next = BYTE_GET (edef->vd_next);
4888 printf (_(" %#06x: Rev: %d Flags: %s"),
4889 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
4891 printf (_(" Index: %d Cnt: %d "),
4892 ent.vd_ndx, ent.vd_cnt);
4894 vstart += ent.vd_aux;
4896 eaux = (Elf_External_Verdaux *) vstart;
4898 aux.vda_name = BYTE_GET (eaux->vda_name);
4899 aux.vda_next = BYTE_GET (eaux->vda_next);
4901 if (dynamic_strings)
4902 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
4904 printf (_("Name index: %ld\n"), aux.vda_name);
4906 isum = idx + ent.vd_aux;
4908 for (j = 1; j < ent.vd_cnt; j ++)
4910 isum += aux.vda_next;
4911 vstart += aux.vda_next;
4913 eaux = (Elf_External_Verdaux *) vstart;
4915 aux.vda_name = BYTE_GET (eaux->vda_name);
4916 aux.vda_next = BYTE_GET (eaux->vda_next);
4918 if (dynamic_strings)
4919 printf (_(" %#06x: Parent %d: %s\n"),
4920 isum, j, dynamic_strings + aux.vda_name);
4922 printf (_(" %#06x: Parent %d, name index: %ld\n"),
4923 isum, j, aux.vda_name);
4933 case SHT_GNU_verneed:
4935 Elf_External_Verneed * eneed;
4941 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
4942 SECTION_NAME (section), section->sh_info);
4944 printf (_(" Addr: 0x"));
4945 printf_vma (section->sh_addr);
4946 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
4947 (unsigned long) section->sh_offset, section->sh_link,
4948 SECTION_NAME (SECTION_HEADER (section->sh_link)));
4950 eneed = ((Elf_External_Verneed *)
4951 get_data (NULL, file, section->sh_offset,
4952 section->sh_size, _("version need section")));
4956 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
4958 Elf_External_Verneed * entry;
4959 Elf_Internal_Verneed ent;
4964 vstart = ((char *) eneed) + idx;
4966 entry = (Elf_External_Verneed *) vstart;
4968 ent.vn_version = BYTE_GET (entry->vn_version);
4969 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
4970 ent.vn_file = BYTE_GET (entry->vn_file);
4971 ent.vn_aux = BYTE_GET (entry->vn_aux);
4972 ent.vn_next = BYTE_GET (entry->vn_next);
4974 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
4976 if (dynamic_strings)
4977 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
4979 printf (_(" File: %lx"), ent.vn_file);
4981 printf (_(" Cnt: %d\n"), ent.vn_cnt);
4983 vstart += ent.vn_aux;
4985 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
4987 Elf_External_Vernaux * eaux;
4988 Elf_Internal_Vernaux aux;
4990 eaux = (Elf_External_Vernaux *) vstart;
4992 aux.vna_hash = BYTE_GET (eaux->vna_hash);
4993 aux.vna_flags = BYTE_GET (eaux->vna_flags);
4994 aux.vna_other = BYTE_GET (eaux->vna_other);
4995 aux.vna_name = BYTE_GET (eaux->vna_name);
4996 aux.vna_next = BYTE_GET (eaux->vna_next);
4998 if (dynamic_strings)
4999 printf (_(" %#06x: Name: %s"),
5000 isum, dynamic_strings + aux.vna_name);
5002 printf (_(" %#06x: Name index: %lx"),
5003 isum, aux.vna_name);
5005 printf (_(" Flags: %s Version: %d\n"),
5006 get_ver_flags (aux.vna_flags), aux.vna_other);
5008 isum += aux.vna_next;
5009 vstart += aux.vna_next;
5019 case SHT_GNU_versym:
5021 Elf32_Internal_Shdr * link_section;
5024 unsigned char * edata;
5025 unsigned short * data;
5027 Elf_Internal_Sym * symbols;
5028 Elf32_Internal_Shdr * string_sec;
5030 link_section = SECTION_HEADER (section->sh_link);
5031 total = section->sh_size / section->sh_entsize;
5035 symbols = GET_ELF_SYMBOLS (file, link_section);
5037 string_sec = SECTION_HEADER (link_section->sh_link);
5039 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5040 string_sec->sh_size,
5041 _("version string table"));
5045 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
5046 SECTION_NAME (section), total);
5048 printf (_(" Addr: "));
5049 printf_vma (section->sh_addr);
5050 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5051 (unsigned long) section->sh_offset, section->sh_link,
5052 SECTION_NAME (link_section));
5056 get_data (NULL, file,
5057 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] - loadaddr,
5058 total * sizeof (short), _("version symbol data")));
5065 data = (unsigned short *) malloc (total * sizeof (short));
5067 for (cnt = total; cnt --;)
5068 data [cnt] = byte_get (edata + cnt * sizeof (short),
5073 for (cnt = 0; cnt < total; cnt += 4)
5076 int check_def, check_need;
5079 printf (" %03x:", cnt);
5081 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
5082 switch (data [cnt + j])
5085 fputs (_(" 0 (*local*) "), stdout);
5089 fputs (_(" 1 (*global*) "), stdout);
5093 nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
5094 data [cnt + j] & 0x8000 ? 'h' : ' ');
5098 if (SECTION_HEADER (symbols [cnt + j].st_shndx)->sh_type
5101 if (symbols [cnt + j].st_shndx == SHN_UNDEF)
5108 && version_info [DT_VERSIONTAGIDX (DT_VERNEED)])
5110 Elf_Internal_Verneed ivn;
5111 unsigned long offset;
5113 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
5118 Elf_Internal_Vernaux ivna;
5119 Elf_External_Verneed evn;
5120 Elf_External_Vernaux evna;
5121 unsigned long a_off;
5123 get_data (&evn, file, offset, sizeof (evn),
5126 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5127 ivn.vn_next = BYTE_GET (evn.vn_next);
5129 a_off = offset + ivn.vn_aux;
5133 get_data (&evna, file, a_off, sizeof (evna),
5134 _("version need aux (2)"));
5136 ivna.vna_next = BYTE_GET (evna.vna_next);
5137 ivna.vna_other = BYTE_GET (evna.vna_other);
5139 a_off += ivna.vna_next;
5141 while (ivna.vna_other != data [cnt + j]
5142 && ivna.vna_next != 0);
5144 if (ivna.vna_other == data [cnt + j])
5146 ivna.vna_name = BYTE_GET (evna.vna_name);
5148 name = strtab + ivna.vna_name;
5149 nn += printf ("(%s%-*s",
5151 12 - (int) strlen (name),
5157 offset += ivn.vn_next;
5159 while (ivn.vn_next);
5162 if (check_def && data [cnt + j] != 0x8001
5163 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
5165 Elf_Internal_Verdef ivd;
5166 Elf_External_Verdef evd;
5167 unsigned long offset;
5169 offset = version_info
5170 [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
5174 get_data (&evd, file, offset, sizeof (evd),
5177 ivd.vd_next = BYTE_GET (evd.vd_next);
5178 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5180 offset += ivd.vd_next;
5182 while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
5183 && ivd.vd_next != 0);
5185 if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
5187 Elf_External_Verdaux evda;
5188 Elf_Internal_Verdaux ivda;
5190 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5192 get_data (&evda, file,
5193 offset - ivd.vd_next + ivd.vd_aux,
5194 sizeof (evda), _("version def aux"));
5196 ivda.vda_name = BYTE_GET (evda.vda_name);
5198 name = strtab + ivda.vda_name;
5199 nn += printf ("(%s%-*s",
5201 12 - (int) strlen (name),
5207 printf ("%*c", 18 - nn, ' ');
5225 printf (_("\nNo version information found in this file.\n"));
5231 get_symbol_binding (binding)
5232 unsigned int binding;
5234 static char buff [32];
5238 case STB_LOCAL: return "LOCAL";
5239 case STB_GLOBAL: return "GLOBAL";
5240 case STB_WEAK: return "WEAK";
5242 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
5243 sprintf (buff, _("<processor specific>: %d"), binding);
5244 else if (binding >= STB_LOOS && binding <= STB_HIOS)
5245 sprintf (buff, _("<OS specific>: %d"), binding);
5247 sprintf (buff, _("<unknown>: %d"), binding);
5253 get_symbol_type (type)
5256 static char buff [32];
5260 case STT_NOTYPE: return "NOTYPE";
5261 case STT_OBJECT: return "OBJECT";
5262 case STT_FUNC: return "FUNC";
5263 case STT_SECTION: return "SECTION";
5264 case STT_FILE: return "FILE";
5265 case STT_COMMON: return "COMMON";
5266 case STT_TLS: return "TLS";
5268 if (type >= STT_LOPROC && type <= STT_HIPROC)
5270 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
5271 return "THUMB_FUNC";
5273 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
5276 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
5277 return "PARISC_MILLI";
5279 sprintf (buff, _("<processor specific>: %d"), type);
5281 else if (type >= STT_LOOS && type <= STT_HIOS)
5283 if (elf_header.e_machine == EM_PARISC)
5285 if (type == STT_HP_OPAQUE)
5287 if (type == STT_HP_STUB)
5291 sprintf (buff, _("<OS specific>: %d"), type);
5294 sprintf (buff, _("<unknown>: %d"), type);
5300 get_symbol_visibility (visibility)
5301 unsigned int visibility;
5305 case STV_DEFAULT: return "DEFAULT";
5306 case STV_INTERNAL: return "INTERNAL";
5307 case STV_HIDDEN: return "HIDDEN";
5308 case STV_PROTECTED: return "PROTECTED";
5314 get_symbol_index_type (type)
5319 case SHN_UNDEF: return "UND";
5320 case SHN_ABS: return "ABS";
5321 case SHN_COMMON: return "COM";
5323 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
5325 else if (type >= SHN_LOOS && type <= SHN_HIOS)
5327 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
5331 static char buff [32];
5333 sprintf (buff, "%3d", type);
5340 get_dynamic_data (file, number)
5342 unsigned int number;
5344 unsigned char * e_data;
5347 e_data = (unsigned char *) malloc (number * 4);
5351 error (_("Out of memory\n"));
5355 if (fread (e_data, 4, number, file) != number)
5357 error (_("Unable to read in dynamic data\n"));
5361 i_data = (int *) malloc (number * sizeof (* i_data));
5365 error (_("Out of memory\n"));
5371 i_data [number] = byte_get (e_data + number * 4, 4);
5378 /* Dump the symbol table. */
5380 process_symbol_table (file)
5383 Elf32_Internal_Shdr * section;
5384 unsigned char nb [4];
5385 unsigned char nc [4];
5388 int * buckets = NULL;
5389 int * chains = NULL;
5391 if (! do_syms && !do_histogram)
5394 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
5397 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
5399 error (_("Unable to seek to start of dynamic information"));
5403 if (fread (nb, sizeof (nb), 1, file) != 1)
5405 error (_("Failed to read in number of buckets\n"));
5409 if (fread (nc, sizeof (nc), 1, file) != 1)
5411 error (_("Failed to read in number of chains\n"));
5415 nbuckets = byte_get (nb, 4);
5416 nchains = byte_get (nc, 4);
5418 buckets = get_dynamic_data (file, nbuckets);
5419 chains = get_dynamic_data (file, nchains);
5421 if (buckets == NULL || chains == NULL)
5426 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
5431 printf (_("\nSymbol table for image:\n"));
5433 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5435 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5437 for (hn = 0; hn < nbuckets; hn++)
5442 for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
5444 Elf_Internal_Sym * psym;
5446 psym = dynamic_symbols + si;
5448 printf (" %3d %3d: ", si, hn);
5449 print_vma (psym->st_value, LONG_HEX);
5451 print_vma (psym->st_size, DEC_5);
5453 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5454 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5455 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5456 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
5457 print_symbol (25, dynamic_strings + psym->st_name);
5462 else if (do_syms && !do_using_dynamic)
5466 for (i = 0, section = section_headers;
5467 i < elf_header.e_shnum;
5472 Elf_Internal_Sym * symtab;
5473 Elf_Internal_Sym * psym;
5476 if ( section->sh_type != SHT_SYMTAB
5477 && section->sh_type != SHT_DYNSYM)
5480 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5481 SECTION_NAME (section),
5482 (unsigned long) (section->sh_size / section->sh_entsize));
5484 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5486 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5488 symtab = GET_ELF_SYMBOLS (file, section);
5492 if (section->sh_link == elf_header.e_shstrndx)
5493 strtab = string_table;
5496 Elf32_Internal_Shdr * string_sec;
5498 string_sec = SECTION_HEADER (section->sh_link);
5500 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5501 string_sec->sh_size,
5505 for (si = 0, psym = symtab;
5506 si < section->sh_size / section->sh_entsize;
5509 printf ("%6d: ", si);
5510 print_vma (psym->st_value, LONG_HEX);
5512 print_vma (psym->st_size, DEC_5);
5513 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5514 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5515 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5516 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
5517 print_symbol (25, strtab + psym->st_name);
5519 if (section->sh_type == SHT_DYNSYM &&
5520 version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
5522 unsigned char data[2];
5523 unsigned short vers_data;
5524 unsigned long offset;
5528 offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
5531 get_data (&data, file, offset + si * sizeof (vers_data),
5532 sizeof (data), _("version data"));
5534 vers_data = byte_get (data, 2);
5536 is_nobits = (SECTION_HEADER (psym->st_shndx)->sh_type
5539 check_def = (psym->st_shndx != SHN_UNDEF);
5541 if ((vers_data & 0x8000) || vers_data > 1)
5543 if (version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
5544 && (is_nobits || ! check_def))
5546 Elf_External_Verneed evn;
5547 Elf_Internal_Verneed ivn;
5548 Elf_Internal_Vernaux ivna;
5550 /* We must test both. */
5551 offset = version_info
5552 [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
5556 unsigned long vna_off;
5558 get_data (&evn, file, offset, sizeof (evn),
5561 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5562 ivn.vn_next = BYTE_GET (evn.vn_next);
5564 vna_off = offset + ivn.vn_aux;
5568 Elf_External_Vernaux evna;
5570 get_data (&evna, file, vna_off,
5572 _("version need aux (3)"));
5574 ivna.vna_other = BYTE_GET (evna.vna_other);
5575 ivna.vna_next = BYTE_GET (evna.vna_next);
5576 ivna.vna_name = BYTE_GET (evna.vna_name);
5578 vna_off += ivna.vna_next;
5580 while (ivna.vna_other != vers_data
5581 && ivna.vna_next != 0);
5583 if (ivna.vna_other == vers_data)
5586 offset += ivn.vn_next;
5588 while (ivn.vn_next != 0);
5590 if (ivna.vna_other == vers_data)
5593 strtab + ivna.vna_name, ivna.vna_other);
5596 else if (! is_nobits)
5597 error (_("bad dynamic symbol"));
5604 if (vers_data != 0x8001
5605 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
5607 Elf_Internal_Verdef ivd;
5608 Elf_Internal_Verdaux ivda;
5609 Elf_External_Verdaux evda;
5610 unsigned long offset;
5613 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
5618 Elf_External_Verdef evd;
5620 get_data (&evd, file, offset, sizeof (evd),
5623 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5624 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5625 ivd.vd_next = BYTE_GET (evd.vd_next);
5627 offset += ivd.vd_next;
5629 while (ivd.vd_ndx != (vers_data & 0x7fff)
5630 && ivd.vd_next != 0);
5632 offset -= ivd.vd_next;
5633 offset += ivd.vd_aux;
5635 get_data (&evda, file, offset, sizeof (evda),
5636 _("version def aux"));
5638 ivda.vda_name = BYTE_GET (evda.vda_name);
5640 if (psym->st_name != ivda.vda_name)
5641 printf ((vers_data & 0x8000)
5643 strtab + ivda.vda_name);
5653 if (strtab != string_table)
5659 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5661 if (do_histogram && buckets != NULL)
5668 int nzero_counts = 0;
5671 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5673 printf (_(" Length Number %% of total Coverage\n"));
5675 lengths = (int *) calloc (nbuckets, sizeof (int));
5676 if (lengths == NULL)
5678 error (_("Out of memory"));
5681 for (hn = 0; hn < nbuckets; ++hn)
5686 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
5689 if (maxlength < ++lengths[hn])
5694 counts = (int *) calloc (maxlength + 1, sizeof (int));
5697 error (_("Out of memory"));
5701 for (hn = 0; hn < nbuckets; ++hn)
5702 ++ counts [lengths [hn]];
5706 printf (" 0 %-10d (%5.1f%%)\n",
5707 counts[0], (counts[0] * 100.0) / nbuckets);
5708 for (si = 1; si <= maxlength; ++si)
5710 nzero_counts += counts[si] * si;
5711 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5712 si, counts[si], (counts[si] * 100.0) / nbuckets,
5713 (nzero_counts * 100.0) / nsyms);
5721 if (buckets != NULL)
5731 process_syminfo (file)
5732 FILE * file ATTRIBUTE_UNUSED;
5736 if (dynamic_syminfo == NULL
5738 /* No syminfo, this is ok. */
5741 /* There better should be a dynamic symbol section. */
5742 if (dynamic_symbols == NULL || dynamic_strings == NULL)
5746 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5747 dynamic_syminfo_offset, dynamic_syminfo_nent);
5749 printf (_(" Num: Name BoundTo Flags\n"));
5750 for (i = 0; i < dynamic_syminfo_nent; ++i)
5752 unsigned short int flags = dynamic_syminfo[i].si_flags;
5754 printf ("%4d: ", i);
5755 print_symbol (30, dynamic_strings + dynamic_symbols[i].st_name);
5758 switch (dynamic_syminfo[i].si_boundto)
5760 case SYMINFO_BT_SELF:
5761 fputs ("SELF ", stdout);
5763 case SYMINFO_BT_PARENT:
5764 fputs ("PARENT ", stdout);
5767 if (dynamic_syminfo[i].si_boundto > 0
5768 && dynamic_syminfo[i].si_boundto < dynamic_size)
5770 print_symbol (10, dynamic_strings
5772 [dynamic_syminfo[i].si_boundto].d_un.d_val);
5776 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
5780 if (flags & SYMINFO_FLG_DIRECT)
5782 if (flags & SYMINFO_FLG_PASSTHRU)
5783 printf (" PASSTHRU");
5784 if (flags & SYMINFO_FLG_COPY)
5786 if (flags & SYMINFO_FLG_LAZYLOAD)
5787 printf (" LAZYLOAD");
5795 #ifdef SUPPORT_DISASSEMBLY
5797 disassemble_section (section, file)
5798 Elf32_Internal_Shdr * section;
5801 printf (_("\nAssembly dump of section %s\n"),
5802 SECTION_NAME (section));
5804 /* XXX -- to be done --- XXX */
5811 dump_section (section, file)
5812 Elf32_Internal_Shdr * section;
5815 bfd_size_type bytes;
5817 unsigned char * data;
5818 unsigned char * start;
5820 bytes = section->sh_size;
5824 printf (_("\nSection '%s' has no data to dump.\n"),
5825 SECTION_NAME (section));
5829 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
5831 addr = section->sh_addr;
5833 start = (unsigned char *) get_data (NULL, file, section->sh_offset, bytes,
5846 lbytes = (bytes > 16 ? 16 : bytes);
5848 printf (" 0x%8.8lx ", (unsigned long) addr);
5850 switch (elf_header.e_ident [EI_DATA])
5854 for (j = 15; j >= 0; j --)
5857 printf ("%2.2x", data [j]);
5867 for (j = 0; j < 16; j++)
5870 printf ("%2.2x", data [j]);
5880 for (j = 0; j < lbytes; j++)
5883 if (k >= ' ' && k < 0x80)
5902 static unsigned long int
5903 read_leb128 (data, length_return, sign)
5904 unsigned char * data;
5905 int * length_return;
5908 unsigned long int result = 0;
5909 unsigned int num_read = 0;
5918 result |= (byte & 0x7f) << shift;
5923 while (byte & 0x80);
5925 if (length_return != NULL)
5926 * length_return = num_read;
5928 if (sign && (shift < 32) && (byte & 0x40))
5929 result |= -1 << shift;
5934 typedef struct State_Machine_Registers
5936 unsigned long address;
5939 unsigned int column;
5943 /* This variable hold the number of the last entry seen
5944 in the File Table. */
5945 unsigned int last_file_entry;
5948 static SMR state_machine_regs;
5951 reset_state_machine (is_stmt)
5954 state_machine_regs.address = 0;
5955 state_machine_regs.file = 1;
5956 state_machine_regs.line = 1;
5957 state_machine_regs.column = 0;
5958 state_machine_regs.is_stmt = is_stmt;
5959 state_machine_regs.basic_block = 0;
5960 state_machine_regs.end_sequence = 0;
5961 state_machine_regs.last_file_entry = 0;
5964 /* Handled an extend line op. Returns true if this is the end
5967 process_extended_line_op (data, is_stmt, pointer_size)
5968 unsigned char * data;
5972 unsigned char op_code;
5975 unsigned char * name;
5978 len = read_leb128 (data, & bytes_read, 0);
5983 warn (_("badly formed extended line op encountered!\n"));
5988 op_code = * data ++;
5990 printf (_(" Extended opcode %d: "), op_code);
5994 case DW_LNE_end_sequence:
5995 printf (_("End of Sequence\n\n"));
5996 reset_state_machine (is_stmt);
5999 case DW_LNE_set_address:
6000 adr = byte_get (data, pointer_size);
6001 printf (_("set Address to 0x%lx\n"), adr);
6002 state_machine_regs.address = adr;
6005 case DW_LNE_define_file:
6006 printf (_(" define new File Table entry\n"));
6007 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6009 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
6011 data += strlen ((char *) data) + 1;
6012 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6014 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6016 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6017 printf (_("%s\n\n"), name);
6021 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
6028 /* Size of pointers in the .debug_line section. This information is not
6029 really present in that section. It's obtained before dumping the debug
6030 sections by doing some pre-scan of the .debug_info section. */
6031 static int debug_line_pointer_size = 4;
6034 display_debug_lines (section, start, file)
6035 Elf32_Internal_Shdr * section;
6036 unsigned char * start;
6037 FILE * file ATTRIBUTE_UNUSED;
6039 DWARF2_External_LineInfo * external;
6040 DWARF2_Internal_LineInfo info;
6041 unsigned char * standard_opcodes;
6042 unsigned char * data = start;
6043 unsigned char * end = start + section->sh_size;
6044 unsigned char * end_of_sequence;
6047 printf (_("\nDump of debug contents of section %s:\n\n"),
6048 SECTION_NAME (section));
6052 external = (DWARF2_External_LineInfo *) data;
6054 /* Check the length of the block. */
6055 info.li_length = BYTE_GET (external->li_length);
6057 if (info.li_length == 0xffffffff)
6059 warn (_("64-bit DWARF line info is not supported yet.\n"));
6063 if (info.li_length + sizeof (external->li_length) > section->sh_size)
6066 (_("The line info appears to be corrupt - the section is too small\n"));
6070 /* Check its version number. */
6071 info.li_version = BYTE_GET (external->li_version);
6072 if (info.li_version != 2)
6074 warn (_("Only DWARF version 2 line info is currently supported.\n"));
6078 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
6079 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
6080 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
6081 info.li_line_base = BYTE_GET (external->li_line_base);
6082 info.li_line_range = BYTE_GET (external->li_line_range);
6083 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
6085 /* Sign extend the line base field. */
6086 info.li_line_base <<= 24;
6087 info.li_line_base >>= 24;
6089 printf (_(" Length: %ld\n"), info.li_length);
6090 printf (_(" DWARF Version: %d\n"), info.li_version);
6091 printf (_(" Prologue Length: %d\n"), info.li_prologue_length);
6092 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
6093 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
6094 printf (_(" Line Base: %d\n"), info.li_line_base);
6095 printf (_(" Line Range: %d\n"), info.li_line_range);
6096 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
6098 end_of_sequence = data + info.li_length + sizeof (external->li_length);
6100 reset_state_machine (info.li_default_is_stmt);
6102 /* Display the contents of the Opcodes table. */
6103 standard_opcodes = data + sizeof (* external);
6105 printf (_("\n Opcodes:\n"));
6107 for (i = 1; i < info.li_opcode_base; i++)
6108 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
6110 /* Display the contents of the Directory table. */
6111 data = standard_opcodes + info.li_opcode_base - 1;
6114 printf (_("\n The Directory Table is empty.\n"));
6117 printf (_("\n The Directory Table:\n"));
6121 printf (_(" %s\n"), data);
6123 data += strlen ((char *) data) + 1;
6127 /* Skip the NUL at the end of the table. */
6130 /* Display the contents of the File Name table. */
6132 printf (_("\n The File Name Table is empty.\n"));
6135 printf (_("\n The File Name Table:\n"));
6136 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6140 unsigned char * name;
6143 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
6146 data += strlen ((char *) data) + 1;
6148 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6150 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6152 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6154 printf (_("%s\n"), name);
6158 /* Skip the NUL at the end of the table. */
6161 /* Now display the statements. */
6162 printf (_("\n Line Number Statements:\n"));
6165 while (data < end_of_sequence)
6167 unsigned char op_code;
6171 op_code = * data ++;
6173 if (op_code >= info.li_opcode_base)
6175 op_code -= info.li_opcode_base;
6176 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
6177 state_machine_regs.address += adv;
6178 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6179 op_code, adv, state_machine_regs.address);
6180 adv = (op_code % info.li_line_range) + info.li_line_base;
6181 state_machine_regs.line += adv;
6182 printf (_(" and Line by %d to %d\n"),
6183 adv, state_machine_regs.line);
6185 else switch (op_code)
6187 case DW_LNS_extended_op:
6188 data += process_extended_line_op (data, info.li_default_is_stmt,
6189 debug_line_pointer_size);
6193 printf (_(" Copy\n"));
6196 case DW_LNS_advance_pc:
6197 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
6199 state_machine_regs.address += adv;
6200 printf (_(" Advance PC by %d to %lx\n"), adv,
6201 state_machine_regs.address);
6204 case DW_LNS_advance_line:
6205 adv = read_leb128 (data, & bytes_read, 1);
6207 state_machine_regs.line += adv;
6208 printf (_(" Advance Line by %d to %d\n"), adv,
6209 state_machine_regs.line);
6212 case DW_LNS_set_file:
6213 adv = read_leb128 (data, & bytes_read, 0);
6215 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6217 state_machine_regs.file = adv;
6220 case DW_LNS_set_column:
6221 adv = read_leb128 (data, & bytes_read, 0);
6223 printf (_(" Set column to %d\n"), adv);
6224 state_machine_regs.column = adv;
6227 case DW_LNS_negate_stmt:
6228 adv = state_machine_regs.is_stmt;
6230 printf (_(" Set is_stmt to %d\n"), adv);
6231 state_machine_regs.is_stmt = adv;
6234 case DW_LNS_set_basic_block:
6235 printf (_(" Set basic block\n"));
6236 state_machine_regs.basic_block = 1;
6239 case DW_LNS_const_add_pc:
6240 adv = (((255 - info.li_opcode_base) / info.li_line_range)
6241 * info.li_min_insn_length);
6242 state_machine_regs.address += adv;
6243 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
6244 state_machine_regs.address);
6247 case DW_LNS_fixed_advance_pc:
6248 adv = byte_get (data, 2);
6250 state_machine_regs.address += adv;
6251 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6252 adv, state_machine_regs.address);
6255 case DW_LNS_set_prologue_end:
6256 printf (_(" Set prologue_end to true\n"));
6259 case DW_LNS_set_epilogue_begin:
6260 printf (_(" Set epilogue_begin to true\n"));
6263 case DW_LNS_set_isa:
6264 adv = read_leb128 (data, & bytes_read, 0);
6266 printf (_(" Set ISA to %d\n"), adv);
6270 printf (_(" Unknown opcode %d with operands: "), op_code);
6273 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
6275 printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
6276 i == 1 ? "" : ", ");
6291 display_debug_pubnames (section, start, file)
6292 Elf32_Internal_Shdr * section;
6293 unsigned char * start;
6294 FILE * file ATTRIBUTE_UNUSED;
6296 DWARF2_External_PubNames * external;
6297 DWARF2_Internal_PubNames pubnames;
6298 unsigned char * end;
6300 end = start + section->sh_size;
6302 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6306 unsigned char * data;
6307 unsigned long offset;
6309 external = (DWARF2_External_PubNames *) start;
6311 pubnames.pn_length = BYTE_GET (external->pn_length);
6312 pubnames.pn_version = BYTE_GET (external->pn_version);
6313 pubnames.pn_offset = BYTE_GET (external->pn_offset);
6314 pubnames.pn_size = BYTE_GET (external->pn_size);
6316 data = start + sizeof (* external);
6317 start += pubnames.pn_length + sizeof (external->pn_length);
6319 if (pubnames.pn_length == 0xffffffff)
6321 warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6325 if (pubnames.pn_version != 2)
6327 static int warned = 0;
6331 warn (_("Only DWARF 2 pubnames are currently supported\n"));
6338 printf (_(" Length: %ld\n"),
6339 pubnames.pn_length);
6340 printf (_(" Version: %d\n"),
6341 pubnames.pn_version);
6342 printf (_(" Offset into .debug_info section: %ld\n"),
6343 pubnames.pn_offset);
6344 printf (_(" Size of area in .debug_info section: %ld\n"),
6347 printf (_("\n Offset\tName\n"));
6351 offset = byte_get (data, 4);
6356 printf (" %ld\t\t%s\n", offset, data);
6357 data += strlen ((char *) data) + 1;
6360 while (offset != 0);
6373 case DW_TAG_padding: return "DW_TAG_padding";
6374 case DW_TAG_array_type: return "DW_TAG_array_type";
6375 case DW_TAG_class_type: return "DW_TAG_class_type";
6376 case DW_TAG_entry_point: return "DW_TAG_entry_point";
6377 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
6378 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
6379 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
6380 case DW_TAG_label: return "DW_TAG_label";
6381 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
6382 case DW_TAG_member: return "DW_TAG_member";
6383 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
6384 case DW_TAG_reference_type: return "DW_TAG_reference_type";
6385 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
6386 case DW_TAG_string_type: return "DW_TAG_string_type";
6387 case DW_TAG_structure_type: return "DW_TAG_structure_type";
6388 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
6389 case DW_TAG_typedef: return "DW_TAG_typedef";
6390 case DW_TAG_union_type: return "DW_TAG_union_type";
6391 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
6392 case DW_TAG_variant: return "DW_TAG_variant";
6393 case DW_TAG_common_block: return "DW_TAG_common_block";
6394 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
6395 case DW_TAG_inheritance: return "DW_TAG_inheritance";
6396 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
6397 case DW_TAG_module: return "DW_TAG_module";
6398 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
6399 case DW_TAG_set_type: return "DW_TAG_set_type";
6400 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
6401 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
6402 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
6403 case DW_TAG_base_type: return "DW_TAG_base_type";
6404 case DW_TAG_catch_block: return "DW_TAG_catch_block";
6405 case DW_TAG_const_type: return "DW_TAG_const_type";
6406 case DW_TAG_constant: return "DW_TAG_constant";
6407 case DW_TAG_enumerator: return "DW_TAG_enumerator";
6408 case DW_TAG_file_type: return "DW_TAG_file_type";
6409 case DW_TAG_friend: return "DW_TAG_friend";
6410 case DW_TAG_namelist: return "DW_TAG_namelist";
6411 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
6412 case DW_TAG_packed_type: return "DW_TAG_packed_type";
6413 case DW_TAG_subprogram: return "DW_TAG_subprogram";
6414 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
6415 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
6416 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
6417 case DW_TAG_try_block: return "DW_TAG_try_block";
6418 case DW_TAG_variant_part: return "DW_TAG_variant_part";
6419 case DW_TAG_variable: return "DW_TAG_variable";
6420 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
6421 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
6422 case DW_TAG_format_label: return "DW_TAG_format_label";
6423 case DW_TAG_function_template: return "DW_TAG_function_template";
6424 case DW_TAG_class_template: return "DW_TAG_class_template";
6425 /* DWARF 2.1 values. */
6426 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
6427 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
6428 case DW_TAG_interface_type: return "DW_TAG_interface_type";
6429 case DW_TAG_namespace: return "DW_TAG_namespace";
6430 case DW_TAG_imported_module: return "DW_TAG_imported_module";
6431 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
6432 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
6433 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
6436 static char buffer [100];
6438 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
6445 get_AT_name (attribute)
6446 unsigned long attribute;
6450 case DW_AT_sibling: return "DW_AT_sibling";
6451 case DW_AT_location: return "DW_AT_location";
6452 case DW_AT_name: return "DW_AT_name";
6453 case DW_AT_ordering: return "DW_AT_ordering";
6454 case DW_AT_subscr_data: return "DW_AT_subscr_data";
6455 case DW_AT_byte_size: return "DW_AT_byte_size";
6456 case DW_AT_bit_offset: return "DW_AT_bit_offset";
6457 case DW_AT_bit_size: return "DW_AT_bit_size";
6458 case DW_AT_element_list: return "DW_AT_element_list";
6459 case DW_AT_stmt_list: return "DW_AT_stmt_list";
6460 case DW_AT_low_pc: return "DW_AT_low_pc";
6461 case DW_AT_high_pc: return "DW_AT_high_pc";
6462 case DW_AT_language: return "DW_AT_language";
6463 case DW_AT_member: return "DW_AT_member";
6464 case DW_AT_discr: return "DW_AT_discr";
6465 case DW_AT_discr_value: return "DW_AT_discr_value";
6466 case DW_AT_visibility: return "DW_AT_visibility";
6467 case DW_AT_import: return "DW_AT_import";
6468 case DW_AT_string_length: return "DW_AT_string_length";
6469 case DW_AT_common_reference: return "DW_AT_common_reference";
6470 case DW_AT_comp_dir: return "DW_AT_comp_dir";
6471 case DW_AT_const_value: return "DW_AT_const_value";
6472 case DW_AT_containing_type: return "DW_AT_containing_type";
6473 case DW_AT_default_value: return "DW_AT_default_value";
6474 case DW_AT_inline: return "DW_AT_inline";
6475 case DW_AT_is_optional: return "DW_AT_is_optional";
6476 case DW_AT_lower_bound: return "DW_AT_lower_bound";
6477 case DW_AT_producer: return "DW_AT_producer";
6478 case DW_AT_prototyped: return "DW_AT_prototyped";
6479 case DW_AT_return_addr: return "DW_AT_return_addr";
6480 case DW_AT_start_scope: return "DW_AT_start_scope";
6481 case DW_AT_stride_size: return "DW_AT_stride_size";
6482 case DW_AT_upper_bound: return "DW_AT_upper_bound";
6483 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
6484 case DW_AT_accessibility: return "DW_AT_accessibility";
6485 case DW_AT_address_class: return "DW_AT_address_class";
6486 case DW_AT_artificial: return "DW_AT_artificial";
6487 case DW_AT_base_types: return "DW_AT_base_types";
6488 case DW_AT_calling_convention: return "DW_AT_calling_convention";
6489 case DW_AT_count: return "DW_AT_count";
6490 case DW_AT_data_member_location: return "DW_AT_data_member_location";
6491 case DW_AT_decl_column: return "DW_AT_decl_column";
6492 case DW_AT_decl_file: return "DW_AT_decl_file";
6493 case DW_AT_decl_line: return "DW_AT_decl_line";
6494 case DW_AT_declaration: return "DW_AT_declaration";
6495 case DW_AT_discr_list: return "DW_AT_discr_list";
6496 case DW_AT_encoding: return "DW_AT_encoding";
6497 case DW_AT_external: return "DW_AT_external";
6498 case DW_AT_frame_base: return "DW_AT_frame_base";
6499 case DW_AT_friend: return "DW_AT_friend";
6500 case DW_AT_identifier_case: return "DW_AT_identifier_case";
6501 case DW_AT_macro_info: return "DW_AT_macro_info";
6502 case DW_AT_namelist_items: return "DW_AT_namelist_items";
6503 case DW_AT_priority: return "DW_AT_priority";
6504 case DW_AT_segment: return "DW_AT_segment";
6505 case DW_AT_specification: return "DW_AT_specification";
6506 case DW_AT_static_link: return "DW_AT_static_link";
6507 case DW_AT_type: return "DW_AT_type";
6508 case DW_AT_use_location: return "DW_AT_use_location";
6509 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
6510 case DW_AT_virtuality: return "DW_AT_virtuality";
6511 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
6512 /* DWARF 2.1 values. */
6513 case DW_AT_allocated: return "DW_AT_allocated";
6514 case DW_AT_associated: return "DW_AT_associated";
6515 case DW_AT_data_location: return "DW_AT_data_location";
6516 case DW_AT_stride: return "DW_AT_stride";
6517 case DW_AT_entry_pc: return "DW_AT_entry_pc";
6518 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
6519 case DW_AT_extension: return "DW_AT_extension";
6520 case DW_AT_ranges: return "DW_AT_ranges";
6521 case DW_AT_trampoline: return "DW_AT_trampoline";
6522 case DW_AT_call_column: return "DW_AT_call_column";
6523 case DW_AT_call_file: return "DW_AT_call_file";
6524 case DW_AT_call_line: return "DW_AT_call_line";
6525 /* SGI/MIPS extensions. */
6526 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
6527 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
6528 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
6529 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
6530 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
6531 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
6532 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
6533 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
6534 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
6535 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
6536 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
6537 /* GNU extensions. */
6538 case DW_AT_sf_names: return "DW_AT_sf_names";
6539 case DW_AT_src_info: return "DW_AT_src_info";
6540 case DW_AT_mac_info: return "DW_AT_mac_info";
6541 case DW_AT_src_coords: return "DW_AT_src_coords";
6542 case DW_AT_body_begin: return "DW_AT_body_begin";
6543 case DW_AT_body_end: return "DW_AT_body_end";
6544 case DW_AT_GNU_vector: return "DW_AT_GNU_vector";
6547 static char buffer [100];
6549 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
6556 get_FORM_name (form)
6561 case DW_FORM_addr: return "DW_FORM_addr";
6562 case DW_FORM_block2: return "DW_FORM_block2";
6563 case DW_FORM_block4: return "DW_FORM_block4";
6564 case DW_FORM_data2: return "DW_FORM_data2";
6565 case DW_FORM_data4: return "DW_FORM_data4";
6566 case DW_FORM_data8: return "DW_FORM_data8";
6567 case DW_FORM_string: return "DW_FORM_string";
6568 case DW_FORM_block: return "DW_FORM_block";
6569 case DW_FORM_block1: return "DW_FORM_block1";
6570 case DW_FORM_data1: return "DW_FORM_data1";
6571 case DW_FORM_flag: return "DW_FORM_flag";
6572 case DW_FORM_sdata: return "DW_FORM_sdata";
6573 case DW_FORM_strp: return "DW_FORM_strp";
6574 case DW_FORM_udata: return "DW_FORM_udata";
6575 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
6576 case DW_FORM_ref1: return "DW_FORM_ref1";
6577 case DW_FORM_ref2: return "DW_FORM_ref2";
6578 case DW_FORM_ref4: return "DW_FORM_ref4";
6579 case DW_FORM_ref8: return "DW_FORM_ref8";
6580 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
6581 case DW_FORM_indirect: return "DW_FORM_indirect";
6584 static char buffer [100];
6586 sprintf (buffer, _("Unknown FORM value: %lx"), form);
6592 /* FIXME: There are better and more effiecint ways to handle
6593 these structures. For now though, I just want something that
6594 is simple to implement. */
6595 typedef struct abbrev_attr
6597 unsigned long attribute;
6599 struct abbrev_attr * next;
6603 typedef struct abbrev_entry
6605 unsigned long entry;
6608 struct abbrev_attr * first_attr;
6609 struct abbrev_attr * last_attr;
6610 struct abbrev_entry * next;
6614 static abbrev_entry * first_abbrev = NULL;
6615 static abbrev_entry * last_abbrev = NULL;
6618 free_abbrevs PARAMS ((void))
6620 abbrev_entry * abbrev;
6622 for (abbrev = first_abbrev; abbrev;)
6624 abbrev_entry * next = abbrev->next;
6627 for (attr = abbrev->first_attr; attr;)
6629 abbrev_attr * next = attr->next;
6639 last_abbrev = first_abbrev = NULL;
6643 add_abbrev (number, tag, children)
6644 unsigned long number;
6648 abbrev_entry * entry;
6650 entry = (abbrev_entry *) malloc (sizeof (* entry));
6656 entry->entry = number;
6658 entry->children = children;
6659 entry->first_attr = NULL;
6660 entry->last_attr = NULL;
6663 if (first_abbrev == NULL)
6664 first_abbrev = entry;
6666 last_abbrev->next = entry;
6668 last_abbrev = entry;
6672 add_abbrev_attr (attribute, form)
6673 unsigned long attribute;
6678 attr = (abbrev_attr *) malloc (sizeof (* attr));
6684 attr->attribute = attribute;
6688 if (last_abbrev->first_attr == NULL)
6689 last_abbrev->first_attr = attr;
6691 last_abbrev->last_attr->next = attr;
6693 last_abbrev->last_attr = attr;
6696 /* Processes the (partial) contents of a .debug_abbrev section.
6697 Returns NULL if the end of the section was encountered.
6698 Returns the address after the last byte read if the end of
6699 an abbreviation set was found. */
6701 static unsigned char *
6702 process_abbrev_section (start, end)
6703 unsigned char * start;
6704 unsigned char * end;
6706 if (first_abbrev != NULL)
6712 unsigned long entry;
6714 unsigned long attribute;
6717 entry = read_leb128 (start, & bytes_read, 0);
6718 start += bytes_read;
6720 /* A single zero is supposed to end the section according
6721 to the standard. If there's more, then signal that to
6724 return start == end ? NULL : start;
6726 tag = read_leb128 (start, & bytes_read, 0);
6727 start += bytes_read;
6729 children = * start ++;
6731 add_abbrev (entry, tag, children);
6737 attribute = read_leb128 (start, & bytes_read, 0);
6738 start += bytes_read;
6740 form = read_leb128 (start, & bytes_read, 0);
6741 start += bytes_read;
6744 add_abbrev_attr (attribute, form);
6746 while (attribute != 0);
6754 display_debug_macinfo (section, start, file)
6755 Elf32_Internal_Shdr * section;
6756 unsigned char * start;
6757 FILE * file ATTRIBUTE_UNUSED;
6759 unsigned char * end = start + section->sh_size;
6760 unsigned char * curr = start;
6761 unsigned int bytes_read;
6762 enum dwarf_macinfo_record_type op;
6764 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6768 unsigned int lineno;
6769 const char * string;
6776 case DW_MACINFO_start_file:
6778 unsigned int filenum;
6780 lineno = read_leb128 (curr, & bytes_read, 0);
6782 filenum = read_leb128 (curr, & bytes_read, 0);
6785 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno, filenum);
6789 case DW_MACINFO_end_file:
6790 printf (_(" DW_MACINFO_end_file\n"));
6793 case DW_MACINFO_define:
6794 lineno = read_leb128 (curr, & bytes_read, 0);
6797 curr += strlen (string) + 1;
6798 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno, string);
6801 case DW_MACINFO_undef:
6802 lineno = read_leb128 (curr, & bytes_read, 0);
6805 curr += strlen (string) + 1;
6806 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno, string);
6809 case DW_MACINFO_vendor_ext:
6811 unsigned int constant;
6813 constant = read_leb128 (curr, & bytes_read, 0);
6816 curr += strlen (string) + 1;
6817 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant, string);
6828 display_debug_abbrev (section, start, file)
6829 Elf32_Internal_Shdr * section;
6830 unsigned char * start;
6831 FILE * file ATTRIBUTE_UNUSED;
6833 abbrev_entry * entry;
6834 unsigned char * end = start + section->sh_size;
6836 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6840 start = process_abbrev_section (start, end);
6842 if (first_abbrev == NULL)
6845 printf (_(" Number TAG\n"));
6847 for (entry = first_abbrev; entry; entry = entry->next)
6851 printf (_(" %ld %s [%s]\n"),
6853 get_TAG_name (entry->tag),
6854 entry->children ? _("has children") : _("no children"));
6856 for (attr = entry->first_attr; attr; attr = attr->next)
6858 printf (_(" %-18s %s\n"),
6859 get_AT_name (attr->attribute),
6860 get_FORM_name (attr->form));
6874 static unsigned char *
6875 display_block (data, length)
6876 unsigned char * data;
6877 unsigned long length;
6879 printf (_(" %lu byte block: "), length);
6882 printf ("%lx ", (unsigned long) byte_get (data ++, 1));
6888 decode_location_expression (data, pointer_size, length)
6889 unsigned char * data;
6890 unsigned int pointer_size;
6891 unsigned long length;
6895 unsigned long uvalue;
6896 unsigned char * end = data + length;
6905 printf ("DW_OP_addr: %lx",
6906 (unsigned long) byte_get (data, pointer_size));
6907 data += pointer_size;
6910 printf ("DW_OP_deref");
6913 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
6916 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
6919 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
6923 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
6927 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
6931 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
6935 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
6936 (unsigned long) byte_get (data + 4, 4));
6940 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
6941 (long) byte_get (data + 4, 4));
6945 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
6949 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
6953 printf ("DW_OP_dup");
6956 printf ("DW_OP_drop");
6959 printf ("DW_OP_over");
6962 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
6965 printf ("DW_OP_swap");
6968 printf ("DW_OP_rot");
6971 printf ("DW_OP_xderef");
6974 printf ("DW_OP_abs");
6977 printf ("DW_OP_and");
6980 printf ("DW_OP_div");
6983 printf ("DW_OP_minus");
6986 printf ("DW_OP_mod");
6989 printf ("DW_OP_mul");
6992 printf ("DW_OP_neg");
6995 printf ("DW_OP_not");
6998 printf ("DW_OP_or");
7001 printf ("DW_OP_plus");
7003 case DW_OP_plus_uconst:
7004 printf ("DW_OP_plus_uconst: %lu",
7005 read_leb128 (data, &bytes_read, 0));
7009 printf ("DW_OP_shl");
7012 printf ("DW_OP_shr");
7015 printf ("DW_OP_shra");
7018 printf ("DW_OP_xor");
7021 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
7025 printf ("DW_OP_eq");
7028 printf ("DW_OP_ge");
7031 printf ("DW_OP_gt");
7034 printf ("DW_OP_le");
7037 printf ("DW_OP_lt");
7040 printf ("DW_OP_ne");
7043 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
7079 printf ("DW_OP_lit%d", op - DW_OP_lit0);
7114 printf ("DW_OP_reg%d", op - DW_OP_reg0);
7149 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
7150 read_leb128 (data, &bytes_read, 1));
7155 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
7159 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
7163 uvalue = read_leb128 (data, &bytes_read, 0);
7165 printf ("DW_OP_bregx: %lu %ld", uvalue,
7166 read_leb128 (data, &bytes_read, 1));
7170 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
7173 case DW_OP_deref_size:
7174 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
7176 case DW_OP_xderef_size:
7177 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
7180 printf ("DW_OP_nop");
7183 /* DWARF 2.1 extensions. */
7184 case DW_OP_push_object_address:
7185 printf ("DW_OP_push_object_address");
7188 printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2));
7192 printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4));
7196 printf ("DW_OP_calli");
7200 if (op >= DW_OP_lo_user
7201 && op <= DW_OP_hi_user)
7202 printf (_("(User defined location op)"));
7204 printf (_("(Unknown location op)"));
7205 /* No way to tell where the next op is, so just bail. */
7209 /* Separate the ops. */
7214 static const char * debug_loc_contents;
7215 static bfd_vma debug_loc_size;
7218 load_debug_loc (file)
7221 Elf32_Internal_Shdr * sec;
7224 /* If it is already loaded, do nothing. */
7225 if (debug_loc_contents != NULL)
7228 /* Locate the .debug_loc section. */
7229 for (i = 0, sec = section_headers;
7230 i < elf_header.e_shnum;
7232 if (strcmp (SECTION_NAME (sec), ".debug_loc") == 0)
7235 if (i == elf_header.e_shnum || sec->sh_size == 0)
7238 debug_loc_size = sec->sh_size;
7240 debug_loc_contents = ((char *)
7241 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7242 _("debug_loc section data")));
7248 if (debug_loc_contents == NULL)
7251 free ((char *) debug_loc_contents);
7252 debug_loc_contents = NULL;
7258 display_debug_loc (section, start, file)
7259 Elf32_Internal_Shdr * section;
7260 unsigned char * start;
7261 FILE * file ATTRIBUTE_UNUSED;
7263 unsigned char *section_end;
7264 unsigned long bytes;
7265 unsigned char *section_begin = start;
7268 addr = section->sh_addr;
7269 bytes = section->sh_size;
7270 section_end = start + bytes;
7273 printf (_("\nThe .debug_loc section is empty.\n"));
7276 printf (_("Contents of the .debug_loc section:\n\n"));
7277 printf (_("\n Offset Begin End Expression\n"));
7278 while (start < section_end)
7280 unsigned long begin;
7282 unsigned short length;
7283 unsigned long offset;
7285 offset = start - section_begin;
7289 /* Normally, the lists in the debug_loc section are related to a
7290 given compilation unit, and thus, we would use the
7291 pointer size of that compilation unit. However, since we are
7292 displaying it seperately here, we either have to store
7293 pointer sizes of all compilation units, or assume they don't
7294 change. We assume, like the debug_line display, that
7295 it doesn't change. */
7296 begin = byte_get (start, debug_line_pointer_size);
7297 start += debug_line_pointer_size;
7298 end = byte_get (start, debug_line_pointer_size);
7299 start += debug_line_pointer_size;
7301 if (begin == 0 && end == 0)
7307 length = byte_get (start, 2);
7310 printf (" %8.8lx %8.8lx %8.8lx (", offset, begin, end);
7311 decode_location_expression (start, debug_line_pointer_size, length);
7321 static const char * debug_str_contents;
7322 static bfd_vma debug_str_size;
7325 load_debug_str (file)
7328 Elf32_Internal_Shdr * sec;
7331 /* If it is already loaded, do nothing. */
7332 if (debug_str_contents != NULL)
7335 /* Locate the .debug_str section. */
7336 for (i = 0, sec = section_headers;
7337 i < elf_header.e_shnum;
7339 if (strcmp (SECTION_NAME (sec), ".debug_str") == 0)
7342 if (i == elf_header.e_shnum || sec->sh_size == 0)
7345 debug_str_size = sec->sh_size;
7347 debug_str_contents = ((char *)
7348 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7349 _("debug_str section data")));
7355 if (debug_str_contents == NULL)
7358 free ((char *) debug_str_contents);
7359 debug_str_contents = NULL;
7364 fetch_indirect_string (offset)
7365 unsigned long offset;
7367 if (debug_str_contents == NULL)
7368 return _("<no .debug_str section>");
7370 if (offset > debug_str_size)
7371 return _("<offset is too big>");
7373 return debug_str_contents + offset;
7378 display_debug_str (section, start, file)
7379 Elf32_Internal_Shdr * section;
7380 unsigned char * start;
7381 FILE * file ATTRIBUTE_UNUSED;
7383 unsigned long bytes;
7386 addr = section->sh_addr;
7387 bytes = section->sh_size;
7391 printf (_("\nThe .debug_str section is empty.\n"));
7395 printf (_("Contents of the .debug_str section:\n\n"));
7403 lbytes = (bytes > 16 ? 16 : bytes);
7405 printf (" 0x%8.8lx ", (unsigned long) addr);
7407 for (j = 0; j < 16; j++)
7410 printf ("%2.2x", start [j]);
7418 for (j = 0; j < lbytes; j++)
7421 if (k >= ' ' && k < 0x80)
7438 static unsigned char *
7439 read_and_display_attr_value (attribute, form, data, cu_offset, pointer_size)
7440 unsigned long attribute;
7442 unsigned char * data;
7443 unsigned long cu_offset;
7444 unsigned long pointer_size;
7446 unsigned long uvalue = 0;
7447 unsigned char * block_start = NULL;
7455 case DW_FORM_ref_addr:
7457 uvalue = byte_get (data, pointer_size);
7458 data += pointer_size;
7462 uvalue = byte_get (data, /* offset_size */ 4);
7463 data += /* offset_size */ 4;
7469 uvalue = byte_get (data ++, 1);
7474 uvalue = byte_get (data, 2);
7480 uvalue = byte_get (data, 4);
7485 uvalue = read_leb128 (data, & bytes_read, 1);
7489 case DW_FORM_ref_udata:
7491 uvalue = read_leb128 (data, & bytes_read, 0);
7495 case DW_FORM_indirect:
7496 form = read_leb128 (data, & bytes_read, 0);
7498 printf (" %s", get_FORM_name (form));
7499 return read_and_display_attr_value (attribute, form, data, cu_offset,
7505 case DW_FORM_ref_addr:
7506 printf (" <#%lx>", uvalue);
7512 case DW_FORM_ref_udata:
7513 printf (" <%lx>", uvalue + cu_offset);
7517 printf (" %#lx", uvalue);
7525 printf (" %ld", uvalue);
7530 uvalue = byte_get (data, 4);
7531 printf (" %lx", uvalue);
7532 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
7536 case DW_FORM_string:
7537 printf (" %s", data);
7538 data += strlen ((char *) data) + 1;
7542 uvalue = read_leb128 (data, & bytes_read, 0);
7543 block_start = data + bytes_read;
7544 data = display_block (block_start, uvalue);
7547 case DW_FORM_block1:
7548 uvalue = byte_get (data, 1);
7549 block_start = data + 1;
7550 data = display_block (block_start, uvalue);
7553 case DW_FORM_block2:
7554 uvalue = byte_get (data, 2);
7555 block_start = data + 2;
7556 data = display_block (block_start, uvalue);
7559 case DW_FORM_block4:
7560 uvalue = byte_get (data, 4);
7561 block_start = data + 4;
7562 data = display_block (block_start, uvalue);
7566 printf (_(" (indirect string, offset: 0x%lx): "), uvalue);
7567 printf (fetch_indirect_string (uvalue));
7570 case DW_FORM_indirect:
7571 /* Handled above. */
7575 warn (_("Unrecognized form: %d\n"), form);
7579 /* For some attributes we can display futher information. */
7588 case DW_INL_not_inlined: printf (_("(not inlined)")); break;
7589 case DW_INL_inlined: printf (_("(inlined)")); break;
7590 case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
7591 case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break;
7592 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break;
7596 case DW_AT_language:
7599 case DW_LANG_C: printf ("(non-ANSI C)"); break;
7600 case DW_LANG_C89: printf ("(ANSI C)"); break;
7601 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
7602 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
7603 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
7604 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
7605 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
7606 case DW_LANG_Ada83: printf ("(Ada)"); break;
7607 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
7608 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
7609 /* DWARF 2.1 values. */
7610 case DW_LANG_C99: printf ("(ANSI C99)"); break;
7611 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
7612 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
7613 /* MIPS extension. */
7614 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
7615 default: printf ("(Unknown: %lx)", uvalue); break;
7619 case DW_AT_encoding:
7622 case DW_ATE_void: printf ("(void)"); break;
7623 case DW_ATE_address: printf ("(machine address)"); break;
7624 case DW_ATE_boolean: printf ("(boolean)"); break;
7625 case DW_ATE_complex_float: printf ("(complex float)"); break;
7626 case DW_ATE_float: printf ("(float)"); break;
7627 case DW_ATE_signed: printf ("(signed)"); break;
7628 case DW_ATE_signed_char: printf ("(signed char)"); break;
7629 case DW_ATE_unsigned: printf ("(unsigned)"); break;
7630 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
7631 /* DWARF 2.1 value. */
7632 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
7634 if (uvalue >= DW_ATE_lo_user
7635 && uvalue <= DW_ATE_hi_user)
7636 printf ("(user defined type)");
7638 printf ("(unknown type)");
7643 case DW_AT_accessibility:
7646 case DW_ACCESS_public: printf ("(public)"); break;
7647 case DW_ACCESS_protected: printf ("(protected)"); break;
7648 case DW_ACCESS_private: printf ("(private)"); break;
7649 default: printf ("(unknown accessibility)"); break;
7653 case DW_AT_visibility:
7656 case DW_VIS_local: printf ("(local)"); break;
7657 case DW_VIS_exported: printf ("(exported)"); break;
7658 case DW_VIS_qualified: printf ("(qualified)"); break;
7659 default: printf ("(unknown visibility)"); break;
7663 case DW_AT_virtuality:
7666 case DW_VIRTUALITY_none: printf ("(none)"); break;
7667 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
7668 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
7669 default: printf ("(unknown virtuality)"); break;
7673 case DW_AT_identifier_case:
7676 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
7677 case DW_ID_up_case: printf ("(up_case)"); break;
7678 case DW_ID_down_case: printf ("(down_case)"); break;
7679 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
7680 default: printf ("(unknown case)"); break;
7684 case DW_AT_calling_convention:
7687 case DW_CC_normal: printf ("(normal)"); break;
7688 case DW_CC_program: printf ("(program)"); break;
7689 case DW_CC_nocall: printf ("(nocall)"); break;
7691 if (uvalue >= DW_CC_lo_user
7692 && uvalue <= DW_CC_hi_user)
7693 printf ("(user defined)");
7695 printf ("(unknown convention)");
7699 case DW_AT_ordering:
7702 case -1: printf ("(undefined)"); break;
7703 case 0: printf ("(row major)"); break;
7704 case 1: printf ("(column major)"); break;
7708 case DW_AT_frame_base:
7709 case DW_AT_location:
7710 case DW_AT_data_member_location:
7711 case DW_AT_vtable_elem_location:
7712 case DW_AT_allocated:
7713 case DW_AT_associated:
7714 case DW_AT_data_location:
7716 case DW_AT_upper_bound:
7717 case DW_AT_lower_bound:
7721 decode_location_expression (block_start, pointer_size, uvalue);
7724 else if (form == DW_FORM_data4)
7727 printf ("location list");
7739 static unsigned char *
7740 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
7741 unsigned long attribute;
7743 unsigned char * data;
7744 unsigned long cu_offset;
7745 unsigned long pointer_size;
7747 printf (" %-18s:", get_AT_name (attribute));
7748 data = read_and_display_attr_value (attribute, form, data, cu_offset,
7755 display_debug_info (section, start, file)
7756 Elf32_Internal_Shdr * section;
7757 unsigned char * start;
7760 unsigned char * end = start + section->sh_size;
7761 unsigned char * section_begin = start;
7763 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7765 load_debug_str (file);
7766 load_debug_loc (file);
7770 DWARF2_External_CompUnit * external;
7771 DWARF2_Internal_CompUnit compunit;
7772 Elf32_Internal_Shdr * relsec;
7773 unsigned char * tags;
7776 unsigned long cu_offset;
7778 external = (DWARF2_External_CompUnit *) start;
7780 compunit.cu_length = BYTE_GET (external->cu_length);
7781 compunit.cu_version = BYTE_GET (external->cu_version);
7782 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
7783 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
7785 if (compunit.cu_length == 0xffffffff)
7787 warn (_("64-bit DWARF debug info is not supported yet.\n"));
7791 /* Check for RELA relocations in the abbrev_offset address, and
7793 for (relsec = section_headers;
7794 relsec < section_headers + elf_header.e_shnum;
7797 unsigned long nrelas;
7798 Elf_Internal_Rela *rela, *rp;
7799 Elf32_Internal_Shdr *symsec;
7800 Elf_Internal_Sym *symtab;
7801 Elf_Internal_Sym *sym;
7803 if (relsec->sh_type != SHT_RELA
7804 || SECTION_HEADER (relsec->sh_info) != section)
7807 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7811 symsec = SECTION_HEADER (relsec->sh_link);
7812 symtab = GET_ELF_SYMBOLS (file, symsec);
7814 for (rp = rela; rp < rela + nrelas; ++rp)
7817 != (bfd_vma) ((unsigned char *) &external->cu_abbrev_offset
7823 sym = symtab + ELF32_R_SYM (rp->r_info);
7825 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
7827 warn (_("Skipping unexpected symbol type %u\n"),
7828 ELF32_ST_TYPE (sym->st_info));
7834 sym = symtab + ELF64_R_SYM (rp->r_info);
7836 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
7838 warn (_("Skipping unexpected symbol type %u\n"),
7839 ELF64_ST_TYPE (sym->st_info));
7844 compunit.cu_abbrev_offset += rp->r_addend;
7852 tags = start + sizeof (* external);
7853 cu_offset = start - section_begin;
7854 start += compunit.cu_length + sizeof (external->cu_length);
7856 printf (_(" Compilation Unit @ %lx:\n"), cu_offset);
7857 printf (_(" Length: %ld\n"), compunit.cu_length);
7858 printf (_(" Version: %d\n"), compunit.cu_version);
7859 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
7860 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
7862 if (compunit.cu_version != 2)
7864 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
7870 /* Read in the abbrevs used by this compilation unit. */
7873 Elf32_Internal_Shdr * sec;
7874 unsigned char * begin;
7876 /* Locate the .debug_abbrev section and process it. */
7877 for (i = 0, sec = section_headers;
7878 i < elf_header.e_shnum;
7880 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
7883 if (i == elf_header.e_shnum || sec->sh_size == 0)
7885 warn (_("Unable to locate .debug_abbrev section!\n"));
7889 begin = ((unsigned char *)
7890 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7891 _("debug_abbrev section data")));
7895 process_abbrev_section (begin + compunit.cu_abbrev_offset,
7896 begin + sec->sh_size);
7902 while (tags < start)
7905 unsigned long abbrev_number;
7906 abbrev_entry * entry;
7909 abbrev_number = read_leb128 (tags, & bytes_read, 0);
7912 /* A null DIE marks the end of a list of children. */
7913 if (abbrev_number == 0)
7919 /* Scan through the abbreviation list until we reach the
7921 for (entry = first_abbrev;
7922 entry && entry->entry != abbrev_number;
7923 entry = entry->next)
7928 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
7933 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
7935 (unsigned long) (tags - section_begin - bytes_read),
7937 get_TAG_name (entry->tag));
7939 for (attr = entry->first_attr; attr; attr = attr->next)
7940 tags = read_and_display_attr (attr->attribute,
7943 compunit.cu_pointer_size);
7945 if (entry->children)
7959 display_debug_aranges (section, start, file)
7960 Elf32_Internal_Shdr * section;
7961 unsigned char * start;
7962 FILE * file ATTRIBUTE_UNUSED;
7964 unsigned char * end = start + section->sh_size;
7966 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7970 DWARF2_External_ARange * external;
7971 DWARF2_Internal_ARange arange;
7972 unsigned char * ranges;
7973 unsigned long length;
7974 unsigned long address;
7977 external = (DWARF2_External_ARange *) start;
7979 arange.ar_length = BYTE_GET (external->ar_length);
7980 arange.ar_version = BYTE_GET (external->ar_version);
7981 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
7982 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
7983 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
7985 if (arange.ar_length == 0xffffffff)
7987 warn (_("64-bit DWARF aranges are not supported yet.\n"));
7991 if (arange.ar_version != 2)
7993 warn (_("Only DWARF 2 aranges are currently supported.\n"));
7997 printf (_(" Length: %ld\n"), arange.ar_length);
7998 printf (_(" Version: %d\n"), arange.ar_version);
7999 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
8000 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
8001 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
8003 printf (_("\n Address Length\n"));
8005 ranges = start + sizeof (* external);
8007 /* Must pad to an alignment boundary that is twice the pointer size. */
8008 excess = sizeof (* external) % (2 * arange.ar_pointer_size);
8010 ranges += (2 * arange.ar_pointer_size) - excess;
8014 address = byte_get (ranges, arange.ar_pointer_size);
8016 ranges += arange.ar_pointer_size;
8018 length = byte_get (ranges, arange.ar_pointer_size);
8020 ranges += arange.ar_pointer_size;
8022 /* A pair of zeros marks the end of the list. */
8023 if (address == 0 && length == 0)
8026 printf (" %8.8lx %lu\n", address, length);
8029 start += arange.ar_length + sizeof (external->ar_length);
8037 typedef struct Frame_Chunk
8039 struct Frame_Chunk * next;
8040 unsigned char * chunk_start;
8042 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
8043 short int * col_type;
8045 char * augmentation;
8046 unsigned int code_factor;
8048 unsigned long pc_begin;
8049 unsigned long pc_range;
8053 unsigned char fde_encoding;
8057 /* A marker for a col_type that means this column was never referenced
8058 in the frame info. */
8059 #define DW_CFA_unreferenced (-1)
8061 static void frame_need_space PARAMS ((Frame_Chunk *, int));
8062 static void frame_display_row PARAMS ((Frame_Chunk *, int *, int *));
8063 static int size_of_encoded_value PARAMS ((int));
8066 frame_need_space (fc, reg)
8070 int prev = fc->ncols;
8072 if (reg < fc->ncols)
8075 fc->ncols = reg + 1;
8076 fc->col_type = (short int *) xrealloc (fc->col_type,
8077 fc->ncols * sizeof (short int));
8078 fc->col_offset = (int *) xrealloc (fc->col_offset,
8079 fc->ncols * sizeof (int));
8081 while (prev < fc->ncols)
8083 fc->col_type[prev] = DW_CFA_unreferenced;
8084 fc->col_offset[prev] = 0;
8090 frame_display_row (fc, need_col_headers, max_regs)
8092 int * need_col_headers;
8098 if (* max_regs < fc->ncols)
8099 * max_regs = fc->ncols;
8101 if (* need_col_headers)
8103 * need_col_headers = 0;
8105 printf (" LOC CFA ");
8107 for (r = 0; r < * max_regs; r++)
8108 if (fc->col_type[r] != DW_CFA_unreferenced)
8113 printf ("r%-4d", r);
8119 printf ("%08lx ", fc->pc_begin);
8120 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
8121 printf ("%-8s ", tmp);
8123 for (r = 0; r < fc->ncols; r++)
8125 if (fc->col_type[r] != DW_CFA_unreferenced)
8127 switch (fc->col_type[r])
8129 case DW_CFA_undefined:
8132 case DW_CFA_same_value:
8136 sprintf (tmp, "c%+d", fc->col_offset[r]);
8138 case DW_CFA_register:
8139 sprintf (tmp, "r%d", fc->col_offset[r]);
8142 strcpy (tmp, "n/a");
8145 printf ("%-5s", tmp);
8152 size_of_encoded_value (encoding)
8155 switch (encoding & 0x7)
8158 case 0: return is_32bit_elf ? 4 : 8;
8165 #define GET(N) byte_get (start, N); start += N
8166 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
8167 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
8170 display_debug_frames (section, start, file)
8171 Elf32_Internal_Shdr * section;
8172 unsigned char * start;
8173 FILE * file ATTRIBUTE_UNUSED;
8175 unsigned char * end = start + section->sh_size;
8176 unsigned char * section_start = start;
8177 Frame_Chunk * chunks = 0;
8178 Frame_Chunk * remembered_state = 0;
8180 int is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
8183 int addr_size = is_32bit_elf ? 4 : 8;
8185 printf (_("The section %s contains:\n"), SECTION_NAME (section));
8189 unsigned char * saved_start;
8190 unsigned char * block_end;
8191 unsigned long length;
8192 unsigned long cie_id;
8195 int need_col_headers = 1;
8196 unsigned char * augmentation_data = NULL;
8197 unsigned long augmentation_data_len = 0;
8198 int encoded_ptr_size = addr_size;
8200 saved_start = start;
8201 length = byte_get (start, 4); start += 4;
8206 if (length == 0xffffffff)
8208 warn (_("64-bit DWARF format frames are not supported yet.\n"));
8212 block_end = saved_start + length + 4;
8213 cie_id = byte_get (start, 4); start += 4;
8215 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
8219 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8220 memset (fc, 0, sizeof (Frame_Chunk));
8224 fc->chunk_start = saved_start;
8226 fc->col_type = (short int *) xmalloc (sizeof (short int));
8227 fc->col_offset = (int *) xmalloc (sizeof (int));
8228 frame_need_space (fc, max_regs-1);
8232 fc->augmentation = start;
8233 start = strchr (start, '\0') + 1;
8235 if (fc->augmentation[0] == 'z')
8237 fc->code_factor = LEB ();
8238 fc->data_factor = SLEB ();
8239 fc->ra = byte_get (start, 1); start += 1;
8240 augmentation_data_len = LEB ();
8241 augmentation_data = start;
8242 start += augmentation_data_len;
8244 else if (strcmp (fc->augmentation, "eh") == 0)
8247 fc->code_factor = LEB ();
8248 fc->data_factor = SLEB ();
8249 fc->ra = byte_get (start, 1); start += 1;
8253 fc->code_factor = LEB ();
8254 fc->data_factor = SLEB ();
8255 fc->ra = byte_get (start, 1); start += 1;
8259 if (do_debug_frames_interp)
8260 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
8261 (unsigned long)(saved_start - section_start), length, cie_id,
8262 fc->augmentation, fc->code_factor, fc->data_factor,
8266 printf ("\n%08lx %08lx %08lx CIE\n",
8267 (unsigned long)(saved_start - section_start), length, cie_id);
8268 printf (" Version: %d\n", version);
8269 printf (" Augmentation: \"%s\"\n", fc->augmentation);
8270 printf (" Code alignment factor: %u\n", fc->code_factor);
8271 printf (" Data alignment factor: %d\n", fc->data_factor);
8272 printf (" Return address column: %d\n", fc->ra);
8274 if (augmentation_data_len)
8277 printf (" Augmentation data: ");
8278 for (i = 0; i < augmentation_data_len; ++i)
8279 printf (" %02x", augmentation_data[i]);
8285 if (augmentation_data_len)
8287 unsigned char *p, *q;
8288 p = fc->augmentation + 1;
8289 q = augmentation_data;
8296 q += 1 + size_of_encoded_value (*q);
8298 fc->fde_encoding = *q++;
8304 if (fc->fde_encoding)
8305 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8308 frame_need_space (fc, fc->ra);
8312 unsigned char * look_for;
8313 static Frame_Chunk fde_fc;
8316 memset (fc, 0, sizeof (Frame_Chunk));
8318 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
8320 for (cie = chunks; cie ; cie = cie->next)
8321 if (cie->chunk_start == look_for)
8326 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
8327 cie_id, saved_start);
8330 fc->col_type = (short int *) xmalloc (sizeof (short int));
8331 fc->col_offset = (int *) xmalloc (sizeof (int));
8332 frame_need_space (fc, max_regs - 1);
8334 fc->augmentation = "";
8335 fc->fde_encoding = 0;
8339 fc->ncols = cie->ncols;
8340 fc->col_type = (short int *) xmalloc (fc->ncols * sizeof (short int));
8341 fc->col_offset = (int *) xmalloc (fc->ncols * sizeof (int));
8342 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
8343 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
8344 fc->augmentation = cie->augmentation;
8345 fc->code_factor = cie->code_factor;
8346 fc->data_factor = cie->data_factor;
8347 fc->cfa_reg = cie->cfa_reg;
8348 fc->cfa_offset = cie->cfa_offset;
8350 frame_need_space (fc, max_regs-1);
8351 fc->fde_encoding = cie->fde_encoding;
8354 if (fc->fde_encoding)
8355 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8357 fc->pc_begin = byte_get (start, encoded_ptr_size);
8358 start += encoded_ptr_size;
8359 fc->pc_range = byte_get (start, encoded_ptr_size);
8360 start += encoded_ptr_size;
8362 if (cie->augmentation[0] == 'z')
8364 augmentation_data_len = LEB ();
8365 augmentation_data = start;
8366 start += augmentation_data_len;
8369 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
8370 (unsigned long)(saved_start - section_start), length, cie_id,
8371 (unsigned long)(cie->chunk_start - section_start),
8372 fc->pc_begin, fc->pc_begin + fc->pc_range);
8373 if (! do_debug_frames_interp && augmentation_data_len)
8376 printf (" Augmentation data: ");
8377 for (i = 0; i < augmentation_data_len; ++i)
8378 printf (" %02x", augmentation_data[i]);
8384 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8385 about to interpret instructions for the chunk. */
8387 if (do_debug_frames_interp)
8389 /* Start by making a pass over the chunk, allocating storage
8390 and taking note of what registers are used. */
8391 unsigned char * tmp = start;
8393 while (start < block_end)
8403 /* Warning: if you add any more cases to this switch, be
8404 sure to add them to the corresponding switch below. */
8407 case DW_CFA_advance_loc:
8411 frame_need_space (fc, opa);
8412 fc->col_type[opa] = DW_CFA_undefined;
8414 case DW_CFA_restore:
8415 frame_need_space (fc, opa);
8416 fc->col_type[opa] = DW_CFA_undefined;
8418 case DW_CFA_set_loc:
8419 start += encoded_ptr_size;
8421 case DW_CFA_advance_loc1:
8424 case DW_CFA_advance_loc2:
8427 case DW_CFA_advance_loc4:
8430 case DW_CFA_offset_extended:
8431 reg = LEB (); LEB ();
8432 frame_need_space (fc, reg);
8433 fc->col_type[reg] = DW_CFA_undefined;
8435 case DW_CFA_restore_extended:
8437 frame_need_space (fc, reg);
8438 fc->col_type[reg] = DW_CFA_undefined;
8440 case DW_CFA_undefined:
8442 frame_need_space (fc, reg);
8443 fc->col_type[reg] = DW_CFA_undefined;
8445 case DW_CFA_same_value:
8447 frame_need_space (fc, reg);
8448 fc->col_type[reg] = DW_CFA_undefined;
8450 case DW_CFA_register:
8451 reg = LEB (); LEB ();
8452 frame_need_space (fc, reg);
8453 fc->col_type[reg] = DW_CFA_undefined;
8455 case DW_CFA_def_cfa:
8458 case DW_CFA_def_cfa_register:
8461 case DW_CFA_def_cfa_offset:
8464 #ifndef DW_CFA_GNU_args_size
8465 #define DW_CFA_GNU_args_size 0x2e
8467 case DW_CFA_GNU_args_size:
8470 #ifndef DW_CFA_GNU_negative_offset_extended
8471 #define DW_CFA_GNU_negative_offset_extended 0x2f
8473 case DW_CFA_GNU_negative_offset_extended:
8474 reg = LEB (); LEB ();
8475 frame_need_space (fc, reg);
8476 fc->col_type[reg] = DW_CFA_undefined;
8485 /* Now we know what registers are used, make a second pass over
8486 the chunk, this time actually printing out the info. */
8488 while (start < block_end)
8491 unsigned long ul, reg, roffs;
8500 /* Warning: if you add any more cases to this switch, be
8501 sure to add them to the corresponding switch above. */
8504 case DW_CFA_advance_loc:
8505 if (do_debug_frames_interp)
8506 frame_display_row (fc, &need_col_headers, &max_regs);
8508 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8509 opa * fc->code_factor,
8510 fc->pc_begin + opa * fc->code_factor);
8511 fc->pc_begin += opa * fc->code_factor;
8516 if (! do_debug_frames_interp)
8517 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8518 opa, roffs * fc->data_factor);
8519 fc->col_type[opa] = DW_CFA_offset;
8520 fc->col_offset[opa] = roffs * fc->data_factor;
8523 case DW_CFA_restore:
8524 if (! do_debug_frames_interp)
8525 printf (" DW_CFA_restore: r%d\n", opa);
8526 fc->col_type[opa] = cie->col_type[opa];
8527 fc->col_offset[opa] = cie->col_offset[opa];
8530 case DW_CFA_set_loc:
8531 vma = byte_get (start, encoded_ptr_size);
8532 start += encoded_ptr_size;
8533 if (do_debug_frames_interp)
8534 frame_display_row (fc, &need_col_headers, &max_regs);
8536 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
8540 case DW_CFA_advance_loc1:
8541 ofs = byte_get (start, 1); start += 1;
8542 if (do_debug_frames_interp)
8543 frame_display_row (fc, &need_col_headers, &max_regs);
8545 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8546 ofs * fc->code_factor,
8547 fc->pc_begin + ofs * fc->code_factor);
8548 fc->pc_begin += ofs * fc->code_factor;
8551 case DW_CFA_advance_loc2:
8552 ofs = byte_get (start, 2); start += 2;
8553 if (do_debug_frames_interp)
8554 frame_display_row (fc, &need_col_headers, &max_regs);
8556 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8557 ofs * fc->code_factor,
8558 fc->pc_begin + ofs * fc->code_factor);
8559 fc->pc_begin += ofs * fc->code_factor;
8562 case DW_CFA_advance_loc4:
8563 ofs = byte_get (start, 4); start += 4;
8564 if (do_debug_frames_interp)
8565 frame_display_row (fc, &need_col_headers, &max_regs);
8567 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8568 ofs * fc->code_factor,
8569 fc->pc_begin + ofs * fc->code_factor);
8570 fc->pc_begin += ofs * fc->code_factor;
8573 case DW_CFA_offset_extended:
8576 if (! do_debug_frames_interp)
8577 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8578 reg, roffs * fc->data_factor);
8579 fc->col_type[reg] = DW_CFA_offset;
8580 fc->col_offset[reg] = roffs * fc->data_factor;
8583 case DW_CFA_restore_extended:
8585 if (! do_debug_frames_interp)
8586 printf (" DW_CFA_restore_extended: r%ld\n", reg);
8587 fc->col_type[reg] = cie->col_type[reg];
8588 fc->col_offset[reg] = cie->col_offset[reg];
8591 case DW_CFA_undefined:
8593 if (! do_debug_frames_interp)
8594 printf (" DW_CFA_undefined: r%ld\n", reg);
8595 fc->col_type[reg] = DW_CFA_undefined;
8596 fc->col_offset[reg] = 0;
8599 case DW_CFA_same_value:
8601 if (! do_debug_frames_interp)
8602 printf (" DW_CFA_same_value: r%ld\n", reg);
8603 fc->col_type[reg] = DW_CFA_same_value;
8604 fc->col_offset[reg] = 0;
8607 case DW_CFA_register:
8610 if (! do_debug_frames_interp)
8611 printf (" DW_CFA_register: r%ld\n", reg);
8612 fc->col_type[reg] = DW_CFA_register;
8613 fc->col_offset[reg] = roffs;
8616 case DW_CFA_remember_state:
8617 if (! do_debug_frames_interp)
8618 printf (" DW_CFA_remember_state\n");
8619 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8620 rs->ncols = fc->ncols;
8621 rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
8622 rs->col_offset = (int *) xmalloc (rs->ncols * sizeof (int));
8623 memcpy (rs->col_type, fc->col_type, rs->ncols);
8624 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
8625 rs->next = remembered_state;
8626 remembered_state = rs;
8629 case DW_CFA_restore_state:
8630 if (! do_debug_frames_interp)
8631 printf (" DW_CFA_restore_state\n");
8632 rs = remembered_state;
8633 remembered_state = rs->next;
8634 frame_need_space (fc, rs->ncols-1);
8635 memcpy (fc->col_type, rs->col_type, rs->ncols);
8636 memcpy (fc->col_offset, rs->col_offset, rs->ncols * sizeof (int));
8637 free (rs->col_type);
8638 free (rs->col_offset);
8642 case DW_CFA_def_cfa:
8643 fc->cfa_reg = LEB ();
8644 fc->cfa_offset = LEB ();
8645 if (! do_debug_frames_interp)
8646 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
8647 fc->cfa_reg, fc->cfa_offset);
8650 case DW_CFA_def_cfa_register:
8651 fc->cfa_reg = LEB ();
8652 if (! do_debug_frames_interp)
8653 printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
8656 case DW_CFA_def_cfa_offset:
8657 fc->cfa_offset = LEB ();
8658 if (! do_debug_frames_interp)
8659 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
8663 if (! do_debug_frames_interp)
8664 printf (" DW_CFA_nop\n");
8667 #ifndef DW_CFA_GNU_window_save
8668 #define DW_CFA_GNU_window_save 0x2d
8670 case DW_CFA_GNU_window_save:
8671 if (! do_debug_frames_interp)
8672 printf (" DW_CFA_GNU_window_save\n");
8675 case DW_CFA_GNU_args_size:
8677 if (! do_debug_frames_interp)
8678 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
8681 case DW_CFA_GNU_negative_offset_extended:
8684 frame_need_space (fc, reg);
8685 if (! do_debug_frames_interp)
8686 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
8687 reg, l * fc->data_factor);
8688 fc->col_type[reg] = DW_CFA_offset;
8689 fc->col_offset[reg] = l * fc->data_factor;
8693 fprintf (stderr, "unsupported or unknown DW_CFA_%d\n", op);
8698 if (do_debug_frames_interp)
8699 frame_display_row (fc, &need_col_headers, &max_regs);
8714 display_debug_not_supported (section, start, file)
8715 Elf32_Internal_Shdr * section;
8716 unsigned char * start ATTRIBUTE_UNUSED;
8717 FILE * file ATTRIBUTE_UNUSED;
8719 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
8720 SECTION_NAME (section));
8725 /* Pre-scan the .debug_info section to record the size of address.
8726 When dumping the .debug_line, we use that size information, assuming
8727 that all compilation units have the same address size. */
8729 prescan_debug_info (section, start, file)
8730 Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
8731 unsigned char * start;
8732 FILE * file ATTRIBUTE_UNUSED;
8734 DWARF2_External_CompUnit * external;
8736 external = (DWARF2_External_CompUnit *) start;
8738 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
8742 /* A structure containing the name of a debug section and a pointer
8743 to a function that can decode it. The third field is a prescan
8744 function to be run over the section before displaying any of the
8748 const char * const name;
8749 int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8750 int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8754 { ".debug_abbrev", display_debug_abbrev, NULL },
8755 { ".debug_aranges", display_debug_aranges, NULL },
8756 { ".debug_frame", display_debug_frames, NULL },
8757 { ".debug_info", display_debug_info, prescan_debug_info },
8758 { ".debug_line", display_debug_lines, NULL },
8759 { ".debug_pubnames", display_debug_pubnames, NULL },
8760 { ".eh_frame", display_debug_frames, NULL },
8761 { ".debug_macinfo", display_debug_macinfo, NULL },
8762 { ".debug_str", display_debug_str, NULL },
8763 { ".debug_loc", display_debug_loc, NULL },
8764 { ".debug_pubtypes", display_debug_not_supported, NULL },
8765 { ".debug_ranges", display_debug_not_supported, NULL },
8766 { ".debug_static_func", display_debug_not_supported, NULL },
8767 { ".debug_static_vars", display_debug_not_supported, NULL },
8768 { ".debug_types", display_debug_not_supported, NULL },
8769 { ".debug_weaknames", display_debug_not_supported, NULL }
8773 display_debug_section (section, file)
8774 Elf32_Internal_Shdr * section;
8777 char * name = SECTION_NAME (section);
8778 bfd_size_type length;
8779 unsigned char * start;
8782 length = section->sh_size;
8785 printf (_("\nSection '%s' has no debugging data.\n"), name);
8789 start = (unsigned char *) get_data (NULL, file, section->sh_offset, length,
8790 _("debug section data"));
8794 /* See if we know how to display the contents of this section. */
8795 if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
8796 name = ".debug_info";
8798 for (i = NUM_ELEM (debug_displays); i--;)
8799 if (strcmp (debug_displays[i].name, name) == 0)
8801 debug_displays[i].display (section, start, file);
8806 printf (_("Unrecognized debug section: %s\n"), name);
8810 /* If we loaded in the abbrev section at some point,
8811 we must release it here. */
8818 process_section_contents (file)
8821 Elf32_Internal_Shdr * section;
8827 /* Pre-scan the debug sections to find some debug information not
8828 present in some of them. For the .debug_line, we must find out the
8829 size of address (specified in .debug_info and .debug_aranges). */
8830 for (i = 0, section = section_headers;
8831 i < elf_header.e_shnum && i < num_dump_sects;
8834 char * name = SECTION_NAME (section);
8837 if (section->sh_size == 0)
8840 /* See if there is some pre-scan operation for this section. */
8841 for (j = NUM_ELEM (debug_displays); j--;)
8842 if (strcmp (debug_displays[j].name, name) == 0)
8844 if (debug_displays[j].prescan != NULL)
8846 bfd_size_type length;
8847 unsigned char * start;
8849 length = section->sh_size;
8850 start = ((unsigned char *)
8851 get_data (NULL, file, section->sh_offset, length,
8852 _("debug section data")));
8856 debug_displays[j].prescan (section, start, file);
8864 for (i = 0, section = section_headers;
8865 i < elf_header.e_shnum && i < num_dump_sects;
8868 #ifdef SUPPORT_DISASSEMBLY
8869 if (dump_sects[i] & DISASS_DUMP)
8870 disassemble_section (section, file);
8872 if (dump_sects[i] & HEX_DUMP)
8873 dump_section (section, file);
8875 if (dump_sects[i] & DEBUG_DUMP)
8876 display_debug_section (section, file);
8879 if (i < num_dump_sects)
8880 warn (_("Some sections were not dumped because they do not exist!\n"));
8886 process_mips_fpe_exception (mask)
8892 if (mask & OEX_FPU_INEX)
8893 fputs ("INEX", stdout), first = 0;
8894 if (mask & OEX_FPU_UFLO)
8895 printf ("%sUFLO", first ? "" : "|"), first = 0;
8896 if (mask & OEX_FPU_OFLO)
8897 printf ("%sOFLO", first ? "" : "|"), first = 0;
8898 if (mask & OEX_FPU_DIV0)
8899 printf ("%sDIV0", first ? "" : "|"), first = 0;
8900 if (mask & OEX_FPU_INVAL)
8901 printf ("%sINVAL", first ? "" : "|");
8904 fputs ("0", stdout);
8908 process_mips_specific (file)
8911 Elf_Internal_Dyn * entry;
8912 size_t liblist_offset = 0;
8913 size_t liblistno = 0;
8914 size_t conflictsno = 0;
8915 size_t options_offset = 0;
8916 size_t conflicts_offset = 0;
8918 /* We have a lot of special sections. Thanks SGI! */
8919 if (dynamic_segment == NULL)
8920 /* No information available. */
8923 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
8924 switch (entry->d_tag)
8926 case DT_MIPS_LIBLIST:
8927 liblist_offset = entry->d_un.d_val - loadaddr;
8929 case DT_MIPS_LIBLISTNO:
8930 liblistno = entry->d_un.d_val;
8932 case DT_MIPS_OPTIONS:
8933 options_offset = entry->d_un.d_val - loadaddr;
8935 case DT_MIPS_CONFLICT:
8936 conflicts_offset = entry->d_un.d_val - loadaddr;
8938 case DT_MIPS_CONFLICTNO:
8939 conflictsno = entry->d_un.d_val;
8945 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
8947 Elf32_External_Lib * elib;
8950 elib = ((Elf32_External_Lib *)
8951 get_data (NULL, file, liblist_offset,
8952 liblistno * sizeof (Elf32_External_Lib),
8956 printf ("\nSection '.liblist' contains %lu entries:\n",
8957 (unsigned long) liblistno);
8958 fputs (" Library Time Stamp Checksum Version Flags\n",
8961 for (cnt = 0; cnt < liblistno; ++cnt)
8968 liblist.l_name = BYTE_GET (elib[cnt].l_name);
8969 time = BYTE_GET (elib[cnt].l_time_stamp);
8970 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
8971 liblist.l_version = BYTE_GET (elib[cnt].l_version);
8972 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
8974 tmp = gmtime (&time);
8975 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
8976 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8977 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8979 printf ("%3lu: ", (unsigned long) cnt);
8980 print_symbol (20, dynamic_strings + liblist.l_name);
8981 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
8984 if (liblist.l_flags == 0)
8995 { " EXACT_MATCH", LL_EXACT_MATCH },
8996 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
8997 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
8998 { " EXPORTS", LL_EXPORTS },
8999 { " DELAY_LOAD", LL_DELAY_LOAD },
9000 { " DELTA", LL_DELTA }
9002 int flags = liblist.l_flags;
9006 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
9008 if ((flags & l_flags_vals[fcnt].bit) != 0)
9010 fputs (l_flags_vals[fcnt].name, stdout);
9011 flags ^= l_flags_vals[fcnt].bit;
9014 printf (" %#x", (unsigned int) flags);
9024 if (options_offset != 0)
9026 Elf_External_Options * eopt;
9027 Elf_Internal_Shdr * sect = section_headers;
9028 Elf_Internal_Options * iopt;
9029 Elf_Internal_Options * option;
9033 /* Find the section header so that we get the size. */
9034 while (sect->sh_type != SHT_MIPS_OPTIONS)
9037 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset,
9038 sect->sh_size, _("options"));
9041 iopt = ((Elf_Internal_Options *)
9042 malloc ((sect->sh_size / sizeof (eopt)) * sizeof (* iopt)));
9045 error (_("Out of memory"));
9052 while (offset < sect->sh_size)
9054 Elf_External_Options * eoption;
9056 eoption = (Elf_External_Options *) ((char *) eopt + offset);
9058 option->kind = BYTE_GET (eoption->kind);
9059 option->size = BYTE_GET (eoption->size);
9060 option->section = BYTE_GET (eoption->section);
9061 option->info = BYTE_GET (eoption->info);
9063 offset += option->size;
9069 printf (_("\nSection '%s' contains %d entries:\n"),
9070 SECTION_NAME (sect), cnt);
9078 switch (option->kind)
9081 /* This shouldn't happen. */
9082 printf (" NULL %d %lx", option->section, option->info);
9085 printf (" REGINFO ");
9086 if (elf_header.e_machine == EM_MIPS)
9089 Elf32_External_RegInfo * ereg;
9090 Elf32_RegInfo reginfo;
9092 ereg = (Elf32_External_RegInfo *) (option + 1);
9093 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
9094 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
9095 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
9096 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
9097 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
9098 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
9100 printf ("GPR %08lx GP 0x%lx\n",
9102 (unsigned long) reginfo.ri_gp_value);
9103 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9104 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
9105 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
9110 Elf64_External_RegInfo * ereg;
9111 Elf64_Internal_RegInfo reginfo;
9113 ereg = (Elf64_External_RegInfo *) (option + 1);
9114 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
9115 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
9116 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
9117 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
9118 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
9119 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
9121 printf ("GPR %08lx GP 0x",
9122 reginfo.ri_gprmask);
9123 printf_vma (reginfo.ri_gp_value);
9126 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9127 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
9128 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
9132 case ODK_EXCEPTIONS:
9133 fputs (" EXCEPTIONS fpe_min(", stdout);
9134 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
9135 fputs (") fpe_max(", stdout);
9136 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
9137 fputs (")", stdout);
9139 if (option->info & OEX_PAGE0)
9140 fputs (" PAGE0", stdout);
9141 if (option->info & OEX_SMM)
9142 fputs (" SMM", stdout);
9143 if (option->info & OEX_FPDBUG)
9144 fputs (" FPDBUG", stdout);
9145 if (option->info & OEX_DISMISS)
9146 fputs (" DISMISS", stdout);
9149 fputs (" PAD ", stdout);
9150 if (option->info & OPAD_PREFIX)
9151 fputs (" PREFIX", stdout);
9152 if (option->info & OPAD_POSTFIX)
9153 fputs (" POSTFIX", stdout);
9154 if (option->info & OPAD_SYMBOL)
9155 fputs (" SYMBOL", stdout);
9158 fputs (" HWPATCH ", stdout);
9159 if (option->info & OHW_R4KEOP)
9160 fputs (" R4KEOP", stdout);
9161 if (option->info & OHW_R8KPFETCH)
9162 fputs (" R8KPFETCH", stdout);
9163 if (option->info & OHW_R5KEOP)
9164 fputs (" R5KEOP", stdout);
9165 if (option->info & OHW_R5KCVTL)
9166 fputs (" R5KCVTL", stdout);
9169 fputs (" FILL ", stdout);
9170 /* XXX Print content of info word? */
9173 fputs (" TAGS ", stdout);
9174 /* XXX Print content of info word? */
9177 fputs (" HWAND ", stdout);
9178 if (option->info & OHWA0_R4KEOP_CHECKED)
9179 fputs (" R4KEOP_CHECKED", stdout);
9180 if (option->info & OHWA0_R4KEOP_CLEAN)
9181 fputs (" R4KEOP_CLEAN", stdout);
9184 fputs (" HWOR ", stdout);
9185 if (option->info & OHWA0_R4KEOP_CHECKED)
9186 fputs (" R4KEOP_CHECKED", stdout);
9187 if (option->info & OHWA0_R4KEOP_CLEAN)
9188 fputs (" R4KEOP_CLEAN", stdout);
9191 printf (" GP_GROUP %#06lx self-contained %#06lx",
9192 option->info & OGP_GROUP,
9193 (option->info & OGP_SELF) >> 16);
9196 printf (" IDENT %#06lx self-contained %#06lx",
9197 option->info & OGP_GROUP,
9198 (option->info & OGP_SELF) >> 16);
9201 /* This shouldn't happen. */
9202 printf (" %3d ??? %d %lx",
9203 option->kind, option->section, option->info);
9207 len = sizeof (* eopt);
9208 while (len < option->size)
9209 if (((char *) option)[len] >= ' '
9210 && ((char *) option)[len] < 0x7f)
9211 printf ("%c", ((char *) option)[len++]);
9213 printf ("\\%03o", ((char *) option)[len++]);
9215 fputs ("\n", stdout);
9223 if (conflicts_offset != 0 && conflictsno != 0)
9225 Elf32_Conflict * iconf;
9228 if (dynamic_symbols == NULL)
9230 error (_("conflict list with without table"));
9234 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (* iconf));
9237 error (_("Out of memory"));
9243 Elf32_External_Conflict * econf32;
9245 econf32 = ((Elf32_External_Conflict *)
9246 get_data (NULL, file, conflicts_offset,
9247 conflictsno * sizeof (* econf32),
9252 for (cnt = 0; cnt < conflictsno; ++cnt)
9253 iconf[cnt] = BYTE_GET (econf32[cnt]);
9259 Elf64_External_Conflict * econf64;
9261 econf64 = ((Elf64_External_Conflict *)
9262 get_data (NULL, file, conflicts_offset,
9263 conflictsno * sizeof (* econf64),
9268 for (cnt = 0; cnt < conflictsno; ++cnt)
9269 iconf[cnt] = BYTE_GET (econf64[cnt]);
9274 printf (_("\nSection '.conflict' contains %ld entries:\n"),
9275 (long) conflictsno);
9276 puts (_(" Num: Index Value Name"));
9278 for (cnt = 0; cnt < conflictsno; ++cnt)
9280 Elf_Internal_Sym * psym = & dynamic_symbols [iconf [cnt]];
9282 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf [cnt]);
9283 print_vma (psym->st_value, FULL_HEX);
9285 print_symbol (25, dynamic_strings + psym->st_name);
9296 get_note_type (e_type)
9299 static char buff[64];
9303 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
9304 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
9305 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
9306 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
9307 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
9308 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
9309 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
9310 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
9311 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
9312 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
9313 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
9315 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
9321 get_netbsd_elfcore_note_type (e_type)
9324 static char buff[64];
9326 if (e_type == NT_NETBSDCORE_PROCINFO)
9328 /* NetBSD core "procinfo" structure. */
9329 return _("NetBSD procinfo structure");
9332 /* As of Jan 2002 there are no other machine-independent notes
9333 defined for NetBSD core files. If the note type is less
9334 than the start of the machine-dependent note types, we don't
9337 if (e_type < NT_NETBSDCORE_FIRSTMACH)
9339 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
9343 switch (elf_header.e_machine)
9345 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
9346 and PT_GETFPREGS == mach+2. */
9351 case EM_SPARC32PLUS:
9355 case NT_NETBSDCORE_FIRSTMACH+0:
9356 return _("PT_GETREGS (reg structure)");
9357 case NT_NETBSDCORE_FIRSTMACH+2:
9358 return _("PT_GETFPREGS (fpreg structure)");
9364 /* On all other arch's, PT_GETREGS == mach+1 and
9365 PT_GETFPREGS == mach+3. */
9369 case NT_NETBSDCORE_FIRSTMACH+1:
9370 return _("PT_GETREGS (reg structure)");
9371 case NT_NETBSDCORE_FIRSTMACH+3:
9372 return _("PT_GETFPREGS (fpreg structure)");
9378 sprintf (buff, _("PT_FIRSTMACH+%d"), e_type - NT_NETBSDCORE_FIRSTMACH);
9382 /* Note that by the ELF standard, the name field is already null byte
9383 terminated, and namesz includes the terminating null byte.
9384 I.E. the value of namesz for the name "FSF" is 4.
9386 If the value of namesz is zero, there is no name present. */
9388 process_note (pnote)
9389 Elf32_Internal_Note * pnote;
9393 if (pnote->namesz == 0)
9395 /* If there is no note name, then use the default set of
9396 note type strings. */
9397 nt = get_note_type (pnote->type);
9399 else if (strncmp (pnote->namedata, "NetBSD-CORE", 11) == 0)
9401 /* NetBSD-specific core file notes. */
9402 nt = get_netbsd_elfcore_note_type (pnote->type);
9406 /* Don't recognize this note name; just use the default set of
9407 note type strings. */
9408 nt = get_note_type (pnote->type);
9411 printf (" %s\t\t0x%08lx\t%s\n",
9412 pnote->namesz ? pnote->namedata : "(NONE)",
9419 process_corefile_note_segment (file, offset, length)
9424 Elf_External_Note * pnotes;
9425 Elf_External_Note * external;
9431 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, length,
9438 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9439 (unsigned long) offset, (unsigned long) length);
9440 printf (_(" Owner\t\tData size\tDescription\n"));
9442 while (external < (Elf_External_Note *)((char *) pnotes + length))
9444 Elf_External_Note * next;
9445 Elf32_Internal_Note inote;
9448 inote.type = BYTE_GET (external->type);
9449 inote.namesz = BYTE_GET (external->namesz);
9450 inote.namedata = external->name;
9451 inote.descsz = BYTE_GET (external->descsz);
9452 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
9453 inote.descpos = offset + (inote.descdata - (char *) pnotes);
9455 next = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
9457 if (((char *) next) > (((char *) pnotes) + length))
9459 warn (_("corrupt note found at offset %x into core notes\n"),
9460 ((char *) external) - ((char *) pnotes));
9461 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
9462 inote.type, inote.namesz, inote.descsz);
9468 /* Verify that name is null terminated. It appears that at least
9469 one version of Linux (RedHat 6.0) generates corefiles that don't
9470 comply with the ELF spec by failing to include the null byte in
9472 if (inote.namedata[inote.namesz] != '\0')
9474 temp = malloc (inote.namesz + 1);
9478 error (_("Out of memory\n"));
9483 strncpy (temp, inote.namedata, inote.namesz);
9484 temp[inote.namesz] = 0;
9486 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9487 inote.namedata = temp;
9490 res &= process_note (& inote);
9505 process_corefile_note_segments (file)
9508 Elf_Internal_Phdr * program_headers;
9509 Elf_Internal_Phdr * segment;
9513 program_headers = (Elf_Internal_Phdr *) malloc
9514 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
9516 if (program_headers == NULL)
9518 error (_("Out of memory\n"));
9523 i = get_32bit_program_headers (file, program_headers);
9525 i = get_64bit_program_headers (file, program_headers);
9529 free (program_headers);
9533 for (i = 0, segment = program_headers;
9534 i < elf_header.e_phnum;
9537 if (segment->p_type == PT_NOTE)
9538 res &= process_corefile_note_segment (file,
9539 (bfd_vma) segment->p_offset,
9540 (bfd_vma) segment->p_filesz);
9543 free (program_headers);
9549 process_corefile_contents (file)
9552 /* If we have not been asked to display the notes then do nothing. */
9556 /* If file is not a core file then exit. */
9557 if (elf_header.e_type != ET_CORE)
9560 /* No program headers means no NOTE segment. */
9561 if (elf_header.e_phnum == 0)
9563 printf (_("No note segments present in the core file.\n"));
9567 return process_corefile_note_segments (file);
9571 process_arch_specific (file)
9577 switch (elf_header.e_machine)
9580 case EM_MIPS_RS3_LE:
9581 return process_mips_specific (file);
9590 get_file_header (file)
9593 /* Read in the identity array. */
9594 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
9597 /* Determine how to read the rest of the header. */
9598 switch (elf_header.e_ident [EI_DATA])
9600 default: /* fall through */
9601 case ELFDATANONE: /* fall through */
9602 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
9603 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
9606 /* For now we only support 32 bit and 64 bit ELF files. */
9607 is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
9609 /* Read in the rest of the header. */
9612 Elf32_External_Ehdr ehdr32;
9614 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
9617 elf_header.e_type = BYTE_GET (ehdr32.e_type);
9618 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
9619 elf_header.e_version = BYTE_GET (ehdr32.e_version);
9620 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
9621 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
9622 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
9623 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
9624 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
9625 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
9626 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
9627 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
9628 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
9629 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
9633 Elf64_External_Ehdr ehdr64;
9635 /* If we have been compiled with sizeof (bfd_vma) == 4, then
9636 we will not be able to cope with the 64bit data found in
9637 64 ELF files. Detect this now and abort before we start
9638 overwritting things. */
9639 if (sizeof (bfd_vma) < 8)
9641 error (_("This instance of readelf has been built without support for a\n\
9642 64 bit data type and so it cannot read 64 bit ELF files.\n"));
9646 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
9649 elf_header.e_type = BYTE_GET (ehdr64.e_type);
9650 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
9651 elf_header.e_version = BYTE_GET (ehdr64.e_version);
9652 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
9653 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
9654 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
9655 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
9656 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
9657 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
9658 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
9659 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
9660 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
9661 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
9664 /* There may be some extensions in the first section header. Don't
9665 bomb if we can't read it. */
9667 get_32bit_section_headers (file, 1);
9669 get_64bit_section_headers (file, 1);
9675 process_file (file_name)
9679 struct stat statbuf;
9682 if (stat (file_name, & statbuf) < 0)
9684 error (_("Cannot stat input file %s.\n"), file_name);
9688 file = fopen (file_name, "rb");
9691 error (_("Input file %s not found.\n"), file_name);
9695 if (! get_file_header (file))
9697 error (_("%s: Failed to read file header\n"), file_name);
9702 /* Initialise per file variables. */
9703 for (i = NUM_ELEM (version_info); i--;)
9704 version_info[i] = 0;
9706 for (i = NUM_ELEM (dynamic_info); i--;)
9707 dynamic_info[i] = 0;
9709 /* Process the file. */
9711 printf (_("\nFile: %s\n"), file_name);
9713 if (! process_file_header ())
9719 process_section_headers (file);
9721 process_program_headers (file);
9723 process_dynamic_segment (file);
9725 process_relocs (file);
9727 process_unwind (file);
9729 process_symbol_table (file);
9731 process_syminfo (file);
9733 process_version_sections (file);
9735 process_section_contents (file);
9737 process_corefile_contents (file);
9739 process_arch_specific (file);
9743 if (section_headers)
9745 free (section_headers);
9746 section_headers = NULL;
9751 free (string_table);
9752 string_table = NULL;
9753 string_table_length = 0;
9756 if (dynamic_strings)
9758 free (dynamic_strings);
9759 dynamic_strings = NULL;
9762 if (dynamic_symbols)
9764 free (dynamic_symbols);
9765 dynamic_symbols = NULL;
9766 num_dynamic_syms = 0;
9769 if (dynamic_syminfo)
9771 free (dynamic_syminfo);
9772 dynamic_syminfo = NULL;
9778 #ifdef SUPPORT_DISASSEMBLY
9779 /* Needed by the i386 disassembler. For extra credit, someone could
9780 fix this so that we insert symbolic addresses here, esp for GOT/PLT
9784 print_address (unsigned int addr, FILE * outfile)
9786 fprintf (outfile,"0x%8.8x", addr);
9789 /* Needed by the i386 disassembler. */
9791 db_task_printsym (unsigned int addr)
9793 print_address (addr, stderr);
9797 int main PARAMS ((int, char **));
9806 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9807 setlocale (LC_MESSAGES, "");
9809 #if defined (HAVE_SETLOCALE)
9810 setlocale (LC_CTYPE, "");
9812 bindtextdomain (PACKAGE, LOCALEDIR);
9813 textdomain (PACKAGE);
9815 parse_args (argc, argv);
9817 if (optind < (argc - 1))
9821 while (optind < argc)
9822 err |= process_file (argv [optind ++]);
9824 if (dump_sects != NULL)