1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001 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
56 #include "elf/alpha.h"
59 #include "elf/sparc.h"
64 #include "elf/mn10200.h"
65 #include "elf/mn10300.h"
70 #include "elf/mcore.h"
78 #include "elf/x86-64.h"
80 #include "elf/xstormy16.h"
85 char * program_name = "readelf";
86 unsigned int dynamic_addr;
87 bfd_size_type dynamic_size;
88 unsigned int rela_addr;
89 unsigned int rela_size;
90 char * dynamic_strings;
92 unsigned long string_table_length;
93 unsigned long num_dynamic_syms;
94 Elf_Internal_Sym * dynamic_symbols;
95 Elf_Internal_Syminfo * dynamic_syminfo;
96 unsigned long dynamic_syminfo_offset;
97 unsigned int dynamic_syminfo_nent;
98 char program_interpreter [64];
99 int dynamic_info[DT_JMPREL + 1];
100 int version_info[16];
102 Elf_Internal_Ehdr elf_header;
103 Elf_Internal_Shdr * section_headers;
104 Elf_Internal_Dyn * dynamic_segment;
105 Elf_Internal_Shdr * symtab_shndx_hdr;
113 int do_using_dynamic;
121 int do_debug_abbrevs;
123 int do_debug_pubnames;
124 int do_debug_aranges;
126 int do_debug_frames_interp;
127 int do_debug_macinfo;
133 /* A dynamic array of flags indicating which sections require dumping. */
134 char * dump_sects = NULL;
135 unsigned int num_dump_sects = 0;
137 #define HEX_DUMP (1 << 0)
138 #define DISASS_DUMP (1 << 1)
139 #define DEBUG_DUMP (1 << 2)
141 /* How to rpint a vma value. */
142 typedef enum print_mode
154 /* Forward declarations for dumb compilers. */
155 static void print_vma PARAMS ((bfd_vma, print_mode));
156 static bfd_vma (* byte_get) PARAMS ((unsigned char *, int));
157 static bfd_vma byte_get_little_endian PARAMS ((unsigned char *, int));
158 static bfd_vma byte_get_big_endian PARAMS ((unsigned char *, int));
159 static const char * get_mips_dynamic_type PARAMS ((unsigned long));
160 static const char * get_sparc64_dynamic_type PARAMS ((unsigned long));
161 static const char * get_parisc_dynamic_type PARAMS ((unsigned long));
162 static const char * get_dynamic_type PARAMS ((unsigned long));
163 static int slurp_rela_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **, unsigned long *));
164 static int slurp_rel_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rel **, unsigned long *));
165 static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
166 static char * get_file_type PARAMS ((unsigned));
167 static char * get_machine_name PARAMS ((unsigned));
168 static void decode_ARM_machine_flags PARAMS ((unsigned, char []));
169 static char * get_machine_flags PARAMS ((unsigned, unsigned));
170 static const char * get_mips_segment_type PARAMS ((unsigned long));
171 static const char * get_parisc_segment_type PARAMS ((unsigned long));
172 static const char * get_ia64_segment_type PARAMS ((unsigned long));
173 static const char * get_segment_type PARAMS ((unsigned long));
174 static const char * get_mips_section_type_name PARAMS ((unsigned int));
175 static const char * get_parisc_section_type_name PARAMS ((unsigned int));
176 static const char * get_ia64_section_type_name PARAMS ((unsigned int));
177 static const char * get_section_type_name PARAMS ((unsigned int));
178 static const char * get_symbol_binding PARAMS ((unsigned int));
179 static const char * get_symbol_type PARAMS ((unsigned int));
180 static const char * get_symbol_visibility PARAMS ((unsigned int));
181 static const char * get_symbol_index_type PARAMS ((unsigned int));
182 static const char * get_dynamic_flags PARAMS ((bfd_vma));
183 static void usage PARAMS ((void));
184 static void parse_args PARAMS ((int, char **));
185 static int process_file_header PARAMS ((void));
186 static int process_program_headers PARAMS ((FILE *));
187 static int process_section_headers PARAMS ((FILE *));
188 static int process_unwind PARAMS ((FILE *));
189 static void dynamic_segment_mips_val PARAMS ((Elf_Internal_Dyn *));
190 static void dynamic_segment_parisc_val PARAMS ((Elf_Internal_Dyn *));
191 static int process_dynamic_segment PARAMS ((FILE *));
192 static int process_symbol_table PARAMS ((FILE *));
193 static int process_syminfo PARAMS ((FILE *));
194 static int process_section_contents PARAMS ((FILE *));
195 static void process_mips_fpe_exception PARAMS ((int));
196 static int process_mips_specific PARAMS ((FILE *));
197 static int process_file PARAMS ((char *));
198 static int process_relocs PARAMS ((FILE *));
199 static int process_version_sections PARAMS ((FILE *));
200 static char * get_ver_flags PARAMS ((unsigned int));
201 static int get_32bit_section_headers PARAMS ((FILE *, unsigned int));
202 static int get_64bit_section_headers PARAMS ((FILE *, unsigned int));
203 static int get_32bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
204 static int get_64bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
205 static int get_file_header PARAMS ((FILE *));
206 static Elf_Internal_Sym * get_32bit_elf_symbols PARAMS ((FILE *, Elf_Internal_Shdr *));
207 static Elf_Internal_Sym * get_64bit_elf_symbols PARAMS ((FILE *, Elf_Internal_Shdr *));
208 static const char * get_elf_section_flags PARAMS ((bfd_vma));
209 static int * get_dynamic_data PARAMS ((FILE *, unsigned int));
210 static int get_32bit_dynamic_segment PARAMS ((FILE *));
211 static int get_64bit_dynamic_segment PARAMS ((FILE *));
212 #ifdef SUPPORT_DISASSEMBLY
213 static int disassemble_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
215 static int dump_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
216 static int display_debug_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
217 static int display_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
218 static int display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
219 static int prescan_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
220 static int display_debug_lines PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
221 static int display_debug_pubnames PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
222 static int display_debug_abbrev PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
223 static int display_debug_aranges PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
224 static int display_debug_frames PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
225 static int display_debug_macinfo PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
226 static int display_debug_str PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
227 static unsigned char * process_abbrev_section PARAMS ((unsigned char *, unsigned char *));
228 static void load_debug_str PARAMS ((FILE *));
229 static void free_debug_str PARAMS ((void));
230 static const char * fetch_indirect_string PARAMS ((unsigned long));
231 static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int));
232 static int process_extended_line_op PARAMS ((unsigned char *, int, int));
233 static void reset_state_machine PARAMS ((int));
234 static char * get_TAG_name PARAMS ((unsigned long));
235 static char * get_AT_name PARAMS ((unsigned long));
236 static char * get_FORM_name PARAMS ((unsigned long));
237 static void free_abbrevs PARAMS ((void));
238 static void add_abbrev PARAMS ((unsigned long, unsigned long, int));
239 static void add_abbrev_attr PARAMS ((unsigned long, unsigned long));
240 static unsigned char * read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
241 static unsigned char * read_and_display_attr_value PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
242 static unsigned char * display_block PARAMS ((unsigned char *, unsigned long));
243 static void decode_location_expression PARAMS ((unsigned char *, unsigned int, unsigned long));
244 static void request_dump PARAMS ((unsigned int, int));
245 static const char * get_elf_class PARAMS ((unsigned int));
246 static const char * get_data_encoding PARAMS ((unsigned int));
247 static const char * get_osabi_name PARAMS ((unsigned int));
248 static int guess_is_rela PARAMS ((unsigned long));
249 static char * get_note_type PARAMS ((unsigned int));
250 static int process_note PARAMS ((Elf32_Internal_Note *));
251 static int process_corefile_note_segment PARAMS ((FILE *, bfd_vma, bfd_vma));
252 static int process_corefile_note_segments PARAMS ((FILE *));
253 static int process_corefile_contents PARAMS ((FILE *));
254 static int process_arch_specific PARAMS ((FILE *));
256 typedef int Elf32_Word;
264 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
265 ((X)->sh_name >= string_table_length \
266 ? "<corrupt>" : string_table + (X)->sh_name))
268 /* Given st_shndx I, map to section_headers index. */
269 #define SECTION_HEADER_INDEX(I) \
270 ((I) < SHN_LORESERVE \
272 : ((I) <= SHN_HIRESERVE \
274 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
276 /* Reverse of the above. */
277 #define SECTION_HEADER_NUM(N) \
278 ((N) < SHN_LORESERVE \
280 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
282 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
284 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
286 #define BYTE_GET(field) byte_get (field, sizeof (field))
288 /* If we can support a 64 bit data type then BFD64 should be defined
289 and sizeof (bfd_vma) == 8. In this case when translating from an
290 external 8 byte field to an internal field, we can assume that the
291 internal field is also 8 bytes wide and so we can extract all the data.
292 If, however, BFD64 is not defined, then we must assume that the
293 internal data structure only has 4 byte wide fields that are the
294 equivalent of the 8 byte wide external counterparts, and so we must
295 truncate the data. */
297 #define BYTE_GET8(field) byte_get (field, -8)
299 #define BYTE_GET8(field) byte_get (field, 8)
302 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
304 #define GET_ELF_SYMBOLS(file, section) \
305 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
306 : get_64bit_elf_symbols (file, section))
310 error VPARAMS ((const char *message, ...))
312 VA_OPEN (args, message);
313 VA_FIXEDARG (args, const char *, message);
315 fprintf (stderr, _("%s: Error: "), program_name);
316 vfprintf (stderr, message, args);
321 warn VPARAMS ((const char *message, ...))
323 VA_OPEN (args, message);
324 VA_FIXEDARG (args, const char *, message);
326 fprintf (stderr, _("%s: Warning: "), program_name);
327 vfprintf (stderr, message, args);
331 static PTR get_data PARAMS ((PTR, FILE *, long, size_t, const char *));
334 get_data (var, file, offset, size, reason)
346 if (fseek (file, offset, SEEK_SET))
348 error (_("Unable to seek to %x for %s\n"), offset, reason);
355 mvar = (PTR) malloc (size);
359 error (_("Out of memory allocating %d bytes for %s\n"),
365 if (fread (mvar, size, 1, file) != 1)
367 error (_("Unable to read in %d bytes of %s\n"), size, reason);
377 byte_get_little_endian (field, size)
378 unsigned char * field;
387 return ((unsigned int) (field [0]))
388 | (((unsigned int) (field [1])) << 8);
392 /* We want to extract data from an 8 byte wide field and
393 place it into a 4 byte wide field. Since this is a little
394 endian source we can juts use the 4 byte extraction code. */
398 return ((unsigned long) (field [0]))
399 | (((unsigned long) (field [1])) << 8)
400 | (((unsigned long) (field [2])) << 16)
401 | (((unsigned long) (field [3])) << 24);
406 /* This is a special case, generated by the BYTE_GET8 macro.
407 It means that we are loading an 8 byte value from a field
408 in an external structure into an 8 byte value in a field
409 in an internal strcuture. */
410 return ((bfd_vma) (field [0]))
411 | (((bfd_vma) (field [1])) << 8)
412 | (((bfd_vma) (field [2])) << 16)
413 | (((bfd_vma) (field [3])) << 24)
414 | (((bfd_vma) (field [4])) << 32)
415 | (((bfd_vma) (field [5])) << 40)
416 | (((bfd_vma) (field [6])) << 48)
417 | (((bfd_vma) (field [7])) << 56);
420 error (_("Unhandled data length: %d\n"), size);
425 /* Print a VMA value. */
427 print_vma (vma, mode)
437 case FULL_HEX: printf ("0x"); /* drop through */
438 case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
439 case PREFIX_HEX: printf ("0x"); /* drop through */
440 case HEX: printf ("%lx", (unsigned long) vma); break;
441 case DEC: printf ("%ld", (unsigned long) vma); break;
442 case DEC_5: printf ("%5ld", (long) vma); break;
443 case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
464 #if BFD_HOST_64BIT_LONG
467 if (_bfd_int64_high (vma))
468 printf ("%lx%8.8lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
470 printf ("%lx", _bfd_int64_low (vma));
475 #if BFD_HOST_64BIT_LONG
478 if (_bfd_int64_high (vma))
480 printf ("++%ld", _bfd_int64_low (vma));
482 printf ("%ld", _bfd_int64_low (vma));
487 #if BFD_HOST_64BIT_LONG
488 printf ("%5ld", vma);
490 if (_bfd_int64_high (vma))
492 printf ("++%ld", _bfd_int64_low (vma));
494 printf ("%5ld", _bfd_int64_low (vma));
499 #if BFD_HOST_64BIT_LONG
502 if (_bfd_int64_high (vma))
504 printf ("++%lu", _bfd_int64_low (vma));
506 printf ("%lu", _bfd_int64_low (vma));
515 byte_get_big_endian (field, size)
516 unsigned char * field;
525 return ((unsigned int) (field [1])) | (((int) (field [0])) << 8);
528 return ((unsigned long) (field [3]))
529 | (((unsigned long) (field [2])) << 8)
530 | (((unsigned long) (field [1])) << 16)
531 | (((unsigned long) (field [0])) << 24);
535 /* Although we are extracing data from an 8 byte wide field, we
536 are returning only 4 bytes of data. */
537 return ((unsigned long) (field [7]))
538 | (((unsigned long) (field [6])) << 8)
539 | (((unsigned long) (field [5])) << 16)
540 | (((unsigned long) (field [4])) << 24);
544 /* This is a special case, generated by the BYTE_GET8 macro.
545 It means that we are loading an 8 byte value from a field
546 in an external structure into an 8 byte value in a field
547 in an internal strcuture. */
548 return ((bfd_vma) (field [7]))
549 | (((bfd_vma) (field [6])) << 8)
550 | (((bfd_vma) (field [5])) << 16)
551 | (((bfd_vma) (field [4])) << 24)
552 | (((bfd_vma) (field [3])) << 32)
553 | (((bfd_vma) (field [2])) << 40)
554 | (((bfd_vma) (field [1])) << 48)
555 | (((bfd_vma) (field [0])) << 56);
559 error (_("Unhandled data length: %d\n"), size);
564 /* Guess the relocation size commonly used by the specific machines. */
567 guess_is_rela (e_machine)
568 unsigned long e_machine;
572 /* Targets that use REL relocations. */
585 /* Targets that use RELA relocations. */
599 case EM_CYGNUS_MN10200:
601 case EM_CYGNUS_MN10300:
638 warn (_("Don't know about relocations on this machine architecture\n"));
644 slurp_rela_relocs (file, rel_offset, rel_size, relasp, nrelasp)
646 unsigned long rel_offset;
647 unsigned long rel_size;
648 Elf_Internal_Rela **relasp;
649 unsigned long *nrelasp;
651 Elf_Internal_Rela *relas;
652 unsigned long nrelas;
657 Elf32_External_Rela * erelas;
659 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset,
660 rel_size, _("relocs"));
664 nrelas = rel_size / sizeof (Elf32_External_Rela);
666 relas = (Elf_Internal_Rela *)
667 malloc (nrelas * sizeof (Elf_Internal_Rela));
671 error(_("out of memory parsing relocs"));
675 for (i = 0; i < nrelas; i++)
677 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
678 relas[i].r_info = BYTE_GET (erelas[i].r_info);
679 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
686 Elf64_External_Rela * erelas;
688 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset,
689 rel_size, _("relocs"));
693 nrelas = rel_size / sizeof (Elf64_External_Rela);
695 relas = (Elf_Internal_Rela *)
696 malloc (nrelas * sizeof (Elf_Internal_Rela));
700 error(_("out of memory parsing relocs"));
704 for (i = 0; i < nrelas; i++)
706 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
707 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
708 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
719 slurp_rel_relocs (file, rel_offset, rel_size, relsp, nrelsp)
721 unsigned long rel_offset;
722 unsigned long rel_size;
723 Elf_Internal_Rel **relsp;
724 unsigned long *nrelsp;
726 Elf_Internal_Rel *rels;
732 Elf32_External_Rel * erels;
734 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset,
735 rel_size, _("relocs"));
739 nrels = rel_size / sizeof (Elf32_External_Rel);
741 rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
745 error(_("out of memory parsing relocs"));
749 for (i = 0; i < nrels; i++)
751 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
752 rels[i].r_info = BYTE_GET (erels[i].r_info);
759 Elf64_External_Rel * erels;
761 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset,
762 rel_size, _("relocs"));
766 nrels = rel_size / sizeof (Elf64_External_Rel);
768 rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
772 error(_("out of memory parsing relocs"));
776 for (i = 0; i < nrels; i++)
778 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
779 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
789 /* Display the contents of the relocation data found at the specified offset. */
791 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
793 unsigned long rel_offset;
794 unsigned long rel_size;
795 Elf_Internal_Sym * symtab;
801 Elf_Internal_Rel * rels;
802 Elf_Internal_Rela * relas;
805 if (is_rela == UNKNOWN)
806 is_rela = guess_is_rela (elf_header.e_machine);
810 if (!slurp_rela_relocs (file, rel_offset, rel_size, &relas, &rel_size))
815 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
823 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
826 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
832 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
835 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
838 for (i = 0; i < rel_size; i++)
843 bfd_vma symtab_index;
848 offset = relas [i].r_offset;
849 info = relas [i].r_info;
853 offset = rels [i].r_offset;
854 info = rels [i].r_info;
859 type = ELF32_R_TYPE (info);
860 symtab_index = ELF32_R_SYM (info);
864 if (elf_header.e_machine == EM_SPARCV9)
865 type = ELF64_R_TYPE_ID (info);
867 type = ELF64_R_TYPE (info);
868 /* The #ifdef BFD64 below is to prevent a compile time warning.
869 We know that if we do not have a 64 bit data type that we
870 will never execute this code anyway. */
872 symtab_index = ELF64_R_SYM (info);
878 #ifdef _bfd_int64_low
879 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
881 printf ("%8.8lx %8.8lx ", offset, info);
886 #ifdef _bfd_int64_low
887 printf ("%8.8lx%8.8lx %8.8lx%8.8lx ",
888 _bfd_int64_high (offset),
889 _bfd_int64_low (offset),
890 _bfd_int64_high (info),
891 _bfd_int64_low (info));
893 printf ("%16.16lx %16.16lx ", offset, info);
897 switch (elf_header.e_machine)
905 rtype = elf_m32r_reloc_type (type);
910 rtype = elf_i386_reloc_type (type);
914 rtype = elf_m68k_reloc_type (type);
918 rtype = elf_i960_reloc_type (type);
923 rtype = elf_avr_reloc_type (type);
930 rtype = elf_sparc_reloc_type (type);
935 rtype = v850_reloc_type (type);
940 rtype = elf_d10v_reloc_type (type);
945 rtype = elf_d30v_reloc_type (type);
949 rtype = elf_sh_reloc_type (type);
953 case EM_CYGNUS_MN10300:
954 rtype = elf_mn10300_reloc_type (type);
958 case EM_CYGNUS_MN10200:
959 rtype = elf_mn10200_reloc_type (type);
964 rtype = elf_fr30_reloc_type (type);
968 rtype = elf_mcore_reloc_type (type);
972 rtype = elf_mmix_reloc_type (type);
977 rtype = elf_ppc_reloc_type (type);
982 rtype = elf_mips_reloc_type (type);
986 rtype = elf_alpha_reloc_type (type);
990 rtype = elf_arm_reloc_type (type);
994 rtype = elf_arc_reloc_type (type);
998 rtype = elf_hppa_reloc_type (type);
1004 rtype = elf_h8_reloc_type (type);
1009 rtype = elf_pj_reloc_type (type);
1012 rtype = elf_ia64_reloc_type (type);
1016 rtype = elf_cris_reloc_type (type);
1020 rtype = elf_i860_reloc_type (type);
1024 rtype = elf_x86_64_reloc_type (type);
1029 rtype = elf_s390_reloc_type (type);
1033 rtype = elf_xstormy16_reloc_type (type);
1038 #ifdef _bfd_int64_low
1039 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type));
1041 printf (_("unrecognised: %-7lx"), type);
1044 printf ("%-21.21s", rtype);
1048 if (symtab == NULL || symtab_index >= nsyms)
1049 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
1052 Elf_Internal_Sym * psym;
1054 psym = symtab + symtab_index;
1057 print_vma (psym->st_value, LONG_HEX);
1060 if (psym->st_name == 0)
1062 SECTION_NAME (SECTION_HEADER (psym->st_shndx)));
1063 else if (strtab == NULL)
1064 printf (_("<string table index %3ld>"), psym->st_name);
1066 printf ("%-25.25s", strtab + psym->st_name);
1069 printf (" + %lx", (unsigned long) relas [i].r_addend);
1074 printf ("%*c", is_32bit_elf ? 34 : 26, ' ');
1075 print_vma (relas[i].r_addend, LONG_HEX);
1078 if (elf_header.e_machine == EM_SPARCV9
1079 && !strcmp (rtype, "R_SPARC_OLO10"))
1080 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1094 get_mips_dynamic_type (type)
1099 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1100 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1101 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1102 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1103 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1104 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1105 case DT_MIPS_MSYM: return "MIPS_MSYM";
1106 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1107 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1108 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1109 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1110 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1111 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1112 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1113 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1114 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1115 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1116 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1117 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1118 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1119 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1120 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1121 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1122 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1123 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1124 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1125 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1126 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1127 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1128 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1129 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1130 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1131 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1132 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1133 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1134 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1135 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1136 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1137 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1138 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1139 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1140 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1141 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1148 get_sparc64_dynamic_type (type)
1153 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1160 get_parisc_dynamic_type (type)
1165 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1166 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1167 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1168 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1169 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1170 case DT_HP_PREINIT: return "HP_PREINIT";
1171 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1172 case DT_HP_NEEDED: return "HP_NEEDED";
1173 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1174 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1175 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1176 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1177 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1184 get_dynamic_type (type)
1187 static char buff [32];
1191 case DT_NULL: return "NULL";
1192 case DT_NEEDED: return "NEEDED";
1193 case DT_PLTRELSZ: return "PLTRELSZ";
1194 case DT_PLTGOT: return "PLTGOT";
1195 case DT_HASH: return "HASH";
1196 case DT_STRTAB: return "STRTAB";
1197 case DT_SYMTAB: return "SYMTAB";
1198 case DT_RELA: return "RELA";
1199 case DT_RELASZ: return "RELASZ";
1200 case DT_RELAENT: return "RELAENT";
1201 case DT_STRSZ: return "STRSZ";
1202 case DT_SYMENT: return "SYMENT";
1203 case DT_INIT: return "INIT";
1204 case DT_FINI: return "FINI";
1205 case DT_SONAME: return "SONAME";
1206 case DT_RPATH: return "RPATH";
1207 case DT_SYMBOLIC: return "SYMBOLIC";
1208 case DT_REL: return "REL";
1209 case DT_RELSZ: return "RELSZ";
1210 case DT_RELENT: return "RELENT";
1211 case DT_PLTREL: return "PLTREL";
1212 case DT_DEBUG: return "DEBUG";
1213 case DT_TEXTREL: return "TEXTREL";
1214 case DT_JMPREL: return "JMPREL";
1215 case DT_BIND_NOW: return "BIND_NOW";
1216 case DT_INIT_ARRAY: return "INIT_ARRAY";
1217 case DT_FINI_ARRAY: return "FINI_ARRAY";
1218 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1219 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1220 case DT_RUNPATH: return "RUNPATH";
1221 case DT_FLAGS: return "FLAGS";
1223 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1224 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1226 case DT_CHECKSUM: return "CHECKSUM";
1227 case DT_PLTPADSZ: return "PLTPADSZ";
1228 case DT_MOVEENT: return "MOVEENT";
1229 case DT_MOVESZ: return "MOVESZ";
1230 case DT_FEATURE: return "FEATURE";
1231 case DT_POSFLAG_1: return "POSFLAG_1";
1232 case DT_SYMINSZ: return "SYMINSZ";
1233 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1235 case DT_ADDRRNGLO: return "ADDRRNGLO";
1236 case DT_CONFIG: return "CONFIG";
1237 case DT_DEPAUDIT: return "DEPAUDIT";
1238 case DT_AUDIT: return "AUDIT";
1239 case DT_PLTPAD: return "PLTPAD";
1240 case DT_MOVETAB: return "MOVETAB";
1241 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1243 case DT_VERSYM: return "VERSYM";
1245 case DT_RELACOUNT: return "RELACOUNT";
1246 case DT_RELCOUNT: return "RELCOUNT";
1247 case DT_FLAGS_1: return "FLAGS_1";
1248 case DT_VERDEF: return "VERDEF";
1249 case DT_VERDEFNUM: return "VERDEFNUM";
1250 case DT_VERNEED: return "VERNEED";
1251 case DT_VERNEEDNUM: return "VERNEEDNUM";
1253 case DT_AUXILIARY: return "AUXILIARY";
1254 case DT_USED: return "USED";
1255 case DT_FILTER: return "FILTER";
1258 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1260 const char * result;
1262 switch (elf_header.e_machine)
1265 case EM_MIPS_RS3_LE:
1266 result = get_mips_dynamic_type (type);
1269 result = get_sparc64_dynamic_type (type);
1279 sprintf (buff, _("Processor Specific: %lx"), type);
1281 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1283 const char * result;
1285 switch (elf_header.e_machine)
1288 result = get_parisc_dynamic_type (type);
1298 sprintf (buff, _("Operating System specific: %lx"), type);
1301 sprintf (buff, _("<unknown>: %lx"), type);
1308 get_file_type (e_type)
1311 static char buff [32];
1315 case ET_NONE: return _("NONE (None)");
1316 case ET_REL: return _("REL (Relocatable file)");
1317 case ET_EXEC: return _("EXEC (Executable file)");
1318 case ET_DYN: return _("DYN (Shared object file)");
1319 case ET_CORE: return _("CORE (Core file)");
1322 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1323 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1324 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1325 sprintf (buff, _("OS Specific: (%x)"), e_type);
1327 sprintf (buff, _("<unknown>: %x"), e_type);
1333 get_machine_name (e_machine)
1336 static char buff [64]; /* XXX */
1340 case EM_NONE: return _("None");
1341 case EM_M32: return "WE32100";
1342 case EM_SPARC: return "Sparc";
1343 case EM_386: return "Intel 80386";
1344 case EM_68K: return "MC68000";
1345 case EM_88K: return "MC88000";
1346 case EM_486: return "Intel 80486";
1347 case EM_860: return "Intel 80860";
1348 case EM_MIPS: return "MIPS R3000";
1349 case EM_S370: return "IBM System/370";
1350 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1351 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1352 case EM_PARISC: return "HPPA";
1353 case EM_PPC_OLD: return "Power PC (old)";
1354 case EM_SPARC32PLUS: return "Sparc v8+" ;
1355 case EM_960: return "Intel 90860";
1356 case EM_PPC: return "PowerPC";
1357 case EM_V800: return "NEC V800";
1358 case EM_FR20: return "Fujitsu FR20";
1359 case EM_RH32: return "TRW RH32";
1360 case EM_MCORE: return "MCORE";
1361 case EM_ARM: return "ARM";
1362 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1363 case EM_SH: return "Hitachi SH";
1364 case EM_SPARCV9: return "Sparc v9";
1365 case EM_TRICORE: return "Siemens Tricore";
1366 case EM_ARC: return "ARC";
1367 case EM_H8_300: return "Hitachi H8/300";
1368 case EM_H8_300H: return "Hitachi H8/300H";
1369 case EM_H8S: return "Hitachi H8S";
1370 case EM_H8_500: return "Hitachi H8/500";
1371 case EM_IA_64: return "Intel IA-64";
1372 case EM_MIPS_X: return "Stanford MIPS-X";
1373 case EM_COLDFIRE: return "Motorola Coldfire";
1374 case EM_68HC12: return "Motorola M68HC12";
1375 case EM_ALPHA: return "Alpha";
1376 case EM_CYGNUS_D10V:
1377 case EM_D10V: return "d10v";
1378 case EM_CYGNUS_D30V:
1379 case EM_D30V: return "d30v";
1380 case EM_CYGNUS_M32R:
1381 case EM_M32R: return "Mitsubishi M32r";
1382 case EM_CYGNUS_V850:
1383 case EM_V850: return "NEC v850";
1384 case EM_CYGNUS_MN10300:
1385 case EM_MN10300: return "mn10300";
1386 case EM_CYGNUS_MN10200:
1387 case EM_MN10200: return "mn10200";
1388 case EM_CYGNUS_FR30:
1389 case EM_FR30: return "Fujitsu FR30";
1391 case EM_PJ: return "picoJava";
1392 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1393 case EM_PCP: return "Siemens PCP";
1394 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1395 case EM_NDR1: return "Denso NDR1 microprocesspr";
1396 case EM_STARCORE: return "Motorola Star*Core processor";
1397 case EM_ME16: return "Toyota ME16 processor";
1398 case EM_ST100: return "STMicroelectronics ST100 processor";
1399 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1400 case EM_FX66: return "Siemens FX66 microcontroller";
1401 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1402 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1403 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1404 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1405 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1406 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1407 case EM_SVX: return "Silicon Graphics SVx";
1408 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1409 case EM_VAX: return "Digital VAX";
1411 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1412 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1413 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1414 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1415 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1416 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1417 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1418 case EM_PRISM: return "SiTera Prism";
1419 case EM_X86_64: return "Advanced Micro Devices X86-64";
1421 case EM_S390: return "IBM S/390";
1422 case EM_XSTORMY16: return "Sanyo Xstormy16 CPU core";
1424 sprintf (buff, _("<unknown>: %x"), e_machine);
1430 decode_ARM_machine_flags (e_flags, buf)
1437 eabi = EF_ARM_EABI_VERSION (e_flags);
1438 e_flags &= ~ EF_ARM_EABIMASK;
1440 /* Handle "generic" ARM flags. */
1441 if (e_flags & EF_ARM_RELEXEC)
1443 strcat (buf, ", relocatable executable");
1444 e_flags &= ~ EF_ARM_RELEXEC;
1447 if (e_flags & EF_ARM_HASENTRY)
1449 strcat (buf, ", has entry point");
1450 e_flags &= ~ EF_ARM_HASENTRY;
1453 /* Now handle EABI specific flags. */
1457 strcat (buf, ", <unrecognised EABI>");
1462 case EF_ARM_EABI_VER1:
1463 strcat (buf, ", Version1 EABI");
1468 /* Process flags one bit at a time. */
1469 flag = e_flags & - e_flags;
1474 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1475 strcat (buf, ", sorted symbol tables");
1485 case EF_ARM_EABI_VER2:
1486 strcat (buf, ", Version2 EABI");
1491 /* Process flags one bit at a time. */
1492 flag = e_flags & - e_flags;
1497 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1498 strcat (buf, ", sorted symbol tables");
1501 case EF_ARM_DYNSYMSUSESEGIDX:
1502 strcat (buf, ", dynamic symbols use segment index");
1505 case EF_ARM_MAPSYMSFIRST:
1506 strcat (buf, ", mapping symbols precede others");
1516 case EF_ARM_EABI_UNKNOWN:
1517 strcat (buf, ", GNU EABI");
1522 /* Process flags one bit at a time. */
1523 flag = e_flags & - e_flags;
1528 case EF_ARM_INTERWORK:
1529 strcat (buf, ", interworking enabled");
1532 case EF_ARM_APCS_26:
1533 strcat (buf, ", uses APCS/26");
1536 case EF_ARM_APCS_FLOAT:
1537 strcat (buf, ", uses APCS/float");
1541 strcat (buf, ", position independent");
1545 strcat (buf, ", 8 bit structure alignment");
1548 case EF_ARM_NEW_ABI:
1549 strcat (buf, ", uses new ABI");
1552 case EF_ARM_OLD_ABI:
1553 strcat (buf, ", uses old ABI");
1556 case EF_ARM_SOFT_FLOAT:
1557 strcat (buf, ", software FP");
1568 strcat (buf,", <unknown>");
1572 get_machine_flags (e_flags, e_machine)
1576 static char buf [1024];
1588 decode_ARM_machine_flags (e_flags, buf);
1592 if (e_flags & EF_CPU32)
1593 strcat (buf, ", cpu32");
1597 if (e_flags & EF_PPC_EMB)
1598 strcat (buf, ", emb");
1600 if (e_flags & EF_PPC_RELOCATABLE)
1601 strcat (buf, ", relocatable");
1603 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1604 strcat (buf, ", relocatable-lib");
1608 case EM_CYGNUS_V850:
1609 switch (e_flags & EF_V850_ARCH)
1612 strcat (buf, ", v850e");
1615 strcat (buf, ", v850ea");
1618 strcat (buf, ", v850");
1621 strcat (buf, ", unknown v850 architecture variant");
1627 case EM_CYGNUS_M32R:
1628 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1629 strcat (buf, ", m32r");
1634 case EM_MIPS_RS3_LE:
1635 if (e_flags & EF_MIPS_NOREORDER)
1636 strcat (buf, ", noreorder");
1638 if (e_flags & EF_MIPS_PIC)
1639 strcat (buf, ", pic");
1641 if (e_flags & EF_MIPS_CPIC)
1642 strcat (buf, ", cpic");
1644 if (e_flags & EF_MIPS_UCODE)
1645 strcat (buf, ", ugen_reserved");
1647 if (e_flags & EF_MIPS_ABI2)
1648 strcat (buf, ", abi2");
1650 if (e_flags & EF_MIPS_OPTIONS_FIRST)
1651 strcat (buf, ", odk first");
1653 if (e_flags & EF_MIPS_32BITMODE)
1654 strcat (buf, ", 32bitmode");
1656 switch ((e_flags & EF_MIPS_MACH))
1658 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
1659 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
1660 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
1661 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
1662 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
1663 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
1665 /* We simply ignore the field in this case to avoid confusion:
1666 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
1669 default: strcat (buf, ", unknown CPU"); break;
1672 switch ((e_flags & EF_MIPS_ABI))
1674 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
1675 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
1676 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
1677 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
1679 /* We simply ignore the field in this case to avoid confusion:
1680 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
1681 This means it is likely to be an o32 file, but not for
1684 default: strcat (buf, ", unknown ABI"); break;
1687 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
1688 strcat (buf, ", mdmx");
1690 if (e_flags & EF_MIPS_ARCH_ASE_M16)
1691 strcat (buf, ", mips16");
1693 switch ((e_flags & EF_MIPS_ARCH))
1695 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
1696 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
1697 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
1698 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
1699 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
1700 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
1701 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
1702 default: strcat (buf, ", unknown ISA"); break;
1708 if (e_flags & EF_SPARC_32PLUS)
1709 strcat (buf, ", v8+");
1711 if (e_flags & EF_SPARC_SUN_US1)
1712 strcat (buf, ", ultrasparcI");
1714 if (e_flags & EF_SPARC_SUN_US3)
1715 strcat (buf, ", ultrasparcIII");
1717 if (e_flags & EF_SPARC_HAL_R1)
1718 strcat (buf, ", halr1");
1720 if (e_flags & EF_SPARC_LEDATA)
1721 strcat (buf, ", ledata");
1723 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
1724 strcat (buf, ", tso");
1726 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
1727 strcat (buf, ", pso");
1729 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
1730 strcat (buf, ", rmo");
1734 switch (e_flags & EF_PARISC_ARCH)
1736 case EFA_PARISC_1_0:
1737 strcpy (buf, ", PA-RISC 1.0");
1739 case EFA_PARISC_1_1:
1740 strcpy (buf, ", PA-RISC 1.1");
1742 case EFA_PARISC_2_0:
1743 strcpy (buf, ", PA-RISC 2.0");
1748 if (e_flags & EF_PARISC_TRAPNIL)
1749 strcat (buf, ", trapnil");
1750 if (e_flags & EF_PARISC_EXT)
1751 strcat (buf, ", ext");
1752 if (e_flags & EF_PARISC_LSB)
1753 strcat (buf, ", lsb");
1754 if (e_flags & EF_PARISC_WIDE)
1755 strcat (buf, ", wide");
1756 if (e_flags & EF_PARISC_NO_KABP)
1757 strcat (buf, ", no kabp");
1758 if (e_flags & EF_PARISC_LAZYSWAP)
1759 strcat (buf, ", lazyswap");
1764 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
1765 strcat (buf, ", new calling convention");
1767 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
1768 strcat (buf, ", gnu calling convention");
1772 if ((e_flags & EF_IA_64_ABI64))
1773 strcat (buf, ", 64-bit");
1775 strcat (buf, ", 32-bit");
1776 if ((e_flags & EF_IA_64_REDUCEDFP))
1777 strcat (buf, ", reduced fp model");
1778 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
1779 strcat (buf, ", no function descriptors, constant gp");
1780 else if ((e_flags & EF_IA_64_CONS_GP))
1781 strcat (buf, ", constant gp");
1782 if ((e_flags & EF_IA_64_ABSOLUTE))
1783 strcat (buf, ", absolute");
1792 get_mips_segment_type (type)
1797 case PT_MIPS_REGINFO:
1799 case PT_MIPS_RTPROC:
1801 case PT_MIPS_OPTIONS:
1811 get_parisc_segment_type (type)
1816 case PT_HP_TLS: return "HP_TLS";
1817 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
1818 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
1819 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
1820 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
1821 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
1822 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
1823 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
1824 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
1825 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
1826 case PT_HP_PARALLEL: return "HP_PARALLEL";
1827 case PT_HP_FASTBIND: return "HP_FASTBIND";
1828 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
1829 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
1838 get_ia64_segment_type (type)
1843 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
1844 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
1853 get_segment_type (p_type)
1854 unsigned long p_type;
1856 static char buff [32];
1860 case PT_NULL: return "NULL";
1861 case PT_LOAD: return "LOAD";
1862 case PT_DYNAMIC: return "DYNAMIC";
1863 case PT_INTERP: return "INTERP";
1864 case PT_NOTE: return "NOTE";
1865 case PT_SHLIB: return "SHLIB";
1866 case PT_PHDR: return "PHDR";
1868 case PT_GNU_EH_FRAME:
1869 return "GNU_EH_FRAME";
1872 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
1874 const char * result;
1876 switch (elf_header.e_machine)
1879 case EM_MIPS_RS3_LE:
1880 result = get_mips_segment_type (p_type);
1883 result = get_parisc_segment_type (p_type);
1886 result = get_ia64_segment_type (p_type);
1896 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
1898 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
1900 const char * result;
1902 switch (elf_header.e_machine)
1905 result = get_parisc_segment_type (p_type);
1915 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
1918 sprintf (buff, _("<unknown>: %lx"), p_type);
1925 get_mips_section_type_name (sh_type)
1926 unsigned int sh_type;
1930 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1931 case SHT_MIPS_MSYM: return "MIPS_MSYM";
1932 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1933 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
1934 case SHT_MIPS_UCODE: return "MIPS_UCODE";
1935 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
1936 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
1937 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
1938 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
1939 case SHT_MIPS_RELD: return "MIPS_RELD";
1940 case SHT_MIPS_IFACE: return "MIPS_IFACE";
1941 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
1942 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1943 case SHT_MIPS_SHDR: return "MIPS_SHDR";
1944 case SHT_MIPS_FDESC: return "MIPS_FDESC";
1945 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
1946 case SHT_MIPS_DENSE: return "MIPS_DENSE";
1947 case SHT_MIPS_PDESC: return "MIPS_PDESC";
1948 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
1949 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
1950 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
1951 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
1952 case SHT_MIPS_LINE: return "MIPS_LINE";
1953 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
1954 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
1955 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
1956 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
1957 case SHT_MIPS_DWARF: return "MIPS_DWARF";
1958 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
1959 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1960 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
1961 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
1962 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
1963 case SHT_MIPS_XLATE: return "MIPS_XLATE";
1964 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
1965 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
1966 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
1967 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
1968 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
1976 get_parisc_section_type_name (sh_type)
1977 unsigned int sh_type;
1981 case SHT_PARISC_EXT: return "PARISC_EXT";
1982 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
1983 case SHT_PARISC_DOC: return "PARISC_DOC";
1991 get_ia64_section_type_name (sh_type)
1992 unsigned int sh_type;
1996 case SHT_IA_64_EXT: return "IA_64_EXT";
1997 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
2005 get_section_type_name (sh_type)
2006 unsigned int sh_type;
2008 static char buff [32];
2012 case SHT_NULL: return "NULL";
2013 case SHT_PROGBITS: return "PROGBITS";
2014 case SHT_SYMTAB: return "SYMTAB";
2015 case SHT_STRTAB: return "STRTAB";
2016 case SHT_RELA: return "RELA";
2017 case SHT_HASH: return "HASH";
2018 case SHT_DYNAMIC: return "DYNAMIC";
2019 case SHT_NOTE: return "NOTE";
2020 case SHT_NOBITS: return "NOBITS";
2021 case SHT_REL: return "REL";
2022 case SHT_SHLIB: return "SHLIB";
2023 case SHT_DYNSYM: return "DYNSYM";
2024 case SHT_INIT_ARRAY: return "INIT_ARRAY";
2025 case SHT_FINI_ARRAY: return "FINI_ARRAY";
2026 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2027 case SHT_GROUP: return "GROUP";
2028 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
2029 case SHT_GNU_verdef: return "VERDEF";
2030 case SHT_GNU_verneed: return "VERNEED";
2031 case SHT_GNU_versym: return "VERSYM";
2032 case 0x6ffffff0: return "VERSYM";
2033 case 0x6ffffffc: return "VERDEF";
2034 case 0x7ffffffd: return "AUXILIARY";
2035 case 0x7fffffff: return "FILTER";
2038 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
2040 const char * result;
2042 switch (elf_header.e_machine)
2045 case EM_MIPS_RS3_LE:
2046 result = get_mips_section_type_name (sh_type);
2049 result = get_parisc_section_type_name (sh_type);
2052 result = get_ia64_section_type_name (sh_type);
2062 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
2064 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
2065 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
2066 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
2067 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
2069 sprintf (buff, _("<unknown>: %x"), sh_type);
2075 struct option options [] =
2077 {"all", no_argument, 0, 'a'},
2078 {"file-header", no_argument, 0, 'h'},
2079 {"program-headers", no_argument, 0, 'l'},
2080 {"headers", no_argument, 0, 'e'},
2081 {"histogram", no_argument, 0, 'I'},
2082 {"segments", no_argument, 0, 'l'},
2083 {"sections", no_argument, 0, 'S'},
2084 {"section-headers", no_argument, 0, 'S'},
2085 {"symbols", no_argument, 0, 's'},
2086 {"syms", no_argument, 0, 's'},
2087 {"relocs", no_argument, 0, 'r'},
2088 {"notes", no_argument, 0, 'n'},
2089 {"dynamic", no_argument, 0, 'd'},
2090 {"arch-specific", no_argument, 0, 'A'},
2091 {"version-info", no_argument, 0, 'V'},
2092 {"use-dynamic", no_argument, 0, 'D'},
2093 {"hex-dump", required_argument, 0, 'x'},
2094 {"debug-dump", optional_argument, 0, 'w'},
2095 {"unwind", no_argument, 0, 'u'},
2096 #ifdef SUPPORT_DISASSEMBLY
2097 {"instruction-dump", required_argument, 0, 'i'},
2100 {"version", no_argument, 0, 'v'},
2101 {"wide", no_argument, 0, 'W'},
2102 {"help", no_argument, 0, 'H'},
2103 {0, no_argument, 0, 0}
2109 fprintf (stdout, _("Usage: readelf {options} elf-file(s)\n"));
2110 fprintf (stdout, _(" Options are:\n"));
2111 fprintf (stdout, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
2112 fprintf (stdout, _(" -h or --file-header Display the ELF file header\n"));
2113 fprintf (stdout, _(" -l or --program-headers or --segments\n"));
2114 fprintf (stdout, _(" Display the program headers\n"));
2115 fprintf (stdout, _(" -S or --section-headers or --sections\n"));
2116 fprintf (stdout, _(" Display the sections' header\n"));
2117 fprintf (stdout, _(" -e or --headers Equivalent to: -h -l -S\n"));
2118 fprintf (stdout, _(" -s or --syms or --symbols Display the symbol table\n"));
2119 fprintf (stdout, _(" -n or --notes Display the core notes (if present)\n"));
2120 fprintf (stdout, _(" -r or --relocs Display the relocations (if present)\n"));
2121 fprintf (stdout, _(" -u or --unwind Display the unwind info (if present)\n"));
2122 fprintf (stdout, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
2123 fprintf (stdout, _(" -V or --version-info Display the version sections (if present)\n"));
2124 fprintf (stdout, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
2125 fprintf (stdout, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
2126 fprintf (stdout, _(" -x <number> or --hex-dump=<number>\n"));
2127 fprintf (stdout, _(" Dump the contents of section <number>\n"));
2128 fprintf (stdout, _(" -w[liaprmfs] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str]\n"));
2129 fprintf (stdout, _(" Display the contents of DWARF2 debug sections\n"));
2130 #ifdef SUPPORT_DISASSEMBLY
2131 fprintf (stdout, _(" -i <number> or --instruction-dump=<number>\n"));
2132 fprintf (stdout, _(" Disassemble the contents of section <number>\n"));
2134 fprintf (stdout, _(" -I or --histogram Display histogram of bucket list lengths\n"));
2135 fprintf (stdout, _(" -v or --version Display the version number of readelf\n"));
2136 fprintf (stdout, _(" -W or --wide Don't split lines to fit into 80 columns\n"));
2137 fprintf (stdout, _(" -H or --help Display this information\n"));
2138 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2144 request_dump (section, type)
2145 unsigned int section;
2148 if (section >= num_dump_sects)
2150 char * new_dump_sects;
2152 new_dump_sects = (char *) calloc (section + 1, 1);
2154 if (new_dump_sects == NULL)
2155 error (_("Out of memory allocating dump request table."));
2158 /* Copy current flag settings. */
2159 memcpy (new_dump_sects, dump_sects, num_dump_sects);
2163 dump_sects = new_dump_sects;
2164 num_dump_sects = section + 1;
2169 dump_sects [section] |= type;
2175 parse_args (argc, argv)
2184 while ((c = getopt_long
2185 (argc, argv, "ersuahnldSDAIw::x:i:vVW", options, NULL)) != EOF)
2221 do_using_dynamic ++;
2252 section = strtoul (optarg, & cp, 0);
2253 if (! * cp && section >= 0)
2255 request_dump (section, HEX_DUMP);
2265 unsigned int index = 0;
2269 while (optarg[index])
2270 switch (optarg[index++])
2279 do_debug_abbrevs = 1;
2289 do_debug_pubnames = 1;
2294 do_debug_aranges = 1;
2298 do_debug_frames_interp = 1;
2300 do_debug_frames = 1;
2305 do_debug_macinfo = 1;
2314 warn (_("Unrecognised debug option '%s'\n"), optarg);
2319 #ifdef SUPPORT_DISASSEMBLY
2322 section = strtoul (optarg, & cp, 0);
2323 if (! * cp && section >= 0)
2325 request_dump (section, DISASS_DUMP);
2331 print_version (program_name);
2341 /* xgettext:c-format */
2342 error (_("Invalid option '-%c'\n"), c);
2349 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
2350 && !do_segments && !do_header && !do_dump && !do_version
2351 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2355 warn (_("Nothing to do.\n"));
2361 get_elf_class (elf_class)
2362 unsigned int elf_class;
2364 static char buff [32];
2368 case ELFCLASSNONE: return _("none");
2369 case ELFCLASS32: return "ELF32";
2370 case ELFCLASS64: return "ELF64";
2372 sprintf (buff, _("<unknown: %x>"), elf_class);
2378 get_data_encoding (encoding)
2379 unsigned int encoding;
2381 static char buff [32];
2385 case ELFDATANONE: return _("none");
2386 case ELFDATA2LSB: return _("2's complement, little endian");
2387 case ELFDATA2MSB: return _("2's complement, big endian");
2389 sprintf (buff, _("<unknown: %x>"), encoding);
2395 get_osabi_name (osabi)
2398 static char buff [32];
2402 case ELFOSABI_NONE: return "UNIX - System V";
2403 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2404 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2405 case ELFOSABI_LINUX: return "UNIX - Linux";
2406 case ELFOSABI_HURD: return "GNU/Hurd";
2407 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2408 case ELFOSABI_AIX: return "UNIX - AIX";
2409 case ELFOSABI_IRIX: return "UNIX - IRIX";
2410 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2411 case ELFOSABI_TRU64: return "UNIX - TRU64";
2412 case ELFOSABI_MODESTO: return "Novell - Modesto";
2413 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2414 case ELFOSABI_STANDALONE: return _("Standalone App");
2415 case ELFOSABI_ARM: return "ARM";
2417 sprintf (buff, _("<unknown: %x>"), osabi);
2422 /* Decode the data held in 'elf_header'. */
2424 process_file_header ()
2426 if ( elf_header.e_ident [EI_MAG0] != ELFMAG0
2427 || elf_header.e_ident [EI_MAG1] != ELFMAG1
2428 || elf_header.e_ident [EI_MAG2] != ELFMAG2
2429 || elf_header.e_ident [EI_MAG3] != ELFMAG3)
2432 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2440 printf (_("ELF Header:\n"));
2441 printf (_(" Magic: "));
2442 for (i = 0; i < EI_NIDENT; i ++)
2443 printf ("%2.2x ", elf_header.e_ident [i]);
2445 printf (_(" Class: %s\n"),
2446 get_elf_class (elf_header.e_ident [EI_CLASS]));
2447 printf (_(" Data: %s\n"),
2448 get_data_encoding (elf_header.e_ident [EI_DATA]));
2449 printf (_(" Version: %d %s\n"),
2450 elf_header.e_ident [EI_VERSION],
2451 (elf_header.e_ident [EI_VERSION] == EV_CURRENT
2453 : (elf_header.e_ident [EI_VERSION] != EV_NONE
2456 printf (_(" OS/ABI: %s\n"),
2457 get_osabi_name (elf_header.e_ident [EI_OSABI]));
2458 printf (_(" ABI Version: %d\n"),
2459 elf_header.e_ident [EI_ABIVERSION]);
2460 printf (_(" Type: %s\n"),
2461 get_file_type (elf_header.e_type));
2462 printf (_(" Machine: %s\n"),
2463 get_machine_name (elf_header.e_machine));
2464 printf (_(" Version: 0x%lx\n"),
2465 (unsigned long) elf_header.e_version);
2467 printf (_(" Entry point address: "));
2468 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2469 printf (_("\n Start of program headers: "));
2470 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2471 printf (_(" (bytes into file)\n Start of section headers: "));
2472 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2473 printf (_(" (bytes into file)\n"));
2475 printf (_(" Flags: 0x%lx%s\n"),
2476 (unsigned long) elf_header.e_flags,
2477 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2478 printf (_(" Size of this header: %ld (bytes)\n"),
2479 (long) elf_header.e_ehsize);
2480 printf (_(" Size of program headers: %ld (bytes)\n"),
2481 (long) elf_header.e_phentsize);
2482 printf (_(" Number of program headers: %ld\n"),
2483 (long) elf_header.e_phnum);
2484 printf (_(" Size of section headers: %ld (bytes)\n"),
2485 (long) elf_header.e_shentsize);
2486 printf (_(" Number of section headers: %ld"),
2487 (long) elf_header.e_shnum);
2488 if (section_headers != NULL && elf_header.e_shnum == 0)
2489 printf (" (%ld)", (long) section_headers[0].sh_size);
2490 putc ('\n', stdout);
2491 printf (_(" Section header string table index: %ld"),
2492 (long) elf_header.e_shstrndx);
2493 if (section_headers != NULL && elf_header.e_shstrndx == SHN_XINDEX)
2494 printf (" (%ld)", (long) section_headers[0].sh_link);
2495 putc ('\n', stdout);
2498 if (section_headers != NULL)
2500 if (elf_header.e_shnum == 0)
2501 elf_header.e_shnum = section_headers[0].sh_size;
2502 if (elf_header.e_shstrndx == SHN_XINDEX)
2503 elf_header.e_shstrndx = section_headers[0].sh_link;
2504 free (section_headers);
2505 section_headers = NULL;
2513 get_32bit_program_headers (file, program_headers)
2515 Elf_Internal_Phdr * program_headers;
2517 Elf32_External_Phdr * phdrs;
2518 Elf32_External_Phdr * external;
2519 Elf32_Internal_Phdr * internal;
2522 phdrs = ((Elf32_External_Phdr *)
2523 get_data (NULL, file, elf_header.e_phoff,
2524 elf_header.e_phentsize * elf_header.e_phnum,
2525 _("program headers")));
2529 for (i = 0, internal = program_headers, external = phdrs;
2530 i < elf_header.e_phnum;
2531 i ++, internal ++, external ++)
2533 internal->p_type = BYTE_GET (external->p_type);
2534 internal->p_offset = BYTE_GET (external->p_offset);
2535 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2536 internal->p_paddr = BYTE_GET (external->p_paddr);
2537 internal->p_filesz = BYTE_GET (external->p_filesz);
2538 internal->p_memsz = BYTE_GET (external->p_memsz);
2539 internal->p_flags = BYTE_GET (external->p_flags);
2540 internal->p_align = BYTE_GET (external->p_align);
2549 get_64bit_program_headers (file, program_headers)
2551 Elf_Internal_Phdr * program_headers;
2553 Elf64_External_Phdr * phdrs;
2554 Elf64_External_Phdr * external;
2555 Elf64_Internal_Phdr * internal;
2558 phdrs = ((Elf64_External_Phdr *)
2559 get_data (NULL, file, elf_header.e_phoff,
2560 elf_header.e_phentsize * elf_header.e_phnum,
2561 _("program headers")));
2565 for (i = 0, internal = program_headers, external = phdrs;
2566 i < elf_header.e_phnum;
2567 i ++, internal ++, external ++)
2569 internal->p_type = BYTE_GET (external->p_type);
2570 internal->p_flags = BYTE_GET (external->p_flags);
2571 internal->p_offset = BYTE_GET8 (external->p_offset);
2572 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2573 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2574 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2575 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2576 internal->p_align = BYTE_GET8 (external->p_align);
2585 process_program_headers (file)
2588 Elf_Internal_Phdr * program_headers;
2589 Elf_Internal_Phdr * segment;
2592 if (elf_header.e_phnum == 0)
2595 printf (_("\nThere are no program headers in this file.\n"));
2599 if (do_segments && !do_header)
2601 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2602 printf (_("Entry point "));
2603 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2604 printf (_("\nThere are %d program headers, starting at offset "),
2605 elf_header.e_phnum);
2606 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2610 program_headers = (Elf_Internal_Phdr *) malloc
2611 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2613 if (program_headers == NULL)
2615 error (_("Out of memory\n"));
2620 i = get_32bit_program_headers (file, program_headers);
2622 i = get_64bit_program_headers (file, program_headers);
2626 free (program_headers);
2633 (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2637 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2640 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2644 (_(" Type Offset VirtAddr PhysAddr\n"));
2646 (_(" FileSiz MemSiz Flags Align\n"));
2654 for (i = 0, segment = program_headers;
2655 i < elf_header.e_phnum;
2660 printf (" %-14.14s ", get_segment_type (segment->p_type));
2664 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2665 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2666 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2667 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2668 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2670 (segment->p_flags & PF_R ? 'R' : ' '),
2671 (segment->p_flags & PF_W ? 'W' : ' '),
2672 (segment->p_flags & PF_X ? 'E' : ' '));
2673 printf ("%#lx", (unsigned long) segment->p_align);
2677 if ((unsigned long) segment->p_offset == segment->p_offset)
2678 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2681 print_vma (segment->p_offset, FULL_HEX);
2685 print_vma (segment->p_vaddr, FULL_HEX);
2687 print_vma (segment->p_paddr, FULL_HEX);
2690 if ((unsigned long) segment->p_filesz == segment->p_filesz)
2691 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
2694 print_vma (segment->p_filesz, FULL_HEX);
2698 if ((unsigned long) segment->p_memsz == segment->p_memsz)
2699 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
2702 print_vma (segment->p_offset, FULL_HEX);
2706 (segment->p_flags & PF_R ? 'R' : ' '),
2707 (segment->p_flags & PF_W ? 'W' : ' '),
2708 (segment->p_flags & PF_X ? 'E' : ' '));
2710 if ((unsigned long) segment->p_align == segment->p_align)
2711 printf ("%#lx", (unsigned long) segment->p_align);
2714 print_vma (segment->p_align, PREFIX_HEX);
2719 print_vma (segment->p_offset, FULL_HEX);
2721 print_vma (segment->p_vaddr, FULL_HEX);
2723 print_vma (segment->p_paddr, FULL_HEX);
2725 print_vma (segment->p_filesz, FULL_HEX);
2727 print_vma (segment->p_memsz, FULL_HEX);
2729 (segment->p_flags & PF_R ? 'R' : ' '),
2730 (segment->p_flags & PF_W ? 'W' : ' '),
2731 (segment->p_flags & PF_X ? 'E' : ' '));
2732 print_vma (segment->p_align, HEX);
2736 switch (segment->p_type)
2740 loadaddr = (segment->p_vaddr & 0xfffff000)
2741 - (segment->p_offset & 0xfffff000);
2746 error (_("more than one dynamic segment\n"));
2748 dynamic_addr = segment->p_offset;
2749 dynamic_size = segment->p_filesz;
2753 if (fseek (file, (long) segment->p_offset, SEEK_SET))
2754 error (_("Unable to find program interpreter name\n"));
2757 program_interpreter[0] = 0;
2758 fscanf (file, "%63s", program_interpreter);
2761 printf (_("\n [Requesting program interpreter: %s]"),
2762 program_interpreter);
2768 putc ('\n', stdout);
2777 if (do_segments && section_headers != NULL)
2779 printf (_("\n Section to Segment mapping:\n"));
2780 printf (_(" Segment Sections...\n"));
2782 assert (string_table != NULL);
2784 for (i = 0; i < elf_header.e_phnum; i++)
2787 Elf_Internal_Shdr * section;
2789 segment = program_headers + i;
2790 section = section_headers;
2792 printf (" %2.2d ", i);
2794 for (j = 1; j < elf_header.e_shnum; j++, section ++)
2796 if (section->sh_size > 0
2797 /* Compare allocated sections by VMA, unallocated
2798 sections by file offset. */
2799 && (section->sh_flags & SHF_ALLOC
2800 ? (section->sh_addr >= segment->p_vaddr
2801 && section->sh_addr + section->sh_size
2802 <= segment->p_vaddr + segment->p_memsz)
2803 : ((bfd_vma) section->sh_offset >= segment->p_offset
2804 && (section->sh_offset + section->sh_size
2805 <= segment->p_offset + segment->p_filesz))))
2806 printf ("%s ", SECTION_NAME (section));
2813 free (program_headers);
2820 get_32bit_section_headers (file, num)
2824 Elf32_External_Shdr * shdrs;
2825 Elf32_Internal_Shdr * internal;
2828 shdrs = ((Elf32_External_Shdr *)
2829 get_data (NULL, file, elf_header.e_shoff,
2830 elf_header.e_shentsize * num,
2831 _("section headers")));
2835 section_headers = ((Elf_Internal_Shdr *)
2836 malloc (num * sizeof (Elf_Internal_Shdr)));
2838 if (section_headers == NULL)
2840 error (_("Out of memory\n"));
2844 for (i = 0, internal = section_headers;
2848 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2849 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2850 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
2851 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
2852 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2853 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
2854 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2855 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2856 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2857 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
2866 get_64bit_section_headers (file, num)
2870 Elf64_External_Shdr * shdrs;
2871 Elf64_Internal_Shdr * internal;
2874 shdrs = ((Elf64_External_Shdr *)
2875 get_data (NULL, file, elf_header.e_shoff,
2876 elf_header.e_shentsize * num,
2877 _("section headers")));
2881 section_headers = ((Elf_Internal_Shdr *)
2882 malloc (num * sizeof (Elf_Internal_Shdr)));
2884 if (section_headers == NULL)
2886 error (_("Out of memory\n"));
2890 for (i = 0, internal = section_headers;
2894 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2895 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2896 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
2897 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
2898 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
2899 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
2900 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2901 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2902 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2903 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2911 static Elf_Internal_Sym *
2912 get_32bit_elf_symbols (file, section)
2914 Elf_Internal_Shdr *section;
2916 unsigned long number;
2917 Elf32_External_Sym * esyms;
2918 Elf_External_Sym_Shndx *shndx;
2919 Elf_Internal_Sym * isyms;
2920 Elf_Internal_Sym * psym;
2923 esyms = ((Elf32_External_Sym *)
2924 get_data (NULL, file, section->sh_offset,
2925 section->sh_size, _("symbols")));
2930 if (symtab_shndx_hdr != NULL
2931 && (symtab_shndx_hdr->sh_link
2932 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
2934 shndx = ((Elf_External_Sym_Shndx *)
2935 get_data (NULL, file, symtab_shndx_hdr->sh_offset,
2936 symtab_shndx_hdr->sh_size, _("symtab shndx")));
2944 number = section->sh_size / section->sh_entsize;
2945 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2949 error (_("Out of memory\n"));
2956 for (j = 0, psym = isyms;
2960 psym->st_name = BYTE_GET (esyms[j].st_name);
2961 psym->st_value = BYTE_GET (esyms[j].st_value);
2962 psym->st_size = BYTE_GET (esyms[j].st_size);
2963 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2964 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
2966 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
2967 psym->st_info = BYTE_GET (esyms[j].st_info);
2968 psym->st_other = BYTE_GET (esyms[j].st_other);
2978 static Elf_Internal_Sym *
2979 get_64bit_elf_symbols (file, section)
2981 Elf_Internal_Shdr *section;
2983 unsigned long number;
2984 Elf64_External_Sym * esyms;
2985 Elf_External_Sym_Shndx *shndx;
2986 Elf_Internal_Sym * isyms;
2987 Elf_Internal_Sym * psym;
2990 esyms = ((Elf64_External_Sym *)
2991 get_data (NULL, file, section->sh_offset,
2992 section->sh_size, _("symbols")));
2997 if (symtab_shndx_hdr != NULL
2998 && (symtab_shndx_hdr->sh_link
2999 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3001 shndx = ((Elf_External_Sym_Shndx *)
3002 get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3003 symtab_shndx_hdr->sh_size, _("symtab shndx")));
3011 number = section->sh_size / section->sh_entsize;
3012 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
3016 error (_("Out of memory\n"));
3023 for (j = 0, psym = isyms;
3027 psym->st_name = BYTE_GET (esyms[j].st_name);
3028 psym->st_info = BYTE_GET (esyms[j].st_info);
3029 psym->st_other = BYTE_GET (esyms[j].st_other);
3030 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3031 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3033 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3034 psym->st_value = BYTE_GET8 (esyms[j].st_value);
3035 psym->st_size = BYTE_GET8 (esyms[j].st_size);
3046 get_elf_section_flags (sh_flags)
3049 static char buff [32];
3057 flag = sh_flags & - sh_flags;
3062 case SHF_WRITE: strcat (buff, "W"); break;
3063 case SHF_ALLOC: strcat (buff, "A"); break;
3064 case SHF_EXECINSTR: strcat (buff, "X"); break;
3065 case SHF_MERGE: strcat (buff, "M"); break;
3066 case SHF_STRINGS: strcat (buff, "S"); break;
3067 case SHF_INFO_LINK: strcat (buff, "I"); break;
3068 case SHF_LINK_ORDER: strcat (buff, "L"); break;
3069 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
3070 case SHF_GROUP: strcat (buff, "G"); break;
3073 if (flag & SHF_MASKOS)
3076 sh_flags &= ~ SHF_MASKOS;
3078 else if (flag & SHF_MASKPROC)
3081 sh_flags &= ~ SHF_MASKPROC;
3093 process_section_headers (file)
3096 Elf_Internal_Shdr * section;
3099 section_headers = NULL;
3101 if (elf_header.e_shnum == 0)
3104 printf (_("\nThere are no sections in this file.\n"));
3109 if (do_sections && !do_header)
3110 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3111 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
3115 if (! get_32bit_section_headers (file, elf_header.e_shnum))
3118 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
3121 /* Read in the string table, so that we have names to display. */
3122 section = SECTION_HEADER (elf_header.e_shstrndx);
3124 if (section->sh_size != 0)
3126 string_table = (char *) get_data (NULL, file, section->sh_offset,
3127 section->sh_size, _("string table"));
3129 string_table_length = section->sh_size;
3132 /* Scan the sections for the dynamic symbol table
3133 and dynamic string table and debug sections. */
3134 dynamic_symbols = NULL;
3135 dynamic_strings = NULL;
3136 dynamic_syminfo = NULL;
3138 for (i = 0, section = section_headers;
3139 i < elf_header.e_shnum;
3142 char * name = SECTION_NAME (section);
3144 if (section->sh_type == SHT_DYNSYM)
3146 if (dynamic_symbols != NULL)
3148 error (_("File contains multiple dynamic symbol tables\n"));
3152 num_dynamic_syms = section->sh_size / section->sh_entsize;
3153 dynamic_symbols = GET_ELF_SYMBOLS (file, section);
3155 else if (section->sh_type == SHT_STRTAB
3156 && strcmp (name, ".dynstr") == 0)
3158 if (dynamic_strings != NULL)
3160 error (_("File contains multiple dynamic string tables\n"));
3164 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
3166 _("dynamic strings"));
3168 else if (section->sh_type == SHT_SYMTAB_SHNDX)
3170 if (symtab_shndx_hdr != NULL)
3172 error (_("File contains multiple symtab shndx tables\n"));
3175 symtab_shndx_hdr = section;
3177 else if ((do_debugging || do_debug_info || do_debug_abbrevs
3178 || do_debug_lines || do_debug_pubnames || do_debug_aranges
3179 || do_debug_frames || do_debug_macinfo || do_debug_str)
3180 && strncmp (name, ".debug_", 7) == 0)
3185 || (do_debug_info && (strcmp (name, "info") == 0))
3186 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
3187 || (do_debug_lines && (strcmp (name, "line") == 0))
3188 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
3189 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
3190 || (do_debug_frames && (strcmp (name, "frame") == 0))
3191 || (do_debug_macinfo && (strcmp (name, "macinfo") == 0))
3192 || (do_debug_str && (strcmp (name, "str") == 0))
3194 request_dump (i, DEBUG_DUMP);
3196 /* linkonce section to be combined with .debug_info at link time. */
3197 else if ((do_debugging || do_debug_info)
3198 && strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
3199 request_dump (i, DEBUG_DUMP);
3200 else if (do_debug_frames && strcmp (name, ".eh_frame") == 0)
3201 request_dump (i, DEBUG_DUMP);
3207 printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
3211 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3214 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3217 printf (_(" [Nr] Name Type Address Offset\n"));
3218 printf (_(" Size EntSize Flags Link Info Align\n"));
3221 for (i = 0, section = section_headers;
3222 i < elf_header.e_shnum;
3225 printf (" [%2u] %-17.17s %-15.15s ",
3226 SECTION_HEADER_NUM (i),
3227 SECTION_NAME (section),
3228 get_section_type_name (section->sh_type));
3232 print_vma (section->sh_addr, LONG_HEX);
3234 printf ( " %6.6lx %6.6lx %2.2lx",
3235 (unsigned long) section->sh_offset,
3236 (unsigned long) section->sh_size,
3237 (unsigned long) section->sh_entsize);
3239 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3241 printf ("%2ld %3lx %2ld\n",
3242 (unsigned long) section->sh_link,
3243 (unsigned long) section->sh_info,
3244 (unsigned long) section->sh_addralign);
3248 print_vma (section->sh_addr, LONG_HEX);
3250 if ((long) section->sh_offset == section->sh_offset)
3251 printf (" %6.6lx", (unsigned long) section->sh_offset);
3255 print_vma (section->sh_offset, LONG_HEX);
3258 if ((unsigned long) section->sh_size == section->sh_size)
3259 printf (" %6.6lx", (unsigned long) section->sh_size);
3263 print_vma (section->sh_size, LONG_HEX);
3266 if ((unsigned long) section->sh_entsize == section->sh_entsize)
3267 printf (" %2.2lx", (unsigned long) section->sh_entsize);
3271 print_vma (section->sh_entsize, LONG_HEX);
3274 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3276 printf ("%2ld %3lx ",
3277 (unsigned long) section->sh_link,
3278 (unsigned long) section->sh_info);
3280 if ((unsigned long) section->sh_addralign == section->sh_addralign)
3281 printf ("%2ld\n", (unsigned long) section->sh_addralign);
3284 print_vma (section->sh_addralign, DEC);
3291 print_vma (section->sh_addr, LONG_HEX);
3292 if ((long) section->sh_offset == section->sh_offset)
3293 printf (" %8.8lx", (unsigned long) section->sh_offset);
3297 print_vma (section->sh_offset, LONG_HEX);
3300 print_vma (section->sh_size, LONG_HEX);
3302 print_vma (section->sh_entsize, LONG_HEX);
3304 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3306 printf (" %2ld %3lx %ld\n",
3307 (unsigned long) section->sh_link,
3308 (unsigned long) section->sh_info,
3309 (unsigned long) section->sh_addralign);
3313 printf (_("Key to Flags:\n\
3314 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3315 I (info), L (link order), G (group), x (unknown)\n\
3316 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3321 /* Process the reloc section. */
3323 process_relocs (file)
3326 unsigned long rel_size;
3327 unsigned long rel_offset;
3333 if (do_using_dynamic)
3335 int is_rela = FALSE;
3340 if (dynamic_info[DT_REL])
3342 rel_offset = dynamic_info[DT_REL];
3343 rel_size = dynamic_info[DT_RELSZ];
3346 else if (dynamic_info [DT_RELA])
3348 rel_offset = dynamic_info[DT_RELA];
3349 rel_size = dynamic_info[DT_RELASZ];
3352 else if (dynamic_info[DT_JMPREL])
3354 rel_offset = dynamic_info[DT_JMPREL];
3355 rel_size = dynamic_info[DT_PLTRELSZ];
3357 switch (dynamic_info[DT_PLTREL])
3374 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3375 rel_offset, rel_size);
3377 dump_relocations (file, rel_offset - loadaddr, rel_size,
3378 dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
3381 printf (_("\nThere are no dynamic relocations in this file.\n"));
3385 Elf32_Internal_Shdr * section;
3389 for (i = 0, section = section_headers;
3390 i < elf_header.e_shnum;
3393 if ( section->sh_type != SHT_RELA
3394 && section->sh_type != SHT_REL)
3397 rel_offset = section->sh_offset;
3398 rel_size = section->sh_size;
3402 Elf32_Internal_Shdr * strsec;
3403 Elf_Internal_Sym * symtab;
3406 unsigned long nsyms;
3408 printf (_("\nRelocation section "));
3410 if (string_table == NULL)
3411 printf ("%d", section->sh_name);
3413 printf ("'%s'", SECTION_NAME (section));
3415 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3416 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
3421 if (section->sh_link)
3423 Elf32_Internal_Shdr * symsec;
3425 symsec = SECTION_HEADER (section->sh_link);
3426 nsyms = symsec->sh_size / symsec->sh_entsize;
3427 symtab = GET_ELF_SYMBOLS (file, symsec);
3432 strsec = SECTION_HEADER (symsec->sh_link);
3434 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3438 is_rela = section->sh_type == SHT_RELA;
3440 dump_relocations (file, rel_offset, rel_size,
3441 symtab, nsyms, strtab, is_rela);
3453 printf (_("\nThere are no relocations in this file.\n"));
3459 #include "unwind-ia64.h"
3461 /* An absolute address consists of a section and an offset. If the
3462 section is NULL, the offset itself is the address, otherwise, the
3463 address equals to LOAD_ADDRESS(section) + offset. */
3467 unsigned short section;
3473 struct unw_table_entry
3475 struct absaddr start;
3477 struct absaddr info;
3479 *table; /* Unwind table. */
3480 unsigned long table_len; /* Length of unwind table. */
3481 unsigned char * info; /* Unwind info. */
3482 unsigned long info_size; /* Size of unwind info. */
3483 bfd_vma info_addr; /* starting address of unwind info. */
3484 bfd_vma seg_base; /* Starting address of segment. */
3485 Elf_Internal_Sym * symtab; /* The symbol table. */
3486 unsigned long nsyms; /* Number of symbols. */
3487 char * strtab; /* The string table. */
3488 unsigned long strtab_size; /* Size of string table. */
3491 static void find_symbol_for_address PARAMS ((struct unw_aux_info *,
3492 struct absaddr, const char **,
3494 static void dump_ia64_unwind PARAMS ((struct unw_aux_info *));
3495 static int slurp_ia64_unwind_table PARAMS ((FILE *, struct unw_aux_info *,
3496 Elf32_Internal_Shdr *));
3499 find_symbol_for_address (aux, addr, symname, offset)
3500 struct unw_aux_info *aux;
3501 struct absaddr addr;
3502 const char **symname;
3505 bfd_vma dist = (bfd_vma) 0x100000;
3506 Elf_Internal_Sym *sym, *best = NULL;
3509 for (i = 0, sym = aux->symtab; i < aux->nsyms; ++i, ++sym)
3511 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
3512 && sym->st_name != 0
3513 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
3514 && addr.offset >= sym->st_value
3515 && addr.offset - sym->st_value < dist)
3518 dist = addr.offset - sym->st_value;
3525 *symname = (best->st_name >= aux->strtab_size
3526 ? "<corrupt>" : aux->strtab + best->st_name);
3531 *offset = addr.offset;
3535 dump_ia64_unwind (aux)
3536 struct unw_aux_info *aux;
3539 struct unw_table_entry * tp;
3542 addr_size = is_32bit_elf ? 4 : 8;
3544 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
3548 const unsigned char * dp;
3549 const unsigned char * head;
3550 const char * procname;
3552 find_symbol_for_address (aux, tp->start, &procname, &offset);
3554 fputs ("\n<", stdout);
3558 fputs (procname, stdout);
3561 printf ("+%lx", (unsigned long) offset);
3564 fputs (">: [", stdout);
3565 print_vma (tp->start.offset, PREFIX_HEX);
3566 fputc ('-', stdout);
3567 print_vma (tp->end.offset, PREFIX_HEX);
3568 printf ("), info at +0x%lx\n",
3569 (unsigned long) (tp->info.offset - aux->seg_base));
3571 head = aux->info + (tp->info.offset - aux->info_addr);
3572 stamp = BYTE_GET8 ((unsigned char *) head);
3574 printf (" v%u, flags=0x%lx (%s%s ), len=%lu bytes\n",
3575 (unsigned) UNW_VER (stamp),
3576 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
3577 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
3578 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
3579 (unsigned long) (addr_size * UNW_LENGTH (stamp)));
3581 if (UNW_VER (stamp) != 1)
3583 printf ("\tUnknown version.\n");
3588 for (dp = head + 8; dp < head + 8 + addr_size * UNW_LENGTH (stamp);)
3589 dp = unw_decode (dp, in_body, & in_body);
3594 slurp_ia64_unwind_table (file, aux, sec)
3596 struct unw_aux_info *aux;
3597 Elf32_Internal_Shdr *sec;
3599 unsigned long size, addr_size, nrelas, i;
3600 Elf_Internal_Phdr *prog_hdrs, *seg;
3601 struct unw_table_entry *tep;
3602 Elf32_Internal_Shdr *relsec;
3603 Elf_Internal_Rela *rela, *rp;
3604 unsigned char *table, *tp;
3605 Elf_Internal_Sym *sym;
3606 const char *relname;
3609 addr_size = is_32bit_elf ? 4 : 8;
3611 /* First, find the starting address of the segment that includes
3614 if (elf_header.e_phnum)
3616 prog_hdrs = (Elf_Internal_Phdr *)
3617 xmalloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
3620 result = get_32bit_program_headers (file, prog_hdrs);
3622 result = get_64bit_program_headers (file, prog_hdrs);
3630 for (seg = prog_hdrs; seg < prog_hdrs + elf_header.e_phnum; ++seg)
3632 if (seg->p_type != PT_LOAD)
3635 if (sec->sh_addr >= seg->p_vaddr
3636 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
3638 aux->seg_base = seg->p_vaddr;
3646 /* Second, build the unwind table from the contents of the unwind section: */
3647 size = sec->sh_size;
3648 table = (char *) get_data (NULL, file, sec->sh_offset,
3649 size, _("unwind table"));
3653 tep = aux->table = xmalloc (size / (3 * addr_size) * sizeof (aux->table[0]));
3654 for (tp = table; tp < table + size; tp += 3 * addr_size, ++ tep)
3656 tep->start.section = SHN_UNDEF;
3657 tep->end.section = SHN_UNDEF;
3658 tep->info.section = SHN_UNDEF;
3661 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
3662 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
3663 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
3667 tep->start.offset = BYTE_GET8 ((unsigned char *) tp + 0);
3668 tep->end.offset = BYTE_GET8 ((unsigned char *) tp + 8);
3669 tep->info.offset = BYTE_GET8 ((unsigned char *) tp + 16);
3671 tep->start.offset += aux->seg_base;
3672 tep->end.offset += aux->seg_base;
3673 tep->info.offset += aux->seg_base;
3677 /* Third, apply any relocations to the unwind table: */
3679 for (relsec = section_headers;
3680 relsec < section_headers + elf_header.e_shnum;
3683 if (relsec->sh_type != SHT_RELA
3684 || SECTION_HEADER (relsec->sh_info) != sec)
3687 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
3691 for (rp = rela; rp < rela + nrelas; ++rp)
3695 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
3696 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
3698 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
3700 warn (_("Skipping unexpected symbol type %u\n"),
3701 ELF32_ST_TYPE (sym->st_info));
3707 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
3708 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
3710 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
3712 warn (_("Skipping unexpected symbol type %u\n"),
3713 ELF64_ST_TYPE (sym->st_info));
3718 if (strncmp (relname, "R_IA64_SEGREL", 13) != 0)
3720 warn (_("Skipping unexpected relocation type %s\n"), relname);
3724 i = rp->r_offset / (3 * addr_size);
3726 switch (rp->r_offset/addr_size % 3)
3729 aux->table[i].start.section = sym->st_shndx;
3730 aux->table[i].start.offset += rp->r_addend;
3733 aux->table[i].end.section = sym->st_shndx;
3734 aux->table[i].end.offset += rp->r_addend;
3737 aux->table[i].info.section = sym->st_shndx;
3738 aux->table[i].info.offset += rp->r_addend;
3748 aux->table_len = size / (3 * addr_size);
3753 process_unwind (file)
3756 Elf32_Internal_Shdr *sec, *unwsec = NULL, *strsec;
3757 unsigned long i, addr_size, unwcount = 0, unwstart = 0;
3758 struct unw_aux_info aux;
3763 if (elf_header.e_machine != EM_IA_64)
3765 printf (_("\nThere are no unwind sections in this file.\n"));
3769 memset (& aux, 0, sizeof (aux));
3771 addr_size = is_32bit_elf ? 4 : 8;
3773 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
3775 if (sec->sh_type == SHT_SYMTAB)
3777 aux.nsyms = sec->sh_size / sec->sh_entsize;
3778 aux.symtab = GET_ELF_SYMBOLS (file, sec);
3780 strsec = SECTION_HEADER (sec->sh_link);
3781 aux.strtab_size = strsec->sh_size;
3782 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3783 aux.strtab_size, _("string table"));
3785 else if (sec->sh_type == SHT_IA_64_UNWIND)
3790 printf (_("\nThere are no unwind sections in this file.\n"));
3792 while (unwcount-- > 0)
3797 for (i = unwstart, sec = section_headers + unwstart;
3798 i < elf_header.e_shnum; ++i, ++sec)
3799 if (sec->sh_type == SHT_IA_64_UNWIND)
3806 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
3808 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once,
3811 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
3812 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
3813 suffix = SECTION_NAME (unwsec) + len;
3814 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3816 if (strncmp (SECTION_NAME (sec),
3817 ELF_STRING_ia64_unwind_info_once, len2) == 0
3818 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3823 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
3824 .IA_64.unwind or BAR -> .IA_64.unwind_info */
3825 len = sizeof (ELF_STRING_ia64_unwind) - 1;
3826 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
3828 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind,
3830 suffix = SECTION_NAME (unwsec) + len;
3831 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3833 if (strncmp (SECTION_NAME (sec),
3834 ELF_STRING_ia64_unwind_info, len2) == 0
3835 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3839 if (i == elf_header.e_shnum)
3841 printf (_("\nCould not find unwind info section for "));
3843 if (string_table == NULL)
3844 printf ("%d", unwsec->sh_name);
3846 printf ("'%s'", SECTION_NAME (unwsec));
3850 aux.info_size = sec->sh_size;
3851 aux.info_addr = sec->sh_addr;
3852 aux.info = (char *) get_data (NULL, file, sec->sh_offset,
3853 aux.info_size, _("unwind info"));
3855 printf (_("\nUnwind section "));
3857 if (string_table == NULL)
3858 printf ("%d", unwsec->sh_name);
3860 printf ("'%s'", SECTION_NAME (unwsec));
3862 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3863 (unsigned long) unwsec->sh_offset,
3864 (unsigned long) (unwsec->sh_size / (3 * addr_size)));
3866 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
3868 if (aux.table_len > 0)
3869 dump_ia64_unwind (& aux);
3872 free ((char *) aux.table);
3874 free ((char *) aux.info);
3883 free ((char *) aux.strtab);
3889 dynamic_segment_mips_val (entry)
3890 Elf_Internal_Dyn * entry;
3892 switch (entry->d_tag)
3895 if (entry->d_un.d_val == 0)
3899 static const char * opts[] =
3901 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
3902 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
3903 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
3904 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
3909 for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
3910 if (entry->d_un.d_val & (1 << cnt))
3912 printf ("%s%s", first ? "" : " ", opts[cnt]);
3919 case DT_MIPS_IVERSION:
3920 if (dynamic_strings != NULL)
3921 printf ("Interface Version: %s\n",
3922 dynamic_strings + entry->d_un.d_val);
3924 printf ("%ld\n", (long) entry->d_un.d_ptr);
3927 case DT_MIPS_TIME_STAMP:
3932 time_t time = entry->d_un.d_val;
3933 tmp = gmtime (&time);
3934 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
3935 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
3936 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
3937 printf ("Time Stamp: %s\n", timebuf);
3941 case DT_MIPS_RLD_VERSION:
3942 case DT_MIPS_LOCAL_GOTNO:
3943 case DT_MIPS_CONFLICTNO:
3944 case DT_MIPS_LIBLISTNO:
3945 case DT_MIPS_SYMTABNO:
3946 case DT_MIPS_UNREFEXTNO:
3947 case DT_MIPS_HIPAGENO:
3948 case DT_MIPS_DELTA_CLASS_NO:
3949 case DT_MIPS_DELTA_INSTANCE_NO:
3950 case DT_MIPS_DELTA_RELOC_NO:
3951 case DT_MIPS_DELTA_SYM_NO:
3952 case DT_MIPS_DELTA_CLASSSYM_NO:
3953 case DT_MIPS_COMPACT_SIZE:
3954 printf ("%ld\n", (long) entry->d_un.d_ptr);
3958 printf ("%#lx\n", (long) entry->d_un.d_ptr);
3964 dynamic_segment_parisc_val (entry)
3965 Elf_Internal_Dyn * entry;
3967 switch (entry->d_tag)
3969 case DT_HP_DLD_FLAGS:
3978 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
3979 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
3980 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
3981 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
3982 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
3983 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
3984 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
3985 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
3986 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
3987 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
3988 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
3992 bfd_vma val = entry->d_un.d_val;
3994 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
3995 if (val & flags[cnt].bit)
3999 fputs (flags[cnt].str, stdout);
4001 val ^= flags[cnt].bit;
4004 if (val != 0 || first)
4008 print_vma (val, HEX);
4014 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
4020 get_32bit_dynamic_segment (file)
4023 Elf32_External_Dyn * edyn;
4024 Elf_Internal_Dyn * entry;
4027 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr,
4028 dynamic_size, _("dynamic segment"));
4032 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4033 how large this .dynamic is now. We can do this even before the byte
4034 swapping since the DT_NULL tag is recognizable. */
4036 while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
4039 dynamic_segment = (Elf_Internal_Dyn *)
4040 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
4042 if (dynamic_segment == NULL)
4044 error (_("Out of memory\n"));
4049 for (i = 0, entry = dynamic_segment;
4053 entry->d_tag = BYTE_GET (edyn [i].d_tag);
4054 entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
4063 get_64bit_dynamic_segment (file)
4066 Elf64_External_Dyn * edyn;
4067 Elf_Internal_Dyn * entry;
4070 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr,
4071 dynamic_size, _("dynamic segment"));
4075 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4076 how large this .dynamic is now. We can do this even before the byte
4077 swapping since the DT_NULL tag is recognizable. */
4079 while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
4082 dynamic_segment = (Elf_Internal_Dyn *)
4083 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
4085 if (dynamic_segment == NULL)
4087 error (_("Out of memory\n"));
4092 for (i = 0, entry = dynamic_segment;
4096 entry->d_tag = BYTE_GET8 (edyn [i].d_tag);
4097 entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
4106 get_dynamic_flags (flags)
4109 static char buff [64];
4114 flag = flags & - flags;
4119 case DF_ORIGIN: strcat (buff, "ORIGIN "); break;
4120 case DF_SYMBOLIC: strcat (buff, "SYMBOLIC "); break;
4121 case DF_TEXTREL: strcat (buff, "TEXTREL "); break;
4122 case DF_BIND_NOW: strcat (buff, "BIND_NOW "); break;
4123 default: strcat (buff, "unknown "); break;
4129 /* Parse and display the contents of the dynamic segment. */
4131 process_dynamic_segment (file)
4134 Elf_Internal_Dyn * entry;
4137 if (dynamic_size == 0)
4140 printf (_("\nThere is no dynamic segment in this file.\n"));
4147 if (! get_32bit_dynamic_segment (file))
4150 else if (! get_64bit_dynamic_segment (file))
4153 /* Find the appropriate symbol table. */
4154 if (dynamic_symbols == NULL)
4156 for (i = 0, entry = dynamic_segment;
4160 Elf32_Internal_Shdr section;
4162 if (entry->d_tag != DT_SYMTAB)
4165 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
4167 /* Since we do not know how big the symbol table is,
4168 we default to reading in the entire file (!) and
4169 processing that. This is overkill, I know, but it
4171 section.sh_offset = entry->d_un.d_val - loadaddr;
4173 if (fseek (file, 0, SEEK_END))
4174 error (_("Unable to seek to end of file!"));
4176 section.sh_size = ftell (file) - section.sh_offset;
4178 section.sh_entsize = sizeof (Elf32_External_Sym);
4180 section.sh_entsize = sizeof (Elf64_External_Sym);
4182 num_dynamic_syms = section.sh_size / section.sh_entsize;
4183 if (num_dynamic_syms < 1)
4185 error (_("Unable to determine the number of symbols to load\n"));
4189 dynamic_symbols = GET_ELF_SYMBOLS (file, §ion);
4193 /* Similarly find a string table. */
4194 if (dynamic_strings == NULL)
4196 for (i = 0, entry = dynamic_segment;
4200 unsigned long offset;
4203 if (entry->d_tag != DT_STRTAB)
4206 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
4208 /* Since we do not know how big the string table is,
4209 we default to reading in the entire file (!) and
4210 processing that. This is overkill, I know, but it
4213 offset = entry->d_un.d_val - loadaddr;
4214 if (fseek (file, 0, SEEK_END))
4215 error (_("Unable to seek to end of file\n"));
4216 str_tab_len = ftell (file) - offset;
4218 if (str_tab_len < 1)
4221 (_("Unable to determine the length of the dynamic string table\n"));
4225 dynamic_strings = (char *) get_data (NULL, file, offset, str_tab_len,
4226 _("dynamic string table"));
4231 /* And find the syminfo section if available. */
4232 if (dynamic_syminfo == NULL)
4234 unsigned int syminsz = 0;
4236 for (i = 0, entry = dynamic_segment;
4240 if (entry->d_tag == DT_SYMINENT)
4242 /* Note: these braces are necessary to avoid a syntax
4243 error from the SunOS4 C compiler. */
4244 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
4246 else if (entry->d_tag == DT_SYMINSZ)
4247 syminsz = entry->d_un.d_val;
4248 else if (entry->d_tag == DT_SYMINFO)
4249 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
4252 if (dynamic_syminfo_offset != 0 && syminsz != 0)
4254 Elf_External_Syminfo * extsyminfo;
4255 Elf_Internal_Syminfo * syminfo;
4257 /* There is a syminfo section. Read the data. */
4258 extsyminfo = ((Elf_External_Syminfo *)
4259 get_data (NULL, file, dynamic_syminfo_offset,
4260 syminsz, _("symbol information")));
4264 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
4265 if (dynamic_syminfo == NULL)
4267 error (_("Out of memory\n"));
4271 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
4272 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
4275 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
4276 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
4283 if (do_dynamic && dynamic_addr)
4284 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
4285 dynamic_addr, (long) dynamic_size);
4287 printf (_(" Tag Type Name/Value\n"));
4289 for (i = 0, entry = dynamic_segment;
4298 print_vma (entry->d_tag, FULL_HEX);
4299 dtype = get_dynamic_type (entry->d_tag);
4300 printf (" (%s)%*s", dtype,
4301 ((is_32bit_elf ? 27 : 19)
4302 - (int) strlen (dtype)),
4306 switch (entry->d_tag)
4310 printf ("%s", get_dynamic_flags (entry->d_un.d_val));
4320 switch (entry->d_tag)
4323 printf (_("Auxiliary library"));
4327 printf (_("Filter library"));
4331 printf (_("Configuration file"));
4335 printf (_("Dependency audit library"));
4339 printf (_("Audit library"));
4343 if (dynamic_strings)
4344 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
4348 print_vma (entry->d_un.d_val, PREFIX_HEX);
4357 printf (_("Flags:"));
4358 if (entry->d_un.d_val == 0)
4359 printf (_(" None\n"));
4362 unsigned long int val = entry->d_un.d_val;
4363 if (val & DTF_1_PARINIT)
4365 printf (" PARINIT");
4366 val ^= DTF_1_PARINIT;
4368 if (val & DTF_1_CONFEXP)
4370 printf (" CONFEXP");
4371 val ^= DTF_1_CONFEXP;
4374 printf (" %lx", val);
4383 printf (_("Flags:"));
4384 if (entry->d_un.d_val == 0)
4385 printf (_(" None\n"));
4388 unsigned long int val = entry->d_un.d_val;
4389 if (val & DF_P1_LAZYLOAD)
4391 printf (" LAZYLOAD");
4392 val ^= DF_P1_LAZYLOAD;
4394 if (val & DF_P1_GROUPPERM)
4396 printf (" GROUPPERM");
4397 val ^= DF_P1_GROUPPERM;
4400 printf (" %lx", val);
4409 printf (_("Flags:"));
4410 if (entry->d_un.d_val == 0)
4411 printf (_(" None\n"));
4414 unsigned long int val = entry->d_un.d_val;
4420 if (val & DF_1_GLOBAL)
4425 if (val & DF_1_GROUP)
4430 if (val & DF_1_NODELETE)
4432 printf (" NODELETE");
4433 val ^= DF_1_NODELETE;
4435 if (val & DF_1_LOADFLTR)
4437 printf (" LOADFLTR");
4438 val ^= DF_1_LOADFLTR;
4440 if (val & DF_1_INITFIRST)
4442 printf (" INITFIRST");
4443 val ^= DF_1_INITFIRST;
4445 if (val & DF_1_NOOPEN)
4450 if (val & DF_1_ORIGIN)
4455 if (val & DF_1_DIRECT)
4460 if (val & DF_1_TRANS)
4465 if (val & DF_1_INTERPOSE)
4467 printf (" INTERPOSE");
4468 val ^= DF_1_INTERPOSE;
4470 if (val & DF_1_NODEFLIB)
4472 printf (" NODEFLIB");
4473 val ^= DF_1_NODEFLIB;
4475 if (val & DF_1_NODUMP)
4480 if (val & DF_1_CONLFAT)
4482 printf (" CONLFAT");
4483 val ^= DF_1_CONLFAT;
4486 printf (" %lx", val);
4494 puts (get_dynamic_type (entry->d_un.d_val));
4514 dynamic_info[entry->d_tag] = entry->d_un.d_val;
4520 if (dynamic_strings == NULL)
4523 name = dynamic_strings + entry->d_un.d_val;
4527 switch (entry->d_tag)
4530 printf (_("Shared library: [%s]"), name);
4532 if (strcmp (name, program_interpreter) == 0)
4533 printf (_(" program interpreter"));
4537 printf (_("Library soname: [%s]"), name);
4541 printf (_("Library rpath: [%s]"), name);
4545 printf (_("Library runpath: [%s]"), name);
4549 print_vma (entry->d_un.d_val, PREFIX_HEX);
4554 print_vma (entry->d_un.d_val, PREFIX_HEX);
4570 case DT_INIT_ARRAYSZ:
4571 case DT_FINI_ARRAYSZ:
4574 print_vma (entry->d_un.d_val, UNSIGNED);
4575 printf (" (bytes)\n");
4585 print_vma (entry->d_un.d_val, UNSIGNED);
4598 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
4602 name = dynamic_strings + entry->d_un.d_val;
4606 printf (_("Not needed object: [%s]\n"), name);
4611 print_vma (entry->d_un.d_val, PREFIX_HEX);
4617 /* The value of this entry is ignored. */
4621 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
4622 version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
4627 switch (elf_header.e_machine)
4630 case EM_MIPS_RS3_LE:
4631 dynamic_segment_mips_val (entry);
4634 dynamic_segment_parisc_val (entry);
4637 print_vma (entry->d_un.d_val, PREFIX_HEX);
4649 get_ver_flags (flags)
4652 static char buff [32];
4659 if (flags & VER_FLG_BASE)
4660 strcat (buff, "BASE ");
4662 if (flags & VER_FLG_WEAK)
4664 if (flags & VER_FLG_BASE)
4665 strcat (buff, "| ");
4667 strcat (buff, "WEAK ");
4670 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
4671 strcat (buff, "| <unknown>");
4676 /* Display the contents of the version sections. */
4678 process_version_sections (file)
4681 Elf32_Internal_Shdr * section;
4688 for (i = 0, section = section_headers;
4689 i < elf_header.e_shnum;
4692 switch (section->sh_type)
4694 case SHT_GNU_verdef:
4696 Elf_External_Verdef * edefs;
4703 (_("\nVersion definition section '%s' contains %ld entries:\n"),
4704 SECTION_NAME (section), section->sh_info);
4706 printf (_(" Addr: 0x"));
4707 printf_vma (section->sh_addr);
4708 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4709 (unsigned long) section->sh_offset, section->sh_link,
4710 SECTION_NAME (SECTION_HEADER (section->sh_link)));
4712 edefs = ((Elf_External_Verdef *)
4713 get_data (NULL, file, section->sh_offset,
4715 _("version definition section")));
4719 for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
4722 Elf_External_Verdef * edef;
4723 Elf_Internal_Verdef ent;
4724 Elf_External_Verdaux * eaux;
4725 Elf_Internal_Verdaux aux;
4729 vstart = ((char *) edefs) + idx;
4731 edef = (Elf_External_Verdef *) vstart;
4733 ent.vd_version = BYTE_GET (edef->vd_version);
4734 ent.vd_flags = BYTE_GET (edef->vd_flags);
4735 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
4736 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
4737 ent.vd_hash = BYTE_GET (edef->vd_hash);
4738 ent.vd_aux = BYTE_GET (edef->vd_aux);
4739 ent.vd_next = BYTE_GET (edef->vd_next);
4741 printf (_(" %#06x: Rev: %d Flags: %s"),
4742 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
4744 printf (_(" Index: %d Cnt: %d "),
4745 ent.vd_ndx, ent.vd_cnt);
4747 vstart += ent.vd_aux;
4749 eaux = (Elf_External_Verdaux *) vstart;
4751 aux.vda_name = BYTE_GET (eaux->vda_name);
4752 aux.vda_next = BYTE_GET (eaux->vda_next);
4754 if (dynamic_strings)
4755 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
4757 printf (_("Name index: %ld\n"), aux.vda_name);
4759 isum = idx + ent.vd_aux;
4761 for (j = 1; j < ent.vd_cnt; j ++)
4763 isum += aux.vda_next;
4764 vstart += aux.vda_next;
4766 eaux = (Elf_External_Verdaux *) vstart;
4768 aux.vda_name = BYTE_GET (eaux->vda_name);
4769 aux.vda_next = BYTE_GET (eaux->vda_next);
4771 if (dynamic_strings)
4772 printf (_(" %#06x: Parent %d: %s\n"),
4773 isum, j, dynamic_strings + aux.vda_name);
4775 printf (_(" %#06x: Parent %d, name index: %ld\n"),
4776 isum, j, aux.vda_name);
4786 case SHT_GNU_verneed:
4788 Elf_External_Verneed * eneed;
4794 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
4795 SECTION_NAME (section), section->sh_info);
4797 printf (_(" Addr: 0x"));
4798 printf_vma (section->sh_addr);
4799 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
4800 (unsigned long) section->sh_offset, section->sh_link,
4801 SECTION_NAME (SECTION_HEADER (section->sh_link)));
4803 eneed = ((Elf_External_Verneed *)
4804 get_data (NULL, file, section->sh_offset,
4805 section->sh_size, _("version need section")));
4809 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
4811 Elf_External_Verneed * entry;
4812 Elf_Internal_Verneed ent;
4817 vstart = ((char *) eneed) + idx;
4819 entry = (Elf_External_Verneed *) vstart;
4821 ent.vn_version = BYTE_GET (entry->vn_version);
4822 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
4823 ent.vn_file = BYTE_GET (entry->vn_file);
4824 ent.vn_aux = BYTE_GET (entry->vn_aux);
4825 ent.vn_next = BYTE_GET (entry->vn_next);
4827 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
4829 if (dynamic_strings)
4830 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
4832 printf (_(" File: %lx"), ent.vn_file);
4834 printf (_(" Cnt: %d\n"), ent.vn_cnt);
4836 vstart += ent.vn_aux;
4838 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
4840 Elf_External_Vernaux * eaux;
4841 Elf_Internal_Vernaux aux;
4843 eaux = (Elf_External_Vernaux *) vstart;
4845 aux.vna_hash = BYTE_GET (eaux->vna_hash);
4846 aux.vna_flags = BYTE_GET (eaux->vna_flags);
4847 aux.vna_other = BYTE_GET (eaux->vna_other);
4848 aux.vna_name = BYTE_GET (eaux->vna_name);
4849 aux.vna_next = BYTE_GET (eaux->vna_next);
4851 if (dynamic_strings)
4852 printf (_(" %#06x: Name: %s"),
4853 isum, dynamic_strings + aux.vna_name);
4855 printf (_(" %#06x: Name index: %lx"),
4856 isum, aux.vna_name);
4858 printf (_(" Flags: %s Version: %d\n"),
4859 get_ver_flags (aux.vna_flags), aux.vna_other);
4861 isum += aux.vna_next;
4862 vstart += aux.vna_next;
4872 case SHT_GNU_versym:
4874 Elf32_Internal_Shdr * link_section;
4877 unsigned char * edata;
4878 unsigned short * data;
4880 Elf_Internal_Sym * symbols;
4881 Elf32_Internal_Shdr * string_sec;
4883 link_section = SECTION_HEADER (section->sh_link);
4884 total = section->sh_size / section->sh_entsize;
4888 symbols = GET_ELF_SYMBOLS (file, link_section);
4890 string_sec = SECTION_HEADER (link_section->sh_link);
4892 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
4893 string_sec->sh_size,
4894 _("version string table"));
4898 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
4899 SECTION_NAME (section), total);
4901 printf (_(" Addr: "));
4902 printf_vma (section->sh_addr);
4903 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4904 (unsigned long) section->sh_offset, section->sh_link,
4905 SECTION_NAME (link_section));
4909 get_data (NULL, file,
4910 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] - loadaddr,
4911 total * sizeof (short), _("version symbol data")));
4918 data = (unsigned short *) malloc (total * sizeof (short));
4920 for (cnt = total; cnt --;)
4921 data [cnt] = byte_get (edata + cnt * sizeof (short),
4926 for (cnt = 0; cnt < total; cnt += 4)
4929 int check_def, check_need;
4932 printf (" %03x:", cnt);
4934 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
4935 switch (data [cnt + j])
4938 fputs (_(" 0 (*local*) "), stdout);
4942 fputs (_(" 1 (*global*) "), stdout);
4946 nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
4947 data [cnt + j] & 0x8000 ? 'h' : ' ');
4951 if (SECTION_HEADER (symbols [cnt + j].st_shndx)->sh_type
4954 if (symbols [cnt + j].st_shndx == SHN_UNDEF)
4961 && version_info [DT_VERSIONTAGIDX (DT_VERNEED)])
4963 Elf_Internal_Verneed ivn;
4964 unsigned long offset;
4966 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
4971 Elf_Internal_Vernaux ivna;
4972 Elf_External_Verneed evn;
4973 Elf_External_Vernaux evna;
4974 unsigned long a_off;
4976 get_data (&evn, file, offset, sizeof (evn),
4979 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4980 ivn.vn_next = BYTE_GET (evn.vn_next);
4982 a_off = offset + ivn.vn_aux;
4986 get_data (&evna, file, a_off, sizeof (evna),
4987 _("version need aux (2)"));
4989 ivna.vna_next = BYTE_GET (evna.vna_next);
4990 ivna.vna_other = BYTE_GET (evna.vna_other);
4992 a_off += ivna.vna_next;
4994 while (ivna.vna_other != data [cnt + j]
4995 && ivna.vna_next != 0);
4997 if (ivna.vna_other == data [cnt + j])
4999 ivna.vna_name = BYTE_GET (evna.vna_name);
5001 name = strtab + ivna.vna_name;
5002 nn += printf ("(%s%-*s",
5004 12 - (int) strlen (name),
5010 offset += ivn.vn_next;
5012 while (ivn.vn_next);
5015 if (check_def && data [cnt + j] != 0x8001
5016 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
5018 Elf_Internal_Verdef ivd;
5019 Elf_External_Verdef evd;
5020 unsigned long offset;
5022 offset = version_info
5023 [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
5027 get_data (&evd, file, offset, sizeof (evd),
5030 ivd.vd_next = BYTE_GET (evd.vd_next);
5031 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5033 offset += ivd.vd_next;
5035 while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
5036 && ivd.vd_next != 0);
5038 if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
5040 Elf_External_Verdaux evda;
5041 Elf_Internal_Verdaux ivda;
5043 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5045 get_data (&evda, file,
5046 offset - ivd.vd_next + ivd.vd_aux,
5047 sizeof (evda), _("version def aux"));
5049 ivda.vda_name = BYTE_GET (evda.vda_name);
5051 name = strtab + ivda.vda_name;
5052 nn += printf ("(%s%-*s",
5054 12 - (int) strlen (name),
5060 printf ("%*c", 18 - nn, ' ');
5078 printf (_("\nNo version information found in this file.\n"));
5084 get_symbol_binding (binding)
5085 unsigned int binding;
5087 static char buff [32];
5091 case STB_LOCAL: return "LOCAL";
5092 case STB_GLOBAL: return "GLOBAL";
5093 case STB_WEAK: return "WEAK";
5095 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
5096 sprintf (buff, _("<processor specific>: %d"), binding);
5097 else if (binding >= STB_LOOS && binding <= STB_HIOS)
5098 sprintf (buff, _("<OS specific>: %d"), binding);
5100 sprintf (buff, _("<unknown>: %d"), binding);
5106 get_symbol_type (type)
5109 static char buff [32];
5113 case STT_NOTYPE: return "NOTYPE";
5114 case STT_OBJECT: return "OBJECT";
5115 case STT_FUNC: return "FUNC";
5116 case STT_SECTION: return "SECTION";
5117 case STT_FILE: return "FILE";
5118 case STT_COMMON: return "COMMON";
5120 if (type >= STT_LOPROC && type <= STT_HIPROC)
5122 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
5123 return "THUMB_FUNC";
5125 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
5128 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
5129 return "PARISC_MILLI";
5131 sprintf (buff, _("<processor specific>: %d"), type);
5133 else if (type >= STT_LOOS && type <= STT_HIOS)
5135 if (elf_header.e_machine == EM_PARISC)
5137 if (type == STT_HP_OPAQUE)
5139 if (type == STT_HP_STUB)
5143 sprintf (buff, _("<OS specific>: %d"), type);
5146 sprintf (buff, _("<unknown>: %d"), type);
5152 get_symbol_visibility (visibility)
5153 unsigned int visibility;
5157 case STV_DEFAULT: return "DEFAULT";
5158 case STV_INTERNAL: return "INTERNAL";
5159 case STV_HIDDEN: return "HIDDEN";
5160 case STV_PROTECTED: return "PROTECTED";
5166 get_symbol_index_type (type)
5171 case SHN_UNDEF: return "UND";
5172 case SHN_ABS: return "ABS";
5173 case SHN_COMMON: return "COM";
5175 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
5177 else if (type >= SHN_LOOS && type <= SHN_HIOS)
5179 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
5183 static char buff [32];
5185 sprintf (buff, "%3d", type);
5192 get_dynamic_data (file, number)
5194 unsigned int number;
5196 unsigned char * e_data;
5199 e_data = (unsigned char *) malloc (number * 4);
5203 error (_("Out of memory\n"));
5207 if (fread (e_data, 4, number, file) != number)
5209 error (_("Unable to read in dynamic data\n"));
5213 i_data = (int *) malloc (number * sizeof (* i_data));
5217 error (_("Out of memory\n"));
5223 i_data [number] = byte_get (e_data + number * 4, 4);
5230 /* Dump the symbol table. */
5232 process_symbol_table (file)
5235 Elf32_Internal_Shdr * section;
5236 unsigned char nb [4];
5237 unsigned char nc [4];
5240 int * buckets = NULL;
5241 int * chains = NULL;
5243 if (! do_syms && !do_histogram)
5246 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
5249 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
5251 error (_("Unable to seek to start of dynamic information"));
5255 if (fread (nb, sizeof (nb), 1, file) != 1)
5257 error (_("Failed to read in number of buckets\n"));
5261 if (fread (nc, sizeof (nc), 1, file) != 1)
5263 error (_("Failed to read in number of chains\n"));
5267 nbuckets = byte_get (nb, 4);
5268 nchains = byte_get (nc, 4);
5270 buckets = get_dynamic_data (file, nbuckets);
5271 chains = get_dynamic_data (file, nchains);
5273 if (buckets == NULL || chains == NULL)
5278 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
5283 printf (_("\nSymbol table for image:\n"));
5285 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5287 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5289 for (hn = 0; hn < nbuckets; hn++)
5294 for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
5296 Elf_Internal_Sym * psym;
5298 psym = dynamic_symbols + si;
5300 printf (" %3d %3d: ", si, hn);
5301 print_vma (psym->st_value, LONG_HEX);
5303 print_vma (psym->st_size, DEC_5);
5305 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5306 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5307 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5308 printf (" %3.3s", get_symbol_index_type (psym->st_shndx));
5309 printf (" %s\n", dynamic_strings + psym->st_name);
5313 else if (do_syms && !do_using_dynamic)
5317 for (i = 0, section = section_headers;
5318 i < elf_header.e_shnum;
5323 Elf_Internal_Sym * symtab;
5324 Elf_Internal_Sym * psym;
5327 if ( section->sh_type != SHT_SYMTAB
5328 && section->sh_type != SHT_DYNSYM)
5331 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5332 SECTION_NAME (section),
5333 (unsigned long) (section->sh_size / section->sh_entsize));
5335 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5337 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5339 symtab = GET_ELF_SYMBOLS (file, section);
5343 if (section->sh_link == elf_header.e_shstrndx)
5344 strtab = string_table;
5347 Elf32_Internal_Shdr * string_sec;
5349 string_sec = SECTION_HEADER (section->sh_link);
5351 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5352 string_sec->sh_size,
5356 for (si = 0, psym = symtab;
5357 si < section->sh_size / section->sh_entsize;
5360 printf ("%6d: ", si);
5361 print_vma (psym->st_value, LONG_HEX);
5363 print_vma (psym->st_size, DEC_5);
5364 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5365 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5366 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5367 printf (" %4s", get_symbol_index_type (psym->st_shndx));
5368 printf (" %s", strtab + psym->st_name);
5370 if (section->sh_type == SHT_DYNSYM &&
5371 version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
5373 unsigned char data[2];
5374 unsigned short vers_data;
5375 unsigned long offset;
5379 offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
5382 get_data (&data, file, offset + si * sizeof (vers_data),
5383 sizeof (data), _("version data"));
5385 vers_data = byte_get (data, 2);
5387 is_nobits = (SECTION_HEADER (psym->st_shndx)->sh_type
5390 check_def = (psym->st_shndx != SHN_UNDEF);
5392 if ((vers_data & 0x8000) || vers_data > 1)
5394 if (version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
5395 && (is_nobits || ! check_def))
5397 Elf_External_Verneed evn;
5398 Elf_Internal_Verneed ivn;
5399 Elf_Internal_Vernaux ivna;
5401 /* We must test both. */
5402 offset = version_info
5403 [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
5407 unsigned long vna_off;
5409 get_data (&evn, file, offset, sizeof (evn),
5412 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5413 ivn.vn_next = BYTE_GET (evn.vn_next);
5415 vna_off = offset + ivn.vn_aux;
5419 Elf_External_Vernaux evna;
5421 get_data (&evna, file, vna_off,
5423 _("version need aux (3)"));
5425 ivna.vna_other = BYTE_GET (evna.vna_other);
5426 ivna.vna_next = BYTE_GET (evna.vna_next);
5427 ivna.vna_name = BYTE_GET (evna.vna_name);
5429 vna_off += ivna.vna_next;
5431 while (ivna.vna_other != vers_data
5432 && ivna.vna_next != 0);
5434 if (ivna.vna_other == vers_data)
5437 offset += ivn.vn_next;
5439 while (ivn.vn_next != 0);
5441 if (ivna.vna_other == vers_data)
5444 strtab + ivna.vna_name, ivna.vna_other);
5447 else if (! is_nobits)
5448 error (_("bad dynamic symbol"));
5455 if (vers_data != 0x8001
5456 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
5458 Elf_Internal_Verdef ivd;
5459 Elf_Internal_Verdaux ivda;
5460 Elf_External_Verdaux evda;
5461 unsigned long offset;
5464 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
5469 Elf_External_Verdef evd;
5471 get_data (&evd, file, offset, sizeof (evd),
5474 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5475 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5476 ivd.vd_next = BYTE_GET (evd.vd_next);
5478 offset += ivd.vd_next;
5480 while (ivd.vd_ndx != (vers_data & 0x7fff)
5481 && ivd.vd_next != 0);
5483 offset -= ivd.vd_next;
5484 offset += ivd.vd_aux;
5486 get_data (&evda, file, offset, sizeof (evda),
5487 _("version def aux"));
5489 ivda.vda_name = BYTE_GET (evda.vda_name);
5491 if (psym->st_name != ivda.vda_name)
5492 printf ((vers_data & 0x8000)
5494 strtab + ivda.vda_name);
5504 if (strtab != string_table)
5510 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5512 if (do_histogram && buckets != NULL)
5519 int nzero_counts = 0;
5522 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5524 printf (_(" Length Number %% of total Coverage\n"));
5526 lengths = (int *) calloc (nbuckets, sizeof (int));
5527 if (lengths == NULL)
5529 error (_("Out of memory"));
5532 for (hn = 0; hn < nbuckets; ++hn)
5537 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
5540 if (maxlength < ++lengths[hn])
5545 counts = (int *) calloc (maxlength + 1, sizeof (int));
5548 error (_("Out of memory"));
5552 for (hn = 0; hn < nbuckets; ++hn)
5553 ++ counts [lengths [hn]];
5557 printf (" 0 %-10d (%5.1f%%)\n",
5558 counts[0], (counts[0] * 100.0) / nbuckets);
5559 for (si = 1; si <= maxlength; ++si)
5561 nzero_counts += counts[si] * si;
5562 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5563 si, counts[si], (counts[si] * 100.0) / nbuckets,
5564 (nzero_counts * 100.0) / nsyms);
5572 if (buckets != NULL)
5582 process_syminfo (file)
5583 FILE * file ATTRIBUTE_UNUSED;
5587 if (dynamic_syminfo == NULL
5589 /* No syminfo, this is ok. */
5592 /* There better should be a dynamic symbol section. */
5593 if (dynamic_symbols == NULL || dynamic_strings == NULL)
5597 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5598 dynamic_syminfo_offset, dynamic_syminfo_nent);
5600 printf (_(" Num: Name BoundTo Flags\n"));
5601 for (i = 0; i < dynamic_syminfo_nent; ++i)
5603 unsigned short int flags = dynamic_syminfo[i].si_flags;
5605 printf ("%4d: %-30s ", i,
5606 dynamic_strings + dynamic_symbols[i].st_name);
5608 switch (dynamic_syminfo[i].si_boundto)
5610 case SYMINFO_BT_SELF:
5611 fputs ("SELF ", stdout);
5613 case SYMINFO_BT_PARENT:
5614 fputs ("PARENT ", stdout);
5617 if (dynamic_syminfo[i].si_boundto > 0
5618 && dynamic_syminfo[i].si_boundto < dynamic_size)
5621 + dynamic_segment[dynamic_syminfo[i].si_boundto].d_un.d_val);
5623 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
5627 if (flags & SYMINFO_FLG_DIRECT)
5629 if (flags & SYMINFO_FLG_PASSTHRU)
5630 printf (" PASSTHRU");
5631 if (flags & SYMINFO_FLG_COPY)
5633 if (flags & SYMINFO_FLG_LAZYLOAD)
5634 printf (" LAZYLOAD");
5642 #ifdef SUPPORT_DISASSEMBLY
5644 disassemble_section (section, file)
5645 Elf32_Internal_Shdr * section;
5648 printf (_("\nAssembly dump of section %s\n"),
5649 SECTION_NAME (section));
5651 /* XXX -- to be done --- XXX */
5658 dump_section (section, file)
5659 Elf32_Internal_Shdr * section;
5662 bfd_size_type bytes;
5664 unsigned char * data;
5665 unsigned char * start;
5667 bytes = section->sh_size;
5671 printf (_("\nSection '%s' has no data to dump.\n"),
5672 SECTION_NAME (section));
5676 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
5678 addr = section->sh_addr;
5680 start = (unsigned char *) get_data (NULL, file, section->sh_offset, bytes,
5693 lbytes = (bytes > 16 ? 16 : bytes);
5695 printf (" 0x%8.8lx ", (unsigned long) addr);
5697 switch (elf_header.e_ident [EI_DATA])
5701 for (j = 15; j >= 0; j --)
5704 printf ("%2.2x", data [j]);
5714 for (j = 0; j < 16; j++)
5717 printf ("%2.2x", data [j]);
5727 for (j = 0; j < lbytes; j++)
5730 if (k >= ' ' && k < 0x80)
5749 static unsigned long int
5750 read_leb128 (data, length_return, sign)
5751 unsigned char * data;
5752 int * length_return;
5755 unsigned long int result = 0;
5756 unsigned int num_read = 0;
5765 result |= (byte & 0x7f) << shift;
5770 while (byte & 0x80);
5772 if (length_return != NULL)
5773 * length_return = num_read;
5775 if (sign && (shift < 32) && (byte & 0x40))
5776 result |= -1 << shift;
5781 typedef struct State_Machine_Registers
5783 unsigned long address;
5786 unsigned int column;
5790 /* This variable hold the number of the last entry seen
5791 in the File Table. */
5792 unsigned int last_file_entry;
5795 static SMR state_machine_regs;
5798 reset_state_machine (is_stmt)
5801 state_machine_regs.address = 0;
5802 state_machine_regs.file = 1;
5803 state_machine_regs.line = 1;
5804 state_machine_regs.column = 0;
5805 state_machine_regs.is_stmt = is_stmt;
5806 state_machine_regs.basic_block = 0;
5807 state_machine_regs.end_sequence = 0;
5808 state_machine_regs.last_file_entry = 0;
5811 /* Handled an extend line op. Returns true if this is the end
5814 process_extended_line_op (data, is_stmt, pointer_size)
5815 unsigned char * data;
5819 unsigned char op_code;
5822 unsigned char * name;
5825 len = read_leb128 (data, & bytes_read, 0);
5830 warn (_("badly formed extended line op encountered!\n"));
5835 op_code = * data ++;
5837 printf (_(" Extended opcode %d: "), op_code);
5841 case DW_LNE_end_sequence:
5842 printf (_("End of Sequence\n\n"));
5843 reset_state_machine (is_stmt);
5846 case DW_LNE_set_address:
5847 adr = byte_get (data, pointer_size);
5848 printf (_("set Address to 0x%lx\n"), adr);
5849 state_machine_regs.address = adr;
5852 case DW_LNE_define_file:
5853 printf (_(" define new File Table entry\n"));
5854 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5856 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5858 data += strlen ((char *) data) + 1;
5859 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5861 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5863 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5864 printf (_("%s\n\n"), name);
5868 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
5875 /* Size of pointers in the .debug_line section. This information is not
5876 really present in that section. It's obtained before dumping the debug
5877 sections by doing some pre-scan of the .debug_info section. */
5878 static int debug_line_pointer_size = 4;
5881 display_debug_lines (section, start, file)
5882 Elf32_Internal_Shdr * section;
5883 unsigned char * start;
5884 FILE * file ATTRIBUTE_UNUSED;
5886 DWARF2_External_LineInfo * external;
5887 DWARF2_Internal_LineInfo info;
5888 unsigned char * standard_opcodes;
5889 unsigned char * data = start;
5890 unsigned char * end = start + section->sh_size;
5891 unsigned char * end_of_sequence;
5894 printf (_("\nDump of debug contents of section %s:\n\n"),
5895 SECTION_NAME (section));
5899 external = (DWARF2_External_LineInfo *) data;
5901 /* Check the length of the block. */
5902 info.li_length = BYTE_GET (external->li_length);
5904 if (info.li_length == 0xffffffff)
5906 warn (_("64-bit DWARF line info is not supported yet.\n"));
5910 if (info.li_length + sizeof (external->li_length) > section->sh_size)
5913 (_("The line info appears to be corrupt - the section is too small\n"));
5917 /* Check its version number. */
5918 info.li_version = BYTE_GET (external->li_version);
5919 if (info.li_version != 2)
5921 warn (_("Only DWARF version 2 line info is currently supported.\n"));
5925 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
5926 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
5927 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
5928 info.li_line_base = BYTE_GET (external->li_line_base);
5929 info.li_line_range = BYTE_GET (external->li_line_range);
5930 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
5932 /* Sign extend the line base field. */
5933 info.li_line_base <<= 24;
5934 info.li_line_base >>= 24;
5936 printf (_(" Length: %ld\n"), info.li_length);
5937 printf (_(" DWARF Version: %d\n"), info.li_version);
5938 printf (_(" Prologue Length: %d\n"), info.li_prologue_length);
5939 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
5940 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
5941 printf (_(" Line Base: %d\n"), info.li_line_base);
5942 printf (_(" Line Range: %d\n"), info.li_line_range);
5943 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
5945 end_of_sequence = data + info.li_length + sizeof (external->li_length);
5947 reset_state_machine (info.li_default_is_stmt);
5949 /* Display the contents of the Opcodes table. */
5950 standard_opcodes = data + sizeof (* external);
5952 printf (_("\n Opcodes:\n"));
5954 for (i = 1; i < info.li_opcode_base; i++)
5955 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
5957 /* Display the contents of the Directory table. */
5958 data = standard_opcodes + info.li_opcode_base - 1;
5961 printf (_("\n The Directory Table is empty.\n"));
5964 printf (_("\n The Directory Table:\n"));
5968 printf (_(" %s\n"), data);
5970 data += strlen ((char *) data) + 1;
5974 /* Skip the NUL at the end of the table. */
5977 /* Display the contents of the File Name table. */
5979 printf (_("\n The File Name Table is empty.\n"));
5982 printf (_("\n The File Name Table:\n"));
5983 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5987 unsigned char * name;
5990 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5993 data += strlen ((char *) data) + 1;
5995 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5997 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5999 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6001 printf (_("%s\n"), name);
6005 /* Skip the NUL at the end of the table. */
6008 /* Now display the statements. */
6009 printf (_("\n Line Number Statements:\n"));
6012 while (data < end_of_sequence)
6014 unsigned char op_code;
6018 op_code = * data ++;
6020 if (op_code >= info.li_opcode_base)
6022 op_code -= info.li_opcode_base;
6023 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
6024 state_machine_regs.address += adv;
6025 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6026 op_code, adv, state_machine_regs.address);
6027 adv = (op_code % info.li_line_range) + info.li_line_base;
6028 state_machine_regs.line += adv;
6029 printf (_(" and Line by %d to %d\n"),
6030 adv, state_machine_regs.line);
6032 else switch (op_code)
6034 case DW_LNS_extended_op:
6035 data += process_extended_line_op (data, info.li_default_is_stmt,
6036 debug_line_pointer_size);
6040 printf (_(" Copy\n"));
6043 case DW_LNS_advance_pc:
6044 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
6046 state_machine_regs.address += adv;
6047 printf (_(" Advance PC by %d to %lx\n"), adv,
6048 state_machine_regs.address);
6051 case DW_LNS_advance_line:
6052 adv = read_leb128 (data, & bytes_read, 1);
6054 state_machine_regs.line += adv;
6055 printf (_(" Advance Line by %d to %d\n"), adv,
6056 state_machine_regs.line);
6059 case DW_LNS_set_file:
6060 adv = read_leb128 (data, & bytes_read, 0);
6062 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6064 state_machine_regs.file = adv;
6067 case DW_LNS_set_column:
6068 adv = read_leb128 (data, & bytes_read, 0);
6070 printf (_(" Set column to %d\n"), adv);
6071 state_machine_regs.column = adv;
6074 case DW_LNS_negate_stmt:
6075 adv = state_machine_regs.is_stmt;
6077 printf (_(" Set is_stmt to %d\n"), adv);
6078 state_machine_regs.is_stmt = adv;
6081 case DW_LNS_set_basic_block:
6082 printf (_(" Set basic block\n"));
6083 state_machine_regs.basic_block = 1;
6086 case DW_LNS_const_add_pc:
6087 adv = (((255 - info.li_opcode_base) / info.li_line_range)
6088 * info.li_min_insn_length);
6089 state_machine_regs.address += adv;
6090 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
6091 state_machine_regs.address);
6094 case DW_LNS_fixed_advance_pc:
6095 adv = byte_get (data, 2);
6097 state_machine_regs.address += adv;
6098 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6099 adv, state_machine_regs.address);
6102 case DW_LNS_set_prologue_end:
6103 printf (_(" Set prologue_end to true\n"));
6106 case DW_LNS_set_epilogue_begin:
6107 printf (_(" Set epilogue_begin to true\n"));
6110 case DW_LNS_set_isa:
6111 adv = read_leb128 (data, & bytes_read, 0);
6113 printf (_(" Set ISA to %d\n"), adv);
6117 printf (_(" Unknown opcode %d with operands: "), op_code);
6120 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
6122 printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
6123 i == 1 ? "" : ", ");
6138 display_debug_pubnames (section, start, file)
6139 Elf32_Internal_Shdr * section;
6140 unsigned char * start;
6141 FILE * file ATTRIBUTE_UNUSED;
6143 DWARF2_External_PubNames * external;
6144 DWARF2_Internal_PubNames pubnames;
6145 unsigned char * end;
6147 end = start + section->sh_size;
6149 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6153 unsigned char * data;
6154 unsigned long offset;
6156 external = (DWARF2_External_PubNames *) start;
6158 pubnames.pn_length = BYTE_GET (external->pn_length);
6159 pubnames.pn_version = BYTE_GET (external->pn_version);
6160 pubnames.pn_offset = BYTE_GET (external->pn_offset);
6161 pubnames.pn_size = BYTE_GET (external->pn_size);
6163 data = start + sizeof (* external);
6164 start += pubnames.pn_length + sizeof (external->pn_length);
6166 if (pubnames.pn_length == 0xffffffff)
6168 warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6172 if (pubnames.pn_version != 2)
6174 static int warned = 0;
6178 warn (_("Only DWARF 2 pubnames are currently supported\n"));
6185 printf (_(" Length: %ld\n"),
6186 pubnames.pn_length);
6187 printf (_(" Version: %d\n"),
6188 pubnames.pn_version);
6189 printf (_(" Offset into .debug_info section: %ld\n"),
6190 pubnames.pn_offset);
6191 printf (_(" Size of area in .debug_info section: %ld\n"),
6194 printf (_("\n Offset\tName\n"));
6198 offset = byte_get (data, 4);
6203 printf (" %ld\t\t%s\n", offset, data);
6204 data += strlen ((char *) data) + 1;
6207 while (offset != 0);
6220 case DW_TAG_padding: return "DW_TAG_padding";
6221 case DW_TAG_array_type: return "DW_TAG_array_type";
6222 case DW_TAG_class_type: return "DW_TAG_class_type";
6223 case DW_TAG_entry_point: return "DW_TAG_entry_point";
6224 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
6225 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
6226 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
6227 case DW_TAG_label: return "DW_TAG_label";
6228 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
6229 case DW_TAG_member: return "DW_TAG_member";
6230 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
6231 case DW_TAG_reference_type: return "DW_TAG_reference_type";
6232 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
6233 case DW_TAG_string_type: return "DW_TAG_string_type";
6234 case DW_TAG_structure_type: return "DW_TAG_structure_type";
6235 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
6236 case DW_TAG_typedef: return "DW_TAG_typedef";
6237 case DW_TAG_union_type: return "DW_TAG_union_type";
6238 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
6239 case DW_TAG_variant: return "DW_TAG_variant";
6240 case DW_TAG_common_block: return "DW_TAG_common_block";
6241 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
6242 case DW_TAG_inheritance: return "DW_TAG_inheritance";
6243 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
6244 case DW_TAG_module: return "DW_TAG_module";
6245 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
6246 case DW_TAG_set_type: return "DW_TAG_set_type";
6247 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
6248 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
6249 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
6250 case DW_TAG_base_type: return "DW_TAG_base_type";
6251 case DW_TAG_catch_block: return "DW_TAG_catch_block";
6252 case DW_TAG_const_type: return "DW_TAG_const_type";
6253 case DW_TAG_constant: return "DW_TAG_constant";
6254 case DW_TAG_enumerator: return "DW_TAG_enumerator";
6255 case DW_TAG_file_type: return "DW_TAG_file_type";
6256 case DW_TAG_friend: return "DW_TAG_friend";
6257 case DW_TAG_namelist: return "DW_TAG_namelist";
6258 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
6259 case DW_TAG_packed_type: return "DW_TAG_packed_type";
6260 case DW_TAG_subprogram: return "DW_TAG_subprogram";
6261 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
6262 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
6263 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
6264 case DW_TAG_try_block: return "DW_TAG_try_block";
6265 case DW_TAG_variant_part: return "DW_TAG_variant_part";
6266 case DW_TAG_variable: return "DW_TAG_variable";
6267 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
6268 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
6269 case DW_TAG_format_label: return "DW_TAG_format_label";
6270 case DW_TAG_function_template: return "DW_TAG_function_template";
6271 case DW_TAG_class_template: return "DW_TAG_class_template";
6272 /* DWARF 2.1 values. */
6273 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
6274 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
6275 case DW_TAG_interface_type: return "DW_TAG_interface_type";
6276 case DW_TAG_namespace: return "DW_TAG_namespace";
6277 case DW_TAG_imported_module: return "DW_TAG_imported_module";
6278 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
6279 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
6280 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
6283 static char buffer [100];
6285 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
6292 get_AT_name (attribute)
6293 unsigned long attribute;
6297 case DW_AT_sibling: return "DW_AT_sibling";
6298 case DW_AT_location: return "DW_AT_location";
6299 case DW_AT_name: return "DW_AT_name";
6300 case DW_AT_ordering: return "DW_AT_ordering";
6301 case DW_AT_subscr_data: return "DW_AT_subscr_data";
6302 case DW_AT_byte_size: return "DW_AT_byte_size";
6303 case DW_AT_bit_offset: return "DW_AT_bit_offset";
6304 case DW_AT_bit_size: return "DW_AT_bit_size";
6305 case DW_AT_element_list: return "DW_AT_element_list";
6306 case DW_AT_stmt_list: return "DW_AT_stmt_list";
6307 case DW_AT_low_pc: return "DW_AT_low_pc";
6308 case DW_AT_high_pc: return "DW_AT_high_pc";
6309 case DW_AT_language: return "DW_AT_language";
6310 case DW_AT_member: return "DW_AT_member";
6311 case DW_AT_discr: return "DW_AT_discr";
6312 case DW_AT_discr_value: return "DW_AT_discr_value";
6313 case DW_AT_visibility: return "DW_AT_visibility";
6314 case DW_AT_import: return "DW_AT_import";
6315 case DW_AT_string_length: return "DW_AT_string_length";
6316 case DW_AT_common_reference: return "DW_AT_common_reference";
6317 case DW_AT_comp_dir: return "DW_AT_comp_dir";
6318 case DW_AT_const_value: return "DW_AT_const_value";
6319 case DW_AT_containing_type: return "DW_AT_containing_type";
6320 case DW_AT_default_value: return "DW_AT_default_value";
6321 case DW_AT_inline: return "DW_AT_inline";
6322 case DW_AT_is_optional: return "DW_AT_is_optional";
6323 case DW_AT_lower_bound: return "DW_AT_lower_bound";
6324 case DW_AT_producer: return "DW_AT_producer";
6325 case DW_AT_prototyped: return "DW_AT_prototyped";
6326 case DW_AT_return_addr: return "DW_AT_return_addr";
6327 case DW_AT_start_scope: return "DW_AT_start_scope";
6328 case DW_AT_stride_size: return "DW_AT_stride_size";
6329 case DW_AT_upper_bound: return "DW_AT_upper_bound";
6330 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
6331 case DW_AT_accessibility: return "DW_AT_accessibility";
6332 case DW_AT_address_class: return "DW_AT_address_class";
6333 case DW_AT_artificial: return "DW_AT_artificial";
6334 case DW_AT_base_types: return "DW_AT_base_types";
6335 case DW_AT_calling_convention: return "DW_AT_calling_convention";
6336 case DW_AT_count: return "DW_AT_count";
6337 case DW_AT_data_member_location: return "DW_AT_data_member_location";
6338 case DW_AT_decl_column: return "DW_AT_decl_column";
6339 case DW_AT_decl_file: return "DW_AT_decl_file";
6340 case DW_AT_decl_line: return "DW_AT_decl_line";
6341 case DW_AT_declaration: return "DW_AT_declaration";
6342 case DW_AT_discr_list: return "DW_AT_discr_list";
6343 case DW_AT_encoding: return "DW_AT_encoding";
6344 case DW_AT_external: return "DW_AT_external";
6345 case DW_AT_frame_base: return "DW_AT_frame_base";
6346 case DW_AT_friend: return "DW_AT_friend";
6347 case DW_AT_identifier_case: return "DW_AT_identifier_case";
6348 case DW_AT_macro_info: return "DW_AT_macro_info";
6349 case DW_AT_namelist_items: return "DW_AT_namelist_items";
6350 case DW_AT_priority: return "DW_AT_priority";
6351 case DW_AT_segment: return "DW_AT_segment";
6352 case DW_AT_specification: return "DW_AT_specification";
6353 case DW_AT_static_link: return "DW_AT_static_link";
6354 case DW_AT_type: return "DW_AT_type";
6355 case DW_AT_use_location: return "DW_AT_use_location";
6356 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
6357 case DW_AT_virtuality: return "DW_AT_virtuality";
6358 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
6359 /* DWARF 2.1 values. */
6360 case DW_AT_allocated: return "DW_AT_allocated";
6361 case DW_AT_associated: return "DW_AT_associated";
6362 case DW_AT_data_location: return "DW_AT_data_location";
6363 case DW_AT_stride: return "DW_AT_stride";
6364 case DW_AT_entry_pc: return "DW_AT_entry_pc";
6365 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
6366 case DW_AT_extension: return "DW_AT_extension";
6367 case DW_AT_ranges: return "DW_AT_ranges";
6368 case DW_AT_trampoline: return "DW_AT_trampoline";
6369 case DW_AT_call_column: return "DW_AT_call_column";
6370 case DW_AT_call_file: return "DW_AT_call_file";
6371 case DW_AT_call_line: return "DW_AT_call_line";
6372 /* SGI/MIPS extensions. */
6373 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
6374 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
6375 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
6376 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
6377 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
6378 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
6379 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
6380 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
6381 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
6382 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
6383 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
6384 /* GNU extensions. */
6385 case DW_AT_sf_names: return "DW_AT_sf_names";
6386 case DW_AT_src_info: return "DW_AT_src_info";
6387 case DW_AT_mac_info: return "DW_AT_mac_info";
6388 case DW_AT_src_coords: return "DW_AT_src_coords";
6389 case DW_AT_body_begin: return "DW_AT_body_begin";
6390 case DW_AT_body_end: return "DW_AT_body_end";
6393 static char buffer [100];
6395 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
6402 get_FORM_name (form)
6407 case DW_FORM_addr: return "DW_FORM_addr";
6408 case DW_FORM_block2: return "DW_FORM_block2";
6409 case DW_FORM_block4: return "DW_FORM_block4";
6410 case DW_FORM_data2: return "DW_FORM_data2";
6411 case DW_FORM_data4: return "DW_FORM_data4";
6412 case DW_FORM_data8: return "DW_FORM_data8";
6413 case DW_FORM_string: return "DW_FORM_string";
6414 case DW_FORM_block: return "DW_FORM_block";
6415 case DW_FORM_block1: return "DW_FORM_block1";
6416 case DW_FORM_data1: return "DW_FORM_data1";
6417 case DW_FORM_flag: return "DW_FORM_flag";
6418 case DW_FORM_sdata: return "DW_FORM_sdata";
6419 case DW_FORM_strp: return "DW_FORM_strp";
6420 case DW_FORM_udata: return "DW_FORM_udata";
6421 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
6422 case DW_FORM_ref1: return "DW_FORM_ref1";
6423 case DW_FORM_ref2: return "DW_FORM_ref2";
6424 case DW_FORM_ref4: return "DW_FORM_ref4";
6425 case DW_FORM_ref8: return "DW_FORM_ref8";
6426 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
6427 case DW_FORM_indirect: return "DW_FORM_indirect";
6430 static char buffer [100];
6432 sprintf (buffer, _("Unknown FORM value: %lx"), form);
6438 /* FIXME: There are better and more effiecint ways to handle
6439 these structures. For now though, I just want something that
6440 is simple to implement. */
6441 typedef struct abbrev_attr
6443 unsigned long attribute;
6445 struct abbrev_attr * next;
6449 typedef struct abbrev_entry
6451 unsigned long entry;
6454 struct abbrev_attr * first_attr;
6455 struct abbrev_attr * last_attr;
6456 struct abbrev_entry * next;
6460 static abbrev_entry * first_abbrev = NULL;
6461 static abbrev_entry * last_abbrev = NULL;
6464 free_abbrevs PARAMS ((void))
6466 abbrev_entry * abbrev;
6468 for (abbrev = first_abbrev; abbrev;)
6470 abbrev_entry * next = abbrev->next;
6473 for (attr = abbrev->first_attr; attr;)
6475 abbrev_attr * next = attr->next;
6485 last_abbrev = first_abbrev = NULL;
6489 add_abbrev (number, tag, children)
6490 unsigned long number;
6494 abbrev_entry * entry;
6496 entry = (abbrev_entry *) malloc (sizeof (* entry));
6502 entry->entry = number;
6504 entry->children = children;
6505 entry->first_attr = NULL;
6506 entry->last_attr = NULL;
6509 if (first_abbrev == NULL)
6510 first_abbrev = entry;
6512 last_abbrev->next = entry;
6514 last_abbrev = entry;
6518 add_abbrev_attr (attribute, form)
6519 unsigned long attribute;
6524 attr = (abbrev_attr *) malloc (sizeof (* attr));
6530 attr->attribute = attribute;
6534 if (last_abbrev->first_attr == NULL)
6535 last_abbrev->first_attr = attr;
6537 last_abbrev->last_attr->next = attr;
6539 last_abbrev->last_attr = attr;
6542 /* Processes the (partial) contents of a .debug_abbrev section.
6543 Returns NULL if the end of the section was encountered.
6544 Returns the address after the last byte read if the end of
6545 an abbreviation set was found. */
6547 static unsigned char *
6548 process_abbrev_section (start, end)
6549 unsigned char * start;
6550 unsigned char * end;
6552 if (first_abbrev != NULL)
6558 unsigned long entry;
6560 unsigned long attribute;
6563 entry = read_leb128 (start, & bytes_read, 0);
6564 start += bytes_read;
6566 /* A single zero is supposed to end the section according
6567 to the standard. If there's more, then signal that to
6570 return start == end ? NULL : start;
6572 tag = read_leb128 (start, & bytes_read, 0);
6573 start += bytes_read;
6575 children = * start ++;
6577 add_abbrev (entry, tag, children);
6583 attribute = read_leb128 (start, & bytes_read, 0);
6584 start += bytes_read;
6586 form = read_leb128 (start, & bytes_read, 0);
6587 start += bytes_read;
6590 add_abbrev_attr (attribute, form);
6592 while (attribute != 0);
6600 display_debug_macinfo (section, start, file)
6601 Elf32_Internal_Shdr * section;
6602 unsigned char * start;
6603 FILE * file ATTRIBUTE_UNUSED;
6605 unsigned char * end = start + section->sh_size;
6606 unsigned char * curr = start;
6607 unsigned int bytes_read;
6608 enum dwarf_macinfo_record_type op;
6610 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6614 unsigned int lineno;
6615 const char * string;
6622 case DW_MACINFO_start_file:
6624 unsigned int filenum;
6626 lineno = read_leb128 (curr, & bytes_read, 0);
6628 filenum = read_leb128 (curr, & bytes_read, 0);
6631 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno, filenum);
6635 case DW_MACINFO_end_file:
6636 printf (_(" DW_MACINFO_end_file\n"));
6639 case DW_MACINFO_define:
6640 lineno = read_leb128 (curr, & bytes_read, 0);
6643 curr += strlen (string) + 1;
6644 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno, string);
6647 case DW_MACINFO_undef:
6648 lineno = read_leb128 (curr, & bytes_read, 0);
6651 curr += strlen (string) + 1;
6652 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno, string);
6655 case DW_MACINFO_vendor_ext:
6657 unsigned int constant;
6659 constant = read_leb128 (curr, & bytes_read, 0);
6662 curr += strlen (string) + 1;
6663 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant, string);
6674 display_debug_abbrev (section, start, file)
6675 Elf32_Internal_Shdr * section;
6676 unsigned char * start;
6677 FILE * file ATTRIBUTE_UNUSED;
6679 abbrev_entry * entry;
6680 unsigned char * end = start + section->sh_size;
6682 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6686 start = process_abbrev_section (start, end);
6688 if (first_abbrev == NULL)
6691 printf (_(" Number TAG\n"));
6693 for (entry = first_abbrev; entry; entry = entry->next)
6697 printf (_(" %ld %s [%s]\n"),
6699 get_TAG_name (entry->tag),
6700 entry->children ? _("has children") : _("no children"));
6702 for (attr = entry->first_attr; attr; attr = attr->next)
6704 printf (_(" %-18s %s\n"),
6705 get_AT_name (attr->attribute),
6706 get_FORM_name (attr->form));
6720 static unsigned char *
6721 display_block (data, length)
6722 unsigned char * data;
6723 unsigned long length;
6725 printf (_(" %lu byte block: "), length);
6728 printf ("%lx ", (unsigned long) byte_get (data ++, 1));
6734 decode_location_expression (data, pointer_size, length)
6735 unsigned char * data;
6736 unsigned int pointer_size;
6737 unsigned long length;
6741 unsigned long uvalue;
6742 unsigned char * end = data + length;
6751 printf ("DW_OP_addr: %lx",
6752 (unsigned long) byte_get (data, pointer_size));
6753 data += pointer_size;
6756 printf ("DW_OP_deref");
6759 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
6762 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
6765 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
6769 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
6773 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
6777 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
6781 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
6782 (unsigned long) byte_get (data + 4, 4));
6786 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
6787 (long) byte_get (data + 4, 4));
6791 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
6795 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
6799 printf ("DW_OP_dup");
6802 printf ("DW_OP_drop");
6805 printf ("DW_OP_over");
6808 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
6811 printf ("DW_OP_swap");
6814 printf ("DW_OP_rot");
6817 printf ("DW_OP_xderef");
6820 printf ("DW_OP_abs");
6823 printf ("DW_OP_and");
6826 printf ("DW_OP_div");
6829 printf ("DW_OP_minus");
6832 printf ("DW_OP_mod");
6835 printf ("DW_OP_mul");
6838 printf ("DW_OP_neg");
6841 printf ("DW_OP_not");
6844 printf ("DW_OP_or");
6847 printf ("DW_OP_plus");
6849 case DW_OP_plus_uconst:
6850 printf ("DW_OP_plus_uconst: %lu",
6851 read_leb128 (data, &bytes_read, 0));
6855 printf ("DW_OP_shl");
6858 printf ("DW_OP_shr");
6861 printf ("DW_OP_shra");
6864 printf ("DW_OP_xor");
6867 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
6871 printf ("DW_OP_eq");
6874 printf ("DW_OP_ge");
6877 printf ("DW_OP_gt");
6880 printf ("DW_OP_le");
6883 printf ("DW_OP_lt");
6886 printf ("DW_OP_ne");
6889 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
6925 printf ("DW_OP_lit%d", op - DW_OP_lit0);
6960 printf ("DW_OP_reg%d", op - DW_OP_reg0);
6995 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
6996 read_leb128 (data, &bytes_read, 1));
7001 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
7005 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
7009 uvalue = read_leb128 (data, &bytes_read, 0);
7011 printf ("DW_OP_bregx: %lu %ld", uvalue,
7012 read_leb128 (data, &bytes_read, 1));
7016 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
7019 case DW_OP_deref_size:
7020 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
7022 case DW_OP_xderef_size:
7023 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
7026 printf ("DW_OP_nop");
7029 /* DWARF 2.1 extensions. */
7030 case DW_OP_push_object_address:
7031 printf ("DW_OP_push_object_address");
7034 printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2));
7038 printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4));
7042 printf ("DW_OP_calli");
7046 if (op >= DW_OP_lo_user
7047 && op <= DW_OP_hi_user)
7048 printf (_("(User defined location op)"));
7050 printf (_("(Unknown location op)"));
7051 /* No way to tell where the next op is, so just bail. */
7055 /* Separate the ops. */
7061 static const char * debug_str_contents;
7062 static bfd_vma debug_str_size;
7065 load_debug_str (file)
7068 Elf32_Internal_Shdr * sec;
7071 /* If it is already loaded, do nothing. */
7072 if (debug_str_contents != NULL)
7075 /* Locate the .debug_str section. */
7076 for (i = 0, sec = section_headers;
7077 i < elf_header.e_shnum;
7079 if (strcmp (SECTION_NAME (sec), ".debug_str") == 0)
7082 if (i == elf_header.e_shnum || sec->sh_size == 0)
7085 debug_str_size = sec->sh_size;
7087 debug_str_contents = ((char *)
7088 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7089 _("debug_str section data")));
7095 if (debug_str_contents == NULL)
7098 free ((char *) debug_str_contents);
7099 debug_str_contents = NULL;
7104 fetch_indirect_string (offset)
7105 unsigned long offset;
7107 if (debug_str_contents == NULL)
7108 return _("<no .debug_str section>");
7110 if (offset > debug_str_size)
7111 return _("<offset is too big>");
7113 return debug_str_contents + offset;
7118 display_debug_str (section, start, file)
7119 Elf32_Internal_Shdr * section;
7120 unsigned char * start;
7121 FILE * file ATTRIBUTE_UNUSED;
7123 unsigned long bytes;
7126 addr = section->sh_addr;
7127 bytes = section->sh_size;
7131 printf (_("\nThe .debug_str section is empty.\n"));
7135 printf (_("Contents of the .debug_str section:\n\n"));
7143 lbytes = (bytes > 16 ? 16 : bytes);
7145 printf (" 0x%8.8lx ", (unsigned long) addr);
7147 for (j = 0; j < 16; j++)
7150 printf ("%2.2x", start [j]);
7158 for (j = 0; j < lbytes; j++)
7161 if (k >= ' ' && k < 0x80)
7178 static unsigned char *
7179 read_and_display_attr_value (attribute, form, data, cu_offset, pointer_size)
7180 unsigned long attribute;
7182 unsigned char * data;
7183 unsigned long cu_offset;
7184 unsigned long pointer_size;
7186 unsigned long uvalue = 0;
7187 unsigned char * block_start = NULL;
7195 case DW_FORM_ref_addr:
7197 uvalue = byte_get (data, pointer_size);
7198 data += pointer_size;
7202 uvalue = byte_get (data, /* offset_size */ 4);
7203 data += /* offset_size */ 4;
7209 uvalue = byte_get (data ++, 1);
7214 uvalue = byte_get (data, 2);
7220 uvalue = byte_get (data, 4);
7225 uvalue = read_leb128 (data, & bytes_read, 1);
7229 case DW_FORM_ref_udata:
7231 uvalue = read_leb128 (data, & bytes_read, 0);
7235 case DW_FORM_indirect:
7236 form = read_leb128 (data, & bytes_read, 0);
7238 printf (" %s", get_FORM_name (form));
7239 return read_and_display_attr_value (attribute, form, data, cu_offset,
7245 case DW_FORM_ref_addr:
7246 printf (" <#%lx>", uvalue);
7252 case DW_FORM_ref_udata:
7253 printf (" <%lx>", uvalue + cu_offset);
7257 printf (" %#lx", uvalue);
7265 printf (" %ld", uvalue);
7270 uvalue = byte_get (data, 4);
7271 printf (" %lx", uvalue);
7272 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
7276 case DW_FORM_string:
7277 printf (" %s", data);
7278 data += strlen ((char *) data) + 1;
7282 uvalue = read_leb128 (data, & bytes_read, 0);
7283 block_start = data + bytes_read;
7284 data = display_block (block_start, uvalue);
7287 case DW_FORM_block1:
7288 uvalue = byte_get (data, 1);
7289 block_start = data + 1;
7290 data = display_block (block_start, uvalue);
7293 case DW_FORM_block2:
7294 uvalue = byte_get (data, 2);
7295 block_start = data + 2;
7296 data = display_block (block_start, uvalue);
7299 case DW_FORM_block4:
7300 uvalue = byte_get (data, 4);
7301 block_start = data + 4;
7302 data = display_block (block_start, uvalue);
7306 printf (_(" (indirect string, offset: 0x%lx): "), uvalue);
7307 printf (fetch_indirect_string (uvalue));
7310 case DW_FORM_indirect:
7311 /* Handled above. */
7315 warn (_("Unrecognised form: %d\n"), form);
7319 /* For some attributes we can display futher information. */
7328 case DW_INL_not_inlined: printf (_("(not inlined)")); break;
7329 case DW_INL_inlined: printf (_("(inlined)")); break;
7330 case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
7331 case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break;
7332 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break;
7336 case DW_AT_language:
7339 case DW_LANG_C: printf ("(non-ANSI C)"); break;
7340 case DW_LANG_C89: printf ("(ANSI C)"); break;
7341 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
7342 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
7343 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
7344 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
7345 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
7346 case DW_LANG_Ada83: printf ("(Ada)"); break;
7347 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
7348 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
7349 /* DWARF 2.1 values. */
7350 case DW_LANG_C99: printf ("(ANSI C99)"); break;
7351 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
7352 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
7353 /* MIPS extension. */
7354 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
7355 default: printf ("(Unknown: %lx)", uvalue); break;
7359 case DW_AT_encoding:
7362 case DW_ATE_void: printf ("(void)"); break;
7363 case DW_ATE_address: printf ("(machine address)"); break;
7364 case DW_ATE_boolean: printf ("(boolean)"); break;
7365 case DW_ATE_complex_float: printf ("(complex float)"); break;
7366 case DW_ATE_float: printf ("(float)"); break;
7367 case DW_ATE_signed: printf ("(signed)"); break;
7368 case DW_ATE_signed_char: printf ("(signed char)"); break;
7369 case DW_ATE_unsigned: printf ("(unsigned)"); break;
7370 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
7371 /* DWARF 2.1 value. */
7372 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
7374 if (uvalue >= DW_ATE_lo_user
7375 && uvalue <= DW_ATE_hi_user)
7376 printf ("(user defined type)");
7378 printf ("(unknown type)");
7383 case DW_AT_accessibility:
7386 case DW_ACCESS_public: printf ("(public)"); break;
7387 case DW_ACCESS_protected: printf ("(protected)"); break;
7388 case DW_ACCESS_private: printf ("(private)"); break;
7389 default: printf ("(unknown accessibility)"); break;
7393 case DW_AT_visibility:
7396 case DW_VIS_local: printf ("(local)"); break;
7397 case DW_VIS_exported: printf ("(exported)"); break;
7398 case DW_VIS_qualified: printf ("(qualified)"); break;
7399 default: printf ("(unknown visibility)"); break;
7403 case DW_AT_virtuality:
7406 case DW_VIRTUALITY_none: printf ("(none)"); break;
7407 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
7408 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
7409 default: printf ("(unknown virtuality)"); break;
7413 case DW_AT_identifier_case:
7416 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
7417 case DW_ID_up_case: printf ("(up_case)"); break;
7418 case DW_ID_down_case: printf ("(down_case)"); break;
7419 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
7420 default: printf ("(unknown case)"); break;
7424 case DW_AT_calling_convention:
7427 case DW_CC_normal: printf ("(normal)"); break;
7428 case DW_CC_program: printf ("(program)"); break;
7429 case DW_CC_nocall: printf ("(nocall)"); break;
7431 if (uvalue >= DW_CC_lo_user
7432 && uvalue <= DW_CC_hi_user)
7433 printf ("(user defined)");
7435 printf ("(unknown convention)");
7439 case DW_AT_ordering:
7442 case -1: printf ("(undefined)"); break;
7443 case 0: printf ("(row major)"); break;
7444 case 1: printf ("(column major)"); break;
7448 case DW_AT_frame_base:
7449 case DW_AT_location:
7450 case DW_AT_data_member_location:
7451 case DW_AT_vtable_elem_location:
7452 case DW_AT_allocated:
7453 case DW_AT_associated:
7454 case DW_AT_data_location:
7456 case DW_AT_upper_bound:
7457 case DW_AT_lower_bound:
7461 decode_location_expression (block_start, pointer_size, uvalue);
7473 static unsigned char *
7474 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
7475 unsigned long attribute;
7477 unsigned char * data;
7478 unsigned long cu_offset;
7479 unsigned long pointer_size;
7481 printf (" %-18s:", get_AT_name (attribute));
7482 data = read_and_display_attr_value (attribute, form, data, cu_offset,
7489 display_debug_info (section, start, file)
7490 Elf32_Internal_Shdr * section;
7491 unsigned char * start;
7494 unsigned char * end = start + section->sh_size;
7495 unsigned char * section_begin = start;
7497 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7499 load_debug_str (file);
7503 DWARF2_External_CompUnit * external;
7504 DWARF2_Internal_CompUnit compunit;
7505 Elf32_Internal_Shdr * relsec;
7506 unsigned char * tags;
7509 unsigned long cu_offset;
7511 external = (DWARF2_External_CompUnit *) start;
7513 compunit.cu_length = BYTE_GET (external->cu_length);
7514 compunit.cu_version = BYTE_GET (external->cu_version);
7515 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
7516 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
7518 if (compunit.cu_length == 0xffffffff)
7520 warn (_("64-bit DWARF debug info is not supported yet.\n"));
7524 /* Check for RELA relocations in the abbrev_offset address, and
7526 for (relsec = section_headers;
7527 relsec < section_headers + elf_header.e_shnum;
7530 unsigned long nrelas;
7531 Elf_Internal_Rela *rela, *rp;
7532 Elf32_Internal_Shdr *symsec;
7533 Elf_Internal_Sym *symtab;
7534 Elf_Internal_Sym *sym;
7536 if (relsec->sh_type != SHT_RELA
7537 || SECTION_HEADER (relsec->sh_info) != section)
7540 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7544 symsec = SECTION_HEADER (relsec->sh_link);
7545 symtab = GET_ELF_SYMBOLS (file, symsec);
7547 for (rp = rela; rp < rela + nrelas; ++rp)
7550 != (bfd_vma) ((unsigned char *) &external->cu_abbrev_offset
7556 sym = symtab + ELF32_R_SYM (rp->r_info);
7558 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
7560 warn (_("Skipping unexpected symbol type %u\n"),
7561 ELF32_ST_TYPE (sym->st_info));
7567 sym = symtab + ELF64_R_SYM (rp->r_info);
7569 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
7571 warn (_("Skipping unexpected symbol type %u\n"),
7572 ELF64_ST_TYPE (sym->st_info));
7577 compunit.cu_abbrev_offset += rp->r_addend;
7585 tags = start + sizeof (* external);
7586 cu_offset = start - section_begin;
7587 start += compunit.cu_length + sizeof (external->cu_length);
7589 printf (_(" Compilation Unit @ %lx:\n"), cu_offset);
7590 printf (_(" Length: %ld\n"), compunit.cu_length);
7591 printf (_(" Version: %d\n"), compunit.cu_version);
7592 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
7593 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
7595 if (compunit.cu_version != 2)
7597 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
7603 /* Read in the abbrevs used by this compilation unit. */
7606 Elf32_Internal_Shdr * sec;
7607 unsigned char * begin;
7609 /* Locate the .debug_abbrev section and process it. */
7610 for (i = 0, sec = section_headers;
7611 i < elf_header.e_shnum;
7613 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
7616 if (i == elf_header.e_shnum || sec->sh_size == 0)
7618 warn (_("Unable to locate .debug_abbrev section!\n"));
7622 begin = ((unsigned char *)
7623 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7624 _("debug_abbrev section data")));
7628 process_abbrev_section (begin + compunit.cu_abbrev_offset,
7629 begin + sec->sh_size);
7635 while (tags < start)
7638 unsigned long abbrev_number;
7639 abbrev_entry * entry;
7642 abbrev_number = read_leb128 (tags, & bytes_read, 0);
7645 /* A null DIE marks the end of a list of children. */
7646 if (abbrev_number == 0)
7652 /* Scan through the abbreviation list until we reach the
7654 for (entry = first_abbrev;
7655 entry && entry->entry != abbrev_number;
7656 entry = entry->next)
7661 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
7666 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
7668 (unsigned long) (tags - section_begin - bytes_read),
7670 get_TAG_name (entry->tag));
7672 for (attr = entry->first_attr; attr; attr = attr->next)
7673 tags = read_and_display_attr (attr->attribute,
7676 compunit.cu_pointer_size);
7678 if (entry->children)
7691 display_debug_aranges (section, start, file)
7692 Elf32_Internal_Shdr * section;
7693 unsigned char * start;
7694 FILE * file ATTRIBUTE_UNUSED;
7696 unsigned char * end = start + section->sh_size;
7698 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7702 DWARF2_External_ARange * external;
7703 DWARF2_Internal_ARange arange;
7704 unsigned char * ranges;
7705 unsigned long length;
7706 unsigned long address;
7709 external = (DWARF2_External_ARange *) start;
7711 arange.ar_length = BYTE_GET (external->ar_length);
7712 arange.ar_version = BYTE_GET (external->ar_version);
7713 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
7714 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
7715 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
7717 if (arange.ar_length == 0xffffffff)
7719 warn (_("64-bit DWARF aranges are not supported yet.\n"));
7723 if (arange.ar_version != 2)
7725 warn (_("Only DWARF 2 aranges are currently supported.\n"));
7729 printf (_(" Length: %ld\n"), arange.ar_length);
7730 printf (_(" Version: %d\n"), arange.ar_version);
7731 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
7732 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
7733 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
7735 printf (_("\n Address Length\n"));
7737 ranges = start + sizeof (* external);
7739 /* Must pad to an alignment boundary that is twice the pointer size. */
7740 excess = sizeof (* external) % (2 * arange.ar_pointer_size);
7742 ranges += (2 * arange.ar_pointer_size) - excess;
7746 address = byte_get (ranges, arange.ar_pointer_size);
7748 ranges += arange.ar_pointer_size;
7750 length = byte_get (ranges, arange.ar_pointer_size);
7752 ranges += arange.ar_pointer_size;
7754 /* A pair of zeros marks the end of the list. */
7755 if (address == 0 && length == 0)
7758 printf (" %8.8lx %lu\n", address, length);
7761 start += arange.ar_length + sizeof (external->ar_length);
7769 typedef struct Frame_Chunk
7771 struct Frame_Chunk * next;
7772 unsigned char * chunk_start;
7774 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
7775 short int * col_type;
7777 char * augmentation;
7778 unsigned int code_factor;
7780 unsigned long pc_begin;
7781 unsigned long pc_range;
7785 unsigned char fde_encoding;
7789 /* A marker for a col_type that means this column was never referenced
7790 in the frame info. */
7791 #define DW_CFA_unreferenced (-1)
7793 static void frame_need_space PARAMS ((Frame_Chunk *, int));
7794 static void frame_display_row PARAMS ((Frame_Chunk *, int *, int *));
7795 static int size_of_encoded_value PARAMS ((int));
7798 frame_need_space (fc, reg)
7802 int prev = fc->ncols;
7804 if (reg < fc->ncols)
7807 fc->ncols = reg + 1;
7808 fc->col_type = (short int *) xrealloc (fc->col_type,
7809 fc->ncols * sizeof (short int));
7810 fc->col_offset = (int *) xrealloc (fc->col_offset,
7811 fc->ncols * sizeof (int));
7813 while (prev < fc->ncols)
7815 fc->col_type[prev] = DW_CFA_unreferenced;
7816 fc->col_offset[prev] = 0;
7822 frame_display_row (fc, need_col_headers, max_regs)
7824 int * need_col_headers;
7830 if (* max_regs < fc->ncols)
7831 * max_regs = fc->ncols;
7833 if (* need_col_headers)
7835 * need_col_headers = 0;
7837 printf (" LOC CFA ");
7839 for (r = 0; r < * max_regs; r++)
7840 if (fc->col_type[r] != DW_CFA_unreferenced)
7845 printf ("r%-4d", r);
7851 printf ("%08lx ", fc->pc_begin);
7852 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
7853 printf ("%-8s ", tmp);
7855 for (r = 0; r < fc->ncols; r++)
7857 if (fc->col_type[r] != DW_CFA_unreferenced)
7859 switch (fc->col_type[r])
7861 case DW_CFA_undefined:
7864 case DW_CFA_same_value:
7868 sprintf (tmp, "c%+d", fc->col_offset[r]);
7870 case DW_CFA_register:
7871 sprintf (tmp, "r%d", fc->col_offset[r]);
7874 strcpy (tmp, "n/a");
7877 printf ("%-5s", tmp);
7884 size_of_encoded_value (encoding)
7887 switch (encoding & 0x7)
7890 case 0: return is_32bit_elf ? 4 : 8;
7897 #define GET(N) byte_get (start, N); start += N
7898 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
7899 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
7902 display_debug_frames (section, start, file)
7903 Elf32_Internal_Shdr * section;
7904 unsigned char * start;
7905 FILE * file ATTRIBUTE_UNUSED;
7907 unsigned char * end = start + section->sh_size;
7908 unsigned char * section_start = start;
7909 Frame_Chunk * chunks = 0;
7910 Frame_Chunk * remembered_state = 0;
7912 int is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
7915 int addr_size = is_32bit_elf ? 4 : 8;
7917 printf (_("The section %s contains:\n"), SECTION_NAME (section));
7921 unsigned char * saved_start;
7922 unsigned char * block_end;
7923 unsigned long length;
7924 unsigned long cie_id;
7927 int need_col_headers = 1;
7928 unsigned char * augmentation_data = NULL;
7929 unsigned long augmentation_data_len = 0;
7930 int encoded_ptr_size = addr_size;
7932 saved_start = start;
7933 length = byte_get (start, 4); start += 4;
7938 if (length == 0xffffffff)
7940 warn (_("64-bit DWARF format frames are not supported yet.\n"));
7944 block_end = saved_start + length + 4;
7945 cie_id = byte_get (start, 4); start += 4;
7947 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
7951 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
7952 memset (fc, 0, sizeof (Frame_Chunk));
7956 fc->chunk_start = saved_start;
7958 fc->col_type = (short int *) xmalloc (sizeof (short int));
7959 fc->col_offset = (int *) xmalloc (sizeof (int));
7960 frame_need_space (fc, max_regs-1);
7964 fc->augmentation = start;
7965 start = strchr (start, '\0') + 1;
7967 if (fc->augmentation[0] == 'z')
7969 fc->code_factor = LEB ();
7970 fc->data_factor = SLEB ();
7971 fc->ra = byte_get (start, 1); start += 1;
7972 augmentation_data_len = LEB ();
7973 augmentation_data = start;
7974 start += augmentation_data_len;
7976 else if (strcmp (fc->augmentation, "eh") == 0)
7979 fc->code_factor = LEB ();
7980 fc->data_factor = SLEB ();
7981 fc->ra = byte_get (start, 1); start += 1;
7985 fc->code_factor = LEB ();
7986 fc->data_factor = SLEB ();
7987 fc->ra = byte_get (start, 1); start += 1;
7991 if (do_debug_frames_interp)
7992 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
7993 (unsigned long)(saved_start - section_start), length, cie_id,
7994 fc->augmentation, fc->code_factor, fc->data_factor,
7998 printf ("\n%08lx %08lx %08lx CIE\n",
7999 (unsigned long)(saved_start - section_start), length, cie_id);
8000 printf (" Version: %d\n", version);
8001 printf (" Augmentation: \"%s\"\n", fc->augmentation);
8002 printf (" Code alignment factor: %u\n", fc->code_factor);
8003 printf (" Data alignment factor: %d\n", fc->data_factor);
8004 printf (" Return address column: %d\n", fc->ra);
8006 if (augmentation_data_len)
8009 printf (" Augmentation data: ");
8010 for (i = 0; i < augmentation_data_len; ++i)
8011 printf (" %02x", augmentation_data[i]);
8017 if (augmentation_data_len)
8019 unsigned char *p, *q;
8020 p = fc->augmentation + 1;
8021 q = augmentation_data;
8028 q += 1 + size_of_encoded_value (*q);
8030 fc->fde_encoding = *q++;
8036 if (fc->fde_encoding)
8037 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8040 frame_need_space (fc, fc->ra);
8044 unsigned char * look_for;
8045 static Frame_Chunk fde_fc;
8048 memset (fc, 0, sizeof (Frame_Chunk));
8050 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
8052 for (cie = chunks; cie ; cie = cie->next)
8053 if (cie->chunk_start == look_for)
8058 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
8059 cie_id, saved_start);
8062 fc->col_type = (short int *) xmalloc (sizeof (short int));
8063 fc->col_offset = (int *) xmalloc (sizeof (int));
8064 frame_need_space (fc, max_regs - 1);
8066 fc->augmentation = "";
8067 fc->fde_encoding = 0;
8071 fc->ncols = cie->ncols;
8072 fc->col_type = (short int *) xmalloc (fc->ncols * sizeof (short int));
8073 fc->col_offset = (int *) xmalloc (fc->ncols * sizeof (int));
8074 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
8075 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
8076 fc->augmentation = cie->augmentation;
8077 fc->code_factor = cie->code_factor;
8078 fc->data_factor = cie->data_factor;
8079 fc->cfa_reg = cie->cfa_reg;
8080 fc->cfa_offset = cie->cfa_offset;
8082 frame_need_space (fc, max_regs-1);
8083 fc->fde_encoding = cie->fde_encoding;
8086 if (fc->fde_encoding)
8087 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8089 fc->pc_begin = byte_get (start, encoded_ptr_size);
8090 start += encoded_ptr_size;
8091 fc->pc_range = byte_get (start, encoded_ptr_size);
8092 start += encoded_ptr_size;
8094 if (cie->augmentation[0] == 'z')
8096 augmentation_data_len = LEB ();
8097 augmentation_data = start;
8098 start += augmentation_data_len;
8101 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
8102 (unsigned long)(saved_start - section_start), length, cie_id,
8103 (unsigned long)(cie->chunk_start - section_start),
8104 fc->pc_begin, fc->pc_begin + fc->pc_range);
8105 if (! do_debug_frames_interp && augmentation_data_len)
8108 printf (" Augmentation data: ");
8109 for (i = 0; i < augmentation_data_len; ++i)
8110 printf (" %02x", augmentation_data[i]);
8116 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8117 about to interpret instructions for the chunk. */
8119 if (do_debug_frames_interp)
8121 /* Start by making a pass over the chunk, allocating storage
8122 and taking note of what registers are used. */
8123 unsigned char * tmp = start;
8125 while (start < block_end)
8135 /* Warning: if you add any more cases to this switch, be
8136 sure to add them to the corresponding switch below. */
8139 case DW_CFA_advance_loc:
8143 frame_need_space (fc, opa);
8144 fc->col_type[opa] = DW_CFA_undefined;
8146 case DW_CFA_restore:
8147 frame_need_space (fc, opa);
8148 fc->col_type[opa] = DW_CFA_undefined;
8150 case DW_CFA_set_loc:
8151 start += encoded_ptr_size;
8153 case DW_CFA_advance_loc1:
8156 case DW_CFA_advance_loc2:
8159 case DW_CFA_advance_loc4:
8162 case DW_CFA_offset_extended:
8163 reg = LEB (); LEB ();
8164 frame_need_space (fc, reg);
8165 fc->col_type[reg] = DW_CFA_undefined;
8167 case DW_CFA_restore_extended:
8169 frame_need_space (fc, reg);
8170 fc->col_type[reg] = DW_CFA_undefined;
8172 case DW_CFA_undefined:
8174 frame_need_space (fc, reg);
8175 fc->col_type[reg] = DW_CFA_undefined;
8177 case DW_CFA_same_value:
8179 frame_need_space (fc, reg);
8180 fc->col_type[reg] = DW_CFA_undefined;
8182 case DW_CFA_register:
8183 reg = LEB (); LEB ();
8184 frame_need_space (fc, reg);
8185 fc->col_type[reg] = DW_CFA_undefined;
8187 case DW_CFA_def_cfa:
8190 case DW_CFA_def_cfa_register:
8193 case DW_CFA_def_cfa_offset:
8196 #ifndef DW_CFA_GNU_args_size
8197 #define DW_CFA_GNU_args_size 0x2e
8199 case DW_CFA_GNU_args_size:
8202 #ifndef DW_CFA_GNU_negative_offset_extended
8203 #define DW_CFA_GNU_negative_offset_extended 0x2f
8205 case DW_CFA_GNU_negative_offset_extended:
8206 reg = LEB (); LEB ();
8207 frame_need_space (fc, reg);
8208 fc->col_type[reg] = DW_CFA_undefined;
8217 /* Now we know what registers are used, make a second pass over
8218 the chunk, this time actually printing out the info. */
8220 while (start < block_end)
8223 unsigned long ul, reg, roffs;
8232 /* Warning: if you add any more cases to this switch, be
8233 sure to add them to the corresponding switch above. */
8236 case DW_CFA_advance_loc:
8237 if (do_debug_frames_interp)
8238 frame_display_row (fc, &need_col_headers, &max_regs);
8240 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8241 opa * fc->code_factor,
8242 fc->pc_begin + opa * fc->code_factor);
8243 fc->pc_begin += opa * fc->code_factor;
8248 if (! do_debug_frames_interp)
8249 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8250 opa, roffs * fc->data_factor);
8251 fc->col_type[opa] = DW_CFA_offset;
8252 fc->col_offset[opa] = roffs * fc->data_factor;
8255 case DW_CFA_restore:
8256 if (! do_debug_frames_interp)
8257 printf (" DW_CFA_restore: r%d\n", opa);
8258 fc->col_type[opa] = cie->col_type[opa];
8259 fc->col_offset[opa] = cie->col_offset[opa];
8262 case DW_CFA_set_loc:
8263 vma = byte_get (start, encoded_ptr_size);
8264 start += encoded_ptr_size;
8265 if (do_debug_frames_interp)
8266 frame_display_row (fc, &need_col_headers, &max_regs);
8268 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
8272 case DW_CFA_advance_loc1:
8273 ofs = byte_get (start, 1); start += 1;
8274 if (do_debug_frames_interp)
8275 frame_display_row (fc, &need_col_headers, &max_regs);
8277 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8278 ofs * fc->code_factor,
8279 fc->pc_begin + ofs * fc->code_factor);
8280 fc->pc_begin += ofs * fc->code_factor;
8283 case DW_CFA_advance_loc2:
8284 ofs = byte_get (start, 2); start += 2;
8285 if (do_debug_frames_interp)
8286 frame_display_row (fc, &need_col_headers, &max_regs);
8288 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8289 ofs * fc->code_factor,
8290 fc->pc_begin + ofs * fc->code_factor);
8291 fc->pc_begin += ofs * fc->code_factor;
8294 case DW_CFA_advance_loc4:
8295 ofs = byte_get (start, 4); start += 4;
8296 if (do_debug_frames_interp)
8297 frame_display_row (fc, &need_col_headers, &max_regs);
8299 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8300 ofs * fc->code_factor,
8301 fc->pc_begin + ofs * fc->code_factor);
8302 fc->pc_begin += ofs * fc->code_factor;
8305 case DW_CFA_offset_extended:
8308 if (! do_debug_frames_interp)
8309 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8310 reg, roffs * fc->data_factor);
8311 fc->col_type[reg] = DW_CFA_offset;
8312 fc->col_offset[reg] = roffs * fc->data_factor;
8315 case DW_CFA_restore_extended:
8317 if (! do_debug_frames_interp)
8318 printf (" DW_CFA_restore_extended: r%ld\n", reg);
8319 fc->col_type[reg] = cie->col_type[reg];
8320 fc->col_offset[reg] = cie->col_offset[reg];
8323 case DW_CFA_undefined:
8325 if (! do_debug_frames_interp)
8326 printf (" DW_CFA_undefined: r%ld\n", reg);
8327 fc->col_type[reg] = DW_CFA_undefined;
8328 fc->col_offset[reg] = 0;
8331 case DW_CFA_same_value:
8333 if (! do_debug_frames_interp)
8334 printf (" DW_CFA_same_value: r%ld\n", reg);
8335 fc->col_type[reg] = DW_CFA_same_value;
8336 fc->col_offset[reg] = 0;
8339 case DW_CFA_register:
8342 if (! do_debug_frames_interp)
8343 printf (" DW_CFA_register: r%ld\n", reg);
8344 fc->col_type[reg] = DW_CFA_register;
8345 fc->col_offset[reg] = roffs;
8348 case DW_CFA_remember_state:
8349 if (! do_debug_frames_interp)
8350 printf (" DW_CFA_remember_state\n");
8351 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8352 rs->ncols = fc->ncols;
8353 rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
8354 rs->col_offset = (int *) xmalloc (rs->ncols * sizeof (int));
8355 memcpy (rs->col_type, fc->col_type, rs->ncols);
8356 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
8357 rs->next = remembered_state;
8358 remembered_state = rs;
8361 case DW_CFA_restore_state:
8362 if (! do_debug_frames_interp)
8363 printf (" DW_CFA_restore_state\n");
8364 rs = remembered_state;
8365 remembered_state = rs->next;
8366 frame_need_space (fc, rs->ncols-1);
8367 memcpy (fc->col_type, rs->col_type, rs->ncols);
8368 memcpy (fc->col_offset, rs->col_offset, rs->ncols * sizeof (int));
8369 free (rs->col_type);
8370 free (rs->col_offset);
8374 case DW_CFA_def_cfa:
8375 fc->cfa_reg = LEB ();
8376 fc->cfa_offset = LEB ();
8377 if (! do_debug_frames_interp)
8378 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
8379 fc->cfa_reg, fc->cfa_offset);
8382 case DW_CFA_def_cfa_register:
8383 fc->cfa_reg = LEB ();
8384 if (! do_debug_frames_interp)
8385 printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
8388 case DW_CFA_def_cfa_offset:
8389 fc->cfa_offset = LEB ();
8390 if (! do_debug_frames_interp)
8391 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
8395 if (! do_debug_frames_interp)
8396 printf (" DW_CFA_nop\n");
8399 #ifndef DW_CFA_GNU_window_save
8400 #define DW_CFA_GNU_window_save 0x2d
8402 case DW_CFA_GNU_window_save:
8403 if (! do_debug_frames_interp)
8404 printf (" DW_CFA_GNU_window_save\n");
8407 case DW_CFA_GNU_args_size:
8409 if (! do_debug_frames_interp)
8410 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
8413 case DW_CFA_GNU_negative_offset_extended:
8416 frame_need_space (fc, reg);
8417 if (! do_debug_frames_interp)
8418 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
8419 reg, l * fc->data_factor);
8420 fc->col_type[reg] = DW_CFA_offset;
8421 fc->col_offset[reg] = l * fc->data_factor;
8425 fprintf (stderr, "unsupported or unknown DW_CFA_%d\n", op);
8430 if (do_debug_frames_interp)
8431 frame_display_row (fc, &need_col_headers, &max_regs);
8446 display_debug_not_supported (section, start, file)
8447 Elf32_Internal_Shdr * section;
8448 unsigned char * start ATTRIBUTE_UNUSED;
8449 FILE * file ATTRIBUTE_UNUSED;
8451 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
8452 SECTION_NAME (section));
8457 /* Pre-scan the .debug_info section to record the size of address.
8458 When dumping the .debug_line, we use that size information, assuming
8459 that all compilation units have the same address size. */
8461 prescan_debug_info (section, start, file)
8462 Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
8463 unsigned char * start;
8464 FILE * file ATTRIBUTE_UNUSED;
8466 DWARF2_External_CompUnit * external;
8468 external = (DWARF2_External_CompUnit *) start;
8470 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
8474 /* A structure containing the name of a debug section and a pointer
8475 to a function that can decode it. The third field is a prescan
8476 function to be run over the section before displaying any of the
8480 const char * const name;
8481 int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8482 int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8486 { ".debug_abbrev", display_debug_abbrev, NULL },
8487 { ".debug_aranges", display_debug_aranges, NULL },
8488 { ".debug_frame", display_debug_frames, NULL },
8489 { ".debug_info", display_debug_info, prescan_debug_info },
8490 { ".debug_line", display_debug_lines, NULL },
8491 { ".debug_pubnames", display_debug_pubnames, NULL },
8492 { ".eh_frame", display_debug_frames, NULL },
8493 { ".debug_macinfo", display_debug_macinfo, NULL },
8494 { ".debug_str", display_debug_str, NULL },
8496 { ".debug_pubtypes", display_debug_not_supported, NULL },
8497 { ".debug_ranges", display_debug_not_supported, NULL },
8498 { ".debug_static_func", display_debug_not_supported, NULL },
8499 { ".debug_static_vars", display_debug_not_supported, NULL },
8500 { ".debug_types", display_debug_not_supported, NULL },
8501 { ".debug_weaknames", display_debug_not_supported, NULL }
8505 display_debug_section (section, file)
8506 Elf32_Internal_Shdr * section;
8509 char * name = SECTION_NAME (section);
8510 bfd_size_type length;
8511 unsigned char * start;
8514 length = section->sh_size;
8517 printf (_("\nSection '%s' has no debugging data.\n"), name);
8521 start = (unsigned char *) get_data (NULL, file, section->sh_offset, length,
8522 _("debug section data"));
8526 /* See if we know how to display the contents of this section. */
8527 if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
8528 name = ".debug_info";
8530 for (i = NUM_ELEM (debug_displays); i--;)
8531 if (strcmp (debug_displays[i].name, name) == 0)
8533 debug_displays[i].display (section, start, file);
8538 printf (_("Unrecognised debug section: %s\n"), name);
8542 /* If we loaded in the abbrev section at some point,
8543 we must release it here. */
8550 process_section_contents (file)
8553 Elf32_Internal_Shdr * section;
8559 /* Pre-scan the debug sections to find some debug information not
8560 present in some of them. For the .debug_line, we must find out the
8561 size of address (specified in .debug_info and .debug_aranges). */
8562 for (i = 0, section = section_headers;
8563 i < elf_header.e_shnum && i < num_dump_sects;
8566 char * name = SECTION_NAME (section);
8569 if (section->sh_size == 0)
8572 /* See if there is some pre-scan operation for this section. */
8573 for (j = NUM_ELEM (debug_displays); j--;)
8574 if (strcmp (debug_displays[j].name, name) == 0)
8576 if (debug_displays[j].prescan != NULL)
8578 bfd_size_type length;
8579 unsigned char * start;
8581 length = section->sh_size;
8582 start = ((unsigned char *)
8583 get_data (NULL, file, section->sh_offset, length,
8584 _("debug section data")));
8588 debug_displays[j].prescan (section, start, file);
8596 for (i = 0, section = section_headers;
8597 i < elf_header.e_shnum && i < num_dump_sects;
8600 #ifdef SUPPORT_DISASSEMBLY
8601 if (dump_sects[i] & DISASS_DUMP)
8602 disassemble_section (section, file);
8604 if (dump_sects[i] & HEX_DUMP)
8605 dump_section (section, file);
8607 if (dump_sects[i] & DEBUG_DUMP)
8608 display_debug_section (section, file);
8611 if (i < num_dump_sects)
8612 warn (_("Some sections were not dumped because they do not exist!\n"));
8618 process_mips_fpe_exception (mask)
8624 if (mask & OEX_FPU_INEX)
8625 fputs ("INEX", stdout), first = 0;
8626 if (mask & OEX_FPU_UFLO)
8627 printf ("%sUFLO", first ? "" : "|"), first = 0;
8628 if (mask & OEX_FPU_OFLO)
8629 printf ("%sOFLO", first ? "" : "|"), first = 0;
8630 if (mask & OEX_FPU_DIV0)
8631 printf ("%sDIV0", first ? "" : "|"), first = 0;
8632 if (mask & OEX_FPU_INVAL)
8633 printf ("%sINVAL", first ? "" : "|");
8636 fputs ("0", stdout);
8640 process_mips_specific (file)
8643 Elf_Internal_Dyn * entry;
8644 size_t liblist_offset = 0;
8645 size_t liblistno = 0;
8646 size_t conflictsno = 0;
8647 size_t options_offset = 0;
8648 size_t conflicts_offset = 0;
8650 /* We have a lot of special sections. Thanks SGI! */
8651 if (dynamic_segment == NULL)
8652 /* No information available. */
8655 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
8656 switch (entry->d_tag)
8658 case DT_MIPS_LIBLIST:
8659 liblist_offset = entry->d_un.d_val - loadaddr;
8661 case DT_MIPS_LIBLISTNO:
8662 liblistno = entry->d_un.d_val;
8664 case DT_MIPS_OPTIONS:
8665 options_offset = entry->d_un.d_val - loadaddr;
8667 case DT_MIPS_CONFLICT:
8668 conflicts_offset = entry->d_un.d_val - loadaddr;
8670 case DT_MIPS_CONFLICTNO:
8671 conflictsno = entry->d_un.d_val;
8677 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
8679 Elf32_External_Lib * elib;
8682 elib = ((Elf32_External_Lib *)
8683 get_data (NULL, file, liblist_offset,
8684 liblistno * sizeof (Elf32_External_Lib),
8688 printf ("\nSection '.liblist' contains %lu entries:\n",
8689 (unsigned long) liblistno);
8690 fputs (" Library Time Stamp Checksum Version Flags\n",
8693 for (cnt = 0; cnt < liblistno; ++cnt)
8700 liblist.l_name = BYTE_GET (elib[cnt].l_name);
8701 time = BYTE_GET (elib[cnt].l_time_stamp);
8702 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
8703 liblist.l_version = BYTE_GET (elib[cnt].l_version);
8704 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
8706 tmp = gmtime (&time);
8707 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
8708 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8709 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8711 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt,
8712 dynamic_strings + liblist.l_name, timebuf,
8713 liblist.l_checksum, liblist.l_version);
8715 if (liblist.l_flags == 0)
8726 { " EXACT_MATCH", LL_EXACT_MATCH },
8727 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
8728 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
8729 { " EXPORTS", LL_EXPORTS },
8730 { " DELAY_LOAD", LL_DELAY_LOAD },
8731 { " DELTA", LL_DELTA }
8733 int flags = liblist.l_flags;
8737 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
8739 if ((flags & l_flags_vals[fcnt].bit) != 0)
8741 fputs (l_flags_vals[fcnt].name, stdout);
8742 flags ^= l_flags_vals[fcnt].bit;
8745 printf (" %#x", (unsigned int) flags);
8755 if (options_offset != 0)
8757 Elf_External_Options * eopt;
8758 Elf_Internal_Shdr * sect = section_headers;
8759 Elf_Internal_Options * iopt;
8760 Elf_Internal_Options * option;
8764 /* Find the section header so that we get the size. */
8765 while (sect->sh_type != SHT_MIPS_OPTIONS)
8768 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset,
8769 sect->sh_size, _("options"));
8772 iopt = ((Elf_Internal_Options *)
8773 malloc ((sect->sh_size / sizeof (eopt)) * sizeof (* iopt)));
8776 error (_("Out of memory"));
8783 while (offset < sect->sh_size)
8785 Elf_External_Options * eoption;
8787 eoption = (Elf_External_Options *) ((char *) eopt + offset);
8789 option->kind = BYTE_GET (eoption->kind);
8790 option->size = BYTE_GET (eoption->size);
8791 option->section = BYTE_GET (eoption->section);
8792 option->info = BYTE_GET (eoption->info);
8794 offset += option->size;
8800 printf (_("\nSection '%s' contains %d entries:\n"),
8801 SECTION_NAME (sect), cnt);
8809 switch (option->kind)
8812 /* This shouldn't happen. */
8813 printf (" NULL %d %lx", option->section, option->info);
8816 printf (" REGINFO ");
8817 if (elf_header.e_machine == EM_MIPS)
8820 Elf32_External_RegInfo * ereg;
8821 Elf32_RegInfo reginfo;
8823 ereg = (Elf32_External_RegInfo *) (option + 1);
8824 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8825 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8826 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8827 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8828 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8829 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
8831 printf ("GPR %08lx GP 0x%lx\n",
8833 (unsigned long) reginfo.ri_gp_value);
8834 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8835 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8836 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8841 Elf64_External_RegInfo * ereg;
8842 Elf64_Internal_RegInfo reginfo;
8844 ereg = (Elf64_External_RegInfo *) (option + 1);
8845 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8846 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8847 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8848 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8849 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8850 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
8852 printf ("GPR %08lx GP 0x",
8853 reginfo.ri_gprmask);
8854 printf_vma (reginfo.ri_gp_value);
8857 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8858 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8859 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8863 case ODK_EXCEPTIONS:
8864 fputs (" EXCEPTIONS fpe_min(", stdout);
8865 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
8866 fputs (") fpe_max(", stdout);
8867 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
8868 fputs (")", stdout);
8870 if (option->info & OEX_PAGE0)
8871 fputs (" PAGE0", stdout);
8872 if (option->info & OEX_SMM)
8873 fputs (" SMM", stdout);
8874 if (option->info & OEX_FPDBUG)
8875 fputs (" FPDBUG", stdout);
8876 if (option->info & OEX_DISMISS)
8877 fputs (" DISMISS", stdout);
8880 fputs (" PAD ", stdout);
8881 if (option->info & OPAD_PREFIX)
8882 fputs (" PREFIX", stdout);
8883 if (option->info & OPAD_POSTFIX)
8884 fputs (" POSTFIX", stdout);
8885 if (option->info & OPAD_SYMBOL)
8886 fputs (" SYMBOL", stdout);
8889 fputs (" HWPATCH ", stdout);
8890 if (option->info & OHW_R4KEOP)
8891 fputs (" R4KEOP", stdout);
8892 if (option->info & OHW_R8KPFETCH)
8893 fputs (" R8KPFETCH", stdout);
8894 if (option->info & OHW_R5KEOP)
8895 fputs (" R5KEOP", stdout);
8896 if (option->info & OHW_R5KCVTL)
8897 fputs (" R5KCVTL", stdout);
8900 fputs (" FILL ", stdout);
8901 /* XXX Print content of info word? */
8904 fputs (" TAGS ", stdout);
8905 /* XXX Print content of info word? */
8908 fputs (" HWAND ", stdout);
8909 if (option->info & OHWA0_R4KEOP_CHECKED)
8910 fputs (" R4KEOP_CHECKED", stdout);
8911 if (option->info & OHWA0_R4KEOP_CLEAN)
8912 fputs (" R4KEOP_CLEAN", stdout);
8915 fputs (" HWOR ", stdout);
8916 if (option->info & OHWA0_R4KEOP_CHECKED)
8917 fputs (" R4KEOP_CHECKED", stdout);
8918 if (option->info & OHWA0_R4KEOP_CLEAN)
8919 fputs (" R4KEOP_CLEAN", stdout);
8922 printf (" GP_GROUP %#06lx self-contained %#06lx",
8923 option->info & OGP_GROUP,
8924 (option->info & OGP_SELF) >> 16);
8927 printf (" IDENT %#06lx self-contained %#06lx",
8928 option->info & OGP_GROUP,
8929 (option->info & OGP_SELF) >> 16);
8932 /* This shouldn't happen. */
8933 printf (" %3d ??? %d %lx",
8934 option->kind, option->section, option->info);
8938 len = sizeof (* eopt);
8939 while (len < option->size)
8940 if (((char *) option)[len] >= ' '
8941 && ((char *) option)[len] < 0x7f)
8942 printf ("%c", ((char *) option)[len++]);
8944 printf ("\\%03o", ((char *) option)[len++]);
8946 fputs ("\n", stdout);
8954 if (conflicts_offset != 0 && conflictsno != 0)
8956 Elf32_Conflict * iconf;
8959 if (dynamic_symbols == NULL)
8961 error (_("conflict list with without table"));
8965 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (* iconf));
8968 error (_("Out of memory"));
8974 Elf32_External_Conflict * econf32;
8976 econf32 = ((Elf32_External_Conflict *)
8977 get_data (NULL, file, conflicts_offset,
8978 conflictsno * sizeof (* econf32),
8983 for (cnt = 0; cnt < conflictsno; ++cnt)
8984 iconf[cnt] = BYTE_GET (econf32[cnt]);
8990 Elf64_External_Conflict * econf64;
8992 econf64 = ((Elf64_External_Conflict *)
8993 get_data (NULL, file, conflicts_offset,
8994 conflictsno * sizeof (* econf64),
8999 for (cnt = 0; cnt < conflictsno; ++cnt)
9000 iconf[cnt] = BYTE_GET (econf64[cnt]);
9005 printf (_("\nSection '.conflict' contains %ld entries:\n"),
9006 (long) conflictsno);
9007 puts (_(" Num: Index Value Name"));
9009 for (cnt = 0; cnt < conflictsno; ++cnt)
9011 Elf_Internal_Sym * psym = &dynamic_symbols[iconf[cnt]];
9013 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
9014 print_vma (psym->st_value, FULL_HEX);
9015 printf (" %s\n", dynamic_strings + psym->st_name);
9025 get_note_type (e_type)
9028 static char buff[64];
9032 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
9033 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
9034 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
9035 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
9036 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
9037 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
9038 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
9039 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
9040 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
9041 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
9042 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
9044 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
9049 /* Note that by the ELF standard, the name field is already null byte
9050 terminated, and namesz includes the terminating null byte.
9051 I.E. the value of namesz for the name "FSF" is 4.
9053 If the value of namesz is zero, there is no name present. */
9055 process_note (pnote)
9056 Elf32_Internal_Note * pnote;
9058 printf (" %s\t\t0x%08lx\t%s\n",
9059 pnote->namesz ? pnote->namedata : "(NONE)",
9060 pnote->descsz, get_note_type (pnote->type));
9066 process_corefile_note_segment (file, offset, length)
9071 Elf_External_Note * pnotes;
9072 Elf_External_Note * external;
9078 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, length,
9085 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9086 (unsigned long) offset, (unsigned long) length);
9087 printf (_(" Owner\t\tData size\tDescription\n"));
9089 while (external < (Elf_External_Note *)((char *) pnotes + length))
9091 Elf32_Internal_Note inote;
9094 inote.type = BYTE_GET (external->type);
9095 inote.namesz = BYTE_GET (external->namesz);
9096 inote.namedata = external->name;
9097 inote.descsz = BYTE_GET (external->descsz);
9098 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
9099 inote.descpos = offset + (inote.descdata - (char *) pnotes);
9101 external = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
9103 /* Verify that name is null terminated. It appears that at least
9104 one version of Linux (RedHat 6.0) generates corefiles that don't
9105 comply with the ELF spec by failing to include the null byte in
9107 if (inote.namedata[inote.namesz] != '\0')
9109 temp = malloc (inote.namesz + 1);
9113 error (_("Out of memory\n"));
9118 strncpy (temp, inote.namedata, inote.namesz);
9119 temp[inote.namesz] = 0;
9121 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9122 inote.namedata = temp;
9125 res &= process_note (& inote);
9140 process_corefile_note_segments (file)
9143 Elf_Internal_Phdr * program_headers;
9144 Elf_Internal_Phdr * segment;
9148 program_headers = (Elf_Internal_Phdr *) malloc
9149 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
9151 if (program_headers == NULL)
9153 error (_("Out of memory\n"));
9158 i = get_32bit_program_headers (file, program_headers);
9160 i = get_64bit_program_headers (file, program_headers);
9164 free (program_headers);
9168 for (i = 0, segment = program_headers;
9169 i < elf_header.e_phnum;
9172 if (segment->p_type == PT_NOTE)
9173 res &= process_corefile_note_segment (file,
9174 (bfd_vma) segment->p_offset,
9175 (bfd_vma) segment->p_filesz);
9178 free (program_headers);
9184 process_corefile_contents (file)
9187 /* If we have not been asked to display the notes then do nothing. */
9191 /* If file is not a core file then exit. */
9192 if (elf_header.e_type != ET_CORE)
9195 /* No program headers means no NOTE segment. */
9196 if (elf_header.e_phnum == 0)
9198 printf (_("No note segments present in the core file.\n"));
9202 return process_corefile_note_segments (file);
9206 process_arch_specific (file)
9212 switch (elf_header.e_machine)
9215 case EM_MIPS_RS3_LE:
9216 return process_mips_specific (file);
9225 get_file_header (file)
9228 /* Read in the identity array. */
9229 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
9232 /* Determine how to read the rest of the header. */
9233 switch (elf_header.e_ident [EI_DATA])
9235 default: /* fall through */
9236 case ELFDATANONE: /* fall through */
9237 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
9238 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
9241 /* For now we only support 32 bit and 64 bit ELF files. */
9242 is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
9244 /* Read in the rest of the header. */
9247 Elf32_External_Ehdr ehdr32;
9249 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
9252 elf_header.e_type = BYTE_GET (ehdr32.e_type);
9253 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
9254 elf_header.e_version = BYTE_GET (ehdr32.e_version);
9255 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
9256 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
9257 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
9258 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
9259 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
9260 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
9261 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
9262 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
9263 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
9264 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
9268 Elf64_External_Ehdr ehdr64;
9270 /* If we have been compiled with sizeof (bfd_vma) == 4, then
9271 we will not be able to cope with the 64bit data found in
9272 64 ELF files. Detect this now and abort before we start
9273 overwritting things. */
9274 if (sizeof (bfd_vma) < 8)
9276 error (_("This instance of readelf has been built without support for a\n\
9277 64 bit data type and so it cannot read 64 bit ELF files.\n"));
9281 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
9284 elf_header.e_type = BYTE_GET (ehdr64.e_type);
9285 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
9286 elf_header.e_version = BYTE_GET (ehdr64.e_version);
9287 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
9288 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
9289 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
9290 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
9291 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
9292 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
9293 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
9294 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
9295 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
9296 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
9299 /* There may be some extensions in the first section header. Don't
9300 bomb if we can't read it. */
9302 get_32bit_section_headers (file, 1);
9304 get_64bit_section_headers (file, 1);
9310 process_file (file_name)
9314 struct stat statbuf;
9317 if (stat (file_name, & statbuf) < 0)
9319 error (_("Cannot stat input file %s.\n"), file_name);
9323 file = fopen (file_name, "rb");
9326 error (_("Input file %s not found.\n"), file_name);
9330 if (! get_file_header (file))
9332 error (_("%s: Failed to read file header\n"), file_name);
9337 /* Initialise per file variables. */
9338 for (i = NUM_ELEM (version_info); i--;)
9339 version_info[i] = 0;
9341 for (i = NUM_ELEM (dynamic_info); i--;)
9342 dynamic_info[i] = 0;
9344 /* Process the file. */
9346 printf (_("\nFile: %s\n"), file_name);
9348 if (! process_file_header ())
9354 process_section_headers (file);
9356 process_program_headers (file);
9358 process_dynamic_segment (file);
9360 process_relocs (file);
9362 process_unwind (file);
9364 process_symbol_table (file);
9366 process_syminfo (file);
9368 process_version_sections (file);
9370 process_section_contents (file);
9372 process_corefile_contents (file);
9374 process_arch_specific (file);
9378 if (section_headers)
9380 free (section_headers);
9381 section_headers = NULL;
9386 free (string_table);
9387 string_table = NULL;
9388 string_table_length = 0;
9391 if (dynamic_strings)
9393 free (dynamic_strings);
9394 dynamic_strings = NULL;
9397 if (dynamic_symbols)
9399 free (dynamic_symbols);
9400 dynamic_symbols = NULL;
9401 num_dynamic_syms = 0;
9404 if (dynamic_syminfo)
9406 free (dynamic_syminfo);
9407 dynamic_syminfo = NULL;
9413 #ifdef SUPPORT_DISASSEMBLY
9414 /* Needed by the i386 disassembler. For extra credit, someone could
9415 fix this so that we insert symbolic addresses here, esp for GOT/PLT
9419 print_address (unsigned int addr, FILE * outfile)
9421 fprintf (outfile,"0x%8.8x", addr);
9424 /* Needed by the i386 disassembler. */
9426 db_task_printsym (unsigned int addr)
9428 print_address (addr, stderr);
9432 int main PARAMS ((int, char **));
9441 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9442 setlocale (LC_MESSAGES, "");
9444 #if defined (HAVE_SETLOCALE)
9445 setlocale (LC_CTYPE, "");
9447 bindtextdomain (PACKAGE, LOCALEDIR);
9448 textdomain (PACKAGE);
9450 parse_args (argc, argv);
9452 if (optind < (argc - 1))
9456 while (optind < argc)
9457 err |= process_file (argv [optind ++]);
9459 if (dump_sects != NULL)