1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 #include <sys/types.h>
32 /* Define BFD64 here, even if our default architecture is 32 bit ELF
33 as this will allow us to read in and parse 64bit and 32bit ELF files.
34 Only do this if we belive that the compiler can support a 64 bit
35 data type. For now we only rely on GCC being able to do this. */
41 #include "elf/common.h"
42 #include "elf/external.h"
43 #include "elf/internal.h"
44 #include "elf/dwarf2.h"
46 /* The following headers use the elf/reloc-macros.h file to
47 automatically generate relocation recognition functions
48 such as elf_mips_reloc_type() */
50 #define RELOC_MACROS_GEN_FUNC
52 #include "elf/alpha.h"
68 #include "elf/mcore.h"
71 #include "elf/mn10200.h"
72 #include "elf/mn10300.h"
78 #include "elf/sparc.h"
80 #include "elf/x86-64.h"
81 #include "elf/xstormy16.h"
86 char * program_name
= "readelf";
87 unsigned int dynamic_addr
;
88 bfd_size_type dynamic_size
;
89 unsigned int rela_addr
;
90 unsigned int rela_size
;
91 char * dynamic_strings
;
93 unsigned long string_table_length
;
94 unsigned long num_dynamic_syms
;
95 Elf_Internal_Sym
* dynamic_symbols
;
96 Elf_Internal_Syminfo
* dynamic_syminfo
;
97 unsigned long dynamic_syminfo_offset
;
98 unsigned int dynamic_syminfo_nent
;
99 char program_interpreter
[64];
100 int dynamic_info
[DT_JMPREL
+ 1];
101 int version_info
[16];
103 Elf_Internal_Ehdr elf_header
;
104 Elf_Internal_Shdr
* section_headers
;
105 Elf_Internal_Dyn
* dynamic_segment
;
106 Elf_Internal_Shdr
* symtab_shndx_hdr
;
114 int do_using_dynamic
;
122 int do_debug_abbrevs
;
124 int do_debug_pubnames
;
125 int do_debug_aranges
;
127 int do_debug_frames_interp
;
128 int do_debug_macinfo
;
134 /* A dynamic array of flags indicating which sections require dumping. */
135 char * dump_sects
= NULL
;
136 unsigned int num_dump_sects
= 0;
138 #define HEX_DUMP (1 << 0)
139 #define DISASS_DUMP (1 << 1)
140 #define DEBUG_DUMP (1 << 2)
142 /* How to rpint a vma value. */
143 typedef enum print_mode
155 /* Forward declarations for dumb compilers. */
156 static void print_vma
PARAMS ((bfd_vma
, print_mode
));
157 static void print_symbol
PARAMS ((int, char *));
158 static bfd_vma (* byte_get
) PARAMS ((unsigned char *, int));
159 static bfd_vma byte_get_little_endian
PARAMS ((unsigned char *, int));
160 static bfd_vma byte_get_big_endian
PARAMS ((unsigned char *, int));
161 static const char * get_mips_dynamic_type
PARAMS ((unsigned long));
162 static const char * get_sparc64_dynamic_type
PARAMS ((unsigned long));
163 static const char * get_ppc64_dynamic_type
PARAMS ((unsigned long));
164 static const char * get_parisc_dynamic_type
PARAMS ((unsigned long));
165 static const char * get_dynamic_type
PARAMS ((unsigned long));
166 static int slurp_rela_relocs
PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela
**, unsigned long *));
167 static int slurp_rel_relocs
PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rel
**, unsigned long *));
168 static int dump_relocations
PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym
*, unsigned long, char *, int));
169 static char * get_file_type
PARAMS ((unsigned));
170 static char * get_machine_name
PARAMS ((unsigned));
171 static void decode_ARM_machine_flags
PARAMS ((unsigned, char []));
172 static char * get_machine_flags
PARAMS ((unsigned, unsigned));
173 static const char * get_mips_segment_type
PARAMS ((unsigned long));
174 static const char * get_parisc_segment_type
PARAMS ((unsigned long));
175 static const char * get_ia64_segment_type
PARAMS ((unsigned long));
176 static const char * get_segment_type
PARAMS ((unsigned long));
177 static const char * get_mips_section_type_name
PARAMS ((unsigned int));
178 static const char * get_parisc_section_type_name
PARAMS ((unsigned int));
179 static const char * get_ia64_section_type_name
PARAMS ((unsigned int));
180 static const char * get_section_type_name
PARAMS ((unsigned int));
181 static const char * get_symbol_binding
PARAMS ((unsigned int));
182 static const char * get_symbol_type
PARAMS ((unsigned int));
183 static const char * get_symbol_visibility
PARAMS ((unsigned int));
184 static const char * get_symbol_index_type
PARAMS ((unsigned int));
185 static const char * get_dynamic_flags
PARAMS ((bfd_vma
));
186 static void usage
PARAMS ((void));
187 static void parse_args
PARAMS ((int, char **));
188 static int process_file_header
PARAMS ((void));
189 static int process_program_headers
PARAMS ((FILE *));
190 static int process_section_headers
PARAMS ((FILE *));
191 static int process_unwind
PARAMS ((FILE *));
192 static void dynamic_segment_mips_val
PARAMS ((Elf_Internal_Dyn
*));
193 static void dynamic_segment_parisc_val
PARAMS ((Elf_Internal_Dyn
*));
194 static int process_dynamic_segment
PARAMS ((FILE *));
195 static int process_symbol_table
PARAMS ((FILE *));
196 static int process_syminfo
PARAMS ((FILE *));
197 static int process_section_contents
PARAMS ((FILE *));
198 static void process_mips_fpe_exception
PARAMS ((int));
199 static int process_mips_specific
PARAMS ((FILE *));
200 static int process_file
PARAMS ((char *));
201 static int process_relocs
PARAMS ((FILE *));
202 static int process_version_sections
PARAMS ((FILE *));
203 static char * get_ver_flags
PARAMS ((unsigned int));
204 static int get_32bit_section_headers
PARAMS ((FILE *, unsigned int));
205 static int get_64bit_section_headers
PARAMS ((FILE *, unsigned int));
206 static int get_32bit_program_headers
PARAMS ((FILE *, Elf_Internal_Phdr
*));
207 static int get_64bit_program_headers
PARAMS ((FILE *, Elf_Internal_Phdr
*));
208 static int get_file_header
PARAMS ((FILE *));
209 static Elf_Internal_Sym
* get_32bit_elf_symbols
PARAMS ((FILE *, Elf_Internal_Shdr
*));
210 static Elf_Internal_Sym
* get_64bit_elf_symbols
PARAMS ((FILE *, Elf_Internal_Shdr
*));
211 static const char * get_elf_section_flags
PARAMS ((bfd_vma
));
212 static int * get_dynamic_data
PARAMS ((FILE *, unsigned int));
213 static int get_32bit_dynamic_segment
PARAMS ((FILE *));
214 static int get_64bit_dynamic_segment
PARAMS ((FILE *));
215 #ifdef SUPPORT_DISASSEMBLY
216 static int disassemble_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
218 static int dump_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
219 static int display_debug_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
220 static int display_debug_info
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
221 static int display_debug_not_supported
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
222 static int prescan_debug_info
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
223 static int display_debug_lines
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
224 static int display_debug_pubnames
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
225 static int display_debug_abbrev
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
226 static int display_debug_aranges
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
227 static int display_debug_frames
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
228 static int display_debug_macinfo
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
229 static int display_debug_str
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
230 static unsigned char * process_abbrev_section
PARAMS ((unsigned char *, unsigned char *));
231 static void load_debug_str
PARAMS ((FILE *));
232 static void free_debug_str
PARAMS ((void));
233 static const char * fetch_indirect_string
PARAMS ((unsigned long));
234 static unsigned long read_leb128
PARAMS ((unsigned char *, int *, int));
235 static int process_extended_line_op
PARAMS ((unsigned char *, int, int));
236 static void reset_state_machine
PARAMS ((int));
237 static char * get_TAG_name
PARAMS ((unsigned long));
238 static char * get_AT_name
PARAMS ((unsigned long));
239 static char * get_FORM_name
PARAMS ((unsigned long));
240 static void free_abbrevs
PARAMS ((void));
241 static void add_abbrev
PARAMS ((unsigned long, unsigned long, int));
242 static void add_abbrev_attr
PARAMS ((unsigned long, unsigned long));
243 static unsigned char * read_and_display_attr
PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
244 static unsigned char * read_and_display_attr_value
PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
245 static unsigned char * display_block
PARAMS ((unsigned char *, unsigned long));
246 static void decode_location_expression
PARAMS ((unsigned char *, unsigned int, unsigned long));
247 static void request_dump
PARAMS ((unsigned int, int));
248 static const char * get_elf_class
PARAMS ((unsigned int));
249 static const char * get_data_encoding
PARAMS ((unsigned int));
250 static const char * get_osabi_name
PARAMS ((unsigned int));
251 static int guess_is_rela
PARAMS ((unsigned long));
252 static const char * get_note_type
PARAMS ((unsigned int));
253 static const char * get_netbsd_elfcore_note_type
PARAMS ((unsigned int));
254 static int process_note
PARAMS ((Elf32_Internal_Note
*));
255 static int process_corefile_note_segment
PARAMS ((FILE *, bfd_vma
, bfd_vma
));
256 static int process_corefile_note_segments
PARAMS ((FILE *));
257 static int process_corefile_contents
PARAMS ((FILE *));
258 static int process_arch_specific
PARAMS ((FILE *));
260 typedef int Elf32_Word
;
268 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
269 ((X)->sh_name >= string_table_length \
270 ? "<corrupt>" : string_table + (X)->sh_name))
272 /* Given st_shndx I, map to section_headers index. */
273 #define SECTION_HEADER_INDEX(I) \
274 ((I) < SHN_LORESERVE \
276 : ((I) <= SHN_HIRESERVE \
278 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
280 /* Reverse of the above. */
281 #define SECTION_HEADER_NUM(N) \
282 ((N) < SHN_LORESERVE \
284 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
286 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
288 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
290 #define BYTE_GET(field) byte_get (field, sizeof (field))
292 /* If we can support a 64 bit data type then BFD64 should be defined
293 and sizeof (bfd_vma) == 8. In this case when translating from an
294 external 8 byte field to an internal field, we can assume that the
295 internal field is also 8 bytes wide and so we can extract all the data.
296 If, however, BFD64 is not defined, then we must assume that the
297 internal data structure only has 4 byte wide fields that are the
298 equivalent of the 8 byte wide external counterparts, and so we must
299 truncate the data. */
301 #define BYTE_GET8(field) byte_get (field, -8)
303 #define BYTE_GET8(field) byte_get (field, 8)
306 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
308 #define GET_ELF_SYMBOLS(file, section) \
309 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
310 : get_64bit_elf_symbols (file, section))
314 error
VPARAMS ((const char *message
, ...))
316 VA_OPEN (args
, message
);
317 VA_FIXEDARG (args
, const char *, message
);
319 fprintf (stderr
, _("%s: Error: "), program_name
);
320 vfprintf (stderr
, message
, args
);
325 warn
VPARAMS ((const char *message
, ...))
327 VA_OPEN (args
, message
);
328 VA_FIXEDARG (args
, const char *, message
);
330 fprintf (stderr
, _("%s: Warning: "), program_name
);
331 vfprintf (stderr
, message
, args
);
335 static PTR get_data
PARAMS ((PTR
, FILE *, long, size_t, const char *));
338 get_data (var
, file
, offset
, size
, reason
)
350 if (fseek (file
, offset
, SEEK_SET
))
352 error (_("Unable to seek to %x for %s\n"), offset
, reason
);
359 mvar
= (PTR
) malloc (size
);
363 error (_("Out of memory allocating %d bytes for %s\n"),
369 if (fread (mvar
, size
, 1, file
) != 1)
371 error (_("Unable to read in %d bytes of %s\n"), size
, reason
);
381 byte_get_little_endian (field
, size
)
382 unsigned char * field
;
391 return ((unsigned int) (field
[0]))
392 | (((unsigned int) (field
[1])) << 8);
396 /* We want to extract data from an 8 byte wide field and
397 place it into a 4 byte wide field. Since this is a little
398 endian source we can juts use the 4 byte extraction code. */
402 return ((unsigned long) (field
[0]))
403 | (((unsigned long) (field
[1])) << 8)
404 | (((unsigned long) (field
[2])) << 16)
405 | (((unsigned long) (field
[3])) << 24);
410 /* This is a special case, generated by the BYTE_GET8 macro.
411 It means that we are loading an 8 byte value from a field
412 in an external structure into an 8 byte value in a field
413 in an internal strcuture. */
414 return ((bfd_vma
) (field
[0]))
415 | (((bfd_vma
) (field
[1])) << 8)
416 | (((bfd_vma
) (field
[2])) << 16)
417 | (((bfd_vma
) (field
[3])) << 24)
418 | (((bfd_vma
) (field
[4])) << 32)
419 | (((bfd_vma
) (field
[5])) << 40)
420 | (((bfd_vma
) (field
[6])) << 48)
421 | (((bfd_vma
) (field
[7])) << 56);
424 error (_("Unhandled data length: %d\n"), size
);
429 /* Print a VMA value. */
431 print_vma (vma
, mode
)
441 case FULL_HEX
: printf ("0x"); /* drop through */
442 case LONG_HEX
: printf ("%8.8lx", (unsigned long) vma
); break;
443 case PREFIX_HEX
: printf ("0x"); /* drop through */
444 case HEX
: printf ("%lx", (unsigned long) vma
); break;
445 case DEC
: printf ("%ld", (unsigned long) vma
); break;
446 case DEC_5
: printf ("%5ld", (long) vma
); break;
447 case UNSIGNED
: printf ("%lu", (unsigned long) vma
); break;
468 #if BFD_HOST_64BIT_LONG
471 if (_bfd_int64_high (vma
))
472 printf ("%lx%8.8lx", _bfd_int64_high (vma
), _bfd_int64_low (vma
));
474 printf ("%lx", _bfd_int64_low (vma
));
479 #if BFD_HOST_64BIT_LONG
482 if (_bfd_int64_high (vma
))
484 printf ("++%ld", _bfd_int64_low (vma
));
486 printf ("%ld", _bfd_int64_low (vma
));
491 #if BFD_HOST_64BIT_LONG
492 printf ("%5ld", vma
);
494 if (_bfd_int64_high (vma
))
496 printf ("++%ld", _bfd_int64_low (vma
));
498 printf ("%5ld", _bfd_int64_low (vma
));
503 #if BFD_HOST_64BIT_LONG
506 if (_bfd_int64_high (vma
))
508 printf ("++%lu", _bfd_int64_low (vma
));
510 printf ("%lu", _bfd_int64_low (vma
));
518 /* Display a symbol on stdout. If do_wide is not true then
519 format the symbol to be at most WIDTH characters,
520 truhncating as necessary. If WIDTH is negative then
521 format the string to be exactly - WIDTH characters,
522 truncating or padding as necessary. */
525 print_symbol (width
, symbol
)
532 printf ("%-*.*s", width
, width
, symbol
);
534 printf ("%-.*s", width
, symbol
);
538 byte_get_big_endian (field
, size
)
539 unsigned char * field
;
548 return ((unsigned int) (field
[1])) | (((int) (field
[0])) << 8);
551 return ((unsigned long) (field
[3]))
552 | (((unsigned long) (field
[2])) << 8)
553 | (((unsigned long) (field
[1])) << 16)
554 | (((unsigned long) (field
[0])) << 24);
558 /* Although we are extracing data from an 8 byte wide field, we
559 are returning only 4 bytes of data. */
560 return ((unsigned long) (field
[7]))
561 | (((unsigned long) (field
[6])) << 8)
562 | (((unsigned long) (field
[5])) << 16)
563 | (((unsigned long) (field
[4])) << 24);
567 /* This is a special case, generated by the BYTE_GET8 macro.
568 It means that we are loading an 8 byte value from a field
569 in an external structure into an 8 byte value in a field
570 in an internal strcuture. */
571 return ((bfd_vma
) (field
[7]))
572 | (((bfd_vma
) (field
[6])) << 8)
573 | (((bfd_vma
) (field
[5])) << 16)
574 | (((bfd_vma
) (field
[4])) << 24)
575 | (((bfd_vma
) (field
[3])) << 32)
576 | (((bfd_vma
) (field
[2])) << 40)
577 | (((bfd_vma
) (field
[1])) << 48)
578 | (((bfd_vma
) (field
[0])) << 56);
582 error (_("Unhandled data length: %d\n"), size
);
587 /* Guess the relocation size commonly used by the specific machines. */
590 guess_is_rela (e_machine
)
591 unsigned long e_machine
;
595 /* Targets that use REL relocations. */
610 /* Targets that use RELA relocations. */
625 case EM_CYGNUS_MN10200
:
627 case EM_CYGNUS_MN10300
:
664 warn (_("Don't know about relocations on this machine architecture\n"));
670 slurp_rela_relocs (file
, rel_offset
, rel_size
, relasp
, nrelasp
)
672 unsigned long rel_offset
;
673 unsigned long rel_size
;
674 Elf_Internal_Rela
**relasp
;
675 unsigned long *nrelasp
;
677 Elf_Internal_Rela
*relas
;
678 unsigned long nrelas
;
683 Elf32_External_Rela
* erelas
;
685 erelas
= (Elf32_External_Rela
*) get_data (NULL
, file
, rel_offset
,
686 rel_size
, _("relocs"));
690 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
692 relas
= (Elf_Internal_Rela
*)
693 malloc (nrelas
* sizeof (Elf_Internal_Rela
));
697 error(_("out of memory parsing relocs"));
701 for (i
= 0; i
< nrelas
; i
++)
703 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
704 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
705 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
712 Elf64_External_Rela
* erelas
;
714 erelas
= (Elf64_External_Rela
*) get_data (NULL
, file
, rel_offset
,
715 rel_size
, _("relocs"));
719 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
721 relas
= (Elf_Internal_Rela
*)
722 malloc (nrelas
* sizeof (Elf_Internal_Rela
));
726 error(_("out of memory parsing relocs"));
730 for (i
= 0; i
< nrelas
; i
++)
732 relas
[i
].r_offset
= BYTE_GET8 (erelas
[i
].r_offset
);
733 relas
[i
].r_info
= BYTE_GET8 (erelas
[i
].r_info
);
734 relas
[i
].r_addend
= BYTE_GET8 (erelas
[i
].r_addend
);
745 slurp_rel_relocs (file
, rel_offset
, rel_size
, relsp
, nrelsp
)
747 unsigned long rel_offset
;
748 unsigned long rel_size
;
749 Elf_Internal_Rel
**relsp
;
750 unsigned long *nrelsp
;
752 Elf_Internal_Rel
*rels
;
758 Elf32_External_Rel
* erels
;
760 erels
= (Elf32_External_Rel
*) get_data (NULL
, file
, rel_offset
,
761 rel_size
, _("relocs"));
765 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
767 rels
= (Elf_Internal_Rel
*) malloc (nrels
* sizeof (Elf_Internal_Rel
));
771 error(_("out of memory parsing relocs"));
775 for (i
= 0; i
< nrels
; i
++)
777 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
778 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
785 Elf64_External_Rel
* erels
;
787 erels
= (Elf64_External_Rel
*) get_data (NULL
, file
, rel_offset
,
788 rel_size
, _("relocs"));
792 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
794 rels
= (Elf_Internal_Rel
*) malloc (nrels
* sizeof (Elf_Internal_Rel
));
798 error(_("out of memory parsing relocs"));
802 for (i
= 0; i
< nrels
; i
++)
804 rels
[i
].r_offset
= BYTE_GET8 (erels
[i
].r_offset
);
805 rels
[i
].r_info
= BYTE_GET8 (erels
[i
].r_info
);
815 /* Display the contents of the relocation data found at the specified offset. */
817 dump_relocations (file
, rel_offset
, rel_size
, symtab
, nsyms
, strtab
, is_rela
)
819 unsigned long rel_offset
;
820 unsigned long rel_size
;
821 Elf_Internal_Sym
* symtab
;
827 Elf_Internal_Rel
* rels
;
828 Elf_Internal_Rela
* relas
;
831 if (is_rela
== UNKNOWN
)
832 is_rela
= guess_is_rela (elf_header
.e_machine
);
836 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &relas
, &rel_size
))
841 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
850 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
852 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
857 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
859 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
867 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
869 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
874 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
876 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
880 for (i
= 0; i
< rel_size
; i
++)
883 const char * rtype2
= NULL
;
884 const char * rtype3
= NULL
;
887 bfd_vma symtab_index
;
889 bfd_vma type2
= (bfd_vma
) NULL
;
890 bfd_vma type3
= (bfd_vma
) NULL
;
894 offset
= relas
[i
].r_offset
;
895 info
= relas
[i
].r_info
;
899 offset
= rels
[i
].r_offset
;
900 info
= rels
[i
].r_info
;
905 type
= ELF32_R_TYPE (info
);
906 symtab_index
= ELF32_R_SYM (info
);
910 if (elf_header
.e_machine
== EM_MIPS
)
912 type
= ELF64_MIPS_R_TYPE (info
);
913 type2
= ELF64_MIPS_R_TYPE2 (info
);
914 type3
= ELF64_MIPS_R_TYPE3 (info
);
916 else if (elf_header
.e_machine
== EM_SPARCV9
)
917 type
= ELF64_R_TYPE_ID (info
);
919 type
= ELF64_R_TYPE (info
);
920 /* The #ifdef BFD64 below is to prevent a compile time warning.
921 We know that if we do not have a 64 bit data type that we
922 will never execute this code anyway. */
924 symtab_index
= ELF64_R_SYM (info
);
930 #ifdef _bfd_int64_low
931 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
933 printf ("%8.8lx %8.8lx ", offset
, info
);
938 #ifdef _bfd_int64_low
940 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
941 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
942 _bfd_int64_high (offset
),
943 _bfd_int64_low (offset
),
944 _bfd_int64_high (info
),
945 _bfd_int64_low (info
));
948 ? "%16.16lx %16.16lx "
949 : "%12.12lx %12.12lx ",
954 switch (elf_header
.e_machine
)
962 rtype
= elf_m32r_reloc_type (type
);
967 rtype
= elf_i386_reloc_type (type
);
971 rtype
= elf_m68k_reloc_type (type
);
975 rtype
= elf_i960_reloc_type (type
);
980 rtype
= elf_avr_reloc_type (type
);
987 rtype
= elf_sparc_reloc_type (type
);
992 rtype
= v850_reloc_type (type
);
997 rtype
= elf_d10v_reloc_type (type
);
1001 case EM_CYGNUS_D30V
:
1002 rtype
= elf_d30v_reloc_type (type
);
1006 rtype
= elf_sh_reloc_type (type
);
1010 case EM_CYGNUS_MN10300
:
1011 rtype
= elf_mn10300_reloc_type (type
);
1015 case EM_CYGNUS_MN10200
:
1016 rtype
= elf_mn10200_reloc_type (type
);
1020 case EM_CYGNUS_FR30
:
1021 rtype
= elf_fr30_reloc_type (type
);
1025 rtype
= elf_mcore_reloc_type (type
);
1029 rtype
= elf_mmix_reloc_type (type
);
1034 rtype
= elf_ppc_reloc_type (type
);
1038 case EM_MIPS_RS3_LE
:
1039 rtype
= elf_mips_reloc_type (type
);
1042 rtype2
= elf_mips_reloc_type (type2
);
1043 rtype3
= elf_mips_reloc_type (type3
);
1048 rtype
= elf_alpha_reloc_type (type
);
1052 rtype
= elf_arm_reloc_type (type
);
1056 rtype
= elf_arc_reloc_type (type
);
1060 rtype
= elf_hppa_reloc_type (type
);
1066 rtype
= elf_h8_reloc_type (type
);
1071 rtype
= elf_or32_reloc_type (type
);
1076 rtype
= elf_pj_reloc_type (type
);
1079 rtype
= elf_ia64_reloc_type (type
);
1083 rtype
= elf_cris_reloc_type (type
);
1087 rtype
= elf_i860_reloc_type (type
);
1091 rtype
= elf_x86_64_reloc_type (type
);
1096 rtype
= elf_s390_reloc_type (type
);
1100 rtype
= elf_xstormy16_reloc_type (type
);
1105 #ifdef _bfd_int64_low
1106 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type
));
1108 printf (_("unrecognized: %-7lx"), type
);
1111 printf (do_wide
? "%-21.21s" : "%-17.17s", rtype
);
1115 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1116 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1119 Elf_Internal_Sym
* psym
;
1121 psym
= symtab
+ symtab_index
;
1124 print_vma (psym
->st_value
, LONG_HEX
);
1125 printf (is_32bit_elf
? " " : " ");
1127 if (psym
->st_name
== 0)
1128 print_symbol (22, SECTION_NAME (section_headers
+ psym
->st_shndx
));
1129 else if (strtab
== NULL
)
1130 printf (_("<string table index %3ld>"), psym
->st_name
);
1132 print_symbol (22, strtab
+ psym
->st_name
);
1135 printf (" + %lx", (unsigned long) relas
[i
].r_addend
);
1140 printf ("%*c", is_32bit_elf
? (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1141 print_vma (relas
[i
].r_addend
, LONG_HEX
);
1144 if (elf_header
.e_machine
== EM_SPARCV9
1145 && !strcmp (rtype
, "R_SPARC_OLO10"))
1146 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1150 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1152 printf (" Type2: ");
1155 #ifdef _bfd_int64_low
1156 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2
));
1158 printf (_("unrecognized: %-7lx"), type2
);
1161 printf ("%-17.17s", rtype2
);
1163 printf("\n Type3: ");
1166 #ifdef _bfd_int64_low
1167 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3
));
1169 printf (_("unrecognized: %-7lx"), type3
);
1172 printf ("%-17.17s", rtype3
);
1187 get_mips_dynamic_type (type
)
1192 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1193 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1194 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1195 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1196 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1197 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1198 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1199 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1200 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1201 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1202 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1203 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1204 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1205 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1206 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1207 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1208 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1209 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1210 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1211 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1212 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1213 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1214 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1215 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1216 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1217 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1218 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1219 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1220 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1221 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1222 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1223 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1224 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1225 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1226 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1227 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1228 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1229 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1230 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1231 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1232 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1233 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1234 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1241 get_sparc64_dynamic_type (type
)
1246 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1253 get_ppc64_dynamic_type (type
)
1258 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1259 case DT_PPC64_OPD
: return "PPC64_OPD";
1260 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1267 get_parisc_dynamic_type (type
)
1272 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1273 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1274 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1275 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1276 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1277 case DT_HP_PREINIT
: return "HP_PREINIT";
1278 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1279 case DT_HP_NEEDED
: return "HP_NEEDED";
1280 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1281 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1282 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1283 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1284 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1291 get_dynamic_type (type
)
1294 static char buff
[32];
1298 case DT_NULL
: return "NULL";
1299 case DT_NEEDED
: return "NEEDED";
1300 case DT_PLTRELSZ
: return "PLTRELSZ";
1301 case DT_PLTGOT
: return "PLTGOT";
1302 case DT_HASH
: return "HASH";
1303 case DT_STRTAB
: return "STRTAB";
1304 case DT_SYMTAB
: return "SYMTAB";
1305 case DT_RELA
: return "RELA";
1306 case DT_RELASZ
: return "RELASZ";
1307 case DT_RELAENT
: return "RELAENT";
1308 case DT_STRSZ
: return "STRSZ";
1309 case DT_SYMENT
: return "SYMENT";
1310 case DT_INIT
: return "INIT";
1311 case DT_FINI
: return "FINI";
1312 case DT_SONAME
: return "SONAME";
1313 case DT_RPATH
: return "RPATH";
1314 case DT_SYMBOLIC
: return "SYMBOLIC";
1315 case DT_REL
: return "REL";
1316 case DT_RELSZ
: return "RELSZ";
1317 case DT_RELENT
: return "RELENT";
1318 case DT_PLTREL
: return "PLTREL";
1319 case DT_DEBUG
: return "DEBUG";
1320 case DT_TEXTREL
: return "TEXTREL";
1321 case DT_JMPREL
: return "JMPREL";
1322 case DT_BIND_NOW
: return "BIND_NOW";
1323 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1324 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1325 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1326 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1327 case DT_RUNPATH
: return "RUNPATH";
1328 case DT_FLAGS
: return "FLAGS";
1330 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1331 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1333 case DT_CHECKSUM
: return "CHECKSUM";
1334 case DT_PLTPADSZ
: return "PLTPADSZ";
1335 case DT_MOVEENT
: return "MOVEENT";
1336 case DT_MOVESZ
: return "MOVESZ";
1337 case DT_FEATURE
: return "FEATURE";
1338 case DT_POSFLAG_1
: return "POSFLAG_1";
1339 case DT_SYMINSZ
: return "SYMINSZ";
1340 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1342 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1343 case DT_CONFIG
: return "CONFIG";
1344 case DT_DEPAUDIT
: return "DEPAUDIT";
1345 case DT_AUDIT
: return "AUDIT";
1346 case DT_PLTPAD
: return "PLTPAD";
1347 case DT_MOVETAB
: return "MOVETAB";
1348 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1350 case DT_VERSYM
: return "VERSYM";
1352 case DT_RELACOUNT
: return "RELACOUNT";
1353 case DT_RELCOUNT
: return "RELCOUNT";
1354 case DT_FLAGS_1
: return "FLAGS_1";
1355 case DT_VERDEF
: return "VERDEF";
1356 case DT_VERDEFNUM
: return "VERDEFNUM";
1357 case DT_VERNEED
: return "VERNEED";
1358 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1360 case DT_AUXILIARY
: return "AUXILIARY";
1361 case DT_USED
: return "USED";
1362 case DT_FILTER
: return "FILTER";
1365 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1367 const char * result
;
1369 switch (elf_header
.e_machine
)
1372 case EM_MIPS_RS3_LE
:
1373 result
= get_mips_dynamic_type (type
);
1376 result
= get_sparc64_dynamic_type (type
);
1379 result
= get_ppc64_dynamic_type (type
);
1389 sprintf (buff
, _("Processor Specific: %lx"), type
);
1391 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1393 const char * result
;
1395 switch (elf_header
.e_machine
)
1398 result
= get_parisc_dynamic_type (type
);
1408 sprintf (buff
, _("Operating System specific: %lx"), type
);
1411 sprintf (buff
, _("<unknown>: %lx"), type
);
1418 get_file_type (e_type
)
1421 static char buff
[32];
1425 case ET_NONE
: return _("NONE (None)");
1426 case ET_REL
: return _("REL (Relocatable file)");
1427 case ET_EXEC
: return _("EXEC (Executable file)");
1428 case ET_DYN
: return _("DYN (Shared object file)");
1429 case ET_CORE
: return _("CORE (Core file)");
1432 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1433 sprintf (buff
, _("Processor Specific: (%x)"), e_type
);
1434 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1435 sprintf (buff
, _("OS Specific: (%x)"), e_type
);
1437 sprintf (buff
, _("<unknown>: %x"), e_type
);
1443 get_machine_name (e_machine
)
1446 static char buff
[64]; /* XXX */
1450 case EM_NONE
: return _("None");
1451 case EM_M32
: return "WE32100";
1452 case EM_SPARC
: return "Sparc";
1453 case EM_386
: return "Intel 80386";
1454 case EM_68K
: return "MC68000";
1455 case EM_88K
: return "MC88000";
1456 case EM_486
: return "Intel 80486";
1457 case EM_860
: return "Intel 80860";
1458 case EM_MIPS
: return "MIPS R3000";
1459 case EM_S370
: return "IBM System/370";
1460 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1461 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1462 case EM_PARISC
: return "HPPA";
1463 case EM_PPC_OLD
: return "Power PC (old)";
1464 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1465 case EM_960
: return "Intel 90860";
1466 case EM_PPC
: return "PowerPC";
1467 case EM_PPC64
: return "PowerPC64";
1468 case EM_V800
: return "NEC V800";
1469 case EM_FR20
: return "Fujitsu FR20";
1470 case EM_RH32
: return "TRW RH32";
1471 case EM_MCORE
: return "MCORE";
1472 case EM_ARM
: return "ARM";
1473 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1474 case EM_SH
: return "Hitachi SH";
1475 case EM_SPARCV9
: return "Sparc v9";
1476 case EM_TRICORE
: return "Siemens Tricore";
1477 case EM_ARC
: return "ARC";
1478 case EM_H8_300
: return "Hitachi H8/300";
1479 case EM_H8_300H
: return "Hitachi H8/300H";
1480 case EM_H8S
: return "Hitachi H8S";
1481 case EM_H8_500
: return "Hitachi H8/500";
1482 case EM_IA_64
: return "Intel IA-64";
1483 case EM_MIPS_X
: return "Stanford MIPS-X";
1484 case EM_COLDFIRE
: return "Motorola Coldfire";
1485 case EM_68HC12
: return "Motorola M68HC12";
1486 case EM_ALPHA
: return "Alpha";
1487 case EM_CYGNUS_D10V
:
1488 case EM_D10V
: return "d10v";
1489 case EM_CYGNUS_D30V
:
1490 case EM_D30V
: return "d30v";
1491 case EM_CYGNUS_M32R
:
1492 case EM_M32R
: return "Mitsubishi M32r";
1493 case EM_CYGNUS_V850
:
1494 case EM_V850
: return "NEC v850";
1495 case EM_CYGNUS_MN10300
:
1496 case EM_MN10300
: return "mn10300";
1497 case EM_CYGNUS_MN10200
:
1498 case EM_MN10200
: return "mn10200";
1499 case EM_CYGNUS_FR30
:
1500 case EM_FR30
: return "Fujitsu FR30";
1502 case EM_PJ
: return "picoJava";
1503 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1504 case EM_PCP
: return "Siemens PCP";
1505 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1506 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1507 case EM_STARCORE
: return "Motorola Star*Core processor";
1508 case EM_ME16
: return "Toyota ME16 processor";
1509 case EM_ST100
: return "STMicroelectronics ST100 processor";
1510 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1511 case EM_FX66
: return "Siemens FX66 microcontroller";
1512 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1513 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1514 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1515 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1516 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1517 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1518 case EM_SVX
: return "Silicon Graphics SVx";
1519 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1520 case EM_VAX
: return "Digital VAX";
1522 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1523 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1524 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1525 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1526 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1527 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1528 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1529 case EM_PRISM
: return "SiTera Prism";
1530 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1532 case EM_S390
: return "IBM S/390";
1533 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1535 case EM_OR32
: return "OpenRISC";
1537 sprintf (buff
, _("<unknown>: %x"), e_machine
);
1543 decode_ARM_machine_flags (e_flags
, buf
)
1550 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1551 e_flags
&= ~ EF_ARM_EABIMASK
;
1553 /* Handle "generic" ARM flags. */
1554 if (e_flags
& EF_ARM_RELEXEC
)
1556 strcat (buf
, ", relocatable executable");
1557 e_flags
&= ~ EF_ARM_RELEXEC
;
1560 if (e_flags
& EF_ARM_HASENTRY
)
1562 strcat (buf
, ", has entry point");
1563 e_flags
&= ~ EF_ARM_HASENTRY
;
1566 /* Now handle EABI specific flags. */
1570 strcat (buf
, ", <unrecognized EABI>");
1575 case EF_ARM_EABI_VER1
:
1576 strcat (buf
, ", Version1 EABI");
1581 /* Process flags one bit at a time. */
1582 flag
= e_flags
& - e_flags
;
1587 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1588 strcat (buf
, ", sorted symbol tables");
1598 case EF_ARM_EABI_VER2
:
1599 strcat (buf
, ", Version2 EABI");
1604 /* Process flags one bit at a time. */
1605 flag
= e_flags
& - e_flags
;
1610 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1611 strcat (buf
, ", sorted symbol tables");
1614 case EF_ARM_DYNSYMSUSESEGIDX
:
1615 strcat (buf
, ", dynamic symbols use segment index");
1618 case EF_ARM_MAPSYMSFIRST
:
1619 strcat (buf
, ", mapping symbols precede others");
1629 case EF_ARM_EABI_UNKNOWN
:
1630 strcat (buf
, ", GNU EABI");
1635 /* Process flags one bit at a time. */
1636 flag
= e_flags
& - e_flags
;
1641 case EF_ARM_INTERWORK
:
1642 strcat (buf
, ", interworking enabled");
1645 case EF_ARM_APCS_26
:
1646 strcat (buf
, ", uses APCS/26");
1649 case EF_ARM_APCS_FLOAT
:
1650 strcat (buf
, ", uses APCS/float");
1654 strcat (buf
, ", position independent");
1658 strcat (buf
, ", 8 bit structure alignment");
1661 case EF_ARM_NEW_ABI
:
1662 strcat (buf
, ", uses new ABI");
1665 case EF_ARM_OLD_ABI
:
1666 strcat (buf
, ", uses old ABI");
1669 case EF_ARM_SOFT_FLOAT
:
1670 strcat (buf
, ", software FP");
1681 strcat (buf
,", <unknown>");
1685 get_machine_flags (e_flags
, e_machine
)
1689 static char buf
[1024];
1701 decode_ARM_machine_flags (e_flags
, buf
);
1705 if (e_flags
& EF_CPU32
)
1706 strcat (buf
, ", cpu32");
1707 if (e_flags
& EF_M68000
)
1708 strcat (buf
, ", m68000");
1712 if (e_flags
& EF_PPC_EMB
)
1713 strcat (buf
, ", emb");
1715 if (e_flags
& EF_PPC_RELOCATABLE
)
1716 strcat (buf
, ", relocatable");
1718 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
1719 strcat (buf
, ", relocatable-lib");
1723 case EM_CYGNUS_V850
:
1724 switch (e_flags
& EF_V850_ARCH
)
1727 strcat (buf
, ", v850e");
1730 strcat (buf
, ", v850ea");
1733 strcat (buf
, ", v850");
1736 strcat (buf
, ", unknown v850 architecture variant");
1742 case EM_CYGNUS_M32R
:
1743 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
1744 strcat (buf
, ", m32r");
1749 case EM_MIPS_RS3_LE
:
1750 if (e_flags
& EF_MIPS_NOREORDER
)
1751 strcat (buf
, ", noreorder");
1753 if (e_flags
& EF_MIPS_PIC
)
1754 strcat (buf
, ", pic");
1756 if (e_flags
& EF_MIPS_CPIC
)
1757 strcat (buf
, ", cpic");
1759 if (e_flags
& EF_MIPS_UCODE
)
1760 strcat (buf
, ", ugen_reserved");
1762 if (e_flags
& EF_MIPS_ABI2
)
1763 strcat (buf
, ", abi2");
1765 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
1766 strcat (buf
, ", odk first");
1768 if (e_flags
& EF_MIPS_32BITMODE
)
1769 strcat (buf
, ", 32bitmode");
1771 switch ((e_flags
& EF_MIPS_MACH
))
1773 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
1774 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
1775 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
1776 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
1777 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
1778 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
1780 /* We simply ignore the field in this case to avoid confusion:
1781 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
1784 default: strcat (buf
, ", unknown CPU"); break;
1787 switch ((e_flags
& EF_MIPS_ABI
))
1789 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
1790 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
1791 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
1792 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
1794 /* We simply ignore the field in this case to avoid confusion:
1795 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
1796 This means it is likely to be an o32 file, but not for
1799 default: strcat (buf
, ", unknown ABI"); break;
1802 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
1803 strcat (buf
, ", mdmx");
1805 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
1806 strcat (buf
, ", mips16");
1808 switch ((e_flags
& EF_MIPS_ARCH
))
1810 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
1811 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
1812 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
1813 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
1814 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
1815 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
1816 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
1817 default: strcat (buf
, ", unknown ISA"); break;
1823 if (e_flags
& EF_SPARC_32PLUS
)
1824 strcat (buf
, ", v8+");
1826 if (e_flags
& EF_SPARC_SUN_US1
)
1827 strcat (buf
, ", ultrasparcI");
1829 if (e_flags
& EF_SPARC_SUN_US3
)
1830 strcat (buf
, ", ultrasparcIII");
1832 if (e_flags
& EF_SPARC_HAL_R1
)
1833 strcat (buf
, ", halr1");
1835 if (e_flags
& EF_SPARC_LEDATA
)
1836 strcat (buf
, ", ledata");
1838 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
1839 strcat (buf
, ", tso");
1841 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
1842 strcat (buf
, ", pso");
1844 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
1845 strcat (buf
, ", rmo");
1849 switch (e_flags
& EF_PARISC_ARCH
)
1851 case EFA_PARISC_1_0
:
1852 strcpy (buf
, ", PA-RISC 1.0");
1854 case EFA_PARISC_1_1
:
1855 strcpy (buf
, ", PA-RISC 1.1");
1857 case EFA_PARISC_2_0
:
1858 strcpy (buf
, ", PA-RISC 2.0");
1863 if (e_flags
& EF_PARISC_TRAPNIL
)
1864 strcat (buf
, ", trapnil");
1865 if (e_flags
& EF_PARISC_EXT
)
1866 strcat (buf
, ", ext");
1867 if (e_flags
& EF_PARISC_LSB
)
1868 strcat (buf
, ", lsb");
1869 if (e_flags
& EF_PARISC_WIDE
)
1870 strcat (buf
, ", wide");
1871 if (e_flags
& EF_PARISC_NO_KABP
)
1872 strcat (buf
, ", no kabp");
1873 if (e_flags
& EF_PARISC_LAZYSWAP
)
1874 strcat (buf
, ", lazyswap");
1879 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
1880 strcat (buf
, ", new calling convention");
1882 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
1883 strcat (buf
, ", gnu calling convention");
1887 if ((e_flags
& EF_IA_64_ABI64
))
1888 strcat (buf
, ", 64-bit");
1890 strcat (buf
, ", 32-bit");
1891 if ((e_flags
& EF_IA_64_REDUCEDFP
))
1892 strcat (buf
, ", reduced fp model");
1893 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
1894 strcat (buf
, ", no function descriptors, constant gp");
1895 else if ((e_flags
& EF_IA_64_CONS_GP
))
1896 strcat (buf
, ", constant gp");
1897 if ((e_flags
& EF_IA_64_ABSOLUTE
))
1898 strcat (buf
, ", absolute");
1907 get_mips_segment_type (type
)
1912 case PT_MIPS_REGINFO
:
1914 case PT_MIPS_RTPROC
:
1916 case PT_MIPS_OPTIONS
:
1926 get_parisc_segment_type (type
)
1931 case PT_HP_TLS
: return "HP_TLS";
1932 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
1933 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
1934 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
1935 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
1936 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
1937 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
1938 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
1939 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
1940 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
1941 case PT_HP_PARALLEL
: return "HP_PARALLEL";
1942 case PT_HP_FASTBIND
: return "HP_FASTBIND";
1943 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
1944 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
1953 get_ia64_segment_type (type
)
1958 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
1959 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
1960 case PT_HP_TLS
: return "HP_TLS";
1961 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
1962 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
1963 case PT_IA_64_HP_STACK
: return "HP_STACK";
1972 get_segment_type (p_type
)
1973 unsigned long p_type
;
1975 static char buff
[32];
1979 case PT_NULL
: return "NULL";
1980 case PT_LOAD
: return "LOAD";
1981 case PT_DYNAMIC
: return "DYNAMIC";
1982 case PT_INTERP
: return "INTERP";
1983 case PT_NOTE
: return "NOTE";
1984 case PT_SHLIB
: return "SHLIB";
1985 case PT_PHDR
: return "PHDR";
1987 case PT_GNU_EH_FRAME
:
1988 return "GNU_EH_FRAME";
1991 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
1993 const char * result
;
1995 switch (elf_header
.e_machine
)
1998 case EM_MIPS_RS3_LE
:
1999 result
= get_mips_segment_type (p_type
);
2002 result
= get_parisc_segment_type (p_type
);
2005 result
= get_ia64_segment_type (p_type
);
2015 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2017 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2019 const char * result
;
2021 switch (elf_header
.e_machine
)
2024 result
= get_parisc_segment_type (p_type
);
2027 result
= get_ia64_segment_type (p_type
);
2037 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2040 sprintf (buff
, _("<unknown>: %lx"), p_type
);
2047 get_mips_section_type_name (sh_type
)
2048 unsigned int sh_type
;
2052 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2053 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2054 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2055 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2056 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2057 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2058 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2059 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2060 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2061 case SHT_MIPS_RELD
: return "MIPS_RELD";
2062 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2063 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2064 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2065 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2066 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2067 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2068 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2069 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2070 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2071 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2072 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2073 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2074 case SHT_MIPS_LINE
: return "MIPS_LINE";
2075 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2076 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2077 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2078 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2079 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2080 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2081 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2082 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2083 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2084 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2085 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2086 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2087 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2088 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2089 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2090 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2098 get_parisc_section_type_name (sh_type
)
2099 unsigned int sh_type
;
2103 case SHT_PARISC_EXT
: return "PARISC_EXT";
2104 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2105 case SHT_PARISC_DOC
: return "PARISC_DOC";
2113 get_ia64_section_type_name (sh_type
)
2114 unsigned int sh_type
;
2118 case SHT_IA_64_EXT
: return "IA_64_EXT";
2119 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2127 get_section_type_name (sh_type
)
2128 unsigned int sh_type
;
2130 static char buff
[32];
2134 case SHT_NULL
: return "NULL";
2135 case SHT_PROGBITS
: return "PROGBITS";
2136 case SHT_SYMTAB
: return "SYMTAB";
2137 case SHT_STRTAB
: return "STRTAB";
2138 case SHT_RELA
: return "RELA";
2139 case SHT_HASH
: return "HASH";
2140 case SHT_DYNAMIC
: return "DYNAMIC";
2141 case SHT_NOTE
: return "NOTE";
2142 case SHT_NOBITS
: return "NOBITS";
2143 case SHT_REL
: return "REL";
2144 case SHT_SHLIB
: return "SHLIB";
2145 case SHT_DYNSYM
: return "DYNSYM";
2146 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2147 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2148 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2149 case SHT_GROUP
: return "GROUP";
2150 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2151 case SHT_GNU_verdef
: return "VERDEF";
2152 case SHT_GNU_verneed
: return "VERNEED";
2153 case SHT_GNU_versym
: return "VERSYM";
2154 case 0x6ffffff0: return "VERSYM";
2155 case 0x6ffffffc: return "VERDEF";
2156 case 0x7ffffffd: return "AUXILIARY";
2157 case 0x7fffffff: return "FILTER";
2160 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2162 const char * result
;
2164 switch (elf_header
.e_machine
)
2167 case EM_MIPS_RS3_LE
:
2168 result
= get_mips_section_type_name (sh_type
);
2171 result
= get_parisc_section_type_name (sh_type
);
2174 result
= get_ia64_section_type_name (sh_type
);
2184 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2186 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2187 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2188 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2189 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2191 sprintf (buff
, _("<unknown>: %x"), sh_type
);
2197 struct option options
[] =
2199 {"all", no_argument
, 0, 'a'},
2200 {"file-header", no_argument
, 0, 'h'},
2201 {"program-headers", no_argument
, 0, 'l'},
2202 {"headers", no_argument
, 0, 'e'},
2203 {"histogram", no_argument
, 0, 'I'},
2204 {"segments", no_argument
, 0, 'l'},
2205 {"sections", no_argument
, 0, 'S'},
2206 {"section-headers", no_argument
, 0, 'S'},
2207 {"symbols", no_argument
, 0, 's'},
2208 {"syms", no_argument
, 0, 's'},
2209 {"relocs", no_argument
, 0, 'r'},
2210 {"notes", no_argument
, 0, 'n'},
2211 {"dynamic", no_argument
, 0, 'd'},
2212 {"arch-specific", no_argument
, 0, 'A'},
2213 {"version-info", no_argument
, 0, 'V'},
2214 {"use-dynamic", no_argument
, 0, 'D'},
2215 {"hex-dump", required_argument
, 0, 'x'},
2216 {"debug-dump", optional_argument
, 0, 'w'},
2217 {"unwind", no_argument
, 0, 'u'},
2218 #ifdef SUPPORT_DISASSEMBLY
2219 {"instruction-dump", required_argument
, 0, 'i'},
2222 {"version", no_argument
, 0, 'v'},
2223 {"wide", no_argument
, 0, 'W'},
2224 {"help", no_argument
, 0, 'H'},
2225 {0, no_argument
, 0, 0}
2231 fprintf (stdout
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2232 fprintf (stdout
, _(" Display information about the contents of ELF format files\n"));
2233 fprintf (stdout
, _(" Options are:\n\
2234 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2235 -h --file-header Display the ELF file header\n\
2236 -l --program-headers Display the program headers\n\
2237 --segments An alias for --program-headers\n\
2238 -S --section-headers Display the sections' header\n\
2239 --sections An alias for --section-headers\n\
2240 -e --headers Equivalent to: -h -l -S\n\
2241 -s --syms Display the symbol table\n\
2242 --symbols An alias for --syms\n\
2243 -n --notes Display the core notes (if present)\n\
2244 -r --relocs Display the relocations (if present)\n\
2245 -u --unwind Display the unwind info (if present)\n\
2246 -d --dynamic Display the dynamic segment (if present)\n\
2247 -V --version-info Display the version sections (if present)\n\
2248 -A --arch-specific Display architecture specific information (if any).\n\
2249 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2250 -x --hex-dump=<number> Dump the contents of section <number>\n\
2251 -w --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str]\n\
2252 Display the contents of DWARF2 debug sections\n"));
2253 #ifdef SUPPORT_DISASSEMBLY
2254 fprintf (stdout
, _("\
2255 -i --instruction-dump=<number>\n\
2256 Disassemble the contents of section <number>\n"));
2258 fprintf (stdout
, _("\
2259 -I --histogram Display histogram of bucket list lengths\n\
2260 -W --wide Allow output width to exceed 80 characters\n\
2261 -H --help Display this information\n\
2262 -v --version Display the version number of readelf\n"));
2263 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2269 request_dump (section
, type
)
2270 unsigned int section
;
2273 if (section
>= num_dump_sects
)
2275 char * new_dump_sects
;
2277 new_dump_sects
= (char *) calloc (section
+ 1, 1);
2279 if (new_dump_sects
== NULL
)
2280 error (_("Out of memory allocating dump request table."));
2283 /* Copy current flag settings. */
2284 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2288 dump_sects
= new_dump_sects
;
2289 num_dump_sects
= section
+ 1;
2294 dump_sects
[section
] |= type
;
2300 parse_args (argc
, argv
)
2309 while ((c
= getopt_long
2310 (argc
, argv
, "ersuahnldSDAIw::x:i:vVW", options
, NULL
)) != EOF
)
2346 do_using_dynamic
++;
2377 section
= strtoul (optarg
, & cp
, 0);
2378 if (! * cp
&& section
>= 0)
2380 request_dump (section
, HEX_DUMP
);
2390 unsigned int index
= 0;
2394 while (optarg
[index
])
2395 switch (optarg
[index
++])
2404 do_debug_abbrevs
= 1;
2414 do_debug_pubnames
= 1;
2419 do_debug_aranges
= 1;
2423 do_debug_frames_interp
= 1;
2425 do_debug_frames
= 1;
2430 do_debug_macinfo
= 1;
2439 warn (_("Unrecognized debug option '%s'\n"), optarg
);
2444 #ifdef SUPPORT_DISASSEMBLY
2447 section
= strtoul (optarg
, & cp
, 0);
2448 if (! * cp
&& section
>= 0)
2450 request_dump (section
, DISASS_DUMP
);
2456 print_version (program_name
);
2466 /* xgettext:c-format */
2467 error (_("Invalid option '-%c'\n"), c
);
2474 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
2475 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2476 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
)
2480 warn (_("Nothing to do.\n"));
2486 get_elf_class (elf_class
)
2487 unsigned int elf_class
;
2489 static char buff
[32];
2493 case ELFCLASSNONE
: return _("none");
2494 case ELFCLASS32
: return "ELF32";
2495 case ELFCLASS64
: return "ELF64";
2497 sprintf (buff
, _("<unknown: %x>"), elf_class
);
2503 get_data_encoding (encoding
)
2504 unsigned int encoding
;
2506 static char buff
[32];
2510 case ELFDATANONE
: return _("none");
2511 case ELFDATA2LSB
: return _("2's complement, little endian");
2512 case ELFDATA2MSB
: return _("2's complement, big endian");
2514 sprintf (buff
, _("<unknown: %x>"), encoding
);
2520 get_osabi_name (osabi
)
2523 static char buff
[32];
2527 case ELFOSABI_NONE
: return "UNIX - System V";
2528 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2529 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2530 case ELFOSABI_LINUX
: return "UNIX - Linux";
2531 case ELFOSABI_HURD
: return "GNU/Hurd";
2532 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2533 case ELFOSABI_AIX
: return "UNIX - AIX";
2534 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2535 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2536 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2537 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2538 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2539 case ELFOSABI_STANDALONE
: return _("Standalone App");
2540 case ELFOSABI_ARM
: return "ARM";
2542 sprintf (buff
, _("<unknown: %x>"), osabi
);
2547 /* Decode the data held in 'elf_header'. */
2549 process_file_header ()
2551 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2552 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
2553 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
2554 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
2557 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2565 printf (_("ELF Header:\n"));
2566 printf (_(" Magic: "));
2567 for (i
= 0; i
< EI_NIDENT
; i
++)
2568 printf ("%2.2x ", elf_header
.e_ident
[i
]);
2570 printf (_(" Class: %s\n"),
2571 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
2572 printf (_(" Data: %s\n"),
2573 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
2574 printf (_(" Version: %d %s\n"),
2575 elf_header
.e_ident
[EI_VERSION
],
2576 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
2578 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
2581 printf (_(" OS/ABI: %s\n"),
2582 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
2583 printf (_(" ABI Version: %d\n"),
2584 elf_header
.e_ident
[EI_ABIVERSION
]);
2585 printf (_(" Type: %s\n"),
2586 get_file_type (elf_header
.e_type
));
2587 printf (_(" Machine: %s\n"),
2588 get_machine_name (elf_header
.e_machine
));
2589 printf (_(" Version: 0x%lx\n"),
2590 (unsigned long) elf_header
.e_version
);
2592 printf (_(" Entry point address: "));
2593 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2594 printf (_("\n Start of program headers: "));
2595 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2596 printf (_(" (bytes into file)\n Start of section headers: "));
2597 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
2598 printf (_(" (bytes into file)\n"));
2600 printf (_(" Flags: 0x%lx%s\n"),
2601 (unsigned long) elf_header
.e_flags
,
2602 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
2603 printf (_(" Size of this header: %ld (bytes)\n"),
2604 (long) elf_header
.e_ehsize
);
2605 printf (_(" Size of program headers: %ld (bytes)\n"),
2606 (long) elf_header
.e_phentsize
);
2607 printf (_(" Number of program headers: %ld\n"),
2608 (long) elf_header
.e_phnum
);
2609 printf (_(" Size of section headers: %ld (bytes)\n"),
2610 (long) elf_header
.e_shentsize
);
2611 printf (_(" Number of section headers: %ld"),
2612 (long) elf_header
.e_shnum
);
2613 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
2614 printf (" (%ld)", (long) section_headers
[0].sh_size
);
2615 putc ('\n', stdout
);
2616 printf (_(" Section header string table index: %ld"),
2617 (long) elf_header
.e_shstrndx
);
2618 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
2619 printf (" (%ld)", (long) section_headers
[0].sh_link
);
2620 putc ('\n', stdout
);
2623 if (section_headers
!= NULL
)
2625 if (elf_header
.e_shnum
== 0)
2626 elf_header
.e_shnum
= section_headers
[0].sh_size
;
2627 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
2628 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
2629 free (section_headers
);
2630 section_headers
= NULL
;
2638 get_32bit_program_headers (file
, program_headers
)
2640 Elf_Internal_Phdr
* program_headers
;
2642 Elf32_External_Phdr
* phdrs
;
2643 Elf32_External_Phdr
* external
;
2644 Elf32_Internal_Phdr
* internal
;
2647 phdrs
= ((Elf32_External_Phdr
*)
2648 get_data (NULL
, file
, elf_header
.e_phoff
,
2649 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2650 _("program headers")));
2654 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2655 i
< elf_header
.e_phnum
;
2656 i
++, internal
++, external
++)
2658 internal
->p_type
= BYTE_GET (external
->p_type
);
2659 internal
->p_offset
= BYTE_GET (external
->p_offset
);
2660 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
2661 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
2662 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
2663 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
2664 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2665 internal
->p_align
= BYTE_GET (external
->p_align
);
2674 get_64bit_program_headers (file
, program_headers
)
2676 Elf_Internal_Phdr
* program_headers
;
2678 Elf64_External_Phdr
* phdrs
;
2679 Elf64_External_Phdr
* external
;
2680 Elf64_Internal_Phdr
* internal
;
2683 phdrs
= ((Elf64_External_Phdr
*)
2684 get_data (NULL
, file
, elf_header
.e_phoff
,
2685 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2686 _("program headers")));
2690 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2691 i
< elf_header
.e_phnum
;
2692 i
++, internal
++, external
++)
2694 internal
->p_type
= BYTE_GET (external
->p_type
);
2695 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2696 internal
->p_offset
= BYTE_GET8 (external
->p_offset
);
2697 internal
->p_vaddr
= BYTE_GET8 (external
->p_vaddr
);
2698 internal
->p_paddr
= BYTE_GET8 (external
->p_paddr
);
2699 internal
->p_filesz
= BYTE_GET8 (external
->p_filesz
);
2700 internal
->p_memsz
= BYTE_GET8 (external
->p_memsz
);
2701 internal
->p_align
= BYTE_GET8 (external
->p_align
);
2710 process_program_headers (file
)
2713 Elf_Internal_Phdr
* program_headers
;
2714 Elf_Internal_Phdr
* segment
;
2717 if (elf_header
.e_phnum
== 0)
2720 printf (_("\nThere are no program headers in this file.\n"));
2724 if (do_segments
&& !do_header
)
2726 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
2727 printf (_("Entry point "));
2728 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2729 printf (_("\nThere are %d program headers, starting at offset "),
2730 elf_header
.e_phnum
);
2731 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2735 program_headers
= (Elf_Internal_Phdr
*) malloc
2736 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
2738 if (program_headers
== NULL
)
2740 error (_("Out of memory\n"));
2745 i
= get_32bit_program_headers (file
, program_headers
);
2747 i
= get_64bit_program_headers (file
, program_headers
);
2751 free (program_headers
);
2758 (_("\nProgram Header%s:\n"), elf_header
.e_phnum
> 1 ? "s" : "");
2762 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2765 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2769 (_(" Type Offset VirtAddr PhysAddr\n"));
2771 (_(" FileSiz MemSiz Flags Align\n"));
2779 for (i
= 0, segment
= program_headers
;
2780 i
< elf_header
.e_phnum
;
2785 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
2789 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
2790 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
2791 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
2792 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
2793 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
2795 (segment
->p_flags
& PF_R
? 'R' : ' '),
2796 (segment
->p_flags
& PF_W
? 'W' : ' '),
2797 (segment
->p_flags
& PF_X
? 'E' : ' '));
2798 printf ("%#lx", (unsigned long) segment
->p_align
);
2802 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
2803 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
2806 print_vma (segment
->p_offset
, FULL_HEX
);
2810 print_vma (segment
->p_vaddr
, FULL_HEX
);
2812 print_vma (segment
->p_paddr
, FULL_HEX
);
2815 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
2816 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
2819 print_vma (segment
->p_filesz
, FULL_HEX
);
2823 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
2824 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
2827 print_vma (segment
->p_offset
, FULL_HEX
);
2831 (segment
->p_flags
& PF_R
? 'R' : ' '),
2832 (segment
->p_flags
& PF_W
? 'W' : ' '),
2833 (segment
->p_flags
& PF_X
? 'E' : ' '));
2835 if ((unsigned long) segment
->p_align
== segment
->p_align
)
2836 printf ("%#lx", (unsigned long) segment
->p_align
);
2839 print_vma (segment
->p_align
, PREFIX_HEX
);
2844 print_vma (segment
->p_offset
, FULL_HEX
);
2846 print_vma (segment
->p_vaddr
, FULL_HEX
);
2848 print_vma (segment
->p_paddr
, FULL_HEX
);
2850 print_vma (segment
->p_filesz
, FULL_HEX
);
2852 print_vma (segment
->p_memsz
, FULL_HEX
);
2854 (segment
->p_flags
& PF_R
? 'R' : ' '),
2855 (segment
->p_flags
& PF_W
? 'W' : ' '),
2856 (segment
->p_flags
& PF_X
? 'E' : ' '));
2857 print_vma (segment
->p_align
, HEX
);
2861 switch (segment
->p_type
)
2865 loadaddr
= (segment
->p_vaddr
& 0xfffff000)
2866 - (segment
->p_offset
& 0xfffff000);
2871 error (_("more than one dynamic segment\n"));
2873 dynamic_addr
= segment
->p_offset
;
2874 dynamic_size
= segment
->p_filesz
;
2878 if (fseek (file
, (long) segment
->p_offset
, SEEK_SET
))
2879 error (_("Unable to find program interpreter name\n"));
2882 program_interpreter
[0] = 0;
2883 fscanf (file
, "%63s", program_interpreter
);
2886 printf (_("\n [Requesting program interpreter: %s]"),
2887 program_interpreter
);
2893 putc ('\n', stdout
);
2902 if (do_segments
&& section_headers
!= NULL
)
2904 printf (_("\n Section to Segment mapping:\n"));
2905 printf (_(" Segment Sections...\n"));
2907 assert (string_table
!= NULL
);
2909 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
2912 Elf_Internal_Shdr
* section
;
2914 segment
= program_headers
+ i
;
2915 section
= section_headers
;
2917 printf (" %2.2d ", i
);
2919 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
2921 if (section
->sh_size
> 0
2922 /* Compare allocated sections by VMA, unallocated
2923 sections by file offset. */
2924 && (section
->sh_flags
& SHF_ALLOC
2925 ? (section
->sh_addr
>= segment
->p_vaddr
2926 && section
->sh_addr
+ section
->sh_size
2927 <= segment
->p_vaddr
+ segment
->p_memsz
)
2928 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
2929 && (section
->sh_offset
+ section
->sh_size
2930 <= segment
->p_offset
+ segment
->p_filesz
))))
2931 printf ("%s ", SECTION_NAME (section
));
2938 free (program_headers
);
2945 get_32bit_section_headers (file
, num
)
2949 Elf32_External_Shdr
* shdrs
;
2950 Elf32_Internal_Shdr
* internal
;
2953 shdrs
= ((Elf32_External_Shdr
*)
2954 get_data (NULL
, file
, elf_header
.e_shoff
,
2955 elf_header
.e_shentsize
* num
,
2956 _("section headers")));
2960 section_headers
= ((Elf_Internal_Shdr
*)
2961 malloc (num
* sizeof (Elf_Internal_Shdr
)));
2963 if (section_headers
== NULL
)
2965 error (_("Out of memory\n"));
2969 for (i
= 0, internal
= section_headers
;
2973 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
2974 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
2975 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
2976 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
2977 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
2978 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
2979 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
2980 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
2981 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
2982 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
2991 get_64bit_section_headers (file
, num
)
2995 Elf64_External_Shdr
* shdrs
;
2996 Elf64_Internal_Shdr
* internal
;
2999 shdrs
= ((Elf64_External_Shdr
*)
3000 get_data (NULL
, file
, elf_header
.e_shoff
,
3001 elf_header
.e_shentsize
* num
,
3002 _("section headers")));
3006 section_headers
= ((Elf_Internal_Shdr
*)
3007 malloc (num
* sizeof (Elf_Internal_Shdr
)));
3009 if (section_headers
== NULL
)
3011 error (_("Out of memory\n"));
3015 for (i
= 0, internal
= section_headers
;
3019 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3020 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3021 internal
->sh_flags
= BYTE_GET8 (shdrs
[i
].sh_flags
);
3022 internal
->sh_addr
= BYTE_GET8 (shdrs
[i
].sh_addr
);
3023 internal
->sh_size
= BYTE_GET8 (shdrs
[i
].sh_size
);
3024 internal
->sh_entsize
= BYTE_GET8 (shdrs
[i
].sh_entsize
);
3025 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3026 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3027 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3028 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3036 static Elf_Internal_Sym
*
3037 get_32bit_elf_symbols (file
, section
)
3039 Elf_Internal_Shdr
*section
;
3041 unsigned long number
;
3042 Elf32_External_Sym
* esyms
;
3043 Elf_External_Sym_Shndx
*shndx
;
3044 Elf_Internal_Sym
* isyms
;
3045 Elf_Internal_Sym
* psym
;
3048 esyms
= ((Elf32_External_Sym
*)
3049 get_data (NULL
, file
, section
->sh_offset
,
3050 section
->sh_size
, _("symbols")));
3055 if (symtab_shndx_hdr
!= NULL
3056 && (symtab_shndx_hdr
->sh_link
3057 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3059 shndx
= ((Elf_External_Sym_Shndx
*)
3060 get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3061 symtab_shndx_hdr
->sh_size
, _("symtab shndx")));
3069 number
= section
->sh_size
/ section
->sh_entsize
;
3070 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
3074 error (_("Out of memory\n"));
3081 for (j
= 0, psym
= isyms
;
3085 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3086 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3087 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3088 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3089 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3091 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3092 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3093 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3103 static Elf_Internal_Sym
*
3104 get_64bit_elf_symbols (file
, section
)
3106 Elf_Internal_Shdr
*section
;
3108 unsigned long number
;
3109 Elf64_External_Sym
* esyms
;
3110 Elf_External_Sym_Shndx
*shndx
;
3111 Elf_Internal_Sym
* isyms
;
3112 Elf_Internal_Sym
* psym
;
3115 esyms
= ((Elf64_External_Sym
*)
3116 get_data (NULL
, file
, section
->sh_offset
,
3117 section
->sh_size
, _("symbols")));
3122 if (symtab_shndx_hdr
!= NULL
3123 && (symtab_shndx_hdr
->sh_link
3124 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3126 shndx
= ((Elf_External_Sym_Shndx
*)
3127 get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3128 symtab_shndx_hdr
->sh_size
, _("symtab shndx")));
3136 number
= section
->sh_size
/ section
->sh_entsize
;
3137 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
3141 error (_("Out of memory\n"));
3148 for (j
= 0, psym
= isyms
;
3152 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3153 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3154 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3155 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3156 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3158 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3159 psym
->st_value
= BYTE_GET8 (esyms
[j
].st_value
);
3160 psym
->st_size
= BYTE_GET8 (esyms
[j
].st_size
);
3171 get_elf_section_flags (sh_flags
)
3174 static char buff
[32];
3182 flag
= sh_flags
& - sh_flags
;
3187 case SHF_WRITE
: strcat (buff
, "W"); break;
3188 case SHF_ALLOC
: strcat (buff
, "A"); break;
3189 case SHF_EXECINSTR
: strcat (buff
, "X"); break;
3190 case SHF_MERGE
: strcat (buff
, "M"); break;
3191 case SHF_STRINGS
: strcat (buff
, "S"); break;
3192 case SHF_INFO_LINK
: strcat (buff
, "I"); break;
3193 case SHF_LINK_ORDER
: strcat (buff
, "L"); break;
3194 case SHF_OS_NONCONFORMING
: strcat (buff
, "O"); break;
3195 case SHF_GROUP
: strcat (buff
, "G"); break;
3198 if (flag
& SHF_MASKOS
)
3201 sh_flags
&= ~ SHF_MASKOS
;
3203 else if (flag
& SHF_MASKPROC
)
3206 sh_flags
&= ~ SHF_MASKPROC
;
3218 process_section_headers (file
)
3221 Elf_Internal_Shdr
* section
;
3224 section_headers
= NULL
;
3226 if (elf_header
.e_shnum
== 0)
3229 printf (_("\nThere are no sections in this file.\n"));
3234 if (do_sections
&& !do_header
)
3235 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3236 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3240 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3243 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3246 /* Read in the string table, so that we have names to display. */
3247 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3249 if (section
->sh_size
!= 0)
3251 string_table
= (char *) get_data (NULL
, file
, section
->sh_offset
,
3252 section
->sh_size
, _("string table"));
3254 string_table_length
= section
->sh_size
;
3257 /* Scan the sections for the dynamic symbol table
3258 and dynamic string table and debug sections. */
3259 dynamic_symbols
= NULL
;
3260 dynamic_strings
= NULL
;
3261 dynamic_syminfo
= NULL
;
3263 for (i
= 0, section
= section_headers
;
3264 i
< elf_header
.e_shnum
;
3267 char * name
= SECTION_NAME (section
);
3269 if (section
->sh_type
== SHT_DYNSYM
)
3271 if (dynamic_symbols
!= NULL
)
3273 error (_("File contains multiple dynamic symbol tables\n"));
3277 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3278 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3280 else if (section
->sh_type
== SHT_STRTAB
3281 && strcmp (name
, ".dynstr") == 0)
3283 if (dynamic_strings
!= NULL
)
3285 error (_("File contains multiple dynamic string tables\n"));
3289 dynamic_strings
= (char *) get_data (NULL
, file
, section
->sh_offset
,
3291 _("dynamic strings"));
3293 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
3295 if (symtab_shndx_hdr
!= NULL
)
3297 error (_("File contains multiple symtab shndx tables\n"));
3300 symtab_shndx_hdr
= section
;
3302 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
3303 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
3304 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
)
3305 && strncmp (name
, ".debug_", 7) == 0)
3310 || (do_debug_info
&& (strcmp (name
, "info") == 0))
3311 || (do_debug_abbrevs
&& (strcmp (name
, "abbrev") == 0))
3312 || (do_debug_lines
&& (strcmp (name
, "line") == 0))
3313 || (do_debug_pubnames
&& (strcmp (name
, "pubnames") == 0))
3314 || (do_debug_aranges
&& (strcmp (name
, "aranges") == 0))
3315 || (do_debug_frames
&& (strcmp (name
, "frame") == 0))
3316 || (do_debug_macinfo
&& (strcmp (name
, "macinfo") == 0))
3317 || (do_debug_str
&& (strcmp (name
, "str") == 0))
3319 request_dump (i
, DEBUG_DUMP
);
3321 /* linkonce section to be combined with .debug_info at link time. */
3322 else if ((do_debugging
|| do_debug_info
)
3323 && strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
3324 request_dump (i
, DEBUG_DUMP
);
3325 else if (do_debug_frames
&& strcmp (name
, ".eh_frame") == 0)
3326 request_dump (i
, DEBUG_DUMP
);
3332 printf (_("\nSection Header%s:\n"), elf_header
.e_shnum
> 1 ? "s" : "");
3336 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3339 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3342 printf (_(" [Nr] Name Type Address Offset\n"));
3343 printf (_(" Size EntSize Flags Link Info Align\n"));
3346 for (i
= 0, section
= section_headers
;
3347 i
< elf_header
.e_shnum
;
3350 printf (" [%2u] %-17.17s %-15.15s ",
3351 SECTION_HEADER_NUM (i
),
3352 SECTION_NAME (section
),
3353 get_section_type_name (section
->sh_type
));
3357 print_vma (section
->sh_addr
, LONG_HEX
);
3359 printf ( " %6.6lx %6.6lx %2.2lx",
3360 (unsigned long) section
->sh_offset
,
3361 (unsigned long) section
->sh_size
,
3362 (unsigned long) section
->sh_entsize
);
3364 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3366 printf ("%2ld %3lx %2ld\n",
3367 (unsigned long) section
->sh_link
,
3368 (unsigned long) section
->sh_info
,
3369 (unsigned long) section
->sh_addralign
);
3373 print_vma (section
->sh_addr
, LONG_HEX
);
3375 if ((long) section
->sh_offset
== section
->sh_offset
)
3376 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
3380 print_vma (section
->sh_offset
, LONG_HEX
);
3383 if ((unsigned long) section
->sh_size
== section
->sh_size
)
3384 printf (" %6.6lx", (unsigned long) section
->sh_size
);
3388 print_vma (section
->sh_size
, LONG_HEX
);
3391 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
3392 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
3396 print_vma (section
->sh_entsize
, LONG_HEX
);
3399 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3401 printf ("%2ld %3lx ",
3402 (unsigned long) section
->sh_link
,
3403 (unsigned long) section
->sh_info
);
3405 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
3406 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
3409 print_vma (section
->sh_addralign
, DEC
);
3416 print_vma (section
->sh_addr
, LONG_HEX
);
3417 if ((long) section
->sh_offset
== section
->sh_offset
)
3418 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
3422 print_vma (section
->sh_offset
, LONG_HEX
);
3425 print_vma (section
->sh_size
, LONG_HEX
);
3427 print_vma (section
->sh_entsize
, LONG_HEX
);
3429 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3431 printf (" %2ld %3lx %ld\n",
3432 (unsigned long) section
->sh_link
,
3433 (unsigned long) section
->sh_info
,
3434 (unsigned long) section
->sh_addralign
);
3438 printf (_("Key to Flags:\n\
3439 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3440 I (info), L (link order), G (group), x (unknown)\n\
3441 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3446 /* Process the reloc section. */
3448 process_relocs (file
)
3451 unsigned long rel_size
;
3452 unsigned long rel_offset
;
3458 if (do_using_dynamic
)
3460 int is_rela
= FALSE
;
3465 if (dynamic_info
[DT_REL
])
3467 rel_offset
= dynamic_info
[DT_REL
];
3468 rel_size
= dynamic_info
[DT_RELSZ
];
3471 else if (dynamic_info
[DT_RELA
])
3473 rel_offset
= dynamic_info
[DT_RELA
];
3474 rel_size
= dynamic_info
[DT_RELASZ
];
3477 else if (dynamic_info
[DT_JMPREL
])
3479 rel_offset
= dynamic_info
[DT_JMPREL
];
3480 rel_size
= dynamic_info
[DT_PLTRELSZ
];
3482 switch (dynamic_info
[DT_PLTREL
])
3499 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3500 rel_offset
, rel_size
);
3502 dump_relocations (file
, rel_offset
- loadaddr
, rel_size
,
3503 dynamic_symbols
, num_dynamic_syms
, dynamic_strings
, is_rela
);
3506 printf (_("\nThere are no dynamic relocations in this file.\n"));
3510 Elf32_Internal_Shdr
* section
;
3514 for (i
= 0, section
= section_headers
;
3515 i
< elf_header
.e_shnum
;
3518 if ( section
->sh_type
!= SHT_RELA
3519 && section
->sh_type
!= SHT_REL
)
3522 rel_offset
= section
->sh_offset
;
3523 rel_size
= section
->sh_size
;
3527 Elf32_Internal_Shdr
* strsec
;
3528 Elf_Internal_Sym
* symtab
;
3531 unsigned long nsyms
;
3533 printf (_("\nRelocation section "));
3535 if (string_table
== NULL
)
3536 printf ("%d", section
->sh_name
);
3538 printf ("'%s'", SECTION_NAME (section
));
3540 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3541 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
3546 if (section
->sh_link
)
3548 Elf32_Internal_Shdr
* symsec
;
3550 symsec
= SECTION_HEADER (section
->sh_link
);
3551 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
3552 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
3557 strsec
= SECTION_HEADER (symsec
->sh_link
);
3559 strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
3563 is_rela
= section
->sh_type
== SHT_RELA
;
3565 dump_relocations (file
, rel_offset
, rel_size
,
3566 symtab
, nsyms
, strtab
, is_rela
);
3578 printf (_("\nThere are no relocations in this file.\n"));
3584 #include "unwind-ia64.h"
3586 /* An absolute address consists of a section and an offset. If the
3587 section is NULL, the offset itself is the address, otherwise, the
3588 address equals to LOAD_ADDRESS(section) + offset. */
3592 unsigned short section
;
3598 struct unw_table_entry
3600 struct absaddr start
;
3602 struct absaddr info
;
3604 *table
; /* Unwind table. */
3605 unsigned long table_len
; /* Length of unwind table. */
3606 unsigned char * info
; /* Unwind info. */
3607 unsigned long info_size
; /* Size of unwind info. */
3608 bfd_vma info_addr
; /* starting address of unwind info. */
3609 bfd_vma seg_base
; /* Starting address of segment. */
3610 Elf_Internal_Sym
* symtab
; /* The symbol table. */
3611 unsigned long nsyms
; /* Number of symbols. */
3612 char * strtab
; /* The string table. */
3613 unsigned long strtab_size
; /* Size of string table. */
3616 static void find_symbol_for_address
PARAMS ((struct unw_aux_info
*,
3617 struct absaddr
, const char **,
3619 static void dump_ia64_unwind
PARAMS ((struct unw_aux_info
*));
3620 static int slurp_ia64_unwind_table
PARAMS ((FILE *, struct unw_aux_info
*,
3621 Elf32_Internal_Shdr
*));
3624 find_symbol_for_address (aux
, addr
, symname
, offset
)
3625 struct unw_aux_info
*aux
;
3626 struct absaddr addr
;
3627 const char **symname
;
3630 bfd_vma dist
= (bfd_vma
) 0x100000;
3631 Elf_Internal_Sym
*sym
, *best
= NULL
;
3634 for (i
= 0, sym
= aux
->symtab
; i
< aux
->nsyms
; ++i
, ++sym
)
3636 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
3637 && sym
->st_name
!= 0
3638 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
3639 && addr
.offset
>= sym
->st_value
3640 && addr
.offset
- sym
->st_value
< dist
)
3643 dist
= addr
.offset
- sym
->st_value
;
3650 *symname
= (best
->st_name
>= aux
->strtab_size
3651 ? "<corrupt>" : aux
->strtab
+ best
->st_name
);
3656 *offset
= addr
.offset
;
3660 dump_ia64_unwind (aux
)
3661 struct unw_aux_info
*aux
;
3664 struct unw_table_entry
* tp
;
3667 addr_size
= is_32bit_elf
? 4 : 8;
3669 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
3673 const unsigned char * dp
;
3674 const unsigned char * head
;
3675 const char * procname
;
3677 find_symbol_for_address (aux
, tp
->start
, &procname
, &offset
);
3679 fputs ("\n<", stdout
);
3683 fputs (procname
, stdout
);
3686 printf ("+%lx", (unsigned long) offset
);
3689 fputs (">: [", stdout
);
3690 print_vma (tp
->start
.offset
, PREFIX_HEX
);
3691 fputc ('-', stdout
);
3692 print_vma (tp
->end
.offset
, PREFIX_HEX
);
3693 printf ("), info at +0x%lx\n",
3694 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
3696 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
3697 stamp
= BYTE_GET8 ((unsigned char *) head
);
3699 printf (" v%u, flags=0x%lx (%s%s ), len=%lu bytes\n",
3700 (unsigned) UNW_VER (stamp
),
3701 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
3702 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
3703 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
3704 (unsigned long) (addr_size
* UNW_LENGTH (stamp
)));
3706 if (UNW_VER (stamp
) != 1)
3708 printf ("\tUnknown version.\n");
3713 for (dp
= head
+ 8; dp
< head
+ 8 + addr_size
* UNW_LENGTH (stamp
);)
3714 dp
= unw_decode (dp
, in_body
, & in_body
);
3719 slurp_ia64_unwind_table (file
, aux
, sec
)
3721 struct unw_aux_info
*aux
;
3722 Elf32_Internal_Shdr
*sec
;
3724 unsigned long size
, addr_size
, nrelas
, i
;
3725 Elf_Internal_Phdr
*prog_hdrs
, *seg
;
3726 struct unw_table_entry
*tep
;
3727 Elf32_Internal_Shdr
*relsec
;
3728 Elf_Internal_Rela
*rela
, *rp
;
3729 unsigned char *table
, *tp
;
3730 Elf_Internal_Sym
*sym
;
3731 const char *relname
;
3734 addr_size
= is_32bit_elf
? 4 : 8;
3736 /* First, find the starting address of the segment that includes
3739 if (elf_header
.e_phnum
)
3741 prog_hdrs
= (Elf_Internal_Phdr
*)
3742 xmalloc (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
3745 result
= get_32bit_program_headers (file
, prog_hdrs
);
3747 result
= get_64bit_program_headers (file
, prog_hdrs
);
3755 for (seg
= prog_hdrs
; seg
< prog_hdrs
+ elf_header
.e_phnum
; ++seg
)
3757 if (seg
->p_type
!= PT_LOAD
)
3760 if (sec
->sh_addr
>= seg
->p_vaddr
3761 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
3763 aux
->seg_base
= seg
->p_vaddr
;
3771 /* Second, build the unwind table from the contents of the unwind section: */
3772 size
= sec
->sh_size
;
3773 table
= (char *) get_data (NULL
, file
, sec
->sh_offset
,
3774 size
, _("unwind table"));
3778 tep
= aux
->table
= xmalloc (size
/ (3 * addr_size
) * sizeof (aux
->table
[0]));
3779 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * addr_size
, ++ tep
)
3781 tep
->start
.section
= SHN_UNDEF
;
3782 tep
->end
.section
= SHN_UNDEF
;
3783 tep
->info
.section
= SHN_UNDEF
;
3786 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
3787 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
3788 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
3792 tep
->start
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 0);
3793 tep
->end
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 8);
3794 tep
->info
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 16);
3796 tep
->start
.offset
+= aux
->seg_base
;
3797 tep
->end
.offset
+= aux
->seg_base
;
3798 tep
->info
.offset
+= aux
->seg_base
;
3802 /* Third, apply any relocations to the unwind table: */
3804 for (relsec
= section_headers
;
3805 relsec
< section_headers
+ elf_header
.e_shnum
;
3808 if (relsec
->sh_type
!= SHT_RELA
3809 || SECTION_HEADER (relsec
->sh_info
) != sec
)
3812 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
3816 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
3820 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
3821 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
3823 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
3825 warn (_("Skipping unexpected symbol type %u\n"),
3826 ELF32_ST_TYPE (sym
->st_info
));
3832 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
3833 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
3835 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
3837 warn (_("Skipping unexpected symbol type %u\n"),
3838 ELF64_ST_TYPE (sym
->st_info
));
3843 if (strncmp (relname
, "R_IA64_SEGREL", 13) != 0)
3845 warn (_("Skipping unexpected relocation type %s\n"), relname
);
3849 i
= rp
->r_offset
/ (3 * addr_size
);
3851 switch (rp
->r_offset
/addr_size
% 3)
3854 aux
->table
[i
].start
.section
= sym
->st_shndx
;
3855 aux
->table
[i
].start
.offset
+= rp
->r_addend
;
3858 aux
->table
[i
].end
.section
= sym
->st_shndx
;
3859 aux
->table
[i
].end
.offset
+= rp
->r_addend
;
3862 aux
->table
[i
].info
.section
= sym
->st_shndx
;
3863 aux
->table
[i
].info
.offset
+= rp
->r_addend
;
3873 aux
->table_len
= size
/ (3 * addr_size
);
3878 process_unwind (file
)
3881 Elf32_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
3882 unsigned long i
, addr_size
, unwcount
= 0, unwstart
= 0;
3883 struct unw_aux_info aux
;
3888 if (elf_header
.e_machine
!= EM_IA_64
)
3890 printf (_("\nThere are no unwind sections in this file.\n"));
3894 memset (& aux
, 0, sizeof (aux
));
3896 addr_size
= is_32bit_elf
? 4 : 8;
3898 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
3900 if (sec
->sh_type
== SHT_SYMTAB
)
3902 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
3903 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
3905 strsec
= SECTION_HEADER (sec
->sh_link
);
3906 aux
.strtab_size
= strsec
->sh_size
;
3907 aux
.strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
3908 aux
.strtab_size
, _("string table"));
3910 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
3915 printf (_("\nThere are no unwind sections in this file.\n"));
3917 while (unwcount
-- > 0)
3922 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
3923 i
< elf_header
.e_shnum
; ++i
, ++sec
)
3924 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
3931 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
3933 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
,
3936 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
3937 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
3938 suffix
= SECTION_NAME (unwsec
) + len
;
3939 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
3941 if (strncmp (SECTION_NAME (sec
),
3942 ELF_STRING_ia64_unwind_info_once
, len2
) == 0
3943 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
3948 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
3949 .IA_64.unwind or BAR -> .IA_64.unwind_info */
3950 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
3951 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
3953 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
,
3955 suffix
= SECTION_NAME (unwsec
) + len
;
3956 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
3958 if (strncmp (SECTION_NAME (sec
),
3959 ELF_STRING_ia64_unwind_info
, len2
) == 0
3960 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
3964 if (i
== elf_header
.e_shnum
)
3966 printf (_("\nCould not find unwind info section for "));
3968 if (string_table
== NULL
)
3969 printf ("%d", unwsec
->sh_name
);
3971 printf ("'%s'", SECTION_NAME (unwsec
));
3975 aux
.info_size
= sec
->sh_size
;
3976 aux
.info_addr
= sec
->sh_addr
;
3977 aux
.info
= (char *) get_data (NULL
, file
, sec
->sh_offset
,
3978 aux
.info_size
, _("unwind info"));
3980 printf (_("\nUnwind section "));
3982 if (string_table
== NULL
)
3983 printf ("%d", unwsec
->sh_name
);
3985 printf ("'%s'", SECTION_NAME (unwsec
));
3987 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3988 (unsigned long) unwsec
->sh_offset
,
3989 (unsigned long) (unwsec
->sh_size
/ (3 * addr_size
)));
3991 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
3993 if (aux
.table_len
> 0)
3994 dump_ia64_unwind (& aux
);
3997 free ((char *) aux
.table
);
3999 free ((char *) aux
.info
);
4008 free ((char *) aux
.strtab
);
4014 dynamic_segment_mips_val (entry
)
4015 Elf_Internal_Dyn
* entry
;
4017 switch (entry
->d_tag
)
4020 if (entry
->d_un
.d_val
== 0)
4024 static const char * opts
[] =
4026 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
4027 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
4028 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
4029 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
4034 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++ cnt
)
4035 if (entry
->d_un
.d_val
& (1 << cnt
))
4037 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
4044 case DT_MIPS_IVERSION
:
4045 if (dynamic_strings
!= NULL
)
4046 printf ("Interface Version: %s\n",
4047 dynamic_strings
+ entry
->d_un
.d_val
);
4049 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4052 case DT_MIPS_TIME_STAMP
:
4057 time_t time
= entry
->d_un
.d_val
;
4058 tmp
= gmtime (&time
);
4059 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
4060 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
4061 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
4062 printf ("Time Stamp: %s\n", timebuf
);
4066 case DT_MIPS_RLD_VERSION
:
4067 case DT_MIPS_LOCAL_GOTNO
:
4068 case DT_MIPS_CONFLICTNO
:
4069 case DT_MIPS_LIBLISTNO
:
4070 case DT_MIPS_SYMTABNO
:
4071 case DT_MIPS_UNREFEXTNO
:
4072 case DT_MIPS_HIPAGENO
:
4073 case DT_MIPS_DELTA_CLASS_NO
:
4074 case DT_MIPS_DELTA_INSTANCE_NO
:
4075 case DT_MIPS_DELTA_RELOC_NO
:
4076 case DT_MIPS_DELTA_SYM_NO
:
4077 case DT_MIPS_DELTA_CLASSSYM_NO
:
4078 case DT_MIPS_COMPACT_SIZE
:
4079 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4083 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
4089 dynamic_segment_parisc_val (entry
)
4090 Elf_Internal_Dyn
* entry
;
4092 switch (entry
->d_tag
)
4094 case DT_HP_DLD_FLAGS
:
4103 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
4104 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
4105 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
4106 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
4107 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
4108 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
4109 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
4110 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
4111 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
4112 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
4113 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
4117 bfd_vma val
= entry
->d_un
.d_val
;
4119 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
4120 if (val
& flags
[cnt
].bit
)
4124 fputs (flags
[cnt
].str
, stdout
);
4126 val
^= flags
[cnt
].bit
;
4129 if (val
!= 0 || first
)
4133 print_vma (val
, HEX
);
4139 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4145 get_32bit_dynamic_segment (file
)
4148 Elf32_External_Dyn
* edyn
;
4149 Elf_Internal_Dyn
* entry
;
4152 edyn
= (Elf32_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
,
4153 dynamic_size
, _("dynamic segment"));
4157 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4158 how large this .dynamic is now. We can do this even before the byte
4159 swapping since the DT_NULL tag is recognizable. */
4161 while (*(Elf32_Word
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
4164 dynamic_segment
= (Elf_Internal_Dyn
*)
4165 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
4167 if (dynamic_segment
== NULL
)
4169 error (_("Out of memory\n"));
4174 for (i
= 0, entry
= dynamic_segment
;
4178 entry
->d_tag
= BYTE_GET (edyn
[i
].d_tag
);
4179 entry
->d_un
.d_val
= BYTE_GET (edyn
[i
].d_un
.d_val
);
4188 get_64bit_dynamic_segment (file
)
4191 Elf64_External_Dyn
* edyn
;
4192 Elf_Internal_Dyn
* entry
;
4195 edyn
= (Elf64_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
,
4196 dynamic_size
, _("dynamic segment"));
4200 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4201 how large this .dynamic is now. We can do this even before the byte
4202 swapping since the DT_NULL tag is recognizable. */
4204 while (*(bfd_vma
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
4207 dynamic_segment
= (Elf_Internal_Dyn
*)
4208 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
4210 if (dynamic_segment
== NULL
)
4212 error (_("Out of memory\n"));
4217 for (i
= 0, entry
= dynamic_segment
;
4221 entry
->d_tag
= BYTE_GET8 (edyn
[i
].d_tag
);
4222 entry
->d_un
.d_val
= BYTE_GET8 (edyn
[i
].d_un
.d_val
);
4231 get_dynamic_flags (flags
)
4234 static char buff
[64];
4239 flag
= flags
& - flags
;
4244 case DF_ORIGIN
: strcat (buff
, "ORIGIN "); break;
4245 case DF_SYMBOLIC
: strcat (buff
, "SYMBOLIC "); break;
4246 case DF_TEXTREL
: strcat (buff
, "TEXTREL "); break;
4247 case DF_BIND_NOW
: strcat (buff
, "BIND_NOW "); break;
4248 default: strcat (buff
, "unknown "); break;
4254 /* Parse and display the contents of the dynamic segment. */
4256 process_dynamic_segment (file
)
4259 Elf_Internal_Dyn
* entry
;
4262 if (dynamic_size
== 0)
4265 printf (_("\nThere is no dynamic segment in this file.\n"));
4272 if (! get_32bit_dynamic_segment (file
))
4275 else if (! get_64bit_dynamic_segment (file
))
4278 /* Find the appropriate symbol table. */
4279 if (dynamic_symbols
== NULL
)
4281 for (i
= 0, entry
= dynamic_segment
;
4285 Elf32_Internal_Shdr section
;
4287 if (entry
->d_tag
!= DT_SYMTAB
)
4290 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
4292 /* Since we do not know how big the symbol table is,
4293 we default to reading in the entire file (!) and
4294 processing that. This is overkill, I know, but it
4296 section
.sh_offset
= entry
->d_un
.d_val
- loadaddr
;
4298 if (fseek (file
, 0, SEEK_END
))
4299 error (_("Unable to seek to end of file!"));
4301 section
.sh_size
= ftell (file
) - section
.sh_offset
;
4303 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
4305 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
4307 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
4308 if (num_dynamic_syms
< 1)
4310 error (_("Unable to determine the number of symbols to load\n"));
4314 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
4318 /* Similarly find a string table. */
4319 if (dynamic_strings
== NULL
)
4321 for (i
= 0, entry
= dynamic_segment
;
4325 unsigned long offset
;
4328 if (entry
->d_tag
!= DT_STRTAB
)
4331 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
4333 /* Since we do not know how big the string table is,
4334 we default to reading in the entire file (!) and
4335 processing that. This is overkill, I know, but it
4338 offset
= entry
->d_un
.d_val
- loadaddr
;
4339 if (fseek (file
, 0, SEEK_END
))
4340 error (_("Unable to seek to end of file\n"));
4341 str_tab_len
= ftell (file
) - offset
;
4343 if (str_tab_len
< 1)
4346 (_("Unable to determine the length of the dynamic string table\n"));
4350 dynamic_strings
= (char *) get_data (NULL
, file
, offset
, str_tab_len
,
4351 _("dynamic string table"));
4356 /* And find the syminfo section if available. */
4357 if (dynamic_syminfo
== NULL
)
4359 unsigned int syminsz
= 0;
4361 for (i
= 0, entry
= dynamic_segment
;
4365 if (entry
->d_tag
== DT_SYMINENT
)
4367 /* Note: these braces are necessary to avoid a syntax
4368 error from the SunOS4 C compiler. */
4369 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
4371 else if (entry
->d_tag
== DT_SYMINSZ
)
4372 syminsz
= entry
->d_un
.d_val
;
4373 else if (entry
->d_tag
== DT_SYMINFO
)
4374 dynamic_syminfo_offset
= entry
->d_un
.d_val
- loadaddr
;
4377 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
4379 Elf_External_Syminfo
* extsyminfo
;
4380 Elf_Internal_Syminfo
* syminfo
;
4382 /* There is a syminfo section. Read the data. */
4383 extsyminfo
= ((Elf_External_Syminfo
*)
4384 get_data (NULL
, file
, dynamic_syminfo_offset
,
4385 syminsz
, _("symbol information")));
4389 dynamic_syminfo
= (Elf_Internal_Syminfo
*) malloc (syminsz
);
4390 if (dynamic_syminfo
== NULL
)
4392 error (_("Out of memory\n"));
4396 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
4397 for (i
= 0, syminfo
= dynamic_syminfo
; i
< dynamic_syminfo_nent
;
4400 syminfo
->si_boundto
= BYTE_GET (extsyminfo
[i
].si_boundto
);
4401 syminfo
->si_flags
= BYTE_GET (extsyminfo
[i
].si_flags
);
4408 if (do_dynamic
&& dynamic_addr
)
4409 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
4410 dynamic_addr
, (long) dynamic_size
);
4412 printf (_(" Tag Type Name/Value\n"));
4414 for (i
= 0, entry
= dynamic_segment
;
4423 print_vma (entry
->d_tag
, FULL_HEX
);
4424 dtype
= get_dynamic_type (entry
->d_tag
);
4425 printf (" (%s)%*s", dtype
,
4426 ((is_32bit_elf
? 27 : 19)
4427 - (int) strlen (dtype
)),
4431 switch (entry
->d_tag
)
4435 printf ("%s", get_dynamic_flags (entry
->d_un
.d_val
));
4445 switch (entry
->d_tag
)
4448 printf (_("Auxiliary library"));
4452 printf (_("Filter library"));
4456 printf (_("Configuration file"));
4460 printf (_("Dependency audit library"));
4464 printf (_("Audit library"));
4468 if (dynamic_strings
)
4469 printf (": [%s]\n", dynamic_strings
+ entry
->d_un
.d_val
);
4473 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4482 printf (_("Flags:"));
4483 if (entry
->d_un
.d_val
== 0)
4484 printf (_(" None\n"));
4487 unsigned long int val
= entry
->d_un
.d_val
;
4488 if (val
& DTF_1_PARINIT
)
4490 printf (" PARINIT");
4491 val
^= DTF_1_PARINIT
;
4493 if (val
& DTF_1_CONFEXP
)
4495 printf (" CONFEXP");
4496 val
^= DTF_1_CONFEXP
;
4499 printf (" %lx", val
);
4508 printf (_("Flags:"));
4509 if (entry
->d_un
.d_val
== 0)
4510 printf (_(" None\n"));
4513 unsigned long int val
= entry
->d_un
.d_val
;
4514 if (val
& DF_P1_LAZYLOAD
)
4516 printf (" LAZYLOAD");
4517 val
^= DF_P1_LAZYLOAD
;
4519 if (val
& DF_P1_GROUPPERM
)
4521 printf (" GROUPPERM");
4522 val
^= DF_P1_GROUPPERM
;
4525 printf (" %lx", val
);
4534 printf (_("Flags:"));
4535 if (entry
->d_un
.d_val
== 0)
4536 printf (_(" None\n"));
4539 unsigned long int val
= entry
->d_un
.d_val
;
4545 if (val
& DF_1_GLOBAL
)
4550 if (val
& DF_1_GROUP
)
4555 if (val
& DF_1_NODELETE
)
4557 printf (" NODELETE");
4558 val
^= DF_1_NODELETE
;
4560 if (val
& DF_1_LOADFLTR
)
4562 printf (" LOADFLTR");
4563 val
^= DF_1_LOADFLTR
;
4565 if (val
& DF_1_INITFIRST
)
4567 printf (" INITFIRST");
4568 val
^= DF_1_INITFIRST
;
4570 if (val
& DF_1_NOOPEN
)
4575 if (val
& DF_1_ORIGIN
)
4580 if (val
& DF_1_DIRECT
)
4585 if (val
& DF_1_TRANS
)
4590 if (val
& DF_1_INTERPOSE
)
4592 printf (" INTERPOSE");
4593 val
^= DF_1_INTERPOSE
;
4595 if (val
& DF_1_NODEFLIB
)
4597 printf (" NODEFLIB");
4598 val
^= DF_1_NODEFLIB
;
4600 if (val
& DF_1_NODUMP
)
4605 if (val
& DF_1_CONLFAT
)
4607 printf (" CONLFAT");
4608 val
^= DF_1_CONLFAT
;
4611 printf (" %lx", val
);
4619 puts (get_dynamic_type (entry
->d_un
.d_val
));
4639 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
4645 if (dynamic_strings
== NULL
)
4648 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4652 switch (entry
->d_tag
)
4655 printf (_("Shared library: [%s]"), name
);
4657 if (strcmp (name
, program_interpreter
) == 0)
4658 printf (_(" program interpreter"));
4662 printf (_("Library soname: [%s]"), name
);
4666 printf (_("Library rpath: [%s]"), name
);
4670 printf (_("Library runpath: [%s]"), name
);
4674 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4679 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4695 case DT_INIT_ARRAYSZ
:
4696 case DT_FINI_ARRAYSZ
:
4699 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
4700 printf (" (bytes)\n");
4710 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
4723 if (dynamic_strings
!= NULL
&& entry
->d_tag
== DT_USED
)
4727 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4731 printf (_("Not needed object: [%s]\n"), name
);
4736 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4742 /* The value of this entry is ignored. */
4746 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
4747 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
4752 switch (elf_header
.e_machine
)
4755 case EM_MIPS_RS3_LE
:
4756 dynamic_segment_mips_val (entry
);
4759 dynamic_segment_parisc_val (entry
);
4762 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4774 get_ver_flags (flags
)
4777 static char buff
[32];
4784 if (flags
& VER_FLG_BASE
)
4785 strcat (buff
, "BASE ");
4787 if (flags
& VER_FLG_WEAK
)
4789 if (flags
& VER_FLG_BASE
)
4790 strcat (buff
, "| ");
4792 strcat (buff
, "WEAK ");
4795 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
4796 strcat (buff
, "| <unknown>");
4801 /* Display the contents of the version sections. */
4803 process_version_sections (file
)
4806 Elf32_Internal_Shdr
* section
;
4813 for (i
= 0, section
= section_headers
;
4814 i
< elf_header
.e_shnum
;
4817 switch (section
->sh_type
)
4819 case SHT_GNU_verdef
:
4821 Elf_External_Verdef
* edefs
;
4828 (_("\nVersion definition section '%s' contains %ld entries:\n"),
4829 SECTION_NAME (section
), section
->sh_info
);
4831 printf (_(" Addr: 0x"));
4832 printf_vma (section
->sh_addr
);
4833 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4834 (unsigned long) section
->sh_offset
, section
->sh_link
,
4835 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
4837 edefs
= ((Elf_External_Verdef
*)
4838 get_data (NULL
, file
, section
->sh_offset
,
4840 _("version definition section")));
4844 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++ cnt
)
4847 Elf_External_Verdef
* edef
;
4848 Elf_Internal_Verdef ent
;
4849 Elf_External_Verdaux
* eaux
;
4850 Elf_Internal_Verdaux aux
;
4854 vstart
= ((char *) edefs
) + idx
;
4856 edef
= (Elf_External_Verdef
*) vstart
;
4858 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
4859 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
4860 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
4861 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
4862 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
4863 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
4864 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
4866 printf (_(" %#06x: Rev: %d Flags: %s"),
4867 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
4869 printf (_(" Index: %d Cnt: %d "),
4870 ent
.vd_ndx
, ent
.vd_cnt
);
4872 vstart
+= ent
.vd_aux
;
4874 eaux
= (Elf_External_Verdaux
*) vstart
;
4876 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
4877 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
4879 if (dynamic_strings
)
4880 printf (_("Name: %s\n"), dynamic_strings
+ aux
.vda_name
);
4882 printf (_("Name index: %ld\n"), aux
.vda_name
);
4884 isum
= idx
+ ent
.vd_aux
;
4886 for (j
= 1; j
< ent
.vd_cnt
; j
++)
4888 isum
+= aux
.vda_next
;
4889 vstart
+= aux
.vda_next
;
4891 eaux
= (Elf_External_Verdaux
*) vstart
;
4893 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
4894 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
4896 if (dynamic_strings
)
4897 printf (_(" %#06x: Parent %d: %s\n"),
4898 isum
, j
, dynamic_strings
+ aux
.vda_name
);
4900 printf (_(" %#06x: Parent %d, name index: %ld\n"),
4901 isum
, j
, aux
.vda_name
);
4911 case SHT_GNU_verneed
:
4913 Elf_External_Verneed
* eneed
;
4919 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
4920 SECTION_NAME (section
), section
->sh_info
);
4922 printf (_(" Addr: 0x"));
4923 printf_vma (section
->sh_addr
);
4924 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
4925 (unsigned long) section
->sh_offset
, section
->sh_link
,
4926 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
4928 eneed
= ((Elf_External_Verneed
*)
4929 get_data (NULL
, file
, section
->sh_offset
,
4930 section
->sh_size
, _("version need section")));
4934 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
4936 Elf_External_Verneed
* entry
;
4937 Elf_Internal_Verneed ent
;
4942 vstart
= ((char *) eneed
) + idx
;
4944 entry
= (Elf_External_Verneed
*) vstart
;
4946 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
4947 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
4948 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
4949 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
4950 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
4952 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
4954 if (dynamic_strings
)
4955 printf (_(" File: %s"), dynamic_strings
+ ent
.vn_file
);
4957 printf (_(" File: %lx"), ent
.vn_file
);
4959 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
4961 vstart
+= ent
.vn_aux
;
4963 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
4965 Elf_External_Vernaux
* eaux
;
4966 Elf_Internal_Vernaux aux
;
4968 eaux
= (Elf_External_Vernaux
*) vstart
;
4970 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
4971 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
4972 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
4973 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
4974 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
4976 if (dynamic_strings
)
4977 printf (_(" %#06x: Name: %s"),
4978 isum
, dynamic_strings
+ aux
.vna_name
);
4980 printf (_(" %#06x: Name index: %lx"),
4981 isum
, aux
.vna_name
);
4983 printf (_(" Flags: %s Version: %d\n"),
4984 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
4986 isum
+= aux
.vna_next
;
4987 vstart
+= aux
.vna_next
;
4997 case SHT_GNU_versym
:
4999 Elf32_Internal_Shdr
* link_section
;
5002 unsigned char * edata
;
5003 unsigned short * data
;
5005 Elf_Internal_Sym
* symbols
;
5006 Elf32_Internal_Shdr
* string_sec
;
5008 link_section
= SECTION_HEADER (section
->sh_link
);
5009 total
= section
->sh_size
/ section
->sh_entsize
;
5013 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
5015 string_sec
= SECTION_HEADER (link_section
->sh_link
);
5017 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
5018 string_sec
->sh_size
,
5019 _("version string table"));
5023 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
5024 SECTION_NAME (section
), total
);
5026 printf (_(" Addr: "));
5027 printf_vma (section
->sh_addr
);
5028 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5029 (unsigned long) section
->sh_offset
, section
->sh_link
,
5030 SECTION_NAME (link_section
));
5034 get_data (NULL
, file
,
5035 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] - loadaddr
,
5036 total
* sizeof (short), _("version symbol data")));
5043 data
= (unsigned short *) malloc (total
* sizeof (short));
5045 for (cnt
= total
; cnt
--;)
5046 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
5051 for (cnt
= 0; cnt
< total
; cnt
+= 4)
5054 int check_def
, check_need
;
5057 printf (" %03x:", cnt
);
5059 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
5060 switch (data
[cnt
+ j
])
5063 fputs (_(" 0 (*local*) "), stdout
);
5067 fputs (_(" 1 (*global*) "), stdout
);
5071 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
5072 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
5076 if (SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
5079 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
5086 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
5088 Elf_Internal_Verneed ivn
;
5089 unsigned long offset
;
5091 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
5096 Elf_Internal_Vernaux ivna
;
5097 Elf_External_Verneed evn
;
5098 Elf_External_Vernaux evna
;
5099 unsigned long a_off
;
5101 get_data (&evn
, file
, offset
, sizeof (evn
),
5104 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5105 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5107 a_off
= offset
+ ivn
.vn_aux
;
5111 get_data (&evna
, file
, a_off
, sizeof (evna
),
5112 _("version need aux (2)"));
5114 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5115 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5117 a_off
+= ivna
.vna_next
;
5119 while (ivna
.vna_other
!= data
[cnt
+ j
]
5120 && ivna
.vna_next
!= 0);
5122 if (ivna
.vna_other
== data
[cnt
+ j
])
5124 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5126 name
= strtab
+ ivna
.vna_name
;
5127 nn
+= printf ("(%s%-*s",
5129 12 - (int) strlen (name
),
5135 offset
+= ivn
.vn_next
;
5137 while (ivn
.vn_next
);
5140 if (check_def
&& data
[cnt
+ j
] != 0x8001
5141 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5143 Elf_Internal_Verdef ivd
;
5144 Elf_External_Verdef evd
;
5145 unsigned long offset
;
5147 offset
= version_info
5148 [DT_VERSIONTAGIDX (DT_VERDEF
)] - loadaddr
;
5152 get_data (&evd
, file
, offset
, sizeof (evd
),
5155 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5156 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5158 offset
+= ivd
.vd_next
;
5160 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
5161 && ivd
.vd_next
!= 0);
5163 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
5165 Elf_External_Verdaux evda
;
5166 Elf_Internal_Verdaux ivda
;
5168 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5170 get_data (&evda
, file
,
5171 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
5172 sizeof (evda
), _("version def aux"));
5174 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5176 name
= strtab
+ ivda
.vda_name
;
5177 nn
+= printf ("(%s%-*s",
5179 12 - (int) strlen (name
),
5185 printf ("%*c", 18 - nn
, ' ');
5203 printf (_("\nNo version information found in this file.\n"));
5209 get_symbol_binding (binding
)
5210 unsigned int binding
;
5212 static char buff
[32];
5216 case STB_LOCAL
: return "LOCAL";
5217 case STB_GLOBAL
: return "GLOBAL";
5218 case STB_WEAK
: return "WEAK";
5220 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
5221 sprintf (buff
, _("<processor specific>: %d"), binding
);
5222 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
5223 sprintf (buff
, _("<OS specific>: %d"), binding
);
5225 sprintf (buff
, _("<unknown>: %d"), binding
);
5231 get_symbol_type (type
)
5234 static char buff
[32];
5238 case STT_NOTYPE
: return "NOTYPE";
5239 case STT_OBJECT
: return "OBJECT";
5240 case STT_FUNC
: return "FUNC";
5241 case STT_SECTION
: return "SECTION";
5242 case STT_FILE
: return "FILE";
5243 case STT_COMMON
: return "COMMON";
5245 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
5247 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
5248 return "THUMB_FUNC";
5250 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
5253 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
5254 return "PARISC_MILLI";
5256 sprintf (buff
, _("<processor specific>: %d"), type
);
5258 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
5260 if (elf_header
.e_machine
== EM_PARISC
)
5262 if (type
== STT_HP_OPAQUE
)
5264 if (type
== STT_HP_STUB
)
5268 sprintf (buff
, _("<OS specific>: %d"), type
);
5271 sprintf (buff
, _("<unknown>: %d"), type
);
5277 get_symbol_visibility (visibility
)
5278 unsigned int visibility
;
5282 case STV_DEFAULT
: return "DEFAULT";
5283 case STV_INTERNAL
: return "INTERNAL";
5284 case STV_HIDDEN
: return "HIDDEN";
5285 case STV_PROTECTED
: return "PROTECTED";
5291 get_symbol_index_type (type
)
5296 case SHN_UNDEF
: return "UND";
5297 case SHN_ABS
: return "ABS";
5298 case SHN_COMMON
: return "COM";
5300 if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
5302 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
5304 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
5308 static char buff
[32];
5310 sprintf (buff
, "%3d", type
);
5317 get_dynamic_data (file
, number
)
5319 unsigned int number
;
5321 unsigned char * e_data
;
5324 e_data
= (unsigned char *) malloc (number
* 4);
5328 error (_("Out of memory\n"));
5332 if (fread (e_data
, 4, number
, file
) != number
)
5334 error (_("Unable to read in dynamic data\n"));
5338 i_data
= (int *) malloc (number
* sizeof (* i_data
));
5342 error (_("Out of memory\n"));
5348 i_data
[number
] = byte_get (e_data
+ number
* 4, 4);
5355 /* Dump the symbol table. */
5357 process_symbol_table (file
)
5360 Elf32_Internal_Shdr
* section
;
5361 unsigned char nb
[4];
5362 unsigned char nc
[4];
5365 int * buckets
= NULL
;
5366 int * chains
= NULL
;
5368 if (! do_syms
&& !do_histogram
)
5371 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
5374 if (fseek (file
, dynamic_info
[DT_HASH
] - loadaddr
, SEEK_SET
))
5376 error (_("Unable to seek to start of dynamic information"));
5380 if (fread (nb
, sizeof (nb
), 1, file
) != 1)
5382 error (_("Failed to read in number of buckets\n"));
5386 if (fread (nc
, sizeof (nc
), 1, file
) != 1)
5388 error (_("Failed to read in number of chains\n"));
5392 nbuckets
= byte_get (nb
, 4);
5393 nchains
= byte_get (nc
, 4);
5395 buckets
= get_dynamic_data (file
, nbuckets
);
5396 chains
= get_dynamic_data (file
, nchains
);
5398 if (buckets
== NULL
|| chains
== NULL
)
5403 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
5408 printf (_("\nSymbol table for image:\n"));
5410 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5412 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5414 for (hn
= 0; hn
< nbuckets
; hn
++)
5419 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
5421 Elf_Internal_Sym
* psym
;
5423 psym
= dynamic_symbols
+ si
;
5425 printf (" %3d %3d: ", si
, hn
);
5426 print_vma (psym
->st_value
, LONG_HEX
);
5428 print_vma (psym
->st_size
, DEC_5
);
5430 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5431 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5432 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5433 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
5434 print_symbol (25, dynamic_strings
+ psym
->st_name
);
5439 else if (do_syms
&& !do_using_dynamic
)
5443 for (i
= 0, section
= section_headers
;
5444 i
< elf_header
.e_shnum
;
5449 Elf_Internal_Sym
* symtab
;
5450 Elf_Internal_Sym
* psym
;
5453 if ( section
->sh_type
!= SHT_SYMTAB
5454 && section
->sh_type
!= SHT_DYNSYM
)
5457 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5458 SECTION_NAME (section
),
5459 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
5461 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5463 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5465 symtab
= GET_ELF_SYMBOLS (file
, section
);
5469 if (section
->sh_link
== elf_header
.e_shstrndx
)
5470 strtab
= string_table
;
5473 Elf32_Internal_Shdr
* string_sec
;
5475 string_sec
= SECTION_HEADER (section
->sh_link
);
5477 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
5478 string_sec
->sh_size
,
5482 for (si
= 0, psym
= symtab
;
5483 si
< section
->sh_size
/ section
->sh_entsize
;
5486 printf ("%6d: ", si
);
5487 print_vma (psym
->st_value
, LONG_HEX
);
5489 print_vma (psym
->st_size
, DEC_5
);
5490 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5491 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5492 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5493 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
5494 print_symbol (25, strtab
+ psym
->st_name
);
5496 if (section
->sh_type
== SHT_DYNSYM
&&
5497 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
5499 unsigned char data
[2];
5500 unsigned short vers_data
;
5501 unsigned long offset
;
5505 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)]
5508 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
5509 sizeof (data
), _("version data"));
5511 vers_data
= byte_get (data
, 2);
5513 is_nobits
= (SECTION_HEADER (psym
->st_shndx
)->sh_type
5516 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
5518 if ((vers_data
& 0x8000) || vers_data
> 1)
5520 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
5521 && (is_nobits
|| ! check_def
))
5523 Elf_External_Verneed evn
;
5524 Elf_Internal_Verneed ivn
;
5525 Elf_Internal_Vernaux ivna
;
5527 /* We must test both. */
5528 offset
= version_info
5529 [DT_VERSIONTAGIDX (DT_VERNEED
)] - loadaddr
;
5533 unsigned long vna_off
;
5535 get_data (&evn
, file
, offset
, sizeof (evn
),
5538 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5539 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5541 vna_off
= offset
+ ivn
.vn_aux
;
5545 Elf_External_Vernaux evna
;
5547 get_data (&evna
, file
, vna_off
,
5549 _("version need aux (3)"));
5551 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5552 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5553 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5555 vna_off
+= ivna
.vna_next
;
5557 while (ivna
.vna_other
!= vers_data
5558 && ivna
.vna_next
!= 0);
5560 if (ivna
.vna_other
== vers_data
)
5563 offset
+= ivn
.vn_next
;
5565 while (ivn
.vn_next
!= 0);
5567 if (ivna
.vna_other
== vers_data
)
5570 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
5573 else if (! is_nobits
)
5574 error (_("bad dynamic symbol"));
5581 if (vers_data
!= 0x8001
5582 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5584 Elf_Internal_Verdef ivd
;
5585 Elf_Internal_Verdaux ivda
;
5586 Elf_External_Verdaux evda
;
5587 unsigned long offset
;
5590 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)]
5595 Elf_External_Verdef evd
;
5597 get_data (&evd
, file
, offset
, sizeof (evd
),
5600 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5601 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5602 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5604 offset
+= ivd
.vd_next
;
5606 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
5607 && ivd
.vd_next
!= 0);
5609 offset
-= ivd
.vd_next
;
5610 offset
+= ivd
.vd_aux
;
5612 get_data (&evda
, file
, offset
, sizeof (evda
),
5613 _("version def aux"));
5615 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5617 if (psym
->st_name
!= ivda
.vda_name
)
5618 printf ((vers_data
& 0x8000)
5620 strtab
+ ivda
.vda_name
);
5630 if (strtab
!= string_table
)
5636 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5638 if (do_histogram
&& buckets
!= NULL
)
5645 int nzero_counts
= 0;
5648 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5650 printf (_(" Length Number %% of total Coverage\n"));
5652 lengths
= (int *) calloc (nbuckets
, sizeof (int));
5653 if (lengths
== NULL
)
5655 error (_("Out of memory"));
5658 for (hn
= 0; hn
< nbuckets
; ++hn
)
5663 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
5666 if (maxlength
< ++lengths
[hn
])
5671 counts
= (int *) calloc (maxlength
+ 1, sizeof (int));
5674 error (_("Out of memory"));
5678 for (hn
= 0; hn
< nbuckets
; ++hn
)
5679 ++ counts
[lengths
[hn
]];
5683 printf (" 0 %-10d (%5.1f%%)\n",
5684 counts
[0], (counts
[0] * 100.0) / nbuckets
);
5685 for (si
= 1; si
<= maxlength
; ++si
)
5687 nzero_counts
+= counts
[si
] * si
;
5688 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5689 si
, counts
[si
], (counts
[si
] * 100.0) / nbuckets
,
5690 (nzero_counts
* 100.0) / nsyms
);
5698 if (buckets
!= NULL
)
5708 process_syminfo (file
)
5709 FILE * file ATTRIBUTE_UNUSED
;
5713 if (dynamic_syminfo
== NULL
5715 /* No syminfo, this is ok. */
5718 /* There better should be a dynamic symbol section. */
5719 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
5723 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5724 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
5726 printf (_(" Num: Name BoundTo Flags\n"));
5727 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
5729 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
5731 printf ("%4d: ", i
);
5732 print_symbol (30, dynamic_strings
+ dynamic_symbols
[i
].st_name
);
5735 switch (dynamic_syminfo
[i
].si_boundto
)
5737 case SYMINFO_BT_SELF
:
5738 fputs ("SELF ", stdout
);
5740 case SYMINFO_BT_PARENT
:
5741 fputs ("PARENT ", stdout
);
5744 if (dynamic_syminfo
[i
].si_boundto
> 0
5745 && dynamic_syminfo
[i
].si_boundto
< dynamic_size
)
5747 print_symbol (10, dynamic_strings
5749 [dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
);
5753 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
5757 if (flags
& SYMINFO_FLG_DIRECT
)
5759 if (flags
& SYMINFO_FLG_PASSTHRU
)
5760 printf (" PASSTHRU");
5761 if (flags
& SYMINFO_FLG_COPY
)
5763 if (flags
& SYMINFO_FLG_LAZYLOAD
)
5764 printf (" LAZYLOAD");
5772 #ifdef SUPPORT_DISASSEMBLY
5774 disassemble_section (section
, file
)
5775 Elf32_Internal_Shdr
* section
;
5778 printf (_("\nAssembly dump of section %s\n"),
5779 SECTION_NAME (section
));
5781 /* XXX -- to be done --- XXX */
5788 dump_section (section
, file
)
5789 Elf32_Internal_Shdr
* section
;
5792 bfd_size_type bytes
;
5794 unsigned char * data
;
5795 unsigned char * start
;
5797 bytes
= section
->sh_size
;
5801 printf (_("\nSection '%s' has no data to dump.\n"),
5802 SECTION_NAME (section
));
5806 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
5808 addr
= section
->sh_addr
;
5810 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
, bytes
,
5823 lbytes
= (bytes
> 16 ? 16 : bytes
);
5825 printf (" 0x%8.8lx ", (unsigned long) addr
);
5827 switch (elf_header
.e_ident
[EI_DATA
])
5831 for (j
= 15; j
>= 0; j
--)
5834 printf ("%2.2x", data
[j
]);
5844 for (j
= 0; j
< 16; j
++)
5847 printf ("%2.2x", data
[j
]);
5857 for (j
= 0; j
< lbytes
; j
++)
5860 if (k
>= ' ' && k
< 0x80)
5879 static unsigned long int
5880 read_leb128 (data
, length_return
, sign
)
5881 unsigned char * data
;
5882 int * length_return
;
5885 unsigned long int result
= 0;
5886 unsigned int num_read
= 0;
5895 result
|= (byte
& 0x7f) << shift
;
5900 while (byte
& 0x80);
5902 if (length_return
!= NULL
)
5903 * length_return
= num_read
;
5905 if (sign
&& (shift
< 32) && (byte
& 0x40))
5906 result
|= -1 << shift
;
5911 typedef struct State_Machine_Registers
5913 unsigned long address
;
5916 unsigned int column
;
5920 /* This variable hold the number of the last entry seen
5921 in the File Table. */
5922 unsigned int last_file_entry
;
5925 static SMR state_machine_regs
;
5928 reset_state_machine (is_stmt
)
5931 state_machine_regs
.address
= 0;
5932 state_machine_regs
.file
= 1;
5933 state_machine_regs
.line
= 1;
5934 state_machine_regs
.column
= 0;
5935 state_machine_regs
.is_stmt
= is_stmt
;
5936 state_machine_regs
.basic_block
= 0;
5937 state_machine_regs
.end_sequence
= 0;
5938 state_machine_regs
.last_file_entry
= 0;
5941 /* Handled an extend line op. Returns true if this is the end
5944 process_extended_line_op (data
, is_stmt
, pointer_size
)
5945 unsigned char * data
;
5949 unsigned char op_code
;
5952 unsigned char * name
;
5955 len
= read_leb128 (data
, & bytes_read
, 0);
5960 warn (_("badly formed extended line op encountered!\n"));
5965 op_code
= * data
++;
5967 printf (_(" Extended opcode %d: "), op_code
);
5971 case DW_LNE_end_sequence
:
5972 printf (_("End of Sequence\n\n"));
5973 reset_state_machine (is_stmt
);
5976 case DW_LNE_set_address
:
5977 adr
= byte_get (data
, pointer_size
);
5978 printf (_("set Address to 0x%lx\n"), adr
);
5979 state_machine_regs
.address
= adr
;
5982 case DW_LNE_define_file
:
5983 printf (_(" define new File Table entry\n"));
5984 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5986 printf (_(" %d\t"), ++ state_machine_regs
.last_file_entry
);
5988 data
+= strlen ((char *) data
) + 1;
5989 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5991 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5993 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5994 printf (_("%s\n\n"), name
);
5998 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
6005 /* Size of pointers in the .debug_line section. This information is not
6006 really present in that section. It's obtained before dumping the debug
6007 sections by doing some pre-scan of the .debug_info section. */
6008 static int debug_line_pointer_size
= 4;
6011 display_debug_lines (section
, start
, file
)
6012 Elf32_Internal_Shdr
* section
;
6013 unsigned char * start
;
6014 FILE * file ATTRIBUTE_UNUSED
;
6016 DWARF2_External_LineInfo
* external
;
6017 DWARF2_Internal_LineInfo info
;
6018 unsigned char * standard_opcodes
;
6019 unsigned char * data
= start
;
6020 unsigned char * end
= start
+ section
->sh_size
;
6021 unsigned char * end_of_sequence
;
6024 printf (_("\nDump of debug contents of section %s:\n\n"),
6025 SECTION_NAME (section
));
6029 external
= (DWARF2_External_LineInfo
*) data
;
6031 /* Check the length of the block. */
6032 info
.li_length
= BYTE_GET (external
->li_length
);
6034 if (info
.li_length
== 0xffffffff)
6036 warn (_("64-bit DWARF line info is not supported yet.\n"));
6040 if (info
.li_length
+ sizeof (external
->li_length
) > section
->sh_size
)
6043 (_("The line info appears to be corrupt - the section is too small\n"));
6047 /* Check its version number. */
6048 info
.li_version
= BYTE_GET (external
->li_version
);
6049 if (info
.li_version
!= 2)
6051 warn (_("Only DWARF version 2 line info is currently supported.\n"));
6055 info
.li_prologue_length
= BYTE_GET (external
->li_prologue_length
);
6056 info
.li_min_insn_length
= BYTE_GET (external
->li_min_insn_length
);
6057 info
.li_default_is_stmt
= BYTE_GET (external
->li_default_is_stmt
);
6058 info
.li_line_base
= BYTE_GET (external
->li_line_base
);
6059 info
.li_line_range
= BYTE_GET (external
->li_line_range
);
6060 info
.li_opcode_base
= BYTE_GET (external
->li_opcode_base
);
6062 /* Sign extend the line base field. */
6063 info
.li_line_base
<<= 24;
6064 info
.li_line_base
>>= 24;
6066 printf (_(" Length: %ld\n"), info
.li_length
);
6067 printf (_(" DWARF Version: %d\n"), info
.li_version
);
6068 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
6069 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
6070 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
6071 printf (_(" Line Base: %d\n"), info
.li_line_base
);
6072 printf (_(" Line Range: %d\n"), info
.li_line_range
);
6073 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
6075 end_of_sequence
= data
+ info
.li_length
+ sizeof (external
->li_length
);
6077 reset_state_machine (info
.li_default_is_stmt
);
6079 /* Display the contents of the Opcodes table. */
6080 standard_opcodes
= data
+ sizeof (* external
);
6082 printf (_("\n Opcodes:\n"));
6084 for (i
= 1; i
< info
.li_opcode_base
; i
++)
6085 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
6087 /* Display the contents of the Directory table. */
6088 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
6091 printf (_("\n The Directory Table is empty.\n"));
6094 printf (_("\n The Directory Table:\n"));
6098 printf (_(" %s\n"), data
);
6100 data
+= strlen ((char *) data
) + 1;
6104 /* Skip the NUL at the end of the table. */
6107 /* Display the contents of the File Name table. */
6109 printf (_("\n The File Name Table is empty.\n"));
6112 printf (_("\n The File Name Table:\n"));
6113 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6117 unsigned char * name
;
6120 printf (_(" %d\t"), ++ state_machine_regs
.last_file_entry
);
6123 data
+= strlen ((char *) data
) + 1;
6125 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6127 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6129 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6131 printf (_("%s\n"), name
);
6135 /* Skip the NUL at the end of the table. */
6138 /* Now display the statements. */
6139 printf (_("\n Line Number Statements:\n"));
6142 while (data
< end_of_sequence
)
6144 unsigned char op_code
;
6148 op_code
= * data
++;
6150 if (op_code
>= info
.li_opcode_base
)
6152 op_code
-= info
.li_opcode_base
;
6153 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
6154 state_machine_regs
.address
+= adv
;
6155 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6156 op_code
, adv
, state_machine_regs
.address
);
6157 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
6158 state_machine_regs
.line
+= adv
;
6159 printf (_(" and Line by %d to %d\n"),
6160 adv
, state_machine_regs
.line
);
6162 else switch (op_code
)
6164 case DW_LNS_extended_op
:
6165 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
6166 debug_line_pointer_size
);
6170 printf (_(" Copy\n"));
6173 case DW_LNS_advance_pc
:
6174 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
6176 state_machine_regs
.address
+= adv
;
6177 printf (_(" Advance PC by %d to %lx\n"), adv
,
6178 state_machine_regs
.address
);
6181 case DW_LNS_advance_line
:
6182 adv
= read_leb128 (data
, & bytes_read
, 1);
6184 state_machine_regs
.line
+= adv
;
6185 printf (_(" Advance Line by %d to %d\n"), adv
,
6186 state_machine_regs
.line
);
6189 case DW_LNS_set_file
:
6190 adv
= read_leb128 (data
, & bytes_read
, 0);
6192 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6194 state_machine_regs
.file
= adv
;
6197 case DW_LNS_set_column
:
6198 adv
= read_leb128 (data
, & bytes_read
, 0);
6200 printf (_(" Set column to %d\n"), adv
);
6201 state_machine_regs
.column
= adv
;
6204 case DW_LNS_negate_stmt
:
6205 adv
= state_machine_regs
.is_stmt
;
6207 printf (_(" Set is_stmt to %d\n"), adv
);
6208 state_machine_regs
.is_stmt
= adv
;
6211 case DW_LNS_set_basic_block
:
6212 printf (_(" Set basic block\n"));
6213 state_machine_regs
.basic_block
= 1;
6216 case DW_LNS_const_add_pc
:
6217 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
6218 * info
.li_min_insn_length
);
6219 state_machine_regs
.address
+= adv
;
6220 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
6221 state_machine_regs
.address
);
6224 case DW_LNS_fixed_advance_pc
:
6225 adv
= byte_get (data
, 2);
6227 state_machine_regs
.address
+= adv
;
6228 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6229 adv
, state_machine_regs
.address
);
6232 case DW_LNS_set_prologue_end
:
6233 printf (_(" Set prologue_end to true\n"));
6236 case DW_LNS_set_epilogue_begin
:
6237 printf (_(" Set epilogue_begin to true\n"));
6240 case DW_LNS_set_isa
:
6241 adv
= read_leb128 (data
, & bytes_read
, 0);
6243 printf (_(" Set ISA to %d\n"), adv
);
6247 printf (_(" Unknown opcode %d with operands: "), op_code
);
6250 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
6252 printf ("0x%lx%s", read_leb128 (data
, &bytes_read
, 0),
6253 i
== 1 ? "" : ", ");
6268 display_debug_pubnames (section
, start
, file
)
6269 Elf32_Internal_Shdr
* section
;
6270 unsigned char * start
;
6271 FILE * file ATTRIBUTE_UNUSED
;
6273 DWARF2_External_PubNames
* external
;
6274 DWARF2_Internal_PubNames pubnames
;
6275 unsigned char * end
;
6277 end
= start
+ section
->sh_size
;
6279 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6283 unsigned char * data
;
6284 unsigned long offset
;
6286 external
= (DWARF2_External_PubNames
*) start
;
6288 pubnames
.pn_length
= BYTE_GET (external
->pn_length
);
6289 pubnames
.pn_version
= BYTE_GET (external
->pn_version
);
6290 pubnames
.pn_offset
= BYTE_GET (external
->pn_offset
);
6291 pubnames
.pn_size
= BYTE_GET (external
->pn_size
);
6293 data
= start
+ sizeof (* external
);
6294 start
+= pubnames
.pn_length
+ sizeof (external
->pn_length
);
6296 if (pubnames
.pn_length
== 0xffffffff)
6298 warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6302 if (pubnames
.pn_version
!= 2)
6304 static int warned
= 0;
6308 warn (_("Only DWARF 2 pubnames are currently supported\n"));
6315 printf (_(" Length: %ld\n"),
6316 pubnames
.pn_length
);
6317 printf (_(" Version: %d\n"),
6318 pubnames
.pn_version
);
6319 printf (_(" Offset into .debug_info section: %ld\n"),
6320 pubnames
.pn_offset
);
6321 printf (_(" Size of area in .debug_info section: %ld\n"),
6324 printf (_("\n Offset\tName\n"));
6328 offset
= byte_get (data
, 4);
6333 printf (" %ld\t\t%s\n", offset
, data
);
6334 data
+= strlen ((char *) data
) + 1;
6337 while (offset
!= 0);
6350 case DW_TAG_padding
: return "DW_TAG_padding";
6351 case DW_TAG_array_type
: return "DW_TAG_array_type";
6352 case DW_TAG_class_type
: return "DW_TAG_class_type";
6353 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
6354 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
6355 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
6356 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
6357 case DW_TAG_label
: return "DW_TAG_label";
6358 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
6359 case DW_TAG_member
: return "DW_TAG_member";
6360 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
6361 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
6362 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
6363 case DW_TAG_string_type
: return "DW_TAG_string_type";
6364 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
6365 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
6366 case DW_TAG_typedef
: return "DW_TAG_typedef";
6367 case DW_TAG_union_type
: return "DW_TAG_union_type";
6368 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
6369 case DW_TAG_variant
: return "DW_TAG_variant";
6370 case DW_TAG_common_block
: return "DW_TAG_common_block";
6371 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
6372 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
6373 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
6374 case DW_TAG_module
: return "DW_TAG_module";
6375 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
6376 case DW_TAG_set_type
: return "DW_TAG_set_type";
6377 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
6378 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
6379 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
6380 case DW_TAG_base_type
: return "DW_TAG_base_type";
6381 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
6382 case DW_TAG_const_type
: return "DW_TAG_const_type";
6383 case DW_TAG_constant
: return "DW_TAG_constant";
6384 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
6385 case DW_TAG_file_type
: return "DW_TAG_file_type";
6386 case DW_TAG_friend
: return "DW_TAG_friend";
6387 case DW_TAG_namelist
: return "DW_TAG_namelist";
6388 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
6389 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
6390 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
6391 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
6392 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
6393 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
6394 case DW_TAG_try_block
: return "DW_TAG_try_block";
6395 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
6396 case DW_TAG_variable
: return "DW_TAG_variable";
6397 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
6398 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
6399 case DW_TAG_format_label
: return "DW_TAG_format_label";
6400 case DW_TAG_function_template
: return "DW_TAG_function_template";
6401 case DW_TAG_class_template
: return "DW_TAG_class_template";
6402 /* DWARF 2.1 values. */
6403 case DW_TAG_dwarf_procedure
: return "DW_TAG_dwarf_procedure";
6404 case DW_TAG_restrict_type
: return "DW_TAG_restrict_type";
6405 case DW_TAG_interface_type
: return "DW_TAG_interface_type";
6406 case DW_TAG_namespace
: return "DW_TAG_namespace";
6407 case DW_TAG_imported_module
: return "DW_TAG_imported_module";
6408 case DW_TAG_unspecified_type
: return "DW_TAG_unspecified_type";
6409 case DW_TAG_partial_unit
: return "DW_TAG_partial_unit";
6410 case DW_TAG_imported_unit
: return "DW_TAG_imported_unit";
6413 static char buffer
[100];
6415 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
6422 get_AT_name (attribute
)
6423 unsigned long attribute
;
6427 case DW_AT_sibling
: return "DW_AT_sibling";
6428 case DW_AT_location
: return "DW_AT_location";
6429 case DW_AT_name
: return "DW_AT_name";
6430 case DW_AT_ordering
: return "DW_AT_ordering";
6431 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
6432 case DW_AT_byte_size
: return "DW_AT_byte_size";
6433 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
6434 case DW_AT_bit_size
: return "DW_AT_bit_size";
6435 case DW_AT_element_list
: return "DW_AT_element_list";
6436 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
6437 case DW_AT_low_pc
: return "DW_AT_low_pc";
6438 case DW_AT_high_pc
: return "DW_AT_high_pc";
6439 case DW_AT_language
: return "DW_AT_language";
6440 case DW_AT_member
: return "DW_AT_member";
6441 case DW_AT_discr
: return "DW_AT_discr";
6442 case DW_AT_discr_value
: return "DW_AT_discr_value";
6443 case DW_AT_visibility
: return "DW_AT_visibility";
6444 case DW_AT_import
: return "DW_AT_import";
6445 case DW_AT_string_length
: return "DW_AT_string_length";
6446 case DW_AT_common_reference
: return "DW_AT_common_reference";
6447 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
6448 case DW_AT_const_value
: return "DW_AT_const_value";
6449 case DW_AT_containing_type
: return "DW_AT_containing_type";
6450 case DW_AT_default_value
: return "DW_AT_default_value";
6451 case DW_AT_inline
: return "DW_AT_inline";
6452 case DW_AT_is_optional
: return "DW_AT_is_optional";
6453 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
6454 case DW_AT_producer
: return "DW_AT_producer";
6455 case DW_AT_prototyped
: return "DW_AT_prototyped";
6456 case DW_AT_return_addr
: return "DW_AT_return_addr";
6457 case DW_AT_start_scope
: return "DW_AT_start_scope";
6458 case DW_AT_stride_size
: return "DW_AT_stride_size";
6459 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
6460 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
6461 case DW_AT_accessibility
: return "DW_AT_accessibility";
6462 case DW_AT_address_class
: return "DW_AT_address_class";
6463 case DW_AT_artificial
: return "DW_AT_artificial";
6464 case DW_AT_base_types
: return "DW_AT_base_types";
6465 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
6466 case DW_AT_count
: return "DW_AT_count";
6467 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
6468 case DW_AT_decl_column
: return "DW_AT_decl_column";
6469 case DW_AT_decl_file
: return "DW_AT_decl_file";
6470 case DW_AT_decl_line
: return "DW_AT_decl_line";
6471 case DW_AT_declaration
: return "DW_AT_declaration";
6472 case DW_AT_discr_list
: return "DW_AT_discr_list";
6473 case DW_AT_encoding
: return "DW_AT_encoding";
6474 case DW_AT_external
: return "DW_AT_external";
6475 case DW_AT_frame_base
: return "DW_AT_frame_base";
6476 case DW_AT_friend
: return "DW_AT_friend";
6477 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
6478 case DW_AT_macro_info
: return "DW_AT_macro_info";
6479 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
6480 case DW_AT_priority
: return "DW_AT_priority";
6481 case DW_AT_segment
: return "DW_AT_segment";
6482 case DW_AT_specification
: return "DW_AT_specification";
6483 case DW_AT_static_link
: return "DW_AT_static_link";
6484 case DW_AT_type
: return "DW_AT_type";
6485 case DW_AT_use_location
: return "DW_AT_use_location";
6486 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
6487 case DW_AT_virtuality
: return "DW_AT_virtuality";
6488 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
6489 /* DWARF 2.1 values. */
6490 case DW_AT_allocated
: return "DW_AT_allocated";
6491 case DW_AT_associated
: return "DW_AT_associated";
6492 case DW_AT_data_location
: return "DW_AT_data_location";
6493 case DW_AT_stride
: return "DW_AT_stride";
6494 case DW_AT_entry_pc
: return "DW_AT_entry_pc";
6495 case DW_AT_use_UTF8
: return "DW_AT_use_UTF8";
6496 case DW_AT_extension
: return "DW_AT_extension";
6497 case DW_AT_ranges
: return "DW_AT_ranges";
6498 case DW_AT_trampoline
: return "DW_AT_trampoline";
6499 case DW_AT_call_column
: return "DW_AT_call_column";
6500 case DW_AT_call_file
: return "DW_AT_call_file";
6501 case DW_AT_call_line
: return "DW_AT_call_line";
6502 /* SGI/MIPS extensions. */
6503 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
6504 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
6505 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
6506 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
6507 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
6508 case DW_AT_MIPS_software_pipeline_depth
: return "DW_AT_MIPS_software_pipeline_depth";
6509 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
6510 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
6511 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
6512 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
6513 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
6514 /* GNU extensions. */
6515 case DW_AT_sf_names
: return "DW_AT_sf_names";
6516 case DW_AT_src_info
: return "DW_AT_src_info";
6517 case DW_AT_mac_info
: return "DW_AT_mac_info";
6518 case DW_AT_src_coords
: return "DW_AT_src_coords";
6519 case DW_AT_body_begin
: return "DW_AT_body_begin";
6520 case DW_AT_body_end
: return "DW_AT_body_end";
6523 static char buffer
[100];
6525 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
6532 get_FORM_name (form
)
6537 case DW_FORM_addr
: return "DW_FORM_addr";
6538 case DW_FORM_block2
: return "DW_FORM_block2";
6539 case DW_FORM_block4
: return "DW_FORM_block4";
6540 case DW_FORM_data2
: return "DW_FORM_data2";
6541 case DW_FORM_data4
: return "DW_FORM_data4";
6542 case DW_FORM_data8
: return "DW_FORM_data8";
6543 case DW_FORM_string
: return "DW_FORM_string";
6544 case DW_FORM_block
: return "DW_FORM_block";
6545 case DW_FORM_block1
: return "DW_FORM_block1";
6546 case DW_FORM_data1
: return "DW_FORM_data1";
6547 case DW_FORM_flag
: return "DW_FORM_flag";
6548 case DW_FORM_sdata
: return "DW_FORM_sdata";
6549 case DW_FORM_strp
: return "DW_FORM_strp";
6550 case DW_FORM_udata
: return "DW_FORM_udata";
6551 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
6552 case DW_FORM_ref1
: return "DW_FORM_ref1";
6553 case DW_FORM_ref2
: return "DW_FORM_ref2";
6554 case DW_FORM_ref4
: return "DW_FORM_ref4";
6555 case DW_FORM_ref8
: return "DW_FORM_ref8";
6556 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
6557 case DW_FORM_indirect
: return "DW_FORM_indirect";
6560 static char buffer
[100];
6562 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
6568 /* FIXME: There are better and more effiecint ways to handle
6569 these structures. For now though, I just want something that
6570 is simple to implement. */
6571 typedef struct abbrev_attr
6573 unsigned long attribute
;
6575 struct abbrev_attr
* next
;
6579 typedef struct abbrev_entry
6581 unsigned long entry
;
6584 struct abbrev_attr
* first_attr
;
6585 struct abbrev_attr
* last_attr
;
6586 struct abbrev_entry
* next
;
6590 static abbrev_entry
* first_abbrev
= NULL
;
6591 static abbrev_entry
* last_abbrev
= NULL
;
6594 free_abbrevs
PARAMS ((void))
6596 abbrev_entry
* abbrev
;
6598 for (abbrev
= first_abbrev
; abbrev
;)
6600 abbrev_entry
* next
= abbrev
->next
;
6603 for (attr
= abbrev
->first_attr
; attr
;)
6605 abbrev_attr
* next
= attr
->next
;
6615 last_abbrev
= first_abbrev
= NULL
;
6619 add_abbrev (number
, tag
, children
)
6620 unsigned long number
;
6624 abbrev_entry
* entry
;
6626 entry
= (abbrev_entry
*) malloc (sizeof (* entry
));
6632 entry
->entry
= number
;
6634 entry
->children
= children
;
6635 entry
->first_attr
= NULL
;
6636 entry
->last_attr
= NULL
;
6639 if (first_abbrev
== NULL
)
6640 first_abbrev
= entry
;
6642 last_abbrev
->next
= entry
;
6644 last_abbrev
= entry
;
6648 add_abbrev_attr (attribute
, form
)
6649 unsigned long attribute
;
6654 attr
= (abbrev_attr
*) malloc (sizeof (* attr
));
6660 attr
->attribute
= attribute
;
6664 if (last_abbrev
->first_attr
== NULL
)
6665 last_abbrev
->first_attr
= attr
;
6667 last_abbrev
->last_attr
->next
= attr
;
6669 last_abbrev
->last_attr
= attr
;
6672 /* Processes the (partial) contents of a .debug_abbrev section.
6673 Returns NULL if the end of the section was encountered.
6674 Returns the address after the last byte read if the end of
6675 an abbreviation set was found. */
6677 static unsigned char *
6678 process_abbrev_section (start
, end
)
6679 unsigned char * start
;
6680 unsigned char * end
;
6682 if (first_abbrev
!= NULL
)
6688 unsigned long entry
;
6690 unsigned long attribute
;
6693 entry
= read_leb128 (start
, & bytes_read
, 0);
6694 start
+= bytes_read
;
6696 /* A single zero is supposed to end the section according
6697 to the standard. If there's more, then signal that to
6700 return start
== end
? NULL
: start
;
6702 tag
= read_leb128 (start
, & bytes_read
, 0);
6703 start
+= bytes_read
;
6705 children
= * start
++;
6707 add_abbrev (entry
, tag
, children
);
6713 attribute
= read_leb128 (start
, & bytes_read
, 0);
6714 start
+= bytes_read
;
6716 form
= read_leb128 (start
, & bytes_read
, 0);
6717 start
+= bytes_read
;
6720 add_abbrev_attr (attribute
, form
);
6722 while (attribute
!= 0);
6730 display_debug_macinfo (section
, start
, file
)
6731 Elf32_Internal_Shdr
* section
;
6732 unsigned char * start
;
6733 FILE * file ATTRIBUTE_UNUSED
;
6735 unsigned char * end
= start
+ section
->sh_size
;
6736 unsigned char * curr
= start
;
6737 unsigned int bytes_read
;
6738 enum dwarf_macinfo_record_type op
;
6740 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6744 unsigned int lineno
;
6745 const char * string
;
6752 case DW_MACINFO_start_file
:
6754 unsigned int filenum
;
6756 lineno
= read_leb128 (curr
, & bytes_read
, 0);
6758 filenum
= read_leb128 (curr
, & bytes_read
, 0);
6761 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno
, filenum
);
6765 case DW_MACINFO_end_file
:
6766 printf (_(" DW_MACINFO_end_file\n"));
6769 case DW_MACINFO_define
:
6770 lineno
= read_leb128 (curr
, & bytes_read
, 0);
6773 curr
+= strlen (string
) + 1;
6774 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno
, string
);
6777 case DW_MACINFO_undef
:
6778 lineno
= read_leb128 (curr
, & bytes_read
, 0);
6781 curr
+= strlen (string
) + 1;
6782 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno
, string
);
6785 case DW_MACINFO_vendor_ext
:
6787 unsigned int constant
;
6789 constant
= read_leb128 (curr
, & bytes_read
, 0);
6792 curr
+= strlen (string
) + 1;
6793 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant
, string
);
6804 display_debug_abbrev (section
, start
, file
)
6805 Elf32_Internal_Shdr
* section
;
6806 unsigned char * start
;
6807 FILE * file ATTRIBUTE_UNUSED
;
6809 abbrev_entry
* entry
;
6810 unsigned char * end
= start
+ section
->sh_size
;
6812 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6816 start
= process_abbrev_section (start
, end
);
6818 if (first_abbrev
== NULL
)
6821 printf (_(" Number TAG\n"));
6823 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
6827 printf (_(" %ld %s [%s]\n"),
6829 get_TAG_name (entry
->tag
),
6830 entry
->children
? _("has children") : _("no children"));
6832 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
6834 printf (_(" %-18s %s\n"),
6835 get_AT_name (attr
->attribute
),
6836 get_FORM_name (attr
->form
));
6850 static unsigned char *
6851 display_block (data
, length
)
6852 unsigned char * data
;
6853 unsigned long length
;
6855 printf (_(" %lu byte block: "), length
);
6858 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
6864 decode_location_expression (data
, pointer_size
, length
)
6865 unsigned char * data
;
6866 unsigned int pointer_size
;
6867 unsigned long length
;
6871 unsigned long uvalue
;
6872 unsigned char * end
= data
+ length
;
6881 printf ("DW_OP_addr: %lx",
6882 (unsigned long) byte_get (data
, pointer_size
));
6883 data
+= pointer_size
;
6886 printf ("DW_OP_deref");
6889 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
6892 printf ("DW_OP_const1s: %ld", (long) byte_get (data
++, 1));
6895 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
6899 printf ("DW_OP_const2s: %ld", (long) byte_get (data
, 2));
6903 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
6907 printf ("DW_OP_const4s: %ld", (long) byte_get (data
, 4));
6911 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
6912 (unsigned long) byte_get (data
+ 4, 4));
6916 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
6917 (long) byte_get (data
+ 4, 4));
6921 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
6925 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
6929 printf ("DW_OP_dup");
6932 printf ("DW_OP_drop");
6935 printf ("DW_OP_over");
6938 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
6941 printf ("DW_OP_swap");
6944 printf ("DW_OP_rot");
6947 printf ("DW_OP_xderef");
6950 printf ("DW_OP_abs");
6953 printf ("DW_OP_and");
6956 printf ("DW_OP_div");
6959 printf ("DW_OP_minus");
6962 printf ("DW_OP_mod");
6965 printf ("DW_OP_mul");
6968 printf ("DW_OP_neg");
6971 printf ("DW_OP_not");
6974 printf ("DW_OP_or");
6977 printf ("DW_OP_plus");
6979 case DW_OP_plus_uconst
:
6980 printf ("DW_OP_plus_uconst: %lu",
6981 read_leb128 (data
, &bytes_read
, 0));
6985 printf ("DW_OP_shl");
6988 printf ("DW_OP_shr");
6991 printf ("DW_OP_shra");
6994 printf ("DW_OP_xor");
6997 printf ("DW_OP_bra: %ld", (long) byte_get (data
, 2));
7001 printf ("DW_OP_eq");
7004 printf ("DW_OP_ge");
7007 printf ("DW_OP_gt");
7010 printf ("DW_OP_le");
7013 printf ("DW_OP_lt");
7016 printf ("DW_OP_ne");
7019 printf ("DW_OP_skip: %ld", (long) byte_get (data
, 2));
7055 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
7090 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
7125 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
7126 read_leb128 (data
, &bytes_read
, 1));
7131 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
7135 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
7139 uvalue
= read_leb128 (data
, &bytes_read
, 0);
7141 printf ("DW_OP_bregx: %lu %ld", uvalue
,
7142 read_leb128 (data
, &bytes_read
, 1));
7146 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
7149 case DW_OP_deref_size
:
7150 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
7152 case DW_OP_xderef_size
:
7153 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
7156 printf ("DW_OP_nop");
7159 /* DWARF 2.1 extensions. */
7160 case DW_OP_push_object_address
:
7161 printf ("DW_OP_push_object_address");
7164 printf ("DW_OP_call2: <%lx>", (long) byte_get (data
, 2));
7168 printf ("DW_OP_call4: <%lx>", (long) byte_get (data
, 4));
7172 printf ("DW_OP_calli");
7176 if (op
>= DW_OP_lo_user
7177 && op
<= DW_OP_hi_user
)
7178 printf (_("(User defined location op)"));
7180 printf (_("(Unknown location op)"));
7181 /* No way to tell where the next op is, so just bail. */
7185 /* Separate the ops. */
7191 static const char * debug_str_contents
;
7192 static bfd_vma debug_str_size
;
7195 load_debug_str (file
)
7198 Elf32_Internal_Shdr
* sec
;
7201 /* If it is already loaded, do nothing. */
7202 if (debug_str_contents
!= NULL
)
7205 /* Locate the .debug_str section. */
7206 for (i
= 0, sec
= section_headers
;
7207 i
< elf_header
.e_shnum
;
7209 if (strcmp (SECTION_NAME (sec
), ".debug_str") == 0)
7212 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
7215 debug_str_size
= sec
->sh_size
;
7217 debug_str_contents
= ((char *)
7218 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7219 _("debug_str section data")));
7225 if (debug_str_contents
== NULL
)
7228 free ((char *) debug_str_contents
);
7229 debug_str_contents
= NULL
;
7234 fetch_indirect_string (offset
)
7235 unsigned long offset
;
7237 if (debug_str_contents
== NULL
)
7238 return _("<no .debug_str section>");
7240 if (offset
> debug_str_size
)
7241 return _("<offset is too big>");
7243 return debug_str_contents
+ offset
;
7248 display_debug_str (section
, start
, file
)
7249 Elf32_Internal_Shdr
* section
;
7250 unsigned char * start
;
7251 FILE * file ATTRIBUTE_UNUSED
;
7253 unsigned long bytes
;
7256 addr
= section
->sh_addr
;
7257 bytes
= section
->sh_size
;
7261 printf (_("\nThe .debug_str section is empty.\n"));
7265 printf (_("Contents of the .debug_str section:\n\n"));
7273 lbytes
= (bytes
> 16 ? 16 : bytes
);
7275 printf (" 0x%8.8lx ", (unsigned long) addr
);
7277 for (j
= 0; j
< 16; j
++)
7280 printf ("%2.2x", start
[j
]);
7288 for (j
= 0; j
< lbytes
; j
++)
7291 if (k
>= ' ' && k
< 0x80)
7308 static unsigned char *
7309 read_and_display_attr_value (attribute
, form
, data
, cu_offset
, pointer_size
)
7310 unsigned long attribute
;
7312 unsigned char * data
;
7313 unsigned long cu_offset
;
7314 unsigned long pointer_size
;
7316 unsigned long uvalue
= 0;
7317 unsigned char * block_start
= NULL
;
7325 case DW_FORM_ref_addr
:
7327 uvalue
= byte_get (data
, pointer_size
);
7328 data
+= pointer_size
;
7332 uvalue
= byte_get (data
, /* offset_size */ 4);
7333 data
+= /* offset_size */ 4;
7339 uvalue
= byte_get (data
++, 1);
7344 uvalue
= byte_get (data
, 2);
7350 uvalue
= byte_get (data
, 4);
7355 uvalue
= read_leb128 (data
, & bytes_read
, 1);
7359 case DW_FORM_ref_udata
:
7361 uvalue
= read_leb128 (data
, & bytes_read
, 0);
7365 case DW_FORM_indirect
:
7366 form
= read_leb128 (data
, & bytes_read
, 0);
7368 printf (" %s", get_FORM_name (form
));
7369 return read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
7375 case DW_FORM_ref_addr
:
7376 printf (" <#%lx>", uvalue
);
7382 case DW_FORM_ref_udata
:
7383 printf (" <%lx>", uvalue
+ cu_offset
);
7387 printf (" %#lx", uvalue
);
7395 printf (" %ld", uvalue
);
7400 uvalue
= byte_get (data
, 4);
7401 printf (" %lx", uvalue
);
7402 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
7406 case DW_FORM_string
:
7407 printf (" %s", data
);
7408 data
+= strlen ((char *) data
) + 1;
7412 uvalue
= read_leb128 (data
, & bytes_read
, 0);
7413 block_start
= data
+ bytes_read
;
7414 data
= display_block (block_start
, uvalue
);
7417 case DW_FORM_block1
:
7418 uvalue
= byte_get (data
, 1);
7419 block_start
= data
+ 1;
7420 data
= display_block (block_start
, uvalue
);
7423 case DW_FORM_block2
:
7424 uvalue
= byte_get (data
, 2);
7425 block_start
= data
+ 2;
7426 data
= display_block (block_start
, uvalue
);
7429 case DW_FORM_block4
:
7430 uvalue
= byte_get (data
, 4);
7431 block_start
= data
+ 4;
7432 data
= display_block (block_start
, uvalue
);
7436 printf (_(" (indirect string, offset: 0x%lx): "), uvalue
);
7437 printf (fetch_indirect_string (uvalue
));
7440 case DW_FORM_indirect
:
7441 /* Handled above. */
7445 warn (_("Unrecognized form: %d\n"), form
);
7449 /* For some attributes we can display futher information. */
7458 case DW_INL_not_inlined
: printf (_("(not inlined)")); break;
7459 case DW_INL_inlined
: printf (_("(inlined)")); break;
7460 case DW_INL_declared_not_inlined
: printf (_("(declared as inline but ignored)")); break;
7461 case DW_INL_declared_inlined
: printf (_("(declared as inline and inlined)")); break;
7462 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue
); break;
7466 case DW_AT_language
:
7469 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
7470 case DW_LANG_C89
: printf ("(ANSI C)"); break;
7471 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
7472 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
7473 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
7474 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
7475 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
7476 case DW_LANG_Ada83
: printf ("(Ada)"); break;
7477 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
7478 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
7479 /* DWARF 2.1 values. */
7480 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
7481 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
7482 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
7483 /* MIPS extension. */
7484 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
7485 default: printf ("(Unknown: %lx)", uvalue
); break;
7489 case DW_AT_encoding
:
7492 case DW_ATE_void
: printf ("(void)"); break;
7493 case DW_ATE_address
: printf ("(machine address)"); break;
7494 case DW_ATE_boolean
: printf ("(boolean)"); break;
7495 case DW_ATE_complex_float
: printf ("(complex float)"); break;
7496 case DW_ATE_float
: printf ("(float)"); break;
7497 case DW_ATE_signed
: printf ("(signed)"); break;
7498 case DW_ATE_signed_char
: printf ("(signed char)"); break;
7499 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
7500 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
7501 /* DWARF 2.1 value. */
7502 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
7504 if (uvalue
>= DW_ATE_lo_user
7505 && uvalue
<= DW_ATE_hi_user
)
7506 printf ("(user defined type)");
7508 printf ("(unknown type)");
7513 case DW_AT_accessibility
:
7516 case DW_ACCESS_public
: printf ("(public)"); break;
7517 case DW_ACCESS_protected
: printf ("(protected)"); break;
7518 case DW_ACCESS_private
: printf ("(private)"); break;
7519 default: printf ("(unknown accessibility)"); break;
7523 case DW_AT_visibility
:
7526 case DW_VIS_local
: printf ("(local)"); break;
7527 case DW_VIS_exported
: printf ("(exported)"); break;
7528 case DW_VIS_qualified
: printf ("(qualified)"); break;
7529 default: printf ("(unknown visibility)"); break;
7533 case DW_AT_virtuality
:
7536 case DW_VIRTUALITY_none
: printf ("(none)"); break;
7537 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
7538 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
7539 default: printf ("(unknown virtuality)"); break;
7543 case DW_AT_identifier_case
:
7546 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
7547 case DW_ID_up_case
: printf ("(up_case)"); break;
7548 case DW_ID_down_case
: printf ("(down_case)"); break;
7549 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
7550 default: printf ("(unknown case)"); break;
7554 case DW_AT_calling_convention
:
7557 case DW_CC_normal
: printf ("(normal)"); break;
7558 case DW_CC_program
: printf ("(program)"); break;
7559 case DW_CC_nocall
: printf ("(nocall)"); break;
7561 if (uvalue
>= DW_CC_lo_user
7562 && uvalue
<= DW_CC_hi_user
)
7563 printf ("(user defined)");
7565 printf ("(unknown convention)");
7569 case DW_AT_ordering
:
7572 case -1: printf ("(undefined)"); break;
7573 case 0: printf ("(row major)"); break;
7574 case 1: printf ("(column major)"); break;
7578 case DW_AT_frame_base
:
7579 case DW_AT_location
:
7580 case DW_AT_data_member_location
:
7581 case DW_AT_vtable_elem_location
:
7582 case DW_AT_allocated
:
7583 case DW_AT_associated
:
7584 case DW_AT_data_location
:
7586 case DW_AT_upper_bound
:
7587 case DW_AT_lower_bound
:
7591 decode_location_expression (block_start
, pointer_size
, uvalue
);
7603 static unsigned char *
7604 read_and_display_attr (attribute
, form
, data
, cu_offset
, pointer_size
)
7605 unsigned long attribute
;
7607 unsigned char * data
;
7608 unsigned long cu_offset
;
7609 unsigned long pointer_size
;
7611 printf (" %-18s:", get_AT_name (attribute
));
7612 data
= read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
7619 display_debug_info (section
, start
, file
)
7620 Elf32_Internal_Shdr
* section
;
7621 unsigned char * start
;
7624 unsigned char * end
= start
+ section
->sh_size
;
7625 unsigned char * section_begin
= start
;
7627 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
7629 load_debug_str (file
);
7633 DWARF2_External_CompUnit
* external
;
7634 DWARF2_Internal_CompUnit compunit
;
7635 Elf32_Internal_Shdr
* relsec
;
7636 unsigned char * tags
;
7639 unsigned long cu_offset
;
7641 external
= (DWARF2_External_CompUnit
*) start
;
7643 compunit
.cu_length
= BYTE_GET (external
->cu_length
);
7644 compunit
.cu_version
= BYTE_GET (external
->cu_version
);
7645 compunit
.cu_abbrev_offset
= BYTE_GET (external
->cu_abbrev_offset
);
7646 compunit
.cu_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
7648 if (compunit
.cu_length
== 0xffffffff)
7650 warn (_("64-bit DWARF debug info is not supported yet.\n"));
7654 /* Check for RELA relocations in the abbrev_offset address, and
7656 for (relsec
= section_headers
;
7657 relsec
< section_headers
+ elf_header
.e_shnum
;
7660 unsigned long nrelas
;
7661 Elf_Internal_Rela
*rela
, *rp
;
7662 Elf32_Internal_Shdr
*symsec
;
7663 Elf_Internal_Sym
*symtab
;
7664 Elf_Internal_Sym
*sym
;
7666 if (relsec
->sh_type
!= SHT_RELA
7667 || SECTION_HEADER (relsec
->sh_info
) != section
)
7670 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
7674 symsec
= SECTION_HEADER (relsec
->sh_link
);
7675 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
7677 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
7680 != (bfd_vma
) ((unsigned char *) &external
->cu_abbrev_offset
7686 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
7688 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
7690 warn (_("Skipping unexpected symbol type %u\n"),
7691 ELF32_ST_TYPE (sym
->st_info
));
7697 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
7699 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
7701 warn (_("Skipping unexpected symbol type %u\n"),
7702 ELF64_ST_TYPE (sym
->st_info
));
7707 compunit
.cu_abbrev_offset
+= rp
->r_addend
;
7715 tags
= start
+ sizeof (* external
);
7716 cu_offset
= start
- section_begin
;
7717 start
+= compunit
.cu_length
+ sizeof (external
->cu_length
);
7719 printf (_(" Compilation Unit @ %lx:\n"), cu_offset
);
7720 printf (_(" Length: %ld\n"), compunit
.cu_length
);
7721 printf (_(" Version: %d\n"), compunit
.cu_version
);
7722 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
7723 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
7725 if (compunit
.cu_version
!= 2)
7727 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
7733 /* Read in the abbrevs used by this compilation unit. */
7736 Elf32_Internal_Shdr
* sec
;
7737 unsigned char * begin
;
7739 /* Locate the .debug_abbrev section and process it. */
7740 for (i
= 0, sec
= section_headers
;
7741 i
< elf_header
.e_shnum
;
7743 if (strcmp (SECTION_NAME (sec
), ".debug_abbrev") == 0)
7746 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
7748 warn (_("Unable to locate .debug_abbrev section!\n"));
7752 begin
= ((unsigned char *)
7753 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7754 _("debug_abbrev section data")));
7758 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
7759 begin
+ sec
->sh_size
);
7765 while (tags
< start
)
7768 unsigned long abbrev_number
;
7769 abbrev_entry
* entry
;
7772 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
7775 /* A null DIE marks the end of a list of children. */
7776 if (abbrev_number
== 0)
7782 /* Scan through the abbreviation list until we reach the
7784 for (entry
= first_abbrev
;
7785 entry
&& entry
->entry
!= abbrev_number
;
7786 entry
= entry
->next
)
7791 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
7796 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
7798 (unsigned long) (tags
- section_begin
- bytes_read
),
7800 get_TAG_name (entry
->tag
));
7802 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
7803 tags
= read_and_display_attr (attr
->attribute
,
7806 compunit
.cu_pointer_size
);
7808 if (entry
->children
)
7821 display_debug_aranges (section
, start
, file
)
7822 Elf32_Internal_Shdr
* section
;
7823 unsigned char * start
;
7824 FILE * file ATTRIBUTE_UNUSED
;
7826 unsigned char * end
= start
+ section
->sh_size
;
7828 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
7832 DWARF2_External_ARange
* external
;
7833 DWARF2_Internal_ARange arange
;
7834 unsigned char * ranges
;
7835 unsigned long length
;
7836 unsigned long address
;
7839 external
= (DWARF2_External_ARange
*) start
;
7841 arange
.ar_length
= BYTE_GET (external
->ar_length
);
7842 arange
.ar_version
= BYTE_GET (external
->ar_version
);
7843 arange
.ar_info_offset
= BYTE_GET (external
->ar_info_offset
);
7844 arange
.ar_pointer_size
= BYTE_GET (external
->ar_pointer_size
);
7845 arange
.ar_segment_size
= BYTE_GET (external
->ar_segment_size
);
7847 if (arange
.ar_length
== 0xffffffff)
7849 warn (_("64-bit DWARF aranges are not supported yet.\n"));
7853 if (arange
.ar_version
!= 2)
7855 warn (_("Only DWARF 2 aranges are currently supported.\n"));
7859 printf (_(" Length: %ld\n"), arange
.ar_length
);
7860 printf (_(" Version: %d\n"), arange
.ar_version
);
7861 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
7862 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
7863 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
7865 printf (_("\n Address Length\n"));
7867 ranges
= start
+ sizeof (* external
);
7869 /* Must pad to an alignment boundary that is twice the pointer size. */
7870 excess
= sizeof (* external
) % (2 * arange
.ar_pointer_size
);
7872 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
7876 address
= byte_get (ranges
, arange
.ar_pointer_size
);
7878 ranges
+= arange
.ar_pointer_size
;
7880 length
= byte_get (ranges
, arange
.ar_pointer_size
);
7882 ranges
+= arange
.ar_pointer_size
;
7884 /* A pair of zeros marks the end of the list. */
7885 if (address
== 0 && length
== 0)
7888 printf (" %8.8lx %lu\n", address
, length
);
7891 start
+= arange
.ar_length
+ sizeof (external
->ar_length
);
7899 typedef struct Frame_Chunk
7901 struct Frame_Chunk
* next
;
7902 unsigned char * chunk_start
;
7904 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
7905 short int * col_type
;
7907 char * augmentation
;
7908 unsigned int code_factor
;
7910 unsigned long pc_begin
;
7911 unsigned long pc_range
;
7915 unsigned char fde_encoding
;
7919 /* A marker for a col_type that means this column was never referenced
7920 in the frame info. */
7921 #define DW_CFA_unreferenced (-1)
7923 static void frame_need_space
PARAMS ((Frame_Chunk
*, int));
7924 static void frame_display_row
PARAMS ((Frame_Chunk
*, int *, int *));
7925 static int size_of_encoded_value
PARAMS ((int));
7928 frame_need_space (fc
, reg
)
7932 int prev
= fc
->ncols
;
7934 if (reg
< fc
->ncols
)
7937 fc
->ncols
= reg
+ 1;
7938 fc
->col_type
= (short int *) xrealloc (fc
->col_type
,
7939 fc
->ncols
* sizeof (short int));
7940 fc
->col_offset
= (int *) xrealloc (fc
->col_offset
,
7941 fc
->ncols
* sizeof (int));
7943 while (prev
< fc
->ncols
)
7945 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
7946 fc
->col_offset
[prev
] = 0;
7952 frame_display_row (fc
, need_col_headers
, max_regs
)
7954 int * need_col_headers
;
7960 if (* max_regs
< fc
->ncols
)
7961 * max_regs
= fc
->ncols
;
7963 if (* need_col_headers
)
7965 * need_col_headers
= 0;
7967 printf (" LOC CFA ");
7969 for (r
= 0; r
< * max_regs
; r
++)
7970 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
7975 printf ("r%-4d", r
);
7981 printf ("%08lx ", fc
->pc_begin
);
7982 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
7983 printf ("%-8s ", tmp
);
7985 for (r
= 0; r
< fc
->ncols
; r
++)
7987 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
7989 switch (fc
->col_type
[r
])
7991 case DW_CFA_undefined
:
7994 case DW_CFA_same_value
:
7998 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
8000 case DW_CFA_register
:
8001 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
8004 strcpy (tmp
, "n/a");
8007 printf ("%-5s", tmp
);
8014 size_of_encoded_value (encoding
)
8017 switch (encoding
& 0x7)
8020 case 0: return is_32bit_elf
? 4 : 8;
8027 #define GET(N) byte_get (start, N); start += N
8028 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
8029 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
8032 display_debug_frames (section
, start
, file
)
8033 Elf32_Internal_Shdr
* section
;
8034 unsigned char * start
;
8035 FILE * file ATTRIBUTE_UNUSED
;
8037 unsigned char * end
= start
+ section
->sh_size
;
8038 unsigned char * section_start
= start
;
8039 Frame_Chunk
* chunks
= 0;
8040 Frame_Chunk
* remembered_state
= 0;
8042 int is_eh
= (strcmp (SECTION_NAME (section
), ".eh_frame") == 0);
8045 int addr_size
= is_32bit_elf
? 4 : 8;
8047 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
8051 unsigned char * saved_start
;
8052 unsigned char * block_end
;
8053 unsigned long length
;
8054 unsigned long cie_id
;
8057 int need_col_headers
= 1;
8058 unsigned char * augmentation_data
= NULL
;
8059 unsigned long augmentation_data_len
= 0;
8060 int encoded_ptr_size
= addr_size
;
8062 saved_start
= start
;
8063 length
= byte_get (start
, 4); start
+= 4;
8068 if (length
== 0xffffffff)
8070 warn (_("64-bit DWARF format frames are not supported yet.\n"));
8074 block_end
= saved_start
+ length
+ 4;
8075 cie_id
= byte_get (start
, 4); start
+= 4;
8077 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
8081 fc
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
8082 memset (fc
, 0, sizeof (Frame_Chunk
));
8086 fc
->chunk_start
= saved_start
;
8088 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
8089 fc
->col_offset
= (int *) xmalloc (sizeof (int));
8090 frame_need_space (fc
, max_regs
-1);
8094 fc
->augmentation
= start
;
8095 start
= strchr (start
, '\0') + 1;
8097 if (fc
->augmentation
[0] == 'z')
8099 fc
->code_factor
= LEB ();
8100 fc
->data_factor
= SLEB ();
8101 fc
->ra
= byte_get (start
, 1); start
+= 1;
8102 augmentation_data_len
= LEB ();
8103 augmentation_data
= start
;
8104 start
+= augmentation_data_len
;
8106 else if (strcmp (fc
->augmentation
, "eh") == 0)
8109 fc
->code_factor
= LEB ();
8110 fc
->data_factor
= SLEB ();
8111 fc
->ra
= byte_get (start
, 1); start
+= 1;
8115 fc
->code_factor
= LEB ();
8116 fc
->data_factor
= SLEB ();
8117 fc
->ra
= byte_get (start
, 1); start
+= 1;
8121 if (do_debug_frames_interp
)
8122 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
8123 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
8124 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
8128 printf ("\n%08lx %08lx %08lx CIE\n",
8129 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
8130 printf (" Version: %d\n", version
);
8131 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
8132 printf (" Code alignment factor: %u\n", fc
->code_factor
);
8133 printf (" Data alignment factor: %d\n", fc
->data_factor
);
8134 printf (" Return address column: %d\n", fc
->ra
);
8136 if (augmentation_data_len
)
8139 printf (" Augmentation data: ");
8140 for (i
= 0; i
< augmentation_data_len
; ++i
)
8141 printf (" %02x", augmentation_data
[i
]);
8147 if (augmentation_data_len
)
8149 unsigned char *p
, *q
;
8150 p
= fc
->augmentation
+ 1;
8151 q
= augmentation_data
;
8158 q
+= 1 + size_of_encoded_value (*q
);
8160 fc
->fde_encoding
= *q
++;
8166 if (fc
->fde_encoding
)
8167 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
8170 frame_need_space (fc
, fc
->ra
);
8174 unsigned char * look_for
;
8175 static Frame_Chunk fde_fc
;
8178 memset (fc
, 0, sizeof (Frame_Chunk
));
8180 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
8182 for (cie
= chunks
; cie
; cie
= cie
->next
)
8183 if (cie
->chunk_start
== look_for
)
8188 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
8189 cie_id
, saved_start
);
8192 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
8193 fc
->col_offset
= (int *) xmalloc (sizeof (int));
8194 frame_need_space (fc
, max_regs
- 1);
8196 fc
->augmentation
= "";
8197 fc
->fde_encoding
= 0;
8201 fc
->ncols
= cie
->ncols
;
8202 fc
->col_type
= (short int *) xmalloc (fc
->ncols
* sizeof (short int));
8203 fc
->col_offset
= (int *) xmalloc (fc
->ncols
* sizeof (int));
8204 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
8205 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
8206 fc
->augmentation
= cie
->augmentation
;
8207 fc
->code_factor
= cie
->code_factor
;
8208 fc
->data_factor
= cie
->data_factor
;
8209 fc
->cfa_reg
= cie
->cfa_reg
;
8210 fc
->cfa_offset
= cie
->cfa_offset
;
8212 frame_need_space (fc
, max_regs
-1);
8213 fc
->fde_encoding
= cie
->fde_encoding
;
8216 if (fc
->fde_encoding
)
8217 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
8219 fc
->pc_begin
= byte_get (start
, encoded_ptr_size
);
8220 start
+= encoded_ptr_size
;
8221 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
8222 start
+= encoded_ptr_size
;
8224 if (cie
->augmentation
[0] == 'z')
8226 augmentation_data_len
= LEB ();
8227 augmentation_data
= start
;
8228 start
+= augmentation_data_len
;
8231 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
8232 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
8233 (unsigned long)(cie
->chunk_start
- section_start
),
8234 fc
->pc_begin
, fc
->pc_begin
+ fc
->pc_range
);
8235 if (! do_debug_frames_interp
&& augmentation_data_len
)
8238 printf (" Augmentation data: ");
8239 for (i
= 0; i
< augmentation_data_len
; ++i
)
8240 printf (" %02x", augmentation_data
[i
]);
8246 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8247 about to interpret instructions for the chunk. */
8249 if (do_debug_frames_interp
)
8251 /* Start by making a pass over the chunk, allocating storage
8252 and taking note of what registers are used. */
8253 unsigned char * tmp
= start
;
8255 while (start
< block_end
)
8265 /* Warning: if you add any more cases to this switch, be
8266 sure to add them to the corresponding switch below. */
8269 case DW_CFA_advance_loc
:
8273 frame_need_space (fc
, opa
);
8274 fc
->col_type
[opa
] = DW_CFA_undefined
;
8276 case DW_CFA_restore
:
8277 frame_need_space (fc
, opa
);
8278 fc
->col_type
[opa
] = DW_CFA_undefined
;
8280 case DW_CFA_set_loc
:
8281 start
+= encoded_ptr_size
;
8283 case DW_CFA_advance_loc1
:
8286 case DW_CFA_advance_loc2
:
8289 case DW_CFA_advance_loc4
:
8292 case DW_CFA_offset_extended
:
8293 reg
= LEB (); LEB ();
8294 frame_need_space (fc
, reg
);
8295 fc
->col_type
[reg
] = DW_CFA_undefined
;
8297 case DW_CFA_restore_extended
:
8299 frame_need_space (fc
, reg
);
8300 fc
->col_type
[reg
] = DW_CFA_undefined
;
8302 case DW_CFA_undefined
:
8304 frame_need_space (fc
, reg
);
8305 fc
->col_type
[reg
] = DW_CFA_undefined
;
8307 case DW_CFA_same_value
:
8309 frame_need_space (fc
, reg
);
8310 fc
->col_type
[reg
] = DW_CFA_undefined
;
8312 case DW_CFA_register
:
8313 reg
= LEB (); LEB ();
8314 frame_need_space (fc
, reg
);
8315 fc
->col_type
[reg
] = DW_CFA_undefined
;
8317 case DW_CFA_def_cfa
:
8320 case DW_CFA_def_cfa_register
:
8323 case DW_CFA_def_cfa_offset
:
8326 #ifndef DW_CFA_GNU_args_size
8327 #define DW_CFA_GNU_args_size 0x2e
8329 case DW_CFA_GNU_args_size
:
8332 #ifndef DW_CFA_GNU_negative_offset_extended
8333 #define DW_CFA_GNU_negative_offset_extended 0x2f
8335 case DW_CFA_GNU_negative_offset_extended
:
8336 reg
= LEB (); LEB ();
8337 frame_need_space (fc
, reg
);
8338 fc
->col_type
[reg
] = DW_CFA_undefined
;
8347 /* Now we know what registers are used, make a second pass over
8348 the chunk, this time actually printing out the info. */
8350 while (start
< block_end
)
8353 unsigned long ul
, reg
, roffs
;
8362 /* Warning: if you add any more cases to this switch, be
8363 sure to add them to the corresponding switch above. */
8366 case DW_CFA_advance_loc
:
8367 if (do_debug_frames_interp
)
8368 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8370 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8371 opa
* fc
->code_factor
,
8372 fc
->pc_begin
+ opa
* fc
->code_factor
);
8373 fc
->pc_begin
+= opa
* fc
->code_factor
;
8378 if (! do_debug_frames_interp
)
8379 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8380 opa
, roffs
* fc
->data_factor
);
8381 fc
->col_type
[opa
] = DW_CFA_offset
;
8382 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
8385 case DW_CFA_restore
:
8386 if (! do_debug_frames_interp
)
8387 printf (" DW_CFA_restore: r%d\n", opa
);
8388 fc
->col_type
[opa
] = cie
->col_type
[opa
];
8389 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
8392 case DW_CFA_set_loc
:
8393 vma
= byte_get (start
, encoded_ptr_size
);
8394 start
+= encoded_ptr_size
;
8395 if (do_debug_frames_interp
)
8396 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8398 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
8402 case DW_CFA_advance_loc1
:
8403 ofs
= byte_get (start
, 1); start
+= 1;
8404 if (do_debug_frames_interp
)
8405 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8407 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8408 ofs
* fc
->code_factor
,
8409 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8410 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8413 case DW_CFA_advance_loc2
:
8414 ofs
= byte_get (start
, 2); start
+= 2;
8415 if (do_debug_frames_interp
)
8416 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8418 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8419 ofs
* fc
->code_factor
,
8420 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8421 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8424 case DW_CFA_advance_loc4
:
8425 ofs
= byte_get (start
, 4); start
+= 4;
8426 if (do_debug_frames_interp
)
8427 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8429 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8430 ofs
* fc
->code_factor
,
8431 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8432 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8435 case DW_CFA_offset_extended
:
8438 if (! do_debug_frames_interp
)
8439 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8440 reg
, roffs
* fc
->data_factor
);
8441 fc
->col_type
[reg
] = DW_CFA_offset
;
8442 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
8445 case DW_CFA_restore_extended
:
8447 if (! do_debug_frames_interp
)
8448 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
8449 fc
->col_type
[reg
] = cie
->col_type
[reg
];
8450 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
8453 case DW_CFA_undefined
:
8455 if (! do_debug_frames_interp
)
8456 printf (" DW_CFA_undefined: r%ld\n", reg
);
8457 fc
->col_type
[reg
] = DW_CFA_undefined
;
8458 fc
->col_offset
[reg
] = 0;
8461 case DW_CFA_same_value
:
8463 if (! do_debug_frames_interp
)
8464 printf (" DW_CFA_same_value: r%ld\n", reg
);
8465 fc
->col_type
[reg
] = DW_CFA_same_value
;
8466 fc
->col_offset
[reg
] = 0;
8469 case DW_CFA_register
:
8472 if (! do_debug_frames_interp
)
8473 printf (" DW_CFA_register: r%ld\n", reg
);
8474 fc
->col_type
[reg
] = DW_CFA_register
;
8475 fc
->col_offset
[reg
] = roffs
;
8478 case DW_CFA_remember_state
:
8479 if (! do_debug_frames_interp
)
8480 printf (" DW_CFA_remember_state\n");
8481 rs
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
8482 rs
->ncols
= fc
->ncols
;
8483 rs
->col_type
= (short int *) xmalloc (rs
->ncols
* sizeof (short int));
8484 rs
->col_offset
= (int *) xmalloc (rs
->ncols
* sizeof (int));
8485 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
8486 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
8487 rs
->next
= remembered_state
;
8488 remembered_state
= rs
;
8491 case DW_CFA_restore_state
:
8492 if (! do_debug_frames_interp
)
8493 printf (" DW_CFA_restore_state\n");
8494 rs
= remembered_state
;
8495 remembered_state
= rs
->next
;
8496 frame_need_space (fc
, rs
->ncols
-1);
8497 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
8498 memcpy (fc
->col_offset
, rs
->col_offset
, rs
->ncols
* sizeof (int));
8499 free (rs
->col_type
);
8500 free (rs
->col_offset
);
8504 case DW_CFA_def_cfa
:
8505 fc
->cfa_reg
= LEB ();
8506 fc
->cfa_offset
= LEB ();
8507 if (! do_debug_frames_interp
)
8508 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
8509 fc
->cfa_reg
, fc
->cfa_offset
);
8512 case DW_CFA_def_cfa_register
:
8513 fc
->cfa_reg
= LEB ();
8514 if (! do_debug_frames_interp
)
8515 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
8518 case DW_CFA_def_cfa_offset
:
8519 fc
->cfa_offset
= LEB ();
8520 if (! do_debug_frames_interp
)
8521 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
8525 if (! do_debug_frames_interp
)
8526 printf (" DW_CFA_nop\n");
8529 #ifndef DW_CFA_GNU_window_save
8530 #define DW_CFA_GNU_window_save 0x2d
8532 case DW_CFA_GNU_window_save
:
8533 if (! do_debug_frames_interp
)
8534 printf (" DW_CFA_GNU_window_save\n");
8537 case DW_CFA_GNU_args_size
:
8539 if (! do_debug_frames_interp
)
8540 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
8543 case DW_CFA_GNU_negative_offset_extended
:
8546 frame_need_space (fc
, reg
);
8547 if (! do_debug_frames_interp
)
8548 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
8549 reg
, l
* fc
->data_factor
);
8550 fc
->col_type
[reg
] = DW_CFA_offset
;
8551 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
8555 fprintf (stderr
, "unsupported or unknown DW_CFA_%d\n", op
);
8560 if (do_debug_frames_interp
)
8561 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8576 display_debug_not_supported (section
, start
, file
)
8577 Elf32_Internal_Shdr
* section
;
8578 unsigned char * start ATTRIBUTE_UNUSED
;
8579 FILE * file ATTRIBUTE_UNUSED
;
8581 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
8582 SECTION_NAME (section
));
8587 /* Pre-scan the .debug_info section to record the size of address.
8588 When dumping the .debug_line, we use that size information, assuming
8589 that all compilation units have the same address size. */
8591 prescan_debug_info (section
, start
, file
)
8592 Elf32_Internal_Shdr
* section ATTRIBUTE_UNUSED
;
8593 unsigned char * start
;
8594 FILE * file ATTRIBUTE_UNUSED
;
8596 DWARF2_External_CompUnit
* external
;
8598 external
= (DWARF2_External_CompUnit
*) start
;
8600 debug_line_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
8604 /* A structure containing the name of a debug section and a pointer
8605 to a function that can decode it. The third field is a prescan
8606 function to be run over the section before displaying any of the
8610 const char * const name
;
8611 int (* display
) PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
8612 int (* prescan
) PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
8616 { ".debug_abbrev", display_debug_abbrev
, NULL
},
8617 { ".debug_aranges", display_debug_aranges
, NULL
},
8618 { ".debug_frame", display_debug_frames
, NULL
},
8619 { ".debug_info", display_debug_info
, prescan_debug_info
},
8620 { ".debug_line", display_debug_lines
, NULL
},
8621 { ".debug_pubnames", display_debug_pubnames
, NULL
},
8622 { ".eh_frame", display_debug_frames
, NULL
},
8623 { ".debug_macinfo", display_debug_macinfo
, NULL
},
8624 { ".debug_str", display_debug_str
, NULL
},
8626 { ".debug_pubtypes", display_debug_not_supported
, NULL
},
8627 { ".debug_ranges", display_debug_not_supported
, NULL
},
8628 { ".debug_static_func", display_debug_not_supported
, NULL
},
8629 { ".debug_static_vars", display_debug_not_supported
, NULL
},
8630 { ".debug_types", display_debug_not_supported
, NULL
},
8631 { ".debug_weaknames", display_debug_not_supported
, NULL
}
8635 display_debug_section (section
, file
)
8636 Elf32_Internal_Shdr
* section
;
8639 char * name
= SECTION_NAME (section
);
8640 bfd_size_type length
;
8641 unsigned char * start
;
8644 length
= section
->sh_size
;
8647 printf (_("\nSection '%s' has no debugging data.\n"), name
);
8651 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
, length
,
8652 _("debug section data"));
8656 /* See if we know how to display the contents of this section. */
8657 if (strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
8658 name
= ".debug_info";
8660 for (i
= NUM_ELEM (debug_displays
); i
--;)
8661 if (strcmp (debug_displays
[i
].name
, name
) == 0)
8663 debug_displays
[i
].display (section
, start
, file
);
8668 printf (_("Unrecognized debug section: %s\n"), name
);
8672 /* If we loaded in the abbrev section at some point,
8673 we must release it here. */
8680 process_section_contents (file
)
8683 Elf32_Internal_Shdr
* section
;
8689 /* Pre-scan the debug sections to find some debug information not
8690 present in some of them. For the .debug_line, we must find out the
8691 size of address (specified in .debug_info and .debug_aranges). */
8692 for (i
= 0, section
= section_headers
;
8693 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
8696 char * name
= SECTION_NAME (section
);
8699 if (section
->sh_size
== 0)
8702 /* See if there is some pre-scan operation for this section. */
8703 for (j
= NUM_ELEM (debug_displays
); j
--;)
8704 if (strcmp (debug_displays
[j
].name
, name
) == 0)
8706 if (debug_displays
[j
].prescan
!= NULL
)
8708 bfd_size_type length
;
8709 unsigned char * start
;
8711 length
= section
->sh_size
;
8712 start
= ((unsigned char *)
8713 get_data (NULL
, file
, section
->sh_offset
, length
,
8714 _("debug section data")));
8718 debug_displays
[j
].prescan (section
, start
, file
);
8726 for (i
= 0, section
= section_headers
;
8727 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
8730 #ifdef SUPPORT_DISASSEMBLY
8731 if (dump_sects
[i
] & DISASS_DUMP
)
8732 disassemble_section (section
, file
);
8734 if (dump_sects
[i
] & HEX_DUMP
)
8735 dump_section (section
, file
);
8737 if (dump_sects
[i
] & DEBUG_DUMP
)
8738 display_debug_section (section
, file
);
8741 if (i
< num_dump_sects
)
8742 warn (_("Some sections were not dumped because they do not exist!\n"));
8748 process_mips_fpe_exception (mask
)
8754 if (mask
& OEX_FPU_INEX
)
8755 fputs ("INEX", stdout
), first
= 0;
8756 if (mask
& OEX_FPU_UFLO
)
8757 printf ("%sUFLO", first
? "" : "|"), first
= 0;
8758 if (mask
& OEX_FPU_OFLO
)
8759 printf ("%sOFLO", first
? "" : "|"), first
= 0;
8760 if (mask
& OEX_FPU_DIV0
)
8761 printf ("%sDIV0", first
? "" : "|"), first
= 0;
8762 if (mask
& OEX_FPU_INVAL
)
8763 printf ("%sINVAL", first
? "" : "|");
8766 fputs ("0", stdout
);
8770 process_mips_specific (file
)
8773 Elf_Internal_Dyn
* entry
;
8774 size_t liblist_offset
= 0;
8775 size_t liblistno
= 0;
8776 size_t conflictsno
= 0;
8777 size_t options_offset
= 0;
8778 size_t conflicts_offset
= 0;
8780 /* We have a lot of special sections. Thanks SGI! */
8781 if (dynamic_segment
== NULL
)
8782 /* No information available. */
8785 for (entry
= dynamic_segment
; entry
->d_tag
!= DT_NULL
; ++entry
)
8786 switch (entry
->d_tag
)
8788 case DT_MIPS_LIBLIST
:
8789 liblist_offset
= entry
->d_un
.d_val
- loadaddr
;
8791 case DT_MIPS_LIBLISTNO
:
8792 liblistno
= entry
->d_un
.d_val
;
8794 case DT_MIPS_OPTIONS
:
8795 options_offset
= entry
->d_un
.d_val
- loadaddr
;
8797 case DT_MIPS_CONFLICT
:
8798 conflicts_offset
= entry
->d_un
.d_val
- loadaddr
;
8800 case DT_MIPS_CONFLICTNO
:
8801 conflictsno
= entry
->d_un
.d_val
;
8807 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
8809 Elf32_External_Lib
* elib
;
8812 elib
= ((Elf32_External_Lib
*)
8813 get_data (NULL
, file
, liblist_offset
,
8814 liblistno
* sizeof (Elf32_External_Lib
),
8818 printf ("\nSection '.liblist' contains %lu entries:\n",
8819 (unsigned long) liblistno
);
8820 fputs (" Library Time Stamp Checksum Version Flags\n",
8823 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
8830 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
8831 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
8832 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
8833 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
8834 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
8836 tmp
= gmtime (&time
);
8837 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
8838 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
8839 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
8841 printf ("%3lu: ", (unsigned long) cnt
);
8842 print_symbol (20, dynamic_strings
+ liblist
.l_name
);
8843 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
8846 if (liblist
.l_flags
== 0)
8857 { " EXACT_MATCH", LL_EXACT_MATCH
},
8858 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
8859 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
8860 { " EXPORTS", LL_EXPORTS
},
8861 { " DELAY_LOAD", LL_DELAY_LOAD
},
8862 { " DELTA", LL_DELTA
}
8864 int flags
= liblist
.l_flags
;
8868 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
8870 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
8872 fputs (l_flags_vals
[fcnt
].name
, stdout
);
8873 flags
^= l_flags_vals
[fcnt
].bit
;
8876 printf (" %#x", (unsigned int) flags
);
8886 if (options_offset
!= 0)
8888 Elf_External_Options
* eopt
;
8889 Elf_Internal_Shdr
* sect
= section_headers
;
8890 Elf_Internal_Options
* iopt
;
8891 Elf_Internal_Options
* option
;
8895 /* Find the section header so that we get the size. */
8896 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
8899 eopt
= (Elf_External_Options
*) get_data (NULL
, file
, options_offset
,
8900 sect
->sh_size
, _("options"));
8903 iopt
= ((Elf_Internal_Options
*)
8904 malloc ((sect
->sh_size
/ sizeof (eopt
)) * sizeof (* iopt
)));
8907 error (_("Out of memory"));
8914 while (offset
< sect
->sh_size
)
8916 Elf_External_Options
* eoption
;
8918 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
8920 option
->kind
= BYTE_GET (eoption
->kind
);
8921 option
->size
= BYTE_GET (eoption
->size
);
8922 option
->section
= BYTE_GET (eoption
->section
);
8923 option
->info
= BYTE_GET (eoption
->info
);
8925 offset
+= option
->size
;
8931 printf (_("\nSection '%s' contains %d entries:\n"),
8932 SECTION_NAME (sect
), cnt
);
8940 switch (option
->kind
)
8943 /* This shouldn't happen. */
8944 printf (" NULL %d %lx", option
->section
, option
->info
);
8947 printf (" REGINFO ");
8948 if (elf_header
.e_machine
== EM_MIPS
)
8951 Elf32_External_RegInfo
* ereg
;
8952 Elf32_RegInfo reginfo
;
8954 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
8955 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8956 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8957 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8958 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8959 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8960 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
8962 printf ("GPR %08lx GP 0x%lx\n",
8964 (unsigned long) reginfo
.ri_gp_value
);
8965 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8966 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8967 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8972 Elf64_External_RegInfo
* ereg
;
8973 Elf64_Internal_RegInfo reginfo
;
8975 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
8976 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8977 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8978 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8979 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8980 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8981 reginfo
.ri_gp_value
= BYTE_GET8 (ereg
->ri_gp_value
);
8983 printf ("GPR %08lx GP 0x",
8984 reginfo
.ri_gprmask
);
8985 printf_vma (reginfo
.ri_gp_value
);
8988 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8989 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8990 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8994 case ODK_EXCEPTIONS
:
8995 fputs (" EXCEPTIONS fpe_min(", stdout
);
8996 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
8997 fputs (") fpe_max(", stdout
);
8998 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
8999 fputs (")", stdout
);
9001 if (option
->info
& OEX_PAGE0
)
9002 fputs (" PAGE0", stdout
);
9003 if (option
->info
& OEX_SMM
)
9004 fputs (" SMM", stdout
);
9005 if (option
->info
& OEX_FPDBUG
)
9006 fputs (" FPDBUG", stdout
);
9007 if (option
->info
& OEX_DISMISS
)
9008 fputs (" DISMISS", stdout
);
9011 fputs (" PAD ", stdout
);
9012 if (option
->info
& OPAD_PREFIX
)
9013 fputs (" PREFIX", stdout
);
9014 if (option
->info
& OPAD_POSTFIX
)
9015 fputs (" POSTFIX", stdout
);
9016 if (option
->info
& OPAD_SYMBOL
)
9017 fputs (" SYMBOL", stdout
);
9020 fputs (" HWPATCH ", stdout
);
9021 if (option
->info
& OHW_R4KEOP
)
9022 fputs (" R4KEOP", stdout
);
9023 if (option
->info
& OHW_R8KPFETCH
)
9024 fputs (" R8KPFETCH", stdout
);
9025 if (option
->info
& OHW_R5KEOP
)
9026 fputs (" R5KEOP", stdout
);
9027 if (option
->info
& OHW_R5KCVTL
)
9028 fputs (" R5KCVTL", stdout
);
9031 fputs (" FILL ", stdout
);
9032 /* XXX Print content of info word? */
9035 fputs (" TAGS ", stdout
);
9036 /* XXX Print content of info word? */
9039 fputs (" HWAND ", stdout
);
9040 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9041 fputs (" R4KEOP_CHECKED", stdout
);
9042 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9043 fputs (" R4KEOP_CLEAN", stdout
);
9046 fputs (" HWOR ", stdout
);
9047 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9048 fputs (" R4KEOP_CHECKED", stdout
);
9049 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9050 fputs (" R4KEOP_CLEAN", stdout
);
9053 printf (" GP_GROUP %#06lx self-contained %#06lx",
9054 option
->info
& OGP_GROUP
,
9055 (option
->info
& OGP_SELF
) >> 16);
9058 printf (" IDENT %#06lx self-contained %#06lx",
9059 option
->info
& OGP_GROUP
,
9060 (option
->info
& OGP_SELF
) >> 16);
9063 /* This shouldn't happen. */
9064 printf (" %3d ??? %d %lx",
9065 option
->kind
, option
->section
, option
->info
);
9069 len
= sizeof (* eopt
);
9070 while (len
< option
->size
)
9071 if (((char *) option
)[len
] >= ' '
9072 && ((char *) option
)[len
] < 0x7f)
9073 printf ("%c", ((char *) option
)[len
++]);
9075 printf ("\\%03o", ((char *) option
)[len
++]);
9077 fputs ("\n", stdout
);
9085 if (conflicts_offset
!= 0 && conflictsno
!= 0)
9087 Elf32_Conflict
* iconf
;
9090 if (dynamic_symbols
== NULL
)
9092 error (_("conflict list with without table"));
9096 iconf
= (Elf32_Conflict
*) malloc (conflictsno
* sizeof (* iconf
));
9099 error (_("Out of memory"));
9105 Elf32_External_Conflict
* econf32
;
9107 econf32
= ((Elf32_External_Conflict
*)
9108 get_data (NULL
, file
, conflicts_offset
,
9109 conflictsno
* sizeof (* econf32
),
9114 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9115 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
9121 Elf64_External_Conflict
* econf64
;
9123 econf64
= ((Elf64_External_Conflict
*)
9124 get_data (NULL
, file
, conflicts_offset
,
9125 conflictsno
* sizeof (* econf64
),
9130 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9131 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
9136 printf (_("\nSection '.conflict' contains %ld entries:\n"),
9137 (long) conflictsno
);
9138 puts (_(" Num: Index Value Name"));
9140 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9142 Elf_Internal_Sym
* psym
= & dynamic_symbols
[iconf
[cnt
]];
9144 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
9145 print_vma (psym
->st_value
, FULL_HEX
);
9147 print_symbol (25, dynamic_strings
+ psym
->st_name
);
9158 get_note_type (e_type
)
9161 static char buff
[64];
9165 case NT_PRSTATUS
: return _("NT_PRSTATUS (prstatus structure)");
9166 case NT_FPREGSET
: return _("NT_FPREGSET (floating point registers)");
9167 case NT_PRPSINFO
: return _("NT_PRPSINFO (prpsinfo structure)");
9168 case NT_TASKSTRUCT
: return _("NT_TASKSTRUCT (task structure)");
9169 case NT_PRXFPREG
: return _("NT_PRXFPREG (user_xfpregs structure)");
9170 case NT_PSTATUS
: return _("NT_PSTATUS (pstatus structure)");
9171 case NT_FPREGS
: return _("NT_FPREGS (floating point registers)");
9172 case NT_PSINFO
: return _("NT_PSINFO (psinfo structure)");
9173 case NT_LWPSTATUS
: return _("NT_LWPSTATUS (lwpstatus_t structure)");
9174 case NT_LWPSINFO
: return _("NT_LWPSINFO (lwpsinfo_t structure)");
9175 case NT_WIN32PSTATUS
: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
9177 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
9183 get_netbsd_elfcore_note_type (e_type
)
9186 static char buff
[64];
9188 if (e_type
== NT_NETBSDCORE_PROCINFO
)
9190 /* NetBSD core "procinfo" structure. */
9191 return _("NetBSD procinfo structure");
9194 /* As of Jan 2002 there are no other machine-independent notes
9195 defined for NetBSD core files. If the note type is less
9196 than the start of the machine-dependent note types, we don't
9199 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
9201 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
9205 switch (elf_header
.e_machine
)
9207 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
9208 and PT_GETFPREGS == mach+2. */
9213 case EM_SPARC32PLUS
:
9217 case NT_NETBSDCORE_FIRSTMACH
+0:
9218 return _("PT_GETREGS (reg structure)");
9219 case NT_NETBSDCORE_FIRSTMACH
+2:
9220 return _("PT_GETFPREGS (fpreg structure)");
9226 /* On all other arch's, PT_GETREGS == mach+1 and
9227 PT_GETFPREGS == mach+3. */
9231 case NT_NETBSDCORE_FIRSTMACH
+1:
9232 return _("PT_GETREGS (reg structure)");
9233 case NT_NETBSDCORE_FIRSTMACH
+3:
9234 return _("PT_GETFPREGS (fpreg structure)");
9240 sprintf (buff
, _("PT_FIRSTMACH+%d"), e_type
- NT_NETBSDCORE_FIRSTMACH
);
9244 /* Note that by the ELF standard, the name field is already null byte
9245 terminated, and namesz includes the terminating null byte.
9246 I.E. the value of namesz for the name "FSF" is 4.
9248 If the value of namesz is zero, there is no name present. */
9250 process_note (pnote
)
9251 Elf32_Internal_Note
* pnote
;
9255 if (pnote
->namesz
== 0)
9257 /* If there is no note name, then use the default set of
9258 note type strings. */
9259 nt
= get_note_type (pnote
->type
);
9261 else if (strncmp (pnote
->namedata
, "NetBSD-CORE", 11) == 0)
9263 /* NetBSD-specific core file notes. */
9264 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
9268 /* Don't recognize this note name; just use the default set of
9269 note type strings. */
9270 nt
= get_note_type (pnote
->type
);
9273 printf (" %s\t\t0x%08lx\t%s\n",
9274 pnote
->namesz
? pnote
->namedata
: "(NONE)",
9281 process_corefile_note_segment (file
, offset
, length
)
9286 Elf_External_Note
* pnotes
;
9287 Elf_External_Note
* external
;
9293 pnotes
= (Elf_External_Note
*) get_data (NULL
, file
, offset
, length
,
9300 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9301 (unsigned long) offset
, (unsigned long) length
);
9302 printf (_(" Owner\t\tData size\tDescription\n"));
9304 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
9306 Elf32_Internal_Note inote
;
9309 inote
.type
= BYTE_GET (external
->type
);
9310 inote
.namesz
= BYTE_GET (external
->namesz
);
9311 inote
.namedata
= external
->name
;
9312 inote
.descsz
= BYTE_GET (external
->descsz
);
9313 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
9314 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
9316 external
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
9318 /* Verify that name is null terminated. It appears that at least
9319 one version of Linux (RedHat 6.0) generates corefiles that don't
9320 comply with the ELF spec by failing to include the null byte in
9322 if (inote
.namedata
[inote
.namesz
] != '\0')
9324 temp
= malloc (inote
.namesz
+ 1);
9328 error (_("Out of memory\n"));
9333 strncpy (temp
, inote
.namedata
, inote
.namesz
);
9334 temp
[inote
.namesz
] = 0;
9336 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9337 inote
.namedata
= temp
;
9340 res
&= process_note (& inote
);
9355 process_corefile_note_segments (file
)
9358 Elf_Internal_Phdr
* program_headers
;
9359 Elf_Internal_Phdr
* segment
;
9363 program_headers
= (Elf_Internal_Phdr
*) malloc
9364 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
9366 if (program_headers
== NULL
)
9368 error (_("Out of memory\n"));
9373 i
= get_32bit_program_headers (file
, program_headers
);
9375 i
= get_64bit_program_headers (file
, program_headers
);
9379 free (program_headers
);
9383 for (i
= 0, segment
= program_headers
;
9384 i
< elf_header
.e_phnum
;
9387 if (segment
->p_type
== PT_NOTE
)
9388 res
&= process_corefile_note_segment (file
,
9389 (bfd_vma
) segment
->p_offset
,
9390 (bfd_vma
) segment
->p_filesz
);
9393 free (program_headers
);
9399 process_corefile_contents (file
)
9402 /* If we have not been asked to display the notes then do nothing. */
9406 /* If file is not a core file then exit. */
9407 if (elf_header
.e_type
!= ET_CORE
)
9410 /* No program headers means no NOTE segment. */
9411 if (elf_header
.e_phnum
== 0)
9413 printf (_("No note segments present in the core file.\n"));
9417 return process_corefile_note_segments (file
);
9421 process_arch_specific (file
)
9427 switch (elf_header
.e_machine
)
9430 case EM_MIPS_RS3_LE
:
9431 return process_mips_specific (file
);
9440 get_file_header (file
)
9443 /* Read in the identity array. */
9444 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
9447 /* Determine how to read the rest of the header. */
9448 switch (elf_header
.e_ident
[EI_DATA
])
9450 default: /* fall through */
9451 case ELFDATANONE
: /* fall through */
9452 case ELFDATA2LSB
: byte_get
= byte_get_little_endian
; break;
9453 case ELFDATA2MSB
: byte_get
= byte_get_big_endian
; break;
9456 /* For now we only support 32 bit and 64 bit ELF files. */
9457 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
9459 /* Read in the rest of the header. */
9462 Elf32_External_Ehdr ehdr32
;
9464 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
9467 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
9468 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
9469 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
9470 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
9471 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
9472 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
9473 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
9474 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
9475 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
9476 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
9477 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
9478 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
9479 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
9483 Elf64_External_Ehdr ehdr64
;
9485 /* If we have been compiled with sizeof (bfd_vma) == 4, then
9486 we will not be able to cope with the 64bit data found in
9487 64 ELF files. Detect this now and abort before we start
9488 overwritting things. */
9489 if (sizeof (bfd_vma
) < 8)
9491 error (_("This instance of readelf has been built without support for a\n\
9492 64 bit data type and so it cannot read 64 bit ELF files.\n"));
9496 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
9499 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
9500 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
9501 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
9502 elf_header
.e_entry
= BYTE_GET8 (ehdr64
.e_entry
);
9503 elf_header
.e_phoff
= BYTE_GET8 (ehdr64
.e_phoff
);
9504 elf_header
.e_shoff
= BYTE_GET8 (ehdr64
.e_shoff
);
9505 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
9506 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
9507 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
9508 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
9509 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
9510 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
9511 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
9514 /* There may be some extensions in the first section header. Don't
9515 bomb if we can't read it. */
9517 get_32bit_section_headers (file
, 1);
9519 get_64bit_section_headers (file
, 1);
9525 process_file (file_name
)
9529 struct stat statbuf
;
9532 if (stat (file_name
, & statbuf
) < 0)
9534 error (_("Cannot stat input file %s.\n"), file_name
);
9538 file
= fopen (file_name
, "rb");
9541 error (_("Input file %s not found.\n"), file_name
);
9545 if (! get_file_header (file
))
9547 error (_("%s: Failed to read file header\n"), file_name
);
9552 /* Initialise per file variables. */
9553 for (i
= NUM_ELEM (version_info
); i
--;)
9554 version_info
[i
] = 0;
9556 for (i
= NUM_ELEM (dynamic_info
); i
--;)
9557 dynamic_info
[i
] = 0;
9559 /* Process the file. */
9561 printf (_("\nFile: %s\n"), file_name
);
9563 if (! process_file_header ())
9569 process_section_headers (file
);
9571 process_program_headers (file
);
9573 process_dynamic_segment (file
);
9575 process_relocs (file
);
9577 process_unwind (file
);
9579 process_symbol_table (file
);
9581 process_syminfo (file
);
9583 process_version_sections (file
);
9585 process_section_contents (file
);
9587 process_corefile_contents (file
);
9589 process_arch_specific (file
);
9593 if (section_headers
)
9595 free (section_headers
);
9596 section_headers
= NULL
;
9601 free (string_table
);
9602 string_table
= NULL
;
9603 string_table_length
= 0;
9606 if (dynamic_strings
)
9608 free (dynamic_strings
);
9609 dynamic_strings
= NULL
;
9612 if (dynamic_symbols
)
9614 free (dynamic_symbols
);
9615 dynamic_symbols
= NULL
;
9616 num_dynamic_syms
= 0;
9619 if (dynamic_syminfo
)
9621 free (dynamic_syminfo
);
9622 dynamic_syminfo
= NULL
;
9628 #ifdef SUPPORT_DISASSEMBLY
9629 /* Needed by the i386 disassembler. For extra credit, someone could
9630 fix this so that we insert symbolic addresses here, esp for GOT/PLT
9634 print_address (unsigned int addr
, FILE * outfile
)
9636 fprintf (outfile
,"0x%8.8x", addr
);
9639 /* Needed by the i386 disassembler. */
9641 db_task_printsym (unsigned int addr
)
9643 print_address (addr
, stderr
);
9647 int main
PARAMS ((int, char **));
9656 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9657 setlocale (LC_MESSAGES
, "");
9659 #if defined (HAVE_SETLOCALE)
9660 setlocale (LC_CTYPE
, "");
9662 bindtextdomain (PACKAGE
, LOCALEDIR
);
9663 textdomain (PACKAGE
);
9665 parse_args (argc
, argv
);
9667 if (optind
< (argc
- 1))
9671 while (optind
< argc
)
9672 err
|= process_file (argv
[optind
++]);
9674 if (dump_sects
!= NULL
)