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;
112 int do_using_dynamic;
120 int do_debug_abbrevs;
122 int do_debug_pubnames;
123 int do_debug_aranges;
125 int do_debug_frames_interp;
126 int do_debug_macinfo;
132 /* A dynamic array of flags indicating which sections require dumping. */
133 char * dump_sects = NULL;
134 unsigned int num_dump_sects = 0;
136 #define HEX_DUMP (1 << 0)
137 #define DISASS_DUMP (1 << 1)
138 #define DEBUG_DUMP (1 << 2)
140 /* How to rpint a vma value. */
141 typedef enum print_mode
153 /* Forward declarations for dumb compilers. */
154 static void print_vma PARAMS ((bfd_vma, print_mode));
155 static bfd_vma (* byte_get) PARAMS ((unsigned char *, int));
156 static bfd_vma byte_get_little_endian PARAMS ((unsigned char *, int));
157 static bfd_vma byte_get_big_endian PARAMS ((unsigned char *, int));
158 static const char * get_mips_dynamic_type PARAMS ((unsigned long));
159 static const char * get_sparc64_dynamic_type PARAMS ((unsigned long));
160 static const char * get_parisc_dynamic_type PARAMS ((unsigned long));
161 static const char * get_dynamic_type PARAMS ((unsigned long));
162 static int slurp_rela_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **, unsigned long *));
163 static int slurp_rel_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rel **, unsigned long *));
164 static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
165 static char * get_file_type PARAMS ((unsigned));
166 static char * get_machine_name PARAMS ((unsigned));
167 static void decode_ARM_machine_flags PARAMS ((unsigned, char []));
168 static char * get_machine_flags PARAMS ((unsigned, unsigned));
169 static const char * get_mips_segment_type PARAMS ((unsigned long));
170 static const char * get_parisc_segment_type PARAMS ((unsigned long));
171 static const char * get_ia64_segment_type PARAMS ((unsigned long));
172 static const char * get_segment_type PARAMS ((unsigned long));
173 static const char * get_mips_section_type_name PARAMS ((unsigned int));
174 static const char * get_parisc_section_type_name PARAMS ((unsigned int));
175 static const char * get_ia64_section_type_name PARAMS ((unsigned int));
176 static const char * get_section_type_name PARAMS ((unsigned int));
177 static const char * get_symbol_binding PARAMS ((unsigned int));
178 static const char * get_symbol_type PARAMS ((unsigned int));
179 static const char * get_symbol_visibility PARAMS ((unsigned int));
180 static const char * get_symbol_index_type PARAMS ((unsigned int));
181 static const char * get_dynamic_flags PARAMS ((bfd_vma));
182 static void usage PARAMS ((void));
183 static void parse_args PARAMS ((int, char **));
184 static int process_file_header PARAMS ((void));
185 static int process_program_headers PARAMS ((FILE *));
186 static int process_section_headers PARAMS ((FILE *));
187 static int process_unwind PARAMS ((FILE *));
188 static void dynamic_segment_mips_val PARAMS ((Elf_Internal_Dyn *));
189 static void dynamic_segment_parisc_val PARAMS ((Elf_Internal_Dyn *));
190 static int process_dynamic_segment PARAMS ((FILE *));
191 static int process_symbol_table PARAMS ((FILE *));
192 static int process_syminfo PARAMS ((FILE *));
193 static int process_section_contents PARAMS ((FILE *));
194 static void process_mips_fpe_exception PARAMS ((int));
195 static int process_mips_specific PARAMS ((FILE *));
196 static int process_file PARAMS ((char *));
197 static int process_relocs PARAMS ((FILE *));
198 static int process_version_sections PARAMS ((FILE *));
199 static char * get_ver_flags PARAMS ((unsigned int));
200 static int get_32bit_section_headers PARAMS ((FILE *, unsigned int));
201 static int get_64bit_section_headers PARAMS ((FILE *, unsigned int));
202 static int get_32bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
203 static int get_64bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
204 static int get_file_header PARAMS ((FILE *));
205 static Elf_Internal_Sym * get_32bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
206 static Elf_Internal_Sym * get_64bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long));
207 static const char * get_elf_section_flags PARAMS ((bfd_vma));
208 static int * get_dynamic_data PARAMS ((FILE *, unsigned int));
209 static int get_32bit_dynamic_segment PARAMS ((FILE *));
210 static int get_64bit_dynamic_segment PARAMS ((FILE *));
211 #ifdef SUPPORT_DISASSEMBLY
212 static int disassemble_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
214 static int dump_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
215 static int display_debug_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
216 static int display_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
217 static int display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
218 static int prescan_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
219 static int display_debug_lines PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
220 static int display_debug_pubnames PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
221 static int display_debug_abbrev PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
222 static int display_debug_aranges PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
223 static int display_debug_frames PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
224 static int display_debug_macinfo PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
225 static int display_debug_str PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
226 static unsigned char * process_abbrev_section PARAMS ((unsigned char *, unsigned char *));
227 static void load_debug_str PARAMS ((FILE *));
228 static void free_debug_str PARAMS ((void));
229 static const char * fetch_indirect_string PARAMS ((unsigned long));
230 static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int));
231 static int process_extended_line_op PARAMS ((unsigned char *, int, int));
232 static void reset_state_machine PARAMS ((int));
233 static char * get_TAG_name PARAMS ((unsigned long));
234 static char * get_AT_name PARAMS ((unsigned long));
235 static char * get_FORM_name PARAMS ((unsigned long));
236 static void free_abbrevs PARAMS ((void));
237 static void add_abbrev PARAMS ((unsigned long, unsigned long, int));
238 static void add_abbrev_attr PARAMS ((unsigned long, unsigned long));
239 static unsigned char * read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
240 static unsigned char * read_and_display_attr_value PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
241 static unsigned char * display_block PARAMS ((unsigned char *, unsigned long));
242 static void decode_location_expression PARAMS ((unsigned char *, unsigned int, unsigned long));
243 static void request_dump PARAMS ((unsigned int, int));
244 static const char * get_elf_class PARAMS ((unsigned int));
245 static const char * get_data_encoding PARAMS ((unsigned int));
246 static const char * get_osabi_name PARAMS ((unsigned int));
247 static int guess_is_rela PARAMS ((unsigned long));
248 static char * get_note_type PARAMS ((unsigned int));
249 static int process_note PARAMS ((Elf32_Internal_Note *));
250 static int process_corefile_note_segment PARAMS ((FILE *, bfd_vma, bfd_vma));
251 static int process_corefile_note_segments PARAMS ((FILE *));
252 static int process_corefile_contents PARAMS ((FILE *));
253 static int process_arch_specific PARAMS ((FILE *));
255 typedef int Elf32_Word;
263 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
264 ((X)->sh_name >= string_table_length \
265 ? "<corrupt>" : string_table + (X)->sh_name))
267 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
269 #define BYTE_GET(field) byte_get (field, sizeof (field))
271 /* If we can support a 64 bit data type then BFD64 should be defined
272 and sizeof (bfd_vma) == 8. In this case when translating from an
273 external 8 byte field to an internal field, we can assume that the
274 internal field is also 8 bytes wide and so we can extract all the data.
275 If, however, BFD64 is not defined, then we must assume that the
276 internal data structure only has 4 byte wide fields that are the
277 equivalent of the 8 byte wide external counterparts, and so we must
278 truncate the data. */
280 #define BYTE_GET8(field) byte_get (field, -8)
282 #define BYTE_GET8(field) byte_get (field, 8)
285 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
287 #define GET_ELF_SYMBOLS(file, offset, size) \
288 (is_32bit_elf ? get_32bit_elf_symbols (file, offset, size) \
289 : get_64bit_elf_symbols (file, offset, size))
293 error VPARAMS ((const char *message, ...))
295 VA_OPEN (args, message);
296 VA_FIXEDARG (args, const char *, message);
298 fprintf (stderr, _("%s: Error: "), program_name);
299 vfprintf (stderr, message, args);
304 warn VPARAMS ((const char *message, ...))
306 VA_OPEN (args, message);
307 VA_FIXEDARG (args, const char *, message);
309 fprintf (stderr, _("%s: Warning: "), program_name);
310 vfprintf (stderr, message, args);
314 static PTR get_data PARAMS ((PTR, FILE *, long, size_t, const char *));
317 get_data (var, file, offset, size, reason)
329 if (fseek (file, offset, SEEK_SET))
331 error (_("Unable to seek to %x for %s\n"), offset, reason);
338 mvar = (PTR) malloc (size);
342 error (_("Out of memory allocating %d bytes for %s\n"),
348 if (fread (mvar, size, 1, file) != 1)
350 error (_("Unable to read in %d bytes of %s\n"), size, reason);
360 byte_get_little_endian (field, size)
361 unsigned char * field;
370 return ((unsigned int) (field [0]))
371 | (((unsigned int) (field [1])) << 8);
375 /* We want to extract data from an 8 byte wide field and
376 place it into a 4 byte wide field. Since this is a little
377 endian source we can juts use the 4 byte extraction code. */
381 return ((unsigned long) (field [0]))
382 | (((unsigned long) (field [1])) << 8)
383 | (((unsigned long) (field [2])) << 16)
384 | (((unsigned long) (field [3])) << 24);
389 /* This is a special case, generated by the BYTE_GET8 macro.
390 It means that we are loading an 8 byte value from a field
391 in an external structure into an 8 byte value in a field
392 in an internal strcuture. */
393 return ((bfd_vma) (field [0]))
394 | (((bfd_vma) (field [1])) << 8)
395 | (((bfd_vma) (field [2])) << 16)
396 | (((bfd_vma) (field [3])) << 24)
397 | (((bfd_vma) (field [4])) << 32)
398 | (((bfd_vma) (field [5])) << 40)
399 | (((bfd_vma) (field [6])) << 48)
400 | (((bfd_vma) (field [7])) << 56);
403 error (_("Unhandled data length: %d\n"), size);
408 /* Print a VMA value. */
410 print_vma (vma, mode)
420 case FULL_HEX: printf ("0x"); /* drop through */
421 case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
422 case PREFIX_HEX: printf ("0x"); /* drop through */
423 case HEX: printf ("%lx", (unsigned long) vma); break;
424 case DEC: printf ("%ld", (unsigned long) vma); break;
425 case DEC_5: printf ("%5ld", (long) vma); break;
426 case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
447 #if BFD_HOST_64BIT_LONG
450 if (_bfd_int64_high (vma))
451 printf ("%lx%8.8lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
453 printf ("%lx", _bfd_int64_low (vma));
458 #if BFD_HOST_64BIT_LONG
461 if (_bfd_int64_high (vma))
463 printf ("++%ld", _bfd_int64_low (vma));
465 printf ("%ld", _bfd_int64_low (vma));
470 #if BFD_HOST_64BIT_LONG
471 printf ("%5ld", vma);
473 if (_bfd_int64_high (vma))
475 printf ("++%ld", _bfd_int64_low (vma));
477 printf ("%5ld", _bfd_int64_low (vma));
482 #if BFD_HOST_64BIT_LONG
485 if (_bfd_int64_high (vma))
487 printf ("++%lu", _bfd_int64_low (vma));
489 printf ("%lu", _bfd_int64_low (vma));
498 byte_get_big_endian (field, size)
499 unsigned char * field;
508 return ((unsigned int) (field [1])) | (((int) (field [0])) << 8);
511 return ((unsigned long) (field [3]))
512 | (((unsigned long) (field [2])) << 8)
513 | (((unsigned long) (field [1])) << 16)
514 | (((unsigned long) (field [0])) << 24);
518 /* Although we are extracing data from an 8 byte wide field, we
519 are returning only 4 bytes of data. */
520 return ((unsigned long) (field [7]))
521 | (((unsigned long) (field [6])) << 8)
522 | (((unsigned long) (field [5])) << 16)
523 | (((unsigned long) (field [4])) << 24);
527 /* This is a special case, generated by the BYTE_GET8 macro.
528 It means that we are loading an 8 byte value from a field
529 in an external structure into an 8 byte value in a field
530 in an internal strcuture. */
531 return ((bfd_vma) (field [7]))
532 | (((bfd_vma) (field [6])) << 8)
533 | (((bfd_vma) (field [5])) << 16)
534 | (((bfd_vma) (field [4])) << 24)
535 | (((bfd_vma) (field [3])) << 32)
536 | (((bfd_vma) (field [2])) << 40)
537 | (((bfd_vma) (field [1])) << 48)
538 | (((bfd_vma) (field [0])) << 56);
542 error (_("Unhandled data length: %d\n"), size);
547 /* Guess the relocation size commonly used by the specific machines. */
550 guess_is_rela (e_machine)
551 unsigned long e_machine;
555 /* Targets that use REL relocations. */
568 /* Targets that use RELA relocations. */
582 case EM_CYGNUS_MN10200:
584 case EM_CYGNUS_MN10300:
621 warn (_("Don't know about relocations on this machine architecture\n"));
627 slurp_rela_relocs (file, rel_offset, rel_size, relasp, nrelasp)
629 unsigned long rel_offset;
630 unsigned long rel_size;
631 Elf_Internal_Rela **relasp;
632 unsigned long *nrelasp;
634 Elf_Internal_Rela *relas;
635 unsigned long nrelas;
640 Elf32_External_Rela * erelas;
642 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset,
643 rel_size, _("relocs"));
647 nrelas = rel_size / sizeof (Elf32_External_Rela);
649 relas = (Elf_Internal_Rela *)
650 malloc (nrelas * sizeof (Elf_Internal_Rela));
654 error(_("out of memory parsing relocs"));
658 for (i = 0; i < nrelas; i++)
660 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
661 relas[i].r_info = BYTE_GET (erelas[i].r_info);
662 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
669 Elf64_External_Rela * erelas;
671 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset,
672 rel_size, _("relocs"));
676 nrelas = rel_size / sizeof (Elf64_External_Rela);
678 relas = (Elf_Internal_Rela *)
679 malloc (nrelas * sizeof (Elf_Internal_Rela));
683 error(_("out of memory parsing relocs"));
687 for (i = 0; i < nrelas; i++)
689 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
690 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
691 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
702 slurp_rel_relocs (file, rel_offset, rel_size, relsp, nrelsp)
704 unsigned long rel_offset;
705 unsigned long rel_size;
706 Elf_Internal_Rel **relsp;
707 unsigned long *nrelsp;
709 Elf_Internal_Rel *rels;
715 Elf32_External_Rel * erels;
717 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset,
718 rel_size, _("relocs"));
722 nrels = rel_size / sizeof (Elf32_External_Rel);
724 rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
728 error(_("out of memory parsing relocs"));
732 for (i = 0; i < nrels; i++)
734 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
735 rels[i].r_info = BYTE_GET (erels[i].r_info);
742 Elf64_External_Rel * erels;
744 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset,
745 rel_size, _("relocs"));
749 nrels = rel_size / sizeof (Elf64_External_Rel);
751 rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
755 error(_("out of memory parsing relocs"));
759 for (i = 0; i < nrels; i++)
761 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
762 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
772 /* Display the contents of the relocation data found at the specified offset. */
774 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
776 unsigned long rel_offset;
777 unsigned long rel_size;
778 Elf_Internal_Sym * symtab;
784 Elf_Internal_Rel * rels;
785 Elf_Internal_Rela * relas;
788 if (is_rela == UNKNOWN)
789 is_rela = guess_is_rela (elf_header.e_machine);
793 if (!slurp_rela_relocs (file, rel_offset, rel_size, &relas, &rel_size))
798 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
806 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
809 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
815 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
818 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
821 for (i = 0; i < rel_size; i++)
826 bfd_vma symtab_index;
831 offset = relas [i].r_offset;
832 info = relas [i].r_info;
836 offset = rels [i].r_offset;
837 info = rels [i].r_info;
842 type = ELF32_R_TYPE (info);
843 symtab_index = ELF32_R_SYM (info);
847 if (elf_header.e_machine == EM_SPARCV9)
848 type = ELF64_R_TYPE_ID (info);
850 type = ELF64_R_TYPE (info);
851 /* The #ifdef BFD64 below is to prevent a compile time warning.
852 We know that if we do not have a 64 bit data type that we
853 will never execute this code anyway. */
855 symtab_index = ELF64_R_SYM (info);
861 #ifdef _bfd_int64_low
862 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
864 printf ("%8.8lx %8.8lx ", offset, info);
869 #ifdef _bfd_int64_low
870 printf ("%8.8lx%8.8lx %8.8lx%8.8lx ",
871 _bfd_int64_high (offset),
872 _bfd_int64_low (offset),
873 _bfd_int64_high (info),
874 _bfd_int64_low (info));
876 printf ("%16.16lx %16.16lx ", offset, info);
880 switch (elf_header.e_machine)
888 rtype = elf_m32r_reloc_type (type);
893 rtype = elf_i386_reloc_type (type);
897 rtype = elf_m68k_reloc_type (type);
901 rtype = elf_i960_reloc_type (type);
906 rtype = elf_avr_reloc_type (type);
913 rtype = elf_sparc_reloc_type (type);
918 rtype = v850_reloc_type (type);
923 rtype = elf_d10v_reloc_type (type);
928 rtype = elf_d30v_reloc_type (type);
932 rtype = elf_sh_reloc_type (type);
936 case EM_CYGNUS_MN10300:
937 rtype = elf_mn10300_reloc_type (type);
941 case EM_CYGNUS_MN10200:
942 rtype = elf_mn10200_reloc_type (type);
947 rtype = elf_fr30_reloc_type (type);
951 rtype = elf_mcore_reloc_type (type);
955 rtype = elf_mmix_reloc_type (type);
960 rtype = elf_ppc_reloc_type (type);
965 rtype = elf_mips_reloc_type (type);
969 rtype = elf_alpha_reloc_type (type);
973 rtype = elf_arm_reloc_type (type);
977 rtype = elf_arc_reloc_type (type);
981 rtype = elf_hppa_reloc_type (type);
987 rtype = elf_h8_reloc_type (type);
992 rtype = elf_pj_reloc_type (type);
995 rtype = elf_ia64_reloc_type (type);
999 rtype = elf_cris_reloc_type (type);
1003 rtype = elf_i860_reloc_type (type);
1007 rtype = elf_x86_64_reloc_type (type);
1012 rtype = elf_s390_reloc_type (type);
1016 rtype = elf_xstormy16_reloc_type (type);
1021 #ifdef _bfd_int64_low
1022 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type));
1024 printf (_("unrecognised: %-7lx"), type);
1027 printf ("%-21.21s", rtype);
1031 if (symtab == NULL || symtab_index >= nsyms)
1032 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
1035 Elf_Internal_Sym * psym;
1037 psym = symtab + symtab_index;
1040 print_vma (psym->st_value, LONG_HEX);
1043 if (psym->st_name == 0)
1045 SECTION_NAME (section_headers + psym->st_shndx));
1046 else if (strtab == NULL)
1047 printf (_("<string table index %3ld>"), psym->st_name);
1049 printf ("%-25.25s", strtab + psym->st_name);
1052 printf (" + %lx", (unsigned long) relas [i].r_addend);
1057 printf ("%*c", is_32bit_elf ? 34 : 26, ' ');
1058 print_vma (relas[i].r_addend, LONG_HEX);
1061 if (elf_header.e_machine == EM_SPARCV9
1062 && !strcmp (rtype, "R_SPARC_OLO10"))
1063 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1077 get_mips_dynamic_type (type)
1082 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1083 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1084 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1085 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1086 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1087 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1088 case DT_MIPS_MSYM: return "MIPS_MSYM";
1089 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1090 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1091 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1092 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1093 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1094 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1095 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1096 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1097 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1098 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1099 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1100 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1101 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1102 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1103 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1104 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1105 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1106 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1107 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1108 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1109 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1110 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1111 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1112 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1113 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1114 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1115 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1116 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1117 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1118 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1119 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1120 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1121 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1122 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1123 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1124 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1131 get_sparc64_dynamic_type (type)
1136 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1143 get_parisc_dynamic_type (type)
1148 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1149 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1150 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1151 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1152 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1153 case DT_HP_PREINIT: return "HP_PREINIT";
1154 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1155 case DT_HP_NEEDED: return "HP_NEEDED";
1156 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1157 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1158 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1159 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1160 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1167 get_dynamic_type (type)
1170 static char buff [32];
1174 case DT_NULL: return "NULL";
1175 case DT_NEEDED: return "NEEDED";
1176 case DT_PLTRELSZ: return "PLTRELSZ";
1177 case DT_PLTGOT: return "PLTGOT";
1178 case DT_HASH: return "HASH";
1179 case DT_STRTAB: return "STRTAB";
1180 case DT_SYMTAB: return "SYMTAB";
1181 case DT_RELA: return "RELA";
1182 case DT_RELASZ: return "RELASZ";
1183 case DT_RELAENT: return "RELAENT";
1184 case DT_STRSZ: return "STRSZ";
1185 case DT_SYMENT: return "SYMENT";
1186 case DT_INIT: return "INIT";
1187 case DT_FINI: return "FINI";
1188 case DT_SONAME: return "SONAME";
1189 case DT_RPATH: return "RPATH";
1190 case DT_SYMBOLIC: return "SYMBOLIC";
1191 case DT_REL: return "REL";
1192 case DT_RELSZ: return "RELSZ";
1193 case DT_RELENT: return "RELENT";
1194 case DT_PLTREL: return "PLTREL";
1195 case DT_DEBUG: return "DEBUG";
1196 case DT_TEXTREL: return "TEXTREL";
1197 case DT_JMPREL: return "JMPREL";
1198 case DT_BIND_NOW: return "BIND_NOW";
1199 case DT_INIT_ARRAY: return "INIT_ARRAY";
1200 case DT_FINI_ARRAY: return "FINI_ARRAY";
1201 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1202 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1203 case DT_RUNPATH: return "RUNPATH";
1204 case DT_FLAGS: return "FLAGS";
1206 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1207 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1209 case DT_CHECKSUM: return "CHECKSUM";
1210 case DT_PLTPADSZ: return "PLTPADSZ";
1211 case DT_MOVEENT: return "MOVEENT";
1212 case DT_MOVESZ: return "MOVESZ";
1213 case DT_FEATURE: return "FEATURE";
1214 case DT_POSFLAG_1: return "POSFLAG_1";
1215 case DT_SYMINSZ: return "SYMINSZ";
1216 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1218 case DT_ADDRRNGLO: return "ADDRRNGLO";
1219 case DT_CONFIG: return "CONFIG";
1220 case DT_DEPAUDIT: return "DEPAUDIT";
1221 case DT_AUDIT: return "AUDIT";
1222 case DT_PLTPAD: return "PLTPAD";
1223 case DT_MOVETAB: return "MOVETAB";
1224 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1226 case DT_VERSYM: return "VERSYM";
1228 case DT_RELACOUNT: return "RELACOUNT";
1229 case DT_RELCOUNT: return "RELCOUNT";
1230 case DT_FLAGS_1: return "FLAGS_1";
1231 case DT_VERDEF: return "VERDEF";
1232 case DT_VERDEFNUM: return "VERDEFNUM";
1233 case DT_VERNEED: return "VERNEED";
1234 case DT_VERNEEDNUM: return "VERNEEDNUM";
1236 case DT_AUXILIARY: return "AUXILIARY";
1237 case DT_USED: return "USED";
1238 case DT_FILTER: return "FILTER";
1241 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1243 const char * result;
1245 switch (elf_header.e_machine)
1248 case EM_MIPS_RS3_LE:
1249 result = get_mips_dynamic_type (type);
1252 result = get_sparc64_dynamic_type (type);
1262 sprintf (buff, _("Processor Specific: %lx"), type);
1264 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1266 const char * result;
1268 switch (elf_header.e_machine)
1271 result = get_parisc_dynamic_type (type);
1281 sprintf (buff, _("Operating System specific: %lx"), type);
1284 sprintf (buff, _("<unknown>: %lx"), type);
1291 get_file_type (e_type)
1294 static char buff [32];
1298 case ET_NONE: return _("NONE (None)");
1299 case ET_REL: return _("REL (Relocatable file)");
1300 case ET_EXEC: return _("EXEC (Executable file)");
1301 case ET_DYN: return _("DYN (Shared object file)");
1302 case ET_CORE: return _("CORE (Core file)");
1305 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1306 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1307 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1308 sprintf (buff, _("OS Specific: (%x)"), e_type);
1310 sprintf (buff, _("<unknown>: %x"), e_type);
1316 get_machine_name (e_machine)
1319 static char buff [64]; /* XXX */
1323 case EM_NONE: return _("None");
1324 case EM_M32: return "WE32100";
1325 case EM_SPARC: return "Sparc";
1326 case EM_386: return "Intel 80386";
1327 case EM_68K: return "MC68000";
1328 case EM_88K: return "MC88000";
1329 case EM_486: return "Intel 80486";
1330 case EM_860: return "Intel 80860";
1331 case EM_MIPS: return "MIPS R3000";
1332 case EM_S370: return "IBM System/370";
1333 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1334 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1335 case EM_PARISC: return "HPPA";
1336 case EM_PPC_OLD: return "Power PC (old)";
1337 case EM_SPARC32PLUS: return "Sparc v8+" ;
1338 case EM_960: return "Intel 90860";
1339 case EM_PPC: return "PowerPC";
1340 case EM_V800: return "NEC V800";
1341 case EM_FR20: return "Fujitsu FR20";
1342 case EM_RH32: return "TRW RH32";
1343 case EM_MCORE: return "MCORE";
1344 case EM_ARM: return "ARM";
1345 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1346 case EM_SH: return "Hitachi SH";
1347 case EM_SPARCV9: return "Sparc v9";
1348 case EM_TRICORE: return "Siemens Tricore";
1349 case EM_ARC: return "ARC";
1350 case EM_H8_300: return "Hitachi H8/300";
1351 case EM_H8_300H: return "Hitachi H8/300H";
1352 case EM_H8S: return "Hitachi H8S";
1353 case EM_H8_500: return "Hitachi H8/500";
1354 case EM_IA_64: return "Intel IA-64";
1355 case EM_MIPS_X: return "Stanford MIPS-X";
1356 case EM_COLDFIRE: return "Motorola Coldfire";
1357 case EM_68HC12: return "Motorola M68HC12";
1358 case EM_ALPHA: return "Alpha";
1359 case EM_CYGNUS_D10V:
1360 case EM_D10V: return "d10v";
1361 case EM_CYGNUS_D30V:
1362 case EM_D30V: return "d30v";
1363 case EM_CYGNUS_M32R:
1364 case EM_M32R: return "Mitsubishi M32r";
1365 case EM_CYGNUS_V850:
1366 case EM_V850: return "NEC v850";
1367 case EM_CYGNUS_MN10300:
1368 case EM_MN10300: return "mn10300";
1369 case EM_CYGNUS_MN10200:
1370 case EM_MN10200: return "mn10200";
1371 case EM_CYGNUS_FR30:
1372 case EM_FR30: return "Fujitsu FR30";
1374 case EM_PJ: return "picoJava";
1375 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1376 case EM_PCP: return "Siemens PCP";
1377 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1378 case EM_NDR1: return "Denso NDR1 microprocesspr";
1379 case EM_STARCORE: return "Motorola Star*Core processor";
1380 case EM_ME16: return "Toyota ME16 processor";
1381 case EM_ST100: return "STMicroelectronics ST100 processor";
1382 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1383 case EM_FX66: return "Siemens FX66 microcontroller";
1384 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1385 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1386 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1387 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1388 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1389 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1390 case EM_SVX: return "Silicon Graphics SVx";
1391 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1392 case EM_VAX: return "Digital VAX";
1394 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1395 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1396 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1397 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1398 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1399 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1400 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1401 case EM_PRISM: return "SiTera Prism";
1402 case EM_X86_64: return "Advanced Micro Devices X86-64";
1404 case EM_S390: return "IBM S/390";
1405 case EM_XSTORMY16: return "Sanyo Xstormy16 CPU core";
1407 sprintf (buff, _("<unknown>: %x"), e_machine);
1413 decode_ARM_machine_flags (e_flags, buf)
1420 eabi = EF_ARM_EABI_VERSION (e_flags);
1421 e_flags &= ~ EF_ARM_EABIMASK;
1423 /* Handle "generic" ARM flags. */
1424 if (e_flags & EF_ARM_RELEXEC)
1426 strcat (buf, ", relocatable executable");
1427 e_flags &= ~ EF_ARM_RELEXEC;
1430 if (e_flags & EF_ARM_HASENTRY)
1432 strcat (buf, ", has entry point");
1433 e_flags &= ~ EF_ARM_HASENTRY;
1436 /* Now handle EABI specific flags. */
1440 strcat (buf, ", <unrecognised EABI>");
1445 case EF_ARM_EABI_VER1:
1446 strcat (buf, ", Version1 EABI");
1451 /* Process flags one bit at a time. */
1452 flag = e_flags & - e_flags;
1457 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1458 strcat (buf, ", sorted symbol tables");
1468 case EF_ARM_EABI_VER2:
1469 strcat (buf, ", Version2 EABI");
1474 /* Process flags one bit at a time. */
1475 flag = e_flags & - e_flags;
1480 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1481 strcat (buf, ", sorted symbol tables");
1484 case EF_ARM_DYNSYMSUSESEGIDX:
1485 strcat (buf, ", dynamic symbols use segment index");
1488 case EF_ARM_MAPSYMSFIRST:
1489 strcat (buf, ", mapping symbols precede others");
1499 case EF_ARM_EABI_UNKNOWN:
1500 strcat (buf, ", GNU EABI");
1505 /* Process flags one bit at a time. */
1506 flag = e_flags & - e_flags;
1511 case EF_ARM_INTERWORK:
1512 strcat (buf, ", interworking enabled");
1515 case EF_ARM_APCS_26:
1516 strcat (buf, ", uses APCS/26");
1519 case EF_ARM_APCS_FLOAT:
1520 strcat (buf, ", uses APCS/float");
1524 strcat (buf, ", position independent");
1528 strcat (buf, ", 8 bit structure alignment");
1531 case EF_ARM_NEW_ABI:
1532 strcat (buf, ", uses new ABI");
1535 case EF_ARM_OLD_ABI:
1536 strcat (buf, ", uses old ABI");
1539 case EF_ARM_SOFT_FLOAT:
1540 strcat (buf, ", software FP");
1551 strcat (buf,", <unknown>");
1555 get_machine_flags (e_flags, e_machine)
1559 static char buf [1024];
1571 decode_ARM_machine_flags (e_flags, buf);
1575 if (e_flags & EF_CPU32)
1576 strcat (buf, ", cpu32");
1580 if (e_flags & EF_PPC_EMB)
1581 strcat (buf, ", emb");
1583 if (e_flags & EF_PPC_RELOCATABLE)
1584 strcat (buf, ", relocatable");
1586 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1587 strcat (buf, ", relocatable-lib");
1591 case EM_CYGNUS_V850:
1592 switch (e_flags & EF_V850_ARCH)
1595 strcat (buf, ", v850e");
1598 strcat (buf, ", v850ea");
1601 strcat (buf, ", v850");
1604 strcat (buf, ", unknown v850 architecture variant");
1610 case EM_CYGNUS_M32R:
1611 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1612 strcat (buf, ", m32r");
1617 case EM_MIPS_RS3_LE:
1618 if (e_flags & EF_MIPS_NOREORDER)
1619 strcat (buf, ", noreorder");
1621 if (e_flags & EF_MIPS_PIC)
1622 strcat (buf, ", pic");
1624 if (e_flags & EF_MIPS_CPIC)
1625 strcat (buf, ", cpic");
1627 if (e_flags & EF_MIPS_UCODE)
1628 strcat (buf, ", ugen_reserved");
1630 if (e_flags & EF_MIPS_ABI2)
1631 strcat (buf, ", abi2");
1633 if (e_flags & EF_MIPS_32BITMODE)
1634 strcat (buf, ", 32bitmode");
1636 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
1637 strcat (buf, ", mips1");
1639 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
1640 strcat (buf, ", mips2");
1642 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
1643 strcat (buf, ", mips3");
1645 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
1646 strcat (buf, ", mips4");
1648 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_5)
1649 strcat (buf, ", mips5");
1651 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32)
1652 strcat (buf, ", mips32");
1654 if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64)
1655 strcat (buf, ", mips64");
1657 switch ((e_flags & EF_MIPS_MACH))
1659 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
1660 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
1661 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
1662 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
1663 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
1664 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
1665 default: strcat (buf, " UNKNOWN"); break;
1670 if (e_flags & EF_SPARC_32PLUS)
1671 strcat (buf, ", v8+");
1673 if (e_flags & EF_SPARC_SUN_US1)
1674 strcat (buf, ", ultrasparcI");
1676 if (e_flags & EF_SPARC_SUN_US3)
1677 strcat (buf, ", ultrasparcIII");
1679 if (e_flags & EF_SPARC_HAL_R1)
1680 strcat (buf, ", halr1");
1682 if (e_flags & EF_SPARC_LEDATA)
1683 strcat (buf, ", ledata");
1685 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
1686 strcat (buf, ", tso");
1688 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
1689 strcat (buf, ", pso");
1691 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
1692 strcat (buf, ", rmo");
1696 switch (e_flags & EF_PARISC_ARCH)
1698 case EFA_PARISC_1_0:
1699 strcpy (buf, ", PA-RISC 1.0");
1701 case EFA_PARISC_1_1:
1702 strcpy (buf, ", PA-RISC 1.1");
1704 case EFA_PARISC_2_0:
1705 strcpy (buf, ", PA-RISC 2.0");
1710 if (e_flags & EF_PARISC_TRAPNIL)
1711 strcat (buf, ", trapnil");
1712 if (e_flags & EF_PARISC_EXT)
1713 strcat (buf, ", ext");
1714 if (e_flags & EF_PARISC_LSB)
1715 strcat (buf, ", lsb");
1716 if (e_flags & EF_PARISC_WIDE)
1717 strcat (buf, ", wide");
1718 if (e_flags & EF_PARISC_NO_KABP)
1719 strcat (buf, ", no kabp");
1720 if (e_flags & EF_PARISC_LAZYSWAP)
1721 strcat (buf, ", lazyswap");
1726 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
1727 strcat (buf, ", new calling convention");
1729 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
1730 strcat (buf, ", gnu calling convention");
1734 if ((e_flags & EF_IA_64_ABI64))
1735 strcat (buf, ", 64-bit");
1737 strcat (buf, ", 32-bit");
1738 if ((e_flags & EF_IA_64_REDUCEDFP))
1739 strcat (buf, ", reduced fp model");
1740 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
1741 strcat (buf, ", no function descriptors, constant gp");
1742 else if ((e_flags & EF_IA_64_CONS_GP))
1743 strcat (buf, ", constant gp");
1744 if ((e_flags & EF_IA_64_ABSOLUTE))
1745 strcat (buf, ", absolute");
1754 get_mips_segment_type (type)
1759 case PT_MIPS_REGINFO:
1761 case PT_MIPS_RTPROC:
1763 case PT_MIPS_OPTIONS:
1773 get_parisc_segment_type (type)
1778 case PT_HP_TLS: return "HP_TLS";
1779 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
1780 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
1781 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
1782 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
1783 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
1784 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
1785 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
1786 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
1787 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
1788 case PT_HP_PARALLEL: return "HP_PARALLEL";
1789 case PT_HP_FASTBIND: return "HP_FASTBIND";
1790 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
1791 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
1800 get_ia64_segment_type (type)
1805 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
1806 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
1815 get_segment_type (p_type)
1816 unsigned long p_type;
1818 static char buff [32];
1822 case PT_NULL: return "NULL";
1823 case PT_LOAD: return "LOAD";
1824 case PT_DYNAMIC: return "DYNAMIC";
1825 case PT_INTERP: return "INTERP";
1826 case PT_NOTE: return "NOTE";
1827 case PT_SHLIB: return "SHLIB";
1828 case PT_PHDR: return "PHDR";
1830 case PT_GNU_EH_FRAME:
1831 return "GNU_EH_FRAME";
1834 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
1836 const char * result;
1838 switch (elf_header.e_machine)
1841 case EM_MIPS_RS3_LE:
1842 result = get_mips_segment_type (p_type);
1845 result = get_parisc_segment_type (p_type);
1848 result = get_ia64_segment_type (p_type);
1858 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
1860 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
1862 const char * result;
1864 switch (elf_header.e_machine)
1867 result = get_parisc_segment_type (p_type);
1877 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
1880 sprintf (buff, _("<unknown>: %lx"), p_type);
1887 get_mips_section_type_name (sh_type)
1888 unsigned int sh_type;
1892 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1893 case SHT_MIPS_MSYM: return "MIPS_MSYM";
1894 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1895 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
1896 case SHT_MIPS_UCODE: return "MIPS_UCODE";
1897 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
1898 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
1899 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
1900 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
1901 case SHT_MIPS_RELD: return "MIPS_RELD";
1902 case SHT_MIPS_IFACE: return "MIPS_IFACE";
1903 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
1904 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1905 case SHT_MIPS_SHDR: return "MIPS_SHDR";
1906 case SHT_MIPS_FDESC: return "MIPS_FDESC";
1907 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
1908 case SHT_MIPS_DENSE: return "MIPS_DENSE";
1909 case SHT_MIPS_PDESC: return "MIPS_PDESC";
1910 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
1911 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
1912 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
1913 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
1914 case SHT_MIPS_LINE: return "MIPS_LINE";
1915 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
1916 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
1917 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
1918 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
1919 case SHT_MIPS_DWARF: return "MIPS_DWARF";
1920 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
1921 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1922 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
1923 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
1924 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
1925 case SHT_MIPS_XLATE: return "MIPS_XLATE";
1926 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
1927 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
1928 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
1929 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
1930 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
1938 get_parisc_section_type_name (sh_type)
1939 unsigned int sh_type;
1943 case SHT_PARISC_EXT: return "PARISC_EXT";
1944 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
1945 case SHT_PARISC_DOC: return "PARISC_DOC";
1953 get_ia64_section_type_name (sh_type)
1954 unsigned int sh_type;
1958 case SHT_IA_64_EXT: return "IA_64_EXT";
1959 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
1967 get_section_type_name (sh_type)
1968 unsigned int sh_type;
1970 static char buff [32];
1974 case SHT_NULL: return "NULL";
1975 case SHT_PROGBITS: return "PROGBITS";
1976 case SHT_SYMTAB: return "SYMTAB";
1977 case SHT_STRTAB: return "STRTAB";
1978 case SHT_RELA: return "RELA";
1979 case SHT_HASH: return "HASH";
1980 case SHT_DYNAMIC: return "DYNAMIC";
1981 case SHT_NOTE: return "NOTE";
1982 case SHT_NOBITS: return "NOBITS";
1983 case SHT_REL: return "REL";
1984 case SHT_SHLIB: return "SHLIB";
1985 case SHT_DYNSYM: return "DYNSYM";
1986 case SHT_INIT_ARRAY: return "INIT_ARRAY";
1987 case SHT_FINI_ARRAY: return "FINI_ARRAY";
1988 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1989 case SHT_GROUP: return "GROUP";
1990 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
1991 case SHT_GNU_verdef: return "VERDEF";
1992 case SHT_GNU_verneed: return "VERNEED";
1993 case SHT_GNU_versym: return "VERSYM";
1994 case 0x6ffffff0: return "VERSYM";
1995 case 0x6ffffffc: return "VERDEF";
1996 case 0x7ffffffd: return "AUXILIARY";
1997 case 0x7fffffff: return "FILTER";
2000 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
2002 const char * result;
2004 switch (elf_header.e_machine)
2007 case EM_MIPS_RS3_LE:
2008 result = get_mips_section_type_name (sh_type);
2011 result = get_parisc_section_type_name (sh_type);
2014 result = get_ia64_section_type_name (sh_type);
2024 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
2026 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
2027 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
2028 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
2029 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
2031 sprintf (buff, _("<unknown>: %x"), sh_type);
2037 struct option options [] =
2039 {"all", no_argument, 0, 'a'},
2040 {"file-header", no_argument, 0, 'h'},
2041 {"program-headers", no_argument, 0, 'l'},
2042 {"headers", no_argument, 0, 'e'},
2043 {"histogram", no_argument, 0, 'I'},
2044 {"segments", no_argument, 0, 'l'},
2045 {"sections", no_argument, 0, 'S'},
2046 {"section-headers", no_argument, 0, 'S'},
2047 {"symbols", no_argument, 0, 's'},
2048 {"syms", no_argument, 0, 's'},
2049 {"relocs", no_argument, 0, 'r'},
2050 {"notes", no_argument, 0, 'n'},
2051 {"dynamic", no_argument, 0, 'd'},
2052 {"arch-specific", no_argument, 0, 'A'},
2053 {"version-info", no_argument, 0, 'V'},
2054 {"use-dynamic", no_argument, 0, 'D'},
2055 {"hex-dump", required_argument, 0, 'x'},
2056 {"debug-dump", optional_argument, 0, 'w'},
2057 {"unwind", no_argument, 0, 'u'},
2058 #ifdef SUPPORT_DISASSEMBLY
2059 {"instruction-dump", required_argument, 0, 'i'},
2062 {"version", no_argument, 0, 'v'},
2063 {"wide", no_argument, 0, 'W'},
2064 {"help", no_argument, 0, 'H'},
2065 {0, no_argument, 0, 0}
2071 fprintf (stdout, _("Usage: readelf {options} elf-file(s)\n"));
2072 fprintf (stdout, _(" Options are:\n"));
2073 fprintf (stdout, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
2074 fprintf (stdout, _(" -h or --file-header Display the ELF file header\n"));
2075 fprintf (stdout, _(" -l or --program-headers or --segments\n"));
2076 fprintf (stdout, _(" Display the program headers\n"));
2077 fprintf (stdout, _(" -S or --section-headers or --sections\n"));
2078 fprintf (stdout, _(" Display the sections' header\n"));
2079 fprintf (stdout, _(" -e or --headers Equivalent to: -h -l -S\n"));
2080 fprintf (stdout, _(" -s or --syms or --symbols Display the symbol table\n"));
2081 fprintf (stdout, _(" -n or --notes Display the core notes (if present)\n"));
2082 fprintf (stdout, _(" -r or --relocs Display the relocations (if present)\n"));
2083 fprintf (stdout, _(" -u or --unwind Display the unwind info (if present)\n"));
2084 fprintf (stdout, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
2085 fprintf (stdout, _(" -V or --version-info Display the version sections (if present)\n"));
2086 fprintf (stdout, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
2087 fprintf (stdout, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
2088 fprintf (stdout, _(" -x <number> or --hex-dump=<number>\n"));
2089 fprintf (stdout, _(" Dump the contents of section <number>\n"));
2090 fprintf (stdout, _(" -w[liaprmfs] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str]\n"));
2091 fprintf (stdout, _(" Display the contents of DWARF2 debug sections\n"));
2092 #ifdef SUPPORT_DISASSEMBLY
2093 fprintf (stdout, _(" -i <number> or --instruction-dump=<number>\n"));
2094 fprintf (stdout, _(" Disassemble the contents of section <number>\n"));
2096 fprintf (stdout, _(" -I or --histogram Display histogram of bucket list lengths\n"));
2097 fprintf (stdout, _(" -v or --version Display the version number of readelf\n"));
2098 fprintf (stdout, _(" -W or --wide Don't split lines to fit into 80 columns\n"));
2099 fprintf (stdout, _(" -H or --help Display this information\n"));
2100 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2106 request_dump (section, type)
2107 unsigned int section;
2110 if (section >= num_dump_sects)
2112 char * new_dump_sects;
2114 new_dump_sects = (char *) calloc (section + 1, 1);
2116 if (new_dump_sects == NULL)
2117 error (_("Out of memory allocating dump request table."));
2120 /* Copy current flag settings. */
2121 memcpy (new_dump_sects, dump_sects, num_dump_sects);
2125 dump_sects = new_dump_sects;
2126 num_dump_sects = section + 1;
2131 dump_sects [section] |= type;
2137 parse_args (argc, argv)
2146 while ((c = getopt_long
2147 (argc, argv, "ersuahnldSDAIw::x:i:vVW", options, NULL)) != EOF)
2183 do_using_dynamic ++;
2214 section = strtoul (optarg, & cp, 0);
2215 if (! * cp && section >= 0)
2217 request_dump (section, HEX_DUMP);
2227 unsigned int index = 0;
2231 while (optarg[index])
2232 switch (optarg[index++])
2241 do_debug_abbrevs = 1;
2251 do_debug_pubnames = 1;
2256 do_debug_aranges = 1;
2260 do_debug_frames_interp = 1;
2262 do_debug_frames = 1;
2267 do_debug_macinfo = 1;
2276 warn (_("Unrecognised debug option '%s'\n"), optarg);
2281 #ifdef SUPPORT_DISASSEMBLY
2284 section = strtoul (optarg, & cp, 0);
2285 if (! * cp && section >= 0)
2287 request_dump (section, DISASS_DUMP);
2293 print_version (program_name);
2303 /* xgettext:c-format */
2304 error (_("Invalid option '-%c'\n"), c);
2311 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
2312 && !do_segments && !do_header && !do_dump && !do_version
2313 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2317 warn (_("Nothing to do.\n"));
2323 get_elf_class (elf_class)
2324 unsigned int elf_class;
2326 static char buff [32];
2330 case ELFCLASSNONE: return _("none");
2331 case ELFCLASS32: return "ELF32";
2332 case ELFCLASS64: return "ELF64";
2334 sprintf (buff, _("<unknown: %x>"), elf_class);
2340 get_data_encoding (encoding)
2341 unsigned int encoding;
2343 static char buff [32];
2347 case ELFDATANONE: return _("none");
2348 case ELFDATA2LSB: return _("2's complement, little endian");
2349 case ELFDATA2MSB: return _("2's complement, big endian");
2351 sprintf (buff, _("<unknown: %x>"), encoding);
2357 get_osabi_name (osabi)
2360 static char buff [32];
2364 case ELFOSABI_NONE: return "UNIX - System V";
2365 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2366 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2367 case ELFOSABI_LINUX: return "UNIX - Linux";
2368 case ELFOSABI_HURD: return "GNU/Hurd";
2369 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2370 case ELFOSABI_AIX: return "UNIX - AIX";
2371 case ELFOSABI_IRIX: return "UNIX - IRIX";
2372 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2373 case ELFOSABI_TRU64: return "UNIX - TRU64";
2374 case ELFOSABI_MODESTO: return "Novell - Modesto";
2375 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2376 case ELFOSABI_STANDALONE: return _("Standalone App");
2377 case ELFOSABI_ARM: return "ARM";
2379 sprintf (buff, _("<unknown: %x>"), osabi);
2384 /* Decode the data held in 'elf_header'. */
2386 process_file_header ()
2388 if ( elf_header.e_ident [EI_MAG0] != ELFMAG0
2389 || elf_header.e_ident [EI_MAG1] != ELFMAG1
2390 || elf_header.e_ident [EI_MAG2] != ELFMAG2
2391 || elf_header.e_ident [EI_MAG3] != ELFMAG3)
2394 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2402 printf (_("ELF Header:\n"));
2403 printf (_(" Magic: "));
2404 for (i = 0; i < EI_NIDENT; i ++)
2405 printf ("%2.2x ", elf_header.e_ident [i]);
2407 printf (_(" Class: %s\n"),
2408 get_elf_class (elf_header.e_ident [EI_CLASS]));
2409 printf (_(" Data: %s\n"),
2410 get_data_encoding (elf_header.e_ident [EI_DATA]));
2411 printf (_(" Version: %d %s\n"),
2412 elf_header.e_ident [EI_VERSION],
2413 (elf_header.e_ident [EI_VERSION] == EV_CURRENT
2415 : (elf_header.e_ident [EI_VERSION] != EV_NONE
2418 printf (_(" OS/ABI: %s\n"),
2419 get_osabi_name (elf_header.e_ident [EI_OSABI]));
2420 printf (_(" ABI Version: %d\n"),
2421 elf_header.e_ident [EI_ABIVERSION]);
2422 printf (_(" Type: %s\n"),
2423 get_file_type (elf_header.e_type));
2424 printf (_(" Machine: %s\n"),
2425 get_machine_name (elf_header.e_machine));
2426 printf (_(" Version: 0x%lx\n"),
2427 (unsigned long) elf_header.e_version);
2429 printf (_(" Entry point address: "));
2430 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2431 printf (_("\n Start of program headers: "));
2432 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2433 printf (_(" (bytes into file)\n Start of section headers: "));
2434 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2435 printf (_(" (bytes into file)\n"));
2437 printf (_(" Flags: 0x%lx%s\n"),
2438 (unsigned long) elf_header.e_flags,
2439 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2440 printf (_(" Size of this header: %ld (bytes)\n"),
2441 (long) elf_header.e_ehsize);
2442 printf (_(" Size of program headers: %ld (bytes)\n"),
2443 (long) elf_header.e_phentsize);
2444 printf (_(" Number of program headers: %ld\n"),
2445 (long) elf_header.e_phnum);
2446 printf (_(" Size of section headers: %ld (bytes)\n"),
2447 (long) elf_header.e_shentsize);
2448 printf (_(" Number of section headers: %ld"),
2449 (long) elf_header.e_shnum);
2450 if (section_headers != NULL && elf_header.e_shnum == 0)
2451 printf (" (%ld)", (long) section_headers[0].sh_size);
2452 putc ('\n', stdout);
2453 printf (_(" Section header string table index: %ld"),
2454 (long) elf_header.e_shstrndx);
2455 if (section_headers != NULL && elf_header.e_shstrndx == SHN_XINDEX)
2456 printf (" (%ld)", (long) section_headers[0].sh_link);
2457 putc ('\n', stdout);
2460 if (section_headers != NULL)
2462 if (elf_header.e_shnum == 0)
2463 elf_header.e_shnum = section_headers[0].sh_size;
2464 if (elf_header.e_shstrndx == SHN_XINDEX)
2465 elf_header.e_shstrndx = section_headers[0].sh_link;
2466 free (section_headers);
2467 section_headers = NULL;
2475 get_32bit_program_headers (file, program_headers)
2477 Elf_Internal_Phdr * program_headers;
2479 Elf32_External_Phdr * phdrs;
2480 Elf32_External_Phdr * external;
2481 Elf32_Internal_Phdr * internal;
2484 phdrs = ((Elf32_External_Phdr *)
2485 get_data (NULL, file, elf_header.e_phoff,
2486 elf_header.e_phentsize * elf_header.e_phnum,
2487 _("program headers")));
2491 for (i = 0, internal = program_headers, external = phdrs;
2492 i < elf_header.e_phnum;
2493 i ++, internal ++, external ++)
2495 internal->p_type = BYTE_GET (external->p_type);
2496 internal->p_offset = BYTE_GET (external->p_offset);
2497 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2498 internal->p_paddr = BYTE_GET (external->p_paddr);
2499 internal->p_filesz = BYTE_GET (external->p_filesz);
2500 internal->p_memsz = BYTE_GET (external->p_memsz);
2501 internal->p_flags = BYTE_GET (external->p_flags);
2502 internal->p_align = BYTE_GET (external->p_align);
2511 get_64bit_program_headers (file, program_headers)
2513 Elf_Internal_Phdr * program_headers;
2515 Elf64_External_Phdr * phdrs;
2516 Elf64_External_Phdr * external;
2517 Elf64_Internal_Phdr * internal;
2520 phdrs = ((Elf64_External_Phdr *)
2521 get_data (NULL, file, elf_header.e_phoff,
2522 elf_header.e_phentsize * elf_header.e_phnum,
2523 _("program headers")));
2527 for (i = 0, internal = program_headers, external = phdrs;
2528 i < elf_header.e_phnum;
2529 i ++, internal ++, external ++)
2531 internal->p_type = BYTE_GET (external->p_type);
2532 internal->p_flags = BYTE_GET (external->p_flags);
2533 internal->p_offset = BYTE_GET8 (external->p_offset);
2534 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2535 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2536 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2537 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2538 internal->p_align = BYTE_GET8 (external->p_align);
2547 process_program_headers (file)
2550 Elf_Internal_Phdr * program_headers;
2551 Elf_Internal_Phdr * segment;
2554 if (elf_header.e_phnum == 0)
2557 printf (_("\nThere are no program headers in this file.\n"));
2561 if (do_segments && !do_header)
2563 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2564 printf (_("Entry point "));
2565 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2566 printf (_("\nThere are %d program headers, starting at offset "),
2567 elf_header.e_phnum);
2568 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2572 program_headers = (Elf_Internal_Phdr *) malloc
2573 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2575 if (program_headers == NULL)
2577 error (_("Out of memory\n"));
2582 i = get_32bit_program_headers (file, program_headers);
2584 i = get_64bit_program_headers (file, program_headers);
2588 free (program_headers);
2595 (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2599 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2602 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2606 (_(" Type Offset VirtAddr PhysAddr\n"));
2608 (_(" FileSiz MemSiz Flags Align\n"));
2616 for (i = 0, segment = program_headers;
2617 i < elf_header.e_phnum;
2622 printf (" %-14.14s ", get_segment_type (segment->p_type));
2626 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2627 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2628 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2629 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2630 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2632 (segment->p_flags & PF_R ? 'R' : ' '),
2633 (segment->p_flags & PF_W ? 'W' : ' '),
2634 (segment->p_flags & PF_X ? 'E' : ' '));
2635 printf ("%#lx", (unsigned long) segment->p_align);
2639 if ((unsigned long) segment->p_offset == segment->p_offset)
2640 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2643 print_vma (segment->p_offset, FULL_HEX);
2647 print_vma (segment->p_vaddr, FULL_HEX);
2649 print_vma (segment->p_paddr, FULL_HEX);
2652 if ((unsigned long) segment->p_filesz == segment->p_filesz)
2653 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
2656 print_vma (segment->p_filesz, FULL_HEX);
2660 if ((unsigned long) segment->p_memsz == segment->p_memsz)
2661 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
2664 print_vma (segment->p_offset, FULL_HEX);
2668 (segment->p_flags & PF_R ? 'R' : ' '),
2669 (segment->p_flags & PF_W ? 'W' : ' '),
2670 (segment->p_flags & PF_X ? 'E' : ' '));
2672 if ((unsigned long) segment->p_align == segment->p_align)
2673 printf ("%#lx", (unsigned long) segment->p_align);
2676 print_vma (segment->p_align, PREFIX_HEX);
2681 print_vma (segment->p_offset, FULL_HEX);
2683 print_vma (segment->p_vaddr, FULL_HEX);
2685 print_vma (segment->p_paddr, FULL_HEX);
2687 print_vma (segment->p_filesz, FULL_HEX);
2689 print_vma (segment->p_memsz, FULL_HEX);
2691 (segment->p_flags & PF_R ? 'R' : ' '),
2692 (segment->p_flags & PF_W ? 'W' : ' '),
2693 (segment->p_flags & PF_X ? 'E' : ' '));
2694 print_vma (segment->p_align, HEX);
2698 switch (segment->p_type)
2702 loadaddr = (segment->p_vaddr & 0xfffff000)
2703 - (segment->p_offset & 0xfffff000);
2708 error (_("more than one dynamic segment\n"));
2710 dynamic_addr = segment->p_offset;
2711 dynamic_size = segment->p_filesz;
2715 if (fseek (file, (long) segment->p_offset, SEEK_SET))
2716 error (_("Unable to find program interpreter name\n"));
2719 program_interpreter[0] = 0;
2720 fscanf (file, "%63s", program_interpreter);
2723 printf (_("\n [Requesting program interpreter: %s]"),
2724 program_interpreter);
2730 putc ('\n', stdout);
2739 if (do_segments && section_headers != NULL)
2741 printf (_("\n Section to Segment mapping:\n"));
2742 printf (_(" Segment Sections...\n"));
2744 assert (string_table != NULL);
2746 for (i = 0; i < elf_header.e_phnum; i++)
2749 Elf_Internal_Shdr * section;
2751 segment = program_headers + i;
2752 section = section_headers;
2754 printf (" %2.2d ", i);
2756 for (j = 0; j < elf_header.e_shnum; j++, section ++)
2758 if (section->sh_size > 0
2759 /* Compare allocated sections by VMA, unallocated
2760 sections by file offset. */
2761 && (section->sh_flags & SHF_ALLOC
2762 ? (section->sh_addr >= segment->p_vaddr
2763 && section->sh_addr + section->sh_size
2764 <= segment->p_vaddr + segment->p_memsz)
2765 : ((bfd_vma) section->sh_offset >= segment->p_offset
2766 && (section->sh_offset + section->sh_size
2767 <= segment->p_offset + segment->p_filesz))))
2768 printf ("%s ", SECTION_NAME (section));
2775 free (program_headers);
2782 get_32bit_section_headers (file, num)
2786 Elf32_External_Shdr * shdrs;
2787 Elf32_Internal_Shdr * internal;
2790 shdrs = ((Elf32_External_Shdr *)
2791 get_data (NULL, file, elf_header.e_shoff,
2792 elf_header.e_shentsize * num,
2793 _("section headers")));
2797 section_headers = ((Elf_Internal_Shdr *)
2798 malloc (num * sizeof (Elf_Internal_Shdr)));
2800 if (section_headers == NULL)
2802 error (_("Out of memory\n"));
2806 for (i = 0, internal = section_headers;
2810 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2811 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2812 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
2813 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
2814 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2815 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
2816 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2817 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2818 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2819 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
2828 get_64bit_section_headers (file, num)
2832 Elf64_External_Shdr * shdrs;
2833 Elf64_Internal_Shdr * internal;
2836 shdrs = ((Elf64_External_Shdr *)
2837 get_data (NULL, file, elf_header.e_shoff,
2838 elf_header.e_shentsize * num,
2839 _("section headers")));
2843 section_headers = ((Elf_Internal_Shdr *)
2844 malloc (num * sizeof (Elf_Internal_Shdr)));
2846 if (section_headers == NULL)
2848 error (_("Out of memory\n"));
2852 for (i = 0, internal = section_headers;
2856 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2857 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2858 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
2859 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
2860 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
2861 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
2862 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2863 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2864 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2865 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2873 static Elf_Internal_Sym *
2874 get_32bit_elf_symbols (file, offset, number)
2876 unsigned long offset;
2877 unsigned long number;
2879 Elf32_External_Sym * esyms;
2880 Elf_Internal_Sym * isyms;
2881 Elf_Internal_Sym * psym;
2884 esyms = ((Elf32_External_Sym *)
2885 get_data (NULL, file, offset,
2886 number * sizeof (Elf32_External_Sym), _("symbols")));
2890 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2894 error (_("Out of memory\n"));
2900 for (j = 0, psym = isyms;
2904 psym->st_name = BYTE_GET (esyms[j].st_name);
2905 psym->st_value = BYTE_GET (esyms[j].st_value);
2906 psym->st_size = BYTE_GET (esyms[j].st_size);
2907 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2908 psym->st_info = BYTE_GET (esyms[j].st_info);
2909 psym->st_other = BYTE_GET (esyms[j].st_other);
2917 static Elf_Internal_Sym *
2918 get_64bit_elf_symbols (file, offset, number)
2920 unsigned long offset;
2921 unsigned long number;
2923 Elf64_External_Sym * esyms;
2924 Elf_Internal_Sym * isyms;
2925 Elf_Internal_Sym * psym;
2928 esyms = ((Elf64_External_Sym *)
2929 get_data (NULL, file, offset,
2930 number * sizeof (Elf64_External_Sym), _("symbols")));
2934 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2938 error (_("Out of memory\n"));
2944 for (j = 0, psym = isyms;
2948 psym->st_name = BYTE_GET (esyms[j].st_name);
2949 psym->st_info = BYTE_GET (esyms[j].st_info);
2950 psym->st_other = BYTE_GET (esyms[j].st_other);
2951 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2952 psym->st_value = BYTE_GET8 (esyms[j].st_value);
2953 psym->st_size = BYTE_GET8 (esyms[j].st_size);
2962 get_elf_section_flags (sh_flags)
2965 static char buff [32];
2973 flag = sh_flags & - sh_flags;
2978 case SHF_WRITE: strcat (buff, "W"); break;
2979 case SHF_ALLOC: strcat (buff, "A"); break;
2980 case SHF_EXECINSTR: strcat (buff, "X"); break;
2981 case SHF_MERGE: strcat (buff, "M"); break;
2982 case SHF_STRINGS: strcat (buff, "S"); break;
2983 case SHF_INFO_LINK: strcat (buff, "I"); break;
2984 case SHF_LINK_ORDER: strcat (buff, "L"); break;
2985 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
2986 case SHF_GROUP: strcat (buff, "G"); break;
2989 if (flag & SHF_MASKOS)
2992 sh_flags &= ~ SHF_MASKOS;
2994 else if (flag & SHF_MASKPROC)
2997 sh_flags &= ~ SHF_MASKPROC;
3009 process_section_headers (file)
3012 Elf_Internal_Shdr * section;
3015 section_headers = NULL;
3017 if (elf_header.e_shnum == 0)
3020 printf (_("\nThere are no sections in this file.\n"));
3025 if (do_sections && !do_header)
3026 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3027 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
3031 if (! get_32bit_section_headers (file, elf_header.e_shnum))
3034 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
3037 /* Read in the string table, so that we have names to display. */
3038 section = section_headers + elf_header.e_shstrndx;
3040 if (section->sh_size != 0)
3042 string_table = (char *) get_data (NULL, file, section->sh_offset,
3043 section->sh_size, _("string table"));
3045 string_table_length = section->sh_size;
3048 /* Scan the sections for the dynamic symbol table
3049 and dynamic string table and debug sections. */
3050 dynamic_symbols = NULL;
3051 dynamic_strings = NULL;
3052 dynamic_syminfo = NULL;
3054 for (i = 0, section = section_headers;
3055 i < elf_header.e_shnum;
3058 char * name = SECTION_NAME (section);
3060 if (section->sh_type == SHT_DYNSYM)
3062 if (dynamic_symbols != NULL)
3064 error (_("File contains multiple dynamic symbol tables\n"));
3068 num_dynamic_syms = section->sh_size / section->sh_entsize;
3070 GET_ELF_SYMBOLS (file, section->sh_offset, num_dynamic_syms);
3072 else if (section->sh_type == SHT_STRTAB
3073 && strcmp (name, ".dynstr") == 0)
3075 if (dynamic_strings != NULL)
3077 error (_("File contains multiple dynamic string tables\n"));
3081 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
3083 _("dynamic strings"));
3085 else if ((do_debugging || do_debug_info || do_debug_abbrevs
3086 || do_debug_lines || do_debug_pubnames || do_debug_aranges
3087 || do_debug_frames || do_debug_macinfo || do_debug_str)
3088 && strncmp (name, ".debug_", 7) == 0)
3093 || (do_debug_info && (strcmp (name, "info") == 0))
3094 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
3095 || (do_debug_lines && (strcmp (name, "line") == 0))
3096 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
3097 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
3098 || (do_debug_frames && (strcmp (name, "frame") == 0))
3099 || (do_debug_macinfo && (strcmp (name, "macinfo") == 0))
3100 || (do_debug_str && (strcmp (name, "str") == 0))
3102 request_dump (i, DEBUG_DUMP);
3104 /* linkonce section to be combined with .debug_info at link time. */
3105 else if ((do_debugging || do_debug_info)
3106 && strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
3107 request_dump (i, DEBUG_DUMP);
3108 else if (do_debug_frames && strcmp (name, ".eh_frame") == 0)
3109 request_dump (i, DEBUG_DUMP);
3115 printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
3119 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3122 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3125 printf (_(" [Nr] Name Type Address Offset\n"));
3126 printf (_(" Size EntSize Flags Link Info Align\n"));
3129 for (i = 0, section = section_headers;
3130 i < elf_header.e_shnum;
3133 printf (" [%2d] %-17.17s %-15.15s ",
3135 SECTION_NAME (section),
3136 get_section_type_name (section->sh_type));
3140 print_vma (section->sh_addr, LONG_HEX);
3142 printf ( " %6.6lx %6.6lx %2.2lx",
3143 (unsigned long) section->sh_offset,
3144 (unsigned long) section->sh_size,
3145 (unsigned long) section->sh_entsize);
3147 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3149 printf ("%2ld %3lx %2ld\n",
3150 (unsigned long) section->sh_link,
3151 (unsigned long) section->sh_info,
3152 (unsigned long) section->sh_addralign);
3156 print_vma (section->sh_addr, LONG_HEX);
3158 if ((long) section->sh_offset == section->sh_offset)
3159 printf (" %6.6lx", (unsigned long) section->sh_offset);
3163 print_vma (section->sh_offset, LONG_HEX);
3166 if ((unsigned long) section->sh_size == section->sh_size)
3167 printf (" %6.6lx", (unsigned long) section->sh_size);
3171 print_vma (section->sh_size, LONG_HEX);
3174 if ((unsigned long) section->sh_entsize == section->sh_entsize)
3175 printf (" %2.2lx", (unsigned long) section->sh_entsize);
3179 print_vma (section->sh_entsize, LONG_HEX);
3182 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3184 printf ("%2ld %3lx ",
3185 (unsigned long) section->sh_link,
3186 (unsigned long) section->sh_info);
3188 if ((unsigned long) section->sh_addralign == section->sh_addralign)
3189 printf ("%2ld\n", (unsigned long) section->sh_addralign);
3192 print_vma (section->sh_addralign, DEC);
3199 print_vma (section->sh_addr, LONG_HEX);
3200 if ((long) section->sh_offset == section->sh_offset)
3201 printf (" %8.8lx", (unsigned long) section->sh_offset);
3205 print_vma (section->sh_offset, LONG_HEX);
3208 print_vma (section->sh_size, LONG_HEX);
3210 print_vma (section->sh_entsize, LONG_HEX);
3212 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3214 printf (" %2ld %3lx %ld\n",
3215 (unsigned long) section->sh_link,
3216 (unsigned long) section->sh_info,
3217 (unsigned long) section->sh_addralign);
3221 printf (_("Key to Flags:\n\
3222 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3223 I (info), L (link order), G (group), x (unknown)\n\
3224 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3229 /* Process the reloc section. */
3231 process_relocs (file)
3234 unsigned long rel_size;
3235 unsigned long rel_offset;
3241 if (do_using_dynamic)
3243 int is_rela = FALSE;
3248 if (dynamic_info[DT_REL])
3250 rel_offset = dynamic_info[DT_REL];
3251 rel_size = dynamic_info[DT_RELSZ];
3254 else if (dynamic_info [DT_RELA])
3256 rel_offset = dynamic_info[DT_RELA];
3257 rel_size = dynamic_info[DT_RELASZ];
3260 else if (dynamic_info[DT_JMPREL])
3262 rel_offset = dynamic_info[DT_JMPREL];
3263 rel_size = dynamic_info[DT_PLTRELSZ];
3265 switch (dynamic_info[DT_PLTREL])
3282 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3283 rel_offset, rel_size);
3285 dump_relocations (file, rel_offset - loadaddr, rel_size,
3286 dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
3289 printf (_("\nThere are no dynamic relocations in this file.\n"));
3293 Elf32_Internal_Shdr * section;
3297 for (i = 0, section = section_headers;
3298 i < elf_header.e_shnum;
3301 if ( section->sh_type != SHT_RELA
3302 && section->sh_type != SHT_REL)
3305 rel_offset = section->sh_offset;
3306 rel_size = section->sh_size;
3310 Elf32_Internal_Shdr * strsec;
3311 Elf_Internal_Sym * symtab;
3314 unsigned long nsyms;
3316 printf (_("\nRelocation section "));
3318 if (string_table == NULL)
3319 printf ("%d", section->sh_name);
3321 printf ("'%s'", SECTION_NAME (section));
3323 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3324 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
3329 if (section->sh_link)
3331 Elf32_Internal_Shdr * symsec;
3333 symsec = section_headers + section->sh_link;
3334 nsyms = symsec->sh_size / symsec->sh_entsize;
3335 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
3340 strsec = section_headers + symsec->sh_link;
3342 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3346 is_rela = section->sh_type == SHT_RELA;
3348 dump_relocations (file, rel_offset, rel_size,
3349 symtab, nsyms, strtab, is_rela);
3361 printf (_("\nThere are no relocations in this file.\n"));
3367 #include "unwind-ia64.h"
3369 /* An absolute address consists of a section and an offset. If the
3370 section is NULL, the offset itself is the address, otherwise, the
3371 address equals to LOAD_ADDRESS(section) + offset. */
3375 unsigned short section;
3381 struct unw_table_entry
3383 struct absaddr start;
3385 struct absaddr info;
3387 *table; /* Unwind table. */
3388 unsigned long table_len; /* Length of unwind table. */
3389 unsigned char * info; /* Unwind info. */
3390 unsigned long info_size; /* Size of unwind info. */
3391 bfd_vma info_addr; /* starting address of unwind info. */
3392 bfd_vma seg_base; /* Starting address of segment. */
3393 Elf_Internal_Sym * symtab; /* The symbol table. */
3394 unsigned long nsyms; /* Number of symbols. */
3395 char * strtab; /* The string table. */
3396 unsigned long strtab_size; /* Size of string table. */
3399 static void find_symbol_for_address PARAMS ((struct unw_aux_info *,
3400 struct absaddr, const char **,
3402 static void dump_ia64_unwind PARAMS ((struct unw_aux_info *));
3403 static int slurp_ia64_unwind_table PARAMS ((FILE *, struct unw_aux_info *,
3404 Elf32_Internal_Shdr *));
3407 find_symbol_for_address (aux, addr, symname, offset)
3408 struct unw_aux_info *aux;
3409 struct absaddr addr;
3410 const char **symname;
3413 bfd_vma dist = (bfd_vma) 0x100000;
3414 Elf_Internal_Sym *sym, *best = NULL;
3417 for (i = 0, sym = aux->symtab; i < aux->nsyms; ++i, ++sym)
3419 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
3420 && sym->st_name != 0
3421 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
3422 && addr.offset >= sym->st_value
3423 && addr.offset - sym->st_value < dist)
3426 dist = addr.offset - sym->st_value;
3433 *symname = (best->st_name >= aux->strtab_size
3434 ? "<corrupt>" : aux->strtab + best->st_name);
3439 *offset = addr.offset;
3443 dump_ia64_unwind (aux)
3444 struct unw_aux_info *aux;
3447 struct unw_table_entry * tp;
3450 addr_size = is_32bit_elf ? 4 : 8;
3452 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
3456 const unsigned char * dp;
3457 const unsigned char * head;
3458 const char * procname;
3460 find_symbol_for_address (aux, tp->start, &procname, &offset);
3462 fputs ("\n<", stdout);
3466 fputs (procname, stdout);
3469 printf ("+%lx", (unsigned long) offset);
3472 fputs (">: [", stdout);
3473 print_vma (tp->start.offset, PREFIX_HEX);
3474 fputc ('-', stdout);
3475 print_vma (tp->end.offset, PREFIX_HEX);
3476 printf ("), info at +0x%lx\n",
3477 (unsigned long) (tp->info.offset - aux->seg_base));
3479 head = aux->info + (tp->info.offset - aux->info_addr);
3480 stamp = BYTE_GET8 ((unsigned char *) head);
3482 printf (" v%u, flags=0x%lx (%s%s ), len=%lu bytes\n",
3483 (unsigned) UNW_VER (stamp),
3484 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
3485 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
3486 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
3487 (unsigned long) (addr_size * UNW_LENGTH (stamp)));
3489 if (UNW_VER (stamp) != 1)
3491 printf ("\tUnknown version.\n");
3496 for (dp = head + 8; dp < head + 8 + addr_size * UNW_LENGTH (stamp);)
3497 dp = unw_decode (dp, in_body, & in_body);
3502 slurp_ia64_unwind_table (file, aux, sec)
3504 struct unw_aux_info *aux;
3505 Elf32_Internal_Shdr *sec;
3507 unsigned long size, addr_size, nrelas, i;
3508 Elf_Internal_Phdr *prog_hdrs, *seg;
3509 struct unw_table_entry *tep;
3510 Elf32_Internal_Shdr *relsec;
3511 Elf_Internal_Rela *rela, *rp;
3512 unsigned char *table, *tp;
3513 Elf_Internal_Sym *sym;
3514 const char *relname;
3517 addr_size = is_32bit_elf ? 4 : 8;
3519 /* First, find the starting address of the segment that includes
3522 if (elf_header.e_phnum)
3524 prog_hdrs = (Elf_Internal_Phdr *)
3525 xmalloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
3528 result = get_32bit_program_headers (file, prog_hdrs);
3530 result = get_64bit_program_headers (file, prog_hdrs);
3538 for (seg = prog_hdrs; seg < prog_hdrs + elf_header.e_phnum; ++seg)
3540 if (seg->p_type != PT_LOAD)
3543 if (sec->sh_addr >= seg->p_vaddr
3544 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
3546 aux->seg_base = seg->p_vaddr;
3554 /* Second, build the unwind table from the contents of the unwind section: */
3555 size = sec->sh_size;
3556 table = (char *) get_data (NULL, file, sec->sh_offset,
3557 size, _("unwind table"));
3561 tep = aux->table = xmalloc (size / (3 * addr_size) * sizeof (aux->table[0]));
3562 for (tp = table; tp < table + size; tp += 3 * addr_size, ++ tep)
3564 tep->start.section = SHN_UNDEF;
3565 tep->end.section = SHN_UNDEF;
3566 tep->info.section = SHN_UNDEF;
3569 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
3570 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
3571 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
3575 tep->start.offset = BYTE_GET8 ((unsigned char *) tp + 0);
3576 tep->end.offset = BYTE_GET8 ((unsigned char *) tp + 8);
3577 tep->info.offset = BYTE_GET8 ((unsigned char *) tp + 16);
3579 tep->start.offset += aux->seg_base;
3580 tep->end.offset += aux->seg_base;
3581 tep->info.offset += aux->seg_base;
3585 /* Third, apply any relocations to the unwind table: */
3587 for (relsec = section_headers;
3588 relsec < section_headers + elf_header.e_shnum;
3591 if (relsec->sh_type != SHT_RELA
3592 || section_headers + relsec->sh_info != sec)
3595 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
3599 for (rp = rela; rp < rela + nrelas; ++rp)
3603 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
3604 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
3606 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
3608 warn (_("Skipping unexpected symbol type %u\n"),
3609 ELF32_ST_TYPE (sym->st_info));
3615 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
3616 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
3618 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
3620 warn (_("Skipping unexpected symbol type %u\n"),
3621 ELF64_ST_TYPE (sym->st_info));
3626 if (strncmp (relname, "R_IA64_SEGREL", 13) != 0)
3628 warn (_("Skipping unexpected relocation type %s\n"), relname);
3632 i = rp->r_offset / (3 * addr_size);
3634 switch (rp->r_offset/addr_size % 3)
3637 aux->table[i].start.section = sym->st_shndx;
3638 aux->table[i].start.offset += rp->r_addend;
3641 aux->table[i].end.section = sym->st_shndx;
3642 aux->table[i].end.offset += rp->r_addend;
3645 aux->table[i].info.section = sym->st_shndx;
3646 aux->table[i].info.offset += rp->r_addend;
3656 aux->table_len = size / (3 * addr_size);
3661 process_unwind (file)
3664 Elf32_Internal_Shdr *sec, *unwsec = NULL, *strsec;
3665 unsigned long i, addr_size, unwcount = 0, unwstart = 0;
3666 struct unw_aux_info aux;
3671 if (elf_header.e_machine != EM_IA_64)
3673 printf (_("\nThere are no unwind sections in this file.\n"));
3677 memset (& aux, 0, sizeof (aux));
3679 addr_size = is_32bit_elf ? 4 : 8;
3681 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
3683 if (sec->sh_type == SHT_SYMTAB)
3685 aux.nsyms = sec->sh_size / sec->sh_entsize;
3686 aux.symtab = GET_ELF_SYMBOLS (file, sec->sh_offset, aux.nsyms);
3688 strsec = section_headers + sec->sh_link;
3689 aux.strtab_size = strsec->sh_size;
3690 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3691 aux.strtab_size, _("string table"));
3693 else if (sec->sh_type == SHT_IA_64_UNWIND)
3698 printf (_("\nThere are no unwind sections in this file.\n"));
3700 while (unwcount-- > 0)
3705 for (i = unwstart, sec = section_headers + unwstart;
3706 i < elf_header.e_shnum; ++i, ++sec)
3707 if (sec->sh_type == SHT_IA_64_UNWIND)
3714 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
3716 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once,
3719 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
3720 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
3721 suffix = SECTION_NAME (unwsec) + len;
3722 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3724 if (strncmp (SECTION_NAME (sec),
3725 ELF_STRING_ia64_unwind_info_once, len2) == 0
3726 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3731 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
3732 .IA_64.unwind or BAR -> .IA_64.unwind_info */
3733 len = sizeof (ELF_STRING_ia64_unwind) - 1;
3734 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
3736 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind,
3738 suffix = SECTION_NAME (unwsec) + len;
3739 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3741 if (strncmp (SECTION_NAME (sec),
3742 ELF_STRING_ia64_unwind_info, len2) == 0
3743 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3747 if (i == elf_header.e_shnum)
3749 printf (_("\nCould not find unwind info section for "));
3751 if (string_table == NULL)
3752 printf ("%d", unwsec->sh_name);
3754 printf ("'%s'", SECTION_NAME (unwsec));
3758 aux.info_size = sec->sh_size;
3759 aux.info_addr = sec->sh_addr;
3760 aux.info = (char *) get_data (NULL, file, sec->sh_offset,
3761 aux.info_size, _("unwind info"));
3763 printf (_("\nUnwind section "));
3765 if (string_table == NULL)
3766 printf ("%d", unwsec->sh_name);
3768 printf ("'%s'", SECTION_NAME (unwsec));
3770 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3771 (unsigned long) unwsec->sh_offset,
3772 (unsigned long) (unwsec->sh_size / (3 * addr_size)));
3774 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
3776 if (aux.table_len > 0)
3777 dump_ia64_unwind (& aux);
3780 free ((char *) aux.table);
3782 free ((char *) aux.info);
3791 free ((char *) aux.strtab);
3797 dynamic_segment_mips_val (entry)
3798 Elf_Internal_Dyn * entry;
3800 switch (entry->d_tag)
3803 if (entry->d_un.d_val == 0)
3807 static const char * opts[] =
3809 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
3810 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
3811 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
3812 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
3817 for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
3818 if (entry->d_un.d_val & (1 << cnt))
3820 printf ("%s%s", first ? "" : " ", opts[cnt]);
3827 case DT_MIPS_IVERSION:
3828 if (dynamic_strings != NULL)
3829 printf ("Interface Version: %s\n",
3830 dynamic_strings + entry->d_un.d_val);
3832 printf ("%ld\n", (long) entry->d_un.d_ptr);
3835 case DT_MIPS_TIME_STAMP:
3840 time_t time = entry->d_un.d_val;
3841 tmp = gmtime (&time);
3842 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
3843 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
3844 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
3845 printf ("Time Stamp: %s\n", timebuf);
3849 case DT_MIPS_RLD_VERSION:
3850 case DT_MIPS_LOCAL_GOTNO:
3851 case DT_MIPS_CONFLICTNO:
3852 case DT_MIPS_LIBLISTNO:
3853 case DT_MIPS_SYMTABNO:
3854 case DT_MIPS_UNREFEXTNO:
3855 case DT_MIPS_HIPAGENO:
3856 case DT_MIPS_DELTA_CLASS_NO:
3857 case DT_MIPS_DELTA_INSTANCE_NO:
3858 case DT_MIPS_DELTA_RELOC_NO:
3859 case DT_MIPS_DELTA_SYM_NO:
3860 case DT_MIPS_DELTA_CLASSSYM_NO:
3861 case DT_MIPS_COMPACT_SIZE:
3862 printf ("%ld\n", (long) entry->d_un.d_ptr);
3866 printf ("%#lx\n", (long) entry->d_un.d_ptr);
3872 dynamic_segment_parisc_val (entry)
3873 Elf_Internal_Dyn * entry;
3875 switch (entry->d_tag)
3877 case DT_HP_DLD_FLAGS:
3886 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
3887 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
3888 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
3889 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
3890 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
3891 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
3892 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
3893 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
3894 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
3895 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
3896 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
3900 bfd_vma val = entry->d_un.d_val;
3902 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
3903 if (val & flags[cnt].bit)
3907 fputs (flags[cnt].str, stdout);
3909 val ^= flags[cnt].bit;
3912 if (val != 0 || first)
3916 print_vma (val, HEX);
3922 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
3928 get_32bit_dynamic_segment (file)
3931 Elf32_External_Dyn * edyn;
3932 Elf_Internal_Dyn * entry;
3935 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr,
3936 dynamic_size, _("dynamic segment"));
3940 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3941 how large this .dynamic is now. We can do this even before the byte
3942 swapping since the DT_NULL tag is recognizable. */
3944 while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
3947 dynamic_segment = (Elf_Internal_Dyn *)
3948 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3950 if (dynamic_segment == NULL)
3952 error (_("Out of memory\n"));
3957 for (i = 0, entry = dynamic_segment;
3961 entry->d_tag = BYTE_GET (edyn [i].d_tag);
3962 entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
3971 get_64bit_dynamic_segment (file)
3974 Elf64_External_Dyn * edyn;
3975 Elf_Internal_Dyn * entry;
3978 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr,
3979 dynamic_size, _("dynamic segment"));
3983 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3984 how large this .dynamic is now. We can do this even before the byte
3985 swapping since the DT_NULL tag is recognizable. */
3987 while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
3990 dynamic_segment = (Elf_Internal_Dyn *)
3991 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3993 if (dynamic_segment == NULL)
3995 error (_("Out of memory\n"));
4000 for (i = 0, entry = dynamic_segment;
4004 entry->d_tag = BYTE_GET8 (edyn [i].d_tag);
4005 entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
4014 get_dynamic_flags (flags)
4017 static char buff [64];
4022 flag = flags & - flags;
4027 case DF_ORIGIN: strcat (buff, "ORIGIN "); break;
4028 case DF_SYMBOLIC: strcat (buff, "SYMBOLIC "); break;
4029 case DF_TEXTREL: strcat (buff, "TEXTREL "); break;
4030 case DF_BIND_NOW: strcat (buff, "BIND_NOW "); break;
4031 default: strcat (buff, "unknown "); break;
4037 /* Parse and display the contents of the dynamic segment. */
4039 process_dynamic_segment (file)
4042 Elf_Internal_Dyn * entry;
4045 if (dynamic_size == 0)
4048 printf (_("\nThere is no dynamic segment in this file.\n"));
4055 if (! get_32bit_dynamic_segment (file))
4058 else if (! get_64bit_dynamic_segment (file))
4061 /* Find the appropriate symbol table. */
4062 if (dynamic_symbols == NULL)
4064 for (i = 0, entry = dynamic_segment;
4068 unsigned long offset;
4070 if (entry->d_tag != DT_SYMTAB)
4073 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
4075 /* Since we do not know how big the symbol table is,
4076 we default to reading in the entire file (!) and
4077 processing that. This is overkill, I know, but it
4079 offset = entry->d_un.d_val - loadaddr;
4081 if (fseek (file, 0, SEEK_END))
4082 error (_("Unable to seek to end of file!"));
4085 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf32_External_Sym);
4087 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf64_External_Sym);
4089 if (num_dynamic_syms < 1)
4091 error (_("Unable to determine the number of symbols to load\n"));
4095 dynamic_symbols = GET_ELF_SYMBOLS (file, offset, num_dynamic_syms);
4099 /* Similarly find a string table. */
4100 if (dynamic_strings == NULL)
4102 for (i = 0, entry = dynamic_segment;
4106 unsigned long offset;
4109 if (entry->d_tag != DT_STRTAB)
4112 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
4114 /* Since we do not know how big the string table is,
4115 we default to reading in the entire file (!) and
4116 processing that. This is overkill, I know, but it
4119 offset = entry->d_un.d_val - loadaddr;
4120 if (fseek (file, 0, SEEK_END))
4121 error (_("Unable to seek to end of file\n"));
4122 str_tab_len = ftell (file) - offset;
4124 if (str_tab_len < 1)
4127 (_("Unable to determine the length of the dynamic string table\n"));
4131 dynamic_strings = (char *) get_data (NULL, file, offset, str_tab_len,
4132 _("dynamic string table"));
4137 /* And find the syminfo section if available. */
4138 if (dynamic_syminfo == NULL)
4140 unsigned int syminsz = 0;
4142 for (i = 0, entry = dynamic_segment;
4146 if (entry->d_tag == DT_SYMINENT)
4148 /* Note: these braces are necessary to avoid a syntax
4149 error from the SunOS4 C compiler. */
4150 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
4152 else if (entry->d_tag == DT_SYMINSZ)
4153 syminsz = entry->d_un.d_val;
4154 else if (entry->d_tag == DT_SYMINFO)
4155 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
4158 if (dynamic_syminfo_offset != 0 && syminsz != 0)
4160 Elf_External_Syminfo * extsyminfo;
4161 Elf_Internal_Syminfo * syminfo;
4163 /* There is a syminfo section. Read the data. */
4164 extsyminfo = ((Elf_External_Syminfo *)
4165 get_data (NULL, file, dynamic_syminfo_offset,
4166 syminsz, _("symbol information")));
4170 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
4171 if (dynamic_syminfo == NULL)
4173 error (_("Out of memory\n"));
4177 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
4178 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
4181 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
4182 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
4189 if (do_dynamic && dynamic_addr)
4190 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
4191 dynamic_addr, (long) dynamic_size);
4193 printf (_(" Tag Type Name/Value\n"));
4195 for (i = 0, entry = dynamic_segment;
4204 print_vma (entry->d_tag, FULL_HEX);
4205 dtype = get_dynamic_type (entry->d_tag);
4206 printf (" (%s)%*s", dtype,
4207 ((is_32bit_elf ? 27 : 19)
4208 - (int) strlen (dtype)),
4212 switch (entry->d_tag)
4216 printf ("%s", get_dynamic_flags (entry->d_un.d_val));
4226 switch (entry->d_tag)
4229 printf (_("Auxiliary library"));
4233 printf (_("Filter library"));
4237 printf (_("Configuration file"));
4241 printf (_("Dependency audit library"));
4245 printf (_("Audit library"));
4249 if (dynamic_strings)
4250 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
4254 print_vma (entry->d_un.d_val, PREFIX_HEX);
4263 printf (_("Flags:"));
4264 if (entry->d_un.d_val == 0)
4265 printf (_(" None\n"));
4268 unsigned long int val = entry->d_un.d_val;
4269 if (val & DTF_1_PARINIT)
4271 printf (" PARINIT");
4272 val ^= DTF_1_PARINIT;
4274 if (val & DTF_1_CONFEXP)
4276 printf (" CONFEXP");
4277 val ^= DTF_1_CONFEXP;
4280 printf (" %lx", val);
4289 printf (_("Flags:"));
4290 if (entry->d_un.d_val == 0)
4291 printf (_(" None\n"));
4294 unsigned long int val = entry->d_un.d_val;
4295 if (val & DF_P1_LAZYLOAD)
4297 printf (" LAZYLOAD");
4298 val ^= DF_P1_LAZYLOAD;
4300 if (val & DF_P1_GROUPPERM)
4302 printf (" GROUPPERM");
4303 val ^= DF_P1_GROUPPERM;
4306 printf (" %lx", val);
4315 printf (_("Flags:"));
4316 if (entry->d_un.d_val == 0)
4317 printf (_(" None\n"));
4320 unsigned long int val = entry->d_un.d_val;
4326 if (val & DF_1_GLOBAL)
4331 if (val & DF_1_GROUP)
4336 if (val & DF_1_NODELETE)
4338 printf (" NODELETE");
4339 val ^= DF_1_NODELETE;
4341 if (val & DF_1_LOADFLTR)
4343 printf (" LOADFLTR");
4344 val ^= DF_1_LOADFLTR;
4346 if (val & DF_1_INITFIRST)
4348 printf (" INITFIRST");
4349 val ^= DF_1_INITFIRST;
4351 if (val & DF_1_NOOPEN)
4356 if (val & DF_1_ORIGIN)
4361 if (val & DF_1_DIRECT)
4366 if (val & DF_1_TRANS)
4371 if (val & DF_1_INTERPOSE)
4373 printf (" INTERPOSE");
4374 val ^= DF_1_INTERPOSE;
4376 if (val & DF_1_NODEFLIB)
4378 printf (" NODEFLIB");
4379 val ^= DF_1_NODEFLIB;
4381 if (val & DF_1_NODUMP)
4386 if (val & DF_1_CONLFAT)
4388 printf (" CONLFAT");
4389 val ^= DF_1_CONLFAT;
4392 printf (" %lx", val);
4400 puts (get_dynamic_type (entry->d_un.d_val));
4420 dynamic_info[entry->d_tag] = entry->d_un.d_val;
4426 if (dynamic_strings == NULL)
4429 name = dynamic_strings + entry->d_un.d_val;
4433 switch (entry->d_tag)
4436 printf (_("Shared library: [%s]"), name);
4438 if (strcmp (name, program_interpreter) == 0)
4439 printf (_(" program interpreter"));
4443 printf (_("Library soname: [%s]"), name);
4447 printf (_("Library rpath: [%s]"), name);
4451 printf (_("Library runpath: [%s]"), name);
4455 print_vma (entry->d_un.d_val, PREFIX_HEX);
4460 print_vma (entry->d_un.d_val, PREFIX_HEX);
4476 case DT_INIT_ARRAYSZ:
4477 case DT_FINI_ARRAYSZ:
4480 print_vma (entry->d_un.d_val, UNSIGNED);
4481 printf (" (bytes)\n");
4491 print_vma (entry->d_un.d_val, UNSIGNED);
4504 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
4508 name = dynamic_strings + entry->d_un.d_val;
4512 printf (_("Not needed object: [%s]\n"), name);
4517 print_vma (entry->d_un.d_val, PREFIX_HEX);
4523 /* The value of this entry is ignored. */
4527 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
4528 version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
4533 switch (elf_header.e_machine)
4536 case EM_MIPS_RS3_LE:
4537 dynamic_segment_mips_val (entry);
4540 dynamic_segment_parisc_val (entry);
4543 print_vma (entry->d_un.d_val, PREFIX_HEX);
4555 get_ver_flags (flags)
4558 static char buff [32];
4565 if (flags & VER_FLG_BASE)
4566 strcat (buff, "BASE ");
4568 if (flags & VER_FLG_WEAK)
4570 if (flags & VER_FLG_BASE)
4571 strcat (buff, "| ");
4573 strcat (buff, "WEAK ");
4576 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
4577 strcat (buff, "| <unknown>");
4582 /* Display the contents of the version sections. */
4584 process_version_sections (file)
4587 Elf32_Internal_Shdr * section;
4594 for (i = 0, section = section_headers;
4595 i < elf_header.e_shnum;
4598 switch (section->sh_type)
4600 case SHT_GNU_verdef:
4602 Elf_External_Verdef * edefs;
4609 (_("\nVersion definition section '%s' contains %ld entries:\n"),
4610 SECTION_NAME (section), section->sh_info);
4612 printf (_(" Addr: 0x"));
4613 printf_vma (section->sh_addr);
4614 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4615 (unsigned long) section->sh_offset, section->sh_link,
4616 SECTION_NAME (section_headers + section->sh_link));
4618 edefs = ((Elf_External_Verdef *)
4619 get_data (NULL, file, section->sh_offset,
4621 _("version definition section")));
4625 for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
4628 Elf_External_Verdef * edef;
4629 Elf_Internal_Verdef ent;
4630 Elf_External_Verdaux * eaux;
4631 Elf_Internal_Verdaux aux;
4635 vstart = ((char *) edefs) + idx;
4637 edef = (Elf_External_Verdef *) vstart;
4639 ent.vd_version = BYTE_GET (edef->vd_version);
4640 ent.vd_flags = BYTE_GET (edef->vd_flags);
4641 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
4642 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
4643 ent.vd_hash = BYTE_GET (edef->vd_hash);
4644 ent.vd_aux = BYTE_GET (edef->vd_aux);
4645 ent.vd_next = BYTE_GET (edef->vd_next);
4647 printf (_(" %#06x: Rev: %d Flags: %s"),
4648 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
4650 printf (_(" Index: %d Cnt: %d "),
4651 ent.vd_ndx, ent.vd_cnt);
4653 vstart += ent.vd_aux;
4655 eaux = (Elf_External_Verdaux *) vstart;
4657 aux.vda_name = BYTE_GET (eaux->vda_name);
4658 aux.vda_next = BYTE_GET (eaux->vda_next);
4660 if (dynamic_strings)
4661 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
4663 printf (_("Name index: %ld\n"), aux.vda_name);
4665 isum = idx + ent.vd_aux;
4667 for (j = 1; j < ent.vd_cnt; j ++)
4669 isum += aux.vda_next;
4670 vstart += aux.vda_next;
4672 eaux = (Elf_External_Verdaux *) vstart;
4674 aux.vda_name = BYTE_GET (eaux->vda_name);
4675 aux.vda_next = BYTE_GET (eaux->vda_next);
4677 if (dynamic_strings)
4678 printf (_(" %#06x: Parent %d: %s\n"),
4679 isum, j, dynamic_strings + aux.vda_name);
4681 printf (_(" %#06x: Parent %d, name index: %ld\n"),
4682 isum, j, aux.vda_name);
4692 case SHT_GNU_verneed:
4694 Elf_External_Verneed * eneed;
4700 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
4701 SECTION_NAME (section), section->sh_info);
4703 printf (_(" Addr: 0x"));
4704 printf_vma (section->sh_addr);
4705 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
4706 (unsigned long) section->sh_offset, section->sh_link,
4707 SECTION_NAME (section_headers + section->sh_link));
4709 eneed = ((Elf_External_Verneed *)
4710 get_data (NULL, file, section->sh_offset,
4711 section->sh_size, _("version need section")));
4715 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
4717 Elf_External_Verneed * entry;
4718 Elf_Internal_Verneed ent;
4723 vstart = ((char *) eneed) + idx;
4725 entry = (Elf_External_Verneed *) vstart;
4727 ent.vn_version = BYTE_GET (entry->vn_version);
4728 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
4729 ent.vn_file = BYTE_GET (entry->vn_file);
4730 ent.vn_aux = BYTE_GET (entry->vn_aux);
4731 ent.vn_next = BYTE_GET (entry->vn_next);
4733 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
4735 if (dynamic_strings)
4736 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
4738 printf (_(" File: %lx"), ent.vn_file);
4740 printf (_(" Cnt: %d\n"), ent.vn_cnt);
4742 vstart += ent.vn_aux;
4744 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
4746 Elf_External_Vernaux * eaux;
4747 Elf_Internal_Vernaux aux;
4749 eaux = (Elf_External_Vernaux *) vstart;
4751 aux.vna_hash = BYTE_GET (eaux->vna_hash);
4752 aux.vna_flags = BYTE_GET (eaux->vna_flags);
4753 aux.vna_other = BYTE_GET (eaux->vna_other);
4754 aux.vna_name = BYTE_GET (eaux->vna_name);
4755 aux.vna_next = BYTE_GET (eaux->vna_next);
4757 if (dynamic_strings)
4758 printf (_(" %#06x: Name: %s"),
4759 isum, dynamic_strings + aux.vna_name);
4761 printf (_(" %#06x: Name index: %lx"),
4762 isum, aux.vna_name);
4764 printf (_(" Flags: %s Version: %d\n"),
4765 get_ver_flags (aux.vna_flags), aux.vna_other);
4767 isum += aux.vna_next;
4768 vstart += aux.vna_next;
4778 case SHT_GNU_versym:
4780 Elf32_Internal_Shdr * link_section;
4783 unsigned char * edata;
4784 unsigned short * data;
4786 Elf_Internal_Sym * symbols;
4787 Elf32_Internal_Shdr * string_sec;
4789 link_section = section_headers + section->sh_link;
4790 total = section->sh_size / section->sh_entsize;
4794 symbols = GET_ELF_SYMBOLS (file, link_section->sh_offset,
4795 link_section->sh_size / link_section->sh_entsize);
4797 string_sec = section_headers + link_section->sh_link;
4799 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
4800 string_sec->sh_size,
4801 _("version string table"));
4805 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
4806 SECTION_NAME (section), total);
4808 printf (_(" Addr: "));
4809 printf_vma (section->sh_addr);
4810 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4811 (unsigned long) section->sh_offset, section->sh_link,
4812 SECTION_NAME (link_section));
4816 get_data (NULL, file,
4817 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] - loadaddr,
4818 total * sizeof (short), _("version symbol data")));
4825 data = (unsigned short *) malloc (total * sizeof (short));
4827 for (cnt = total; cnt --;)
4828 data [cnt] = byte_get (edata + cnt * sizeof (short),
4833 for (cnt = 0; cnt < total; cnt += 4)
4836 int check_def, check_need;
4839 printf (" %03x:", cnt);
4841 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
4842 switch (data [cnt + j])
4845 fputs (_(" 0 (*local*) "), stdout);
4849 fputs (_(" 1 (*global*) "), stdout);
4853 nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
4854 data [cnt + j] & 0x8000 ? 'h' : ' ');
4858 if (symbols [cnt + j].st_shndx >= SHN_LORESERVE
4859 || section_headers[symbols [cnt + j].st_shndx].sh_type
4862 if (symbols [cnt + j].st_shndx == SHN_UNDEF)
4869 && version_info [DT_VERSIONTAGIDX (DT_VERNEED)])
4871 Elf_Internal_Verneed ivn;
4872 unsigned long offset;
4874 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
4879 Elf_Internal_Vernaux ivna;
4880 Elf_External_Verneed evn;
4881 Elf_External_Vernaux evna;
4882 unsigned long a_off;
4884 get_data (&evn, file, offset, sizeof (evn),
4887 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4888 ivn.vn_next = BYTE_GET (evn.vn_next);
4890 a_off = offset + ivn.vn_aux;
4894 get_data (&evna, file, a_off, sizeof (evna),
4895 _("version need aux (2)"));
4897 ivna.vna_next = BYTE_GET (evna.vna_next);
4898 ivna.vna_other = BYTE_GET (evna.vna_other);
4900 a_off += ivna.vna_next;
4902 while (ivna.vna_other != data [cnt + j]
4903 && ivna.vna_next != 0);
4905 if (ivna.vna_other == data [cnt + j])
4907 ivna.vna_name = BYTE_GET (evna.vna_name);
4909 name = strtab + ivna.vna_name;
4910 nn += printf ("(%s%-*s",
4912 12 - (int) strlen (name),
4918 offset += ivn.vn_next;
4920 while (ivn.vn_next);
4923 if (check_def && data [cnt + j] != 0x8001
4924 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
4926 Elf_Internal_Verdef ivd;
4927 Elf_External_Verdef evd;
4928 unsigned long offset;
4930 offset = version_info
4931 [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
4935 get_data (&evd, file, offset, sizeof (evd),
4938 ivd.vd_next = BYTE_GET (evd.vd_next);
4939 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4941 offset += ivd.vd_next;
4943 while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
4944 && ivd.vd_next != 0);
4946 if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
4948 Elf_External_Verdaux evda;
4949 Elf_Internal_Verdaux ivda;
4951 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4953 get_data (&evda, file,
4954 offset - ivd.vd_next + ivd.vd_aux,
4955 sizeof (evda), _("version def aux"));
4957 ivda.vda_name = BYTE_GET (evda.vda_name);
4959 name = strtab + ivda.vda_name;
4960 nn += printf ("(%s%-*s",
4962 12 - (int) strlen (name),
4968 printf ("%*c", 18 - nn, ' ');
4986 printf (_("\nNo version information found in this file.\n"));
4992 get_symbol_binding (binding)
4993 unsigned int binding;
4995 static char buff [32];
4999 case STB_LOCAL: return "LOCAL";
5000 case STB_GLOBAL: return "GLOBAL";
5001 case STB_WEAK: return "WEAK";
5003 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
5004 sprintf (buff, _("<processor specific>: %d"), binding);
5005 else if (binding >= STB_LOOS && binding <= STB_HIOS)
5006 sprintf (buff, _("<OS specific>: %d"), binding);
5008 sprintf (buff, _("<unknown>: %d"), binding);
5014 get_symbol_type (type)
5017 static char buff [32];
5021 case STT_NOTYPE: return "NOTYPE";
5022 case STT_OBJECT: return "OBJECT";
5023 case STT_FUNC: return "FUNC";
5024 case STT_SECTION: return "SECTION";
5025 case STT_FILE: return "FILE";
5026 case STT_COMMON: return "COMMON";
5028 if (type >= STT_LOPROC && type <= STT_HIPROC)
5030 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
5031 return "THUMB_FUNC";
5033 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
5036 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
5037 return "PARISC_MILLI";
5039 sprintf (buff, _("<processor specific>: %d"), type);
5041 else if (type >= STT_LOOS && type <= STT_HIOS)
5043 if (elf_header.e_machine == EM_PARISC)
5045 if (type == STT_HP_OPAQUE)
5047 if (type == STT_HP_STUB)
5051 sprintf (buff, _("<OS specific>: %d"), type);
5054 sprintf (buff, _("<unknown>: %d"), type);
5060 get_symbol_visibility (visibility)
5061 unsigned int visibility;
5065 case STV_DEFAULT: return "DEFAULT";
5066 case STV_INTERNAL: return "INTERNAL";
5067 case STV_HIDDEN: return "HIDDEN";
5068 case STV_PROTECTED: return "PROTECTED";
5074 get_symbol_index_type (type)
5079 case SHN_UNDEF: return "UND";
5080 case SHN_ABS: return "ABS";
5081 case SHN_COMMON: return "COM";
5083 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
5085 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
5087 else if (type >= SHN_LOOS && type <= SHN_HIOS)
5091 static char buff [32];
5093 sprintf (buff, "%3d", type);
5100 get_dynamic_data (file, number)
5102 unsigned int number;
5104 unsigned char * e_data;
5107 e_data = (unsigned char *) malloc (number * 4);
5111 error (_("Out of memory\n"));
5115 if (fread (e_data, 4, number, file) != number)
5117 error (_("Unable to read in dynamic data\n"));
5121 i_data = (int *) malloc (number * sizeof (* i_data));
5125 error (_("Out of memory\n"));
5131 i_data [number] = byte_get (e_data + number * 4, 4);
5138 /* Dump the symbol table. */
5140 process_symbol_table (file)
5143 Elf32_Internal_Shdr * section;
5144 unsigned char nb [4];
5145 unsigned char nc [4];
5148 int * buckets = NULL;
5149 int * chains = NULL;
5151 if (! do_syms && !do_histogram)
5154 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
5157 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
5159 error (_("Unable to seek to start of dynamic information"));
5163 if (fread (nb, sizeof (nb), 1, file) != 1)
5165 error (_("Failed to read in number of buckets\n"));
5169 if (fread (nc, sizeof (nc), 1, file) != 1)
5171 error (_("Failed to read in number of chains\n"));
5175 nbuckets = byte_get (nb, 4);
5176 nchains = byte_get (nc, 4);
5178 buckets = get_dynamic_data (file, nbuckets);
5179 chains = get_dynamic_data (file, nchains);
5181 if (buckets == NULL || chains == NULL)
5186 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
5191 printf (_("\nSymbol table for image:\n"));
5193 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5195 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5197 for (hn = 0; hn < nbuckets; hn++)
5202 for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
5204 Elf_Internal_Sym * psym;
5206 psym = dynamic_symbols + si;
5208 printf (" %3d %3d: ", si, hn);
5209 print_vma (psym->st_value, LONG_HEX);
5211 print_vma (psym->st_size, DEC_5);
5213 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5214 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5215 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5216 printf (" %3.3s", get_symbol_index_type (psym->st_shndx));
5217 printf (" %s\n", dynamic_strings + psym->st_name);
5221 else if (do_syms && !do_using_dynamic)
5225 for (i = 0, section = section_headers;
5226 i < elf_header.e_shnum;
5231 Elf_Internal_Sym * symtab;
5232 Elf_Internal_Sym * psym;
5235 if ( section->sh_type != SHT_SYMTAB
5236 && section->sh_type != SHT_DYNSYM)
5239 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5240 SECTION_NAME (section),
5241 (unsigned long) (section->sh_size / section->sh_entsize));
5243 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5245 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5247 symtab = GET_ELF_SYMBOLS (file, section->sh_offset,
5248 section->sh_size / section->sh_entsize);
5252 if (section->sh_link == elf_header.e_shstrndx)
5253 strtab = string_table;
5256 Elf32_Internal_Shdr * string_sec;
5258 string_sec = section_headers + section->sh_link;
5260 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5261 string_sec->sh_size,
5265 for (si = 0, psym = symtab;
5266 si < section->sh_size / section->sh_entsize;
5269 printf ("%6d: ", si);
5270 print_vma (psym->st_value, LONG_HEX);
5272 print_vma (psym->st_size, DEC_5);
5273 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5274 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5275 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5276 printf (" %4s", get_symbol_index_type (psym->st_shndx));
5277 printf (" %s", strtab + psym->st_name);
5279 if (section->sh_type == SHT_DYNSYM &&
5280 version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
5282 unsigned char data[2];
5283 unsigned short vers_data;
5284 unsigned long offset;
5288 offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
5291 get_data (&data, file, offset + si * sizeof (vers_data),
5292 sizeof (data), _("version data"));
5294 vers_data = byte_get (data, 2);
5296 is_nobits = psym->st_shndx < SHN_LORESERVE ?
5297 (section_headers [psym->st_shndx].sh_type == SHT_NOBITS)
5300 check_def = (psym->st_shndx != SHN_UNDEF);
5302 if ((vers_data & 0x8000) || vers_data > 1)
5304 if (version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
5305 && (is_nobits || ! check_def))
5307 Elf_External_Verneed evn;
5308 Elf_Internal_Verneed ivn;
5309 Elf_Internal_Vernaux ivna;
5311 /* We must test both. */
5312 offset = version_info
5313 [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
5317 unsigned long vna_off;
5319 get_data (&evn, file, offset, sizeof (evn),
5322 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5323 ivn.vn_next = BYTE_GET (evn.vn_next);
5325 vna_off = offset + ivn.vn_aux;
5329 Elf_External_Vernaux evna;
5331 get_data (&evna, file, vna_off,
5333 _("version need aux (3)"));
5335 ivna.vna_other = BYTE_GET (evna.vna_other);
5336 ivna.vna_next = BYTE_GET (evna.vna_next);
5337 ivna.vna_name = BYTE_GET (evna.vna_name);
5339 vna_off += ivna.vna_next;
5341 while (ivna.vna_other != vers_data
5342 && ivna.vna_next != 0);
5344 if (ivna.vna_other == vers_data)
5347 offset += ivn.vn_next;
5349 while (ivn.vn_next != 0);
5351 if (ivna.vna_other == vers_data)
5354 strtab + ivna.vna_name, ivna.vna_other);
5357 else if (! is_nobits)
5358 error (_("bad dynamic symbol"));
5365 if (vers_data != 0x8001
5366 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
5368 Elf_Internal_Verdef ivd;
5369 Elf_Internal_Verdaux ivda;
5370 Elf_External_Verdaux evda;
5371 unsigned long offset;
5374 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
5379 Elf_External_Verdef evd;
5381 get_data (&evd, file, offset, sizeof (evd),
5384 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5385 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5386 ivd.vd_next = BYTE_GET (evd.vd_next);
5388 offset += ivd.vd_next;
5390 while (ivd.vd_ndx != (vers_data & 0x7fff)
5391 && ivd.vd_next != 0);
5393 offset -= ivd.vd_next;
5394 offset += ivd.vd_aux;
5396 get_data (&evda, file, offset, sizeof (evda),
5397 _("version def aux"));
5399 ivda.vda_name = BYTE_GET (evda.vda_name);
5401 if (psym->st_name != ivda.vda_name)
5402 printf ((vers_data & 0x8000)
5404 strtab + ivda.vda_name);
5414 if (strtab != string_table)
5420 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5422 if (do_histogram && buckets != NULL)
5429 int nzero_counts = 0;
5432 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5434 printf (_(" Length Number %% of total Coverage\n"));
5436 lengths = (int *) calloc (nbuckets, sizeof (int));
5437 if (lengths == NULL)
5439 error (_("Out of memory"));
5442 for (hn = 0; hn < nbuckets; ++hn)
5447 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
5450 if (maxlength < ++lengths[hn])
5455 counts = (int *) calloc (maxlength + 1, sizeof (int));
5458 error (_("Out of memory"));
5462 for (hn = 0; hn < nbuckets; ++hn)
5463 ++ counts [lengths [hn]];
5467 printf (" 0 %-10d (%5.1f%%)\n",
5468 counts[0], (counts[0] * 100.0) / nbuckets);
5469 for (si = 1; si <= maxlength; ++si)
5471 nzero_counts += counts[si] * si;
5472 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5473 si, counts[si], (counts[si] * 100.0) / nbuckets,
5474 (nzero_counts * 100.0) / nsyms);
5482 if (buckets != NULL)
5492 process_syminfo (file)
5493 FILE * file ATTRIBUTE_UNUSED;
5497 if (dynamic_syminfo == NULL
5499 /* No syminfo, this is ok. */
5502 /* There better should be a dynamic symbol section. */
5503 if (dynamic_symbols == NULL || dynamic_strings == NULL)
5507 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5508 dynamic_syminfo_offset, dynamic_syminfo_nent);
5510 printf (_(" Num: Name BoundTo Flags\n"));
5511 for (i = 0; i < dynamic_syminfo_nent; ++i)
5513 unsigned short int flags = dynamic_syminfo[i].si_flags;
5515 printf ("%4d: %-30s ", i,
5516 dynamic_strings + dynamic_symbols[i].st_name);
5518 switch (dynamic_syminfo[i].si_boundto)
5520 case SYMINFO_BT_SELF:
5521 fputs ("SELF ", stdout);
5523 case SYMINFO_BT_PARENT:
5524 fputs ("PARENT ", stdout);
5527 if (dynamic_syminfo[i].si_boundto > 0
5528 && dynamic_syminfo[i].si_boundto < dynamic_size)
5531 + dynamic_segment[dynamic_syminfo[i].si_boundto].d_un.d_val);
5533 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
5537 if (flags & SYMINFO_FLG_DIRECT)
5539 if (flags & SYMINFO_FLG_PASSTHRU)
5540 printf (" PASSTHRU");
5541 if (flags & SYMINFO_FLG_COPY)
5543 if (flags & SYMINFO_FLG_LAZYLOAD)
5544 printf (" LAZYLOAD");
5552 #ifdef SUPPORT_DISASSEMBLY
5554 disassemble_section (section, file)
5555 Elf32_Internal_Shdr * section;
5558 printf (_("\nAssembly dump of section %s\n"),
5559 SECTION_NAME (section));
5561 /* XXX -- to be done --- XXX */
5568 dump_section (section, file)
5569 Elf32_Internal_Shdr * section;
5572 bfd_size_type bytes;
5574 unsigned char * data;
5575 unsigned char * start;
5577 bytes = section->sh_size;
5581 printf (_("\nSection '%s' has no data to dump.\n"),
5582 SECTION_NAME (section));
5586 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
5588 addr = section->sh_addr;
5590 start = (unsigned char *) get_data (NULL, file, section->sh_offset, bytes,
5603 lbytes = (bytes > 16 ? 16 : bytes);
5605 printf (" 0x%8.8lx ", (unsigned long) addr);
5607 switch (elf_header.e_ident [EI_DATA])
5611 for (j = 15; j >= 0; j --)
5614 printf ("%2.2x", data [j]);
5624 for (j = 0; j < 16; j++)
5627 printf ("%2.2x", data [j]);
5637 for (j = 0; j < lbytes; j++)
5640 if (k >= ' ' && k < 0x80)
5659 static unsigned long int
5660 read_leb128 (data, length_return, sign)
5661 unsigned char * data;
5662 int * length_return;
5665 unsigned long int result = 0;
5666 unsigned int num_read = 0;
5675 result |= (byte & 0x7f) << shift;
5680 while (byte & 0x80);
5682 if (length_return != NULL)
5683 * length_return = num_read;
5685 if (sign && (shift < 32) && (byte & 0x40))
5686 result |= -1 << shift;
5691 typedef struct State_Machine_Registers
5693 unsigned long address;
5696 unsigned int column;
5700 /* This variable hold the number of the last entry seen
5701 in the File Table. */
5702 unsigned int last_file_entry;
5705 static SMR state_machine_regs;
5708 reset_state_machine (is_stmt)
5711 state_machine_regs.address = 0;
5712 state_machine_regs.file = 1;
5713 state_machine_regs.line = 1;
5714 state_machine_regs.column = 0;
5715 state_machine_regs.is_stmt = is_stmt;
5716 state_machine_regs.basic_block = 0;
5717 state_machine_regs.end_sequence = 0;
5718 state_machine_regs.last_file_entry = 0;
5721 /* Handled an extend line op. Returns true if this is the end
5724 process_extended_line_op (data, is_stmt, pointer_size)
5725 unsigned char * data;
5729 unsigned char op_code;
5732 unsigned char * name;
5735 len = read_leb128 (data, & bytes_read, 0);
5740 warn (_("badly formed extended line op encountered!\n"));
5745 op_code = * data ++;
5747 printf (_(" Extended opcode %d: "), op_code);
5751 case DW_LNE_end_sequence:
5752 printf (_("End of Sequence\n\n"));
5753 reset_state_machine (is_stmt);
5756 case DW_LNE_set_address:
5757 adr = byte_get (data, pointer_size);
5758 printf (_("set Address to 0x%lx\n"), adr);
5759 state_machine_regs.address = adr;
5762 case DW_LNE_define_file:
5763 printf (_(" define new File Table entry\n"));
5764 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5766 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5768 data += strlen ((char *) data) + 1;
5769 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5771 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5773 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5774 printf (_("%s\n\n"), name);
5778 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
5785 /* Size of pointers in the .debug_line section. This information is not
5786 really present in that section. It's obtained before dumping the debug
5787 sections by doing some pre-scan of the .debug_info section. */
5788 static int debug_line_pointer_size = 4;
5791 display_debug_lines (section, start, file)
5792 Elf32_Internal_Shdr * section;
5793 unsigned char * start;
5794 FILE * file ATTRIBUTE_UNUSED;
5796 DWARF2_External_LineInfo * external;
5797 DWARF2_Internal_LineInfo info;
5798 unsigned char * standard_opcodes;
5799 unsigned char * data = start;
5800 unsigned char * end = start + section->sh_size;
5801 unsigned char * end_of_sequence;
5804 printf (_("\nDump of debug contents of section %s:\n\n"),
5805 SECTION_NAME (section));
5809 external = (DWARF2_External_LineInfo *) data;
5811 /* Check the length of the block. */
5812 info.li_length = BYTE_GET (external->li_length);
5814 if (info.li_length == 0xffffffff)
5816 warn (_("64-bit DWARF line info is not supported yet.\n"));
5820 if (info.li_length + sizeof (external->li_length) > section->sh_size)
5823 (_("The line info appears to be corrupt - the section is too small\n"));
5827 /* Check its version number. */
5828 info.li_version = BYTE_GET (external->li_version);
5829 if (info.li_version != 2)
5831 warn (_("Only DWARF version 2 line info is currently supported.\n"));
5835 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
5836 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
5837 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
5838 info.li_line_base = BYTE_GET (external->li_line_base);
5839 info.li_line_range = BYTE_GET (external->li_line_range);
5840 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
5842 /* Sign extend the line base field. */
5843 info.li_line_base <<= 24;
5844 info.li_line_base >>= 24;
5846 printf (_(" Length: %ld\n"), info.li_length);
5847 printf (_(" DWARF Version: %d\n"), info.li_version);
5848 printf (_(" Prologue Length: %d\n"), info.li_prologue_length);
5849 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
5850 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
5851 printf (_(" Line Base: %d\n"), info.li_line_base);
5852 printf (_(" Line Range: %d\n"), info.li_line_range);
5853 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
5855 end_of_sequence = data + info.li_length + sizeof (external->li_length);
5857 reset_state_machine (info.li_default_is_stmt);
5859 /* Display the contents of the Opcodes table. */
5860 standard_opcodes = data + sizeof (* external);
5862 printf (_("\n Opcodes:\n"));
5864 for (i = 1; i < info.li_opcode_base; i++)
5865 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
5867 /* Display the contents of the Directory table. */
5868 data = standard_opcodes + info.li_opcode_base - 1;
5871 printf (_("\n The Directory Table is empty.\n"));
5874 printf (_("\n The Directory Table:\n"));
5878 printf (_(" %s\n"), data);
5880 data += strlen ((char *) data) + 1;
5884 /* Skip the NUL at the end of the table. */
5887 /* Display the contents of the File Name table. */
5889 printf (_("\n The File Name Table is empty.\n"));
5892 printf (_("\n The File Name Table:\n"));
5893 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5897 unsigned char * name;
5900 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5903 data += strlen ((char *) data) + 1;
5905 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5907 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5909 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5911 printf (_("%s\n"), name);
5915 /* Skip the NUL at the end of the table. */
5918 /* Now display the statements. */
5919 printf (_("\n Line Number Statements:\n"));
5922 while (data < end_of_sequence)
5924 unsigned char op_code;
5928 op_code = * data ++;
5930 if (op_code >= info.li_opcode_base)
5932 op_code -= info.li_opcode_base;
5933 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
5934 state_machine_regs.address += adv;
5935 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
5936 op_code, adv, state_machine_regs.address);
5937 adv = (op_code % info.li_line_range) + info.li_line_base;
5938 state_machine_regs.line += adv;
5939 printf (_(" and Line by %d to %d\n"),
5940 adv, state_machine_regs.line);
5942 else switch (op_code)
5944 case DW_LNS_extended_op:
5945 data += process_extended_line_op (data, info.li_default_is_stmt,
5946 debug_line_pointer_size);
5950 printf (_(" Copy\n"));
5953 case DW_LNS_advance_pc:
5954 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
5956 state_machine_regs.address += adv;
5957 printf (_(" Advance PC by %d to %lx\n"), adv,
5958 state_machine_regs.address);
5961 case DW_LNS_advance_line:
5962 adv = read_leb128 (data, & bytes_read, 1);
5964 state_machine_regs.line += adv;
5965 printf (_(" Advance Line by %d to %d\n"), adv,
5966 state_machine_regs.line);
5969 case DW_LNS_set_file:
5970 adv = read_leb128 (data, & bytes_read, 0);
5972 printf (_(" Set File Name to entry %d in the File Name Table\n"),
5974 state_machine_regs.file = adv;
5977 case DW_LNS_set_column:
5978 adv = read_leb128 (data, & bytes_read, 0);
5980 printf (_(" Set column to %d\n"), adv);
5981 state_machine_regs.column = adv;
5984 case DW_LNS_negate_stmt:
5985 adv = state_machine_regs.is_stmt;
5987 printf (_(" Set is_stmt to %d\n"), adv);
5988 state_machine_regs.is_stmt = adv;
5991 case DW_LNS_set_basic_block:
5992 printf (_(" Set basic block\n"));
5993 state_machine_regs.basic_block = 1;
5996 case DW_LNS_const_add_pc:
5997 adv = (((255 - info.li_opcode_base) / info.li_line_range)
5998 * info.li_min_insn_length);
5999 state_machine_regs.address += adv;
6000 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
6001 state_machine_regs.address);
6004 case DW_LNS_fixed_advance_pc:
6005 adv = byte_get (data, 2);
6007 state_machine_regs.address += adv;
6008 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6009 adv, state_machine_regs.address);
6012 case DW_LNS_set_prologue_end:
6013 printf (_(" Set prologue_end to true\n"));
6016 case DW_LNS_set_epilogue_begin:
6017 printf (_(" Set epilogue_begin to true\n"));
6020 case DW_LNS_set_isa:
6021 adv = read_leb128 (data, & bytes_read, 0);
6023 printf (_(" Set ISA to %d\n"), adv);
6027 printf (_(" Unknown opcode %d with operands: "), op_code);
6030 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
6032 printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
6033 i == 1 ? "" : ", ");
6048 display_debug_pubnames (section, start, file)
6049 Elf32_Internal_Shdr * section;
6050 unsigned char * start;
6051 FILE * file ATTRIBUTE_UNUSED;
6053 DWARF2_External_PubNames * external;
6054 DWARF2_Internal_PubNames pubnames;
6055 unsigned char * end;
6057 end = start + section->sh_size;
6059 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6063 unsigned char * data;
6064 unsigned long offset;
6066 external = (DWARF2_External_PubNames *) start;
6068 pubnames.pn_length = BYTE_GET (external->pn_length);
6069 pubnames.pn_version = BYTE_GET (external->pn_version);
6070 pubnames.pn_offset = BYTE_GET (external->pn_offset);
6071 pubnames.pn_size = BYTE_GET (external->pn_size);
6073 data = start + sizeof (* external);
6074 start += pubnames.pn_length + sizeof (external->pn_length);
6076 if (pubnames.pn_length == 0xffffffff)
6078 warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6082 if (pubnames.pn_version != 2)
6084 static int warned = 0;
6088 warn (_("Only DWARF 2 pubnames are currently supported\n"));
6095 printf (_(" Length: %ld\n"),
6096 pubnames.pn_length);
6097 printf (_(" Version: %d\n"),
6098 pubnames.pn_version);
6099 printf (_(" Offset into .debug_info section: %ld\n"),
6100 pubnames.pn_offset);
6101 printf (_(" Size of area in .debug_info section: %ld\n"),
6104 printf (_("\n Offset\tName\n"));
6108 offset = byte_get (data, 4);
6113 printf (" %ld\t\t%s\n", offset, data);
6114 data += strlen ((char *) data) + 1;
6117 while (offset != 0);
6130 case DW_TAG_padding: return "DW_TAG_padding";
6131 case DW_TAG_array_type: return "DW_TAG_array_type";
6132 case DW_TAG_class_type: return "DW_TAG_class_type";
6133 case DW_TAG_entry_point: return "DW_TAG_entry_point";
6134 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
6135 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
6136 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
6137 case DW_TAG_label: return "DW_TAG_label";
6138 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
6139 case DW_TAG_member: return "DW_TAG_member";
6140 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
6141 case DW_TAG_reference_type: return "DW_TAG_reference_type";
6142 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
6143 case DW_TAG_string_type: return "DW_TAG_string_type";
6144 case DW_TAG_structure_type: return "DW_TAG_structure_type";
6145 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
6146 case DW_TAG_typedef: return "DW_TAG_typedef";
6147 case DW_TAG_union_type: return "DW_TAG_union_type";
6148 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
6149 case DW_TAG_variant: return "DW_TAG_variant";
6150 case DW_TAG_common_block: return "DW_TAG_common_block";
6151 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
6152 case DW_TAG_inheritance: return "DW_TAG_inheritance";
6153 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
6154 case DW_TAG_module: return "DW_TAG_module";
6155 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
6156 case DW_TAG_set_type: return "DW_TAG_set_type";
6157 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
6158 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
6159 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
6160 case DW_TAG_base_type: return "DW_TAG_base_type";
6161 case DW_TAG_catch_block: return "DW_TAG_catch_block";
6162 case DW_TAG_const_type: return "DW_TAG_const_type";
6163 case DW_TAG_constant: return "DW_TAG_constant";
6164 case DW_TAG_enumerator: return "DW_TAG_enumerator";
6165 case DW_TAG_file_type: return "DW_TAG_file_type";
6166 case DW_TAG_friend: return "DW_TAG_friend";
6167 case DW_TAG_namelist: return "DW_TAG_namelist";
6168 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
6169 case DW_TAG_packed_type: return "DW_TAG_packed_type";
6170 case DW_TAG_subprogram: return "DW_TAG_subprogram";
6171 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
6172 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
6173 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
6174 case DW_TAG_try_block: return "DW_TAG_try_block";
6175 case DW_TAG_variant_part: return "DW_TAG_variant_part";
6176 case DW_TAG_variable: return "DW_TAG_variable";
6177 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
6178 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
6179 case DW_TAG_format_label: return "DW_TAG_format_label";
6180 case DW_TAG_function_template: return "DW_TAG_function_template";
6181 case DW_TAG_class_template: return "DW_TAG_class_template";
6182 /* DWARF 2.1 values. */
6183 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
6184 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
6185 case DW_TAG_interface_type: return "DW_TAG_interface_type";
6186 case DW_TAG_namespace: return "DW_TAG_namespace";
6187 case DW_TAG_imported_module: return "DW_TAG_imported_module";
6188 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
6189 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
6190 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
6193 static char buffer [100];
6195 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
6202 get_AT_name (attribute)
6203 unsigned long attribute;
6207 case DW_AT_sibling: return "DW_AT_sibling";
6208 case DW_AT_location: return "DW_AT_location";
6209 case DW_AT_name: return "DW_AT_name";
6210 case DW_AT_ordering: return "DW_AT_ordering";
6211 case DW_AT_subscr_data: return "DW_AT_subscr_data";
6212 case DW_AT_byte_size: return "DW_AT_byte_size";
6213 case DW_AT_bit_offset: return "DW_AT_bit_offset";
6214 case DW_AT_bit_size: return "DW_AT_bit_size";
6215 case DW_AT_element_list: return "DW_AT_element_list";
6216 case DW_AT_stmt_list: return "DW_AT_stmt_list";
6217 case DW_AT_low_pc: return "DW_AT_low_pc";
6218 case DW_AT_high_pc: return "DW_AT_high_pc";
6219 case DW_AT_language: return "DW_AT_language";
6220 case DW_AT_member: return "DW_AT_member";
6221 case DW_AT_discr: return "DW_AT_discr";
6222 case DW_AT_discr_value: return "DW_AT_discr_value";
6223 case DW_AT_visibility: return "DW_AT_visibility";
6224 case DW_AT_import: return "DW_AT_import";
6225 case DW_AT_string_length: return "DW_AT_string_length";
6226 case DW_AT_common_reference: return "DW_AT_common_reference";
6227 case DW_AT_comp_dir: return "DW_AT_comp_dir";
6228 case DW_AT_const_value: return "DW_AT_const_value";
6229 case DW_AT_containing_type: return "DW_AT_containing_type";
6230 case DW_AT_default_value: return "DW_AT_default_value";
6231 case DW_AT_inline: return "DW_AT_inline";
6232 case DW_AT_is_optional: return "DW_AT_is_optional";
6233 case DW_AT_lower_bound: return "DW_AT_lower_bound";
6234 case DW_AT_producer: return "DW_AT_producer";
6235 case DW_AT_prototyped: return "DW_AT_prototyped";
6236 case DW_AT_return_addr: return "DW_AT_return_addr";
6237 case DW_AT_start_scope: return "DW_AT_start_scope";
6238 case DW_AT_stride_size: return "DW_AT_stride_size";
6239 case DW_AT_upper_bound: return "DW_AT_upper_bound";
6240 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
6241 case DW_AT_accessibility: return "DW_AT_accessibility";
6242 case DW_AT_address_class: return "DW_AT_address_class";
6243 case DW_AT_artificial: return "DW_AT_artificial";
6244 case DW_AT_base_types: return "DW_AT_base_types";
6245 case DW_AT_calling_convention: return "DW_AT_calling_convention";
6246 case DW_AT_count: return "DW_AT_count";
6247 case DW_AT_data_member_location: return "DW_AT_data_member_location";
6248 case DW_AT_decl_column: return "DW_AT_decl_column";
6249 case DW_AT_decl_file: return "DW_AT_decl_file";
6250 case DW_AT_decl_line: return "DW_AT_decl_line";
6251 case DW_AT_declaration: return "DW_AT_declaration";
6252 case DW_AT_discr_list: return "DW_AT_discr_list";
6253 case DW_AT_encoding: return "DW_AT_encoding";
6254 case DW_AT_external: return "DW_AT_external";
6255 case DW_AT_frame_base: return "DW_AT_frame_base";
6256 case DW_AT_friend: return "DW_AT_friend";
6257 case DW_AT_identifier_case: return "DW_AT_identifier_case";
6258 case DW_AT_macro_info: return "DW_AT_macro_info";
6259 case DW_AT_namelist_items: return "DW_AT_namelist_items";
6260 case DW_AT_priority: return "DW_AT_priority";
6261 case DW_AT_segment: return "DW_AT_segment";
6262 case DW_AT_specification: return "DW_AT_specification";
6263 case DW_AT_static_link: return "DW_AT_static_link";
6264 case DW_AT_type: return "DW_AT_type";
6265 case DW_AT_use_location: return "DW_AT_use_location";
6266 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
6267 case DW_AT_virtuality: return "DW_AT_virtuality";
6268 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
6269 /* DWARF 2.1 values. */
6270 case DW_AT_allocated: return "DW_AT_allocated";
6271 case DW_AT_associated: return "DW_AT_associated";
6272 case DW_AT_data_location: return "DW_AT_data_location";
6273 case DW_AT_stride: return "DW_AT_stride";
6274 case DW_AT_entry_pc: return "DW_AT_entry_pc";
6275 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
6276 case DW_AT_extension: return "DW_AT_extension";
6277 case DW_AT_ranges: return "DW_AT_ranges";
6278 case DW_AT_trampoline: return "DW_AT_trampoline";
6279 case DW_AT_call_column: return "DW_AT_call_column";
6280 case DW_AT_call_file: return "DW_AT_call_file";
6281 case DW_AT_call_line: return "DW_AT_call_line";
6282 /* SGI/MIPS extensions. */
6283 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
6284 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
6285 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
6286 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
6287 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
6288 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
6289 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
6290 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
6291 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
6292 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
6293 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
6294 /* GNU extensions. */
6295 case DW_AT_sf_names: return "DW_AT_sf_names";
6296 case DW_AT_src_info: return "DW_AT_src_info";
6297 case DW_AT_mac_info: return "DW_AT_mac_info";
6298 case DW_AT_src_coords: return "DW_AT_src_coords";
6299 case DW_AT_body_begin: return "DW_AT_body_begin";
6300 case DW_AT_body_end: return "DW_AT_body_end";
6303 static char buffer [100];
6305 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
6312 get_FORM_name (form)
6317 case DW_FORM_addr: return "DW_FORM_addr";
6318 case DW_FORM_block2: return "DW_FORM_block2";
6319 case DW_FORM_block4: return "DW_FORM_block4";
6320 case DW_FORM_data2: return "DW_FORM_data2";
6321 case DW_FORM_data4: return "DW_FORM_data4";
6322 case DW_FORM_data8: return "DW_FORM_data8";
6323 case DW_FORM_string: return "DW_FORM_string";
6324 case DW_FORM_block: return "DW_FORM_block";
6325 case DW_FORM_block1: return "DW_FORM_block1";
6326 case DW_FORM_data1: return "DW_FORM_data1";
6327 case DW_FORM_flag: return "DW_FORM_flag";
6328 case DW_FORM_sdata: return "DW_FORM_sdata";
6329 case DW_FORM_strp: return "DW_FORM_strp";
6330 case DW_FORM_udata: return "DW_FORM_udata";
6331 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
6332 case DW_FORM_ref1: return "DW_FORM_ref1";
6333 case DW_FORM_ref2: return "DW_FORM_ref2";
6334 case DW_FORM_ref4: return "DW_FORM_ref4";
6335 case DW_FORM_ref8: return "DW_FORM_ref8";
6336 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
6337 case DW_FORM_indirect: return "DW_FORM_indirect";
6340 static char buffer [100];
6342 sprintf (buffer, _("Unknown FORM value: %lx"), form);
6348 /* FIXME: There are better and more effiecint ways to handle
6349 these structures. For now though, I just want something that
6350 is simple to implement. */
6351 typedef struct abbrev_attr
6353 unsigned long attribute;
6355 struct abbrev_attr * next;
6359 typedef struct abbrev_entry
6361 unsigned long entry;
6364 struct abbrev_attr * first_attr;
6365 struct abbrev_attr * last_attr;
6366 struct abbrev_entry * next;
6370 static abbrev_entry * first_abbrev = NULL;
6371 static abbrev_entry * last_abbrev = NULL;
6374 free_abbrevs PARAMS ((void))
6376 abbrev_entry * abbrev;
6378 for (abbrev = first_abbrev; abbrev;)
6380 abbrev_entry * next = abbrev->next;
6383 for (attr = abbrev->first_attr; attr;)
6385 abbrev_attr * next = attr->next;
6395 last_abbrev = first_abbrev = NULL;
6399 add_abbrev (number, tag, children)
6400 unsigned long number;
6404 abbrev_entry * entry;
6406 entry = (abbrev_entry *) malloc (sizeof (* entry));
6412 entry->entry = number;
6414 entry->children = children;
6415 entry->first_attr = NULL;
6416 entry->last_attr = NULL;
6419 if (first_abbrev == NULL)
6420 first_abbrev = entry;
6422 last_abbrev->next = entry;
6424 last_abbrev = entry;
6428 add_abbrev_attr (attribute, form)
6429 unsigned long attribute;
6434 attr = (abbrev_attr *) malloc (sizeof (* attr));
6440 attr->attribute = attribute;
6444 if (last_abbrev->first_attr == NULL)
6445 last_abbrev->first_attr = attr;
6447 last_abbrev->last_attr->next = attr;
6449 last_abbrev->last_attr = attr;
6452 /* Processes the (partial) contents of a .debug_abbrev section.
6453 Returns NULL if the end of the section was encountered.
6454 Returns the address after the last byte read if the end of
6455 an abbreviation set was found. */
6457 static unsigned char *
6458 process_abbrev_section (start, end)
6459 unsigned char * start;
6460 unsigned char * end;
6462 if (first_abbrev != NULL)
6468 unsigned long entry;
6470 unsigned long attribute;
6473 entry = read_leb128 (start, & bytes_read, 0);
6474 start += bytes_read;
6476 /* A single zero is supposed to end the section according
6477 to the standard. If there's more, then signal that to
6480 return start == end ? NULL : start;
6482 tag = read_leb128 (start, & bytes_read, 0);
6483 start += bytes_read;
6485 children = * start ++;
6487 add_abbrev (entry, tag, children);
6493 attribute = read_leb128 (start, & bytes_read, 0);
6494 start += bytes_read;
6496 form = read_leb128 (start, & bytes_read, 0);
6497 start += bytes_read;
6500 add_abbrev_attr (attribute, form);
6502 while (attribute != 0);
6510 display_debug_macinfo (section, start, file)
6511 Elf32_Internal_Shdr * section;
6512 unsigned char * start;
6513 FILE * file ATTRIBUTE_UNUSED;
6515 unsigned char * end = start + section->sh_size;
6516 unsigned char * curr = start;
6517 unsigned int bytes_read;
6518 enum dwarf_macinfo_record_type op;
6520 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6524 unsigned int lineno;
6525 const char * string;
6532 case DW_MACINFO_start_file:
6534 unsigned int filenum;
6536 lineno = read_leb128 (curr, & bytes_read, 0);
6538 filenum = read_leb128 (curr, & bytes_read, 0);
6541 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno, filenum);
6545 case DW_MACINFO_end_file:
6546 printf (_(" DW_MACINFO_end_file\n"));
6549 case DW_MACINFO_define:
6550 lineno = read_leb128 (curr, & bytes_read, 0);
6553 curr += strlen (string) + 1;
6554 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno, string);
6557 case DW_MACINFO_undef:
6558 lineno = read_leb128 (curr, & bytes_read, 0);
6561 curr += strlen (string) + 1;
6562 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno, string);
6565 case DW_MACINFO_vendor_ext:
6567 unsigned int constant;
6569 constant = read_leb128 (curr, & bytes_read, 0);
6572 curr += strlen (string) + 1;
6573 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant, string);
6584 display_debug_abbrev (section, start, file)
6585 Elf32_Internal_Shdr * section;
6586 unsigned char * start;
6587 FILE * file ATTRIBUTE_UNUSED;
6589 abbrev_entry * entry;
6590 unsigned char * end = start + section->sh_size;
6592 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6596 start = process_abbrev_section (start, end);
6598 if (first_abbrev == NULL)
6601 printf (_(" Number TAG\n"));
6603 for (entry = first_abbrev; entry; entry = entry->next)
6607 printf (_(" %ld %s [%s]\n"),
6609 get_TAG_name (entry->tag),
6610 entry->children ? _("has children") : _("no children"));
6612 for (attr = entry->first_attr; attr; attr = attr->next)
6614 printf (_(" %-18s %s\n"),
6615 get_AT_name (attr->attribute),
6616 get_FORM_name (attr->form));
6630 static unsigned char *
6631 display_block (data, length)
6632 unsigned char * data;
6633 unsigned long length;
6635 printf (_(" %lu byte block: "), length);
6638 printf ("%lx ", (unsigned long) byte_get (data ++, 1));
6644 decode_location_expression (data, pointer_size, length)
6645 unsigned char * data;
6646 unsigned int pointer_size;
6647 unsigned long length;
6651 unsigned long uvalue;
6652 unsigned char * end = data + length;
6661 printf ("DW_OP_addr: %lx",
6662 (unsigned long) byte_get (data, pointer_size));
6663 data += pointer_size;
6666 printf ("DW_OP_deref");
6669 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
6672 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
6675 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
6679 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
6683 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
6687 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
6691 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
6692 (unsigned long) byte_get (data + 4, 4));
6696 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
6697 (long) byte_get (data + 4, 4));
6701 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
6705 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
6709 printf ("DW_OP_dup");
6712 printf ("DW_OP_drop");
6715 printf ("DW_OP_over");
6718 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
6721 printf ("DW_OP_swap");
6724 printf ("DW_OP_rot");
6727 printf ("DW_OP_xderef");
6730 printf ("DW_OP_abs");
6733 printf ("DW_OP_and");
6736 printf ("DW_OP_div");
6739 printf ("DW_OP_minus");
6742 printf ("DW_OP_mod");
6745 printf ("DW_OP_mul");
6748 printf ("DW_OP_neg");
6751 printf ("DW_OP_not");
6754 printf ("DW_OP_or");
6757 printf ("DW_OP_plus");
6759 case DW_OP_plus_uconst:
6760 printf ("DW_OP_plus_uconst: %lu",
6761 read_leb128 (data, &bytes_read, 0));
6765 printf ("DW_OP_shl");
6768 printf ("DW_OP_shr");
6771 printf ("DW_OP_shra");
6774 printf ("DW_OP_xor");
6777 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
6781 printf ("DW_OP_eq");
6784 printf ("DW_OP_ge");
6787 printf ("DW_OP_gt");
6790 printf ("DW_OP_le");
6793 printf ("DW_OP_lt");
6796 printf ("DW_OP_ne");
6799 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
6835 printf ("DW_OP_lit%d", op - DW_OP_lit0);
6870 printf ("DW_OP_reg%d", op - DW_OP_reg0);
6905 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
6906 read_leb128 (data, &bytes_read, 1));
6911 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
6915 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
6919 uvalue = read_leb128 (data, &bytes_read, 0);
6921 printf ("DW_OP_bregx: %lu %ld", uvalue,
6922 read_leb128 (data, &bytes_read, 1));
6926 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
6929 case DW_OP_deref_size:
6930 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
6932 case DW_OP_xderef_size:
6933 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
6936 printf ("DW_OP_nop");
6939 /* DWARF 2.1 extensions. */
6940 case DW_OP_push_object_address:
6941 printf ("DW_OP_push_object_address");
6944 printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2));
6948 printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4));
6952 printf ("DW_OP_calli");
6956 if (op >= DW_OP_lo_user
6957 && op <= DW_OP_hi_user)
6958 printf (_("(User defined location op)"));
6960 printf (_("(Unknown location op)"));
6961 /* No way to tell where the next op is, so just bail. */
6965 /* Separate the ops. */
6971 static const char * debug_str_contents;
6972 static bfd_vma debug_str_size;
6975 load_debug_str (file)
6978 Elf32_Internal_Shdr * sec;
6981 /* If it is already loaded, do nothing. */
6982 if (debug_str_contents != NULL)
6985 /* Locate the .debug_str section. */
6986 for (i = 0, sec = section_headers;
6987 i < elf_header.e_shnum;
6989 if (strcmp (SECTION_NAME (sec), ".debug_str") == 0)
6992 if (i == elf_header.e_shnum || sec->sh_size == 0)
6995 debug_str_size = sec->sh_size;
6997 debug_str_contents = ((char *)
6998 get_data (NULL, file, sec->sh_offset, sec->sh_size,
6999 _("debug_str section data")));
7005 if (debug_str_contents == NULL)
7008 free ((char *) debug_str_contents);
7009 debug_str_contents = NULL;
7014 fetch_indirect_string (offset)
7015 unsigned long offset;
7017 if (debug_str_contents == NULL)
7018 return _("<no .debug_str section>");
7020 if (offset > debug_str_size)
7021 return _("<offset is too big>");
7023 return debug_str_contents + offset;
7028 display_debug_str (section, start, file)
7029 Elf32_Internal_Shdr * section;
7030 unsigned char * start;
7031 FILE * file ATTRIBUTE_UNUSED;
7033 unsigned long bytes;
7036 addr = section->sh_addr;
7037 bytes = section->sh_size;
7041 printf (_("\nThe .debug_str section is empty.\n"));
7045 printf (_("Contents of the .debug_str section:\n\n"));
7053 lbytes = (bytes > 16 ? 16 : bytes);
7055 printf (" 0x%8.8lx ", (unsigned long) addr);
7057 for (j = 0; j < 16; j++)
7060 printf ("%2.2x", start [j]);
7068 for (j = 0; j < lbytes; j++)
7071 if (k >= ' ' && k < 0x80)
7088 static unsigned char *
7089 read_and_display_attr_value (attribute, form, data, cu_offset, pointer_size)
7090 unsigned long attribute;
7092 unsigned char * data;
7093 unsigned long cu_offset;
7094 unsigned long pointer_size;
7096 unsigned long uvalue = 0;
7097 unsigned char * block_start = NULL;
7105 case DW_FORM_ref_addr:
7107 uvalue = byte_get (data, pointer_size);
7108 data += pointer_size;
7112 uvalue = byte_get (data, /* offset_size */ 4);
7113 data += /* offset_size */ 4;
7119 uvalue = byte_get (data ++, 1);
7124 uvalue = byte_get (data, 2);
7130 uvalue = byte_get (data, 4);
7135 uvalue = read_leb128 (data, & bytes_read, 1);
7139 case DW_FORM_ref_udata:
7141 uvalue = read_leb128 (data, & bytes_read, 0);
7145 case DW_FORM_indirect:
7146 form = read_leb128 (data, & bytes_read, 0);
7148 printf (" %s", get_FORM_name (form));
7149 return read_and_display_attr_value (attribute, form, data, cu_offset,
7155 case DW_FORM_ref_addr:
7156 printf (" <#%lx>", uvalue);
7162 case DW_FORM_ref_udata:
7163 printf (" <%lx>", uvalue + cu_offset);
7167 printf (" %#lx", uvalue);
7175 printf (" %ld", uvalue);
7180 uvalue = byte_get (data, 4);
7181 printf (" %lx", uvalue);
7182 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
7186 case DW_FORM_string:
7187 printf (" %s", data);
7188 data += strlen ((char *) data) + 1;
7192 uvalue = read_leb128 (data, & bytes_read, 0);
7193 block_start = data + bytes_read;
7194 data = display_block (block_start, uvalue);
7197 case DW_FORM_block1:
7198 uvalue = byte_get (data, 1);
7199 block_start = data + 1;
7200 data = display_block (block_start, uvalue);
7203 case DW_FORM_block2:
7204 uvalue = byte_get (data, 2);
7205 block_start = data + 2;
7206 data = display_block (block_start, uvalue);
7209 case DW_FORM_block4:
7210 uvalue = byte_get (data, 4);
7211 block_start = data + 4;
7212 data = display_block (block_start, uvalue);
7216 printf (_(" (indirect string, offset: 0x%lx): "), uvalue);
7217 printf (fetch_indirect_string (uvalue));
7220 case DW_FORM_indirect:
7221 /* Handled above. */
7225 warn (_("Unrecognised form: %d\n"), form);
7229 /* For some attributes we can display futher information. */
7238 case DW_INL_not_inlined: printf (_("(not inlined)")); break;
7239 case DW_INL_inlined: printf (_("(inlined)")); break;
7240 case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
7241 case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break;
7242 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break;
7246 case DW_AT_language:
7249 case DW_LANG_C: printf ("(non-ANSI C)"); break;
7250 case DW_LANG_C89: printf ("(ANSI C)"); break;
7251 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
7252 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
7253 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
7254 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
7255 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
7256 case DW_LANG_Ada83: printf ("(Ada)"); break;
7257 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
7258 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
7259 /* DWARF 2.1 values. */
7260 case DW_LANG_C99: printf ("(ANSI C99)"); break;
7261 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
7262 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
7263 /* MIPS extension. */
7264 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
7265 default: printf ("(Unknown: %lx)", uvalue); break;
7269 case DW_AT_encoding:
7272 case DW_ATE_void: printf ("(void)"); break;
7273 case DW_ATE_address: printf ("(machine address)"); break;
7274 case DW_ATE_boolean: printf ("(boolean)"); break;
7275 case DW_ATE_complex_float: printf ("(complex float)"); break;
7276 case DW_ATE_float: printf ("(float)"); break;
7277 case DW_ATE_signed: printf ("(signed)"); break;
7278 case DW_ATE_signed_char: printf ("(signed char)"); break;
7279 case DW_ATE_unsigned: printf ("(unsigned)"); break;
7280 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
7281 /* DWARF 2.1 value. */
7282 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
7284 if (uvalue >= DW_ATE_lo_user
7285 && uvalue <= DW_ATE_hi_user)
7286 printf ("(user defined type)");
7288 printf ("(unknown type)");
7293 case DW_AT_accessibility:
7296 case DW_ACCESS_public: printf ("(public)"); break;
7297 case DW_ACCESS_protected: printf ("(protected)"); break;
7298 case DW_ACCESS_private: printf ("(private)"); break;
7299 default: printf ("(unknown accessibility)"); break;
7303 case DW_AT_visibility:
7306 case DW_VIS_local: printf ("(local)"); break;
7307 case DW_VIS_exported: printf ("(exported)"); break;
7308 case DW_VIS_qualified: printf ("(qualified)"); break;
7309 default: printf ("(unknown visibility)"); break;
7313 case DW_AT_virtuality:
7316 case DW_VIRTUALITY_none: printf ("(none)"); break;
7317 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
7318 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
7319 default: printf ("(unknown virtuality)"); break;
7323 case DW_AT_identifier_case:
7326 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
7327 case DW_ID_up_case: printf ("(up_case)"); break;
7328 case DW_ID_down_case: printf ("(down_case)"); break;
7329 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
7330 default: printf ("(unknown case)"); break;
7334 case DW_AT_calling_convention:
7337 case DW_CC_normal: printf ("(normal)"); break;
7338 case DW_CC_program: printf ("(program)"); break;
7339 case DW_CC_nocall: printf ("(nocall)"); break;
7341 if (uvalue >= DW_CC_lo_user
7342 && uvalue <= DW_CC_hi_user)
7343 printf ("(user defined)");
7345 printf ("(unknown convention)");
7349 case DW_AT_ordering:
7352 case -1: printf ("(undefined)"); break;
7353 case 0: printf ("(row major)"); break;
7354 case 1: printf ("(column major)"); break;
7358 case DW_AT_frame_base:
7359 case DW_AT_location:
7360 case DW_AT_data_member_location:
7361 case DW_AT_vtable_elem_location:
7362 case DW_AT_allocated:
7363 case DW_AT_associated:
7364 case DW_AT_data_location:
7366 case DW_AT_upper_bound:
7367 case DW_AT_lower_bound:
7371 decode_location_expression (block_start, pointer_size, uvalue);
7383 static unsigned char *
7384 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
7385 unsigned long attribute;
7387 unsigned char * data;
7388 unsigned long cu_offset;
7389 unsigned long pointer_size;
7391 printf (" %-18s:", get_AT_name (attribute));
7392 data = read_and_display_attr_value (attribute, form, data, cu_offset,
7399 display_debug_info (section, start, file)
7400 Elf32_Internal_Shdr * section;
7401 unsigned char * start;
7404 unsigned char * end = start + section->sh_size;
7405 unsigned char * section_begin = start;
7407 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7409 load_debug_str (file);
7413 DWARF2_External_CompUnit * external;
7414 DWARF2_Internal_CompUnit compunit;
7415 Elf32_Internal_Shdr * relsec;
7416 unsigned char * tags;
7419 unsigned long cu_offset;
7421 external = (DWARF2_External_CompUnit *) start;
7423 compunit.cu_length = BYTE_GET (external->cu_length);
7424 compunit.cu_version = BYTE_GET (external->cu_version);
7425 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
7426 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
7428 if (compunit.cu_length == 0xffffffff)
7430 warn (_("64-bit DWARF debug info is not supported yet.\n"));
7434 /* Check for RELA relocations in the abbrev_offset address, and
7436 for (relsec = section_headers;
7437 relsec < section_headers + elf_header.e_shnum;
7440 unsigned long nrelas, nsyms;
7441 Elf_Internal_Rela *rela, *rp;
7442 Elf32_Internal_Shdr *symsec;
7443 Elf_Internal_Sym *symtab;
7444 Elf_Internal_Sym *sym;
7446 if (relsec->sh_type != SHT_RELA
7447 || section_headers + relsec->sh_info != section)
7450 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7454 symsec = section_headers + relsec->sh_link;
7455 nsyms = symsec->sh_size / symsec->sh_entsize;
7456 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
7458 for (rp = rela; rp < rela + nrelas; ++rp)
7461 != (bfd_vma) ((unsigned char *) &external->cu_abbrev_offset
7467 sym = symtab + ELF32_R_SYM (rp->r_info);
7469 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
7471 warn (_("Skipping unexpected symbol type %u\n"),
7472 ELF32_ST_TYPE (sym->st_info));
7478 sym = symtab + ELF64_R_SYM (rp->r_info);
7480 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
7482 warn (_("Skipping unexpected symbol type %u\n"),
7483 ELF64_ST_TYPE (sym->st_info));
7488 compunit.cu_abbrev_offset += rp->r_addend;
7496 tags = start + sizeof (* external);
7497 cu_offset = start - section_begin;
7498 start += compunit.cu_length + sizeof (external->cu_length);
7500 printf (_(" Compilation Unit @ %lx:\n"), cu_offset);
7501 printf (_(" Length: %ld\n"), compunit.cu_length);
7502 printf (_(" Version: %d\n"), compunit.cu_version);
7503 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
7504 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
7506 if (compunit.cu_version != 2)
7508 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
7514 /* Read in the abbrevs used by this compilation unit. */
7517 Elf32_Internal_Shdr * sec;
7518 unsigned char * begin;
7520 /* Locate the .debug_abbrev section and process it. */
7521 for (i = 0, sec = section_headers;
7522 i < elf_header.e_shnum;
7524 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
7527 if (i == elf_header.e_shnum || sec->sh_size == 0)
7529 warn (_("Unable to locate .debug_abbrev section!\n"));
7533 begin = ((unsigned char *)
7534 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7535 _("debug_abbrev section data")));
7539 process_abbrev_section (begin + compunit.cu_abbrev_offset,
7540 begin + sec->sh_size);
7546 while (tags < start)
7549 unsigned long abbrev_number;
7550 abbrev_entry * entry;
7553 abbrev_number = read_leb128 (tags, & bytes_read, 0);
7556 /* A null DIE marks the end of a list of children. */
7557 if (abbrev_number == 0)
7563 /* Scan through the abbreviation list until we reach the
7565 for (entry = first_abbrev;
7566 entry && entry->entry != abbrev_number;
7567 entry = entry->next)
7572 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
7577 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
7579 (unsigned long) (tags - section_begin - bytes_read),
7581 get_TAG_name (entry->tag));
7583 for (attr = entry->first_attr; attr; attr = attr->next)
7584 tags = read_and_display_attr (attr->attribute,
7587 compunit.cu_pointer_size);
7589 if (entry->children)
7602 display_debug_aranges (section, start, file)
7603 Elf32_Internal_Shdr * section;
7604 unsigned char * start;
7605 FILE * file ATTRIBUTE_UNUSED;
7607 unsigned char * end = start + section->sh_size;
7609 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7613 DWARF2_External_ARange * external;
7614 DWARF2_Internal_ARange arange;
7615 unsigned char * ranges;
7616 unsigned long length;
7617 unsigned long address;
7620 external = (DWARF2_External_ARange *) start;
7622 arange.ar_length = BYTE_GET (external->ar_length);
7623 arange.ar_version = BYTE_GET (external->ar_version);
7624 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
7625 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
7626 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
7628 if (arange.ar_length == 0xffffffff)
7630 warn (_("64-bit DWARF aranges are not supported yet.\n"));
7634 if (arange.ar_version != 2)
7636 warn (_("Only DWARF 2 aranges are currently supported.\n"));
7640 printf (_(" Length: %ld\n"), arange.ar_length);
7641 printf (_(" Version: %d\n"), arange.ar_version);
7642 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
7643 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
7644 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
7646 printf (_("\n Address Length\n"));
7648 ranges = start + sizeof (* external);
7650 /* Must pad to an alignment boundary that is twice the pointer size. */
7651 excess = sizeof (* external) % (2 * arange.ar_pointer_size);
7653 ranges += (2 * arange.ar_pointer_size) - excess;
7657 address = byte_get (ranges, arange.ar_pointer_size);
7659 ranges += arange.ar_pointer_size;
7661 length = byte_get (ranges, arange.ar_pointer_size);
7663 ranges += arange.ar_pointer_size;
7665 /* A pair of zeros marks the end of the list. */
7666 if (address == 0 && length == 0)
7669 printf (" %8.8lx %lu\n", address, length);
7672 start += arange.ar_length + sizeof (external->ar_length);
7680 typedef struct Frame_Chunk
7682 struct Frame_Chunk * next;
7683 unsigned char * chunk_start;
7685 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
7686 short int * col_type;
7688 char * augmentation;
7689 unsigned int code_factor;
7691 unsigned long pc_begin;
7692 unsigned long pc_range;
7696 unsigned char fde_encoding;
7700 /* A marker for a col_type that means this column was never referenced
7701 in the frame info. */
7702 #define DW_CFA_unreferenced (-1)
7704 static void frame_need_space PARAMS ((Frame_Chunk *, int));
7705 static void frame_display_row PARAMS ((Frame_Chunk *, int *, int *));
7706 static int size_of_encoded_value PARAMS ((int));
7709 frame_need_space (fc, reg)
7713 int prev = fc->ncols;
7715 if (reg < fc->ncols)
7718 fc->ncols = reg + 1;
7719 fc->col_type = (short int *) xrealloc (fc->col_type,
7720 fc->ncols * sizeof (short int));
7721 fc->col_offset = (int *) xrealloc (fc->col_offset,
7722 fc->ncols * sizeof (int));
7724 while (prev < fc->ncols)
7726 fc->col_type[prev] = DW_CFA_unreferenced;
7727 fc->col_offset[prev] = 0;
7733 frame_display_row (fc, need_col_headers, max_regs)
7735 int * need_col_headers;
7741 if (* max_regs < fc->ncols)
7742 * max_regs = fc->ncols;
7744 if (* need_col_headers)
7746 * need_col_headers = 0;
7748 printf (" LOC CFA ");
7750 for (r = 0; r < * max_regs; r++)
7751 if (fc->col_type[r] != DW_CFA_unreferenced)
7756 printf ("r%-4d", r);
7762 printf ("%08lx ", fc->pc_begin);
7763 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
7764 printf ("%-8s ", tmp);
7766 for (r = 0; r < fc->ncols; r++)
7768 if (fc->col_type[r] != DW_CFA_unreferenced)
7770 switch (fc->col_type[r])
7772 case DW_CFA_undefined:
7775 case DW_CFA_same_value:
7779 sprintf (tmp, "c%+d", fc->col_offset[r]);
7781 case DW_CFA_register:
7782 sprintf (tmp, "r%d", fc->col_offset[r]);
7785 strcpy (tmp, "n/a");
7788 printf ("%-5s", tmp);
7795 size_of_encoded_value (encoding)
7798 switch (encoding & 0x7)
7801 case 0: return is_32bit_elf ? 4 : 8;
7808 #define GET(N) byte_get (start, N); start += N
7809 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
7810 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
7813 display_debug_frames (section, start, file)
7814 Elf32_Internal_Shdr * section;
7815 unsigned char * start;
7816 FILE * file ATTRIBUTE_UNUSED;
7818 unsigned char * end = start + section->sh_size;
7819 unsigned char * section_start = start;
7820 Frame_Chunk * chunks = 0;
7821 Frame_Chunk * remembered_state = 0;
7823 int is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
7826 int addr_size = is_32bit_elf ? 4 : 8;
7828 printf (_("The section %s contains:\n"), SECTION_NAME (section));
7832 unsigned char * saved_start;
7833 unsigned char * block_end;
7834 unsigned long length;
7835 unsigned long cie_id;
7838 int need_col_headers = 1;
7839 unsigned char * augmentation_data = NULL;
7840 unsigned long augmentation_data_len = 0;
7841 int encoded_ptr_size = addr_size;
7843 saved_start = start;
7844 length = byte_get (start, 4); start += 4;
7849 if (length == 0xffffffff)
7851 warn (_("64-bit DWARF format frames are not supported yet.\n"));
7855 block_end = saved_start + length + 4;
7856 cie_id = byte_get (start, 4); start += 4;
7858 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
7862 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
7863 memset (fc, 0, sizeof (Frame_Chunk));
7867 fc->chunk_start = saved_start;
7869 fc->col_type = (short int *) xmalloc (sizeof (short int));
7870 fc->col_offset = (int *) xmalloc (sizeof (int));
7871 frame_need_space (fc, max_regs-1);
7875 fc->augmentation = start;
7876 start = strchr (start, '\0') + 1;
7878 if (fc->augmentation[0] == 'z')
7880 fc->code_factor = LEB ();
7881 fc->data_factor = SLEB ();
7882 fc->ra = byte_get (start, 1); start += 1;
7883 augmentation_data_len = LEB ();
7884 augmentation_data = start;
7885 start += augmentation_data_len;
7887 else if (strcmp (fc->augmentation, "eh") == 0)
7890 fc->code_factor = LEB ();
7891 fc->data_factor = SLEB ();
7892 fc->ra = byte_get (start, 1); start += 1;
7896 fc->code_factor = LEB ();
7897 fc->data_factor = SLEB ();
7898 fc->ra = byte_get (start, 1); start += 1;
7902 if (do_debug_frames_interp)
7903 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
7904 (unsigned long)(saved_start - section_start), length, cie_id,
7905 fc->augmentation, fc->code_factor, fc->data_factor,
7909 printf ("\n%08lx %08lx %08lx CIE\n",
7910 (unsigned long)(saved_start - section_start), length, cie_id);
7911 printf (" Version: %d\n", version);
7912 printf (" Augmentation: \"%s\"\n", fc->augmentation);
7913 printf (" Code alignment factor: %u\n", fc->code_factor);
7914 printf (" Data alignment factor: %d\n", fc->data_factor);
7915 printf (" Return address column: %d\n", fc->ra);
7917 if (augmentation_data_len)
7920 printf (" Augmentation data: ");
7921 for (i = 0; i < augmentation_data_len; ++i)
7922 printf (" %02x", augmentation_data[i]);
7928 if (augmentation_data_len)
7930 unsigned char *p, *q;
7931 p = fc->augmentation + 1;
7932 q = augmentation_data;
7939 q += 1 + size_of_encoded_value (*q);
7941 fc->fde_encoding = *q++;
7947 if (fc->fde_encoding)
7948 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
7951 frame_need_space (fc, fc->ra);
7955 unsigned char * look_for;
7956 static Frame_Chunk fde_fc;
7959 memset (fc, 0, sizeof (Frame_Chunk));
7961 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
7963 for (cie = chunks; cie ; cie = cie->next)
7964 if (cie->chunk_start == look_for)
7969 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
7970 cie_id, saved_start);
7973 fc->col_type = (short int *) xmalloc (sizeof (short int));
7974 fc->col_offset = (int *) xmalloc (sizeof (int));
7975 frame_need_space (fc, max_regs - 1);
7977 fc->augmentation = "";
7978 fc->fde_encoding = 0;
7982 fc->ncols = cie->ncols;
7983 fc->col_type = (short int *) xmalloc (fc->ncols * sizeof (short int));
7984 fc->col_offset = (int *) xmalloc (fc->ncols * sizeof (int));
7985 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
7986 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
7987 fc->augmentation = cie->augmentation;
7988 fc->code_factor = cie->code_factor;
7989 fc->data_factor = cie->data_factor;
7990 fc->cfa_reg = cie->cfa_reg;
7991 fc->cfa_offset = cie->cfa_offset;
7993 frame_need_space (fc, max_regs-1);
7994 fc->fde_encoding = cie->fde_encoding;
7997 if (fc->fde_encoding)
7998 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8000 fc->pc_begin = byte_get (start, encoded_ptr_size);
8001 start += encoded_ptr_size;
8002 fc->pc_range = byte_get (start, encoded_ptr_size);
8003 start += encoded_ptr_size;
8005 if (cie->augmentation[0] == 'z')
8007 augmentation_data_len = LEB ();
8008 augmentation_data = start;
8009 start += augmentation_data_len;
8012 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
8013 (unsigned long)(saved_start - section_start), length, cie_id,
8014 (unsigned long)(cie->chunk_start - section_start),
8015 fc->pc_begin, fc->pc_begin + fc->pc_range);
8016 if (! do_debug_frames_interp && augmentation_data_len)
8019 printf (" Augmentation data: ");
8020 for (i = 0; i < augmentation_data_len; ++i)
8021 printf (" %02x", augmentation_data[i]);
8027 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8028 about to interpret instructions for the chunk. */
8030 if (do_debug_frames_interp)
8032 /* Start by making a pass over the chunk, allocating storage
8033 and taking note of what registers are used. */
8034 unsigned char * tmp = start;
8036 while (start < block_end)
8046 /* Warning: if you add any more cases to this switch, be
8047 sure to add them to the corresponding switch below. */
8050 case DW_CFA_advance_loc:
8054 frame_need_space (fc, opa);
8055 fc->col_type[opa] = DW_CFA_undefined;
8057 case DW_CFA_restore:
8058 frame_need_space (fc, opa);
8059 fc->col_type[opa] = DW_CFA_undefined;
8061 case DW_CFA_set_loc:
8062 start += encoded_ptr_size;
8064 case DW_CFA_advance_loc1:
8067 case DW_CFA_advance_loc2:
8070 case DW_CFA_advance_loc4:
8073 case DW_CFA_offset_extended:
8074 reg = LEB (); LEB ();
8075 frame_need_space (fc, reg);
8076 fc->col_type[reg] = DW_CFA_undefined;
8078 case DW_CFA_restore_extended:
8080 frame_need_space (fc, reg);
8081 fc->col_type[reg] = DW_CFA_undefined;
8083 case DW_CFA_undefined:
8085 frame_need_space (fc, reg);
8086 fc->col_type[reg] = DW_CFA_undefined;
8088 case DW_CFA_same_value:
8090 frame_need_space (fc, reg);
8091 fc->col_type[reg] = DW_CFA_undefined;
8093 case DW_CFA_register:
8094 reg = LEB (); LEB ();
8095 frame_need_space (fc, reg);
8096 fc->col_type[reg] = DW_CFA_undefined;
8098 case DW_CFA_def_cfa:
8101 case DW_CFA_def_cfa_register:
8104 case DW_CFA_def_cfa_offset:
8107 #ifndef DW_CFA_GNU_args_size
8108 #define DW_CFA_GNU_args_size 0x2e
8110 case DW_CFA_GNU_args_size:
8113 #ifndef DW_CFA_GNU_negative_offset_extended
8114 #define DW_CFA_GNU_negative_offset_extended 0x2f
8116 case DW_CFA_GNU_negative_offset_extended:
8117 reg = LEB (); LEB ();
8118 frame_need_space (fc, reg);
8119 fc->col_type[reg] = DW_CFA_undefined;
8128 /* Now we know what registers are used, make a second pass over
8129 the chunk, this time actually printing out the info. */
8131 while (start < block_end)
8134 unsigned long ul, reg, roffs;
8143 /* Warning: if you add any more cases to this switch, be
8144 sure to add them to the corresponding switch above. */
8147 case DW_CFA_advance_loc:
8148 if (do_debug_frames_interp)
8149 frame_display_row (fc, &need_col_headers, &max_regs);
8151 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8152 opa * fc->code_factor,
8153 fc->pc_begin + opa * fc->code_factor);
8154 fc->pc_begin += opa * fc->code_factor;
8159 if (! do_debug_frames_interp)
8160 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8161 opa, roffs * fc->data_factor);
8162 fc->col_type[opa] = DW_CFA_offset;
8163 fc->col_offset[opa] = roffs * fc->data_factor;
8166 case DW_CFA_restore:
8167 if (! do_debug_frames_interp)
8168 printf (" DW_CFA_restore: r%d\n", opa);
8169 fc->col_type[opa] = cie->col_type[opa];
8170 fc->col_offset[opa] = cie->col_offset[opa];
8173 case DW_CFA_set_loc:
8174 vma = byte_get (start, encoded_ptr_size);
8175 start += encoded_ptr_size;
8176 if (do_debug_frames_interp)
8177 frame_display_row (fc, &need_col_headers, &max_regs);
8179 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
8183 case DW_CFA_advance_loc1:
8184 ofs = byte_get (start, 1); start += 1;
8185 if (do_debug_frames_interp)
8186 frame_display_row (fc, &need_col_headers, &max_regs);
8188 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8189 ofs * fc->code_factor,
8190 fc->pc_begin + ofs * fc->code_factor);
8191 fc->pc_begin += ofs * fc->code_factor;
8194 case DW_CFA_advance_loc2:
8195 ofs = byte_get (start, 2); start += 2;
8196 if (do_debug_frames_interp)
8197 frame_display_row (fc, &need_col_headers, &max_regs);
8199 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8200 ofs * fc->code_factor,
8201 fc->pc_begin + ofs * fc->code_factor);
8202 fc->pc_begin += ofs * fc->code_factor;
8205 case DW_CFA_advance_loc4:
8206 ofs = byte_get (start, 4); start += 4;
8207 if (do_debug_frames_interp)
8208 frame_display_row (fc, &need_col_headers, &max_regs);
8210 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8211 ofs * fc->code_factor,
8212 fc->pc_begin + ofs * fc->code_factor);
8213 fc->pc_begin += ofs * fc->code_factor;
8216 case DW_CFA_offset_extended:
8219 if (! do_debug_frames_interp)
8220 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8221 reg, roffs * fc->data_factor);
8222 fc->col_type[reg] = DW_CFA_offset;
8223 fc->col_offset[reg] = roffs * fc->data_factor;
8226 case DW_CFA_restore_extended:
8228 if (! do_debug_frames_interp)
8229 printf (" DW_CFA_restore_extended: r%ld\n", reg);
8230 fc->col_type[reg] = cie->col_type[reg];
8231 fc->col_offset[reg] = cie->col_offset[reg];
8234 case DW_CFA_undefined:
8236 if (! do_debug_frames_interp)
8237 printf (" DW_CFA_undefined: r%ld\n", reg);
8238 fc->col_type[reg] = DW_CFA_undefined;
8239 fc->col_offset[reg] = 0;
8242 case DW_CFA_same_value:
8244 if (! do_debug_frames_interp)
8245 printf (" DW_CFA_same_value: r%ld\n", reg);
8246 fc->col_type[reg] = DW_CFA_same_value;
8247 fc->col_offset[reg] = 0;
8250 case DW_CFA_register:
8253 if (! do_debug_frames_interp)
8254 printf (" DW_CFA_register: r%ld\n", reg);
8255 fc->col_type[reg] = DW_CFA_register;
8256 fc->col_offset[reg] = roffs;
8259 case DW_CFA_remember_state:
8260 if (! do_debug_frames_interp)
8261 printf (" DW_CFA_remember_state\n");
8262 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8263 rs->ncols = fc->ncols;
8264 rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
8265 rs->col_offset = (int *) xmalloc (rs->ncols * sizeof (int));
8266 memcpy (rs->col_type, fc->col_type, rs->ncols);
8267 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
8268 rs->next = remembered_state;
8269 remembered_state = rs;
8272 case DW_CFA_restore_state:
8273 if (! do_debug_frames_interp)
8274 printf (" DW_CFA_restore_state\n");
8275 rs = remembered_state;
8276 remembered_state = rs->next;
8277 frame_need_space (fc, rs->ncols-1);
8278 memcpy (fc->col_type, rs->col_type, rs->ncols);
8279 memcpy (fc->col_offset, rs->col_offset, rs->ncols * sizeof (int));
8280 free (rs->col_type);
8281 free (rs->col_offset);
8285 case DW_CFA_def_cfa:
8286 fc->cfa_reg = LEB ();
8287 fc->cfa_offset = LEB ();
8288 if (! do_debug_frames_interp)
8289 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
8290 fc->cfa_reg, fc->cfa_offset);
8293 case DW_CFA_def_cfa_register:
8294 fc->cfa_reg = LEB ();
8295 if (! do_debug_frames_interp)
8296 printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
8299 case DW_CFA_def_cfa_offset:
8300 fc->cfa_offset = LEB ();
8301 if (! do_debug_frames_interp)
8302 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
8306 if (! do_debug_frames_interp)
8307 printf (" DW_CFA_nop\n");
8310 #ifndef DW_CFA_GNU_window_save
8311 #define DW_CFA_GNU_window_save 0x2d
8313 case DW_CFA_GNU_window_save:
8314 if (! do_debug_frames_interp)
8315 printf (" DW_CFA_GNU_window_save\n");
8318 case DW_CFA_GNU_args_size:
8320 if (! do_debug_frames_interp)
8321 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
8324 case DW_CFA_GNU_negative_offset_extended:
8327 frame_need_space (fc, reg);
8328 if (! do_debug_frames_interp)
8329 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
8330 reg, l * fc->data_factor);
8331 fc->col_type[reg] = DW_CFA_offset;
8332 fc->col_offset[reg] = l * fc->data_factor;
8336 fprintf (stderr, "unsupported or unknown DW_CFA_%d\n", op);
8341 if (do_debug_frames_interp)
8342 frame_display_row (fc, &need_col_headers, &max_regs);
8357 display_debug_not_supported (section, start, file)
8358 Elf32_Internal_Shdr * section;
8359 unsigned char * start ATTRIBUTE_UNUSED;
8360 FILE * file ATTRIBUTE_UNUSED;
8362 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
8363 SECTION_NAME (section));
8368 /* Pre-scan the .debug_info section to record the size of address.
8369 When dumping the .debug_line, we use that size information, assuming
8370 that all compilation units have the same address size. */
8372 prescan_debug_info (section, start, file)
8373 Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
8374 unsigned char * start;
8375 FILE * file ATTRIBUTE_UNUSED;
8377 DWARF2_External_CompUnit * external;
8379 external = (DWARF2_External_CompUnit *) start;
8381 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
8385 /* A structure containing the name of a debug section and a pointer
8386 to a function that can decode it. The third field is a prescan
8387 function to be run over the section before displaying any of the
8391 const char * const name;
8392 int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8393 int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8397 { ".debug_abbrev", display_debug_abbrev, NULL },
8398 { ".debug_aranges", display_debug_aranges, NULL },
8399 { ".debug_frame", display_debug_frames, NULL },
8400 { ".debug_info", display_debug_info, prescan_debug_info },
8401 { ".debug_line", display_debug_lines, NULL },
8402 { ".debug_pubnames", display_debug_pubnames, NULL },
8403 { ".eh_frame", display_debug_frames, NULL },
8404 { ".debug_macinfo", display_debug_macinfo, NULL },
8405 { ".debug_str", display_debug_str, NULL },
8407 { ".debug_pubtypes", display_debug_not_supported, NULL },
8408 { ".debug_ranges", display_debug_not_supported, NULL },
8409 { ".debug_static_func", display_debug_not_supported, NULL },
8410 { ".debug_static_vars", display_debug_not_supported, NULL },
8411 { ".debug_types", display_debug_not_supported, NULL },
8412 { ".debug_weaknames", display_debug_not_supported, NULL }
8416 display_debug_section (section, file)
8417 Elf32_Internal_Shdr * section;
8420 char * name = SECTION_NAME (section);
8421 bfd_size_type length;
8422 unsigned char * start;
8425 length = section->sh_size;
8428 printf (_("\nSection '%s' has no debugging data.\n"), name);
8432 start = (unsigned char *) get_data (NULL, file, section->sh_offset, length,
8433 _("debug section data"));
8437 /* See if we know how to display the contents of this section. */
8438 if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
8439 name = ".debug_info";
8441 for (i = NUM_ELEM (debug_displays); i--;)
8442 if (strcmp (debug_displays[i].name, name) == 0)
8444 debug_displays[i].display (section, start, file);
8449 printf (_("Unrecognised debug section: %s\n"), name);
8453 /* If we loaded in the abbrev section at some point,
8454 we must release it here. */
8461 process_section_contents (file)
8464 Elf32_Internal_Shdr * section;
8470 /* Pre-scan the debug sections to find some debug information not
8471 present in some of them. For the .debug_line, we must find out the
8472 size of address (specified in .debug_info and .debug_aranges). */
8473 for (i = 0, section = section_headers;
8474 i < elf_header.e_shnum && i < num_dump_sects;
8477 char * name = SECTION_NAME (section);
8480 if (section->sh_size == 0)
8483 /* See if there is some pre-scan operation for this section. */
8484 for (j = NUM_ELEM (debug_displays); j--;)
8485 if (strcmp (debug_displays[j].name, name) == 0)
8487 if (debug_displays[j].prescan != NULL)
8489 bfd_size_type length;
8490 unsigned char * start;
8492 length = section->sh_size;
8493 start = ((unsigned char *)
8494 get_data (NULL, file, section->sh_offset, length,
8495 _("debug section data")));
8499 debug_displays[j].prescan (section, start, file);
8507 for (i = 0, section = section_headers;
8508 i < elf_header.e_shnum && i < num_dump_sects;
8511 #ifdef SUPPORT_DISASSEMBLY
8512 if (dump_sects[i] & DISASS_DUMP)
8513 disassemble_section (section, file);
8515 if (dump_sects[i] & HEX_DUMP)
8516 dump_section (section, file);
8518 if (dump_sects[i] & DEBUG_DUMP)
8519 display_debug_section (section, file);
8522 if (i < num_dump_sects)
8523 warn (_("Some sections were not dumped because they do not exist!\n"));
8529 process_mips_fpe_exception (mask)
8535 if (mask & OEX_FPU_INEX)
8536 fputs ("INEX", stdout), first = 0;
8537 if (mask & OEX_FPU_UFLO)
8538 printf ("%sUFLO", first ? "" : "|"), first = 0;
8539 if (mask & OEX_FPU_OFLO)
8540 printf ("%sOFLO", first ? "" : "|"), first = 0;
8541 if (mask & OEX_FPU_DIV0)
8542 printf ("%sDIV0", first ? "" : "|"), first = 0;
8543 if (mask & OEX_FPU_INVAL)
8544 printf ("%sINVAL", first ? "" : "|");
8547 fputs ("0", stdout);
8551 process_mips_specific (file)
8554 Elf_Internal_Dyn * entry;
8555 size_t liblist_offset = 0;
8556 size_t liblistno = 0;
8557 size_t conflictsno = 0;
8558 size_t options_offset = 0;
8559 size_t conflicts_offset = 0;
8561 /* We have a lot of special sections. Thanks SGI! */
8562 if (dynamic_segment == NULL)
8563 /* No information available. */
8566 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
8567 switch (entry->d_tag)
8569 case DT_MIPS_LIBLIST:
8570 liblist_offset = entry->d_un.d_val - loadaddr;
8572 case DT_MIPS_LIBLISTNO:
8573 liblistno = entry->d_un.d_val;
8575 case DT_MIPS_OPTIONS:
8576 options_offset = entry->d_un.d_val - loadaddr;
8578 case DT_MIPS_CONFLICT:
8579 conflicts_offset = entry->d_un.d_val - loadaddr;
8581 case DT_MIPS_CONFLICTNO:
8582 conflictsno = entry->d_un.d_val;
8588 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
8590 Elf32_External_Lib * elib;
8593 elib = ((Elf32_External_Lib *)
8594 get_data (NULL, file, liblist_offset,
8595 liblistno * sizeof (Elf32_External_Lib),
8599 printf ("\nSection '.liblist' contains %lu entries:\n",
8600 (unsigned long) liblistno);
8601 fputs (" Library Time Stamp Checksum Version Flags\n",
8604 for (cnt = 0; cnt < liblistno; ++cnt)
8611 liblist.l_name = BYTE_GET (elib[cnt].l_name);
8612 time = BYTE_GET (elib[cnt].l_time_stamp);
8613 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
8614 liblist.l_version = BYTE_GET (elib[cnt].l_version);
8615 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
8617 tmp = gmtime (&time);
8618 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
8619 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8620 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8622 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt,
8623 dynamic_strings + liblist.l_name, timebuf,
8624 liblist.l_checksum, liblist.l_version);
8626 if (liblist.l_flags == 0)
8637 { " EXACT_MATCH", LL_EXACT_MATCH },
8638 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
8639 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
8640 { " EXPORTS", LL_EXPORTS },
8641 { " DELAY_LOAD", LL_DELAY_LOAD },
8642 { " DELTA", LL_DELTA }
8644 int flags = liblist.l_flags;
8648 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
8650 if ((flags & l_flags_vals[fcnt].bit) != 0)
8652 fputs (l_flags_vals[fcnt].name, stdout);
8653 flags ^= l_flags_vals[fcnt].bit;
8656 printf (" %#x", (unsigned int) flags);
8666 if (options_offset != 0)
8668 Elf_External_Options * eopt;
8669 Elf_Internal_Shdr * sect = section_headers;
8670 Elf_Internal_Options * iopt;
8671 Elf_Internal_Options * option;
8675 /* Find the section header so that we get the size. */
8676 while (sect->sh_type != SHT_MIPS_OPTIONS)
8679 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset,
8680 sect->sh_size, _("options"));
8683 iopt = ((Elf_Internal_Options *)
8684 malloc ((sect->sh_size / sizeof (eopt)) * sizeof (* iopt)));
8687 error (_("Out of memory"));
8694 while (offset < sect->sh_size)
8696 Elf_External_Options * eoption;
8698 eoption = (Elf_External_Options *) ((char *) eopt + offset);
8700 option->kind = BYTE_GET (eoption->kind);
8701 option->size = BYTE_GET (eoption->size);
8702 option->section = BYTE_GET (eoption->section);
8703 option->info = BYTE_GET (eoption->info);
8705 offset += option->size;
8711 printf (_("\nSection '%s' contains %d entries:\n"),
8712 SECTION_NAME (sect), cnt);
8720 switch (option->kind)
8723 /* This shouldn't happen. */
8724 printf (" NULL %d %lx", option->section, option->info);
8727 printf (" REGINFO ");
8728 if (elf_header.e_machine == EM_MIPS)
8731 Elf32_External_RegInfo * ereg;
8732 Elf32_RegInfo reginfo;
8734 ereg = (Elf32_External_RegInfo *) (option + 1);
8735 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8736 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8737 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8738 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8739 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8740 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
8742 printf ("GPR %08lx GP 0x%lx\n",
8744 (unsigned long) reginfo.ri_gp_value);
8745 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8746 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8747 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8752 Elf64_External_RegInfo * ereg;
8753 Elf64_Internal_RegInfo reginfo;
8755 ereg = (Elf64_External_RegInfo *) (option + 1);
8756 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8757 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8758 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8759 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8760 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8761 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
8763 printf ("GPR %08lx GP 0x",
8764 reginfo.ri_gprmask);
8765 printf_vma (reginfo.ri_gp_value);
8768 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8769 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8770 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8774 case ODK_EXCEPTIONS:
8775 fputs (" EXCEPTIONS fpe_min(", stdout);
8776 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
8777 fputs (") fpe_max(", stdout);
8778 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
8779 fputs (")", stdout);
8781 if (option->info & OEX_PAGE0)
8782 fputs (" PAGE0", stdout);
8783 if (option->info & OEX_SMM)
8784 fputs (" SMM", stdout);
8785 if (option->info & OEX_FPDBUG)
8786 fputs (" FPDBUG", stdout);
8787 if (option->info & OEX_DISMISS)
8788 fputs (" DISMISS", stdout);
8791 fputs (" PAD ", stdout);
8792 if (option->info & OPAD_PREFIX)
8793 fputs (" PREFIX", stdout);
8794 if (option->info & OPAD_POSTFIX)
8795 fputs (" POSTFIX", stdout);
8796 if (option->info & OPAD_SYMBOL)
8797 fputs (" SYMBOL", stdout);
8800 fputs (" HWPATCH ", stdout);
8801 if (option->info & OHW_R4KEOP)
8802 fputs (" R4KEOP", stdout);
8803 if (option->info & OHW_R8KPFETCH)
8804 fputs (" R8KPFETCH", stdout);
8805 if (option->info & OHW_R5KEOP)
8806 fputs (" R5KEOP", stdout);
8807 if (option->info & OHW_R5KCVTL)
8808 fputs (" R5KCVTL", stdout);
8811 fputs (" FILL ", stdout);
8812 /* XXX Print content of info word? */
8815 fputs (" TAGS ", stdout);
8816 /* XXX Print content of info word? */
8819 fputs (" HWAND ", stdout);
8820 if (option->info & OHWA0_R4KEOP_CHECKED)
8821 fputs (" R4KEOP_CHECKED", stdout);
8822 if (option->info & OHWA0_R4KEOP_CLEAN)
8823 fputs (" R4KEOP_CLEAN", stdout);
8826 fputs (" HWOR ", stdout);
8827 if (option->info & OHWA0_R4KEOP_CHECKED)
8828 fputs (" R4KEOP_CHECKED", stdout);
8829 if (option->info & OHWA0_R4KEOP_CLEAN)
8830 fputs (" R4KEOP_CLEAN", stdout);
8833 printf (" GP_GROUP %#06lx self-contained %#06lx",
8834 option->info & OGP_GROUP,
8835 (option->info & OGP_SELF) >> 16);
8838 printf (" IDENT %#06lx self-contained %#06lx",
8839 option->info & OGP_GROUP,
8840 (option->info & OGP_SELF) >> 16);
8843 /* This shouldn't happen. */
8844 printf (" %3d ??? %d %lx",
8845 option->kind, option->section, option->info);
8849 len = sizeof (* eopt);
8850 while (len < option->size)
8851 if (((char *) option)[len] >= ' '
8852 && ((char *) option)[len] < 0x7f)
8853 printf ("%c", ((char *) option)[len++]);
8855 printf ("\\%03o", ((char *) option)[len++]);
8857 fputs ("\n", stdout);
8865 if (conflicts_offset != 0 && conflictsno != 0)
8867 Elf32_Conflict * iconf;
8870 if (dynamic_symbols == NULL)
8872 error (_("conflict list with without table"));
8876 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (* iconf));
8879 error (_("Out of memory"));
8885 Elf32_External_Conflict * econf32;
8887 econf32 = ((Elf32_External_Conflict *)
8888 get_data (NULL, file, conflicts_offset,
8889 conflictsno * sizeof (* econf32),
8894 for (cnt = 0; cnt < conflictsno; ++cnt)
8895 iconf[cnt] = BYTE_GET (econf32[cnt]);
8901 Elf64_External_Conflict * econf64;
8903 econf64 = ((Elf64_External_Conflict *)
8904 get_data (NULL, file, conflicts_offset,
8905 conflictsno * sizeof (* econf64),
8910 for (cnt = 0; cnt < conflictsno; ++cnt)
8911 iconf[cnt] = BYTE_GET (econf64[cnt]);
8916 printf (_("\nSection '.conflict' contains %ld entries:\n"),
8917 (long) conflictsno);
8918 puts (_(" Num: Index Value Name"));
8920 for (cnt = 0; cnt < conflictsno; ++cnt)
8922 Elf_Internal_Sym * psym = &dynamic_symbols[iconf[cnt]];
8924 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
8925 print_vma (psym->st_value, FULL_HEX);
8926 printf (" %s\n", dynamic_strings + psym->st_name);
8936 get_note_type (e_type)
8939 static char buff[64];
8943 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
8944 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
8945 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
8946 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
8947 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
8948 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
8949 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
8950 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
8951 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
8952 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
8953 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
8955 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
8960 /* Note that by the ELF standard, the name field is already null byte
8961 terminated, and namesz includes the terminating null byte.
8962 I.E. the value of namesz for the name "FSF" is 4.
8964 If the value of namesz is zero, there is no name present. */
8966 process_note (pnote)
8967 Elf32_Internal_Note * pnote;
8969 printf (" %s\t\t0x%08lx\t%s\n",
8970 pnote->namesz ? pnote->namedata : "(NONE)",
8971 pnote->descsz, get_note_type (pnote->type));
8977 process_corefile_note_segment (file, offset, length)
8982 Elf_External_Note * pnotes;
8983 Elf_External_Note * external;
8989 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, length,
8996 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
8997 (unsigned long) offset, (unsigned long) length);
8998 printf (_(" Owner\t\tData size\tDescription\n"));
9000 while (external < (Elf_External_Note *)((char *) pnotes + length))
9002 Elf32_Internal_Note inote;
9005 inote.type = BYTE_GET (external->type);
9006 inote.namesz = BYTE_GET (external->namesz);
9007 inote.namedata = external->name;
9008 inote.descsz = BYTE_GET (external->descsz);
9009 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
9010 inote.descpos = offset + (inote.descdata - (char *) pnotes);
9012 external = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
9014 /* Verify that name is null terminated. It appears that at least
9015 one version of Linux (RedHat 6.0) generates corefiles that don't
9016 comply with the ELF spec by failing to include the null byte in
9018 if (inote.namedata[inote.namesz] != '\0')
9020 temp = malloc (inote.namesz + 1);
9024 error (_("Out of memory\n"));
9029 strncpy (temp, inote.namedata, inote.namesz);
9030 temp[inote.namesz] = 0;
9032 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9033 inote.namedata = temp;
9036 res &= process_note (& inote);
9051 process_corefile_note_segments (file)
9054 Elf_Internal_Phdr * program_headers;
9055 Elf_Internal_Phdr * segment;
9059 program_headers = (Elf_Internal_Phdr *) malloc
9060 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
9062 if (program_headers == NULL)
9064 error (_("Out of memory\n"));
9069 i = get_32bit_program_headers (file, program_headers);
9071 i = get_64bit_program_headers (file, program_headers);
9075 free (program_headers);
9079 for (i = 0, segment = program_headers;
9080 i < elf_header.e_phnum;
9083 if (segment->p_type == PT_NOTE)
9084 res &= process_corefile_note_segment (file,
9085 (bfd_vma) segment->p_offset,
9086 (bfd_vma) segment->p_filesz);
9089 free (program_headers);
9095 process_corefile_contents (file)
9098 /* If we have not been asked to display the notes then do nothing. */
9102 /* If file is not a core file then exit. */
9103 if (elf_header.e_type != ET_CORE)
9106 /* No program headers means no NOTE segment. */
9107 if (elf_header.e_phnum == 0)
9109 printf (_("No note segments present in the core file.\n"));
9113 return process_corefile_note_segments (file);
9117 process_arch_specific (file)
9123 switch (elf_header.e_machine)
9126 case EM_MIPS_RS3_LE:
9127 return process_mips_specific (file);
9136 get_file_header (file)
9139 /* Read in the identity array. */
9140 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
9143 /* Determine how to read the rest of the header. */
9144 switch (elf_header.e_ident [EI_DATA])
9146 default: /* fall through */
9147 case ELFDATANONE: /* fall through */
9148 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
9149 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
9152 /* For now we only support 32 bit and 64 bit ELF files. */
9153 is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
9155 /* Read in the rest of the header. */
9158 Elf32_External_Ehdr ehdr32;
9160 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
9163 elf_header.e_type = BYTE_GET (ehdr32.e_type);
9164 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
9165 elf_header.e_version = BYTE_GET (ehdr32.e_version);
9166 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
9167 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
9168 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
9169 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
9170 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
9171 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
9172 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
9173 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
9174 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
9175 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
9179 Elf64_External_Ehdr ehdr64;
9181 /* If we have been compiled with sizeof (bfd_vma) == 4, then
9182 we will not be able to cope with the 64bit data found in
9183 64 ELF files. Detect this now and abort before we start
9184 overwritting things. */
9185 if (sizeof (bfd_vma) < 8)
9187 error (_("This instance of readelf has been built without support for a\n\
9188 64 bit data type and so it cannot read 64 bit ELF files.\n"));
9192 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
9195 elf_header.e_type = BYTE_GET (ehdr64.e_type);
9196 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
9197 elf_header.e_version = BYTE_GET (ehdr64.e_version);
9198 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
9199 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
9200 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
9201 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
9202 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
9203 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
9204 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
9205 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
9206 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
9207 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
9210 /* There may be some extensions in the first section header. Don't
9211 bomb if we can't read it. */
9213 get_32bit_section_headers (file, 1);
9215 get_64bit_section_headers (file, 1);
9221 process_file (file_name)
9225 struct stat statbuf;
9228 if (stat (file_name, & statbuf) < 0)
9230 error (_("Cannot stat input file %s.\n"), file_name);
9234 file = fopen (file_name, "rb");
9237 error (_("Input file %s not found.\n"), file_name);
9241 if (! get_file_header (file))
9243 error (_("%s: Failed to read file header\n"), file_name);
9248 /* Initialise per file variables. */
9249 for (i = NUM_ELEM (version_info); i--;)
9250 version_info[i] = 0;
9252 for (i = NUM_ELEM (dynamic_info); i--;)
9253 dynamic_info[i] = 0;
9255 /* Process the file. */
9257 printf (_("\nFile: %s\n"), file_name);
9259 if (! process_file_header ())
9265 process_section_headers (file);
9267 process_program_headers (file);
9269 process_dynamic_segment (file);
9271 process_relocs (file);
9273 process_unwind (file);
9275 process_symbol_table (file);
9277 process_syminfo (file);
9279 process_version_sections (file);
9281 process_section_contents (file);
9283 process_corefile_contents (file);
9285 process_arch_specific (file);
9289 if (section_headers)
9291 free (section_headers);
9292 section_headers = NULL;
9297 free (string_table);
9298 string_table = NULL;
9299 string_table_length = 0;
9302 if (dynamic_strings)
9304 free (dynamic_strings);
9305 dynamic_strings = NULL;
9308 if (dynamic_symbols)
9310 free (dynamic_symbols);
9311 dynamic_symbols = NULL;
9312 num_dynamic_syms = 0;
9315 if (dynamic_syminfo)
9317 free (dynamic_syminfo);
9318 dynamic_syminfo = NULL;
9324 #ifdef SUPPORT_DISASSEMBLY
9325 /* Needed by the i386 disassembler. For extra credit, someone could
9326 fix this so that we insert symbolic addresses here, esp for GOT/PLT
9330 print_address (unsigned int addr, FILE * outfile)
9332 fprintf (outfile,"0x%8.8x", addr);
9335 /* Needed by the i386 disassembler. */
9337 db_task_printsym (unsigned int addr)
9339 print_address (addr, stderr);
9343 int main PARAMS ((int, char **));
9352 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9353 setlocale (LC_MESSAGES, "");
9355 #if defined (HAVE_SETLOCALE)
9356 setlocale (LC_CTYPE, "");
9358 bindtextdomain (PACKAGE, LOCALEDIR);
9359 textdomain (PACKAGE);
9361 parse_args (argc, argv);
9363 if (optind < (argc - 1))
9367 while (optind < argc)
9368 err |= process_file (argv [optind ++]);
9370 if (dump_sects != NULL)