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
))
849 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
852 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
858 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
861 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
864 for (i
= 0; i
< rel_size
; i
++)
869 bfd_vma symtab_index
;
874 offset
= relas
[i
].r_offset
;
875 info
= relas
[i
].r_info
;
879 offset
= rels
[i
].r_offset
;
880 info
= rels
[i
].r_info
;
885 type
= ELF32_R_TYPE (info
);
886 symtab_index
= ELF32_R_SYM (info
);
890 if (elf_header
.e_machine
== EM_SPARCV9
)
891 type
= ELF64_R_TYPE_ID (info
);
893 type
= ELF64_R_TYPE (info
);
894 /* The #ifdef BFD64 below is to prevent a compile time warning.
895 We know that if we do not have a 64 bit data type that we
896 will never execute this code anyway. */
898 symtab_index
= ELF64_R_SYM (info
);
904 #ifdef _bfd_int64_low
905 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
907 printf ("%8.8lx %8.8lx ", offset
, info
);
912 #ifdef _bfd_int64_low
913 printf ("%8.8lx%8.8lx %8.8lx%8.8lx ",
914 _bfd_int64_high (offset
),
915 _bfd_int64_low (offset
),
916 _bfd_int64_high (info
),
917 _bfd_int64_low (info
));
919 printf ("%16.16lx %16.16lx ", offset
, info
);
923 switch (elf_header
.e_machine
)
931 rtype
= elf_m32r_reloc_type (type
);
936 rtype
= elf_i386_reloc_type (type
);
940 rtype
= elf_m68k_reloc_type (type
);
944 rtype
= elf_i960_reloc_type (type
);
949 rtype
= elf_avr_reloc_type (type
);
956 rtype
= elf_sparc_reloc_type (type
);
961 rtype
= v850_reloc_type (type
);
966 rtype
= elf_d10v_reloc_type (type
);
971 rtype
= elf_d30v_reloc_type (type
);
975 rtype
= elf_sh_reloc_type (type
);
979 case EM_CYGNUS_MN10300
:
980 rtype
= elf_mn10300_reloc_type (type
);
984 case EM_CYGNUS_MN10200
:
985 rtype
= elf_mn10200_reloc_type (type
);
990 rtype
= elf_fr30_reloc_type (type
);
994 rtype
= elf_mcore_reloc_type (type
);
998 rtype
= elf_mmix_reloc_type (type
);
1003 rtype
= elf_ppc_reloc_type (type
);
1007 case EM_MIPS_RS3_LE
:
1008 rtype
= elf_mips_reloc_type (type
);
1012 rtype
= elf_alpha_reloc_type (type
);
1016 rtype
= elf_arm_reloc_type (type
);
1020 rtype
= elf_arc_reloc_type (type
);
1024 rtype
= elf_hppa_reloc_type (type
);
1030 rtype
= elf_h8_reloc_type (type
);
1035 rtype
= elf_or32_reloc_type (type
);
1040 rtype
= elf_pj_reloc_type (type
);
1043 rtype
= elf_ia64_reloc_type (type
);
1047 rtype
= elf_cris_reloc_type (type
);
1051 rtype
= elf_i860_reloc_type (type
);
1055 rtype
= elf_x86_64_reloc_type (type
);
1060 rtype
= elf_s390_reloc_type (type
);
1064 rtype
= elf_xstormy16_reloc_type (type
);
1069 #ifdef _bfd_int64_low
1070 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type
));
1072 printf (_("unrecognised: %-7lx"), type
);
1075 printf ("%-21.21s", rtype
);
1079 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1080 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1083 Elf_Internal_Sym
* psym
;
1085 psym
= symtab
+ symtab_index
;
1088 print_vma (psym
->st_value
, LONG_HEX
);
1091 if (psym
->st_name
== 0)
1092 print_symbol (-25, SECTION_NAME (section_headers
+ psym
->st_shndx
));
1093 else if (strtab
== NULL
)
1094 printf (_("<string table index %3ld>"), psym
->st_name
);
1096 print_symbol (-25, strtab
+ psym
->st_name
);
1099 printf (" + %lx", (unsigned long) relas
[i
].r_addend
);
1104 printf ("%*c", is_32bit_elf
? 34 : 26, ' ');
1105 print_vma (relas
[i
].r_addend
, LONG_HEX
);
1108 if (elf_header
.e_machine
== EM_SPARCV9
1109 && !strcmp (rtype
, "R_SPARC_OLO10"))
1110 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1124 get_mips_dynamic_type (type
)
1129 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1130 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1131 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1132 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1133 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1134 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1135 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1136 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1137 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1138 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1139 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1140 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1141 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1142 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1143 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1144 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1145 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1146 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1147 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1148 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1149 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1150 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1151 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1152 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1153 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1154 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1155 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1156 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1157 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1158 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1159 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1160 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1161 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1162 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1163 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1164 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1165 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1166 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1167 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1168 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1169 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1170 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1171 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1178 get_sparc64_dynamic_type (type
)
1183 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1190 get_ppc64_dynamic_type (type
)
1195 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1196 case DT_PPC64_OPD
: return "PPC64_OPD";
1197 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1204 get_parisc_dynamic_type (type
)
1209 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1210 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1211 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1212 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1213 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1214 case DT_HP_PREINIT
: return "HP_PREINIT";
1215 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1216 case DT_HP_NEEDED
: return "HP_NEEDED";
1217 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1218 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1219 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1220 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1221 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1228 get_dynamic_type (type
)
1231 static char buff
[32];
1235 case DT_NULL
: return "NULL";
1236 case DT_NEEDED
: return "NEEDED";
1237 case DT_PLTRELSZ
: return "PLTRELSZ";
1238 case DT_PLTGOT
: return "PLTGOT";
1239 case DT_HASH
: return "HASH";
1240 case DT_STRTAB
: return "STRTAB";
1241 case DT_SYMTAB
: return "SYMTAB";
1242 case DT_RELA
: return "RELA";
1243 case DT_RELASZ
: return "RELASZ";
1244 case DT_RELAENT
: return "RELAENT";
1245 case DT_STRSZ
: return "STRSZ";
1246 case DT_SYMENT
: return "SYMENT";
1247 case DT_INIT
: return "INIT";
1248 case DT_FINI
: return "FINI";
1249 case DT_SONAME
: return "SONAME";
1250 case DT_RPATH
: return "RPATH";
1251 case DT_SYMBOLIC
: return "SYMBOLIC";
1252 case DT_REL
: return "REL";
1253 case DT_RELSZ
: return "RELSZ";
1254 case DT_RELENT
: return "RELENT";
1255 case DT_PLTREL
: return "PLTREL";
1256 case DT_DEBUG
: return "DEBUG";
1257 case DT_TEXTREL
: return "TEXTREL";
1258 case DT_JMPREL
: return "JMPREL";
1259 case DT_BIND_NOW
: return "BIND_NOW";
1260 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1261 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1262 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1263 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1264 case DT_RUNPATH
: return "RUNPATH";
1265 case DT_FLAGS
: return "FLAGS";
1267 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1268 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1270 case DT_CHECKSUM
: return "CHECKSUM";
1271 case DT_PLTPADSZ
: return "PLTPADSZ";
1272 case DT_MOVEENT
: return "MOVEENT";
1273 case DT_MOVESZ
: return "MOVESZ";
1274 case DT_FEATURE
: return "FEATURE";
1275 case DT_POSFLAG_1
: return "POSFLAG_1";
1276 case DT_SYMINSZ
: return "SYMINSZ";
1277 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1279 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1280 case DT_CONFIG
: return "CONFIG";
1281 case DT_DEPAUDIT
: return "DEPAUDIT";
1282 case DT_AUDIT
: return "AUDIT";
1283 case DT_PLTPAD
: return "PLTPAD";
1284 case DT_MOVETAB
: return "MOVETAB";
1285 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1287 case DT_VERSYM
: return "VERSYM";
1289 case DT_RELACOUNT
: return "RELACOUNT";
1290 case DT_RELCOUNT
: return "RELCOUNT";
1291 case DT_FLAGS_1
: return "FLAGS_1";
1292 case DT_VERDEF
: return "VERDEF";
1293 case DT_VERDEFNUM
: return "VERDEFNUM";
1294 case DT_VERNEED
: return "VERNEED";
1295 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1297 case DT_AUXILIARY
: return "AUXILIARY";
1298 case DT_USED
: return "USED";
1299 case DT_FILTER
: return "FILTER";
1302 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1304 const char * result
;
1306 switch (elf_header
.e_machine
)
1309 case EM_MIPS_RS3_LE
:
1310 result
= get_mips_dynamic_type (type
);
1313 result
= get_sparc64_dynamic_type (type
);
1316 result
= get_ppc64_dynamic_type (type
);
1326 sprintf (buff
, _("Processor Specific: %lx"), type
);
1328 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1330 const char * result
;
1332 switch (elf_header
.e_machine
)
1335 result
= get_parisc_dynamic_type (type
);
1345 sprintf (buff
, _("Operating System specific: %lx"), type
);
1348 sprintf (buff
, _("<unknown>: %lx"), type
);
1355 get_file_type (e_type
)
1358 static char buff
[32];
1362 case ET_NONE
: return _("NONE (None)");
1363 case ET_REL
: return _("REL (Relocatable file)");
1364 case ET_EXEC
: return _("EXEC (Executable file)");
1365 case ET_DYN
: return _("DYN (Shared object file)");
1366 case ET_CORE
: return _("CORE (Core file)");
1369 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1370 sprintf (buff
, _("Processor Specific: (%x)"), e_type
);
1371 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1372 sprintf (buff
, _("OS Specific: (%x)"), e_type
);
1374 sprintf (buff
, _("<unknown>: %x"), e_type
);
1380 get_machine_name (e_machine
)
1383 static char buff
[64]; /* XXX */
1387 case EM_NONE
: return _("None");
1388 case EM_M32
: return "WE32100";
1389 case EM_SPARC
: return "Sparc";
1390 case EM_386
: return "Intel 80386";
1391 case EM_68K
: return "MC68000";
1392 case EM_88K
: return "MC88000";
1393 case EM_486
: return "Intel 80486";
1394 case EM_860
: return "Intel 80860";
1395 case EM_MIPS
: return "MIPS R3000";
1396 case EM_S370
: return "IBM System/370";
1397 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1398 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1399 case EM_PARISC
: return "HPPA";
1400 case EM_PPC_OLD
: return "Power PC (old)";
1401 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1402 case EM_960
: return "Intel 90860";
1403 case EM_PPC
: return "PowerPC";
1404 case EM_PPC64
: return "PowerPC64";
1405 case EM_V800
: return "NEC V800";
1406 case EM_FR20
: return "Fujitsu FR20";
1407 case EM_RH32
: return "TRW RH32";
1408 case EM_MCORE
: return "MCORE";
1409 case EM_ARM
: return "ARM";
1410 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1411 case EM_SH
: return "Hitachi SH";
1412 case EM_SPARCV9
: return "Sparc v9";
1413 case EM_TRICORE
: return "Siemens Tricore";
1414 case EM_ARC
: return "ARC";
1415 case EM_H8_300
: return "Hitachi H8/300";
1416 case EM_H8_300H
: return "Hitachi H8/300H";
1417 case EM_H8S
: return "Hitachi H8S";
1418 case EM_H8_500
: return "Hitachi H8/500";
1419 case EM_IA_64
: return "Intel IA-64";
1420 case EM_MIPS_X
: return "Stanford MIPS-X";
1421 case EM_COLDFIRE
: return "Motorola Coldfire";
1422 case EM_68HC12
: return "Motorola M68HC12";
1423 case EM_ALPHA
: return "Alpha";
1424 case EM_CYGNUS_D10V
:
1425 case EM_D10V
: return "d10v";
1426 case EM_CYGNUS_D30V
:
1427 case EM_D30V
: return "d30v";
1428 case EM_CYGNUS_M32R
:
1429 case EM_M32R
: return "Mitsubishi M32r";
1430 case EM_CYGNUS_V850
:
1431 case EM_V850
: return "NEC v850";
1432 case EM_CYGNUS_MN10300
:
1433 case EM_MN10300
: return "mn10300";
1434 case EM_CYGNUS_MN10200
:
1435 case EM_MN10200
: return "mn10200";
1436 case EM_CYGNUS_FR30
:
1437 case EM_FR30
: return "Fujitsu FR30";
1439 case EM_PJ
: return "picoJava";
1440 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1441 case EM_PCP
: return "Siemens PCP";
1442 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1443 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1444 case EM_STARCORE
: return "Motorola Star*Core processor";
1445 case EM_ME16
: return "Toyota ME16 processor";
1446 case EM_ST100
: return "STMicroelectronics ST100 processor";
1447 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1448 case EM_FX66
: return "Siemens FX66 microcontroller";
1449 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1450 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1451 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1452 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1453 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1454 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1455 case EM_SVX
: return "Silicon Graphics SVx";
1456 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1457 case EM_VAX
: return "Digital VAX";
1459 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1460 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1461 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1462 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1463 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1464 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1465 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1466 case EM_PRISM
: return "SiTera Prism";
1467 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1469 case EM_S390
: return "IBM S/390";
1470 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1472 case EM_OR32
: return "OpenRISC";
1474 sprintf (buff
, _("<unknown>: %x"), e_machine
);
1480 decode_ARM_machine_flags (e_flags
, buf
)
1487 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1488 e_flags
&= ~ EF_ARM_EABIMASK
;
1490 /* Handle "generic" ARM flags. */
1491 if (e_flags
& EF_ARM_RELEXEC
)
1493 strcat (buf
, ", relocatable executable");
1494 e_flags
&= ~ EF_ARM_RELEXEC
;
1497 if (e_flags
& EF_ARM_HASENTRY
)
1499 strcat (buf
, ", has entry point");
1500 e_flags
&= ~ EF_ARM_HASENTRY
;
1503 /* Now handle EABI specific flags. */
1507 strcat (buf
, ", <unrecognised EABI>");
1512 case EF_ARM_EABI_VER1
:
1513 strcat (buf
, ", Version1 EABI");
1518 /* Process flags one bit at a time. */
1519 flag
= e_flags
& - e_flags
;
1524 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1525 strcat (buf
, ", sorted symbol tables");
1535 case EF_ARM_EABI_VER2
:
1536 strcat (buf
, ", Version2 EABI");
1541 /* Process flags one bit at a time. */
1542 flag
= e_flags
& - e_flags
;
1547 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1548 strcat (buf
, ", sorted symbol tables");
1551 case EF_ARM_DYNSYMSUSESEGIDX
:
1552 strcat (buf
, ", dynamic symbols use segment index");
1555 case EF_ARM_MAPSYMSFIRST
:
1556 strcat (buf
, ", mapping symbols precede others");
1566 case EF_ARM_EABI_UNKNOWN
:
1567 strcat (buf
, ", GNU EABI");
1572 /* Process flags one bit at a time. */
1573 flag
= e_flags
& - e_flags
;
1578 case EF_ARM_INTERWORK
:
1579 strcat (buf
, ", interworking enabled");
1582 case EF_ARM_APCS_26
:
1583 strcat (buf
, ", uses APCS/26");
1586 case EF_ARM_APCS_FLOAT
:
1587 strcat (buf
, ", uses APCS/float");
1591 strcat (buf
, ", position independent");
1595 strcat (buf
, ", 8 bit structure alignment");
1598 case EF_ARM_NEW_ABI
:
1599 strcat (buf
, ", uses new ABI");
1602 case EF_ARM_OLD_ABI
:
1603 strcat (buf
, ", uses old ABI");
1606 case EF_ARM_SOFT_FLOAT
:
1607 strcat (buf
, ", software FP");
1618 strcat (buf
,", <unknown>");
1622 get_machine_flags (e_flags
, e_machine
)
1626 static char buf
[1024];
1638 decode_ARM_machine_flags (e_flags
, buf
);
1642 if (e_flags
& EF_CPU32
)
1643 strcat (buf
, ", cpu32");
1644 if (e_flags
& EF_M68000
)
1645 strcat (buf
, ", m68000");
1649 if (e_flags
& EF_PPC_EMB
)
1650 strcat (buf
, ", emb");
1652 if (e_flags
& EF_PPC_RELOCATABLE
)
1653 strcat (buf
, ", relocatable");
1655 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
1656 strcat (buf
, ", relocatable-lib");
1660 case EM_CYGNUS_V850
:
1661 switch (e_flags
& EF_V850_ARCH
)
1664 strcat (buf
, ", v850e");
1667 strcat (buf
, ", v850ea");
1670 strcat (buf
, ", v850");
1673 strcat (buf
, ", unknown v850 architecture variant");
1679 case EM_CYGNUS_M32R
:
1680 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
1681 strcat (buf
, ", m32r");
1686 case EM_MIPS_RS3_LE
:
1687 if (e_flags
& EF_MIPS_NOREORDER
)
1688 strcat (buf
, ", noreorder");
1690 if (e_flags
& EF_MIPS_PIC
)
1691 strcat (buf
, ", pic");
1693 if (e_flags
& EF_MIPS_CPIC
)
1694 strcat (buf
, ", cpic");
1696 if (e_flags
& EF_MIPS_UCODE
)
1697 strcat (buf
, ", ugen_reserved");
1699 if (e_flags
& EF_MIPS_ABI2
)
1700 strcat (buf
, ", abi2");
1702 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
1703 strcat (buf
, ", odk first");
1705 if (e_flags
& EF_MIPS_32BITMODE
)
1706 strcat (buf
, ", 32bitmode");
1708 switch ((e_flags
& EF_MIPS_MACH
))
1710 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
1711 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
1712 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
1713 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
1714 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
1715 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
1717 /* We simply ignore the field in this case to avoid confusion:
1718 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
1721 default: strcat (buf
, ", unknown CPU"); break;
1724 switch ((e_flags
& EF_MIPS_ABI
))
1726 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
1727 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
1728 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
1729 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
1731 /* We simply ignore the field in this case to avoid confusion:
1732 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
1733 This means it is likely to be an o32 file, but not for
1736 default: strcat (buf
, ", unknown ABI"); break;
1739 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
1740 strcat (buf
, ", mdmx");
1742 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
1743 strcat (buf
, ", mips16");
1745 switch ((e_flags
& EF_MIPS_ARCH
))
1747 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
1748 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
1749 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
1750 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
1751 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
1752 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
1753 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
1754 default: strcat (buf
, ", unknown ISA"); break;
1760 if (e_flags
& EF_SPARC_32PLUS
)
1761 strcat (buf
, ", v8+");
1763 if (e_flags
& EF_SPARC_SUN_US1
)
1764 strcat (buf
, ", ultrasparcI");
1766 if (e_flags
& EF_SPARC_SUN_US3
)
1767 strcat (buf
, ", ultrasparcIII");
1769 if (e_flags
& EF_SPARC_HAL_R1
)
1770 strcat (buf
, ", halr1");
1772 if (e_flags
& EF_SPARC_LEDATA
)
1773 strcat (buf
, ", ledata");
1775 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
1776 strcat (buf
, ", tso");
1778 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
1779 strcat (buf
, ", pso");
1781 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
1782 strcat (buf
, ", rmo");
1786 switch (e_flags
& EF_PARISC_ARCH
)
1788 case EFA_PARISC_1_0
:
1789 strcpy (buf
, ", PA-RISC 1.0");
1791 case EFA_PARISC_1_1
:
1792 strcpy (buf
, ", PA-RISC 1.1");
1794 case EFA_PARISC_2_0
:
1795 strcpy (buf
, ", PA-RISC 2.0");
1800 if (e_flags
& EF_PARISC_TRAPNIL
)
1801 strcat (buf
, ", trapnil");
1802 if (e_flags
& EF_PARISC_EXT
)
1803 strcat (buf
, ", ext");
1804 if (e_flags
& EF_PARISC_LSB
)
1805 strcat (buf
, ", lsb");
1806 if (e_flags
& EF_PARISC_WIDE
)
1807 strcat (buf
, ", wide");
1808 if (e_flags
& EF_PARISC_NO_KABP
)
1809 strcat (buf
, ", no kabp");
1810 if (e_flags
& EF_PARISC_LAZYSWAP
)
1811 strcat (buf
, ", lazyswap");
1816 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
1817 strcat (buf
, ", new calling convention");
1819 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
1820 strcat (buf
, ", gnu calling convention");
1824 if ((e_flags
& EF_IA_64_ABI64
))
1825 strcat (buf
, ", 64-bit");
1827 strcat (buf
, ", 32-bit");
1828 if ((e_flags
& EF_IA_64_REDUCEDFP
))
1829 strcat (buf
, ", reduced fp model");
1830 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
1831 strcat (buf
, ", no function descriptors, constant gp");
1832 else if ((e_flags
& EF_IA_64_CONS_GP
))
1833 strcat (buf
, ", constant gp");
1834 if ((e_flags
& EF_IA_64_ABSOLUTE
))
1835 strcat (buf
, ", absolute");
1844 get_mips_segment_type (type
)
1849 case PT_MIPS_REGINFO
:
1851 case PT_MIPS_RTPROC
:
1853 case PT_MIPS_OPTIONS
:
1863 get_parisc_segment_type (type
)
1868 case PT_HP_TLS
: return "HP_TLS";
1869 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
1870 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
1871 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
1872 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
1873 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
1874 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
1875 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
1876 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
1877 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
1878 case PT_HP_PARALLEL
: return "HP_PARALLEL";
1879 case PT_HP_FASTBIND
: return "HP_FASTBIND";
1880 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
1881 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
1890 get_ia64_segment_type (type
)
1895 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
1896 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
1897 case PT_HP_TLS
: return "HP_TLS";
1898 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
1899 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
1900 case PT_IA_64_HP_STACK
: return "HP_STACK";
1909 get_segment_type (p_type
)
1910 unsigned long p_type
;
1912 static char buff
[32];
1916 case PT_NULL
: return "NULL";
1917 case PT_LOAD
: return "LOAD";
1918 case PT_DYNAMIC
: return "DYNAMIC";
1919 case PT_INTERP
: return "INTERP";
1920 case PT_NOTE
: return "NOTE";
1921 case PT_SHLIB
: return "SHLIB";
1922 case PT_PHDR
: return "PHDR";
1924 case PT_GNU_EH_FRAME
:
1925 return "GNU_EH_FRAME";
1928 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
1930 const char * result
;
1932 switch (elf_header
.e_machine
)
1935 case EM_MIPS_RS3_LE
:
1936 result
= get_mips_segment_type (p_type
);
1939 result
= get_parisc_segment_type (p_type
);
1942 result
= get_ia64_segment_type (p_type
);
1952 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
1954 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
1956 const char * result
;
1958 switch (elf_header
.e_machine
)
1961 result
= get_parisc_segment_type (p_type
);
1964 result
= get_ia64_segment_type (p_type
);
1974 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
1977 sprintf (buff
, _("<unknown>: %lx"), p_type
);
1984 get_mips_section_type_name (sh_type
)
1985 unsigned int sh_type
;
1989 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1990 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
1991 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1992 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
1993 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
1994 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
1995 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
1996 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
1997 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
1998 case SHT_MIPS_RELD
: return "MIPS_RELD";
1999 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2000 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2001 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2002 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2003 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2004 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2005 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2006 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2007 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2008 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2009 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2010 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2011 case SHT_MIPS_LINE
: return "MIPS_LINE";
2012 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2013 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2014 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2015 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2016 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2017 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2018 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2019 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2020 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2021 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2022 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2023 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2024 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2025 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2026 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2027 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2035 get_parisc_section_type_name (sh_type
)
2036 unsigned int sh_type
;
2040 case SHT_PARISC_EXT
: return "PARISC_EXT";
2041 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2042 case SHT_PARISC_DOC
: return "PARISC_DOC";
2050 get_ia64_section_type_name (sh_type
)
2051 unsigned int sh_type
;
2055 case SHT_IA_64_EXT
: return "IA_64_EXT";
2056 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2064 get_section_type_name (sh_type
)
2065 unsigned int sh_type
;
2067 static char buff
[32];
2071 case SHT_NULL
: return "NULL";
2072 case SHT_PROGBITS
: return "PROGBITS";
2073 case SHT_SYMTAB
: return "SYMTAB";
2074 case SHT_STRTAB
: return "STRTAB";
2075 case SHT_RELA
: return "RELA";
2076 case SHT_HASH
: return "HASH";
2077 case SHT_DYNAMIC
: return "DYNAMIC";
2078 case SHT_NOTE
: return "NOTE";
2079 case SHT_NOBITS
: return "NOBITS";
2080 case SHT_REL
: return "REL";
2081 case SHT_SHLIB
: return "SHLIB";
2082 case SHT_DYNSYM
: return "DYNSYM";
2083 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2084 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2085 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2086 case SHT_GROUP
: return "GROUP";
2087 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2088 case SHT_GNU_verdef
: return "VERDEF";
2089 case SHT_GNU_verneed
: return "VERNEED";
2090 case SHT_GNU_versym
: return "VERSYM";
2091 case 0x6ffffff0: return "VERSYM";
2092 case 0x6ffffffc: return "VERDEF";
2093 case 0x7ffffffd: return "AUXILIARY";
2094 case 0x7fffffff: return "FILTER";
2097 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2099 const char * result
;
2101 switch (elf_header
.e_machine
)
2104 case EM_MIPS_RS3_LE
:
2105 result
= get_mips_section_type_name (sh_type
);
2108 result
= get_parisc_section_type_name (sh_type
);
2111 result
= get_ia64_section_type_name (sh_type
);
2121 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2123 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2124 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2125 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2126 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2128 sprintf (buff
, _("<unknown>: %x"), sh_type
);
2134 struct option options
[] =
2136 {"all", no_argument
, 0, 'a'},
2137 {"file-header", no_argument
, 0, 'h'},
2138 {"program-headers", no_argument
, 0, 'l'},
2139 {"headers", no_argument
, 0, 'e'},
2140 {"histogram", no_argument
, 0, 'I'},
2141 {"segments", no_argument
, 0, 'l'},
2142 {"sections", no_argument
, 0, 'S'},
2143 {"section-headers", no_argument
, 0, 'S'},
2144 {"symbols", no_argument
, 0, 's'},
2145 {"syms", no_argument
, 0, 's'},
2146 {"relocs", no_argument
, 0, 'r'},
2147 {"notes", no_argument
, 0, 'n'},
2148 {"dynamic", no_argument
, 0, 'd'},
2149 {"arch-specific", no_argument
, 0, 'A'},
2150 {"version-info", no_argument
, 0, 'V'},
2151 {"use-dynamic", no_argument
, 0, 'D'},
2152 {"hex-dump", required_argument
, 0, 'x'},
2153 {"debug-dump", optional_argument
, 0, 'w'},
2154 {"unwind", no_argument
, 0, 'u'},
2155 #ifdef SUPPORT_DISASSEMBLY
2156 {"instruction-dump", required_argument
, 0, 'i'},
2159 {"version", no_argument
, 0, 'v'},
2160 {"wide", no_argument
, 0, 'W'},
2161 {"help", no_argument
, 0, 'H'},
2162 {0, no_argument
, 0, 0}
2168 fprintf (stdout
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2169 fprintf (stdout
, _(" Display information about the contents of ELF format files\n"));
2170 fprintf (stdout
, _(" Options are:\n\
2171 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2172 -h --file-header Display the ELF file header\n\
2173 -l --program-headers Display the program headers\n\
2174 --segments An alias for --program-headers\n\
2175 -S --section-headers Display the sections' header\n\
2176 --sections An alias for --section-headers\n\
2177 -e --headers Equivalent to: -h -l -S\n\
2178 -s --syms Display the symbol table\n\
2179 --symbols An alias for --syms\n\
2180 -n --notes Display the core notes (if present)\n\
2181 -r --relocs Display the relocations (if present)\n\
2182 -u --unwind Display the unwind info (if present)\n\
2183 -d --dynamic Display the dynamic segment (if present)\n\
2184 -V --version-info Display the version sections (if present)\n\
2185 -A --arch-specific Display architecture specific information (if any).\n\
2186 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2187 -x --hex-dump=<number> Dump the contents of section <number>\n\
2188 -w --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str]\n\
2189 Display the contents of DWARF2 debug sections\n"));
2190 #ifdef SUPPORT_DISASSEMBLY
2191 fprintf (stdout
, _("\
2192 -i --instruction-dump=<number>\n\
2193 Disassemble the contents of section <number>\n"));
2195 fprintf (stdout
, _("\
2196 -I --histogram Display histogram of bucket list lengths\n\
2197 -W --wide Allow output width to exceed 80 characters\n\
2198 -H --help Display this information\n\
2199 -v --version Display the version number of readelf\n"));
2200 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2206 request_dump (section
, type
)
2207 unsigned int section
;
2210 if (section
>= num_dump_sects
)
2212 char * new_dump_sects
;
2214 new_dump_sects
= (char *) calloc (section
+ 1, 1);
2216 if (new_dump_sects
== NULL
)
2217 error (_("Out of memory allocating dump request table."));
2220 /* Copy current flag settings. */
2221 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2225 dump_sects
= new_dump_sects
;
2226 num_dump_sects
= section
+ 1;
2231 dump_sects
[section
] |= type
;
2237 parse_args (argc
, argv
)
2246 while ((c
= getopt_long
2247 (argc
, argv
, "ersuahnldSDAIw::x:i:vVW", options
, NULL
)) != EOF
)
2283 do_using_dynamic
++;
2314 section
= strtoul (optarg
, & cp
, 0);
2315 if (! * cp
&& section
>= 0)
2317 request_dump (section
, HEX_DUMP
);
2327 unsigned int index
= 0;
2331 while (optarg
[index
])
2332 switch (optarg
[index
++])
2341 do_debug_abbrevs
= 1;
2351 do_debug_pubnames
= 1;
2356 do_debug_aranges
= 1;
2360 do_debug_frames_interp
= 1;
2362 do_debug_frames
= 1;
2367 do_debug_macinfo
= 1;
2376 warn (_("Unrecognised debug option '%s'\n"), optarg
);
2381 #ifdef SUPPORT_DISASSEMBLY
2384 section
= strtoul (optarg
, & cp
, 0);
2385 if (! * cp
&& section
>= 0)
2387 request_dump (section
, DISASS_DUMP
);
2393 print_version (program_name
);
2403 /* xgettext:c-format */
2404 error (_("Invalid option '-%c'\n"), c
);
2411 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
2412 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2413 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
)
2417 warn (_("Nothing to do.\n"));
2423 get_elf_class (elf_class
)
2424 unsigned int elf_class
;
2426 static char buff
[32];
2430 case ELFCLASSNONE
: return _("none");
2431 case ELFCLASS32
: return "ELF32";
2432 case ELFCLASS64
: return "ELF64";
2434 sprintf (buff
, _("<unknown: %x>"), elf_class
);
2440 get_data_encoding (encoding
)
2441 unsigned int encoding
;
2443 static char buff
[32];
2447 case ELFDATANONE
: return _("none");
2448 case ELFDATA2LSB
: return _("2's complement, little endian");
2449 case ELFDATA2MSB
: return _("2's complement, big endian");
2451 sprintf (buff
, _("<unknown: %x>"), encoding
);
2457 get_osabi_name (osabi
)
2460 static char buff
[32];
2464 case ELFOSABI_NONE
: return "UNIX - System V";
2465 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2466 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2467 case ELFOSABI_LINUX
: return "UNIX - Linux";
2468 case ELFOSABI_HURD
: return "GNU/Hurd";
2469 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2470 case ELFOSABI_AIX
: return "UNIX - AIX";
2471 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2472 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2473 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2474 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2475 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2476 case ELFOSABI_STANDALONE
: return _("Standalone App");
2477 case ELFOSABI_ARM
: return "ARM";
2479 sprintf (buff
, _("<unknown: %x>"), osabi
);
2484 /* Decode the data held in 'elf_header'. */
2486 process_file_header ()
2488 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2489 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
2490 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
2491 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
2494 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2502 printf (_("ELF Header:\n"));
2503 printf (_(" Magic: "));
2504 for (i
= 0; i
< EI_NIDENT
; i
++)
2505 printf ("%2.2x ", elf_header
.e_ident
[i
]);
2507 printf (_(" Class: %s\n"),
2508 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
2509 printf (_(" Data: %s\n"),
2510 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
2511 printf (_(" Version: %d %s\n"),
2512 elf_header
.e_ident
[EI_VERSION
],
2513 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
2515 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
2518 printf (_(" OS/ABI: %s\n"),
2519 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
2520 printf (_(" ABI Version: %d\n"),
2521 elf_header
.e_ident
[EI_ABIVERSION
]);
2522 printf (_(" Type: %s\n"),
2523 get_file_type (elf_header
.e_type
));
2524 printf (_(" Machine: %s\n"),
2525 get_machine_name (elf_header
.e_machine
));
2526 printf (_(" Version: 0x%lx\n"),
2527 (unsigned long) elf_header
.e_version
);
2529 printf (_(" Entry point address: "));
2530 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2531 printf (_("\n Start of program headers: "));
2532 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2533 printf (_(" (bytes into file)\n Start of section headers: "));
2534 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
2535 printf (_(" (bytes into file)\n"));
2537 printf (_(" Flags: 0x%lx%s\n"),
2538 (unsigned long) elf_header
.e_flags
,
2539 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
2540 printf (_(" Size of this header: %ld (bytes)\n"),
2541 (long) elf_header
.e_ehsize
);
2542 printf (_(" Size of program headers: %ld (bytes)\n"),
2543 (long) elf_header
.e_phentsize
);
2544 printf (_(" Number of program headers: %ld\n"),
2545 (long) elf_header
.e_phnum
);
2546 printf (_(" Size of section headers: %ld (bytes)\n"),
2547 (long) elf_header
.e_shentsize
);
2548 printf (_(" Number of section headers: %ld"),
2549 (long) elf_header
.e_shnum
);
2550 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
2551 printf (" (%ld)", (long) section_headers
[0].sh_size
);
2552 putc ('\n', stdout
);
2553 printf (_(" Section header string table index: %ld"),
2554 (long) elf_header
.e_shstrndx
);
2555 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
2556 printf (" (%ld)", (long) section_headers
[0].sh_link
);
2557 putc ('\n', stdout
);
2560 if (section_headers
!= NULL
)
2562 if (elf_header
.e_shnum
== 0)
2563 elf_header
.e_shnum
= section_headers
[0].sh_size
;
2564 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
2565 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
2566 free (section_headers
);
2567 section_headers
= NULL
;
2575 get_32bit_program_headers (file
, program_headers
)
2577 Elf_Internal_Phdr
* program_headers
;
2579 Elf32_External_Phdr
* phdrs
;
2580 Elf32_External_Phdr
* external
;
2581 Elf32_Internal_Phdr
* internal
;
2584 phdrs
= ((Elf32_External_Phdr
*)
2585 get_data (NULL
, file
, elf_header
.e_phoff
,
2586 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2587 _("program headers")));
2591 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2592 i
< elf_header
.e_phnum
;
2593 i
++, internal
++, external
++)
2595 internal
->p_type
= BYTE_GET (external
->p_type
);
2596 internal
->p_offset
= BYTE_GET (external
->p_offset
);
2597 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
2598 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
2599 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
2600 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
2601 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2602 internal
->p_align
= BYTE_GET (external
->p_align
);
2611 get_64bit_program_headers (file
, program_headers
)
2613 Elf_Internal_Phdr
* program_headers
;
2615 Elf64_External_Phdr
* phdrs
;
2616 Elf64_External_Phdr
* external
;
2617 Elf64_Internal_Phdr
* internal
;
2620 phdrs
= ((Elf64_External_Phdr
*)
2621 get_data (NULL
, file
, elf_header
.e_phoff
,
2622 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2623 _("program headers")));
2627 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2628 i
< elf_header
.e_phnum
;
2629 i
++, internal
++, external
++)
2631 internal
->p_type
= BYTE_GET (external
->p_type
);
2632 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2633 internal
->p_offset
= BYTE_GET8 (external
->p_offset
);
2634 internal
->p_vaddr
= BYTE_GET8 (external
->p_vaddr
);
2635 internal
->p_paddr
= BYTE_GET8 (external
->p_paddr
);
2636 internal
->p_filesz
= BYTE_GET8 (external
->p_filesz
);
2637 internal
->p_memsz
= BYTE_GET8 (external
->p_memsz
);
2638 internal
->p_align
= BYTE_GET8 (external
->p_align
);
2647 process_program_headers (file
)
2650 Elf_Internal_Phdr
* program_headers
;
2651 Elf_Internal_Phdr
* segment
;
2654 if (elf_header
.e_phnum
== 0)
2657 printf (_("\nThere are no program headers in this file.\n"));
2661 if (do_segments
&& !do_header
)
2663 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
2664 printf (_("Entry point "));
2665 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2666 printf (_("\nThere are %d program headers, starting at offset "),
2667 elf_header
.e_phnum
);
2668 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2672 program_headers
= (Elf_Internal_Phdr
*) malloc
2673 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
2675 if (program_headers
== NULL
)
2677 error (_("Out of memory\n"));
2682 i
= get_32bit_program_headers (file
, program_headers
);
2684 i
= get_64bit_program_headers (file
, program_headers
);
2688 free (program_headers
);
2695 (_("\nProgram Header%s:\n"), elf_header
.e_phnum
> 1 ? "s" : "");
2699 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2702 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2706 (_(" Type Offset VirtAddr PhysAddr\n"));
2708 (_(" FileSiz MemSiz Flags Align\n"));
2716 for (i
= 0, segment
= program_headers
;
2717 i
< elf_header
.e_phnum
;
2722 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
2726 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
2727 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
2728 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
2729 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
2730 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
2732 (segment
->p_flags
& PF_R
? 'R' : ' '),
2733 (segment
->p_flags
& PF_W
? 'W' : ' '),
2734 (segment
->p_flags
& PF_X
? 'E' : ' '));
2735 printf ("%#lx", (unsigned long) segment
->p_align
);
2739 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
2740 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
2743 print_vma (segment
->p_offset
, FULL_HEX
);
2747 print_vma (segment
->p_vaddr
, FULL_HEX
);
2749 print_vma (segment
->p_paddr
, FULL_HEX
);
2752 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
2753 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
2756 print_vma (segment
->p_filesz
, FULL_HEX
);
2760 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
2761 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
2764 print_vma (segment
->p_offset
, FULL_HEX
);
2768 (segment
->p_flags
& PF_R
? 'R' : ' '),
2769 (segment
->p_flags
& PF_W
? 'W' : ' '),
2770 (segment
->p_flags
& PF_X
? 'E' : ' '));
2772 if ((unsigned long) segment
->p_align
== segment
->p_align
)
2773 printf ("%#lx", (unsigned long) segment
->p_align
);
2776 print_vma (segment
->p_align
, PREFIX_HEX
);
2781 print_vma (segment
->p_offset
, FULL_HEX
);
2783 print_vma (segment
->p_vaddr
, FULL_HEX
);
2785 print_vma (segment
->p_paddr
, FULL_HEX
);
2787 print_vma (segment
->p_filesz
, FULL_HEX
);
2789 print_vma (segment
->p_memsz
, FULL_HEX
);
2791 (segment
->p_flags
& PF_R
? 'R' : ' '),
2792 (segment
->p_flags
& PF_W
? 'W' : ' '),
2793 (segment
->p_flags
& PF_X
? 'E' : ' '));
2794 print_vma (segment
->p_align
, HEX
);
2798 switch (segment
->p_type
)
2802 loadaddr
= (segment
->p_vaddr
& 0xfffff000)
2803 - (segment
->p_offset
& 0xfffff000);
2808 error (_("more than one dynamic segment\n"));
2810 dynamic_addr
= segment
->p_offset
;
2811 dynamic_size
= segment
->p_filesz
;
2815 if (fseek (file
, (long) segment
->p_offset
, SEEK_SET
))
2816 error (_("Unable to find program interpreter name\n"));
2819 program_interpreter
[0] = 0;
2820 fscanf (file
, "%63s", program_interpreter
);
2823 printf (_("\n [Requesting program interpreter: %s]"),
2824 program_interpreter
);
2830 putc ('\n', stdout
);
2839 if (do_segments
&& section_headers
!= NULL
)
2841 printf (_("\n Section to Segment mapping:\n"));
2842 printf (_(" Segment Sections...\n"));
2844 assert (string_table
!= NULL
);
2846 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
2849 Elf_Internal_Shdr
* section
;
2851 segment
= program_headers
+ i
;
2852 section
= section_headers
;
2854 printf (" %2.2d ", i
);
2856 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
2858 if (section
->sh_size
> 0
2859 /* Compare allocated sections by VMA, unallocated
2860 sections by file offset. */
2861 && (section
->sh_flags
& SHF_ALLOC
2862 ? (section
->sh_addr
>= segment
->p_vaddr
2863 && section
->sh_addr
+ section
->sh_size
2864 <= segment
->p_vaddr
+ segment
->p_memsz
)
2865 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
2866 && (section
->sh_offset
+ section
->sh_size
2867 <= segment
->p_offset
+ segment
->p_filesz
))))
2868 printf ("%s ", SECTION_NAME (section
));
2875 free (program_headers
);
2882 get_32bit_section_headers (file
, num
)
2886 Elf32_External_Shdr
* shdrs
;
2887 Elf32_Internal_Shdr
* internal
;
2890 shdrs
= ((Elf32_External_Shdr
*)
2891 get_data (NULL
, file
, elf_header
.e_shoff
,
2892 elf_header
.e_shentsize
* num
,
2893 _("section headers")));
2897 section_headers
= ((Elf_Internal_Shdr
*)
2898 malloc (num
* sizeof (Elf_Internal_Shdr
)));
2900 if (section_headers
== NULL
)
2902 error (_("Out of memory\n"));
2906 for (i
= 0, internal
= section_headers
;
2910 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
2911 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
2912 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
2913 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
2914 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
2915 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
2916 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
2917 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
2918 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
2919 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
2928 get_64bit_section_headers (file
, num
)
2932 Elf64_External_Shdr
* shdrs
;
2933 Elf64_Internal_Shdr
* internal
;
2936 shdrs
= ((Elf64_External_Shdr
*)
2937 get_data (NULL
, file
, elf_header
.e_shoff
,
2938 elf_header
.e_shentsize
* num
,
2939 _("section headers")));
2943 section_headers
= ((Elf_Internal_Shdr
*)
2944 malloc (num
* sizeof (Elf_Internal_Shdr
)));
2946 if (section_headers
== NULL
)
2948 error (_("Out of memory\n"));
2952 for (i
= 0, internal
= section_headers
;
2956 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
2957 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
2958 internal
->sh_flags
= BYTE_GET8 (shdrs
[i
].sh_flags
);
2959 internal
->sh_addr
= BYTE_GET8 (shdrs
[i
].sh_addr
);
2960 internal
->sh_size
= BYTE_GET8 (shdrs
[i
].sh_size
);
2961 internal
->sh_entsize
= BYTE_GET8 (shdrs
[i
].sh_entsize
);
2962 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
2963 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
2964 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
2965 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
2973 static Elf_Internal_Sym
*
2974 get_32bit_elf_symbols (file
, section
)
2976 Elf_Internal_Shdr
*section
;
2978 unsigned long number
;
2979 Elf32_External_Sym
* esyms
;
2980 Elf_External_Sym_Shndx
*shndx
;
2981 Elf_Internal_Sym
* isyms
;
2982 Elf_Internal_Sym
* psym
;
2985 esyms
= ((Elf32_External_Sym
*)
2986 get_data (NULL
, file
, section
->sh_offset
,
2987 section
->sh_size
, _("symbols")));
2992 if (symtab_shndx_hdr
!= NULL
2993 && (symtab_shndx_hdr
->sh_link
2994 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
2996 shndx
= ((Elf_External_Sym_Shndx
*)
2997 get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
2998 symtab_shndx_hdr
->sh_size
, _("symtab shndx")));
3006 number
= section
->sh_size
/ section
->sh_entsize
;
3007 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
3011 error (_("Out of memory\n"));
3018 for (j
= 0, psym
= isyms
;
3022 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3023 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3024 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3025 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3026 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3028 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3029 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3030 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3040 static Elf_Internal_Sym
*
3041 get_64bit_elf_symbols (file
, section
)
3043 Elf_Internal_Shdr
*section
;
3045 unsigned long number
;
3046 Elf64_External_Sym
* esyms
;
3047 Elf_External_Sym_Shndx
*shndx
;
3048 Elf_Internal_Sym
* isyms
;
3049 Elf_Internal_Sym
* psym
;
3052 esyms
= ((Elf64_External_Sym
*)
3053 get_data (NULL
, file
, section
->sh_offset
,
3054 section
->sh_size
, _("symbols")));
3059 if (symtab_shndx_hdr
!= NULL
3060 && (symtab_shndx_hdr
->sh_link
3061 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3063 shndx
= ((Elf_External_Sym_Shndx
*)
3064 get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3065 symtab_shndx_hdr
->sh_size
, _("symtab shndx")));
3073 number
= section
->sh_size
/ section
->sh_entsize
;
3074 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
3078 error (_("Out of memory\n"));
3085 for (j
= 0, psym
= isyms
;
3089 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3090 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3091 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3092 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3093 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3095 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3096 psym
->st_value
= BYTE_GET8 (esyms
[j
].st_value
);
3097 psym
->st_size
= BYTE_GET8 (esyms
[j
].st_size
);
3108 get_elf_section_flags (sh_flags
)
3111 static char buff
[32];
3119 flag
= sh_flags
& - sh_flags
;
3124 case SHF_WRITE
: strcat (buff
, "W"); break;
3125 case SHF_ALLOC
: strcat (buff
, "A"); break;
3126 case SHF_EXECINSTR
: strcat (buff
, "X"); break;
3127 case SHF_MERGE
: strcat (buff
, "M"); break;
3128 case SHF_STRINGS
: strcat (buff
, "S"); break;
3129 case SHF_INFO_LINK
: strcat (buff
, "I"); break;
3130 case SHF_LINK_ORDER
: strcat (buff
, "L"); break;
3131 case SHF_OS_NONCONFORMING
: strcat (buff
, "O"); break;
3132 case SHF_GROUP
: strcat (buff
, "G"); break;
3135 if (flag
& SHF_MASKOS
)
3138 sh_flags
&= ~ SHF_MASKOS
;
3140 else if (flag
& SHF_MASKPROC
)
3143 sh_flags
&= ~ SHF_MASKPROC
;
3155 process_section_headers (file
)
3158 Elf_Internal_Shdr
* section
;
3161 section_headers
= NULL
;
3163 if (elf_header
.e_shnum
== 0)
3166 printf (_("\nThere are no sections in this file.\n"));
3171 if (do_sections
&& !do_header
)
3172 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3173 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3177 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3180 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3183 /* Read in the string table, so that we have names to display. */
3184 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3186 if (section
->sh_size
!= 0)
3188 string_table
= (char *) get_data (NULL
, file
, section
->sh_offset
,
3189 section
->sh_size
, _("string table"));
3191 string_table_length
= section
->sh_size
;
3194 /* Scan the sections for the dynamic symbol table
3195 and dynamic string table and debug sections. */
3196 dynamic_symbols
= NULL
;
3197 dynamic_strings
= NULL
;
3198 dynamic_syminfo
= NULL
;
3200 for (i
= 0, section
= section_headers
;
3201 i
< elf_header
.e_shnum
;
3204 char * name
= SECTION_NAME (section
);
3206 if (section
->sh_type
== SHT_DYNSYM
)
3208 if (dynamic_symbols
!= NULL
)
3210 error (_("File contains multiple dynamic symbol tables\n"));
3214 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3215 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3217 else if (section
->sh_type
== SHT_STRTAB
3218 && strcmp (name
, ".dynstr") == 0)
3220 if (dynamic_strings
!= NULL
)
3222 error (_("File contains multiple dynamic string tables\n"));
3226 dynamic_strings
= (char *) get_data (NULL
, file
, section
->sh_offset
,
3228 _("dynamic strings"));
3230 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
3232 if (symtab_shndx_hdr
!= NULL
)
3234 error (_("File contains multiple symtab shndx tables\n"));
3237 symtab_shndx_hdr
= section
;
3239 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
3240 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
3241 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
)
3242 && strncmp (name
, ".debug_", 7) == 0)
3247 || (do_debug_info
&& (strcmp (name
, "info") == 0))
3248 || (do_debug_abbrevs
&& (strcmp (name
, "abbrev") == 0))
3249 || (do_debug_lines
&& (strcmp (name
, "line") == 0))
3250 || (do_debug_pubnames
&& (strcmp (name
, "pubnames") == 0))
3251 || (do_debug_aranges
&& (strcmp (name
, "aranges") == 0))
3252 || (do_debug_frames
&& (strcmp (name
, "frame") == 0))
3253 || (do_debug_macinfo
&& (strcmp (name
, "macinfo") == 0))
3254 || (do_debug_str
&& (strcmp (name
, "str") == 0))
3256 request_dump (i
, DEBUG_DUMP
);
3258 /* linkonce section to be combined with .debug_info at link time. */
3259 else if ((do_debugging
|| do_debug_info
)
3260 && strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
3261 request_dump (i
, DEBUG_DUMP
);
3262 else if (do_debug_frames
&& strcmp (name
, ".eh_frame") == 0)
3263 request_dump (i
, DEBUG_DUMP
);
3269 printf (_("\nSection Header%s:\n"), elf_header
.e_shnum
> 1 ? "s" : "");
3273 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3276 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3279 printf (_(" [Nr] Name Type Address Offset\n"));
3280 printf (_(" Size EntSize Flags Link Info Align\n"));
3283 for (i
= 0, section
= section_headers
;
3284 i
< elf_header
.e_shnum
;
3287 printf (" [%2u] %-17.17s %-15.15s ",
3288 SECTION_HEADER_NUM (i
),
3289 SECTION_NAME (section
),
3290 get_section_type_name (section
->sh_type
));
3294 print_vma (section
->sh_addr
, LONG_HEX
);
3296 printf ( " %6.6lx %6.6lx %2.2lx",
3297 (unsigned long) section
->sh_offset
,
3298 (unsigned long) section
->sh_size
,
3299 (unsigned long) section
->sh_entsize
);
3301 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3303 printf ("%2ld %3lx %2ld\n",
3304 (unsigned long) section
->sh_link
,
3305 (unsigned long) section
->sh_info
,
3306 (unsigned long) section
->sh_addralign
);
3310 print_vma (section
->sh_addr
, LONG_HEX
);
3312 if ((long) section
->sh_offset
== section
->sh_offset
)
3313 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
3317 print_vma (section
->sh_offset
, LONG_HEX
);
3320 if ((unsigned long) section
->sh_size
== section
->sh_size
)
3321 printf (" %6.6lx", (unsigned long) section
->sh_size
);
3325 print_vma (section
->sh_size
, LONG_HEX
);
3328 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
3329 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
3333 print_vma (section
->sh_entsize
, LONG_HEX
);
3336 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3338 printf ("%2ld %3lx ",
3339 (unsigned long) section
->sh_link
,
3340 (unsigned long) section
->sh_info
);
3342 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
3343 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
3346 print_vma (section
->sh_addralign
, DEC
);
3353 print_vma (section
->sh_addr
, LONG_HEX
);
3354 if ((long) section
->sh_offset
== section
->sh_offset
)
3355 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
3359 print_vma (section
->sh_offset
, LONG_HEX
);
3362 print_vma (section
->sh_size
, LONG_HEX
);
3364 print_vma (section
->sh_entsize
, LONG_HEX
);
3366 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3368 printf (" %2ld %3lx %ld\n",
3369 (unsigned long) section
->sh_link
,
3370 (unsigned long) section
->sh_info
,
3371 (unsigned long) section
->sh_addralign
);
3375 printf (_("Key to Flags:\n\
3376 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3377 I (info), L (link order), G (group), x (unknown)\n\
3378 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3383 /* Process the reloc section. */
3385 process_relocs (file
)
3388 unsigned long rel_size
;
3389 unsigned long rel_offset
;
3395 if (do_using_dynamic
)
3397 int is_rela
= FALSE
;
3402 if (dynamic_info
[DT_REL
])
3404 rel_offset
= dynamic_info
[DT_REL
];
3405 rel_size
= dynamic_info
[DT_RELSZ
];
3408 else if (dynamic_info
[DT_RELA
])
3410 rel_offset
= dynamic_info
[DT_RELA
];
3411 rel_size
= dynamic_info
[DT_RELASZ
];
3414 else if (dynamic_info
[DT_JMPREL
])
3416 rel_offset
= dynamic_info
[DT_JMPREL
];
3417 rel_size
= dynamic_info
[DT_PLTRELSZ
];
3419 switch (dynamic_info
[DT_PLTREL
])
3436 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3437 rel_offset
, rel_size
);
3439 dump_relocations (file
, rel_offset
- loadaddr
, rel_size
,
3440 dynamic_symbols
, num_dynamic_syms
, dynamic_strings
, is_rela
);
3443 printf (_("\nThere are no dynamic relocations in this file.\n"));
3447 Elf32_Internal_Shdr
* section
;
3451 for (i
= 0, section
= section_headers
;
3452 i
< elf_header
.e_shnum
;
3455 if ( section
->sh_type
!= SHT_RELA
3456 && section
->sh_type
!= SHT_REL
)
3459 rel_offset
= section
->sh_offset
;
3460 rel_size
= section
->sh_size
;
3464 Elf32_Internal_Shdr
* strsec
;
3465 Elf_Internal_Sym
* symtab
;
3468 unsigned long nsyms
;
3470 printf (_("\nRelocation section "));
3472 if (string_table
== NULL
)
3473 printf ("%d", section
->sh_name
);
3475 printf ("'%s'", SECTION_NAME (section
));
3477 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3478 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
3483 if (section
->sh_link
)
3485 Elf32_Internal_Shdr
* symsec
;
3487 symsec
= SECTION_HEADER (section
->sh_link
);
3488 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
3489 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
3494 strsec
= SECTION_HEADER (symsec
->sh_link
);
3496 strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
3500 is_rela
= section
->sh_type
== SHT_RELA
;
3502 dump_relocations (file
, rel_offset
, rel_size
,
3503 symtab
, nsyms
, strtab
, is_rela
);
3515 printf (_("\nThere are no relocations in this file.\n"));
3521 #include "unwind-ia64.h"
3523 /* An absolute address consists of a section and an offset. If the
3524 section is NULL, the offset itself is the address, otherwise, the
3525 address equals to LOAD_ADDRESS(section) + offset. */
3529 unsigned short section
;
3535 struct unw_table_entry
3537 struct absaddr start
;
3539 struct absaddr info
;
3541 *table
; /* Unwind table. */
3542 unsigned long table_len
; /* Length of unwind table. */
3543 unsigned char * info
; /* Unwind info. */
3544 unsigned long info_size
; /* Size of unwind info. */
3545 bfd_vma info_addr
; /* starting address of unwind info. */
3546 bfd_vma seg_base
; /* Starting address of segment. */
3547 Elf_Internal_Sym
* symtab
; /* The symbol table. */
3548 unsigned long nsyms
; /* Number of symbols. */
3549 char * strtab
; /* The string table. */
3550 unsigned long strtab_size
; /* Size of string table. */
3553 static void find_symbol_for_address
PARAMS ((struct unw_aux_info
*,
3554 struct absaddr
, const char **,
3556 static void dump_ia64_unwind
PARAMS ((struct unw_aux_info
*));
3557 static int slurp_ia64_unwind_table
PARAMS ((FILE *, struct unw_aux_info
*,
3558 Elf32_Internal_Shdr
*));
3561 find_symbol_for_address (aux
, addr
, symname
, offset
)
3562 struct unw_aux_info
*aux
;
3563 struct absaddr addr
;
3564 const char **symname
;
3567 bfd_vma dist
= (bfd_vma
) 0x100000;
3568 Elf_Internal_Sym
*sym
, *best
= NULL
;
3571 for (i
= 0, sym
= aux
->symtab
; i
< aux
->nsyms
; ++i
, ++sym
)
3573 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
3574 && sym
->st_name
!= 0
3575 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
3576 && addr
.offset
>= sym
->st_value
3577 && addr
.offset
- sym
->st_value
< dist
)
3580 dist
= addr
.offset
- sym
->st_value
;
3587 *symname
= (best
->st_name
>= aux
->strtab_size
3588 ? "<corrupt>" : aux
->strtab
+ best
->st_name
);
3593 *offset
= addr
.offset
;
3597 dump_ia64_unwind (aux
)
3598 struct unw_aux_info
*aux
;
3601 struct unw_table_entry
* tp
;
3604 addr_size
= is_32bit_elf
? 4 : 8;
3606 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
3610 const unsigned char * dp
;
3611 const unsigned char * head
;
3612 const char * procname
;
3614 find_symbol_for_address (aux
, tp
->start
, &procname
, &offset
);
3616 fputs ("\n<", stdout
);
3620 fputs (procname
, stdout
);
3623 printf ("+%lx", (unsigned long) offset
);
3626 fputs (">: [", stdout
);
3627 print_vma (tp
->start
.offset
, PREFIX_HEX
);
3628 fputc ('-', stdout
);
3629 print_vma (tp
->end
.offset
, PREFIX_HEX
);
3630 printf ("), info at +0x%lx\n",
3631 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
3633 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
3634 stamp
= BYTE_GET8 ((unsigned char *) head
);
3636 printf (" v%u, flags=0x%lx (%s%s ), len=%lu bytes\n",
3637 (unsigned) UNW_VER (stamp
),
3638 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
3639 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
3640 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
3641 (unsigned long) (addr_size
* UNW_LENGTH (stamp
)));
3643 if (UNW_VER (stamp
) != 1)
3645 printf ("\tUnknown version.\n");
3650 for (dp
= head
+ 8; dp
< head
+ 8 + addr_size
* UNW_LENGTH (stamp
);)
3651 dp
= unw_decode (dp
, in_body
, & in_body
);
3656 slurp_ia64_unwind_table (file
, aux
, sec
)
3658 struct unw_aux_info
*aux
;
3659 Elf32_Internal_Shdr
*sec
;
3661 unsigned long size
, addr_size
, nrelas
, i
;
3662 Elf_Internal_Phdr
*prog_hdrs
, *seg
;
3663 struct unw_table_entry
*tep
;
3664 Elf32_Internal_Shdr
*relsec
;
3665 Elf_Internal_Rela
*rela
, *rp
;
3666 unsigned char *table
, *tp
;
3667 Elf_Internal_Sym
*sym
;
3668 const char *relname
;
3671 addr_size
= is_32bit_elf
? 4 : 8;
3673 /* First, find the starting address of the segment that includes
3676 if (elf_header
.e_phnum
)
3678 prog_hdrs
= (Elf_Internal_Phdr
*)
3679 xmalloc (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
3682 result
= get_32bit_program_headers (file
, prog_hdrs
);
3684 result
= get_64bit_program_headers (file
, prog_hdrs
);
3692 for (seg
= prog_hdrs
; seg
< prog_hdrs
+ elf_header
.e_phnum
; ++seg
)
3694 if (seg
->p_type
!= PT_LOAD
)
3697 if (sec
->sh_addr
>= seg
->p_vaddr
3698 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
3700 aux
->seg_base
= seg
->p_vaddr
;
3708 /* Second, build the unwind table from the contents of the unwind section: */
3709 size
= sec
->sh_size
;
3710 table
= (char *) get_data (NULL
, file
, sec
->sh_offset
,
3711 size
, _("unwind table"));
3715 tep
= aux
->table
= xmalloc (size
/ (3 * addr_size
) * sizeof (aux
->table
[0]));
3716 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * addr_size
, ++ tep
)
3718 tep
->start
.section
= SHN_UNDEF
;
3719 tep
->end
.section
= SHN_UNDEF
;
3720 tep
->info
.section
= SHN_UNDEF
;
3723 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
3724 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
3725 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
3729 tep
->start
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 0);
3730 tep
->end
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 8);
3731 tep
->info
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 16);
3733 tep
->start
.offset
+= aux
->seg_base
;
3734 tep
->end
.offset
+= aux
->seg_base
;
3735 tep
->info
.offset
+= aux
->seg_base
;
3739 /* Third, apply any relocations to the unwind table: */
3741 for (relsec
= section_headers
;
3742 relsec
< section_headers
+ elf_header
.e_shnum
;
3745 if (relsec
->sh_type
!= SHT_RELA
3746 || SECTION_HEADER (relsec
->sh_info
) != sec
)
3749 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
3753 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
3757 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
3758 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
3760 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
3762 warn (_("Skipping unexpected symbol type %u\n"),
3763 ELF32_ST_TYPE (sym
->st_info
));
3769 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
3770 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
3772 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
3774 warn (_("Skipping unexpected symbol type %u\n"),
3775 ELF64_ST_TYPE (sym
->st_info
));
3780 if (strncmp (relname
, "R_IA64_SEGREL", 13) != 0)
3782 warn (_("Skipping unexpected relocation type %s\n"), relname
);
3786 i
= rp
->r_offset
/ (3 * addr_size
);
3788 switch (rp
->r_offset
/addr_size
% 3)
3791 aux
->table
[i
].start
.section
= sym
->st_shndx
;
3792 aux
->table
[i
].start
.offset
+= rp
->r_addend
;
3795 aux
->table
[i
].end
.section
= sym
->st_shndx
;
3796 aux
->table
[i
].end
.offset
+= rp
->r_addend
;
3799 aux
->table
[i
].info
.section
= sym
->st_shndx
;
3800 aux
->table
[i
].info
.offset
+= rp
->r_addend
;
3810 aux
->table_len
= size
/ (3 * addr_size
);
3815 process_unwind (file
)
3818 Elf32_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
3819 unsigned long i
, addr_size
, unwcount
= 0, unwstart
= 0;
3820 struct unw_aux_info aux
;
3825 if (elf_header
.e_machine
!= EM_IA_64
)
3827 printf (_("\nThere are no unwind sections in this file.\n"));
3831 memset (& aux
, 0, sizeof (aux
));
3833 addr_size
= is_32bit_elf
? 4 : 8;
3835 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
3837 if (sec
->sh_type
== SHT_SYMTAB
)
3839 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
3840 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
3842 strsec
= SECTION_HEADER (sec
->sh_link
);
3843 aux
.strtab_size
= strsec
->sh_size
;
3844 aux
.strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
3845 aux
.strtab_size
, _("string table"));
3847 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
3852 printf (_("\nThere are no unwind sections in this file.\n"));
3854 while (unwcount
-- > 0)
3859 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
3860 i
< elf_header
.e_shnum
; ++i
, ++sec
)
3861 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
3868 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
3870 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
,
3873 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
3874 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
3875 suffix
= SECTION_NAME (unwsec
) + len
;
3876 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
3878 if (strncmp (SECTION_NAME (sec
),
3879 ELF_STRING_ia64_unwind_info_once
, len2
) == 0
3880 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
3885 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
3886 .IA_64.unwind or BAR -> .IA_64.unwind_info */
3887 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
3888 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
3890 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
,
3892 suffix
= SECTION_NAME (unwsec
) + len
;
3893 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
3895 if (strncmp (SECTION_NAME (sec
),
3896 ELF_STRING_ia64_unwind_info
, len2
) == 0
3897 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
3901 if (i
== elf_header
.e_shnum
)
3903 printf (_("\nCould not find unwind info section for "));
3905 if (string_table
== NULL
)
3906 printf ("%d", unwsec
->sh_name
);
3908 printf ("'%s'", SECTION_NAME (unwsec
));
3912 aux
.info_size
= sec
->sh_size
;
3913 aux
.info_addr
= sec
->sh_addr
;
3914 aux
.info
= (char *) get_data (NULL
, file
, sec
->sh_offset
,
3915 aux
.info_size
, _("unwind info"));
3917 printf (_("\nUnwind section "));
3919 if (string_table
== NULL
)
3920 printf ("%d", unwsec
->sh_name
);
3922 printf ("'%s'", SECTION_NAME (unwsec
));
3924 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3925 (unsigned long) unwsec
->sh_offset
,
3926 (unsigned long) (unwsec
->sh_size
/ (3 * addr_size
)));
3928 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
3930 if (aux
.table_len
> 0)
3931 dump_ia64_unwind (& aux
);
3934 free ((char *) aux
.table
);
3936 free ((char *) aux
.info
);
3945 free ((char *) aux
.strtab
);
3951 dynamic_segment_mips_val (entry
)
3952 Elf_Internal_Dyn
* entry
;
3954 switch (entry
->d_tag
)
3957 if (entry
->d_un
.d_val
== 0)
3961 static const char * opts
[] =
3963 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
3964 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
3965 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
3966 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
3971 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++ cnt
)
3972 if (entry
->d_un
.d_val
& (1 << cnt
))
3974 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
3981 case DT_MIPS_IVERSION
:
3982 if (dynamic_strings
!= NULL
)
3983 printf ("Interface Version: %s\n",
3984 dynamic_strings
+ entry
->d_un
.d_val
);
3986 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
3989 case DT_MIPS_TIME_STAMP
:
3994 time_t time
= entry
->d_un
.d_val
;
3995 tmp
= gmtime (&time
);
3996 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
3997 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
3998 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
3999 printf ("Time Stamp: %s\n", timebuf
);
4003 case DT_MIPS_RLD_VERSION
:
4004 case DT_MIPS_LOCAL_GOTNO
:
4005 case DT_MIPS_CONFLICTNO
:
4006 case DT_MIPS_LIBLISTNO
:
4007 case DT_MIPS_SYMTABNO
:
4008 case DT_MIPS_UNREFEXTNO
:
4009 case DT_MIPS_HIPAGENO
:
4010 case DT_MIPS_DELTA_CLASS_NO
:
4011 case DT_MIPS_DELTA_INSTANCE_NO
:
4012 case DT_MIPS_DELTA_RELOC_NO
:
4013 case DT_MIPS_DELTA_SYM_NO
:
4014 case DT_MIPS_DELTA_CLASSSYM_NO
:
4015 case DT_MIPS_COMPACT_SIZE
:
4016 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4020 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
4026 dynamic_segment_parisc_val (entry
)
4027 Elf_Internal_Dyn
* entry
;
4029 switch (entry
->d_tag
)
4031 case DT_HP_DLD_FLAGS
:
4040 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
4041 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
4042 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
4043 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
4044 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
4045 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
4046 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
4047 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
4048 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
4049 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
4050 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
4054 bfd_vma val
= entry
->d_un
.d_val
;
4056 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
4057 if (val
& flags
[cnt
].bit
)
4061 fputs (flags
[cnt
].str
, stdout
);
4063 val
^= flags
[cnt
].bit
;
4066 if (val
!= 0 || first
)
4070 print_vma (val
, HEX
);
4076 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4082 get_32bit_dynamic_segment (file
)
4085 Elf32_External_Dyn
* edyn
;
4086 Elf_Internal_Dyn
* entry
;
4089 edyn
= (Elf32_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
,
4090 dynamic_size
, _("dynamic segment"));
4094 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4095 how large this .dynamic is now. We can do this even before the byte
4096 swapping since the DT_NULL tag is recognizable. */
4098 while (*(Elf32_Word
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
4101 dynamic_segment
= (Elf_Internal_Dyn
*)
4102 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
4104 if (dynamic_segment
== NULL
)
4106 error (_("Out of memory\n"));
4111 for (i
= 0, entry
= dynamic_segment
;
4115 entry
->d_tag
= BYTE_GET (edyn
[i
].d_tag
);
4116 entry
->d_un
.d_val
= BYTE_GET (edyn
[i
].d_un
.d_val
);
4125 get_64bit_dynamic_segment (file
)
4128 Elf64_External_Dyn
* edyn
;
4129 Elf_Internal_Dyn
* entry
;
4132 edyn
= (Elf64_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
,
4133 dynamic_size
, _("dynamic segment"));
4137 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4138 how large this .dynamic is now. We can do this even before the byte
4139 swapping since the DT_NULL tag is recognizable. */
4141 while (*(bfd_vma
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
4144 dynamic_segment
= (Elf_Internal_Dyn
*)
4145 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
4147 if (dynamic_segment
== NULL
)
4149 error (_("Out of memory\n"));
4154 for (i
= 0, entry
= dynamic_segment
;
4158 entry
->d_tag
= BYTE_GET8 (edyn
[i
].d_tag
);
4159 entry
->d_un
.d_val
= BYTE_GET8 (edyn
[i
].d_un
.d_val
);
4168 get_dynamic_flags (flags
)
4171 static char buff
[64];
4176 flag
= flags
& - flags
;
4181 case DF_ORIGIN
: strcat (buff
, "ORIGIN "); break;
4182 case DF_SYMBOLIC
: strcat (buff
, "SYMBOLIC "); break;
4183 case DF_TEXTREL
: strcat (buff
, "TEXTREL "); break;
4184 case DF_BIND_NOW
: strcat (buff
, "BIND_NOW "); break;
4185 default: strcat (buff
, "unknown "); break;
4191 /* Parse and display the contents of the dynamic segment. */
4193 process_dynamic_segment (file
)
4196 Elf_Internal_Dyn
* entry
;
4199 if (dynamic_size
== 0)
4202 printf (_("\nThere is no dynamic segment in this file.\n"));
4209 if (! get_32bit_dynamic_segment (file
))
4212 else if (! get_64bit_dynamic_segment (file
))
4215 /* Find the appropriate symbol table. */
4216 if (dynamic_symbols
== NULL
)
4218 for (i
= 0, entry
= dynamic_segment
;
4222 Elf32_Internal_Shdr section
;
4224 if (entry
->d_tag
!= DT_SYMTAB
)
4227 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
4229 /* Since we do not know how big the symbol table is,
4230 we default to reading in the entire file (!) and
4231 processing that. This is overkill, I know, but it
4233 section
.sh_offset
= entry
->d_un
.d_val
- loadaddr
;
4235 if (fseek (file
, 0, SEEK_END
))
4236 error (_("Unable to seek to end of file!"));
4238 section
.sh_size
= ftell (file
) - section
.sh_offset
;
4240 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
4242 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
4244 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
4245 if (num_dynamic_syms
< 1)
4247 error (_("Unable to determine the number of symbols to load\n"));
4251 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
4255 /* Similarly find a string table. */
4256 if (dynamic_strings
== NULL
)
4258 for (i
= 0, entry
= dynamic_segment
;
4262 unsigned long offset
;
4265 if (entry
->d_tag
!= DT_STRTAB
)
4268 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
4270 /* Since we do not know how big the string table is,
4271 we default to reading in the entire file (!) and
4272 processing that. This is overkill, I know, but it
4275 offset
= entry
->d_un
.d_val
- loadaddr
;
4276 if (fseek (file
, 0, SEEK_END
))
4277 error (_("Unable to seek to end of file\n"));
4278 str_tab_len
= ftell (file
) - offset
;
4280 if (str_tab_len
< 1)
4283 (_("Unable to determine the length of the dynamic string table\n"));
4287 dynamic_strings
= (char *) get_data (NULL
, file
, offset
, str_tab_len
,
4288 _("dynamic string table"));
4293 /* And find the syminfo section if available. */
4294 if (dynamic_syminfo
== NULL
)
4296 unsigned int syminsz
= 0;
4298 for (i
= 0, entry
= dynamic_segment
;
4302 if (entry
->d_tag
== DT_SYMINENT
)
4304 /* Note: these braces are necessary to avoid a syntax
4305 error from the SunOS4 C compiler. */
4306 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
4308 else if (entry
->d_tag
== DT_SYMINSZ
)
4309 syminsz
= entry
->d_un
.d_val
;
4310 else if (entry
->d_tag
== DT_SYMINFO
)
4311 dynamic_syminfo_offset
= entry
->d_un
.d_val
- loadaddr
;
4314 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
4316 Elf_External_Syminfo
* extsyminfo
;
4317 Elf_Internal_Syminfo
* syminfo
;
4319 /* There is a syminfo section. Read the data. */
4320 extsyminfo
= ((Elf_External_Syminfo
*)
4321 get_data (NULL
, file
, dynamic_syminfo_offset
,
4322 syminsz
, _("symbol information")));
4326 dynamic_syminfo
= (Elf_Internal_Syminfo
*) malloc (syminsz
);
4327 if (dynamic_syminfo
== NULL
)
4329 error (_("Out of memory\n"));
4333 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
4334 for (i
= 0, syminfo
= dynamic_syminfo
; i
< dynamic_syminfo_nent
;
4337 syminfo
->si_boundto
= BYTE_GET (extsyminfo
[i
].si_boundto
);
4338 syminfo
->si_flags
= BYTE_GET (extsyminfo
[i
].si_flags
);
4345 if (do_dynamic
&& dynamic_addr
)
4346 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
4347 dynamic_addr
, (long) dynamic_size
);
4349 printf (_(" Tag Type Name/Value\n"));
4351 for (i
= 0, entry
= dynamic_segment
;
4360 print_vma (entry
->d_tag
, FULL_HEX
);
4361 dtype
= get_dynamic_type (entry
->d_tag
);
4362 printf (" (%s)%*s", dtype
,
4363 ((is_32bit_elf
? 27 : 19)
4364 - (int) strlen (dtype
)),
4368 switch (entry
->d_tag
)
4372 printf ("%s", get_dynamic_flags (entry
->d_un
.d_val
));
4382 switch (entry
->d_tag
)
4385 printf (_("Auxiliary library"));
4389 printf (_("Filter library"));
4393 printf (_("Configuration file"));
4397 printf (_("Dependency audit library"));
4401 printf (_("Audit library"));
4405 if (dynamic_strings
)
4406 printf (": [%s]\n", dynamic_strings
+ entry
->d_un
.d_val
);
4410 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4419 printf (_("Flags:"));
4420 if (entry
->d_un
.d_val
== 0)
4421 printf (_(" None\n"));
4424 unsigned long int val
= entry
->d_un
.d_val
;
4425 if (val
& DTF_1_PARINIT
)
4427 printf (" PARINIT");
4428 val
^= DTF_1_PARINIT
;
4430 if (val
& DTF_1_CONFEXP
)
4432 printf (" CONFEXP");
4433 val
^= DTF_1_CONFEXP
;
4436 printf (" %lx", val
);
4445 printf (_("Flags:"));
4446 if (entry
->d_un
.d_val
== 0)
4447 printf (_(" None\n"));
4450 unsigned long int val
= entry
->d_un
.d_val
;
4451 if (val
& DF_P1_LAZYLOAD
)
4453 printf (" LAZYLOAD");
4454 val
^= DF_P1_LAZYLOAD
;
4456 if (val
& DF_P1_GROUPPERM
)
4458 printf (" GROUPPERM");
4459 val
^= DF_P1_GROUPPERM
;
4462 printf (" %lx", val
);
4471 printf (_("Flags:"));
4472 if (entry
->d_un
.d_val
== 0)
4473 printf (_(" None\n"));
4476 unsigned long int val
= entry
->d_un
.d_val
;
4482 if (val
& DF_1_GLOBAL
)
4487 if (val
& DF_1_GROUP
)
4492 if (val
& DF_1_NODELETE
)
4494 printf (" NODELETE");
4495 val
^= DF_1_NODELETE
;
4497 if (val
& DF_1_LOADFLTR
)
4499 printf (" LOADFLTR");
4500 val
^= DF_1_LOADFLTR
;
4502 if (val
& DF_1_INITFIRST
)
4504 printf (" INITFIRST");
4505 val
^= DF_1_INITFIRST
;
4507 if (val
& DF_1_NOOPEN
)
4512 if (val
& DF_1_ORIGIN
)
4517 if (val
& DF_1_DIRECT
)
4522 if (val
& DF_1_TRANS
)
4527 if (val
& DF_1_INTERPOSE
)
4529 printf (" INTERPOSE");
4530 val
^= DF_1_INTERPOSE
;
4532 if (val
& DF_1_NODEFLIB
)
4534 printf (" NODEFLIB");
4535 val
^= DF_1_NODEFLIB
;
4537 if (val
& DF_1_NODUMP
)
4542 if (val
& DF_1_CONLFAT
)
4544 printf (" CONLFAT");
4545 val
^= DF_1_CONLFAT
;
4548 printf (" %lx", val
);
4556 puts (get_dynamic_type (entry
->d_un
.d_val
));
4576 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
4582 if (dynamic_strings
== NULL
)
4585 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4589 switch (entry
->d_tag
)
4592 printf (_("Shared library: [%s]"), name
);
4594 if (strcmp (name
, program_interpreter
) == 0)
4595 printf (_(" program interpreter"));
4599 printf (_("Library soname: [%s]"), name
);
4603 printf (_("Library rpath: [%s]"), name
);
4607 printf (_("Library runpath: [%s]"), name
);
4611 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4616 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4632 case DT_INIT_ARRAYSZ
:
4633 case DT_FINI_ARRAYSZ
:
4636 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
4637 printf (" (bytes)\n");
4647 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
4660 if (dynamic_strings
!= NULL
&& entry
->d_tag
== DT_USED
)
4664 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4668 printf (_("Not needed object: [%s]\n"), name
);
4673 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4679 /* The value of this entry is ignored. */
4683 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
4684 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
4689 switch (elf_header
.e_machine
)
4692 case EM_MIPS_RS3_LE
:
4693 dynamic_segment_mips_val (entry
);
4696 dynamic_segment_parisc_val (entry
);
4699 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4711 get_ver_flags (flags
)
4714 static char buff
[32];
4721 if (flags
& VER_FLG_BASE
)
4722 strcat (buff
, "BASE ");
4724 if (flags
& VER_FLG_WEAK
)
4726 if (flags
& VER_FLG_BASE
)
4727 strcat (buff
, "| ");
4729 strcat (buff
, "WEAK ");
4732 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
4733 strcat (buff
, "| <unknown>");
4738 /* Display the contents of the version sections. */
4740 process_version_sections (file
)
4743 Elf32_Internal_Shdr
* section
;
4750 for (i
= 0, section
= section_headers
;
4751 i
< elf_header
.e_shnum
;
4754 switch (section
->sh_type
)
4756 case SHT_GNU_verdef
:
4758 Elf_External_Verdef
* edefs
;
4765 (_("\nVersion definition section '%s' contains %ld entries:\n"),
4766 SECTION_NAME (section
), section
->sh_info
);
4768 printf (_(" Addr: 0x"));
4769 printf_vma (section
->sh_addr
);
4770 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4771 (unsigned long) section
->sh_offset
, section
->sh_link
,
4772 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
4774 edefs
= ((Elf_External_Verdef
*)
4775 get_data (NULL
, file
, section
->sh_offset
,
4777 _("version definition section")));
4781 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++ cnt
)
4784 Elf_External_Verdef
* edef
;
4785 Elf_Internal_Verdef ent
;
4786 Elf_External_Verdaux
* eaux
;
4787 Elf_Internal_Verdaux aux
;
4791 vstart
= ((char *) edefs
) + idx
;
4793 edef
= (Elf_External_Verdef
*) vstart
;
4795 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
4796 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
4797 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
4798 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
4799 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
4800 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
4801 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
4803 printf (_(" %#06x: Rev: %d Flags: %s"),
4804 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
4806 printf (_(" Index: %d Cnt: %d "),
4807 ent
.vd_ndx
, ent
.vd_cnt
);
4809 vstart
+= ent
.vd_aux
;
4811 eaux
= (Elf_External_Verdaux
*) vstart
;
4813 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
4814 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
4816 if (dynamic_strings
)
4817 printf (_("Name: %s\n"), dynamic_strings
+ aux
.vda_name
);
4819 printf (_("Name index: %ld\n"), aux
.vda_name
);
4821 isum
= idx
+ ent
.vd_aux
;
4823 for (j
= 1; j
< ent
.vd_cnt
; j
++)
4825 isum
+= aux
.vda_next
;
4826 vstart
+= aux
.vda_next
;
4828 eaux
= (Elf_External_Verdaux
*) vstart
;
4830 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
4831 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
4833 if (dynamic_strings
)
4834 printf (_(" %#06x: Parent %d: %s\n"),
4835 isum
, j
, dynamic_strings
+ aux
.vda_name
);
4837 printf (_(" %#06x: Parent %d, name index: %ld\n"),
4838 isum
, j
, aux
.vda_name
);
4848 case SHT_GNU_verneed
:
4850 Elf_External_Verneed
* eneed
;
4856 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
4857 SECTION_NAME (section
), section
->sh_info
);
4859 printf (_(" Addr: 0x"));
4860 printf_vma (section
->sh_addr
);
4861 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
4862 (unsigned long) section
->sh_offset
, section
->sh_link
,
4863 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
4865 eneed
= ((Elf_External_Verneed
*)
4866 get_data (NULL
, file
, section
->sh_offset
,
4867 section
->sh_size
, _("version need section")));
4871 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
4873 Elf_External_Verneed
* entry
;
4874 Elf_Internal_Verneed ent
;
4879 vstart
= ((char *) eneed
) + idx
;
4881 entry
= (Elf_External_Verneed
*) vstart
;
4883 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
4884 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
4885 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
4886 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
4887 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
4889 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
4891 if (dynamic_strings
)
4892 printf (_(" File: %s"), dynamic_strings
+ ent
.vn_file
);
4894 printf (_(" File: %lx"), ent
.vn_file
);
4896 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
4898 vstart
+= ent
.vn_aux
;
4900 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
4902 Elf_External_Vernaux
* eaux
;
4903 Elf_Internal_Vernaux aux
;
4905 eaux
= (Elf_External_Vernaux
*) vstart
;
4907 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
4908 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
4909 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
4910 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
4911 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
4913 if (dynamic_strings
)
4914 printf (_(" %#06x: Name: %s"),
4915 isum
, dynamic_strings
+ aux
.vna_name
);
4917 printf (_(" %#06x: Name index: %lx"),
4918 isum
, aux
.vna_name
);
4920 printf (_(" Flags: %s Version: %d\n"),
4921 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
4923 isum
+= aux
.vna_next
;
4924 vstart
+= aux
.vna_next
;
4934 case SHT_GNU_versym
:
4936 Elf32_Internal_Shdr
* link_section
;
4939 unsigned char * edata
;
4940 unsigned short * data
;
4942 Elf_Internal_Sym
* symbols
;
4943 Elf32_Internal_Shdr
* string_sec
;
4945 link_section
= SECTION_HEADER (section
->sh_link
);
4946 total
= section
->sh_size
/ section
->sh_entsize
;
4950 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
4952 string_sec
= SECTION_HEADER (link_section
->sh_link
);
4954 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
4955 string_sec
->sh_size
,
4956 _("version string table"));
4960 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
4961 SECTION_NAME (section
), total
);
4963 printf (_(" Addr: "));
4964 printf_vma (section
->sh_addr
);
4965 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4966 (unsigned long) section
->sh_offset
, section
->sh_link
,
4967 SECTION_NAME (link_section
));
4971 get_data (NULL
, file
,
4972 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] - loadaddr
,
4973 total
* sizeof (short), _("version symbol data")));
4980 data
= (unsigned short *) malloc (total
* sizeof (short));
4982 for (cnt
= total
; cnt
--;)
4983 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
4988 for (cnt
= 0; cnt
< total
; cnt
+= 4)
4991 int check_def
, check_need
;
4994 printf (" %03x:", cnt
);
4996 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
4997 switch (data
[cnt
+ j
])
5000 fputs (_(" 0 (*local*) "), stdout
);
5004 fputs (_(" 1 (*global*) "), stdout
);
5008 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
5009 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
5013 if (SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
5016 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
5023 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
5025 Elf_Internal_Verneed ivn
;
5026 unsigned long offset
;
5028 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
5033 Elf_Internal_Vernaux ivna
;
5034 Elf_External_Verneed evn
;
5035 Elf_External_Vernaux evna
;
5036 unsigned long a_off
;
5038 get_data (&evn
, file
, offset
, sizeof (evn
),
5041 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5042 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5044 a_off
= offset
+ ivn
.vn_aux
;
5048 get_data (&evna
, file
, a_off
, sizeof (evna
),
5049 _("version need aux (2)"));
5051 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5052 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5054 a_off
+= ivna
.vna_next
;
5056 while (ivna
.vna_other
!= data
[cnt
+ j
]
5057 && ivna
.vna_next
!= 0);
5059 if (ivna
.vna_other
== data
[cnt
+ j
])
5061 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5063 name
= strtab
+ ivna
.vna_name
;
5064 nn
+= printf ("(%s%-*s",
5066 12 - (int) strlen (name
),
5072 offset
+= ivn
.vn_next
;
5074 while (ivn
.vn_next
);
5077 if (check_def
&& data
[cnt
+ j
] != 0x8001
5078 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5080 Elf_Internal_Verdef ivd
;
5081 Elf_External_Verdef evd
;
5082 unsigned long offset
;
5084 offset
= version_info
5085 [DT_VERSIONTAGIDX (DT_VERDEF
)] - loadaddr
;
5089 get_data (&evd
, file
, offset
, sizeof (evd
),
5092 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5093 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5095 offset
+= ivd
.vd_next
;
5097 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
5098 && ivd
.vd_next
!= 0);
5100 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
5102 Elf_External_Verdaux evda
;
5103 Elf_Internal_Verdaux ivda
;
5105 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5107 get_data (&evda
, file
,
5108 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
5109 sizeof (evda
), _("version def aux"));
5111 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5113 name
= strtab
+ ivda
.vda_name
;
5114 nn
+= printf ("(%s%-*s",
5116 12 - (int) strlen (name
),
5122 printf ("%*c", 18 - nn
, ' ');
5140 printf (_("\nNo version information found in this file.\n"));
5146 get_symbol_binding (binding
)
5147 unsigned int binding
;
5149 static char buff
[32];
5153 case STB_LOCAL
: return "LOCAL";
5154 case STB_GLOBAL
: return "GLOBAL";
5155 case STB_WEAK
: return "WEAK";
5157 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
5158 sprintf (buff
, _("<processor specific>: %d"), binding
);
5159 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
5160 sprintf (buff
, _("<OS specific>: %d"), binding
);
5162 sprintf (buff
, _("<unknown>: %d"), binding
);
5168 get_symbol_type (type
)
5171 static char buff
[32];
5175 case STT_NOTYPE
: return "NOTYPE";
5176 case STT_OBJECT
: return "OBJECT";
5177 case STT_FUNC
: return "FUNC";
5178 case STT_SECTION
: return "SECTION";
5179 case STT_FILE
: return "FILE";
5180 case STT_COMMON
: return "COMMON";
5182 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
5184 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
5185 return "THUMB_FUNC";
5187 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
5190 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
5191 return "PARISC_MILLI";
5193 sprintf (buff
, _("<processor specific>: %d"), type
);
5195 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
5197 if (elf_header
.e_machine
== EM_PARISC
)
5199 if (type
== STT_HP_OPAQUE
)
5201 if (type
== STT_HP_STUB
)
5205 sprintf (buff
, _("<OS specific>: %d"), type
);
5208 sprintf (buff
, _("<unknown>: %d"), type
);
5214 get_symbol_visibility (visibility
)
5215 unsigned int visibility
;
5219 case STV_DEFAULT
: return "DEFAULT";
5220 case STV_INTERNAL
: return "INTERNAL";
5221 case STV_HIDDEN
: return "HIDDEN";
5222 case STV_PROTECTED
: return "PROTECTED";
5228 get_symbol_index_type (type
)
5233 case SHN_UNDEF
: return "UND";
5234 case SHN_ABS
: return "ABS";
5235 case SHN_COMMON
: return "COM";
5237 if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
5239 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
5241 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
5245 static char buff
[32];
5247 sprintf (buff
, "%3d", type
);
5254 get_dynamic_data (file
, number
)
5256 unsigned int number
;
5258 unsigned char * e_data
;
5261 e_data
= (unsigned char *) malloc (number
* 4);
5265 error (_("Out of memory\n"));
5269 if (fread (e_data
, 4, number
, file
) != number
)
5271 error (_("Unable to read in dynamic data\n"));
5275 i_data
= (int *) malloc (number
* sizeof (* i_data
));
5279 error (_("Out of memory\n"));
5285 i_data
[number
] = byte_get (e_data
+ number
* 4, 4);
5292 /* Dump the symbol table. */
5294 process_symbol_table (file
)
5297 Elf32_Internal_Shdr
* section
;
5298 unsigned char nb
[4];
5299 unsigned char nc
[4];
5302 int * buckets
= NULL
;
5303 int * chains
= NULL
;
5305 if (! do_syms
&& !do_histogram
)
5308 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
5311 if (fseek (file
, dynamic_info
[DT_HASH
] - loadaddr
, SEEK_SET
))
5313 error (_("Unable to seek to start of dynamic information"));
5317 if (fread (nb
, sizeof (nb
), 1, file
) != 1)
5319 error (_("Failed to read in number of buckets\n"));
5323 if (fread (nc
, sizeof (nc
), 1, file
) != 1)
5325 error (_("Failed to read in number of chains\n"));
5329 nbuckets
= byte_get (nb
, 4);
5330 nchains
= byte_get (nc
, 4);
5332 buckets
= get_dynamic_data (file
, nbuckets
);
5333 chains
= get_dynamic_data (file
, nchains
);
5335 if (buckets
== NULL
|| chains
== NULL
)
5340 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
5345 printf (_("\nSymbol table for image:\n"));
5347 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5349 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5351 for (hn
= 0; hn
< nbuckets
; hn
++)
5356 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
5358 Elf_Internal_Sym
* psym
;
5360 psym
= dynamic_symbols
+ si
;
5362 printf (" %3d %3d: ", si
, hn
);
5363 print_vma (psym
->st_value
, LONG_HEX
);
5365 print_vma (psym
->st_size
, DEC_5
);
5367 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5368 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5369 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5370 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
5371 print_symbol (25, dynamic_strings
+ psym
->st_name
);
5376 else if (do_syms
&& !do_using_dynamic
)
5380 for (i
= 0, section
= section_headers
;
5381 i
< elf_header
.e_shnum
;
5386 Elf_Internal_Sym
* symtab
;
5387 Elf_Internal_Sym
* psym
;
5390 if ( section
->sh_type
!= SHT_SYMTAB
5391 && section
->sh_type
!= SHT_DYNSYM
)
5394 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5395 SECTION_NAME (section
),
5396 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
5398 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5400 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5402 symtab
= GET_ELF_SYMBOLS (file
, section
);
5406 if (section
->sh_link
== elf_header
.e_shstrndx
)
5407 strtab
= string_table
;
5410 Elf32_Internal_Shdr
* string_sec
;
5412 string_sec
= SECTION_HEADER (section
->sh_link
);
5414 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
5415 string_sec
->sh_size
,
5419 for (si
= 0, psym
= symtab
;
5420 si
< section
->sh_size
/ section
->sh_entsize
;
5423 printf ("%6d: ", si
);
5424 print_vma (psym
->st_value
, LONG_HEX
);
5426 print_vma (psym
->st_size
, DEC_5
);
5427 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5428 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5429 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5430 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
5431 print_symbol (25, strtab
+ psym
->st_name
);
5433 if (section
->sh_type
== SHT_DYNSYM
&&
5434 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
5436 unsigned char data
[2];
5437 unsigned short vers_data
;
5438 unsigned long offset
;
5442 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)]
5445 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
5446 sizeof (data
), _("version data"));
5448 vers_data
= byte_get (data
, 2);
5450 is_nobits
= (SECTION_HEADER (psym
->st_shndx
)->sh_type
5453 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
5455 if ((vers_data
& 0x8000) || vers_data
> 1)
5457 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
5458 && (is_nobits
|| ! check_def
))
5460 Elf_External_Verneed evn
;
5461 Elf_Internal_Verneed ivn
;
5462 Elf_Internal_Vernaux ivna
;
5464 /* We must test both. */
5465 offset
= version_info
5466 [DT_VERSIONTAGIDX (DT_VERNEED
)] - loadaddr
;
5470 unsigned long vna_off
;
5472 get_data (&evn
, file
, offset
, sizeof (evn
),
5475 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5476 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5478 vna_off
= offset
+ ivn
.vn_aux
;
5482 Elf_External_Vernaux evna
;
5484 get_data (&evna
, file
, vna_off
,
5486 _("version need aux (3)"));
5488 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5489 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5490 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5492 vna_off
+= ivna
.vna_next
;
5494 while (ivna
.vna_other
!= vers_data
5495 && ivna
.vna_next
!= 0);
5497 if (ivna
.vna_other
== vers_data
)
5500 offset
+= ivn
.vn_next
;
5502 while (ivn
.vn_next
!= 0);
5504 if (ivna
.vna_other
== vers_data
)
5507 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
5510 else if (! is_nobits
)
5511 error (_("bad dynamic symbol"));
5518 if (vers_data
!= 0x8001
5519 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5521 Elf_Internal_Verdef ivd
;
5522 Elf_Internal_Verdaux ivda
;
5523 Elf_External_Verdaux evda
;
5524 unsigned long offset
;
5527 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)]
5532 Elf_External_Verdef evd
;
5534 get_data (&evd
, file
, offset
, sizeof (evd
),
5537 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5538 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5539 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5541 offset
+= ivd
.vd_next
;
5543 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
5544 && ivd
.vd_next
!= 0);
5546 offset
-= ivd
.vd_next
;
5547 offset
+= ivd
.vd_aux
;
5549 get_data (&evda
, file
, offset
, sizeof (evda
),
5550 _("version def aux"));
5552 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5554 if (psym
->st_name
!= ivda
.vda_name
)
5555 printf ((vers_data
& 0x8000)
5557 strtab
+ ivda
.vda_name
);
5567 if (strtab
!= string_table
)
5573 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5575 if (do_histogram
&& buckets
!= NULL
)
5582 int nzero_counts
= 0;
5585 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5587 printf (_(" Length Number %% of total Coverage\n"));
5589 lengths
= (int *) calloc (nbuckets
, sizeof (int));
5590 if (lengths
== NULL
)
5592 error (_("Out of memory"));
5595 for (hn
= 0; hn
< nbuckets
; ++hn
)
5600 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
5603 if (maxlength
< ++lengths
[hn
])
5608 counts
= (int *) calloc (maxlength
+ 1, sizeof (int));
5611 error (_("Out of memory"));
5615 for (hn
= 0; hn
< nbuckets
; ++hn
)
5616 ++ counts
[lengths
[hn
]];
5620 printf (" 0 %-10d (%5.1f%%)\n",
5621 counts
[0], (counts
[0] * 100.0) / nbuckets
);
5622 for (si
= 1; si
<= maxlength
; ++si
)
5624 nzero_counts
+= counts
[si
] * si
;
5625 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5626 si
, counts
[si
], (counts
[si
] * 100.0) / nbuckets
,
5627 (nzero_counts
* 100.0) / nsyms
);
5635 if (buckets
!= NULL
)
5645 process_syminfo (file
)
5646 FILE * file ATTRIBUTE_UNUSED
;
5650 if (dynamic_syminfo
== NULL
5652 /* No syminfo, this is ok. */
5655 /* There better should be a dynamic symbol section. */
5656 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
5660 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5661 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
5663 printf (_(" Num: Name BoundTo Flags\n"));
5664 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
5666 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
5668 printf ("%4d: ", i
);
5669 print_symbol (30, dynamic_strings
+ dynamic_symbols
[i
].st_name
);
5672 switch (dynamic_syminfo
[i
].si_boundto
)
5674 case SYMINFO_BT_SELF
:
5675 fputs ("SELF ", stdout
);
5677 case SYMINFO_BT_PARENT
:
5678 fputs ("PARENT ", stdout
);
5681 if (dynamic_syminfo
[i
].si_boundto
> 0
5682 && dynamic_syminfo
[i
].si_boundto
< dynamic_size
)
5684 print_symbol (10, dynamic_strings
5686 [dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
);
5690 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
5694 if (flags
& SYMINFO_FLG_DIRECT
)
5696 if (flags
& SYMINFO_FLG_PASSTHRU
)
5697 printf (" PASSTHRU");
5698 if (flags
& SYMINFO_FLG_COPY
)
5700 if (flags
& SYMINFO_FLG_LAZYLOAD
)
5701 printf (" LAZYLOAD");
5709 #ifdef SUPPORT_DISASSEMBLY
5711 disassemble_section (section
, file
)
5712 Elf32_Internal_Shdr
* section
;
5715 printf (_("\nAssembly dump of section %s\n"),
5716 SECTION_NAME (section
));
5718 /* XXX -- to be done --- XXX */
5725 dump_section (section
, file
)
5726 Elf32_Internal_Shdr
* section
;
5729 bfd_size_type bytes
;
5731 unsigned char * data
;
5732 unsigned char * start
;
5734 bytes
= section
->sh_size
;
5738 printf (_("\nSection '%s' has no data to dump.\n"),
5739 SECTION_NAME (section
));
5743 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
5745 addr
= section
->sh_addr
;
5747 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
, bytes
,
5760 lbytes
= (bytes
> 16 ? 16 : bytes
);
5762 printf (" 0x%8.8lx ", (unsigned long) addr
);
5764 switch (elf_header
.e_ident
[EI_DATA
])
5768 for (j
= 15; j
>= 0; j
--)
5771 printf ("%2.2x", data
[j
]);
5781 for (j
= 0; j
< 16; j
++)
5784 printf ("%2.2x", data
[j
]);
5794 for (j
= 0; j
< lbytes
; j
++)
5797 if (k
>= ' ' && k
< 0x80)
5816 static unsigned long int
5817 read_leb128 (data
, length_return
, sign
)
5818 unsigned char * data
;
5819 int * length_return
;
5822 unsigned long int result
= 0;
5823 unsigned int num_read
= 0;
5832 result
|= (byte
& 0x7f) << shift
;
5837 while (byte
& 0x80);
5839 if (length_return
!= NULL
)
5840 * length_return
= num_read
;
5842 if (sign
&& (shift
< 32) && (byte
& 0x40))
5843 result
|= -1 << shift
;
5848 typedef struct State_Machine_Registers
5850 unsigned long address
;
5853 unsigned int column
;
5857 /* This variable hold the number of the last entry seen
5858 in the File Table. */
5859 unsigned int last_file_entry
;
5862 static SMR state_machine_regs
;
5865 reset_state_machine (is_stmt
)
5868 state_machine_regs
.address
= 0;
5869 state_machine_regs
.file
= 1;
5870 state_machine_regs
.line
= 1;
5871 state_machine_regs
.column
= 0;
5872 state_machine_regs
.is_stmt
= is_stmt
;
5873 state_machine_regs
.basic_block
= 0;
5874 state_machine_regs
.end_sequence
= 0;
5875 state_machine_regs
.last_file_entry
= 0;
5878 /* Handled an extend line op. Returns true if this is the end
5881 process_extended_line_op (data
, is_stmt
, pointer_size
)
5882 unsigned char * data
;
5886 unsigned char op_code
;
5889 unsigned char * name
;
5892 len
= read_leb128 (data
, & bytes_read
, 0);
5897 warn (_("badly formed extended line op encountered!\n"));
5902 op_code
= * data
++;
5904 printf (_(" Extended opcode %d: "), op_code
);
5908 case DW_LNE_end_sequence
:
5909 printf (_("End of Sequence\n\n"));
5910 reset_state_machine (is_stmt
);
5913 case DW_LNE_set_address
:
5914 adr
= byte_get (data
, pointer_size
);
5915 printf (_("set Address to 0x%lx\n"), adr
);
5916 state_machine_regs
.address
= adr
;
5919 case DW_LNE_define_file
:
5920 printf (_(" define new File Table entry\n"));
5921 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5923 printf (_(" %d\t"), ++ state_machine_regs
.last_file_entry
);
5925 data
+= strlen ((char *) data
) + 1;
5926 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5928 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5930 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5931 printf (_("%s\n\n"), name
);
5935 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
5942 /* Size of pointers in the .debug_line section. This information is not
5943 really present in that section. It's obtained before dumping the debug
5944 sections by doing some pre-scan of the .debug_info section. */
5945 static int debug_line_pointer_size
= 4;
5948 display_debug_lines (section
, start
, file
)
5949 Elf32_Internal_Shdr
* section
;
5950 unsigned char * start
;
5951 FILE * file ATTRIBUTE_UNUSED
;
5953 DWARF2_External_LineInfo
* external
;
5954 DWARF2_Internal_LineInfo info
;
5955 unsigned char * standard_opcodes
;
5956 unsigned char * data
= start
;
5957 unsigned char * end
= start
+ section
->sh_size
;
5958 unsigned char * end_of_sequence
;
5961 printf (_("\nDump of debug contents of section %s:\n\n"),
5962 SECTION_NAME (section
));
5966 external
= (DWARF2_External_LineInfo
*) data
;
5968 /* Check the length of the block. */
5969 info
.li_length
= BYTE_GET (external
->li_length
);
5971 if (info
.li_length
== 0xffffffff)
5973 warn (_("64-bit DWARF line info is not supported yet.\n"));
5977 if (info
.li_length
+ sizeof (external
->li_length
) > section
->sh_size
)
5980 (_("The line info appears to be corrupt - the section is too small\n"));
5984 /* Check its version number. */
5985 info
.li_version
= BYTE_GET (external
->li_version
);
5986 if (info
.li_version
!= 2)
5988 warn (_("Only DWARF version 2 line info is currently supported.\n"));
5992 info
.li_prologue_length
= BYTE_GET (external
->li_prologue_length
);
5993 info
.li_min_insn_length
= BYTE_GET (external
->li_min_insn_length
);
5994 info
.li_default_is_stmt
= BYTE_GET (external
->li_default_is_stmt
);
5995 info
.li_line_base
= BYTE_GET (external
->li_line_base
);
5996 info
.li_line_range
= BYTE_GET (external
->li_line_range
);
5997 info
.li_opcode_base
= BYTE_GET (external
->li_opcode_base
);
5999 /* Sign extend the line base field. */
6000 info
.li_line_base
<<= 24;
6001 info
.li_line_base
>>= 24;
6003 printf (_(" Length: %ld\n"), info
.li_length
);
6004 printf (_(" DWARF Version: %d\n"), info
.li_version
);
6005 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
6006 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
6007 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
6008 printf (_(" Line Base: %d\n"), info
.li_line_base
);
6009 printf (_(" Line Range: %d\n"), info
.li_line_range
);
6010 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
6012 end_of_sequence
= data
+ info
.li_length
+ sizeof (external
->li_length
);
6014 reset_state_machine (info
.li_default_is_stmt
);
6016 /* Display the contents of the Opcodes table. */
6017 standard_opcodes
= data
+ sizeof (* external
);
6019 printf (_("\n Opcodes:\n"));
6021 for (i
= 1; i
< info
.li_opcode_base
; i
++)
6022 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
6024 /* Display the contents of the Directory table. */
6025 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
6028 printf (_("\n The Directory Table is empty.\n"));
6031 printf (_("\n The Directory Table:\n"));
6035 printf (_(" %s\n"), data
);
6037 data
+= strlen ((char *) data
) + 1;
6041 /* Skip the NUL at the end of the table. */
6044 /* Display the contents of the File Name table. */
6046 printf (_("\n The File Name Table is empty.\n"));
6049 printf (_("\n The File Name Table:\n"));
6050 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6054 unsigned char * name
;
6057 printf (_(" %d\t"), ++ state_machine_regs
.last_file_entry
);
6060 data
+= strlen ((char *) data
) + 1;
6062 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6064 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6066 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6068 printf (_("%s\n"), name
);
6072 /* Skip the NUL at the end of the table. */
6075 /* Now display the statements. */
6076 printf (_("\n Line Number Statements:\n"));
6079 while (data
< end_of_sequence
)
6081 unsigned char op_code
;
6085 op_code
= * data
++;
6087 if (op_code
>= info
.li_opcode_base
)
6089 op_code
-= info
.li_opcode_base
;
6090 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
6091 state_machine_regs
.address
+= adv
;
6092 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6093 op_code
, adv
, state_machine_regs
.address
);
6094 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
6095 state_machine_regs
.line
+= adv
;
6096 printf (_(" and Line by %d to %d\n"),
6097 adv
, state_machine_regs
.line
);
6099 else switch (op_code
)
6101 case DW_LNS_extended_op
:
6102 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
6103 debug_line_pointer_size
);
6107 printf (_(" Copy\n"));
6110 case DW_LNS_advance_pc
:
6111 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
6113 state_machine_regs
.address
+= adv
;
6114 printf (_(" Advance PC by %d to %lx\n"), adv
,
6115 state_machine_regs
.address
);
6118 case DW_LNS_advance_line
:
6119 adv
= read_leb128 (data
, & bytes_read
, 1);
6121 state_machine_regs
.line
+= adv
;
6122 printf (_(" Advance Line by %d to %d\n"), adv
,
6123 state_machine_regs
.line
);
6126 case DW_LNS_set_file
:
6127 adv
= read_leb128 (data
, & bytes_read
, 0);
6129 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6131 state_machine_regs
.file
= adv
;
6134 case DW_LNS_set_column
:
6135 adv
= read_leb128 (data
, & bytes_read
, 0);
6137 printf (_(" Set column to %d\n"), adv
);
6138 state_machine_regs
.column
= adv
;
6141 case DW_LNS_negate_stmt
:
6142 adv
= state_machine_regs
.is_stmt
;
6144 printf (_(" Set is_stmt to %d\n"), adv
);
6145 state_machine_regs
.is_stmt
= adv
;
6148 case DW_LNS_set_basic_block
:
6149 printf (_(" Set basic block\n"));
6150 state_machine_regs
.basic_block
= 1;
6153 case DW_LNS_const_add_pc
:
6154 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
6155 * info
.li_min_insn_length
);
6156 state_machine_regs
.address
+= adv
;
6157 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
6158 state_machine_regs
.address
);
6161 case DW_LNS_fixed_advance_pc
:
6162 adv
= byte_get (data
, 2);
6164 state_machine_regs
.address
+= adv
;
6165 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6166 adv
, state_machine_regs
.address
);
6169 case DW_LNS_set_prologue_end
:
6170 printf (_(" Set prologue_end to true\n"));
6173 case DW_LNS_set_epilogue_begin
:
6174 printf (_(" Set epilogue_begin to true\n"));
6177 case DW_LNS_set_isa
:
6178 adv
= read_leb128 (data
, & bytes_read
, 0);
6180 printf (_(" Set ISA to %d\n"), adv
);
6184 printf (_(" Unknown opcode %d with operands: "), op_code
);
6187 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
6189 printf ("0x%lx%s", read_leb128 (data
, &bytes_read
, 0),
6190 i
== 1 ? "" : ", ");
6205 display_debug_pubnames (section
, start
, file
)
6206 Elf32_Internal_Shdr
* section
;
6207 unsigned char * start
;
6208 FILE * file ATTRIBUTE_UNUSED
;
6210 DWARF2_External_PubNames
* external
;
6211 DWARF2_Internal_PubNames pubnames
;
6212 unsigned char * end
;
6214 end
= start
+ section
->sh_size
;
6216 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6220 unsigned char * data
;
6221 unsigned long offset
;
6223 external
= (DWARF2_External_PubNames
*) start
;
6225 pubnames
.pn_length
= BYTE_GET (external
->pn_length
);
6226 pubnames
.pn_version
= BYTE_GET (external
->pn_version
);
6227 pubnames
.pn_offset
= BYTE_GET (external
->pn_offset
);
6228 pubnames
.pn_size
= BYTE_GET (external
->pn_size
);
6230 data
= start
+ sizeof (* external
);
6231 start
+= pubnames
.pn_length
+ sizeof (external
->pn_length
);
6233 if (pubnames
.pn_length
== 0xffffffff)
6235 warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6239 if (pubnames
.pn_version
!= 2)
6241 static int warned
= 0;
6245 warn (_("Only DWARF 2 pubnames are currently supported\n"));
6252 printf (_(" Length: %ld\n"),
6253 pubnames
.pn_length
);
6254 printf (_(" Version: %d\n"),
6255 pubnames
.pn_version
);
6256 printf (_(" Offset into .debug_info section: %ld\n"),
6257 pubnames
.pn_offset
);
6258 printf (_(" Size of area in .debug_info section: %ld\n"),
6261 printf (_("\n Offset\tName\n"));
6265 offset
= byte_get (data
, 4);
6270 printf (" %ld\t\t%s\n", offset
, data
);
6271 data
+= strlen ((char *) data
) + 1;
6274 while (offset
!= 0);
6287 case DW_TAG_padding
: return "DW_TAG_padding";
6288 case DW_TAG_array_type
: return "DW_TAG_array_type";
6289 case DW_TAG_class_type
: return "DW_TAG_class_type";
6290 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
6291 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
6292 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
6293 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
6294 case DW_TAG_label
: return "DW_TAG_label";
6295 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
6296 case DW_TAG_member
: return "DW_TAG_member";
6297 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
6298 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
6299 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
6300 case DW_TAG_string_type
: return "DW_TAG_string_type";
6301 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
6302 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
6303 case DW_TAG_typedef
: return "DW_TAG_typedef";
6304 case DW_TAG_union_type
: return "DW_TAG_union_type";
6305 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
6306 case DW_TAG_variant
: return "DW_TAG_variant";
6307 case DW_TAG_common_block
: return "DW_TAG_common_block";
6308 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
6309 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
6310 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
6311 case DW_TAG_module
: return "DW_TAG_module";
6312 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
6313 case DW_TAG_set_type
: return "DW_TAG_set_type";
6314 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
6315 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
6316 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
6317 case DW_TAG_base_type
: return "DW_TAG_base_type";
6318 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
6319 case DW_TAG_const_type
: return "DW_TAG_const_type";
6320 case DW_TAG_constant
: return "DW_TAG_constant";
6321 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
6322 case DW_TAG_file_type
: return "DW_TAG_file_type";
6323 case DW_TAG_friend
: return "DW_TAG_friend";
6324 case DW_TAG_namelist
: return "DW_TAG_namelist";
6325 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
6326 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
6327 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
6328 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
6329 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
6330 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
6331 case DW_TAG_try_block
: return "DW_TAG_try_block";
6332 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
6333 case DW_TAG_variable
: return "DW_TAG_variable";
6334 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
6335 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
6336 case DW_TAG_format_label
: return "DW_TAG_format_label";
6337 case DW_TAG_function_template
: return "DW_TAG_function_template";
6338 case DW_TAG_class_template
: return "DW_TAG_class_template";
6339 /* DWARF 2.1 values. */
6340 case DW_TAG_dwarf_procedure
: return "DW_TAG_dwarf_procedure";
6341 case DW_TAG_restrict_type
: return "DW_TAG_restrict_type";
6342 case DW_TAG_interface_type
: return "DW_TAG_interface_type";
6343 case DW_TAG_namespace
: return "DW_TAG_namespace";
6344 case DW_TAG_imported_module
: return "DW_TAG_imported_module";
6345 case DW_TAG_unspecified_type
: return "DW_TAG_unspecified_type";
6346 case DW_TAG_partial_unit
: return "DW_TAG_partial_unit";
6347 case DW_TAG_imported_unit
: return "DW_TAG_imported_unit";
6350 static char buffer
[100];
6352 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
6359 get_AT_name (attribute
)
6360 unsigned long attribute
;
6364 case DW_AT_sibling
: return "DW_AT_sibling";
6365 case DW_AT_location
: return "DW_AT_location";
6366 case DW_AT_name
: return "DW_AT_name";
6367 case DW_AT_ordering
: return "DW_AT_ordering";
6368 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
6369 case DW_AT_byte_size
: return "DW_AT_byte_size";
6370 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
6371 case DW_AT_bit_size
: return "DW_AT_bit_size";
6372 case DW_AT_element_list
: return "DW_AT_element_list";
6373 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
6374 case DW_AT_low_pc
: return "DW_AT_low_pc";
6375 case DW_AT_high_pc
: return "DW_AT_high_pc";
6376 case DW_AT_language
: return "DW_AT_language";
6377 case DW_AT_member
: return "DW_AT_member";
6378 case DW_AT_discr
: return "DW_AT_discr";
6379 case DW_AT_discr_value
: return "DW_AT_discr_value";
6380 case DW_AT_visibility
: return "DW_AT_visibility";
6381 case DW_AT_import
: return "DW_AT_import";
6382 case DW_AT_string_length
: return "DW_AT_string_length";
6383 case DW_AT_common_reference
: return "DW_AT_common_reference";
6384 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
6385 case DW_AT_const_value
: return "DW_AT_const_value";
6386 case DW_AT_containing_type
: return "DW_AT_containing_type";
6387 case DW_AT_default_value
: return "DW_AT_default_value";
6388 case DW_AT_inline
: return "DW_AT_inline";
6389 case DW_AT_is_optional
: return "DW_AT_is_optional";
6390 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
6391 case DW_AT_producer
: return "DW_AT_producer";
6392 case DW_AT_prototyped
: return "DW_AT_prototyped";
6393 case DW_AT_return_addr
: return "DW_AT_return_addr";
6394 case DW_AT_start_scope
: return "DW_AT_start_scope";
6395 case DW_AT_stride_size
: return "DW_AT_stride_size";
6396 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
6397 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
6398 case DW_AT_accessibility
: return "DW_AT_accessibility";
6399 case DW_AT_address_class
: return "DW_AT_address_class";
6400 case DW_AT_artificial
: return "DW_AT_artificial";
6401 case DW_AT_base_types
: return "DW_AT_base_types";
6402 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
6403 case DW_AT_count
: return "DW_AT_count";
6404 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
6405 case DW_AT_decl_column
: return "DW_AT_decl_column";
6406 case DW_AT_decl_file
: return "DW_AT_decl_file";
6407 case DW_AT_decl_line
: return "DW_AT_decl_line";
6408 case DW_AT_declaration
: return "DW_AT_declaration";
6409 case DW_AT_discr_list
: return "DW_AT_discr_list";
6410 case DW_AT_encoding
: return "DW_AT_encoding";
6411 case DW_AT_external
: return "DW_AT_external";
6412 case DW_AT_frame_base
: return "DW_AT_frame_base";
6413 case DW_AT_friend
: return "DW_AT_friend";
6414 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
6415 case DW_AT_macro_info
: return "DW_AT_macro_info";
6416 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
6417 case DW_AT_priority
: return "DW_AT_priority";
6418 case DW_AT_segment
: return "DW_AT_segment";
6419 case DW_AT_specification
: return "DW_AT_specification";
6420 case DW_AT_static_link
: return "DW_AT_static_link";
6421 case DW_AT_type
: return "DW_AT_type";
6422 case DW_AT_use_location
: return "DW_AT_use_location";
6423 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
6424 case DW_AT_virtuality
: return "DW_AT_virtuality";
6425 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
6426 /* DWARF 2.1 values. */
6427 case DW_AT_allocated
: return "DW_AT_allocated";
6428 case DW_AT_associated
: return "DW_AT_associated";
6429 case DW_AT_data_location
: return "DW_AT_data_location";
6430 case DW_AT_stride
: return "DW_AT_stride";
6431 case DW_AT_entry_pc
: return "DW_AT_entry_pc";
6432 case DW_AT_use_UTF8
: return "DW_AT_use_UTF8";
6433 case DW_AT_extension
: return "DW_AT_extension";
6434 case DW_AT_ranges
: return "DW_AT_ranges";
6435 case DW_AT_trampoline
: return "DW_AT_trampoline";
6436 case DW_AT_call_column
: return "DW_AT_call_column";
6437 case DW_AT_call_file
: return "DW_AT_call_file";
6438 case DW_AT_call_line
: return "DW_AT_call_line";
6439 /* SGI/MIPS extensions. */
6440 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
6441 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
6442 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
6443 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
6444 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
6445 case DW_AT_MIPS_software_pipeline_depth
: return "DW_AT_MIPS_software_pipeline_depth";
6446 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
6447 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
6448 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
6449 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
6450 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
6451 /* GNU extensions. */
6452 case DW_AT_sf_names
: return "DW_AT_sf_names";
6453 case DW_AT_src_info
: return "DW_AT_src_info";
6454 case DW_AT_mac_info
: return "DW_AT_mac_info";
6455 case DW_AT_src_coords
: return "DW_AT_src_coords";
6456 case DW_AT_body_begin
: return "DW_AT_body_begin";
6457 case DW_AT_body_end
: return "DW_AT_body_end";
6460 static char buffer
[100];
6462 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
6469 get_FORM_name (form
)
6474 case DW_FORM_addr
: return "DW_FORM_addr";
6475 case DW_FORM_block2
: return "DW_FORM_block2";
6476 case DW_FORM_block4
: return "DW_FORM_block4";
6477 case DW_FORM_data2
: return "DW_FORM_data2";
6478 case DW_FORM_data4
: return "DW_FORM_data4";
6479 case DW_FORM_data8
: return "DW_FORM_data8";
6480 case DW_FORM_string
: return "DW_FORM_string";
6481 case DW_FORM_block
: return "DW_FORM_block";
6482 case DW_FORM_block1
: return "DW_FORM_block1";
6483 case DW_FORM_data1
: return "DW_FORM_data1";
6484 case DW_FORM_flag
: return "DW_FORM_flag";
6485 case DW_FORM_sdata
: return "DW_FORM_sdata";
6486 case DW_FORM_strp
: return "DW_FORM_strp";
6487 case DW_FORM_udata
: return "DW_FORM_udata";
6488 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
6489 case DW_FORM_ref1
: return "DW_FORM_ref1";
6490 case DW_FORM_ref2
: return "DW_FORM_ref2";
6491 case DW_FORM_ref4
: return "DW_FORM_ref4";
6492 case DW_FORM_ref8
: return "DW_FORM_ref8";
6493 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
6494 case DW_FORM_indirect
: return "DW_FORM_indirect";
6497 static char buffer
[100];
6499 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
6505 /* FIXME: There are better and more effiecint ways to handle
6506 these structures. For now though, I just want something that
6507 is simple to implement. */
6508 typedef struct abbrev_attr
6510 unsigned long attribute
;
6512 struct abbrev_attr
* next
;
6516 typedef struct abbrev_entry
6518 unsigned long entry
;
6521 struct abbrev_attr
* first_attr
;
6522 struct abbrev_attr
* last_attr
;
6523 struct abbrev_entry
* next
;
6527 static abbrev_entry
* first_abbrev
= NULL
;
6528 static abbrev_entry
* last_abbrev
= NULL
;
6531 free_abbrevs
PARAMS ((void))
6533 abbrev_entry
* abbrev
;
6535 for (abbrev
= first_abbrev
; abbrev
;)
6537 abbrev_entry
* next
= abbrev
->next
;
6540 for (attr
= abbrev
->first_attr
; attr
;)
6542 abbrev_attr
* next
= attr
->next
;
6552 last_abbrev
= first_abbrev
= NULL
;
6556 add_abbrev (number
, tag
, children
)
6557 unsigned long number
;
6561 abbrev_entry
* entry
;
6563 entry
= (abbrev_entry
*) malloc (sizeof (* entry
));
6569 entry
->entry
= number
;
6571 entry
->children
= children
;
6572 entry
->first_attr
= NULL
;
6573 entry
->last_attr
= NULL
;
6576 if (first_abbrev
== NULL
)
6577 first_abbrev
= entry
;
6579 last_abbrev
->next
= entry
;
6581 last_abbrev
= entry
;
6585 add_abbrev_attr (attribute
, form
)
6586 unsigned long attribute
;
6591 attr
= (abbrev_attr
*) malloc (sizeof (* attr
));
6597 attr
->attribute
= attribute
;
6601 if (last_abbrev
->first_attr
== NULL
)
6602 last_abbrev
->first_attr
= attr
;
6604 last_abbrev
->last_attr
->next
= attr
;
6606 last_abbrev
->last_attr
= attr
;
6609 /* Processes the (partial) contents of a .debug_abbrev section.
6610 Returns NULL if the end of the section was encountered.
6611 Returns the address after the last byte read if the end of
6612 an abbreviation set was found. */
6614 static unsigned char *
6615 process_abbrev_section (start
, end
)
6616 unsigned char * start
;
6617 unsigned char * end
;
6619 if (first_abbrev
!= NULL
)
6625 unsigned long entry
;
6627 unsigned long attribute
;
6630 entry
= read_leb128 (start
, & bytes_read
, 0);
6631 start
+= bytes_read
;
6633 /* A single zero is supposed to end the section according
6634 to the standard. If there's more, then signal that to
6637 return start
== end
? NULL
: start
;
6639 tag
= read_leb128 (start
, & bytes_read
, 0);
6640 start
+= bytes_read
;
6642 children
= * start
++;
6644 add_abbrev (entry
, tag
, children
);
6650 attribute
= read_leb128 (start
, & bytes_read
, 0);
6651 start
+= bytes_read
;
6653 form
= read_leb128 (start
, & bytes_read
, 0);
6654 start
+= bytes_read
;
6657 add_abbrev_attr (attribute
, form
);
6659 while (attribute
!= 0);
6667 display_debug_macinfo (section
, start
, file
)
6668 Elf32_Internal_Shdr
* section
;
6669 unsigned char * start
;
6670 FILE * file ATTRIBUTE_UNUSED
;
6672 unsigned char * end
= start
+ section
->sh_size
;
6673 unsigned char * curr
= start
;
6674 unsigned int bytes_read
;
6675 enum dwarf_macinfo_record_type op
;
6677 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6681 unsigned int lineno
;
6682 const char * string
;
6689 case DW_MACINFO_start_file
:
6691 unsigned int filenum
;
6693 lineno
= read_leb128 (curr
, & bytes_read
, 0);
6695 filenum
= read_leb128 (curr
, & bytes_read
, 0);
6698 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno
, filenum
);
6702 case DW_MACINFO_end_file
:
6703 printf (_(" DW_MACINFO_end_file\n"));
6706 case DW_MACINFO_define
:
6707 lineno
= read_leb128 (curr
, & bytes_read
, 0);
6710 curr
+= strlen (string
) + 1;
6711 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno
, string
);
6714 case DW_MACINFO_undef
:
6715 lineno
= read_leb128 (curr
, & bytes_read
, 0);
6718 curr
+= strlen (string
) + 1;
6719 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno
, string
);
6722 case DW_MACINFO_vendor_ext
:
6724 unsigned int constant
;
6726 constant
= read_leb128 (curr
, & bytes_read
, 0);
6729 curr
+= strlen (string
) + 1;
6730 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant
, string
);
6741 display_debug_abbrev (section
, start
, file
)
6742 Elf32_Internal_Shdr
* section
;
6743 unsigned char * start
;
6744 FILE * file ATTRIBUTE_UNUSED
;
6746 abbrev_entry
* entry
;
6747 unsigned char * end
= start
+ section
->sh_size
;
6749 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6753 start
= process_abbrev_section (start
, end
);
6755 if (first_abbrev
== NULL
)
6758 printf (_(" Number TAG\n"));
6760 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
6764 printf (_(" %ld %s [%s]\n"),
6766 get_TAG_name (entry
->tag
),
6767 entry
->children
? _("has children") : _("no children"));
6769 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
6771 printf (_(" %-18s %s\n"),
6772 get_AT_name (attr
->attribute
),
6773 get_FORM_name (attr
->form
));
6787 static unsigned char *
6788 display_block (data
, length
)
6789 unsigned char * data
;
6790 unsigned long length
;
6792 printf (_(" %lu byte block: "), length
);
6795 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
6801 decode_location_expression (data
, pointer_size
, length
)
6802 unsigned char * data
;
6803 unsigned int pointer_size
;
6804 unsigned long length
;
6808 unsigned long uvalue
;
6809 unsigned char * end
= data
+ length
;
6818 printf ("DW_OP_addr: %lx",
6819 (unsigned long) byte_get (data
, pointer_size
));
6820 data
+= pointer_size
;
6823 printf ("DW_OP_deref");
6826 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
6829 printf ("DW_OP_const1s: %ld", (long) byte_get (data
++, 1));
6832 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
6836 printf ("DW_OP_const2s: %ld", (long) byte_get (data
, 2));
6840 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
6844 printf ("DW_OP_const4s: %ld", (long) byte_get (data
, 4));
6848 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
6849 (unsigned long) byte_get (data
+ 4, 4));
6853 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
6854 (long) byte_get (data
+ 4, 4));
6858 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
6862 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
6866 printf ("DW_OP_dup");
6869 printf ("DW_OP_drop");
6872 printf ("DW_OP_over");
6875 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
6878 printf ("DW_OP_swap");
6881 printf ("DW_OP_rot");
6884 printf ("DW_OP_xderef");
6887 printf ("DW_OP_abs");
6890 printf ("DW_OP_and");
6893 printf ("DW_OP_div");
6896 printf ("DW_OP_minus");
6899 printf ("DW_OP_mod");
6902 printf ("DW_OP_mul");
6905 printf ("DW_OP_neg");
6908 printf ("DW_OP_not");
6911 printf ("DW_OP_or");
6914 printf ("DW_OP_plus");
6916 case DW_OP_plus_uconst
:
6917 printf ("DW_OP_plus_uconst: %lu",
6918 read_leb128 (data
, &bytes_read
, 0));
6922 printf ("DW_OP_shl");
6925 printf ("DW_OP_shr");
6928 printf ("DW_OP_shra");
6931 printf ("DW_OP_xor");
6934 printf ("DW_OP_bra: %ld", (long) byte_get (data
, 2));
6938 printf ("DW_OP_eq");
6941 printf ("DW_OP_ge");
6944 printf ("DW_OP_gt");
6947 printf ("DW_OP_le");
6950 printf ("DW_OP_lt");
6953 printf ("DW_OP_ne");
6956 printf ("DW_OP_skip: %ld", (long) byte_get (data
, 2));
6992 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
7027 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
7062 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
7063 read_leb128 (data
, &bytes_read
, 1));
7068 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
7072 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
7076 uvalue
= read_leb128 (data
, &bytes_read
, 0);
7078 printf ("DW_OP_bregx: %lu %ld", uvalue
,
7079 read_leb128 (data
, &bytes_read
, 1));
7083 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
7086 case DW_OP_deref_size
:
7087 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
7089 case DW_OP_xderef_size
:
7090 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
7093 printf ("DW_OP_nop");
7096 /* DWARF 2.1 extensions. */
7097 case DW_OP_push_object_address
:
7098 printf ("DW_OP_push_object_address");
7101 printf ("DW_OP_call2: <%lx>", (long) byte_get (data
, 2));
7105 printf ("DW_OP_call4: <%lx>", (long) byte_get (data
, 4));
7109 printf ("DW_OP_calli");
7113 if (op
>= DW_OP_lo_user
7114 && op
<= DW_OP_hi_user
)
7115 printf (_("(User defined location op)"));
7117 printf (_("(Unknown location op)"));
7118 /* No way to tell where the next op is, so just bail. */
7122 /* Separate the ops. */
7128 static const char * debug_str_contents
;
7129 static bfd_vma debug_str_size
;
7132 load_debug_str (file
)
7135 Elf32_Internal_Shdr
* sec
;
7138 /* If it is already loaded, do nothing. */
7139 if (debug_str_contents
!= NULL
)
7142 /* Locate the .debug_str section. */
7143 for (i
= 0, sec
= section_headers
;
7144 i
< elf_header
.e_shnum
;
7146 if (strcmp (SECTION_NAME (sec
), ".debug_str") == 0)
7149 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
7152 debug_str_size
= sec
->sh_size
;
7154 debug_str_contents
= ((char *)
7155 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7156 _("debug_str section data")));
7162 if (debug_str_contents
== NULL
)
7165 free ((char *) debug_str_contents
);
7166 debug_str_contents
= NULL
;
7171 fetch_indirect_string (offset
)
7172 unsigned long offset
;
7174 if (debug_str_contents
== NULL
)
7175 return _("<no .debug_str section>");
7177 if (offset
> debug_str_size
)
7178 return _("<offset is too big>");
7180 return debug_str_contents
+ offset
;
7185 display_debug_str (section
, start
, file
)
7186 Elf32_Internal_Shdr
* section
;
7187 unsigned char * start
;
7188 FILE * file ATTRIBUTE_UNUSED
;
7190 unsigned long bytes
;
7193 addr
= section
->sh_addr
;
7194 bytes
= section
->sh_size
;
7198 printf (_("\nThe .debug_str section is empty.\n"));
7202 printf (_("Contents of the .debug_str section:\n\n"));
7210 lbytes
= (bytes
> 16 ? 16 : bytes
);
7212 printf (" 0x%8.8lx ", (unsigned long) addr
);
7214 for (j
= 0; j
< 16; j
++)
7217 printf ("%2.2x", start
[j
]);
7225 for (j
= 0; j
< lbytes
; j
++)
7228 if (k
>= ' ' && k
< 0x80)
7245 static unsigned char *
7246 read_and_display_attr_value (attribute
, form
, data
, cu_offset
, pointer_size
)
7247 unsigned long attribute
;
7249 unsigned char * data
;
7250 unsigned long cu_offset
;
7251 unsigned long pointer_size
;
7253 unsigned long uvalue
= 0;
7254 unsigned char * block_start
= NULL
;
7262 case DW_FORM_ref_addr
:
7264 uvalue
= byte_get (data
, pointer_size
);
7265 data
+= pointer_size
;
7269 uvalue
= byte_get (data
, /* offset_size */ 4);
7270 data
+= /* offset_size */ 4;
7276 uvalue
= byte_get (data
++, 1);
7281 uvalue
= byte_get (data
, 2);
7287 uvalue
= byte_get (data
, 4);
7292 uvalue
= read_leb128 (data
, & bytes_read
, 1);
7296 case DW_FORM_ref_udata
:
7298 uvalue
= read_leb128 (data
, & bytes_read
, 0);
7302 case DW_FORM_indirect
:
7303 form
= read_leb128 (data
, & bytes_read
, 0);
7305 printf (" %s", get_FORM_name (form
));
7306 return read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
7312 case DW_FORM_ref_addr
:
7313 printf (" <#%lx>", uvalue
);
7319 case DW_FORM_ref_udata
:
7320 printf (" <%lx>", uvalue
+ cu_offset
);
7324 printf (" %#lx", uvalue
);
7332 printf (" %ld", uvalue
);
7337 uvalue
= byte_get (data
, 4);
7338 printf (" %lx", uvalue
);
7339 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
7343 case DW_FORM_string
:
7344 printf (" %s", data
);
7345 data
+= strlen ((char *) data
) + 1;
7349 uvalue
= read_leb128 (data
, & bytes_read
, 0);
7350 block_start
= data
+ bytes_read
;
7351 data
= display_block (block_start
, uvalue
);
7354 case DW_FORM_block1
:
7355 uvalue
= byte_get (data
, 1);
7356 block_start
= data
+ 1;
7357 data
= display_block (block_start
, uvalue
);
7360 case DW_FORM_block2
:
7361 uvalue
= byte_get (data
, 2);
7362 block_start
= data
+ 2;
7363 data
= display_block (block_start
, uvalue
);
7366 case DW_FORM_block4
:
7367 uvalue
= byte_get (data
, 4);
7368 block_start
= data
+ 4;
7369 data
= display_block (block_start
, uvalue
);
7373 printf (_(" (indirect string, offset: 0x%lx): "), uvalue
);
7374 printf (fetch_indirect_string (uvalue
));
7377 case DW_FORM_indirect
:
7378 /* Handled above. */
7382 warn (_("Unrecognised form: %d\n"), form
);
7386 /* For some attributes we can display futher information. */
7395 case DW_INL_not_inlined
: printf (_("(not inlined)")); break;
7396 case DW_INL_inlined
: printf (_("(inlined)")); break;
7397 case DW_INL_declared_not_inlined
: printf (_("(declared as inline but ignored)")); break;
7398 case DW_INL_declared_inlined
: printf (_("(declared as inline and inlined)")); break;
7399 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue
); break;
7403 case DW_AT_language
:
7406 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
7407 case DW_LANG_C89
: printf ("(ANSI C)"); break;
7408 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
7409 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
7410 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
7411 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
7412 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
7413 case DW_LANG_Ada83
: printf ("(Ada)"); break;
7414 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
7415 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
7416 /* DWARF 2.1 values. */
7417 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
7418 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
7419 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
7420 /* MIPS extension. */
7421 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
7422 default: printf ("(Unknown: %lx)", uvalue
); break;
7426 case DW_AT_encoding
:
7429 case DW_ATE_void
: printf ("(void)"); break;
7430 case DW_ATE_address
: printf ("(machine address)"); break;
7431 case DW_ATE_boolean
: printf ("(boolean)"); break;
7432 case DW_ATE_complex_float
: printf ("(complex float)"); break;
7433 case DW_ATE_float
: printf ("(float)"); break;
7434 case DW_ATE_signed
: printf ("(signed)"); break;
7435 case DW_ATE_signed_char
: printf ("(signed char)"); break;
7436 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
7437 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
7438 /* DWARF 2.1 value. */
7439 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
7441 if (uvalue
>= DW_ATE_lo_user
7442 && uvalue
<= DW_ATE_hi_user
)
7443 printf ("(user defined type)");
7445 printf ("(unknown type)");
7450 case DW_AT_accessibility
:
7453 case DW_ACCESS_public
: printf ("(public)"); break;
7454 case DW_ACCESS_protected
: printf ("(protected)"); break;
7455 case DW_ACCESS_private
: printf ("(private)"); break;
7456 default: printf ("(unknown accessibility)"); break;
7460 case DW_AT_visibility
:
7463 case DW_VIS_local
: printf ("(local)"); break;
7464 case DW_VIS_exported
: printf ("(exported)"); break;
7465 case DW_VIS_qualified
: printf ("(qualified)"); break;
7466 default: printf ("(unknown visibility)"); break;
7470 case DW_AT_virtuality
:
7473 case DW_VIRTUALITY_none
: printf ("(none)"); break;
7474 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
7475 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
7476 default: printf ("(unknown virtuality)"); break;
7480 case DW_AT_identifier_case
:
7483 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
7484 case DW_ID_up_case
: printf ("(up_case)"); break;
7485 case DW_ID_down_case
: printf ("(down_case)"); break;
7486 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
7487 default: printf ("(unknown case)"); break;
7491 case DW_AT_calling_convention
:
7494 case DW_CC_normal
: printf ("(normal)"); break;
7495 case DW_CC_program
: printf ("(program)"); break;
7496 case DW_CC_nocall
: printf ("(nocall)"); break;
7498 if (uvalue
>= DW_CC_lo_user
7499 && uvalue
<= DW_CC_hi_user
)
7500 printf ("(user defined)");
7502 printf ("(unknown convention)");
7506 case DW_AT_ordering
:
7509 case -1: printf ("(undefined)"); break;
7510 case 0: printf ("(row major)"); break;
7511 case 1: printf ("(column major)"); break;
7515 case DW_AT_frame_base
:
7516 case DW_AT_location
:
7517 case DW_AT_data_member_location
:
7518 case DW_AT_vtable_elem_location
:
7519 case DW_AT_allocated
:
7520 case DW_AT_associated
:
7521 case DW_AT_data_location
:
7523 case DW_AT_upper_bound
:
7524 case DW_AT_lower_bound
:
7528 decode_location_expression (block_start
, pointer_size
, uvalue
);
7540 static unsigned char *
7541 read_and_display_attr (attribute
, form
, data
, cu_offset
, pointer_size
)
7542 unsigned long attribute
;
7544 unsigned char * data
;
7545 unsigned long cu_offset
;
7546 unsigned long pointer_size
;
7548 printf (" %-18s:", get_AT_name (attribute
));
7549 data
= read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
7556 display_debug_info (section
, start
, file
)
7557 Elf32_Internal_Shdr
* section
;
7558 unsigned char * start
;
7561 unsigned char * end
= start
+ section
->sh_size
;
7562 unsigned char * section_begin
= start
;
7564 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
7566 load_debug_str (file
);
7570 DWARF2_External_CompUnit
* external
;
7571 DWARF2_Internal_CompUnit compunit
;
7572 Elf32_Internal_Shdr
* relsec
;
7573 unsigned char * tags
;
7576 unsigned long cu_offset
;
7578 external
= (DWARF2_External_CompUnit
*) start
;
7580 compunit
.cu_length
= BYTE_GET (external
->cu_length
);
7581 compunit
.cu_version
= BYTE_GET (external
->cu_version
);
7582 compunit
.cu_abbrev_offset
= BYTE_GET (external
->cu_abbrev_offset
);
7583 compunit
.cu_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
7585 if (compunit
.cu_length
== 0xffffffff)
7587 warn (_("64-bit DWARF debug info is not supported yet.\n"));
7591 /* Check for RELA relocations in the abbrev_offset address, and
7593 for (relsec
= section_headers
;
7594 relsec
< section_headers
+ elf_header
.e_shnum
;
7597 unsigned long nrelas
;
7598 Elf_Internal_Rela
*rela
, *rp
;
7599 Elf32_Internal_Shdr
*symsec
;
7600 Elf_Internal_Sym
*symtab
;
7601 Elf_Internal_Sym
*sym
;
7603 if (relsec
->sh_type
!= SHT_RELA
7604 || SECTION_HEADER (relsec
->sh_info
) != section
)
7607 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
7611 symsec
= SECTION_HEADER (relsec
->sh_link
);
7612 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
7614 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
7617 != (bfd_vma
) ((unsigned char *) &external
->cu_abbrev_offset
7623 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
7625 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
7627 warn (_("Skipping unexpected symbol type %u\n"),
7628 ELF32_ST_TYPE (sym
->st_info
));
7634 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
7636 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
7638 warn (_("Skipping unexpected symbol type %u\n"),
7639 ELF64_ST_TYPE (sym
->st_info
));
7644 compunit
.cu_abbrev_offset
+= rp
->r_addend
;
7652 tags
= start
+ sizeof (* external
);
7653 cu_offset
= start
- section_begin
;
7654 start
+= compunit
.cu_length
+ sizeof (external
->cu_length
);
7656 printf (_(" Compilation Unit @ %lx:\n"), cu_offset
);
7657 printf (_(" Length: %ld\n"), compunit
.cu_length
);
7658 printf (_(" Version: %d\n"), compunit
.cu_version
);
7659 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
7660 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
7662 if (compunit
.cu_version
!= 2)
7664 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
7670 /* Read in the abbrevs used by this compilation unit. */
7673 Elf32_Internal_Shdr
* sec
;
7674 unsigned char * begin
;
7676 /* Locate the .debug_abbrev section and process it. */
7677 for (i
= 0, sec
= section_headers
;
7678 i
< elf_header
.e_shnum
;
7680 if (strcmp (SECTION_NAME (sec
), ".debug_abbrev") == 0)
7683 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
7685 warn (_("Unable to locate .debug_abbrev section!\n"));
7689 begin
= ((unsigned char *)
7690 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7691 _("debug_abbrev section data")));
7695 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
7696 begin
+ sec
->sh_size
);
7702 while (tags
< start
)
7705 unsigned long abbrev_number
;
7706 abbrev_entry
* entry
;
7709 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
7712 /* A null DIE marks the end of a list of children. */
7713 if (abbrev_number
== 0)
7719 /* Scan through the abbreviation list until we reach the
7721 for (entry
= first_abbrev
;
7722 entry
&& entry
->entry
!= abbrev_number
;
7723 entry
= entry
->next
)
7728 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
7733 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
7735 (unsigned long) (tags
- section_begin
- bytes_read
),
7737 get_TAG_name (entry
->tag
));
7739 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
7740 tags
= read_and_display_attr (attr
->attribute
,
7743 compunit
.cu_pointer_size
);
7745 if (entry
->children
)
7758 display_debug_aranges (section
, start
, file
)
7759 Elf32_Internal_Shdr
* section
;
7760 unsigned char * start
;
7761 FILE * file ATTRIBUTE_UNUSED
;
7763 unsigned char * end
= start
+ section
->sh_size
;
7765 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
7769 DWARF2_External_ARange
* external
;
7770 DWARF2_Internal_ARange arange
;
7771 unsigned char * ranges
;
7772 unsigned long length
;
7773 unsigned long address
;
7776 external
= (DWARF2_External_ARange
*) start
;
7778 arange
.ar_length
= BYTE_GET (external
->ar_length
);
7779 arange
.ar_version
= BYTE_GET (external
->ar_version
);
7780 arange
.ar_info_offset
= BYTE_GET (external
->ar_info_offset
);
7781 arange
.ar_pointer_size
= BYTE_GET (external
->ar_pointer_size
);
7782 arange
.ar_segment_size
= BYTE_GET (external
->ar_segment_size
);
7784 if (arange
.ar_length
== 0xffffffff)
7786 warn (_("64-bit DWARF aranges are not supported yet.\n"));
7790 if (arange
.ar_version
!= 2)
7792 warn (_("Only DWARF 2 aranges are currently supported.\n"));
7796 printf (_(" Length: %ld\n"), arange
.ar_length
);
7797 printf (_(" Version: %d\n"), arange
.ar_version
);
7798 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
7799 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
7800 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
7802 printf (_("\n Address Length\n"));
7804 ranges
= start
+ sizeof (* external
);
7806 /* Must pad to an alignment boundary that is twice the pointer size. */
7807 excess
= sizeof (* external
) % (2 * arange
.ar_pointer_size
);
7809 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
7813 address
= byte_get (ranges
, arange
.ar_pointer_size
);
7815 ranges
+= arange
.ar_pointer_size
;
7817 length
= byte_get (ranges
, arange
.ar_pointer_size
);
7819 ranges
+= arange
.ar_pointer_size
;
7821 /* A pair of zeros marks the end of the list. */
7822 if (address
== 0 && length
== 0)
7825 printf (" %8.8lx %lu\n", address
, length
);
7828 start
+= arange
.ar_length
+ sizeof (external
->ar_length
);
7836 typedef struct Frame_Chunk
7838 struct Frame_Chunk
* next
;
7839 unsigned char * chunk_start
;
7841 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
7842 short int * col_type
;
7844 char * augmentation
;
7845 unsigned int code_factor
;
7847 unsigned long pc_begin
;
7848 unsigned long pc_range
;
7852 unsigned char fde_encoding
;
7856 /* A marker for a col_type that means this column was never referenced
7857 in the frame info. */
7858 #define DW_CFA_unreferenced (-1)
7860 static void frame_need_space
PARAMS ((Frame_Chunk
*, int));
7861 static void frame_display_row
PARAMS ((Frame_Chunk
*, int *, int *));
7862 static int size_of_encoded_value
PARAMS ((int));
7865 frame_need_space (fc
, reg
)
7869 int prev
= fc
->ncols
;
7871 if (reg
< fc
->ncols
)
7874 fc
->ncols
= reg
+ 1;
7875 fc
->col_type
= (short int *) xrealloc (fc
->col_type
,
7876 fc
->ncols
* sizeof (short int));
7877 fc
->col_offset
= (int *) xrealloc (fc
->col_offset
,
7878 fc
->ncols
* sizeof (int));
7880 while (prev
< fc
->ncols
)
7882 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
7883 fc
->col_offset
[prev
] = 0;
7889 frame_display_row (fc
, need_col_headers
, max_regs
)
7891 int * need_col_headers
;
7897 if (* max_regs
< fc
->ncols
)
7898 * max_regs
= fc
->ncols
;
7900 if (* need_col_headers
)
7902 * need_col_headers
= 0;
7904 printf (" LOC CFA ");
7906 for (r
= 0; r
< * max_regs
; r
++)
7907 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
7912 printf ("r%-4d", r
);
7918 printf ("%08lx ", fc
->pc_begin
);
7919 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
7920 printf ("%-8s ", tmp
);
7922 for (r
= 0; r
< fc
->ncols
; r
++)
7924 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
7926 switch (fc
->col_type
[r
])
7928 case DW_CFA_undefined
:
7931 case DW_CFA_same_value
:
7935 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
7937 case DW_CFA_register
:
7938 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
7941 strcpy (tmp
, "n/a");
7944 printf ("%-5s", tmp
);
7951 size_of_encoded_value (encoding
)
7954 switch (encoding
& 0x7)
7957 case 0: return is_32bit_elf
? 4 : 8;
7964 #define GET(N) byte_get (start, N); start += N
7965 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
7966 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
7969 display_debug_frames (section
, start
, file
)
7970 Elf32_Internal_Shdr
* section
;
7971 unsigned char * start
;
7972 FILE * file ATTRIBUTE_UNUSED
;
7974 unsigned char * end
= start
+ section
->sh_size
;
7975 unsigned char * section_start
= start
;
7976 Frame_Chunk
* chunks
= 0;
7977 Frame_Chunk
* remembered_state
= 0;
7979 int is_eh
= (strcmp (SECTION_NAME (section
), ".eh_frame") == 0);
7982 int addr_size
= is_32bit_elf
? 4 : 8;
7984 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
7988 unsigned char * saved_start
;
7989 unsigned char * block_end
;
7990 unsigned long length
;
7991 unsigned long cie_id
;
7994 int need_col_headers
= 1;
7995 unsigned char * augmentation_data
= NULL
;
7996 unsigned long augmentation_data_len
= 0;
7997 int encoded_ptr_size
= addr_size
;
7999 saved_start
= start
;
8000 length
= byte_get (start
, 4); start
+= 4;
8005 if (length
== 0xffffffff)
8007 warn (_("64-bit DWARF format frames are not supported yet.\n"));
8011 block_end
= saved_start
+ length
+ 4;
8012 cie_id
= byte_get (start
, 4); start
+= 4;
8014 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
8018 fc
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
8019 memset (fc
, 0, sizeof (Frame_Chunk
));
8023 fc
->chunk_start
= saved_start
;
8025 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
8026 fc
->col_offset
= (int *) xmalloc (sizeof (int));
8027 frame_need_space (fc
, max_regs
-1);
8031 fc
->augmentation
= start
;
8032 start
= strchr (start
, '\0') + 1;
8034 if (fc
->augmentation
[0] == 'z')
8036 fc
->code_factor
= LEB ();
8037 fc
->data_factor
= SLEB ();
8038 fc
->ra
= byte_get (start
, 1); start
+= 1;
8039 augmentation_data_len
= LEB ();
8040 augmentation_data
= start
;
8041 start
+= augmentation_data_len
;
8043 else if (strcmp (fc
->augmentation
, "eh") == 0)
8046 fc
->code_factor
= LEB ();
8047 fc
->data_factor
= SLEB ();
8048 fc
->ra
= byte_get (start
, 1); start
+= 1;
8052 fc
->code_factor
= LEB ();
8053 fc
->data_factor
= SLEB ();
8054 fc
->ra
= byte_get (start
, 1); start
+= 1;
8058 if (do_debug_frames_interp
)
8059 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
8060 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
8061 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
8065 printf ("\n%08lx %08lx %08lx CIE\n",
8066 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
8067 printf (" Version: %d\n", version
);
8068 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
8069 printf (" Code alignment factor: %u\n", fc
->code_factor
);
8070 printf (" Data alignment factor: %d\n", fc
->data_factor
);
8071 printf (" Return address column: %d\n", fc
->ra
);
8073 if (augmentation_data_len
)
8076 printf (" Augmentation data: ");
8077 for (i
= 0; i
< augmentation_data_len
; ++i
)
8078 printf (" %02x", augmentation_data
[i
]);
8084 if (augmentation_data_len
)
8086 unsigned char *p
, *q
;
8087 p
= fc
->augmentation
+ 1;
8088 q
= augmentation_data
;
8095 q
+= 1 + size_of_encoded_value (*q
);
8097 fc
->fde_encoding
= *q
++;
8103 if (fc
->fde_encoding
)
8104 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
8107 frame_need_space (fc
, fc
->ra
);
8111 unsigned char * look_for
;
8112 static Frame_Chunk fde_fc
;
8115 memset (fc
, 0, sizeof (Frame_Chunk
));
8117 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
8119 for (cie
= chunks
; cie
; cie
= cie
->next
)
8120 if (cie
->chunk_start
== look_for
)
8125 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
8126 cie_id
, saved_start
);
8129 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
8130 fc
->col_offset
= (int *) xmalloc (sizeof (int));
8131 frame_need_space (fc
, max_regs
- 1);
8133 fc
->augmentation
= "";
8134 fc
->fde_encoding
= 0;
8138 fc
->ncols
= cie
->ncols
;
8139 fc
->col_type
= (short int *) xmalloc (fc
->ncols
* sizeof (short int));
8140 fc
->col_offset
= (int *) xmalloc (fc
->ncols
* sizeof (int));
8141 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
8142 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
8143 fc
->augmentation
= cie
->augmentation
;
8144 fc
->code_factor
= cie
->code_factor
;
8145 fc
->data_factor
= cie
->data_factor
;
8146 fc
->cfa_reg
= cie
->cfa_reg
;
8147 fc
->cfa_offset
= cie
->cfa_offset
;
8149 frame_need_space (fc
, max_regs
-1);
8150 fc
->fde_encoding
= cie
->fde_encoding
;
8153 if (fc
->fde_encoding
)
8154 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
8156 fc
->pc_begin
= byte_get (start
, encoded_ptr_size
);
8157 start
+= encoded_ptr_size
;
8158 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
8159 start
+= encoded_ptr_size
;
8161 if (cie
->augmentation
[0] == 'z')
8163 augmentation_data_len
= LEB ();
8164 augmentation_data
= start
;
8165 start
+= augmentation_data_len
;
8168 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
8169 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
8170 (unsigned long)(cie
->chunk_start
- section_start
),
8171 fc
->pc_begin
, fc
->pc_begin
+ fc
->pc_range
);
8172 if (! do_debug_frames_interp
&& augmentation_data_len
)
8175 printf (" Augmentation data: ");
8176 for (i
= 0; i
< augmentation_data_len
; ++i
)
8177 printf (" %02x", augmentation_data
[i
]);
8183 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8184 about to interpret instructions for the chunk. */
8186 if (do_debug_frames_interp
)
8188 /* Start by making a pass over the chunk, allocating storage
8189 and taking note of what registers are used. */
8190 unsigned char * tmp
= start
;
8192 while (start
< block_end
)
8202 /* Warning: if you add any more cases to this switch, be
8203 sure to add them to the corresponding switch below. */
8206 case DW_CFA_advance_loc
:
8210 frame_need_space (fc
, opa
);
8211 fc
->col_type
[opa
] = DW_CFA_undefined
;
8213 case DW_CFA_restore
:
8214 frame_need_space (fc
, opa
);
8215 fc
->col_type
[opa
] = DW_CFA_undefined
;
8217 case DW_CFA_set_loc
:
8218 start
+= encoded_ptr_size
;
8220 case DW_CFA_advance_loc1
:
8223 case DW_CFA_advance_loc2
:
8226 case DW_CFA_advance_loc4
:
8229 case DW_CFA_offset_extended
:
8230 reg
= LEB (); LEB ();
8231 frame_need_space (fc
, reg
);
8232 fc
->col_type
[reg
] = DW_CFA_undefined
;
8234 case DW_CFA_restore_extended
:
8236 frame_need_space (fc
, reg
);
8237 fc
->col_type
[reg
] = DW_CFA_undefined
;
8239 case DW_CFA_undefined
:
8241 frame_need_space (fc
, reg
);
8242 fc
->col_type
[reg
] = DW_CFA_undefined
;
8244 case DW_CFA_same_value
:
8246 frame_need_space (fc
, reg
);
8247 fc
->col_type
[reg
] = DW_CFA_undefined
;
8249 case DW_CFA_register
:
8250 reg
= LEB (); LEB ();
8251 frame_need_space (fc
, reg
);
8252 fc
->col_type
[reg
] = DW_CFA_undefined
;
8254 case DW_CFA_def_cfa
:
8257 case DW_CFA_def_cfa_register
:
8260 case DW_CFA_def_cfa_offset
:
8263 #ifndef DW_CFA_GNU_args_size
8264 #define DW_CFA_GNU_args_size 0x2e
8266 case DW_CFA_GNU_args_size
:
8269 #ifndef DW_CFA_GNU_negative_offset_extended
8270 #define DW_CFA_GNU_negative_offset_extended 0x2f
8272 case DW_CFA_GNU_negative_offset_extended
:
8273 reg
= LEB (); LEB ();
8274 frame_need_space (fc
, reg
);
8275 fc
->col_type
[reg
] = DW_CFA_undefined
;
8284 /* Now we know what registers are used, make a second pass over
8285 the chunk, this time actually printing out the info. */
8287 while (start
< block_end
)
8290 unsigned long ul
, reg
, roffs
;
8299 /* Warning: if you add any more cases to this switch, be
8300 sure to add them to the corresponding switch above. */
8303 case DW_CFA_advance_loc
:
8304 if (do_debug_frames_interp
)
8305 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8307 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8308 opa
* fc
->code_factor
,
8309 fc
->pc_begin
+ opa
* fc
->code_factor
);
8310 fc
->pc_begin
+= opa
* fc
->code_factor
;
8315 if (! do_debug_frames_interp
)
8316 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8317 opa
, roffs
* fc
->data_factor
);
8318 fc
->col_type
[opa
] = DW_CFA_offset
;
8319 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
8322 case DW_CFA_restore
:
8323 if (! do_debug_frames_interp
)
8324 printf (" DW_CFA_restore: r%d\n", opa
);
8325 fc
->col_type
[opa
] = cie
->col_type
[opa
];
8326 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
8329 case DW_CFA_set_loc
:
8330 vma
= byte_get (start
, encoded_ptr_size
);
8331 start
+= encoded_ptr_size
;
8332 if (do_debug_frames_interp
)
8333 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8335 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
8339 case DW_CFA_advance_loc1
:
8340 ofs
= byte_get (start
, 1); start
+= 1;
8341 if (do_debug_frames_interp
)
8342 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8344 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8345 ofs
* fc
->code_factor
,
8346 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8347 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8350 case DW_CFA_advance_loc2
:
8351 ofs
= byte_get (start
, 2); start
+= 2;
8352 if (do_debug_frames_interp
)
8353 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8355 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8356 ofs
* fc
->code_factor
,
8357 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8358 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8361 case DW_CFA_advance_loc4
:
8362 ofs
= byte_get (start
, 4); start
+= 4;
8363 if (do_debug_frames_interp
)
8364 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8366 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8367 ofs
* fc
->code_factor
,
8368 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8369 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8372 case DW_CFA_offset_extended
:
8375 if (! do_debug_frames_interp
)
8376 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8377 reg
, roffs
* fc
->data_factor
);
8378 fc
->col_type
[reg
] = DW_CFA_offset
;
8379 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
8382 case DW_CFA_restore_extended
:
8384 if (! do_debug_frames_interp
)
8385 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
8386 fc
->col_type
[reg
] = cie
->col_type
[reg
];
8387 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
8390 case DW_CFA_undefined
:
8392 if (! do_debug_frames_interp
)
8393 printf (" DW_CFA_undefined: r%ld\n", reg
);
8394 fc
->col_type
[reg
] = DW_CFA_undefined
;
8395 fc
->col_offset
[reg
] = 0;
8398 case DW_CFA_same_value
:
8400 if (! do_debug_frames_interp
)
8401 printf (" DW_CFA_same_value: r%ld\n", reg
);
8402 fc
->col_type
[reg
] = DW_CFA_same_value
;
8403 fc
->col_offset
[reg
] = 0;
8406 case DW_CFA_register
:
8409 if (! do_debug_frames_interp
)
8410 printf (" DW_CFA_register: r%ld\n", reg
);
8411 fc
->col_type
[reg
] = DW_CFA_register
;
8412 fc
->col_offset
[reg
] = roffs
;
8415 case DW_CFA_remember_state
:
8416 if (! do_debug_frames_interp
)
8417 printf (" DW_CFA_remember_state\n");
8418 rs
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
8419 rs
->ncols
= fc
->ncols
;
8420 rs
->col_type
= (short int *) xmalloc (rs
->ncols
* sizeof (short int));
8421 rs
->col_offset
= (int *) xmalloc (rs
->ncols
* sizeof (int));
8422 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
8423 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
8424 rs
->next
= remembered_state
;
8425 remembered_state
= rs
;
8428 case DW_CFA_restore_state
:
8429 if (! do_debug_frames_interp
)
8430 printf (" DW_CFA_restore_state\n");
8431 rs
= remembered_state
;
8432 remembered_state
= rs
->next
;
8433 frame_need_space (fc
, rs
->ncols
-1);
8434 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
8435 memcpy (fc
->col_offset
, rs
->col_offset
, rs
->ncols
* sizeof (int));
8436 free (rs
->col_type
);
8437 free (rs
->col_offset
);
8441 case DW_CFA_def_cfa
:
8442 fc
->cfa_reg
= LEB ();
8443 fc
->cfa_offset
= LEB ();
8444 if (! do_debug_frames_interp
)
8445 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
8446 fc
->cfa_reg
, fc
->cfa_offset
);
8449 case DW_CFA_def_cfa_register
:
8450 fc
->cfa_reg
= LEB ();
8451 if (! do_debug_frames_interp
)
8452 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
8455 case DW_CFA_def_cfa_offset
:
8456 fc
->cfa_offset
= LEB ();
8457 if (! do_debug_frames_interp
)
8458 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
8462 if (! do_debug_frames_interp
)
8463 printf (" DW_CFA_nop\n");
8466 #ifndef DW_CFA_GNU_window_save
8467 #define DW_CFA_GNU_window_save 0x2d
8469 case DW_CFA_GNU_window_save
:
8470 if (! do_debug_frames_interp
)
8471 printf (" DW_CFA_GNU_window_save\n");
8474 case DW_CFA_GNU_args_size
:
8476 if (! do_debug_frames_interp
)
8477 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
8480 case DW_CFA_GNU_negative_offset_extended
:
8483 frame_need_space (fc
, reg
);
8484 if (! do_debug_frames_interp
)
8485 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
8486 reg
, l
* fc
->data_factor
);
8487 fc
->col_type
[reg
] = DW_CFA_offset
;
8488 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
8492 fprintf (stderr
, "unsupported or unknown DW_CFA_%d\n", op
);
8497 if (do_debug_frames_interp
)
8498 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8513 display_debug_not_supported (section
, start
, file
)
8514 Elf32_Internal_Shdr
* section
;
8515 unsigned char * start ATTRIBUTE_UNUSED
;
8516 FILE * file ATTRIBUTE_UNUSED
;
8518 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
8519 SECTION_NAME (section
));
8524 /* Pre-scan the .debug_info section to record the size of address.
8525 When dumping the .debug_line, we use that size information, assuming
8526 that all compilation units have the same address size. */
8528 prescan_debug_info (section
, start
, file
)
8529 Elf32_Internal_Shdr
* section ATTRIBUTE_UNUSED
;
8530 unsigned char * start
;
8531 FILE * file ATTRIBUTE_UNUSED
;
8533 DWARF2_External_CompUnit
* external
;
8535 external
= (DWARF2_External_CompUnit
*) start
;
8537 debug_line_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
8541 /* A structure containing the name of a debug section and a pointer
8542 to a function that can decode it. The third field is a prescan
8543 function to be run over the section before displaying any of the
8547 const char * const name
;
8548 int (* display
) PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
8549 int (* prescan
) PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
8553 { ".debug_abbrev", display_debug_abbrev
, NULL
},
8554 { ".debug_aranges", display_debug_aranges
, NULL
},
8555 { ".debug_frame", display_debug_frames
, NULL
},
8556 { ".debug_info", display_debug_info
, prescan_debug_info
},
8557 { ".debug_line", display_debug_lines
, NULL
},
8558 { ".debug_pubnames", display_debug_pubnames
, NULL
},
8559 { ".eh_frame", display_debug_frames
, NULL
},
8560 { ".debug_macinfo", display_debug_macinfo
, NULL
},
8561 { ".debug_str", display_debug_str
, NULL
},
8563 { ".debug_pubtypes", display_debug_not_supported
, NULL
},
8564 { ".debug_ranges", display_debug_not_supported
, NULL
},
8565 { ".debug_static_func", display_debug_not_supported
, NULL
},
8566 { ".debug_static_vars", display_debug_not_supported
, NULL
},
8567 { ".debug_types", display_debug_not_supported
, NULL
},
8568 { ".debug_weaknames", display_debug_not_supported
, NULL
}
8572 display_debug_section (section
, file
)
8573 Elf32_Internal_Shdr
* section
;
8576 char * name
= SECTION_NAME (section
);
8577 bfd_size_type length
;
8578 unsigned char * start
;
8581 length
= section
->sh_size
;
8584 printf (_("\nSection '%s' has no debugging data.\n"), name
);
8588 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
, length
,
8589 _("debug section data"));
8593 /* See if we know how to display the contents of this section. */
8594 if (strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
8595 name
= ".debug_info";
8597 for (i
= NUM_ELEM (debug_displays
); i
--;)
8598 if (strcmp (debug_displays
[i
].name
, name
) == 0)
8600 debug_displays
[i
].display (section
, start
, file
);
8605 printf (_("Unrecognised debug section: %s\n"), name
);
8609 /* If we loaded in the abbrev section at some point,
8610 we must release it here. */
8617 process_section_contents (file
)
8620 Elf32_Internal_Shdr
* section
;
8626 /* Pre-scan the debug sections to find some debug information not
8627 present in some of them. For the .debug_line, we must find out the
8628 size of address (specified in .debug_info and .debug_aranges). */
8629 for (i
= 0, section
= section_headers
;
8630 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
8633 char * name
= SECTION_NAME (section
);
8636 if (section
->sh_size
== 0)
8639 /* See if there is some pre-scan operation for this section. */
8640 for (j
= NUM_ELEM (debug_displays
); j
--;)
8641 if (strcmp (debug_displays
[j
].name
, name
) == 0)
8643 if (debug_displays
[j
].prescan
!= NULL
)
8645 bfd_size_type length
;
8646 unsigned char * start
;
8648 length
= section
->sh_size
;
8649 start
= ((unsigned char *)
8650 get_data (NULL
, file
, section
->sh_offset
, length
,
8651 _("debug section data")));
8655 debug_displays
[j
].prescan (section
, start
, file
);
8663 for (i
= 0, section
= section_headers
;
8664 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
8667 #ifdef SUPPORT_DISASSEMBLY
8668 if (dump_sects
[i
] & DISASS_DUMP
)
8669 disassemble_section (section
, file
);
8671 if (dump_sects
[i
] & HEX_DUMP
)
8672 dump_section (section
, file
);
8674 if (dump_sects
[i
] & DEBUG_DUMP
)
8675 display_debug_section (section
, file
);
8678 if (i
< num_dump_sects
)
8679 warn (_("Some sections were not dumped because they do not exist!\n"));
8685 process_mips_fpe_exception (mask
)
8691 if (mask
& OEX_FPU_INEX
)
8692 fputs ("INEX", stdout
), first
= 0;
8693 if (mask
& OEX_FPU_UFLO
)
8694 printf ("%sUFLO", first
? "" : "|"), first
= 0;
8695 if (mask
& OEX_FPU_OFLO
)
8696 printf ("%sOFLO", first
? "" : "|"), first
= 0;
8697 if (mask
& OEX_FPU_DIV0
)
8698 printf ("%sDIV0", first
? "" : "|"), first
= 0;
8699 if (mask
& OEX_FPU_INVAL
)
8700 printf ("%sINVAL", first
? "" : "|");
8703 fputs ("0", stdout
);
8707 process_mips_specific (file
)
8710 Elf_Internal_Dyn
* entry
;
8711 size_t liblist_offset
= 0;
8712 size_t liblistno
= 0;
8713 size_t conflictsno
= 0;
8714 size_t options_offset
= 0;
8715 size_t conflicts_offset
= 0;
8717 /* We have a lot of special sections. Thanks SGI! */
8718 if (dynamic_segment
== NULL
)
8719 /* No information available. */
8722 for (entry
= dynamic_segment
; entry
->d_tag
!= DT_NULL
; ++entry
)
8723 switch (entry
->d_tag
)
8725 case DT_MIPS_LIBLIST
:
8726 liblist_offset
= entry
->d_un
.d_val
- loadaddr
;
8728 case DT_MIPS_LIBLISTNO
:
8729 liblistno
= entry
->d_un
.d_val
;
8731 case DT_MIPS_OPTIONS
:
8732 options_offset
= entry
->d_un
.d_val
- loadaddr
;
8734 case DT_MIPS_CONFLICT
:
8735 conflicts_offset
= entry
->d_un
.d_val
- loadaddr
;
8737 case DT_MIPS_CONFLICTNO
:
8738 conflictsno
= entry
->d_un
.d_val
;
8744 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
8746 Elf32_External_Lib
* elib
;
8749 elib
= ((Elf32_External_Lib
*)
8750 get_data (NULL
, file
, liblist_offset
,
8751 liblistno
* sizeof (Elf32_External_Lib
),
8755 printf ("\nSection '.liblist' contains %lu entries:\n",
8756 (unsigned long) liblistno
);
8757 fputs (" Library Time Stamp Checksum Version Flags\n",
8760 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
8767 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
8768 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
8769 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
8770 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
8771 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
8773 tmp
= gmtime (&time
);
8774 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
8775 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
8776 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
8778 printf ("%3lu: ", (unsigned long) cnt
);
8779 print_symbol (20, dynamic_strings
+ liblist
.l_name
);
8780 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
8783 if (liblist
.l_flags
== 0)
8794 { " EXACT_MATCH", LL_EXACT_MATCH
},
8795 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
8796 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
8797 { " EXPORTS", LL_EXPORTS
},
8798 { " DELAY_LOAD", LL_DELAY_LOAD
},
8799 { " DELTA", LL_DELTA
}
8801 int flags
= liblist
.l_flags
;
8805 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
8807 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
8809 fputs (l_flags_vals
[fcnt
].name
, stdout
);
8810 flags
^= l_flags_vals
[fcnt
].bit
;
8813 printf (" %#x", (unsigned int) flags
);
8823 if (options_offset
!= 0)
8825 Elf_External_Options
* eopt
;
8826 Elf_Internal_Shdr
* sect
= section_headers
;
8827 Elf_Internal_Options
* iopt
;
8828 Elf_Internal_Options
* option
;
8832 /* Find the section header so that we get the size. */
8833 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
8836 eopt
= (Elf_External_Options
*) get_data (NULL
, file
, options_offset
,
8837 sect
->sh_size
, _("options"));
8840 iopt
= ((Elf_Internal_Options
*)
8841 malloc ((sect
->sh_size
/ sizeof (eopt
)) * sizeof (* iopt
)));
8844 error (_("Out of memory"));
8851 while (offset
< sect
->sh_size
)
8853 Elf_External_Options
* eoption
;
8855 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
8857 option
->kind
= BYTE_GET (eoption
->kind
);
8858 option
->size
= BYTE_GET (eoption
->size
);
8859 option
->section
= BYTE_GET (eoption
->section
);
8860 option
->info
= BYTE_GET (eoption
->info
);
8862 offset
+= option
->size
;
8868 printf (_("\nSection '%s' contains %d entries:\n"),
8869 SECTION_NAME (sect
), cnt
);
8877 switch (option
->kind
)
8880 /* This shouldn't happen. */
8881 printf (" NULL %d %lx", option
->section
, option
->info
);
8884 printf (" REGINFO ");
8885 if (elf_header
.e_machine
== EM_MIPS
)
8888 Elf32_External_RegInfo
* ereg
;
8889 Elf32_RegInfo reginfo
;
8891 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
8892 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8893 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8894 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8895 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8896 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8897 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
8899 printf ("GPR %08lx GP 0x%lx\n",
8901 (unsigned long) reginfo
.ri_gp_value
);
8902 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8903 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8904 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8909 Elf64_External_RegInfo
* ereg
;
8910 Elf64_Internal_RegInfo reginfo
;
8912 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
8913 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8914 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8915 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8916 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8917 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8918 reginfo
.ri_gp_value
= BYTE_GET8 (ereg
->ri_gp_value
);
8920 printf ("GPR %08lx GP 0x",
8921 reginfo
.ri_gprmask
);
8922 printf_vma (reginfo
.ri_gp_value
);
8925 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8926 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8927 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8931 case ODK_EXCEPTIONS
:
8932 fputs (" EXCEPTIONS fpe_min(", stdout
);
8933 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
8934 fputs (") fpe_max(", stdout
);
8935 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
8936 fputs (")", stdout
);
8938 if (option
->info
& OEX_PAGE0
)
8939 fputs (" PAGE0", stdout
);
8940 if (option
->info
& OEX_SMM
)
8941 fputs (" SMM", stdout
);
8942 if (option
->info
& OEX_FPDBUG
)
8943 fputs (" FPDBUG", stdout
);
8944 if (option
->info
& OEX_DISMISS
)
8945 fputs (" DISMISS", stdout
);
8948 fputs (" PAD ", stdout
);
8949 if (option
->info
& OPAD_PREFIX
)
8950 fputs (" PREFIX", stdout
);
8951 if (option
->info
& OPAD_POSTFIX
)
8952 fputs (" POSTFIX", stdout
);
8953 if (option
->info
& OPAD_SYMBOL
)
8954 fputs (" SYMBOL", stdout
);
8957 fputs (" HWPATCH ", stdout
);
8958 if (option
->info
& OHW_R4KEOP
)
8959 fputs (" R4KEOP", stdout
);
8960 if (option
->info
& OHW_R8KPFETCH
)
8961 fputs (" R8KPFETCH", stdout
);
8962 if (option
->info
& OHW_R5KEOP
)
8963 fputs (" R5KEOP", stdout
);
8964 if (option
->info
& OHW_R5KCVTL
)
8965 fputs (" R5KCVTL", stdout
);
8968 fputs (" FILL ", stdout
);
8969 /* XXX Print content of info word? */
8972 fputs (" TAGS ", stdout
);
8973 /* XXX Print content of info word? */
8976 fputs (" HWAND ", stdout
);
8977 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8978 fputs (" R4KEOP_CHECKED", stdout
);
8979 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8980 fputs (" R4KEOP_CLEAN", stdout
);
8983 fputs (" HWOR ", stdout
);
8984 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8985 fputs (" R4KEOP_CHECKED", stdout
);
8986 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8987 fputs (" R4KEOP_CLEAN", stdout
);
8990 printf (" GP_GROUP %#06lx self-contained %#06lx",
8991 option
->info
& OGP_GROUP
,
8992 (option
->info
& OGP_SELF
) >> 16);
8995 printf (" IDENT %#06lx self-contained %#06lx",
8996 option
->info
& OGP_GROUP
,
8997 (option
->info
& OGP_SELF
) >> 16);
9000 /* This shouldn't happen. */
9001 printf (" %3d ??? %d %lx",
9002 option
->kind
, option
->section
, option
->info
);
9006 len
= sizeof (* eopt
);
9007 while (len
< option
->size
)
9008 if (((char *) option
)[len
] >= ' '
9009 && ((char *) option
)[len
] < 0x7f)
9010 printf ("%c", ((char *) option
)[len
++]);
9012 printf ("\\%03o", ((char *) option
)[len
++]);
9014 fputs ("\n", stdout
);
9022 if (conflicts_offset
!= 0 && conflictsno
!= 0)
9024 Elf32_Conflict
* iconf
;
9027 if (dynamic_symbols
== NULL
)
9029 error (_("conflict list with without table"));
9033 iconf
= (Elf32_Conflict
*) malloc (conflictsno
* sizeof (* iconf
));
9036 error (_("Out of memory"));
9042 Elf32_External_Conflict
* econf32
;
9044 econf32
= ((Elf32_External_Conflict
*)
9045 get_data (NULL
, file
, conflicts_offset
,
9046 conflictsno
* sizeof (* econf32
),
9051 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9052 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
9058 Elf64_External_Conflict
* econf64
;
9060 econf64
= ((Elf64_External_Conflict
*)
9061 get_data (NULL
, file
, conflicts_offset
,
9062 conflictsno
* sizeof (* econf64
),
9067 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9068 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
9073 printf (_("\nSection '.conflict' contains %ld entries:\n"),
9074 (long) conflictsno
);
9075 puts (_(" Num: Index Value Name"));
9077 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9079 Elf_Internal_Sym
* psym
= & dynamic_symbols
[iconf
[cnt
]];
9081 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
9082 print_vma (psym
->st_value
, FULL_HEX
);
9084 print_symbol (25, dynamic_strings
+ psym
->st_name
);
9095 get_note_type (e_type
)
9098 static char buff
[64];
9102 case NT_PRSTATUS
: return _("NT_PRSTATUS (prstatus structure)");
9103 case NT_FPREGSET
: return _("NT_FPREGSET (floating point registers)");
9104 case NT_PRPSINFO
: return _("NT_PRPSINFO (prpsinfo structure)");
9105 case NT_TASKSTRUCT
: return _("NT_TASKSTRUCT (task structure)");
9106 case NT_PRXFPREG
: return _("NT_PRXFPREG (user_xfpregs structure)");
9107 case NT_PSTATUS
: return _("NT_PSTATUS (pstatus structure)");
9108 case NT_FPREGS
: return _("NT_FPREGS (floating point registers)");
9109 case NT_PSINFO
: return _("NT_PSINFO (psinfo structure)");
9110 case NT_LWPSTATUS
: return _("NT_LWPSTATUS (lwpstatus_t structure)");
9111 case NT_LWPSINFO
: return _("NT_LWPSINFO (lwpsinfo_t structure)");
9112 case NT_WIN32PSTATUS
: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
9114 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
9120 get_netbsd_elfcore_note_type (e_type
)
9123 static char buff
[64];
9125 if (e_type
== NT_NETBSDCORE_PROCINFO
)
9127 /* NetBSD core "procinfo" structure. */
9128 return _("NetBSD procinfo structure");
9131 /* As of Jan 2002 there are no other machine-independent notes
9132 defined for NetBSD core files. If the note type is less
9133 than the start of the machine-dependent note types, we don't
9136 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
9138 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
9142 switch (elf_header
.e_machine
)
9144 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
9145 and PT_GETFPREGS == mach+2. */
9150 case EM_SPARC32PLUS
:
9154 case NT_NETBSDCORE_FIRSTMACH
+0:
9155 return _("PT_GETREGS (reg structure)");
9156 case NT_NETBSDCORE_FIRSTMACH
+2:
9157 return _("PT_GETFPREGS (fpreg structure)");
9163 /* On all other arch's, PT_GETREGS == mach+1 and
9164 PT_GETFPREGS == mach+3. */
9168 case NT_NETBSDCORE_FIRSTMACH
+1:
9169 return _("PT_GETREGS (reg structure)");
9170 case NT_NETBSDCORE_FIRSTMACH
+3:
9171 return _("PT_GETFPREGS (fpreg structure)");
9177 sprintf (buff
, _("PT_FIRSTMACH+%d"), e_type
- NT_NETBSDCORE_FIRSTMACH
);
9181 /* Note that by the ELF standard, the name field is already null byte
9182 terminated, and namesz includes the terminating null byte.
9183 I.E. the value of namesz for the name "FSF" is 4.
9185 If the value of namesz is zero, there is no name present. */
9187 process_note (pnote
)
9188 Elf32_Internal_Note
* pnote
;
9192 if (pnote
->namesz
== 0)
9194 /* If there is no note name, then use the default set of
9195 note type strings. */
9196 nt
= get_note_type (pnote
->type
);
9198 else if (strncmp (pnote
->namedata
, "NetBSD-CORE", 11) == 0)
9200 /* NetBSD-specific core file notes. */
9201 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
9205 /* Don't recognize this note name; just use the default set of
9206 note type strings. */
9207 nt
= get_note_type (pnote
->type
);
9210 printf (" %s\t\t0x%08lx\t%s\n",
9211 pnote
->namesz
? pnote
->namedata
: "(NONE)",
9218 process_corefile_note_segment (file
, offset
, length
)
9223 Elf_External_Note
* pnotes
;
9224 Elf_External_Note
* external
;
9230 pnotes
= (Elf_External_Note
*) get_data (NULL
, file
, offset
, length
,
9237 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9238 (unsigned long) offset
, (unsigned long) length
);
9239 printf (_(" Owner\t\tData size\tDescription\n"));
9241 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
9243 Elf32_Internal_Note inote
;
9246 inote
.type
= BYTE_GET (external
->type
);
9247 inote
.namesz
= BYTE_GET (external
->namesz
);
9248 inote
.namedata
= external
->name
;
9249 inote
.descsz
= BYTE_GET (external
->descsz
);
9250 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
9251 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
9253 external
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
9255 /* Verify that name is null terminated. It appears that at least
9256 one version of Linux (RedHat 6.0) generates corefiles that don't
9257 comply with the ELF spec by failing to include the null byte in
9259 if (inote
.namedata
[inote
.namesz
] != '\0')
9261 temp
= malloc (inote
.namesz
+ 1);
9265 error (_("Out of memory\n"));
9270 strncpy (temp
, inote
.namedata
, inote
.namesz
);
9271 temp
[inote
.namesz
] = 0;
9273 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9274 inote
.namedata
= temp
;
9277 res
&= process_note (& inote
);
9292 process_corefile_note_segments (file
)
9295 Elf_Internal_Phdr
* program_headers
;
9296 Elf_Internal_Phdr
* segment
;
9300 program_headers
= (Elf_Internal_Phdr
*) malloc
9301 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
9303 if (program_headers
== NULL
)
9305 error (_("Out of memory\n"));
9310 i
= get_32bit_program_headers (file
, program_headers
);
9312 i
= get_64bit_program_headers (file
, program_headers
);
9316 free (program_headers
);
9320 for (i
= 0, segment
= program_headers
;
9321 i
< elf_header
.e_phnum
;
9324 if (segment
->p_type
== PT_NOTE
)
9325 res
&= process_corefile_note_segment (file
,
9326 (bfd_vma
) segment
->p_offset
,
9327 (bfd_vma
) segment
->p_filesz
);
9330 free (program_headers
);
9336 process_corefile_contents (file
)
9339 /* If we have not been asked to display the notes then do nothing. */
9343 /* If file is not a core file then exit. */
9344 if (elf_header
.e_type
!= ET_CORE
)
9347 /* No program headers means no NOTE segment. */
9348 if (elf_header
.e_phnum
== 0)
9350 printf (_("No note segments present in the core file.\n"));
9354 return process_corefile_note_segments (file
);
9358 process_arch_specific (file
)
9364 switch (elf_header
.e_machine
)
9367 case EM_MIPS_RS3_LE
:
9368 return process_mips_specific (file
);
9377 get_file_header (file
)
9380 /* Read in the identity array. */
9381 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
9384 /* Determine how to read the rest of the header. */
9385 switch (elf_header
.e_ident
[EI_DATA
])
9387 default: /* fall through */
9388 case ELFDATANONE
: /* fall through */
9389 case ELFDATA2LSB
: byte_get
= byte_get_little_endian
; break;
9390 case ELFDATA2MSB
: byte_get
= byte_get_big_endian
; break;
9393 /* For now we only support 32 bit and 64 bit ELF files. */
9394 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
9396 /* Read in the rest of the header. */
9399 Elf32_External_Ehdr ehdr32
;
9401 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
9404 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
9405 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
9406 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
9407 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
9408 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
9409 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
9410 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
9411 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
9412 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
9413 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
9414 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
9415 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
9416 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
9420 Elf64_External_Ehdr ehdr64
;
9422 /* If we have been compiled with sizeof (bfd_vma) == 4, then
9423 we will not be able to cope with the 64bit data found in
9424 64 ELF files. Detect this now and abort before we start
9425 overwritting things. */
9426 if (sizeof (bfd_vma
) < 8)
9428 error (_("This instance of readelf has been built without support for a\n\
9429 64 bit data type and so it cannot read 64 bit ELF files.\n"));
9433 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
9436 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
9437 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
9438 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
9439 elf_header
.e_entry
= BYTE_GET8 (ehdr64
.e_entry
);
9440 elf_header
.e_phoff
= BYTE_GET8 (ehdr64
.e_phoff
);
9441 elf_header
.e_shoff
= BYTE_GET8 (ehdr64
.e_shoff
);
9442 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
9443 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
9444 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
9445 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
9446 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
9447 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
9448 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
9451 /* There may be some extensions in the first section header. Don't
9452 bomb if we can't read it. */
9454 get_32bit_section_headers (file
, 1);
9456 get_64bit_section_headers (file
, 1);
9462 process_file (file_name
)
9466 struct stat statbuf
;
9469 if (stat (file_name
, & statbuf
) < 0)
9471 error (_("Cannot stat input file %s.\n"), file_name
);
9475 file
= fopen (file_name
, "rb");
9478 error (_("Input file %s not found.\n"), file_name
);
9482 if (! get_file_header (file
))
9484 error (_("%s: Failed to read file header\n"), file_name
);
9489 /* Initialise per file variables. */
9490 for (i
= NUM_ELEM (version_info
); i
--;)
9491 version_info
[i
] = 0;
9493 for (i
= NUM_ELEM (dynamic_info
); i
--;)
9494 dynamic_info
[i
] = 0;
9496 /* Process the file. */
9498 printf (_("\nFile: %s\n"), file_name
);
9500 if (! process_file_header ())
9506 process_section_headers (file
);
9508 process_program_headers (file
);
9510 process_dynamic_segment (file
);
9512 process_relocs (file
);
9514 process_unwind (file
);
9516 process_symbol_table (file
);
9518 process_syminfo (file
);
9520 process_version_sections (file
);
9522 process_section_contents (file
);
9524 process_corefile_contents (file
);
9526 process_arch_specific (file
);
9530 if (section_headers
)
9532 free (section_headers
);
9533 section_headers
= NULL
;
9538 free (string_table
);
9539 string_table
= NULL
;
9540 string_table_length
= 0;
9543 if (dynamic_strings
)
9545 free (dynamic_strings
);
9546 dynamic_strings
= NULL
;
9549 if (dynamic_symbols
)
9551 free (dynamic_symbols
);
9552 dynamic_symbols
= NULL
;
9553 num_dynamic_syms
= 0;
9556 if (dynamic_syminfo
)
9558 free (dynamic_syminfo
);
9559 dynamic_syminfo
= NULL
;
9565 #ifdef SUPPORT_DISASSEMBLY
9566 /* Needed by the i386 disassembler. For extra credit, someone could
9567 fix this so that we insert symbolic addresses here, esp for GOT/PLT
9571 print_address (unsigned int addr
, FILE * outfile
)
9573 fprintf (outfile
,"0x%8.8x", addr
);
9576 /* Needed by the i386 disassembler. */
9578 db_task_printsym (unsigned int addr
)
9580 print_address (addr
, stderr
);
9584 int main
PARAMS ((int, char **));
9593 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9594 setlocale (LC_MESSAGES
, "");
9596 #if defined (HAVE_SETLOCALE)
9597 setlocale (LC_CTYPE
, "");
9599 bindtextdomain (PACKAGE
, LOCALEDIR
);
9600 textdomain (PACKAGE
);
9602 parse_args (argc
, argv
);
9604 if (optind
< (argc
- 1))
9608 while (optind
< argc
)
9609 err
|= process_file (argv
[optind
++]);
9611 if (dump_sects
!= NULL
)