1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 #include <sys/types.h>
32 /* Define BFD64 here, even if our default architecture is 32 bit ELF
33 as this will allow us to read in and parse 64bit and 32bit ELF files.
34 Only do this if we belive that the compiler can support a 64 bit
35 data type. For now we only rely on GCC being able to do this. */
41 #include "elf/common.h"
42 #include "elf/external.h"
43 #include "elf/internal.h"
44 #include "elf/dwarf2.h"
46 /* The following headers use the elf/reloc-macros.h file to
47 automatically generate relocation recognition functions
48 such as elf_mips_reloc_type() */
50 #define RELOC_MACROS_GEN_FUNC
56 #include "elf/alpha.h"
59 #include "elf/sparc.h"
64 #include "elf/mn10200.h"
65 #include "elf/mn10300.h"
70 #include "elf/mcore.h"
78 #include "elf/x86-64.h"
80 #include "elf/xstormy16.h"
85 char * program_name
= "readelf";
86 unsigned int dynamic_addr
;
87 bfd_size_type dynamic_size
;
88 unsigned int rela_addr
;
89 unsigned int rela_size
;
90 char * dynamic_strings
;
92 unsigned long string_table_length
;
93 unsigned long num_dynamic_syms
;
94 Elf_Internal_Sym
* dynamic_symbols
;
95 Elf_Internal_Syminfo
* dynamic_syminfo
;
96 unsigned long dynamic_syminfo_offset
;
97 unsigned int dynamic_syminfo_nent
;
98 char program_interpreter
[64];
99 int dynamic_info
[DT_JMPREL
+ 1];
100 int version_info
[16];
102 Elf_Internal_Ehdr elf_header
;
103 Elf_Internal_Shdr
* section_headers
;
104 Elf_Internal_Dyn
* dynamic_segment
;
105 Elf_Internal_Shdr
* symtab_shndx_hdr
;
113 int do_using_dynamic
;
121 int do_debug_abbrevs
;
123 int do_debug_pubnames
;
124 int do_debug_aranges
;
126 int do_debug_frames_interp
;
127 int do_debug_macinfo
;
133 /* A dynamic array of flags indicating which sections require dumping. */
134 char * dump_sects
= NULL
;
135 unsigned int num_dump_sects
= 0;
137 #define HEX_DUMP (1 << 0)
138 #define DISASS_DUMP (1 << 1)
139 #define DEBUG_DUMP (1 << 2)
141 /* How to rpint a vma value. */
142 typedef enum print_mode
154 /* Forward declarations for dumb compilers. */
155 static void print_vma
PARAMS ((bfd_vma
, print_mode
));
156 static void print_symbol
PARAMS ((int, char *));
157 static bfd_vma (* byte_get
) PARAMS ((unsigned char *, int));
158 static bfd_vma byte_get_little_endian
PARAMS ((unsigned char *, int));
159 static bfd_vma byte_get_big_endian
PARAMS ((unsigned char *, int));
160 static const char * get_mips_dynamic_type
PARAMS ((unsigned long));
161 static const char * get_sparc64_dynamic_type
PARAMS ((unsigned long));
162 static const char * get_parisc_dynamic_type
PARAMS ((unsigned long));
163 static const char * get_dynamic_type
PARAMS ((unsigned long));
164 static int slurp_rela_relocs
PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela
**, unsigned long *));
165 static int slurp_rel_relocs
PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rel
**, unsigned long *));
166 static int dump_relocations
PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym
*, unsigned long, char *, int));
167 static char * get_file_type
PARAMS ((unsigned));
168 static char * get_machine_name
PARAMS ((unsigned));
169 static void decode_ARM_machine_flags
PARAMS ((unsigned, char []));
170 static char * get_machine_flags
PARAMS ((unsigned, unsigned));
171 static const char * get_mips_segment_type
PARAMS ((unsigned long));
172 static const char * get_parisc_segment_type
PARAMS ((unsigned long));
173 static const char * get_ia64_segment_type
PARAMS ((unsigned long));
174 static const char * get_segment_type
PARAMS ((unsigned long));
175 static const char * get_mips_section_type_name
PARAMS ((unsigned int));
176 static const char * get_parisc_section_type_name
PARAMS ((unsigned int));
177 static const char * get_ia64_section_type_name
PARAMS ((unsigned int));
178 static const char * get_section_type_name
PARAMS ((unsigned int));
179 static const char * get_symbol_binding
PARAMS ((unsigned int));
180 static const char * get_symbol_type
PARAMS ((unsigned int));
181 static const char * get_symbol_visibility
PARAMS ((unsigned int));
182 static const char * get_symbol_index_type
PARAMS ((unsigned int));
183 static const char * get_dynamic_flags
PARAMS ((bfd_vma
));
184 static void usage
PARAMS ((void));
185 static void parse_args
PARAMS ((int, char **));
186 static int process_file_header
PARAMS ((void));
187 static int process_program_headers
PARAMS ((FILE *));
188 static int process_section_headers
PARAMS ((FILE *));
189 static int process_unwind
PARAMS ((FILE *));
190 static void dynamic_segment_mips_val
PARAMS ((Elf_Internal_Dyn
*));
191 static void dynamic_segment_parisc_val
PARAMS ((Elf_Internal_Dyn
*));
192 static int process_dynamic_segment
PARAMS ((FILE *));
193 static int process_symbol_table
PARAMS ((FILE *));
194 static int process_syminfo
PARAMS ((FILE *));
195 static int process_section_contents
PARAMS ((FILE *));
196 static void process_mips_fpe_exception
PARAMS ((int));
197 static int process_mips_specific
PARAMS ((FILE *));
198 static int process_file
PARAMS ((char *));
199 static int process_relocs
PARAMS ((FILE *));
200 static int process_version_sections
PARAMS ((FILE *));
201 static char * get_ver_flags
PARAMS ((unsigned int));
202 static int get_32bit_section_headers
PARAMS ((FILE *, unsigned int));
203 static int get_64bit_section_headers
PARAMS ((FILE *, unsigned int));
204 static int get_32bit_program_headers
PARAMS ((FILE *, Elf_Internal_Phdr
*));
205 static int get_64bit_program_headers
PARAMS ((FILE *, Elf_Internal_Phdr
*));
206 static int get_file_header
PARAMS ((FILE *));
207 static Elf_Internal_Sym
* get_32bit_elf_symbols
PARAMS ((FILE *, Elf_Internal_Shdr
*));
208 static Elf_Internal_Sym
* get_64bit_elf_symbols
PARAMS ((FILE *, Elf_Internal_Shdr
*));
209 static const char * get_elf_section_flags
PARAMS ((bfd_vma
));
210 static int * get_dynamic_data
PARAMS ((FILE *, unsigned int));
211 static int get_32bit_dynamic_segment
PARAMS ((FILE *));
212 static int get_64bit_dynamic_segment
PARAMS ((FILE *));
213 #ifdef SUPPORT_DISASSEMBLY
214 static int disassemble_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
216 static int dump_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
217 static int display_debug_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
218 static int display_debug_info
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
219 static int display_debug_not_supported
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
220 static int prescan_debug_info
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
221 static int display_debug_lines
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
222 static int display_debug_pubnames
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
223 static int display_debug_abbrev
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
224 static int display_debug_aranges
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
225 static int display_debug_frames
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
226 static int display_debug_macinfo
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
227 static int display_debug_str
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
228 static unsigned char * process_abbrev_section
PARAMS ((unsigned char *, unsigned char *));
229 static void load_debug_str
PARAMS ((FILE *));
230 static void free_debug_str
PARAMS ((void));
231 static const char * fetch_indirect_string
PARAMS ((unsigned long));
232 static unsigned long read_leb128
PARAMS ((unsigned char *, int *, int));
233 static int process_extended_line_op
PARAMS ((unsigned char *, int, int));
234 static void reset_state_machine
PARAMS ((int));
235 static char * get_TAG_name
PARAMS ((unsigned long));
236 static char * get_AT_name
PARAMS ((unsigned long));
237 static char * get_FORM_name
PARAMS ((unsigned long));
238 static void free_abbrevs
PARAMS ((void));
239 static void add_abbrev
PARAMS ((unsigned long, unsigned long, int));
240 static void add_abbrev_attr
PARAMS ((unsigned long, unsigned long));
241 static unsigned char * read_and_display_attr
PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
242 static unsigned char * read_and_display_attr_value
PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
243 static unsigned char * display_block
PARAMS ((unsigned char *, unsigned long));
244 static void decode_location_expression
PARAMS ((unsigned char *, unsigned int, unsigned long));
245 static void request_dump
PARAMS ((unsigned int, int));
246 static const char * get_elf_class
PARAMS ((unsigned int));
247 static const char * get_data_encoding
PARAMS ((unsigned int));
248 static const char * get_osabi_name
PARAMS ((unsigned int));
249 static int guess_is_rela
PARAMS ((unsigned long));
250 static char * get_note_type
PARAMS ((unsigned int));
251 static int process_note
PARAMS ((Elf32_Internal_Note
*));
252 static int process_corefile_note_segment
PARAMS ((FILE *, bfd_vma
, bfd_vma
));
253 static int process_corefile_note_segments
PARAMS ((FILE *));
254 static int process_corefile_contents
PARAMS ((FILE *));
255 static int process_arch_specific
PARAMS ((FILE *));
257 typedef int Elf32_Word
;
265 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
266 ((X)->sh_name >= string_table_length \
267 ? "<corrupt>" : string_table + (X)->sh_name))
269 /* Given st_shndx I, map to section_headers index. */
270 #define SECTION_HEADER_INDEX(I) \
271 ((I) < SHN_LORESERVE \
273 : ((I) <= SHN_HIRESERVE \
275 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
277 /* Reverse of the above. */
278 #define SECTION_HEADER_NUM(N) \
279 ((N) < SHN_LORESERVE \
281 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
283 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
285 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
287 #define BYTE_GET(field) byte_get (field, sizeof (field))
289 /* If we can support a 64 bit data type then BFD64 should be defined
290 and sizeof (bfd_vma) == 8. In this case when translating from an
291 external 8 byte field to an internal field, we can assume that the
292 internal field is also 8 bytes wide and so we can extract all the data.
293 If, however, BFD64 is not defined, then we must assume that the
294 internal data structure only has 4 byte wide fields that are the
295 equivalent of the 8 byte wide external counterparts, and so we must
296 truncate the data. */
298 #define BYTE_GET8(field) byte_get (field, -8)
300 #define BYTE_GET8(field) byte_get (field, 8)
303 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
305 #define GET_ELF_SYMBOLS(file, section) \
306 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
307 : get_64bit_elf_symbols (file, section))
311 error
VPARAMS ((const char *message
, ...))
313 VA_OPEN (args
, message
);
314 VA_FIXEDARG (args
, const char *, message
);
316 fprintf (stderr
, _("%s: Error: "), program_name
);
317 vfprintf (stderr
, message
, args
);
322 warn
VPARAMS ((const char *message
, ...))
324 VA_OPEN (args
, message
);
325 VA_FIXEDARG (args
, const char *, message
);
327 fprintf (stderr
, _("%s: Warning: "), program_name
);
328 vfprintf (stderr
, message
, args
);
332 static PTR get_data
PARAMS ((PTR
, FILE *, long, size_t, const char *));
335 get_data (var
, file
, offset
, size
, reason
)
347 if (fseek (file
, offset
, SEEK_SET
))
349 error (_("Unable to seek to %x for %s\n"), offset
, reason
);
356 mvar
= (PTR
) malloc (size
);
360 error (_("Out of memory allocating %d bytes for %s\n"),
366 if (fread (mvar
, size
, 1, file
) != 1)
368 error (_("Unable to read in %d bytes of %s\n"), size
, reason
);
378 byte_get_little_endian (field
, size
)
379 unsigned char * field
;
388 return ((unsigned int) (field
[0]))
389 | (((unsigned int) (field
[1])) << 8);
393 /* We want to extract data from an 8 byte wide field and
394 place it into a 4 byte wide field. Since this is a little
395 endian source we can juts use the 4 byte extraction code. */
399 return ((unsigned long) (field
[0]))
400 | (((unsigned long) (field
[1])) << 8)
401 | (((unsigned long) (field
[2])) << 16)
402 | (((unsigned long) (field
[3])) << 24);
407 /* This is a special case, generated by the BYTE_GET8 macro.
408 It means that we are loading an 8 byte value from a field
409 in an external structure into an 8 byte value in a field
410 in an internal strcuture. */
411 return ((bfd_vma
) (field
[0]))
412 | (((bfd_vma
) (field
[1])) << 8)
413 | (((bfd_vma
) (field
[2])) << 16)
414 | (((bfd_vma
) (field
[3])) << 24)
415 | (((bfd_vma
) (field
[4])) << 32)
416 | (((bfd_vma
) (field
[5])) << 40)
417 | (((bfd_vma
) (field
[6])) << 48)
418 | (((bfd_vma
) (field
[7])) << 56);
421 error (_("Unhandled data length: %d\n"), size
);
426 /* Print a VMA value. */
428 print_vma (vma
, mode
)
438 case FULL_HEX
: printf ("0x"); /* drop through */
439 case LONG_HEX
: printf ("%8.8lx", (unsigned long) vma
); break;
440 case PREFIX_HEX
: printf ("0x"); /* drop through */
441 case HEX
: printf ("%lx", (unsigned long) vma
); break;
442 case DEC
: printf ("%ld", (unsigned long) vma
); break;
443 case DEC_5
: printf ("%5ld", (long) vma
); break;
444 case UNSIGNED
: printf ("%lu", (unsigned long) vma
); break;
465 #if BFD_HOST_64BIT_LONG
468 if (_bfd_int64_high (vma
))
469 printf ("%lx%8.8lx", _bfd_int64_high (vma
), _bfd_int64_low (vma
));
471 printf ("%lx", _bfd_int64_low (vma
));
476 #if BFD_HOST_64BIT_LONG
479 if (_bfd_int64_high (vma
))
481 printf ("++%ld", _bfd_int64_low (vma
));
483 printf ("%ld", _bfd_int64_low (vma
));
488 #if BFD_HOST_64BIT_LONG
489 printf ("%5ld", vma
);
491 if (_bfd_int64_high (vma
))
493 printf ("++%ld", _bfd_int64_low (vma
));
495 printf ("%5ld", _bfd_int64_low (vma
));
500 #if BFD_HOST_64BIT_LONG
503 if (_bfd_int64_high (vma
))
505 printf ("++%lu", _bfd_int64_low (vma
));
507 printf ("%lu", _bfd_int64_low (vma
));
515 /* Display a symbol on stdout. If do_wide is not true then
516 format the symbol to be at most WIDTH characters,
517 truhncating as necessary. If WIDTH is negative then
518 format the string to be exactly - WIDTH characters,
519 truncating or padding as necessary. */
522 print_symbol (width
, symbol
)
529 printf ("%-*.*s", width
, width
, symbol
);
531 printf ("%-.*s", width
, symbol
);
535 byte_get_big_endian (field
, size
)
536 unsigned char * field
;
545 return ((unsigned int) (field
[1])) | (((int) (field
[0])) << 8);
548 return ((unsigned long) (field
[3]))
549 | (((unsigned long) (field
[2])) << 8)
550 | (((unsigned long) (field
[1])) << 16)
551 | (((unsigned long) (field
[0])) << 24);
555 /* Although we are extracing data from an 8 byte wide field, we
556 are returning only 4 bytes of data. */
557 return ((unsigned long) (field
[7]))
558 | (((unsigned long) (field
[6])) << 8)
559 | (((unsigned long) (field
[5])) << 16)
560 | (((unsigned long) (field
[4])) << 24);
564 /* This is a special case, generated by the BYTE_GET8 macro.
565 It means that we are loading an 8 byte value from a field
566 in an external structure into an 8 byte value in a field
567 in an internal strcuture. */
568 return ((bfd_vma
) (field
[7]))
569 | (((bfd_vma
) (field
[6])) << 8)
570 | (((bfd_vma
) (field
[5])) << 16)
571 | (((bfd_vma
) (field
[4])) << 24)
572 | (((bfd_vma
) (field
[3])) << 32)
573 | (((bfd_vma
) (field
[2])) << 40)
574 | (((bfd_vma
) (field
[1])) << 48)
575 | (((bfd_vma
) (field
[0])) << 56);
579 error (_("Unhandled data length: %d\n"), size
);
584 /* Guess the relocation size commonly used by the specific machines. */
587 guess_is_rela (e_machine
)
588 unsigned long e_machine
;
592 /* Targets that use REL relocations. */
605 /* Targets that use RELA relocations. */
619 case EM_CYGNUS_MN10200
:
621 case EM_CYGNUS_MN10300
:
658 warn (_("Don't know about relocations on this machine architecture\n"));
664 slurp_rela_relocs (file
, rel_offset
, rel_size
, relasp
, nrelasp
)
666 unsigned long rel_offset
;
667 unsigned long rel_size
;
668 Elf_Internal_Rela
**relasp
;
669 unsigned long *nrelasp
;
671 Elf_Internal_Rela
*relas
;
672 unsigned long nrelas
;
677 Elf32_External_Rela
* erelas
;
679 erelas
= (Elf32_External_Rela
*) get_data (NULL
, file
, rel_offset
,
680 rel_size
, _("relocs"));
684 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
686 relas
= (Elf_Internal_Rela
*)
687 malloc (nrelas
* sizeof (Elf_Internal_Rela
));
691 error(_("out of memory parsing relocs"));
695 for (i
= 0; i
< nrelas
; i
++)
697 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
698 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
699 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
706 Elf64_External_Rela
* erelas
;
708 erelas
= (Elf64_External_Rela
*) get_data (NULL
, file
, rel_offset
,
709 rel_size
, _("relocs"));
713 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
715 relas
= (Elf_Internal_Rela
*)
716 malloc (nrelas
* sizeof (Elf_Internal_Rela
));
720 error(_("out of memory parsing relocs"));
724 for (i
= 0; i
< nrelas
; i
++)
726 relas
[i
].r_offset
= BYTE_GET8 (erelas
[i
].r_offset
);
727 relas
[i
].r_info
= BYTE_GET8 (erelas
[i
].r_info
);
728 relas
[i
].r_addend
= BYTE_GET8 (erelas
[i
].r_addend
);
739 slurp_rel_relocs (file
, rel_offset
, rel_size
, relsp
, nrelsp
)
741 unsigned long rel_offset
;
742 unsigned long rel_size
;
743 Elf_Internal_Rel
**relsp
;
744 unsigned long *nrelsp
;
746 Elf_Internal_Rel
*rels
;
752 Elf32_External_Rel
* erels
;
754 erels
= (Elf32_External_Rel
*) get_data (NULL
, file
, rel_offset
,
755 rel_size
, _("relocs"));
759 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
761 rels
= (Elf_Internal_Rel
*) malloc (nrels
* sizeof (Elf_Internal_Rel
));
765 error(_("out of memory parsing relocs"));
769 for (i
= 0; i
< nrels
; i
++)
771 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
772 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
779 Elf64_External_Rel
* erels
;
781 erels
= (Elf64_External_Rel
*) get_data (NULL
, file
, rel_offset
,
782 rel_size
, _("relocs"));
786 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
788 rels
= (Elf_Internal_Rel
*) malloc (nrels
* sizeof (Elf_Internal_Rel
));
792 error(_("out of memory parsing relocs"));
796 for (i
= 0; i
< nrels
; i
++)
798 rels
[i
].r_offset
= BYTE_GET8 (erels
[i
].r_offset
);
799 rels
[i
].r_info
= BYTE_GET8 (erels
[i
].r_info
);
809 /* Display the contents of the relocation data found at the specified offset. */
811 dump_relocations (file
, rel_offset
, rel_size
, symtab
, nsyms
, strtab
, is_rela
)
813 unsigned long rel_offset
;
814 unsigned long rel_size
;
815 Elf_Internal_Sym
* symtab
;
821 Elf_Internal_Rel
* rels
;
822 Elf_Internal_Rela
* relas
;
825 if (is_rela
== UNKNOWN
)
826 is_rela
= guess_is_rela (elf_header
.e_machine
);
830 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &relas
, &rel_size
))
835 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
843 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
846 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
852 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
855 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
858 for (i
= 0; i
< rel_size
; i
++)
863 bfd_vma symtab_index
;
868 offset
= relas
[i
].r_offset
;
869 info
= relas
[i
].r_info
;
873 offset
= rels
[i
].r_offset
;
874 info
= rels
[i
].r_info
;
879 type
= ELF32_R_TYPE (info
);
880 symtab_index
= ELF32_R_SYM (info
);
884 if (elf_header
.e_machine
== EM_SPARCV9
)
885 type
= ELF64_R_TYPE_ID (info
);
887 type
= ELF64_R_TYPE (info
);
888 /* The #ifdef BFD64 below is to prevent a compile time warning.
889 We know that if we do not have a 64 bit data type that we
890 will never execute this code anyway. */
892 symtab_index
= ELF64_R_SYM (info
);
898 #ifdef _bfd_int64_low
899 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
901 printf ("%8.8lx %8.8lx ", offset
, info
);
906 #ifdef _bfd_int64_low
907 printf ("%8.8lx%8.8lx %8.8lx%8.8lx ",
908 _bfd_int64_high (offset
),
909 _bfd_int64_low (offset
),
910 _bfd_int64_high (info
),
911 _bfd_int64_low (info
));
913 printf ("%16.16lx %16.16lx ", offset
, info
);
917 switch (elf_header
.e_machine
)
925 rtype
= elf_m32r_reloc_type (type
);
930 rtype
= elf_i386_reloc_type (type
);
934 rtype
= elf_m68k_reloc_type (type
);
938 rtype
= elf_i960_reloc_type (type
);
943 rtype
= elf_avr_reloc_type (type
);
950 rtype
= elf_sparc_reloc_type (type
);
955 rtype
= v850_reloc_type (type
);
960 rtype
= elf_d10v_reloc_type (type
);
965 rtype
= elf_d30v_reloc_type (type
);
969 rtype
= elf_sh_reloc_type (type
);
973 case EM_CYGNUS_MN10300
:
974 rtype
= elf_mn10300_reloc_type (type
);
978 case EM_CYGNUS_MN10200
:
979 rtype
= elf_mn10200_reloc_type (type
);
984 rtype
= elf_fr30_reloc_type (type
);
988 rtype
= elf_mcore_reloc_type (type
);
992 rtype
= elf_mmix_reloc_type (type
);
997 rtype
= elf_ppc_reloc_type (type
);
1001 case EM_MIPS_RS3_LE
:
1002 rtype
= elf_mips_reloc_type (type
);
1006 rtype
= elf_alpha_reloc_type (type
);
1010 rtype
= elf_arm_reloc_type (type
);
1014 rtype
= elf_arc_reloc_type (type
);
1018 rtype
= elf_hppa_reloc_type (type
);
1024 rtype
= elf_h8_reloc_type (type
);
1029 rtype
= elf_pj_reloc_type (type
);
1032 rtype
= elf_ia64_reloc_type (type
);
1036 rtype
= elf_cris_reloc_type (type
);
1040 rtype
= elf_i860_reloc_type (type
);
1044 rtype
= elf_x86_64_reloc_type (type
);
1049 rtype
= elf_s390_reloc_type (type
);
1053 rtype
= elf_xstormy16_reloc_type (type
);
1058 #ifdef _bfd_int64_low
1059 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type
));
1061 printf (_("unrecognised: %-7lx"), type
);
1064 printf ("%-21.21s", rtype
);
1068 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1069 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1072 Elf_Internal_Sym
* psym
;
1074 psym
= symtab
+ symtab_index
;
1077 print_vma (psym
->st_value
, LONG_HEX
);
1080 if (psym
->st_name
== 0)
1081 print_symbol (-25, SECTION_NAME (section_headers
+ psym
->st_shndx
));
1082 else if (strtab
== NULL
)
1083 printf (_("<string table index %3ld>"), psym
->st_name
);
1085 print_symbol (-25, strtab
+ psym
->st_name
);
1088 printf (" + %lx", (unsigned long) relas
[i
].r_addend
);
1093 printf ("%*c", is_32bit_elf
? 34 : 26, ' ');
1094 print_vma (relas
[i
].r_addend
, LONG_HEX
);
1097 if (elf_header
.e_machine
== EM_SPARCV9
1098 && !strcmp (rtype
, "R_SPARC_OLO10"))
1099 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1113 get_mips_dynamic_type (type
)
1118 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1119 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1120 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1121 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1122 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1123 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1124 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1125 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1126 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1127 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1128 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1129 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1130 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1131 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1132 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1133 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1134 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1135 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1136 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1137 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1138 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1139 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1140 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1141 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1142 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1143 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1144 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1145 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1146 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1147 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1148 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1149 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1150 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1151 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1152 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1153 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1154 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1155 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1156 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1157 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1158 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1159 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1160 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1167 get_sparc64_dynamic_type (type
)
1172 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1179 get_parisc_dynamic_type (type
)
1184 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1185 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1186 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1187 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1188 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1189 case DT_HP_PREINIT
: return "HP_PREINIT";
1190 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1191 case DT_HP_NEEDED
: return "HP_NEEDED";
1192 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1193 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1194 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1195 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1196 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1203 get_dynamic_type (type
)
1206 static char buff
[32];
1210 case DT_NULL
: return "NULL";
1211 case DT_NEEDED
: return "NEEDED";
1212 case DT_PLTRELSZ
: return "PLTRELSZ";
1213 case DT_PLTGOT
: return "PLTGOT";
1214 case DT_HASH
: return "HASH";
1215 case DT_STRTAB
: return "STRTAB";
1216 case DT_SYMTAB
: return "SYMTAB";
1217 case DT_RELA
: return "RELA";
1218 case DT_RELASZ
: return "RELASZ";
1219 case DT_RELAENT
: return "RELAENT";
1220 case DT_STRSZ
: return "STRSZ";
1221 case DT_SYMENT
: return "SYMENT";
1222 case DT_INIT
: return "INIT";
1223 case DT_FINI
: return "FINI";
1224 case DT_SONAME
: return "SONAME";
1225 case DT_RPATH
: return "RPATH";
1226 case DT_SYMBOLIC
: return "SYMBOLIC";
1227 case DT_REL
: return "REL";
1228 case DT_RELSZ
: return "RELSZ";
1229 case DT_RELENT
: return "RELENT";
1230 case DT_PLTREL
: return "PLTREL";
1231 case DT_DEBUG
: return "DEBUG";
1232 case DT_TEXTREL
: return "TEXTREL";
1233 case DT_JMPREL
: return "JMPREL";
1234 case DT_BIND_NOW
: return "BIND_NOW";
1235 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1236 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1237 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1238 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1239 case DT_RUNPATH
: return "RUNPATH";
1240 case DT_FLAGS
: return "FLAGS";
1242 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1243 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1245 case DT_CHECKSUM
: return "CHECKSUM";
1246 case DT_PLTPADSZ
: return "PLTPADSZ";
1247 case DT_MOVEENT
: return "MOVEENT";
1248 case DT_MOVESZ
: return "MOVESZ";
1249 case DT_FEATURE
: return "FEATURE";
1250 case DT_POSFLAG_1
: return "POSFLAG_1";
1251 case DT_SYMINSZ
: return "SYMINSZ";
1252 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1254 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1255 case DT_CONFIG
: return "CONFIG";
1256 case DT_DEPAUDIT
: return "DEPAUDIT";
1257 case DT_AUDIT
: return "AUDIT";
1258 case DT_PLTPAD
: return "PLTPAD";
1259 case DT_MOVETAB
: return "MOVETAB";
1260 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1262 case DT_VERSYM
: return "VERSYM";
1264 case DT_RELACOUNT
: return "RELACOUNT";
1265 case DT_RELCOUNT
: return "RELCOUNT";
1266 case DT_FLAGS_1
: return "FLAGS_1";
1267 case DT_VERDEF
: return "VERDEF";
1268 case DT_VERDEFNUM
: return "VERDEFNUM";
1269 case DT_VERNEED
: return "VERNEED";
1270 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1272 case DT_AUXILIARY
: return "AUXILIARY";
1273 case DT_USED
: return "USED";
1274 case DT_FILTER
: return "FILTER";
1277 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1279 const char * result
;
1281 switch (elf_header
.e_machine
)
1284 case EM_MIPS_RS3_LE
:
1285 result
= get_mips_dynamic_type (type
);
1288 result
= get_sparc64_dynamic_type (type
);
1298 sprintf (buff
, _("Processor Specific: %lx"), type
);
1300 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1302 const char * result
;
1304 switch (elf_header
.e_machine
)
1307 result
= get_parisc_dynamic_type (type
);
1317 sprintf (buff
, _("Operating System specific: %lx"), type
);
1320 sprintf (buff
, _("<unknown>: %lx"), type
);
1327 get_file_type (e_type
)
1330 static char buff
[32];
1334 case ET_NONE
: return _("NONE (None)");
1335 case ET_REL
: return _("REL (Relocatable file)");
1336 case ET_EXEC
: return _("EXEC (Executable file)");
1337 case ET_DYN
: return _("DYN (Shared object file)");
1338 case ET_CORE
: return _("CORE (Core file)");
1341 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1342 sprintf (buff
, _("Processor Specific: (%x)"), e_type
);
1343 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1344 sprintf (buff
, _("OS Specific: (%x)"), e_type
);
1346 sprintf (buff
, _("<unknown>: %x"), e_type
);
1352 get_machine_name (e_machine
)
1355 static char buff
[64]; /* XXX */
1359 case EM_NONE
: return _("None");
1360 case EM_M32
: return "WE32100";
1361 case EM_SPARC
: return "Sparc";
1362 case EM_386
: return "Intel 80386";
1363 case EM_68K
: return "MC68000";
1364 case EM_88K
: return "MC88000";
1365 case EM_486
: return "Intel 80486";
1366 case EM_860
: return "Intel 80860";
1367 case EM_MIPS
: return "MIPS R3000";
1368 case EM_S370
: return "IBM System/370";
1369 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1370 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1371 case EM_PARISC
: return "HPPA";
1372 case EM_PPC_OLD
: return "Power PC (old)";
1373 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1374 case EM_960
: return "Intel 90860";
1375 case EM_PPC
: return "PowerPC";
1376 case EM_V800
: return "NEC V800";
1377 case EM_FR20
: return "Fujitsu FR20";
1378 case EM_RH32
: return "TRW RH32";
1379 case EM_MCORE
: return "MCORE";
1380 case EM_ARM
: return "ARM";
1381 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1382 case EM_SH
: return "Hitachi SH";
1383 case EM_SPARCV9
: return "Sparc v9";
1384 case EM_TRICORE
: return "Siemens Tricore";
1385 case EM_ARC
: return "ARC";
1386 case EM_H8_300
: return "Hitachi H8/300";
1387 case EM_H8_300H
: return "Hitachi H8/300H";
1388 case EM_H8S
: return "Hitachi H8S";
1389 case EM_H8_500
: return "Hitachi H8/500";
1390 case EM_IA_64
: return "Intel IA-64";
1391 case EM_MIPS_X
: return "Stanford MIPS-X";
1392 case EM_COLDFIRE
: return "Motorola Coldfire";
1393 case EM_68HC12
: return "Motorola M68HC12";
1394 case EM_ALPHA
: return "Alpha";
1395 case EM_CYGNUS_D10V
:
1396 case EM_D10V
: return "d10v";
1397 case EM_CYGNUS_D30V
:
1398 case EM_D30V
: return "d30v";
1399 case EM_CYGNUS_M32R
:
1400 case EM_M32R
: return "Mitsubishi M32r";
1401 case EM_CYGNUS_V850
:
1402 case EM_V850
: return "NEC v850";
1403 case EM_CYGNUS_MN10300
:
1404 case EM_MN10300
: return "mn10300";
1405 case EM_CYGNUS_MN10200
:
1406 case EM_MN10200
: return "mn10200";
1407 case EM_CYGNUS_FR30
:
1408 case EM_FR30
: return "Fujitsu FR30";
1410 case EM_PJ
: return "picoJava";
1411 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1412 case EM_PCP
: return "Siemens PCP";
1413 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1414 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1415 case EM_STARCORE
: return "Motorola Star*Core processor";
1416 case EM_ME16
: return "Toyota ME16 processor";
1417 case EM_ST100
: return "STMicroelectronics ST100 processor";
1418 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1419 case EM_FX66
: return "Siemens FX66 microcontroller";
1420 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1421 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1422 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1423 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1424 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1425 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1426 case EM_SVX
: return "Silicon Graphics SVx";
1427 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1428 case EM_VAX
: return "Digital VAX";
1430 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1431 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1432 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1433 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1434 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1435 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1436 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1437 case EM_PRISM
: return "SiTera Prism";
1438 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1440 case EM_S390
: return "IBM S/390";
1441 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1443 sprintf (buff
, _("<unknown>: %x"), e_machine
);
1449 decode_ARM_machine_flags (e_flags
, buf
)
1456 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1457 e_flags
&= ~ EF_ARM_EABIMASK
;
1459 /* Handle "generic" ARM flags. */
1460 if (e_flags
& EF_ARM_RELEXEC
)
1462 strcat (buf
, ", relocatable executable");
1463 e_flags
&= ~ EF_ARM_RELEXEC
;
1466 if (e_flags
& EF_ARM_HASENTRY
)
1468 strcat (buf
, ", has entry point");
1469 e_flags
&= ~ EF_ARM_HASENTRY
;
1472 /* Now handle EABI specific flags. */
1476 strcat (buf
, ", <unrecognised EABI>");
1481 case EF_ARM_EABI_VER1
:
1482 strcat (buf
, ", Version1 EABI");
1487 /* Process flags one bit at a time. */
1488 flag
= e_flags
& - e_flags
;
1493 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1494 strcat (buf
, ", sorted symbol tables");
1504 case EF_ARM_EABI_VER2
:
1505 strcat (buf
, ", Version2 EABI");
1510 /* Process flags one bit at a time. */
1511 flag
= e_flags
& - e_flags
;
1516 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1517 strcat (buf
, ", sorted symbol tables");
1520 case EF_ARM_DYNSYMSUSESEGIDX
:
1521 strcat (buf
, ", dynamic symbols use segment index");
1524 case EF_ARM_MAPSYMSFIRST
:
1525 strcat (buf
, ", mapping symbols precede others");
1535 case EF_ARM_EABI_UNKNOWN
:
1536 strcat (buf
, ", GNU EABI");
1541 /* Process flags one bit at a time. */
1542 flag
= e_flags
& - e_flags
;
1547 case EF_ARM_INTERWORK
:
1548 strcat (buf
, ", interworking enabled");
1551 case EF_ARM_APCS_26
:
1552 strcat (buf
, ", uses APCS/26");
1555 case EF_ARM_APCS_FLOAT
:
1556 strcat (buf
, ", uses APCS/float");
1560 strcat (buf
, ", position independent");
1564 strcat (buf
, ", 8 bit structure alignment");
1567 case EF_ARM_NEW_ABI
:
1568 strcat (buf
, ", uses new ABI");
1571 case EF_ARM_OLD_ABI
:
1572 strcat (buf
, ", uses old ABI");
1575 case EF_ARM_SOFT_FLOAT
:
1576 strcat (buf
, ", software FP");
1587 strcat (buf
,", <unknown>");
1591 get_machine_flags (e_flags
, e_machine
)
1595 static char buf
[1024];
1607 decode_ARM_machine_flags (e_flags
, buf
);
1611 if (e_flags
& EF_CPU32
)
1612 strcat (buf
, ", cpu32");
1616 if (e_flags
& EF_PPC_EMB
)
1617 strcat (buf
, ", emb");
1619 if (e_flags
& EF_PPC_RELOCATABLE
)
1620 strcat (buf
, ", relocatable");
1622 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
1623 strcat (buf
, ", relocatable-lib");
1627 case EM_CYGNUS_V850
:
1628 switch (e_flags
& EF_V850_ARCH
)
1631 strcat (buf
, ", v850e");
1634 strcat (buf
, ", v850ea");
1637 strcat (buf
, ", v850");
1640 strcat (buf
, ", unknown v850 architecture variant");
1646 case EM_CYGNUS_M32R
:
1647 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
1648 strcat (buf
, ", m32r");
1653 case EM_MIPS_RS3_LE
:
1654 if (e_flags
& EF_MIPS_NOREORDER
)
1655 strcat (buf
, ", noreorder");
1657 if (e_flags
& EF_MIPS_PIC
)
1658 strcat (buf
, ", pic");
1660 if (e_flags
& EF_MIPS_CPIC
)
1661 strcat (buf
, ", cpic");
1663 if (e_flags
& EF_MIPS_UCODE
)
1664 strcat (buf
, ", ugen_reserved");
1666 if (e_flags
& EF_MIPS_ABI2
)
1667 strcat (buf
, ", abi2");
1669 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
1670 strcat (buf
, ", odk first");
1672 if (e_flags
& EF_MIPS_32BITMODE
)
1673 strcat (buf
, ", 32bitmode");
1675 switch ((e_flags
& EF_MIPS_MACH
))
1677 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
1678 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
1679 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
1680 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
1681 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
1682 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
1684 /* We simply ignore the field in this case to avoid confusion:
1685 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
1688 default: strcat (buf
, ", unknown CPU"); break;
1691 switch ((e_flags
& EF_MIPS_ABI
))
1693 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
1694 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
1695 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
1696 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
1698 /* We simply ignore the field in this case to avoid confusion:
1699 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
1700 This means it is likely to be an o32 file, but not for
1703 default: strcat (buf
, ", unknown ABI"); break;
1706 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
1707 strcat (buf
, ", mdmx");
1709 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
1710 strcat (buf
, ", mips16");
1712 switch ((e_flags
& EF_MIPS_ARCH
))
1714 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
1715 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
1716 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
1717 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
1718 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
1719 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
1720 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
1721 default: strcat (buf
, ", unknown ISA"); break;
1727 if (e_flags
& EF_SPARC_32PLUS
)
1728 strcat (buf
, ", v8+");
1730 if (e_flags
& EF_SPARC_SUN_US1
)
1731 strcat (buf
, ", ultrasparcI");
1733 if (e_flags
& EF_SPARC_SUN_US3
)
1734 strcat (buf
, ", ultrasparcIII");
1736 if (e_flags
& EF_SPARC_HAL_R1
)
1737 strcat (buf
, ", halr1");
1739 if (e_flags
& EF_SPARC_LEDATA
)
1740 strcat (buf
, ", ledata");
1742 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
1743 strcat (buf
, ", tso");
1745 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
1746 strcat (buf
, ", pso");
1748 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
1749 strcat (buf
, ", rmo");
1753 switch (e_flags
& EF_PARISC_ARCH
)
1755 case EFA_PARISC_1_0
:
1756 strcpy (buf
, ", PA-RISC 1.0");
1758 case EFA_PARISC_1_1
:
1759 strcpy (buf
, ", PA-RISC 1.1");
1761 case EFA_PARISC_2_0
:
1762 strcpy (buf
, ", PA-RISC 2.0");
1767 if (e_flags
& EF_PARISC_TRAPNIL
)
1768 strcat (buf
, ", trapnil");
1769 if (e_flags
& EF_PARISC_EXT
)
1770 strcat (buf
, ", ext");
1771 if (e_flags
& EF_PARISC_LSB
)
1772 strcat (buf
, ", lsb");
1773 if (e_flags
& EF_PARISC_WIDE
)
1774 strcat (buf
, ", wide");
1775 if (e_flags
& EF_PARISC_NO_KABP
)
1776 strcat (buf
, ", no kabp");
1777 if (e_flags
& EF_PARISC_LAZYSWAP
)
1778 strcat (buf
, ", lazyswap");
1783 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
1784 strcat (buf
, ", new calling convention");
1786 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
1787 strcat (buf
, ", gnu calling convention");
1791 if ((e_flags
& EF_IA_64_ABI64
))
1792 strcat (buf
, ", 64-bit");
1794 strcat (buf
, ", 32-bit");
1795 if ((e_flags
& EF_IA_64_REDUCEDFP
))
1796 strcat (buf
, ", reduced fp model");
1797 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
1798 strcat (buf
, ", no function descriptors, constant gp");
1799 else if ((e_flags
& EF_IA_64_CONS_GP
))
1800 strcat (buf
, ", constant gp");
1801 if ((e_flags
& EF_IA_64_ABSOLUTE
))
1802 strcat (buf
, ", absolute");
1811 get_mips_segment_type (type
)
1816 case PT_MIPS_REGINFO
:
1818 case PT_MIPS_RTPROC
:
1820 case PT_MIPS_OPTIONS
:
1830 get_parisc_segment_type (type
)
1835 case PT_HP_TLS
: return "HP_TLS";
1836 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
1837 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
1838 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
1839 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
1840 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
1841 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
1842 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
1843 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
1844 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
1845 case PT_HP_PARALLEL
: return "HP_PARALLEL";
1846 case PT_HP_FASTBIND
: return "HP_FASTBIND";
1847 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
1848 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
1857 get_ia64_segment_type (type
)
1862 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
1863 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
1872 get_segment_type (p_type
)
1873 unsigned long p_type
;
1875 static char buff
[32];
1879 case PT_NULL
: return "NULL";
1880 case PT_LOAD
: return "LOAD";
1881 case PT_DYNAMIC
: return "DYNAMIC";
1882 case PT_INTERP
: return "INTERP";
1883 case PT_NOTE
: return "NOTE";
1884 case PT_SHLIB
: return "SHLIB";
1885 case PT_PHDR
: return "PHDR";
1887 case PT_GNU_EH_FRAME
:
1888 return "GNU_EH_FRAME";
1891 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
1893 const char * result
;
1895 switch (elf_header
.e_machine
)
1898 case EM_MIPS_RS3_LE
:
1899 result
= get_mips_segment_type (p_type
);
1902 result
= get_parisc_segment_type (p_type
);
1905 result
= get_ia64_segment_type (p_type
);
1915 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
1917 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
1919 const char * result
;
1921 switch (elf_header
.e_machine
)
1924 result
= get_parisc_segment_type (p_type
);
1934 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
1937 sprintf (buff
, _("<unknown>: %lx"), p_type
);
1944 get_mips_section_type_name (sh_type
)
1945 unsigned int sh_type
;
1949 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1950 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
1951 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1952 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
1953 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
1954 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
1955 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
1956 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
1957 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
1958 case SHT_MIPS_RELD
: return "MIPS_RELD";
1959 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
1960 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
1961 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1962 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
1963 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
1964 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
1965 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
1966 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
1967 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
1968 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
1969 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
1970 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
1971 case SHT_MIPS_LINE
: return "MIPS_LINE";
1972 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
1973 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
1974 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
1975 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
1976 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
1977 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
1978 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1979 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
1980 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
1981 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
1982 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
1983 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
1984 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
1985 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
1986 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
1987 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
1995 get_parisc_section_type_name (sh_type
)
1996 unsigned int sh_type
;
2000 case SHT_PARISC_EXT
: return "PARISC_EXT";
2001 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2002 case SHT_PARISC_DOC
: return "PARISC_DOC";
2010 get_ia64_section_type_name (sh_type
)
2011 unsigned int sh_type
;
2015 case SHT_IA_64_EXT
: return "IA_64_EXT";
2016 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2024 get_section_type_name (sh_type
)
2025 unsigned int sh_type
;
2027 static char buff
[32];
2031 case SHT_NULL
: return "NULL";
2032 case SHT_PROGBITS
: return "PROGBITS";
2033 case SHT_SYMTAB
: return "SYMTAB";
2034 case SHT_STRTAB
: return "STRTAB";
2035 case SHT_RELA
: return "RELA";
2036 case SHT_HASH
: return "HASH";
2037 case SHT_DYNAMIC
: return "DYNAMIC";
2038 case SHT_NOTE
: return "NOTE";
2039 case SHT_NOBITS
: return "NOBITS";
2040 case SHT_REL
: return "REL";
2041 case SHT_SHLIB
: return "SHLIB";
2042 case SHT_DYNSYM
: return "DYNSYM";
2043 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2044 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2045 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2046 case SHT_GROUP
: return "GROUP";
2047 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2048 case SHT_GNU_verdef
: return "VERDEF";
2049 case SHT_GNU_verneed
: return "VERNEED";
2050 case SHT_GNU_versym
: return "VERSYM";
2051 case 0x6ffffff0: return "VERSYM";
2052 case 0x6ffffffc: return "VERDEF";
2053 case 0x7ffffffd: return "AUXILIARY";
2054 case 0x7fffffff: return "FILTER";
2057 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2059 const char * result
;
2061 switch (elf_header
.e_machine
)
2064 case EM_MIPS_RS3_LE
:
2065 result
= get_mips_section_type_name (sh_type
);
2068 result
= get_parisc_section_type_name (sh_type
);
2071 result
= get_ia64_section_type_name (sh_type
);
2081 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2083 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2084 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2085 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2086 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2088 sprintf (buff
, _("<unknown>: %x"), sh_type
);
2094 struct option options
[] =
2096 {"all", no_argument
, 0, 'a'},
2097 {"file-header", no_argument
, 0, 'h'},
2098 {"program-headers", no_argument
, 0, 'l'},
2099 {"headers", no_argument
, 0, 'e'},
2100 {"histogram", no_argument
, 0, 'I'},
2101 {"segments", no_argument
, 0, 'l'},
2102 {"sections", no_argument
, 0, 'S'},
2103 {"section-headers", no_argument
, 0, 'S'},
2104 {"symbols", no_argument
, 0, 's'},
2105 {"syms", no_argument
, 0, 's'},
2106 {"relocs", no_argument
, 0, 'r'},
2107 {"notes", no_argument
, 0, 'n'},
2108 {"dynamic", no_argument
, 0, 'd'},
2109 {"arch-specific", no_argument
, 0, 'A'},
2110 {"version-info", no_argument
, 0, 'V'},
2111 {"use-dynamic", no_argument
, 0, 'D'},
2112 {"hex-dump", required_argument
, 0, 'x'},
2113 {"debug-dump", optional_argument
, 0, 'w'},
2114 {"unwind", no_argument
, 0, 'u'},
2115 #ifdef SUPPORT_DISASSEMBLY
2116 {"instruction-dump", required_argument
, 0, 'i'},
2119 {"version", no_argument
, 0, 'v'},
2120 {"wide", no_argument
, 0, 'W'},
2121 {"help", no_argument
, 0, 'H'},
2122 {0, no_argument
, 0, 0}
2128 fprintf (stdout
, _("Usage: readelf {options} elf-file(s)\n"));
2129 fprintf (stdout
, _(" Options are:\n"));
2130 fprintf (stdout
, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
2131 fprintf (stdout
, _(" -h or --file-header Display the ELF file header\n"));
2132 fprintf (stdout
, _(" -l or --program-headers or --segments\n"));
2133 fprintf (stdout
, _(" Display the program headers\n"));
2134 fprintf (stdout
, _(" -S or --section-headers or --sections\n"));
2135 fprintf (stdout
, _(" Display the sections' header\n"));
2136 fprintf (stdout
, _(" -e or --headers Equivalent to: -h -l -S\n"));
2137 fprintf (stdout
, _(" -s or --syms or --symbols Display the symbol table\n"));
2138 fprintf (stdout
, _(" -n or --notes Display the core notes (if present)\n"));
2139 fprintf (stdout
, _(" -r or --relocs Display the relocations (if present)\n"));
2140 fprintf (stdout
, _(" -u or --unwind Display the unwind info (if present)\n"));
2141 fprintf (stdout
, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
2142 fprintf (stdout
, _(" -V or --version-info Display the version sections (if present)\n"));
2143 fprintf (stdout
, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
2144 fprintf (stdout
, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
2145 fprintf (stdout
, _(" -x <number> or --hex-dump=<number>\n"));
2146 fprintf (stdout
, _(" Dump the contents of section <number>\n"));
2147 fprintf (stdout
, _(" -w[liaprmfs] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str]\n"));
2148 fprintf (stdout
, _(" Display the contents of DWARF2 debug sections\n"));
2149 #ifdef SUPPORT_DISASSEMBLY
2150 fprintf (stdout
, _(" -i <number> or --instruction-dump=<number>\n"));
2151 fprintf (stdout
, _(" Disassemble the contents of section <number>\n"));
2153 fprintf (stdout
, _(" -I or --histogram Display histogram of bucket list lengths\n"));
2154 fprintf (stdout
, _(" -v or --version Display the version number of readelf\n"));
2155 fprintf (stdout
, _(" -W or --wide Don't split lines or truncate symbols to fit into 80 columns\n"));
2156 fprintf (stdout
, _(" -H or --help Display this information\n"));
2157 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2163 request_dump (section
, type
)
2164 unsigned int section
;
2167 if (section
>= num_dump_sects
)
2169 char * new_dump_sects
;
2171 new_dump_sects
= (char *) calloc (section
+ 1, 1);
2173 if (new_dump_sects
== NULL
)
2174 error (_("Out of memory allocating dump request table."));
2177 /* Copy current flag settings. */
2178 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2182 dump_sects
= new_dump_sects
;
2183 num_dump_sects
= section
+ 1;
2188 dump_sects
[section
] |= type
;
2194 parse_args (argc
, argv
)
2203 while ((c
= getopt_long
2204 (argc
, argv
, "ersuahnldSDAIw::x:i:vVW", options
, NULL
)) != EOF
)
2240 do_using_dynamic
++;
2271 section
= strtoul (optarg
, & cp
, 0);
2272 if (! * cp
&& section
>= 0)
2274 request_dump (section
, HEX_DUMP
);
2284 unsigned int index
= 0;
2288 while (optarg
[index
])
2289 switch (optarg
[index
++])
2298 do_debug_abbrevs
= 1;
2308 do_debug_pubnames
= 1;
2313 do_debug_aranges
= 1;
2317 do_debug_frames_interp
= 1;
2319 do_debug_frames
= 1;
2324 do_debug_macinfo
= 1;
2333 warn (_("Unrecognised debug option '%s'\n"), optarg
);
2338 #ifdef SUPPORT_DISASSEMBLY
2341 section
= strtoul (optarg
, & cp
, 0);
2342 if (! * cp
&& section
>= 0)
2344 request_dump (section
, DISASS_DUMP
);
2350 print_version (program_name
);
2360 /* xgettext:c-format */
2361 error (_("Invalid option '-%c'\n"), c
);
2368 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
2369 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2370 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
)
2374 warn (_("Nothing to do.\n"));
2380 get_elf_class (elf_class
)
2381 unsigned int elf_class
;
2383 static char buff
[32];
2387 case ELFCLASSNONE
: return _("none");
2388 case ELFCLASS32
: return "ELF32";
2389 case ELFCLASS64
: return "ELF64";
2391 sprintf (buff
, _("<unknown: %x>"), elf_class
);
2397 get_data_encoding (encoding
)
2398 unsigned int encoding
;
2400 static char buff
[32];
2404 case ELFDATANONE
: return _("none");
2405 case ELFDATA2LSB
: return _("2's complement, little endian");
2406 case ELFDATA2MSB
: return _("2's complement, big endian");
2408 sprintf (buff
, _("<unknown: %x>"), encoding
);
2414 get_osabi_name (osabi
)
2417 static char buff
[32];
2421 case ELFOSABI_NONE
: return "UNIX - System V";
2422 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2423 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2424 case ELFOSABI_LINUX
: return "UNIX - Linux";
2425 case ELFOSABI_HURD
: return "GNU/Hurd";
2426 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2427 case ELFOSABI_AIX
: return "UNIX - AIX";
2428 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2429 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2430 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2431 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2432 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2433 case ELFOSABI_STANDALONE
: return _("Standalone App");
2434 case ELFOSABI_ARM
: return "ARM";
2436 sprintf (buff
, _("<unknown: %x>"), osabi
);
2441 /* Decode the data held in 'elf_header'. */
2443 process_file_header ()
2445 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2446 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
2447 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
2448 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
2451 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2459 printf (_("ELF Header:\n"));
2460 printf (_(" Magic: "));
2461 for (i
= 0; i
< EI_NIDENT
; i
++)
2462 printf ("%2.2x ", elf_header
.e_ident
[i
]);
2464 printf (_(" Class: %s\n"),
2465 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
2466 printf (_(" Data: %s\n"),
2467 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
2468 printf (_(" Version: %d %s\n"),
2469 elf_header
.e_ident
[EI_VERSION
],
2470 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
2472 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
2475 printf (_(" OS/ABI: %s\n"),
2476 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
2477 printf (_(" ABI Version: %d\n"),
2478 elf_header
.e_ident
[EI_ABIVERSION
]);
2479 printf (_(" Type: %s\n"),
2480 get_file_type (elf_header
.e_type
));
2481 printf (_(" Machine: %s\n"),
2482 get_machine_name (elf_header
.e_machine
));
2483 printf (_(" Version: 0x%lx\n"),
2484 (unsigned long) elf_header
.e_version
);
2486 printf (_(" Entry point address: "));
2487 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2488 printf (_("\n Start of program headers: "));
2489 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2490 printf (_(" (bytes into file)\n Start of section headers: "));
2491 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
2492 printf (_(" (bytes into file)\n"));
2494 printf (_(" Flags: 0x%lx%s\n"),
2495 (unsigned long) elf_header
.e_flags
,
2496 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
2497 printf (_(" Size of this header: %ld (bytes)\n"),
2498 (long) elf_header
.e_ehsize
);
2499 printf (_(" Size of program headers: %ld (bytes)\n"),
2500 (long) elf_header
.e_phentsize
);
2501 printf (_(" Number of program headers: %ld\n"),
2502 (long) elf_header
.e_phnum
);
2503 printf (_(" Size of section headers: %ld (bytes)\n"),
2504 (long) elf_header
.e_shentsize
);
2505 printf (_(" Number of section headers: %ld"),
2506 (long) elf_header
.e_shnum
);
2507 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
2508 printf (" (%ld)", (long) section_headers
[0].sh_size
);
2509 putc ('\n', stdout
);
2510 printf (_(" Section header string table index: %ld"),
2511 (long) elf_header
.e_shstrndx
);
2512 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
2513 printf (" (%ld)", (long) section_headers
[0].sh_link
);
2514 putc ('\n', stdout
);
2517 if (section_headers
!= NULL
)
2519 if (elf_header
.e_shnum
== 0)
2520 elf_header
.e_shnum
= section_headers
[0].sh_size
;
2521 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
2522 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
2523 free (section_headers
);
2524 section_headers
= NULL
;
2532 get_32bit_program_headers (file
, program_headers
)
2534 Elf_Internal_Phdr
* program_headers
;
2536 Elf32_External_Phdr
* phdrs
;
2537 Elf32_External_Phdr
* external
;
2538 Elf32_Internal_Phdr
* internal
;
2541 phdrs
= ((Elf32_External_Phdr
*)
2542 get_data (NULL
, file
, elf_header
.e_phoff
,
2543 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2544 _("program headers")));
2548 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2549 i
< elf_header
.e_phnum
;
2550 i
++, internal
++, external
++)
2552 internal
->p_type
= BYTE_GET (external
->p_type
);
2553 internal
->p_offset
= BYTE_GET (external
->p_offset
);
2554 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
2555 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
2556 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
2557 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
2558 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2559 internal
->p_align
= BYTE_GET (external
->p_align
);
2568 get_64bit_program_headers (file
, program_headers
)
2570 Elf_Internal_Phdr
* program_headers
;
2572 Elf64_External_Phdr
* phdrs
;
2573 Elf64_External_Phdr
* external
;
2574 Elf64_Internal_Phdr
* internal
;
2577 phdrs
= ((Elf64_External_Phdr
*)
2578 get_data (NULL
, file
, elf_header
.e_phoff
,
2579 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2580 _("program headers")));
2584 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2585 i
< elf_header
.e_phnum
;
2586 i
++, internal
++, external
++)
2588 internal
->p_type
= BYTE_GET (external
->p_type
);
2589 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2590 internal
->p_offset
= BYTE_GET8 (external
->p_offset
);
2591 internal
->p_vaddr
= BYTE_GET8 (external
->p_vaddr
);
2592 internal
->p_paddr
= BYTE_GET8 (external
->p_paddr
);
2593 internal
->p_filesz
= BYTE_GET8 (external
->p_filesz
);
2594 internal
->p_memsz
= BYTE_GET8 (external
->p_memsz
);
2595 internal
->p_align
= BYTE_GET8 (external
->p_align
);
2604 process_program_headers (file
)
2607 Elf_Internal_Phdr
* program_headers
;
2608 Elf_Internal_Phdr
* segment
;
2611 if (elf_header
.e_phnum
== 0)
2614 printf (_("\nThere are no program headers in this file.\n"));
2618 if (do_segments
&& !do_header
)
2620 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
2621 printf (_("Entry point "));
2622 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2623 printf (_("\nThere are %d program headers, starting at offset "),
2624 elf_header
.e_phnum
);
2625 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2629 program_headers
= (Elf_Internal_Phdr
*) malloc
2630 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
2632 if (program_headers
== NULL
)
2634 error (_("Out of memory\n"));
2639 i
= get_32bit_program_headers (file
, program_headers
);
2641 i
= get_64bit_program_headers (file
, program_headers
);
2645 free (program_headers
);
2652 (_("\nProgram Header%s:\n"), elf_header
.e_phnum
> 1 ? "s" : "");
2656 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2659 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2663 (_(" Type Offset VirtAddr PhysAddr\n"));
2665 (_(" FileSiz MemSiz Flags Align\n"));
2673 for (i
= 0, segment
= program_headers
;
2674 i
< elf_header
.e_phnum
;
2679 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
2683 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
2684 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
2685 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
2686 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
2687 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
2689 (segment
->p_flags
& PF_R
? 'R' : ' '),
2690 (segment
->p_flags
& PF_W
? 'W' : ' '),
2691 (segment
->p_flags
& PF_X
? 'E' : ' '));
2692 printf ("%#lx", (unsigned long) segment
->p_align
);
2696 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
2697 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
2700 print_vma (segment
->p_offset
, FULL_HEX
);
2704 print_vma (segment
->p_vaddr
, FULL_HEX
);
2706 print_vma (segment
->p_paddr
, FULL_HEX
);
2709 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
2710 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
2713 print_vma (segment
->p_filesz
, FULL_HEX
);
2717 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
2718 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
2721 print_vma (segment
->p_offset
, FULL_HEX
);
2725 (segment
->p_flags
& PF_R
? 'R' : ' '),
2726 (segment
->p_flags
& PF_W
? 'W' : ' '),
2727 (segment
->p_flags
& PF_X
? 'E' : ' '));
2729 if ((unsigned long) segment
->p_align
== segment
->p_align
)
2730 printf ("%#lx", (unsigned long) segment
->p_align
);
2733 print_vma (segment
->p_align
, PREFIX_HEX
);
2738 print_vma (segment
->p_offset
, FULL_HEX
);
2740 print_vma (segment
->p_vaddr
, FULL_HEX
);
2742 print_vma (segment
->p_paddr
, FULL_HEX
);
2744 print_vma (segment
->p_filesz
, FULL_HEX
);
2746 print_vma (segment
->p_memsz
, FULL_HEX
);
2748 (segment
->p_flags
& PF_R
? 'R' : ' '),
2749 (segment
->p_flags
& PF_W
? 'W' : ' '),
2750 (segment
->p_flags
& PF_X
? 'E' : ' '));
2751 print_vma (segment
->p_align
, HEX
);
2755 switch (segment
->p_type
)
2759 loadaddr
= (segment
->p_vaddr
& 0xfffff000)
2760 - (segment
->p_offset
& 0xfffff000);
2765 error (_("more than one dynamic segment\n"));
2767 dynamic_addr
= segment
->p_offset
;
2768 dynamic_size
= segment
->p_filesz
;
2772 if (fseek (file
, (long) segment
->p_offset
, SEEK_SET
))
2773 error (_("Unable to find program interpreter name\n"));
2776 program_interpreter
[0] = 0;
2777 fscanf (file
, "%63s", program_interpreter
);
2780 printf (_("\n [Requesting program interpreter: %s]"),
2781 program_interpreter
);
2787 putc ('\n', stdout
);
2796 if (do_segments
&& section_headers
!= NULL
)
2798 printf (_("\n Section to Segment mapping:\n"));
2799 printf (_(" Segment Sections...\n"));
2801 assert (string_table
!= NULL
);
2803 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
2806 Elf_Internal_Shdr
* section
;
2808 segment
= program_headers
+ i
;
2809 section
= section_headers
;
2811 printf (" %2.2d ", i
);
2813 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
2815 if (section
->sh_size
> 0
2816 /* Compare allocated sections by VMA, unallocated
2817 sections by file offset. */
2818 && (section
->sh_flags
& SHF_ALLOC
2819 ? (section
->sh_addr
>= segment
->p_vaddr
2820 && section
->sh_addr
+ section
->sh_size
2821 <= segment
->p_vaddr
+ segment
->p_memsz
)
2822 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
2823 && (section
->sh_offset
+ section
->sh_size
2824 <= segment
->p_offset
+ segment
->p_filesz
))))
2825 printf ("%s ", SECTION_NAME (section
));
2832 free (program_headers
);
2839 get_32bit_section_headers (file
, num
)
2843 Elf32_External_Shdr
* shdrs
;
2844 Elf32_Internal_Shdr
* internal
;
2847 shdrs
= ((Elf32_External_Shdr
*)
2848 get_data (NULL
, file
, elf_header
.e_shoff
,
2849 elf_header
.e_shentsize
* num
,
2850 _("section headers")));
2854 section_headers
= ((Elf_Internal_Shdr
*)
2855 malloc (num
* sizeof (Elf_Internal_Shdr
)));
2857 if (section_headers
== NULL
)
2859 error (_("Out of memory\n"));
2863 for (i
= 0, internal
= section_headers
;
2867 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
2868 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
2869 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
2870 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
2871 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
2872 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
2873 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
2874 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
2875 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
2876 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
2885 get_64bit_section_headers (file
, num
)
2889 Elf64_External_Shdr
* shdrs
;
2890 Elf64_Internal_Shdr
* internal
;
2893 shdrs
= ((Elf64_External_Shdr
*)
2894 get_data (NULL
, file
, elf_header
.e_shoff
,
2895 elf_header
.e_shentsize
* num
,
2896 _("section headers")));
2900 section_headers
= ((Elf_Internal_Shdr
*)
2901 malloc (num
* sizeof (Elf_Internal_Shdr
)));
2903 if (section_headers
== NULL
)
2905 error (_("Out of memory\n"));
2909 for (i
= 0, internal
= section_headers
;
2913 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
2914 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
2915 internal
->sh_flags
= BYTE_GET8 (shdrs
[i
].sh_flags
);
2916 internal
->sh_addr
= BYTE_GET8 (shdrs
[i
].sh_addr
);
2917 internal
->sh_size
= BYTE_GET8 (shdrs
[i
].sh_size
);
2918 internal
->sh_entsize
= BYTE_GET8 (shdrs
[i
].sh_entsize
);
2919 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
2920 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
2921 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
2922 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
2930 static Elf_Internal_Sym
*
2931 get_32bit_elf_symbols (file
, section
)
2933 Elf_Internal_Shdr
*section
;
2935 unsigned long number
;
2936 Elf32_External_Sym
* esyms
;
2937 Elf_External_Sym_Shndx
*shndx
;
2938 Elf_Internal_Sym
* isyms
;
2939 Elf_Internal_Sym
* psym
;
2942 esyms
= ((Elf32_External_Sym
*)
2943 get_data (NULL
, file
, section
->sh_offset
,
2944 section
->sh_size
, _("symbols")));
2949 if (symtab_shndx_hdr
!= NULL
2950 && (symtab_shndx_hdr
->sh_link
2951 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
2953 shndx
= ((Elf_External_Sym_Shndx
*)
2954 get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
2955 symtab_shndx_hdr
->sh_size
, _("symtab shndx")));
2963 number
= section
->sh_size
/ section
->sh_entsize
;
2964 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
2968 error (_("Out of memory\n"));
2975 for (j
= 0, psym
= isyms
;
2979 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
2980 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
2981 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
2982 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
2983 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
2985 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
2986 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
2987 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
2997 static Elf_Internal_Sym
*
2998 get_64bit_elf_symbols (file
, section
)
3000 Elf_Internal_Shdr
*section
;
3002 unsigned long number
;
3003 Elf64_External_Sym
* esyms
;
3004 Elf_External_Sym_Shndx
*shndx
;
3005 Elf_Internal_Sym
* isyms
;
3006 Elf_Internal_Sym
* psym
;
3009 esyms
= ((Elf64_External_Sym
*)
3010 get_data (NULL
, file
, section
->sh_offset
,
3011 section
->sh_size
, _("symbols")));
3016 if (symtab_shndx_hdr
!= NULL
3017 && (symtab_shndx_hdr
->sh_link
3018 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3020 shndx
= ((Elf_External_Sym_Shndx
*)
3021 get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3022 symtab_shndx_hdr
->sh_size
, _("symtab shndx")));
3030 number
= section
->sh_size
/ section
->sh_entsize
;
3031 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
3035 error (_("Out of memory\n"));
3042 for (j
= 0, psym
= isyms
;
3046 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3047 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3048 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3049 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3050 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3052 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3053 psym
->st_value
= BYTE_GET8 (esyms
[j
].st_value
);
3054 psym
->st_size
= BYTE_GET8 (esyms
[j
].st_size
);
3065 get_elf_section_flags (sh_flags
)
3068 static char buff
[32];
3076 flag
= sh_flags
& - sh_flags
;
3081 case SHF_WRITE
: strcat (buff
, "W"); break;
3082 case SHF_ALLOC
: strcat (buff
, "A"); break;
3083 case SHF_EXECINSTR
: strcat (buff
, "X"); break;
3084 case SHF_MERGE
: strcat (buff
, "M"); break;
3085 case SHF_STRINGS
: strcat (buff
, "S"); break;
3086 case SHF_INFO_LINK
: strcat (buff
, "I"); break;
3087 case SHF_LINK_ORDER
: strcat (buff
, "L"); break;
3088 case SHF_OS_NONCONFORMING
: strcat (buff
, "O"); break;
3089 case SHF_GROUP
: strcat (buff
, "G"); break;
3092 if (flag
& SHF_MASKOS
)
3095 sh_flags
&= ~ SHF_MASKOS
;
3097 else if (flag
& SHF_MASKPROC
)
3100 sh_flags
&= ~ SHF_MASKPROC
;
3112 process_section_headers (file
)
3115 Elf_Internal_Shdr
* section
;
3118 section_headers
= NULL
;
3120 if (elf_header
.e_shnum
== 0)
3123 printf (_("\nThere are no sections in this file.\n"));
3128 if (do_sections
&& !do_header
)
3129 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3130 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3134 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3137 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3140 /* Read in the string table, so that we have names to display. */
3141 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3143 if (section
->sh_size
!= 0)
3145 string_table
= (char *) get_data (NULL
, file
, section
->sh_offset
,
3146 section
->sh_size
, _("string table"));
3148 string_table_length
= section
->sh_size
;
3151 /* Scan the sections for the dynamic symbol table
3152 and dynamic string table and debug sections. */
3153 dynamic_symbols
= NULL
;
3154 dynamic_strings
= NULL
;
3155 dynamic_syminfo
= NULL
;
3157 for (i
= 0, section
= section_headers
;
3158 i
< elf_header
.e_shnum
;
3161 char * name
= SECTION_NAME (section
);
3163 if (section
->sh_type
== SHT_DYNSYM
)
3165 if (dynamic_symbols
!= NULL
)
3167 error (_("File contains multiple dynamic symbol tables\n"));
3171 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3172 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3174 else if (section
->sh_type
== SHT_STRTAB
3175 && strcmp (name
, ".dynstr") == 0)
3177 if (dynamic_strings
!= NULL
)
3179 error (_("File contains multiple dynamic string tables\n"));
3183 dynamic_strings
= (char *) get_data (NULL
, file
, section
->sh_offset
,
3185 _("dynamic strings"));
3187 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
3189 if (symtab_shndx_hdr
!= NULL
)
3191 error (_("File contains multiple symtab shndx tables\n"));
3194 symtab_shndx_hdr
= section
;
3196 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
3197 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
3198 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
)
3199 && strncmp (name
, ".debug_", 7) == 0)
3204 || (do_debug_info
&& (strcmp (name
, "info") == 0))
3205 || (do_debug_abbrevs
&& (strcmp (name
, "abbrev") == 0))
3206 || (do_debug_lines
&& (strcmp (name
, "line") == 0))
3207 || (do_debug_pubnames
&& (strcmp (name
, "pubnames") == 0))
3208 || (do_debug_aranges
&& (strcmp (name
, "aranges") == 0))
3209 || (do_debug_frames
&& (strcmp (name
, "frame") == 0))
3210 || (do_debug_macinfo
&& (strcmp (name
, "macinfo") == 0))
3211 || (do_debug_str
&& (strcmp (name
, "str") == 0))
3213 request_dump (i
, DEBUG_DUMP
);
3215 /* linkonce section to be combined with .debug_info at link time. */
3216 else if ((do_debugging
|| do_debug_info
)
3217 && strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
3218 request_dump (i
, DEBUG_DUMP
);
3219 else if (do_debug_frames
&& strcmp (name
, ".eh_frame") == 0)
3220 request_dump (i
, DEBUG_DUMP
);
3226 printf (_("\nSection Header%s:\n"), elf_header
.e_shnum
> 1 ? "s" : "");
3230 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3233 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3236 printf (_(" [Nr] Name Type Address Offset\n"));
3237 printf (_(" Size EntSize Flags Link Info Align\n"));
3240 for (i
= 0, section
= section_headers
;
3241 i
< elf_header
.e_shnum
;
3244 printf (" [%2u] %-17.17s %-15.15s ",
3245 SECTION_HEADER_NUM (i
),
3246 SECTION_NAME (section
),
3247 get_section_type_name (section
->sh_type
));
3251 print_vma (section
->sh_addr
, LONG_HEX
);
3253 printf ( " %6.6lx %6.6lx %2.2lx",
3254 (unsigned long) section
->sh_offset
,
3255 (unsigned long) section
->sh_size
,
3256 (unsigned long) section
->sh_entsize
);
3258 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3260 printf ("%2ld %3lx %2ld\n",
3261 (unsigned long) section
->sh_link
,
3262 (unsigned long) section
->sh_info
,
3263 (unsigned long) section
->sh_addralign
);
3267 print_vma (section
->sh_addr
, LONG_HEX
);
3269 if ((long) section
->sh_offset
== section
->sh_offset
)
3270 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
3274 print_vma (section
->sh_offset
, LONG_HEX
);
3277 if ((unsigned long) section
->sh_size
== section
->sh_size
)
3278 printf (" %6.6lx", (unsigned long) section
->sh_size
);
3282 print_vma (section
->sh_size
, LONG_HEX
);
3285 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
3286 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
3290 print_vma (section
->sh_entsize
, LONG_HEX
);
3293 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3295 printf ("%2ld %3lx ",
3296 (unsigned long) section
->sh_link
,
3297 (unsigned long) section
->sh_info
);
3299 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
3300 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
3303 print_vma (section
->sh_addralign
, DEC
);
3310 print_vma (section
->sh_addr
, LONG_HEX
);
3311 if ((long) section
->sh_offset
== section
->sh_offset
)
3312 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
3316 print_vma (section
->sh_offset
, LONG_HEX
);
3319 print_vma (section
->sh_size
, LONG_HEX
);
3321 print_vma (section
->sh_entsize
, LONG_HEX
);
3323 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3325 printf (" %2ld %3lx %ld\n",
3326 (unsigned long) section
->sh_link
,
3327 (unsigned long) section
->sh_info
,
3328 (unsigned long) section
->sh_addralign
);
3332 printf (_("Key to Flags:\n\
3333 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3334 I (info), L (link order), G (group), x (unknown)\n\
3335 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3340 /* Process the reloc section. */
3342 process_relocs (file
)
3345 unsigned long rel_size
;
3346 unsigned long rel_offset
;
3352 if (do_using_dynamic
)
3354 int is_rela
= FALSE
;
3359 if (dynamic_info
[DT_REL
])
3361 rel_offset
= dynamic_info
[DT_REL
];
3362 rel_size
= dynamic_info
[DT_RELSZ
];
3365 else if (dynamic_info
[DT_RELA
])
3367 rel_offset
= dynamic_info
[DT_RELA
];
3368 rel_size
= dynamic_info
[DT_RELASZ
];
3371 else if (dynamic_info
[DT_JMPREL
])
3373 rel_offset
= dynamic_info
[DT_JMPREL
];
3374 rel_size
= dynamic_info
[DT_PLTRELSZ
];
3376 switch (dynamic_info
[DT_PLTREL
])
3393 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3394 rel_offset
, rel_size
);
3396 dump_relocations (file
, rel_offset
- loadaddr
, rel_size
,
3397 dynamic_symbols
, num_dynamic_syms
, dynamic_strings
, is_rela
);
3400 printf (_("\nThere are no dynamic relocations in this file.\n"));
3404 Elf32_Internal_Shdr
* section
;
3408 for (i
= 0, section
= section_headers
;
3409 i
< elf_header
.e_shnum
;
3412 if ( section
->sh_type
!= SHT_RELA
3413 && section
->sh_type
!= SHT_REL
)
3416 rel_offset
= section
->sh_offset
;
3417 rel_size
= section
->sh_size
;
3421 Elf32_Internal_Shdr
* strsec
;
3422 Elf_Internal_Sym
* symtab
;
3425 unsigned long nsyms
;
3427 printf (_("\nRelocation section "));
3429 if (string_table
== NULL
)
3430 printf ("%d", section
->sh_name
);
3432 printf ("'%s'", SECTION_NAME (section
));
3434 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3435 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
3440 if (section
->sh_link
)
3442 Elf32_Internal_Shdr
* symsec
;
3444 symsec
= SECTION_HEADER (section
->sh_link
);
3445 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
3446 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
3451 strsec
= SECTION_HEADER (symsec
->sh_link
);
3453 strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
3457 is_rela
= section
->sh_type
== SHT_RELA
;
3459 dump_relocations (file
, rel_offset
, rel_size
,
3460 symtab
, nsyms
, strtab
, is_rela
);
3472 printf (_("\nThere are no relocations in this file.\n"));
3478 #include "unwind-ia64.h"
3480 /* An absolute address consists of a section and an offset. If the
3481 section is NULL, the offset itself is the address, otherwise, the
3482 address equals to LOAD_ADDRESS(section) + offset. */
3486 unsigned short section
;
3492 struct unw_table_entry
3494 struct absaddr start
;
3496 struct absaddr info
;
3498 *table
; /* Unwind table. */
3499 unsigned long table_len
; /* Length of unwind table. */
3500 unsigned char * info
; /* Unwind info. */
3501 unsigned long info_size
; /* Size of unwind info. */
3502 bfd_vma info_addr
; /* starting address of unwind info. */
3503 bfd_vma seg_base
; /* Starting address of segment. */
3504 Elf_Internal_Sym
* symtab
; /* The symbol table. */
3505 unsigned long nsyms
; /* Number of symbols. */
3506 char * strtab
; /* The string table. */
3507 unsigned long strtab_size
; /* Size of string table. */
3510 static void find_symbol_for_address
PARAMS ((struct unw_aux_info
*,
3511 struct absaddr
, const char **,
3513 static void dump_ia64_unwind
PARAMS ((struct unw_aux_info
*));
3514 static int slurp_ia64_unwind_table
PARAMS ((FILE *, struct unw_aux_info
*,
3515 Elf32_Internal_Shdr
*));
3518 find_symbol_for_address (aux
, addr
, symname
, offset
)
3519 struct unw_aux_info
*aux
;
3520 struct absaddr addr
;
3521 const char **symname
;
3524 bfd_vma dist
= (bfd_vma
) 0x100000;
3525 Elf_Internal_Sym
*sym
, *best
= NULL
;
3528 for (i
= 0, sym
= aux
->symtab
; i
< aux
->nsyms
; ++i
, ++sym
)
3530 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
3531 && sym
->st_name
!= 0
3532 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
3533 && addr
.offset
>= sym
->st_value
3534 && addr
.offset
- sym
->st_value
< dist
)
3537 dist
= addr
.offset
- sym
->st_value
;
3544 *symname
= (best
->st_name
>= aux
->strtab_size
3545 ? "<corrupt>" : aux
->strtab
+ best
->st_name
);
3550 *offset
= addr
.offset
;
3554 dump_ia64_unwind (aux
)
3555 struct unw_aux_info
*aux
;
3558 struct unw_table_entry
* tp
;
3561 addr_size
= is_32bit_elf
? 4 : 8;
3563 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
3567 const unsigned char * dp
;
3568 const unsigned char * head
;
3569 const char * procname
;
3571 find_symbol_for_address (aux
, tp
->start
, &procname
, &offset
);
3573 fputs ("\n<", stdout
);
3577 fputs (procname
, stdout
);
3580 printf ("+%lx", (unsigned long) offset
);
3583 fputs (">: [", stdout
);
3584 print_vma (tp
->start
.offset
, PREFIX_HEX
);
3585 fputc ('-', stdout
);
3586 print_vma (tp
->end
.offset
, PREFIX_HEX
);
3587 printf ("), info at +0x%lx\n",
3588 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
3590 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
3591 stamp
= BYTE_GET8 ((unsigned char *) head
);
3593 printf (" v%u, flags=0x%lx (%s%s ), len=%lu bytes\n",
3594 (unsigned) UNW_VER (stamp
),
3595 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
3596 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
3597 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
3598 (unsigned long) (addr_size
* UNW_LENGTH (stamp
)));
3600 if (UNW_VER (stamp
) != 1)
3602 printf ("\tUnknown version.\n");
3607 for (dp
= head
+ 8; dp
< head
+ 8 + addr_size
* UNW_LENGTH (stamp
);)
3608 dp
= unw_decode (dp
, in_body
, & in_body
);
3613 slurp_ia64_unwind_table (file
, aux
, sec
)
3615 struct unw_aux_info
*aux
;
3616 Elf32_Internal_Shdr
*sec
;
3618 unsigned long size
, addr_size
, nrelas
, i
;
3619 Elf_Internal_Phdr
*prog_hdrs
, *seg
;
3620 struct unw_table_entry
*tep
;
3621 Elf32_Internal_Shdr
*relsec
;
3622 Elf_Internal_Rela
*rela
, *rp
;
3623 unsigned char *table
, *tp
;
3624 Elf_Internal_Sym
*sym
;
3625 const char *relname
;
3628 addr_size
= is_32bit_elf
? 4 : 8;
3630 /* First, find the starting address of the segment that includes
3633 if (elf_header
.e_phnum
)
3635 prog_hdrs
= (Elf_Internal_Phdr
*)
3636 xmalloc (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
3639 result
= get_32bit_program_headers (file
, prog_hdrs
);
3641 result
= get_64bit_program_headers (file
, prog_hdrs
);
3649 for (seg
= prog_hdrs
; seg
< prog_hdrs
+ elf_header
.e_phnum
; ++seg
)
3651 if (seg
->p_type
!= PT_LOAD
)
3654 if (sec
->sh_addr
>= seg
->p_vaddr
3655 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
3657 aux
->seg_base
= seg
->p_vaddr
;
3665 /* Second, build the unwind table from the contents of the unwind section: */
3666 size
= sec
->sh_size
;
3667 table
= (char *) get_data (NULL
, file
, sec
->sh_offset
,
3668 size
, _("unwind table"));
3672 tep
= aux
->table
= xmalloc (size
/ (3 * addr_size
) * sizeof (aux
->table
[0]));
3673 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * addr_size
, ++ tep
)
3675 tep
->start
.section
= SHN_UNDEF
;
3676 tep
->end
.section
= SHN_UNDEF
;
3677 tep
->info
.section
= SHN_UNDEF
;
3680 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
3681 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
3682 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
3686 tep
->start
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 0);
3687 tep
->end
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 8);
3688 tep
->info
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 16);
3690 tep
->start
.offset
+= aux
->seg_base
;
3691 tep
->end
.offset
+= aux
->seg_base
;
3692 tep
->info
.offset
+= aux
->seg_base
;
3696 /* Third, apply any relocations to the unwind table: */
3698 for (relsec
= section_headers
;
3699 relsec
< section_headers
+ elf_header
.e_shnum
;
3702 if (relsec
->sh_type
!= SHT_RELA
3703 || SECTION_HEADER (relsec
->sh_info
) != sec
)
3706 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
3710 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
3714 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
3715 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
3717 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
3719 warn (_("Skipping unexpected symbol type %u\n"),
3720 ELF32_ST_TYPE (sym
->st_info
));
3726 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
3727 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
3729 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
3731 warn (_("Skipping unexpected symbol type %u\n"),
3732 ELF64_ST_TYPE (sym
->st_info
));
3737 if (strncmp (relname
, "R_IA64_SEGREL", 13) != 0)
3739 warn (_("Skipping unexpected relocation type %s\n"), relname
);
3743 i
= rp
->r_offset
/ (3 * addr_size
);
3745 switch (rp
->r_offset
/addr_size
% 3)
3748 aux
->table
[i
].start
.section
= sym
->st_shndx
;
3749 aux
->table
[i
].start
.offset
+= rp
->r_addend
;
3752 aux
->table
[i
].end
.section
= sym
->st_shndx
;
3753 aux
->table
[i
].end
.offset
+= rp
->r_addend
;
3756 aux
->table
[i
].info
.section
= sym
->st_shndx
;
3757 aux
->table
[i
].info
.offset
+= rp
->r_addend
;
3767 aux
->table_len
= size
/ (3 * addr_size
);
3772 process_unwind (file
)
3775 Elf32_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
3776 unsigned long i
, addr_size
, unwcount
= 0, unwstart
= 0;
3777 struct unw_aux_info aux
;
3782 if (elf_header
.e_machine
!= EM_IA_64
)
3784 printf (_("\nThere are no unwind sections in this file.\n"));
3788 memset (& aux
, 0, sizeof (aux
));
3790 addr_size
= is_32bit_elf
? 4 : 8;
3792 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
3794 if (sec
->sh_type
== SHT_SYMTAB
)
3796 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
3797 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
3799 strsec
= SECTION_HEADER (sec
->sh_link
);
3800 aux
.strtab_size
= strsec
->sh_size
;
3801 aux
.strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
3802 aux
.strtab_size
, _("string table"));
3804 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
3809 printf (_("\nThere are no unwind sections in this file.\n"));
3811 while (unwcount
-- > 0)
3816 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
3817 i
< elf_header
.e_shnum
; ++i
, ++sec
)
3818 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
3825 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
3827 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
,
3830 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
3831 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
3832 suffix
= SECTION_NAME (unwsec
) + len
;
3833 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
3835 if (strncmp (SECTION_NAME (sec
),
3836 ELF_STRING_ia64_unwind_info_once
, len2
) == 0
3837 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
3842 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
3843 .IA_64.unwind or BAR -> .IA_64.unwind_info */
3844 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
3845 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
3847 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
,
3849 suffix
= SECTION_NAME (unwsec
) + len
;
3850 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
3852 if (strncmp (SECTION_NAME (sec
),
3853 ELF_STRING_ia64_unwind_info
, len2
) == 0
3854 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
3858 if (i
== elf_header
.e_shnum
)
3860 printf (_("\nCould not find unwind info section for "));
3862 if (string_table
== NULL
)
3863 printf ("%d", unwsec
->sh_name
);
3865 printf ("'%s'", SECTION_NAME (unwsec
));
3869 aux
.info_size
= sec
->sh_size
;
3870 aux
.info_addr
= sec
->sh_addr
;
3871 aux
.info
= (char *) get_data (NULL
, file
, sec
->sh_offset
,
3872 aux
.info_size
, _("unwind info"));
3874 printf (_("\nUnwind section "));
3876 if (string_table
== NULL
)
3877 printf ("%d", unwsec
->sh_name
);
3879 printf ("'%s'", SECTION_NAME (unwsec
));
3881 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3882 (unsigned long) unwsec
->sh_offset
,
3883 (unsigned long) (unwsec
->sh_size
/ (3 * addr_size
)));
3885 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
3887 if (aux
.table_len
> 0)
3888 dump_ia64_unwind (& aux
);
3891 free ((char *) aux
.table
);
3893 free ((char *) aux
.info
);
3902 free ((char *) aux
.strtab
);
3908 dynamic_segment_mips_val (entry
)
3909 Elf_Internal_Dyn
* entry
;
3911 switch (entry
->d_tag
)
3914 if (entry
->d_un
.d_val
== 0)
3918 static const char * opts
[] =
3920 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
3921 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
3922 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
3923 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
3928 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++ cnt
)
3929 if (entry
->d_un
.d_val
& (1 << cnt
))
3931 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
3938 case DT_MIPS_IVERSION
:
3939 if (dynamic_strings
!= NULL
)
3940 printf ("Interface Version: %s\n",
3941 dynamic_strings
+ entry
->d_un
.d_val
);
3943 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
3946 case DT_MIPS_TIME_STAMP
:
3951 time_t time
= entry
->d_un
.d_val
;
3952 tmp
= gmtime (&time
);
3953 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
3954 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
3955 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
3956 printf ("Time Stamp: %s\n", timebuf
);
3960 case DT_MIPS_RLD_VERSION
:
3961 case DT_MIPS_LOCAL_GOTNO
:
3962 case DT_MIPS_CONFLICTNO
:
3963 case DT_MIPS_LIBLISTNO
:
3964 case DT_MIPS_SYMTABNO
:
3965 case DT_MIPS_UNREFEXTNO
:
3966 case DT_MIPS_HIPAGENO
:
3967 case DT_MIPS_DELTA_CLASS_NO
:
3968 case DT_MIPS_DELTA_INSTANCE_NO
:
3969 case DT_MIPS_DELTA_RELOC_NO
:
3970 case DT_MIPS_DELTA_SYM_NO
:
3971 case DT_MIPS_DELTA_CLASSSYM_NO
:
3972 case DT_MIPS_COMPACT_SIZE
:
3973 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
3977 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
3983 dynamic_segment_parisc_val (entry
)
3984 Elf_Internal_Dyn
* entry
;
3986 switch (entry
->d_tag
)
3988 case DT_HP_DLD_FLAGS
:
3997 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
3998 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
3999 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
4000 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
4001 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
4002 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
4003 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
4004 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
4005 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
4006 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
4007 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
4011 bfd_vma val
= entry
->d_un
.d_val
;
4013 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
4014 if (val
& flags
[cnt
].bit
)
4018 fputs (flags
[cnt
].str
, stdout
);
4020 val
^= flags
[cnt
].bit
;
4023 if (val
!= 0 || first
)
4027 print_vma (val
, HEX
);
4033 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4039 get_32bit_dynamic_segment (file
)
4042 Elf32_External_Dyn
* edyn
;
4043 Elf_Internal_Dyn
* entry
;
4046 edyn
= (Elf32_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
,
4047 dynamic_size
, _("dynamic segment"));
4051 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4052 how large this .dynamic is now. We can do this even before the byte
4053 swapping since the DT_NULL tag is recognizable. */
4055 while (*(Elf32_Word
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
4058 dynamic_segment
= (Elf_Internal_Dyn
*)
4059 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
4061 if (dynamic_segment
== NULL
)
4063 error (_("Out of memory\n"));
4068 for (i
= 0, entry
= dynamic_segment
;
4072 entry
->d_tag
= BYTE_GET (edyn
[i
].d_tag
);
4073 entry
->d_un
.d_val
= BYTE_GET (edyn
[i
].d_un
.d_val
);
4082 get_64bit_dynamic_segment (file
)
4085 Elf64_External_Dyn
* edyn
;
4086 Elf_Internal_Dyn
* entry
;
4089 edyn
= (Elf64_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 (*(bfd_vma
*) 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_GET8 (edyn
[i
].d_tag
);
4116 entry
->d_un
.d_val
= BYTE_GET8 (edyn
[i
].d_un
.d_val
);
4125 get_dynamic_flags (flags
)
4128 static char buff
[64];
4133 flag
= flags
& - flags
;
4138 case DF_ORIGIN
: strcat (buff
, "ORIGIN "); break;
4139 case DF_SYMBOLIC
: strcat (buff
, "SYMBOLIC "); break;
4140 case DF_TEXTREL
: strcat (buff
, "TEXTREL "); break;
4141 case DF_BIND_NOW
: strcat (buff
, "BIND_NOW "); break;
4142 default: strcat (buff
, "unknown "); break;
4148 /* Parse and display the contents of the dynamic segment. */
4150 process_dynamic_segment (file
)
4153 Elf_Internal_Dyn
* entry
;
4156 if (dynamic_size
== 0)
4159 printf (_("\nThere is no dynamic segment in this file.\n"));
4166 if (! get_32bit_dynamic_segment (file
))
4169 else if (! get_64bit_dynamic_segment (file
))
4172 /* Find the appropriate symbol table. */
4173 if (dynamic_symbols
== NULL
)
4175 for (i
= 0, entry
= dynamic_segment
;
4179 Elf32_Internal_Shdr section
;
4181 if (entry
->d_tag
!= DT_SYMTAB
)
4184 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
4186 /* Since we do not know how big the symbol table is,
4187 we default to reading in the entire file (!) and
4188 processing that. This is overkill, I know, but it
4190 section
.sh_offset
= entry
->d_un
.d_val
- loadaddr
;
4192 if (fseek (file
, 0, SEEK_END
))
4193 error (_("Unable to seek to end of file!"));
4195 section
.sh_size
= ftell (file
) - section
.sh_offset
;
4197 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
4199 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
4201 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
4202 if (num_dynamic_syms
< 1)
4204 error (_("Unable to determine the number of symbols to load\n"));
4208 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
4212 /* Similarly find a string table. */
4213 if (dynamic_strings
== NULL
)
4215 for (i
= 0, entry
= dynamic_segment
;
4219 unsigned long offset
;
4222 if (entry
->d_tag
!= DT_STRTAB
)
4225 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
4227 /* Since we do not know how big the string table is,
4228 we default to reading in the entire file (!) and
4229 processing that. This is overkill, I know, but it
4232 offset
= entry
->d_un
.d_val
- loadaddr
;
4233 if (fseek (file
, 0, SEEK_END
))
4234 error (_("Unable to seek to end of file\n"));
4235 str_tab_len
= ftell (file
) - offset
;
4237 if (str_tab_len
< 1)
4240 (_("Unable to determine the length of the dynamic string table\n"));
4244 dynamic_strings
= (char *) get_data (NULL
, file
, offset
, str_tab_len
,
4245 _("dynamic string table"));
4250 /* And find the syminfo section if available. */
4251 if (dynamic_syminfo
== NULL
)
4253 unsigned int syminsz
= 0;
4255 for (i
= 0, entry
= dynamic_segment
;
4259 if (entry
->d_tag
== DT_SYMINENT
)
4261 /* Note: these braces are necessary to avoid a syntax
4262 error from the SunOS4 C compiler. */
4263 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
4265 else if (entry
->d_tag
== DT_SYMINSZ
)
4266 syminsz
= entry
->d_un
.d_val
;
4267 else if (entry
->d_tag
== DT_SYMINFO
)
4268 dynamic_syminfo_offset
= entry
->d_un
.d_val
- loadaddr
;
4271 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
4273 Elf_External_Syminfo
* extsyminfo
;
4274 Elf_Internal_Syminfo
* syminfo
;
4276 /* There is a syminfo section. Read the data. */
4277 extsyminfo
= ((Elf_External_Syminfo
*)
4278 get_data (NULL
, file
, dynamic_syminfo_offset
,
4279 syminsz
, _("symbol information")));
4283 dynamic_syminfo
= (Elf_Internal_Syminfo
*) malloc (syminsz
);
4284 if (dynamic_syminfo
== NULL
)
4286 error (_("Out of memory\n"));
4290 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
4291 for (i
= 0, syminfo
= dynamic_syminfo
; i
< dynamic_syminfo_nent
;
4294 syminfo
->si_boundto
= BYTE_GET (extsyminfo
[i
].si_boundto
);
4295 syminfo
->si_flags
= BYTE_GET (extsyminfo
[i
].si_flags
);
4302 if (do_dynamic
&& dynamic_addr
)
4303 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
4304 dynamic_addr
, (long) dynamic_size
);
4306 printf (_(" Tag Type Name/Value\n"));
4308 for (i
= 0, entry
= dynamic_segment
;
4317 print_vma (entry
->d_tag
, FULL_HEX
);
4318 dtype
= get_dynamic_type (entry
->d_tag
);
4319 printf (" (%s)%*s", dtype
,
4320 ((is_32bit_elf
? 27 : 19)
4321 - (int) strlen (dtype
)),
4325 switch (entry
->d_tag
)
4329 printf ("%s", get_dynamic_flags (entry
->d_un
.d_val
));
4339 switch (entry
->d_tag
)
4342 printf (_("Auxiliary library"));
4346 printf (_("Filter library"));
4350 printf (_("Configuration file"));
4354 printf (_("Dependency audit library"));
4358 printf (_("Audit library"));
4362 if (dynamic_strings
)
4363 printf (": [%s]\n", dynamic_strings
+ entry
->d_un
.d_val
);
4367 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4376 printf (_("Flags:"));
4377 if (entry
->d_un
.d_val
== 0)
4378 printf (_(" None\n"));
4381 unsigned long int val
= entry
->d_un
.d_val
;
4382 if (val
& DTF_1_PARINIT
)
4384 printf (" PARINIT");
4385 val
^= DTF_1_PARINIT
;
4387 if (val
& DTF_1_CONFEXP
)
4389 printf (" CONFEXP");
4390 val
^= DTF_1_CONFEXP
;
4393 printf (" %lx", val
);
4402 printf (_("Flags:"));
4403 if (entry
->d_un
.d_val
== 0)
4404 printf (_(" None\n"));
4407 unsigned long int val
= entry
->d_un
.d_val
;
4408 if (val
& DF_P1_LAZYLOAD
)
4410 printf (" LAZYLOAD");
4411 val
^= DF_P1_LAZYLOAD
;
4413 if (val
& DF_P1_GROUPPERM
)
4415 printf (" GROUPPERM");
4416 val
^= DF_P1_GROUPPERM
;
4419 printf (" %lx", val
);
4428 printf (_("Flags:"));
4429 if (entry
->d_un
.d_val
== 0)
4430 printf (_(" None\n"));
4433 unsigned long int val
= entry
->d_un
.d_val
;
4439 if (val
& DF_1_GLOBAL
)
4444 if (val
& DF_1_GROUP
)
4449 if (val
& DF_1_NODELETE
)
4451 printf (" NODELETE");
4452 val
^= DF_1_NODELETE
;
4454 if (val
& DF_1_LOADFLTR
)
4456 printf (" LOADFLTR");
4457 val
^= DF_1_LOADFLTR
;
4459 if (val
& DF_1_INITFIRST
)
4461 printf (" INITFIRST");
4462 val
^= DF_1_INITFIRST
;
4464 if (val
& DF_1_NOOPEN
)
4469 if (val
& DF_1_ORIGIN
)
4474 if (val
& DF_1_DIRECT
)
4479 if (val
& DF_1_TRANS
)
4484 if (val
& DF_1_INTERPOSE
)
4486 printf (" INTERPOSE");
4487 val
^= DF_1_INTERPOSE
;
4489 if (val
& DF_1_NODEFLIB
)
4491 printf (" NODEFLIB");
4492 val
^= DF_1_NODEFLIB
;
4494 if (val
& DF_1_NODUMP
)
4499 if (val
& DF_1_CONLFAT
)
4501 printf (" CONLFAT");
4502 val
^= DF_1_CONLFAT
;
4505 printf (" %lx", val
);
4513 puts (get_dynamic_type (entry
->d_un
.d_val
));
4533 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
4539 if (dynamic_strings
== NULL
)
4542 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4546 switch (entry
->d_tag
)
4549 printf (_("Shared library: [%s]"), name
);
4551 if (strcmp (name
, program_interpreter
) == 0)
4552 printf (_(" program interpreter"));
4556 printf (_("Library soname: [%s]"), name
);
4560 printf (_("Library rpath: [%s]"), name
);
4564 printf (_("Library runpath: [%s]"), name
);
4568 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4573 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4589 case DT_INIT_ARRAYSZ
:
4590 case DT_FINI_ARRAYSZ
:
4593 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
4594 printf (" (bytes)\n");
4604 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
4617 if (dynamic_strings
!= NULL
&& entry
->d_tag
== DT_USED
)
4621 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4625 printf (_("Not needed object: [%s]\n"), name
);
4630 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4636 /* The value of this entry is ignored. */
4640 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
4641 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
4646 switch (elf_header
.e_machine
)
4649 case EM_MIPS_RS3_LE
:
4650 dynamic_segment_mips_val (entry
);
4653 dynamic_segment_parisc_val (entry
);
4656 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4668 get_ver_flags (flags
)
4671 static char buff
[32];
4678 if (flags
& VER_FLG_BASE
)
4679 strcat (buff
, "BASE ");
4681 if (flags
& VER_FLG_WEAK
)
4683 if (flags
& VER_FLG_BASE
)
4684 strcat (buff
, "| ");
4686 strcat (buff
, "WEAK ");
4689 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
4690 strcat (buff
, "| <unknown>");
4695 /* Display the contents of the version sections. */
4697 process_version_sections (file
)
4700 Elf32_Internal_Shdr
* section
;
4707 for (i
= 0, section
= section_headers
;
4708 i
< elf_header
.e_shnum
;
4711 switch (section
->sh_type
)
4713 case SHT_GNU_verdef
:
4715 Elf_External_Verdef
* edefs
;
4722 (_("\nVersion definition section '%s' contains %ld entries:\n"),
4723 SECTION_NAME (section
), section
->sh_info
);
4725 printf (_(" Addr: 0x"));
4726 printf_vma (section
->sh_addr
);
4727 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4728 (unsigned long) section
->sh_offset
, section
->sh_link
,
4729 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
4731 edefs
= ((Elf_External_Verdef
*)
4732 get_data (NULL
, file
, section
->sh_offset
,
4734 _("version definition section")));
4738 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++ cnt
)
4741 Elf_External_Verdef
* edef
;
4742 Elf_Internal_Verdef ent
;
4743 Elf_External_Verdaux
* eaux
;
4744 Elf_Internal_Verdaux aux
;
4748 vstart
= ((char *) edefs
) + idx
;
4750 edef
= (Elf_External_Verdef
*) vstart
;
4752 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
4753 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
4754 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
4755 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
4756 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
4757 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
4758 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
4760 printf (_(" %#06x: Rev: %d Flags: %s"),
4761 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
4763 printf (_(" Index: %d Cnt: %d "),
4764 ent
.vd_ndx
, ent
.vd_cnt
);
4766 vstart
+= ent
.vd_aux
;
4768 eaux
= (Elf_External_Verdaux
*) vstart
;
4770 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
4771 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
4773 if (dynamic_strings
)
4774 printf (_("Name: %s\n"), dynamic_strings
+ aux
.vda_name
);
4776 printf (_("Name index: %ld\n"), aux
.vda_name
);
4778 isum
= idx
+ ent
.vd_aux
;
4780 for (j
= 1; j
< ent
.vd_cnt
; j
++)
4782 isum
+= aux
.vda_next
;
4783 vstart
+= aux
.vda_next
;
4785 eaux
= (Elf_External_Verdaux
*) vstart
;
4787 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
4788 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
4790 if (dynamic_strings
)
4791 printf (_(" %#06x: Parent %d: %s\n"),
4792 isum
, j
, dynamic_strings
+ aux
.vda_name
);
4794 printf (_(" %#06x: Parent %d, name index: %ld\n"),
4795 isum
, j
, aux
.vda_name
);
4805 case SHT_GNU_verneed
:
4807 Elf_External_Verneed
* eneed
;
4813 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
4814 SECTION_NAME (section
), section
->sh_info
);
4816 printf (_(" Addr: 0x"));
4817 printf_vma (section
->sh_addr
);
4818 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
4819 (unsigned long) section
->sh_offset
, section
->sh_link
,
4820 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
4822 eneed
= ((Elf_External_Verneed
*)
4823 get_data (NULL
, file
, section
->sh_offset
,
4824 section
->sh_size
, _("version need section")));
4828 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
4830 Elf_External_Verneed
* entry
;
4831 Elf_Internal_Verneed ent
;
4836 vstart
= ((char *) eneed
) + idx
;
4838 entry
= (Elf_External_Verneed
*) vstart
;
4840 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
4841 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
4842 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
4843 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
4844 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
4846 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
4848 if (dynamic_strings
)
4849 printf (_(" File: %s"), dynamic_strings
+ ent
.vn_file
);
4851 printf (_(" File: %lx"), ent
.vn_file
);
4853 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
4855 vstart
+= ent
.vn_aux
;
4857 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
4859 Elf_External_Vernaux
* eaux
;
4860 Elf_Internal_Vernaux aux
;
4862 eaux
= (Elf_External_Vernaux
*) vstart
;
4864 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
4865 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
4866 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
4867 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
4868 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
4870 if (dynamic_strings
)
4871 printf (_(" %#06x: Name: %s"),
4872 isum
, dynamic_strings
+ aux
.vna_name
);
4874 printf (_(" %#06x: Name index: %lx"),
4875 isum
, aux
.vna_name
);
4877 printf (_(" Flags: %s Version: %d\n"),
4878 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
4880 isum
+= aux
.vna_next
;
4881 vstart
+= aux
.vna_next
;
4891 case SHT_GNU_versym
:
4893 Elf32_Internal_Shdr
* link_section
;
4896 unsigned char * edata
;
4897 unsigned short * data
;
4899 Elf_Internal_Sym
* symbols
;
4900 Elf32_Internal_Shdr
* string_sec
;
4902 link_section
= SECTION_HEADER (section
->sh_link
);
4903 total
= section
->sh_size
/ section
->sh_entsize
;
4907 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
4909 string_sec
= SECTION_HEADER (link_section
->sh_link
);
4911 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
4912 string_sec
->sh_size
,
4913 _("version string table"));
4917 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
4918 SECTION_NAME (section
), total
);
4920 printf (_(" Addr: "));
4921 printf_vma (section
->sh_addr
);
4922 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4923 (unsigned long) section
->sh_offset
, section
->sh_link
,
4924 SECTION_NAME (link_section
));
4928 get_data (NULL
, file
,
4929 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] - loadaddr
,
4930 total
* sizeof (short), _("version symbol data")));
4937 data
= (unsigned short *) malloc (total
* sizeof (short));
4939 for (cnt
= total
; cnt
--;)
4940 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
4945 for (cnt
= 0; cnt
< total
; cnt
+= 4)
4948 int check_def
, check_need
;
4951 printf (" %03x:", cnt
);
4953 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
4954 switch (data
[cnt
+ j
])
4957 fputs (_(" 0 (*local*) "), stdout
);
4961 fputs (_(" 1 (*global*) "), stdout
);
4965 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
4966 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
4970 if (SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
4973 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
4980 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
4982 Elf_Internal_Verneed ivn
;
4983 unsigned long offset
;
4985 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
4990 Elf_Internal_Vernaux ivna
;
4991 Elf_External_Verneed evn
;
4992 Elf_External_Vernaux evna
;
4993 unsigned long a_off
;
4995 get_data (&evn
, file
, offset
, sizeof (evn
),
4998 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
4999 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5001 a_off
= offset
+ ivn
.vn_aux
;
5005 get_data (&evna
, file
, a_off
, sizeof (evna
),
5006 _("version need aux (2)"));
5008 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5009 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5011 a_off
+= ivna
.vna_next
;
5013 while (ivna
.vna_other
!= data
[cnt
+ j
]
5014 && ivna
.vna_next
!= 0);
5016 if (ivna
.vna_other
== data
[cnt
+ j
])
5018 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5020 name
= strtab
+ ivna
.vna_name
;
5021 nn
+= printf ("(%s%-*s",
5023 12 - (int) strlen (name
),
5029 offset
+= ivn
.vn_next
;
5031 while (ivn
.vn_next
);
5034 if (check_def
&& data
[cnt
+ j
] != 0x8001
5035 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5037 Elf_Internal_Verdef ivd
;
5038 Elf_External_Verdef evd
;
5039 unsigned long offset
;
5041 offset
= version_info
5042 [DT_VERSIONTAGIDX (DT_VERDEF
)] - loadaddr
;
5046 get_data (&evd
, file
, offset
, sizeof (evd
),
5049 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5050 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5052 offset
+= ivd
.vd_next
;
5054 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
5055 && ivd
.vd_next
!= 0);
5057 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
5059 Elf_External_Verdaux evda
;
5060 Elf_Internal_Verdaux ivda
;
5062 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5064 get_data (&evda
, file
,
5065 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
5066 sizeof (evda
), _("version def aux"));
5068 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5070 name
= strtab
+ ivda
.vda_name
;
5071 nn
+= printf ("(%s%-*s",
5073 12 - (int) strlen (name
),
5079 printf ("%*c", 18 - nn
, ' ');
5097 printf (_("\nNo version information found in this file.\n"));
5103 get_symbol_binding (binding
)
5104 unsigned int binding
;
5106 static char buff
[32];
5110 case STB_LOCAL
: return "LOCAL";
5111 case STB_GLOBAL
: return "GLOBAL";
5112 case STB_WEAK
: return "WEAK";
5114 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
5115 sprintf (buff
, _("<processor specific>: %d"), binding
);
5116 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
5117 sprintf (buff
, _("<OS specific>: %d"), binding
);
5119 sprintf (buff
, _("<unknown>: %d"), binding
);
5125 get_symbol_type (type
)
5128 static char buff
[32];
5132 case STT_NOTYPE
: return "NOTYPE";
5133 case STT_OBJECT
: return "OBJECT";
5134 case STT_FUNC
: return "FUNC";
5135 case STT_SECTION
: return "SECTION";
5136 case STT_FILE
: return "FILE";
5137 case STT_COMMON
: return "COMMON";
5139 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
5141 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
5142 return "THUMB_FUNC";
5144 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
5147 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
5148 return "PARISC_MILLI";
5150 sprintf (buff
, _("<processor specific>: %d"), type
);
5152 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
5154 if (elf_header
.e_machine
== EM_PARISC
)
5156 if (type
== STT_HP_OPAQUE
)
5158 if (type
== STT_HP_STUB
)
5162 sprintf (buff
, _("<OS specific>: %d"), type
);
5165 sprintf (buff
, _("<unknown>: %d"), type
);
5171 get_symbol_visibility (visibility
)
5172 unsigned int visibility
;
5176 case STV_DEFAULT
: return "DEFAULT";
5177 case STV_INTERNAL
: return "INTERNAL";
5178 case STV_HIDDEN
: return "HIDDEN";
5179 case STV_PROTECTED
: return "PROTECTED";
5185 get_symbol_index_type (type
)
5190 case SHN_UNDEF
: return "UND";
5191 case SHN_ABS
: return "ABS";
5192 case SHN_COMMON
: return "COM";
5194 if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
5196 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
5198 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
5202 static char buff
[32];
5204 sprintf (buff
, "%3d", type
);
5211 get_dynamic_data (file
, number
)
5213 unsigned int number
;
5215 unsigned char * e_data
;
5218 e_data
= (unsigned char *) malloc (number
* 4);
5222 error (_("Out of memory\n"));
5226 if (fread (e_data
, 4, number
, file
) != number
)
5228 error (_("Unable to read in dynamic data\n"));
5232 i_data
= (int *) malloc (number
* sizeof (* i_data
));
5236 error (_("Out of memory\n"));
5242 i_data
[number
] = byte_get (e_data
+ number
* 4, 4);
5249 /* Dump the symbol table. */
5251 process_symbol_table (file
)
5254 Elf32_Internal_Shdr
* section
;
5255 unsigned char nb
[4];
5256 unsigned char nc
[4];
5259 int * buckets
= NULL
;
5260 int * chains
= NULL
;
5262 if (! do_syms
&& !do_histogram
)
5265 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
5268 if (fseek (file
, dynamic_info
[DT_HASH
] - loadaddr
, SEEK_SET
))
5270 error (_("Unable to seek to start of dynamic information"));
5274 if (fread (nb
, sizeof (nb
), 1, file
) != 1)
5276 error (_("Failed to read in number of buckets\n"));
5280 if (fread (nc
, sizeof (nc
), 1, file
) != 1)
5282 error (_("Failed to read in number of chains\n"));
5286 nbuckets
= byte_get (nb
, 4);
5287 nchains
= byte_get (nc
, 4);
5289 buckets
= get_dynamic_data (file
, nbuckets
);
5290 chains
= get_dynamic_data (file
, nchains
);
5292 if (buckets
== NULL
|| chains
== NULL
)
5297 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
5302 printf (_("\nSymbol table for image:\n"));
5304 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5306 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5308 for (hn
= 0; hn
< nbuckets
; hn
++)
5313 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
5315 Elf_Internal_Sym
* psym
;
5317 psym
= dynamic_symbols
+ si
;
5319 printf (" %3d %3d: ", si
, hn
);
5320 print_vma (psym
->st_value
, LONG_HEX
);
5322 print_vma (psym
->st_size
, DEC_5
);
5324 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5325 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5326 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5327 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
5328 print_symbol (25, dynamic_strings
+ psym
->st_name
);
5333 else if (do_syms
&& !do_using_dynamic
)
5337 for (i
= 0, section
= section_headers
;
5338 i
< elf_header
.e_shnum
;
5343 Elf_Internal_Sym
* symtab
;
5344 Elf_Internal_Sym
* psym
;
5347 if ( section
->sh_type
!= SHT_SYMTAB
5348 && section
->sh_type
!= SHT_DYNSYM
)
5351 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5352 SECTION_NAME (section
),
5353 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
5355 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5357 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5359 symtab
= GET_ELF_SYMBOLS (file
, section
);
5363 if (section
->sh_link
== elf_header
.e_shstrndx
)
5364 strtab
= string_table
;
5367 Elf32_Internal_Shdr
* string_sec
;
5369 string_sec
= SECTION_HEADER (section
->sh_link
);
5371 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
5372 string_sec
->sh_size
,
5376 for (si
= 0, psym
= symtab
;
5377 si
< section
->sh_size
/ section
->sh_entsize
;
5380 printf ("%6d: ", si
);
5381 print_vma (psym
->st_value
, LONG_HEX
);
5383 print_vma (psym
->st_size
, DEC_5
);
5384 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5385 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5386 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5387 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
5388 print_symbol (25, strtab
+ psym
->st_name
);
5390 if (section
->sh_type
== SHT_DYNSYM
&&
5391 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
5393 unsigned char data
[2];
5394 unsigned short vers_data
;
5395 unsigned long offset
;
5399 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)]
5402 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
5403 sizeof (data
), _("version data"));
5405 vers_data
= byte_get (data
, 2);
5407 is_nobits
= (SECTION_HEADER (psym
->st_shndx
)->sh_type
5410 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
5412 if ((vers_data
& 0x8000) || vers_data
> 1)
5414 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
5415 && (is_nobits
|| ! check_def
))
5417 Elf_External_Verneed evn
;
5418 Elf_Internal_Verneed ivn
;
5419 Elf_Internal_Vernaux ivna
;
5421 /* We must test both. */
5422 offset
= version_info
5423 [DT_VERSIONTAGIDX (DT_VERNEED
)] - loadaddr
;
5427 unsigned long vna_off
;
5429 get_data (&evn
, file
, offset
, sizeof (evn
),
5432 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5433 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5435 vna_off
= offset
+ ivn
.vn_aux
;
5439 Elf_External_Vernaux evna
;
5441 get_data (&evna
, file
, vna_off
,
5443 _("version need aux (3)"));
5445 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5446 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5447 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5449 vna_off
+= ivna
.vna_next
;
5451 while (ivna
.vna_other
!= vers_data
5452 && ivna
.vna_next
!= 0);
5454 if (ivna
.vna_other
== vers_data
)
5457 offset
+= ivn
.vn_next
;
5459 while (ivn
.vn_next
!= 0);
5461 if (ivna
.vna_other
== vers_data
)
5464 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
5467 else if (! is_nobits
)
5468 error (_("bad dynamic symbol"));
5475 if (vers_data
!= 0x8001
5476 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5478 Elf_Internal_Verdef ivd
;
5479 Elf_Internal_Verdaux ivda
;
5480 Elf_External_Verdaux evda
;
5481 unsigned long offset
;
5484 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)]
5489 Elf_External_Verdef evd
;
5491 get_data (&evd
, file
, offset
, sizeof (evd
),
5494 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5495 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5496 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5498 offset
+= ivd
.vd_next
;
5500 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
5501 && ivd
.vd_next
!= 0);
5503 offset
-= ivd
.vd_next
;
5504 offset
+= ivd
.vd_aux
;
5506 get_data (&evda
, file
, offset
, sizeof (evda
),
5507 _("version def aux"));
5509 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5511 if (psym
->st_name
!= ivda
.vda_name
)
5512 printf ((vers_data
& 0x8000)
5514 strtab
+ ivda
.vda_name
);
5524 if (strtab
!= string_table
)
5530 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5532 if (do_histogram
&& buckets
!= NULL
)
5539 int nzero_counts
= 0;
5542 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5544 printf (_(" Length Number %% of total Coverage\n"));
5546 lengths
= (int *) calloc (nbuckets
, sizeof (int));
5547 if (lengths
== NULL
)
5549 error (_("Out of memory"));
5552 for (hn
= 0; hn
< nbuckets
; ++hn
)
5557 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
5560 if (maxlength
< ++lengths
[hn
])
5565 counts
= (int *) calloc (maxlength
+ 1, sizeof (int));
5568 error (_("Out of memory"));
5572 for (hn
= 0; hn
< nbuckets
; ++hn
)
5573 ++ counts
[lengths
[hn
]];
5577 printf (" 0 %-10d (%5.1f%%)\n",
5578 counts
[0], (counts
[0] * 100.0) / nbuckets
);
5579 for (si
= 1; si
<= maxlength
; ++si
)
5581 nzero_counts
+= counts
[si
] * si
;
5582 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5583 si
, counts
[si
], (counts
[si
] * 100.0) / nbuckets
,
5584 (nzero_counts
* 100.0) / nsyms
);
5592 if (buckets
!= NULL
)
5602 process_syminfo (file
)
5603 FILE * file ATTRIBUTE_UNUSED
;
5607 if (dynamic_syminfo
== NULL
5609 /* No syminfo, this is ok. */
5612 /* There better should be a dynamic symbol section. */
5613 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
5617 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5618 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
5620 printf (_(" Num: Name BoundTo Flags\n"));
5621 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
5623 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
5625 printf ("%4d: ", i
);
5626 print_symbol (30, dynamic_strings
+ dynamic_symbols
[i
].st_name
);
5629 switch (dynamic_syminfo
[i
].si_boundto
)
5631 case SYMINFO_BT_SELF
:
5632 fputs ("SELF ", stdout
);
5634 case SYMINFO_BT_PARENT
:
5635 fputs ("PARENT ", stdout
);
5638 if (dynamic_syminfo
[i
].si_boundto
> 0
5639 && dynamic_syminfo
[i
].si_boundto
< dynamic_size
)
5641 print_symbol (10, dynamic_strings
5643 [dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
);
5647 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
5651 if (flags
& SYMINFO_FLG_DIRECT
)
5653 if (flags
& SYMINFO_FLG_PASSTHRU
)
5654 printf (" PASSTHRU");
5655 if (flags
& SYMINFO_FLG_COPY
)
5657 if (flags
& SYMINFO_FLG_LAZYLOAD
)
5658 printf (" LAZYLOAD");
5666 #ifdef SUPPORT_DISASSEMBLY
5668 disassemble_section (section
, file
)
5669 Elf32_Internal_Shdr
* section
;
5672 printf (_("\nAssembly dump of section %s\n"),
5673 SECTION_NAME (section
));
5675 /* XXX -- to be done --- XXX */
5682 dump_section (section
, file
)
5683 Elf32_Internal_Shdr
* section
;
5686 bfd_size_type bytes
;
5688 unsigned char * data
;
5689 unsigned char * start
;
5691 bytes
= section
->sh_size
;
5695 printf (_("\nSection '%s' has no data to dump.\n"),
5696 SECTION_NAME (section
));
5700 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
5702 addr
= section
->sh_addr
;
5704 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
, bytes
,
5717 lbytes
= (bytes
> 16 ? 16 : bytes
);
5719 printf (" 0x%8.8lx ", (unsigned long) addr
);
5721 switch (elf_header
.e_ident
[EI_DATA
])
5725 for (j
= 15; j
>= 0; j
--)
5728 printf ("%2.2x", data
[j
]);
5738 for (j
= 0; j
< 16; j
++)
5741 printf ("%2.2x", data
[j
]);
5751 for (j
= 0; j
< lbytes
; j
++)
5754 if (k
>= ' ' && k
< 0x80)
5773 static unsigned long int
5774 read_leb128 (data
, length_return
, sign
)
5775 unsigned char * data
;
5776 int * length_return
;
5779 unsigned long int result
= 0;
5780 unsigned int num_read
= 0;
5789 result
|= (byte
& 0x7f) << shift
;
5794 while (byte
& 0x80);
5796 if (length_return
!= NULL
)
5797 * length_return
= num_read
;
5799 if (sign
&& (shift
< 32) && (byte
& 0x40))
5800 result
|= -1 << shift
;
5805 typedef struct State_Machine_Registers
5807 unsigned long address
;
5810 unsigned int column
;
5814 /* This variable hold the number of the last entry seen
5815 in the File Table. */
5816 unsigned int last_file_entry
;
5819 static SMR state_machine_regs
;
5822 reset_state_machine (is_stmt
)
5825 state_machine_regs
.address
= 0;
5826 state_machine_regs
.file
= 1;
5827 state_machine_regs
.line
= 1;
5828 state_machine_regs
.column
= 0;
5829 state_machine_regs
.is_stmt
= is_stmt
;
5830 state_machine_regs
.basic_block
= 0;
5831 state_machine_regs
.end_sequence
= 0;
5832 state_machine_regs
.last_file_entry
= 0;
5835 /* Handled an extend line op. Returns true if this is the end
5838 process_extended_line_op (data
, is_stmt
, pointer_size
)
5839 unsigned char * data
;
5843 unsigned char op_code
;
5846 unsigned char * name
;
5849 len
= read_leb128 (data
, & bytes_read
, 0);
5854 warn (_("badly formed extended line op encountered!\n"));
5859 op_code
= * data
++;
5861 printf (_(" Extended opcode %d: "), op_code
);
5865 case DW_LNE_end_sequence
:
5866 printf (_("End of Sequence\n\n"));
5867 reset_state_machine (is_stmt
);
5870 case DW_LNE_set_address
:
5871 adr
= byte_get (data
, pointer_size
);
5872 printf (_("set Address to 0x%lx\n"), adr
);
5873 state_machine_regs
.address
= adr
;
5876 case DW_LNE_define_file
:
5877 printf (_(" define new File Table entry\n"));
5878 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5880 printf (_(" %d\t"), ++ state_machine_regs
.last_file_entry
);
5882 data
+= strlen ((char *) data
) + 1;
5883 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5885 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5887 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
5888 printf (_("%s\n\n"), name
);
5892 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
5899 /* Size of pointers in the .debug_line section. This information is not
5900 really present in that section. It's obtained before dumping the debug
5901 sections by doing some pre-scan of the .debug_info section. */
5902 static int debug_line_pointer_size
= 4;
5905 display_debug_lines (section
, start
, file
)
5906 Elf32_Internal_Shdr
* section
;
5907 unsigned char * start
;
5908 FILE * file ATTRIBUTE_UNUSED
;
5910 DWARF2_External_LineInfo
* external
;
5911 DWARF2_Internal_LineInfo info
;
5912 unsigned char * standard_opcodes
;
5913 unsigned char * data
= start
;
5914 unsigned char * end
= start
+ section
->sh_size
;
5915 unsigned char * end_of_sequence
;
5918 printf (_("\nDump of debug contents of section %s:\n\n"),
5919 SECTION_NAME (section
));
5923 external
= (DWARF2_External_LineInfo
*) data
;
5925 /* Check the length of the block. */
5926 info
.li_length
= BYTE_GET (external
->li_length
);
5928 if (info
.li_length
== 0xffffffff)
5930 warn (_("64-bit DWARF line info is not supported yet.\n"));
5934 if (info
.li_length
+ sizeof (external
->li_length
) > section
->sh_size
)
5937 (_("The line info appears to be corrupt - the section is too small\n"));
5941 /* Check its version number. */
5942 info
.li_version
= BYTE_GET (external
->li_version
);
5943 if (info
.li_version
!= 2)
5945 warn (_("Only DWARF version 2 line info is currently supported.\n"));
5949 info
.li_prologue_length
= BYTE_GET (external
->li_prologue_length
);
5950 info
.li_min_insn_length
= BYTE_GET (external
->li_min_insn_length
);
5951 info
.li_default_is_stmt
= BYTE_GET (external
->li_default_is_stmt
);
5952 info
.li_line_base
= BYTE_GET (external
->li_line_base
);
5953 info
.li_line_range
= BYTE_GET (external
->li_line_range
);
5954 info
.li_opcode_base
= BYTE_GET (external
->li_opcode_base
);
5956 /* Sign extend the line base field. */
5957 info
.li_line_base
<<= 24;
5958 info
.li_line_base
>>= 24;
5960 printf (_(" Length: %ld\n"), info
.li_length
);
5961 printf (_(" DWARF Version: %d\n"), info
.li_version
);
5962 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
5963 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
5964 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
5965 printf (_(" Line Base: %d\n"), info
.li_line_base
);
5966 printf (_(" Line Range: %d\n"), info
.li_line_range
);
5967 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
5969 end_of_sequence
= data
+ info
.li_length
+ sizeof (external
->li_length
);
5971 reset_state_machine (info
.li_default_is_stmt
);
5973 /* Display the contents of the Opcodes table. */
5974 standard_opcodes
= data
+ sizeof (* external
);
5976 printf (_("\n Opcodes:\n"));
5978 for (i
= 1; i
< info
.li_opcode_base
; i
++)
5979 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
5981 /* Display the contents of the Directory table. */
5982 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
5985 printf (_("\n The Directory Table is empty.\n"));
5988 printf (_("\n The Directory Table:\n"));
5992 printf (_(" %s\n"), data
);
5994 data
+= strlen ((char *) data
) + 1;
5998 /* Skip the NUL at the end of the table. */
6001 /* Display the contents of the File Name table. */
6003 printf (_("\n The File Name Table is empty.\n"));
6006 printf (_("\n The File Name Table:\n"));
6007 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6011 unsigned char * name
;
6014 printf (_(" %d\t"), ++ state_machine_regs
.last_file_entry
);
6017 data
+= strlen ((char *) data
) + 1;
6019 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6021 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6023 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6025 printf (_("%s\n"), name
);
6029 /* Skip the NUL at the end of the table. */
6032 /* Now display the statements. */
6033 printf (_("\n Line Number Statements:\n"));
6036 while (data
< end_of_sequence
)
6038 unsigned char op_code
;
6042 op_code
= * data
++;
6044 if (op_code
>= info
.li_opcode_base
)
6046 op_code
-= info
.li_opcode_base
;
6047 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
6048 state_machine_regs
.address
+= adv
;
6049 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6050 op_code
, adv
, state_machine_regs
.address
);
6051 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
6052 state_machine_regs
.line
+= adv
;
6053 printf (_(" and Line by %d to %d\n"),
6054 adv
, state_machine_regs
.line
);
6056 else switch (op_code
)
6058 case DW_LNS_extended_op
:
6059 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
6060 debug_line_pointer_size
);
6064 printf (_(" Copy\n"));
6067 case DW_LNS_advance_pc
:
6068 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
6070 state_machine_regs
.address
+= adv
;
6071 printf (_(" Advance PC by %d to %lx\n"), adv
,
6072 state_machine_regs
.address
);
6075 case DW_LNS_advance_line
:
6076 adv
= read_leb128 (data
, & bytes_read
, 1);
6078 state_machine_regs
.line
+= adv
;
6079 printf (_(" Advance Line by %d to %d\n"), adv
,
6080 state_machine_regs
.line
);
6083 case DW_LNS_set_file
:
6084 adv
= read_leb128 (data
, & bytes_read
, 0);
6086 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6088 state_machine_regs
.file
= adv
;
6091 case DW_LNS_set_column
:
6092 adv
= read_leb128 (data
, & bytes_read
, 0);
6094 printf (_(" Set column to %d\n"), adv
);
6095 state_machine_regs
.column
= adv
;
6098 case DW_LNS_negate_stmt
:
6099 adv
= state_machine_regs
.is_stmt
;
6101 printf (_(" Set is_stmt to %d\n"), adv
);
6102 state_machine_regs
.is_stmt
= adv
;
6105 case DW_LNS_set_basic_block
:
6106 printf (_(" Set basic block\n"));
6107 state_machine_regs
.basic_block
= 1;
6110 case DW_LNS_const_add_pc
:
6111 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
6112 * info
.li_min_insn_length
);
6113 state_machine_regs
.address
+= adv
;
6114 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
6115 state_machine_regs
.address
);
6118 case DW_LNS_fixed_advance_pc
:
6119 adv
= byte_get (data
, 2);
6121 state_machine_regs
.address
+= adv
;
6122 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6123 adv
, state_machine_regs
.address
);
6126 case DW_LNS_set_prologue_end
:
6127 printf (_(" Set prologue_end to true\n"));
6130 case DW_LNS_set_epilogue_begin
:
6131 printf (_(" Set epilogue_begin to true\n"));
6134 case DW_LNS_set_isa
:
6135 adv
= read_leb128 (data
, & bytes_read
, 0);
6137 printf (_(" Set ISA to %d\n"), adv
);
6141 printf (_(" Unknown opcode %d with operands: "), op_code
);
6144 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
6146 printf ("0x%lx%s", read_leb128 (data
, &bytes_read
, 0),
6147 i
== 1 ? "" : ", ");
6162 display_debug_pubnames (section
, start
, file
)
6163 Elf32_Internal_Shdr
* section
;
6164 unsigned char * start
;
6165 FILE * file ATTRIBUTE_UNUSED
;
6167 DWARF2_External_PubNames
* external
;
6168 DWARF2_Internal_PubNames pubnames
;
6169 unsigned char * end
;
6171 end
= start
+ section
->sh_size
;
6173 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6177 unsigned char * data
;
6178 unsigned long offset
;
6180 external
= (DWARF2_External_PubNames
*) start
;
6182 pubnames
.pn_length
= BYTE_GET (external
->pn_length
);
6183 pubnames
.pn_version
= BYTE_GET (external
->pn_version
);
6184 pubnames
.pn_offset
= BYTE_GET (external
->pn_offset
);
6185 pubnames
.pn_size
= BYTE_GET (external
->pn_size
);
6187 data
= start
+ sizeof (* external
);
6188 start
+= pubnames
.pn_length
+ sizeof (external
->pn_length
);
6190 if (pubnames
.pn_length
== 0xffffffff)
6192 warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6196 if (pubnames
.pn_version
!= 2)
6198 static int warned
= 0;
6202 warn (_("Only DWARF 2 pubnames are currently supported\n"));
6209 printf (_(" Length: %ld\n"),
6210 pubnames
.pn_length
);
6211 printf (_(" Version: %d\n"),
6212 pubnames
.pn_version
);
6213 printf (_(" Offset into .debug_info section: %ld\n"),
6214 pubnames
.pn_offset
);
6215 printf (_(" Size of area in .debug_info section: %ld\n"),
6218 printf (_("\n Offset\tName\n"));
6222 offset
= byte_get (data
, 4);
6227 printf (" %ld\t\t%s\n", offset
, data
);
6228 data
+= strlen ((char *) data
) + 1;
6231 while (offset
!= 0);
6244 case DW_TAG_padding
: return "DW_TAG_padding";
6245 case DW_TAG_array_type
: return "DW_TAG_array_type";
6246 case DW_TAG_class_type
: return "DW_TAG_class_type";
6247 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
6248 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
6249 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
6250 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
6251 case DW_TAG_label
: return "DW_TAG_label";
6252 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
6253 case DW_TAG_member
: return "DW_TAG_member";
6254 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
6255 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
6256 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
6257 case DW_TAG_string_type
: return "DW_TAG_string_type";
6258 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
6259 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
6260 case DW_TAG_typedef
: return "DW_TAG_typedef";
6261 case DW_TAG_union_type
: return "DW_TAG_union_type";
6262 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
6263 case DW_TAG_variant
: return "DW_TAG_variant";
6264 case DW_TAG_common_block
: return "DW_TAG_common_block";
6265 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
6266 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
6267 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
6268 case DW_TAG_module
: return "DW_TAG_module";
6269 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
6270 case DW_TAG_set_type
: return "DW_TAG_set_type";
6271 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
6272 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
6273 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
6274 case DW_TAG_base_type
: return "DW_TAG_base_type";
6275 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
6276 case DW_TAG_const_type
: return "DW_TAG_const_type";
6277 case DW_TAG_constant
: return "DW_TAG_constant";
6278 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
6279 case DW_TAG_file_type
: return "DW_TAG_file_type";
6280 case DW_TAG_friend
: return "DW_TAG_friend";
6281 case DW_TAG_namelist
: return "DW_TAG_namelist";
6282 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
6283 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
6284 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
6285 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
6286 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
6287 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
6288 case DW_TAG_try_block
: return "DW_TAG_try_block";
6289 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
6290 case DW_TAG_variable
: return "DW_TAG_variable";
6291 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
6292 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
6293 case DW_TAG_format_label
: return "DW_TAG_format_label";
6294 case DW_TAG_function_template
: return "DW_TAG_function_template";
6295 case DW_TAG_class_template
: return "DW_TAG_class_template";
6296 /* DWARF 2.1 values. */
6297 case DW_TAG_dwarf_procedure
: return "DW_TAG_dwarf_procedure";
6298 case DW_TAG_restrict_type
: return "DW_TAG_restrict_type";
6299 case DW_TAG_interface_type
: return "DW_TAG_interface_type";
6300 case DW_TAG_namespace
: return "DW_TAG_namespace";
6301 case DW_TAG_imported_module
: return "DW_TAG_imported_module";
6302 case DW_TAG_unspecified_type
: return "DW_TAG_unspecified_type";
6303 case DW_TAG_partial_unit
: return "DW_TAG_partial_unit";
6304 case DW_TAG_imported_unit
: return "DW_TAG_imported_unit";
6307 static char buffer
[100];
6309 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
6316 get_AT_name (attribute
)
6317 unsigned long attribute
;
6321 case DW_AT_sibling
: return "DW_AT_sibling";
6322 case DW_AT_location
: return "DW_AT_location";
6323 case DW_AT_name
: return "DW_AT_name";
6324 case DW_AT_ordering
: return "DW_AT_ordering";
6325 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
6326 case DW_AT_byte_size
: return "DW_AT_byte_size";
6327 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
6328 case DW_AT_bit_size
: return "DW_AT_bit_size";
6329 case DW_AT_element_list
: return "DW_AT_element_list";
6330 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
6331 case DW_AT_low_pc
: return "DW_AT_low_pc";
6332 case DW_AT_high_pc
: return "DW_AT_high_pc";
6333 case DW_AT_language
: return "DW_AT_language";
6334 case DW_AT_member
: return "DW_AT_member";
6335 case DW_AT_discr
: return "DW_AT_discr";
6336 case DW_AT_discr_value
: return "DW_AT_discr_value";
6337 case DW_AT_visibility
: return "DW_AT_visibility";
6338 case DW_AT_import
: return "DW_AT_import";
6339 case DW_AT_string_length
: return "DW_AT_string_length";
6340 case DW_AT_common_reference
: return "DW_AT_common_reference";
6341 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
6342 case DW_AT_const_value
: return "DW_AT_const_value";
6343 case DW_AT_containing_type
: return "DW_AT_containing_type";
6344 case DW_AT_default_value
: return "DW_AT_default_value";
6345 case DW_AT_inline
: return "DW_AT_inline";
6346 case DW_AT_is_optional
: return "DW_AT_is_optional";
6347 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
6348 case DW_AT_producer
: return "DW_AT_producer";
6349 case DW_AT_prototyped
: return "DW_AT_prototyped";
6350 case DW_AT_return_addr
: return "DW_AT_return_addr";
6351 case DW_AT_start_scope
: return "DW_AT_start_scope";
6352 case DW_AT_stride_size
: return "DW_AT_stride_size";
6353 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
6354 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
6355 case DW_AT_accessibility
: return "DW_AT_accessibility";
6356 case DW_AT_address_class
: return "DW_AT_address_class";
6357 case DW_AT_artificial
: return "DW_AT_artificial";
6358 case DW_AT_base_types
: return "DW_AT_base_types";
6359 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
6360 case DW_AT_count
: return "DW_AT_count";
6361 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
6362 case DW_AT_decl_column
: return "DW_AT_decl_column";
6363 case DW_AT_decl_file
: return "DW_AT_decl_file";
6364 case DW_AT_decl_line
: return "DW_AT_decl_line";
6365 case DW_AT_declaration
: return "DW_AT_declaration";
6366 case DW_AT_discr_list
: return "DW_AT_discr_list";
6367 case DW_AT_encoding
: return "DW_AT_encoding";
6368 case DW_AT_external
: return "DW_AT_external";
6369 case DW_AT_frame_base
: return "DW_AT_frame_base";
6370 case DW_AT_friend
: return "DW_AT_friend";
6371 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
6372 case DW_AT_macro_info
: return "DW_AT_macro_info";
6373 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
6374 case DW_AT_priority
: return "DW_AT_priority";
6375 case DW_AT_segment
: return "DW_AT_segment";
6376 case DW_AT_specification
: return "DW_AT_specification";
6377 case DW_AT_static_link
: return "DW_AT_static_link";
6378 case DW_AT_type
: return "DW_AT_type";
6379 case DW_AT_use_location
: return "DW_AT_use_location";
6380 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
6381 case DW_AT_virtuality
: return "DW_AT_virtuality";
6382 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
6383 /* DWARF 2.1 values. */
6384 case DW_AT_allocated
: return "DW_AT_allocated";
6385 case DW_AT_associated
: return "DW_AT_associated";
6386 case DW_AT_data_location
: return "DW_AT_data_location";
6387 case DW_AT_stride
: return "DW_AT_stride";
6388 case DW_AT_entry_pc
: return "DW_AT_entry_pc";
6389 case DW_AT_use_UTF8
: return "DW_AT_use_UTF8";
6390 case DW_AT_extension
: return "DW_AT_extension";
6391 case DW_AT_ranges
: return "DW_AT_ranges";
6392 case DW_AT_trampoline
: return "DW_AT_trampoline";
6393 case DW_AT_call_column
: return "DW_AT_call_column";
6394 case DW_AT_call_file
: return "DW_AT_call_file";
6395 case DW_AT_call_line
: return "DW_AT_call_line";
6396 /* SGI/MIPS extensions. */
6397 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
6398 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
6399 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
6400 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
6401 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
6402 case DW_AT_MIPS_software_pipeline_depth
: return "DW_AT_MIPS_software_pipeline_depth";
6403 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
6404 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
6405 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
6406 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
6407 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
6408 /* GNU extensions. */
6409 case DW_AT_sf_names
: return "DW_AT_sf_names";
6410 case DW_AT_src_info
: return "DW_AT_src_info";
6411 case DW_AT_mac_info
: return "DW_AT_mac_info";
6412 case DW_AT_src_coords
: return "DW_AT_src_coords";
6413 case DW_AT_body_begin
: return "DW_AT_body_begin";
6414 case DW_AT_body_end
: return "DW_AT_body_end";
6417 static char buffer
[100];
6419 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
6426 get_FORM_name (form
)
6431 case DW_FORM_addr
: return "DW_FORM_addr";
6432 case DW_FORM_block2
: return "DW_FORM_block2";
6433 case DW_FORM_block4
: return "DW_FORM_block4";
6434 case DW_FORM_data2
: return "DW_FORM_data2";
6435 case DW_FORM_data4
: return "DW_FORM_data4";
6436 case DW_FORM_data8
: return "DW_FORM_data8";
6437 case DW_FORM_string
: return "DW_FORM_string";
6438 case DW_FORM_block
: return "DW_FORM_block";
6439 case DW_FORM_block1
: return "DW_FORM_block1";
6440 case DW_FORM_data1
: return "DW_FORM_data1";
6441 case DW_FORM_flag
: return "DW_FORM_flag";
6442 case DW_FORM_sdata
: return "DW_FORM_sdata";
6443 case DW_FORM_strp
: return "DW_FORM_strp";
6444 case DW_FORM_udata
: return "DW_FORM_udata";
6445 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
6446 case DW_FORM_ref1
: return "DW_FORM_ref1";
6447 case DW_FORM_ref2
: return "DW_FORM_ref2";
6448 case DW_FORM_ref4
: return "DW_FORM_ref4";
6449 case DW_FORM_ref8
: return "DW_FORM_ref8";
6450 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
6451 case DW_FORM_indirect
: return "DW_FORM_indirect";
6454 static char buffer
[100];
6456 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
6462 /* FIXME: There are better and more effiecint ways to handle
6463 these structures. For now though, I just want something that
6464 is simple to implement. */
6465 typedef struct abbrev_attr
6467 unsigned long attribute
;
6469 struct abbrev_attr
* next
;
6473 typedef struct abbrev_entry
6475 unsigned long entry
;
6478 struct abbrev_attr
* first_attr
;
6479 struct abbrev_attr
* last_attr
;
6480 struct abbrev_entry
* next
;
6484 static abbrev_entry
* first_abbrev
= NULL
;
6485 static abbrev_entry
* last_abbrev
= NULL
;
6488 free_abbrevs
PARAMS ((void))
6490 abbrev_entry
* abbrev
;
6492 for (abbrev
= first_abbrev
; abbrev
;)
6494 abbrev_entry
* next
= abbrev
->next
;
6497 for (attr
= abbrev
->first_attr
; attr
;)
6499 abbrev_attr
* next
= attr
->next
;
6509 last_abbrev
= first_abbrev
= NULL
;
6513 add_abbrev (number
, tag
, children
)
6514 unsigned long number
;
6518 abbrev_entry
* entry
;
6520 entry
= (abbrev_entry
*) malloc (sizeof (* entry
));
6526 entry
->entry
= number
;
6528 entry
->children
= children
;
6529 entry
->first_attr
= NULL
;
6530 entry
->last_attr
= NULL
;
6533 if (first_abbrev
== NULL
)
6534 first_abbrev
= entry
;
6536 last_abbrev
->next
= entry
;
6538 last_abbrev
= entry
;
6542 add_abbrev_attr (attribute
, form
)
6543 unsigned long attribute
;
6548 attr
= (abbrev_attr
*) malloc (sizeof (* attr
));
6554 attr
->attribute
= attribute
;
6558 if (last_abbrev
->first_attr
== NULL
)
6559 last_abbrev
->first_attr
= attr
;
6561 last_abbrev
->last_attr
->next
= attr
;
6563 last_abbrev
->last_attr
= attr
;
6566 /* Processes the (partial) contents of a .debug_abbrev section.
6567 Returns NULL if the end of the section was encountered.
6568 Returns the address after the last byte read if the end of
6569 an abbreviation set was found. */
6571 static unsigned char *
6572 process_abbrev_section (start
, end
)
6573 unsigned char * start
;
6574 unsigned char * end
;
6576 if (first_abbrev
!= NULL
)
6582 unsigned long entry
;
6584 unsigned long attribute
;
6587 entry
= read_leb128 (start
, & bytes_read
, 0);
6588 start
+= bytes_read
;
6590 /* A single zero is supposed to end the section according
6591 to the standard. If there's more, then signal that to
6594 return start
== end
? NULL
: start
;
6596 tag
= read_leb128 (start
, & bytes_read
, 0);
6597 start
+= bytes_read
;
6599 children
= * start
++;
6601 add_abbrev (entry
, tag
, children
);
6607 attribute
= read_leb128 (start
, & bytes_read
, 0);
6608 start
+= bytes_read
;
6610 form
= read_leb128 (start
, & bytes_read
, 0);
6611 start
+= bytes_read
;
6614 add_abbrev_attr (attribute
, form
);
6616 while (attribute
!= 0);
6624 display_debug_macinfo (section
, start
, file
)
6625 Elf32_Internal_Shdr
* section
;
6626 unsigned char * start
;
6627 FILE * file ATTRIBUTE_UNUSED
;
6629 unsigned char * end
= start
+ section
->sh_size
;
6630 unsigned char * curr
= start
;
6631 unsigned int bytes_read
;
6632 enum dwarf_macinfo_record_type op
;
6634 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6638 unsigned int lineno
;
6639 const char * string
;
6646 case DW_MACINFO_start_file
:
6648 unsigned int filenum
;
6650 lineno
= read_leb128 (curr
, & bytes_read
, 0);
6652 filenum
= read_leb128 (curr
, & bytes_read
, 0);
6655 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno
, filenum
);
6659 case DW_MACINFO_end_file
:
6660 printf (_(" DW_MACINFO_end_file\n"));
6663 case DW_MACINFO_define
:
6664 lineno
= read_leb128 (curr
, & bytes_read
, 0);
6667 curr
+= strlen (string
) + 1;
6668 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno
, string
);
6671 case DW_MACINFO_undef
:
6672 lineno
= read_leb128 (curr
, & bytes_read
, 0);
6675 curr
+= strlen (string
) + 1;
6676 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno
, string
);
6679 case DW_MACINFO_vendor_ext
:
6681 unsigned int constant
;
6683 constant
= read_leb128 (curr
, & bytes_read
, 0);
6686 curr
+= strlen (string
) + 1;
6687 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant
, string
);
6698 display_debug_abbrev (section
, start
, file
)
6699 Elf32_Internal_Shdr
* section
;
6700 unsigned char * start
;
6701 FILE * file ATTRIBUTE_UNUSED
;
6703 abbrev_entry
* entry
;
6704 unsigned char * end
= start
+ section
->sh_size
;
6706 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6710 start
= process_abbrev_section (start
, end
);
6712 if (first_abbrev
== NULL
)
6715 printf (_(" Number TAG\n"));
6717 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
6721 printf (_(" %ld %s [%s]\n"),
6723 get_TAG_name (entry
->tag
),
6724 entry
->children
? _("has children") : _("no children"));
6726 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
6728 printf (_(" %-18s %s\n"),
6729 get_AT_name (attr
->attribute
),
6730 get_FORM_name (attr
->form
));
6744 static unsigned char *
6745 display_block (data
, length
)
6746 unsigned char * data
;
6747 unsigned long length
;
6749 printf (_(" %lu byte block: "), length
);
6752 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
6758 decode_location_expression (data
, pointer_size
, length
)
6759 unsigned char * data
;
6760 unsigned int pointer_size
;
6761 unsigned long length
;
6765 unsigned long uvalue
;
6766 unsigned char * end
= data
+ length
;
6775 printf ("DW_OP_addr: %lx",
6776 (unsigned long) byte_get (data
, pointer_size
));
6777 data
+= pointer_size
;
6780 printf ("DW_OP_deref");
6783 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
6786 printf ("DW_OP_const1s: %ld", (long) byte_get (data
++, 1));
6789 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
6793 printf ("DW_OP_const2s: %ld", (long) byte_get (data
, 2));
6797 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
6801 printf ("DW_OP_const4s: %ld", (long) byte_get (data
, 4));
6805 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
6806 (unsigned long) byte_get (data
+ 4, 4));
6810 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
6811 (long) byte_get (data
+ 4, 4));
6815 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
6819 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
6823 printf ("DW_OP_dup");
6826 printf ("DW_OP_drop");
6829 printf ("DW_OP_over");
6832 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
6835 printf ("DW_OP_swap");
6838 printf ("DW_OP_rot");
6841 printf ("DW_OP_xderef");
6844 printf ("DW_OP_abs");
6847 printf ("DW_OP_and");
6850 printf ("DW_OP_div");
6853 printf ("DW_OP_minus");
6856 printf ("DW_OP_mod");
6859 printf ("DW_OP_mul");
6862 printf ("DW_OP_neg");
6865 printf ("DW_OP_not");
6868 printf ("DW_OP_or");
6871 printf ("DW_OP_plus");
6873 case DW_OP_plus_uconst
:
6874 printf ("DW_OP_plus_uconst: %lu",
6875 read_leb128 (data
, &bytes_read
, 0));
6879 printf ("DW_OP_shl");
6882 printf ("DW_OP_shr");
6885 printf ("DW_OP_shra");
6888 printf ("DW_OP_xor");
6891 printf ("DW_OP_bra: %ld", (long) byte_get (data
, 2));
6895 printf ("DW_OP_eq");
6898 printf ("DW_OP_ge");
6901 printf ("DW_OP_gt");
6904 printf ("DW_OP_le");
6907 printf ("DW_OP_lt");
6910 printf ("DW_OP_ne");
6913 printf ("DW_OP_skip: %ld", (long) byte_get (data
, 2));
6949 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
6984 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
7019 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
7020 read_leb128 (data
, &bytes_read
, 1));
7025 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
7029 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
7033 uvalue
= read_leb128 (data
, &bytes_read
, 0);
7035 printf ("DW_OP_bregx: %lu %ld", uvalue
,
7036 read_leb128 (data
, &bytes_read
, 1));
7040 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
7043 case DW_OP_deref_size
:
7044 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
7046 case DW_OP_xderef_size
:
7047 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
7050 printf ("DW_OP_nop");
7053 /* DWARF 2.1 extensions. */
7054 case DW_OP_push_object_address
:
7055 printf ("DW_OP_push_object_address");
7058 printf ("DW_OP_call2: <%lx>", (long) byte_get (data
, 2));
7062 printf ("DW_OP_call4: <%lx>", (long) byte_get (data
, 4));
7066 printf ("DW_OP_calli");
7070 if (op
>= DW_OP_lo_user
7071 && op
<= DW_OP_hi_user
)
7072 printf (_("(User defined location op)"));
7074 printf (_("(Unknown location op)"));
7075 /* No way to tell where the next op is, so just bail. */
7079 /* Separate the ops. */
7085 static const char * debug_str_contents
;
7086 static bfd_vma debug_str_size
;
7089 load_debug_str (file
)
7092 Elf32_Internal_Shdr
* sec
;
7095 /* If it is already loaded, do nothing. */
7096 if (debug_str_contents
!= NULL
)
7099 /* Locate the .debug_str section. */
7100 for (i
= 0, sec
= section_headers
;
7101 i
< elf_header
.e_shnum
;
7103 if (strcmp (SECTION_NAME (sec
), ".debug_str") == 0)
7106 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
7109 debug_str_size
= sec
->sh_size
;
7111 debug_str_contents
= ((char *)
7112 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7113 _("debug_str section data")));
7119 if (debug_str_contents
== NULL
)
7122 free ((char *) debug_str_contents
);
7123 debug_str_contents
= NULL
;
7128 fetch_indirect_string (offset
)
7129 unsigned long offset
;
7131 if (debug_str_contents
== NULL
)
7132 return _("<no .debug_str section>");
7134 if (offset
> debug_str_size
)
7135 return _("<offset is too big>");
7137 return debug_str_contents
+ offset
;
7142 display_debug_str (section
, start
, file
)
7143 Elf32_Internal_Shdr
* section
;
7144 unsigned char * start
;
7145 FILE * file ATTRIBUTE_UNUSED
;
7147 unsigned long bytes
;
7150 addr
= section
->sh_addr
;
7151 bytes
= section
->sh_size
;
7155 printf (_("\nThe .debug_str section is empty.\n"));
7159 printf (_("Contents of the .debug_str section:\n\n"));
7167 lbytes
= (bytes
> 16 ? 16 : bytes
);
7169 printf (" 0x%8.8lx ", (unsigned long) addr
);
7171 for (j
= 0; j
< 16; j
++)
7174 printf ("%2.2x", start
[j
]);
7182 for (j
= 0; j
< lbytes
; j
++)
7185 if (k
>= ' ' && k
< 0x80)
7202 static unsigned char *
7203 read_and_display_attr_value (attribute
, form
, data
, cu_offset
, pointer_size
)
7204 unsigned long attribute
;
7206 unsigned char * data
;
7207 unsigned long cu_offset
;
7208 unsigned long pointer_size
;
7210 unsigned long uvalue
= 0;
7211 unsigned char * block_start
= NULL
;
7219 case DW_FORM_ref_addr
:
7221 uvalue
= byte_get (data
, pointer_size
);
7222 data
+= pointer_size
;
7226 uvalue
= byte_get (data
, /* offset_size */ 4);
7227 data
+= /* offset_size */ 4;
7233 uvalue
= byte_get (data
++, 1);
7238 uvalue
= byte_get (data
, 2);
7244 uvalue
= byte_get (data
, 4);
7249 uvalue
= read_leb128 (data
, & bytes_read
, 1);
7253 case DW_FORM_ref_udata
:
7255 uvalue
= read_leb128 (data
, & bytes_read
, 0);
7259 case DW_FORM_indirect
:
7260 form
= read_leb128 (data
, & bytes_read
, 0);
7262 printf (" %s", get_FORM_name (form
));
7263 return read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
7269 case DW_FORM_ref_addr
:
7270 printf (" <#%lx>", uvalue
);
7276 case DW_FORM_ref_udata
:
7277 printf (" <%lx>", uvalue
+ cu_offset
);
7281 printf (" %#lx", uvalue
);
7289 printf (" %ld", uvalue
);
7294 uvalue
= byte_get (data
, 4);
7295 printf (" %lx", uvalue
);
7296 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
7300 case DW_FORM_string
:
7301 printf (" %s", data
);
7302 data
+= strlen ((char *) data
) + 1;
7306 uvalue
= read_leb128 (data
, & bytes_read
, 0);
7307 block_start
= data
+ bytes_read
;
7308 data
= display_block (block_start
, uvalue
);
7311 case DW_FORM_block1
:
7312 uvalue
= byte_get (data
, 1);
7313 block_start
= data
+ 1;
7314 data
= display_block (block_start
, uvalue
);
7317 case DW_FORM_block2
:
7318 uvalue
= byte_get (data
, 2);
7319 block_start
= data
+ 2;
7320 data
= display_block (block_start
, uvalue
);
7323 case DW_FORM_block4
:
7324 uvalue
= byte_get (data
, 4);
7325 block_start
= data
+ 4;
7326 data
= display_block (block_start
, uvalue
);
7330 printf (_(" (indirect string, offset: 0x%lx): "), uvalue
);
7331 printf (fetch_indirect_string (uvalue
));
7334 case DW_FORM_indirect
:
7335 /* Handled above. */
7339 warn (_("Unrecognised form: %d\n"), form
);
7343 /* For some attributes we can display futher information. */
7352 case DW_INL_not_inlined
: printf (_("(not inlined)")); break;
7353 case DW_INL_inlined
: printf (_("(inlined)")); break;
7354 case DW_INL_declared_not_inlined
: printf (_("(declared as inline but ignored)")); break;
7355 case DW_INL_declared_inlined
: printf (_("(declared as inline and inlined)")); break;
7356 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue
); break;
7360 case DW_AT_language
:
7363 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
7364 case DW_LANG_C89
: printf ("(ANSI C)"); break;
7365 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
7366 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
7367 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
7368 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
7369 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
7370 case DW_LANG_Ada83
: printf ("(Ada)"); break;
7371 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
7372 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
7373 /* DWARF 2.1 values. */
7374 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
7375 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
7376 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
7377 /* MIPS extension. */
7378 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
7379 default: printf ("(Unknown: %lx)", uvalue
); break;
7383 case DW_AT_encoding
:
7386 case DW_ATE_void
: printf ("(void)"); break;
7387 case DW_ATE_address
: printf ("(machine address)"); break;
7388 case DW_ATE_boolean
: printf ("(boolean)"); break;
7389 case DW_ATE_complex_float
: printf ("(complex float)"); break;
7390 case DW_ATE_float
: printf ("(float)"); break;
7391 case DW_ATE_signed
: printf ("(signed)"); break;
7392 case DW_ATE_signed_char
: printf ("(signed char)"); break;
7393 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
7394 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
7395 /* DWARF 2.1 value. */
7396 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
7398 if (uvalue
>= DW_ATE_lo_user
7399 && uvalue
<= DW_ATE_hi_user
)
7400 printf ("(user defined type)");
7402 printf ("(unknown type)");
7407 case DW_AT_accessibility
:
7410 case DW_ACCESS_public
: printf ("(public)"); break;
7411 case DW_ACCESS_protected
: printf ("(protected)"); break;
7412 case DW_ACCESS_private
: printf ("(private)"); break;
7413 default: printf ("(unknown accessibility)"); break;
7417 case DW_AT_visibility
:
7420 case DW_VIS_local
: printf ("(local)"); break;
7421 case DW_VIS_exported
: printf ("(exported)"); break;
7422 case DW_VIS_qualified
: printf ("(qualified)"); break;
7423 default: printf ("(unknown visibility)"); break;
7427 case DW_AT_virtuality
:
7430 case DW_VIRTUALITY_none
: printf ("(none)"); break;
7431 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
7432 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
7433 default: printf ("(unknown virtuality)"); break;
7437 case DW_AT_identifier_case
:
7440 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
7441 case DW_ID_up_case
: printf ("(up_case)"); break;
7442 case DW_ID_down_case
: printf ("(down_case)"); break;
7443 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
7444 default: printf ("(unknown case)"); break;
7448 case DW_AT_calling_convention
:
7451 case DW_CC_normal
: printf ("(normal)"); break;
7452 case DW_CC_program
: printf ("(program)"); break;
7453 case DW_CC_nocall
: printf ("(nocall)"); break;
7455 if (uvalue
>= DW_CC_lo_user
7456 && uvalue
<= DW_CC_hi_user
)
7457 printf ("(user defined)");
7459 printf ("(unknown convention)");
7463 case DW_AT_ordering
:
7466 case -1: printf ("(undefined)"); break;
7467 case 0: printf ("(row major)"); break;
7468 case 1: printf ("(column major)"); break;
7472 case DW_AT_frame_base
:
7473 case DW_AT_location
:
7474 case DW_AT_data_member_location
:
7475 case DW_AT_vtable_elem_location
:
7476 case DW_AT_allocated
:
7477 case DW_AT_associated
:
7478 case DW_AT_data_location
:
7480 case DW_AT_upper_bound
:
7481 case DW_AT_lower_bound
:
7485 decode_location_expression (block_start
, pointer_size
, uvalue
);
7497 static unsigned char *
7498 read_and_display_attr (attribute
, form
, data
, cu_offset
, pointer_size
)
7499 unsigned long attribute
;
7501 unsigned char * data
;
7502 unsigned long cu_offset
;
7503 unsigned long pointer_size
;
7505 printf (" %-18s:", get_AT_name (attribute
));
7506 data
= read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
7513 display_debug_info (section
, start
, file
)
7514 Elf32_Internal_Shdr
* section
;
7515 unsigned char * start
;
7518 unsigned char * end
= start
+ section
->sh_size
;
7519 unsigned char * section_begin
= start
;
7521 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
7523 load_debug_str (file
);
7527 DWARF2_External_CompUnit
* external
;
7528 DWARF2_Internal_CompUnit compunit
;
7529 Elf32_Internal_Shdr
* relsec
;
7530 unsigned char * tags
;
7533 unsigned long cu_offset
;
7535 external
= (DWARF2_External_CompUnit
*) start
;
7537 compunit
.cu_length
= BYTE_GET (external
->cu_length
);
7538 compunit
.cu_version
= BYTE_GET (external
->cu_version
);
7539 compunit
.cu_abbrev_offset
= BYTE_GET (external
->cu_abbrev_offset
);
7540 compunit
.cu_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
7542 if (compunit
.cu_length
== 0xffffffff)
7544 warn (_("64-bit DWARF debug info is not supported yet.\n"));
7548 /* Check for RELA relocations in the abbrev_offset address, and
7550 for (relsec
= section_headers
;
7551 relsec
< section_headers
+ elf_header
.e_shnum
;
7554 unsigned long nrelas
;
7555 Elf_Internal_Rela
*rela
, *rp
;
7556 Elf32_Internal_Shdr
*symsec
;
7557 Elf_Internal_Sym
*symtab
;
7558 Elf_Internal_Sym
*sym
;
7560 if (relsec
->sh_type
!= SHT_RELA
7561 || SECTION_HEADER (relsec
->sh_info
) != section
)
7564 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
7568 symsec
= SECTION_HEADER (relsec
->sh_link
);
7569 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
7571 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
7574 != (bfd_vma
) ((unsigned char *) &external
->cu_abbrev_offset
7580 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
7582 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
7584 warn (_("Skipping unexpected symbol type %u\n"),
7585 ELF32_ST_TYPE (sym
->st_info
));
7591 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
7593 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
7595 warn (_("Skipping unexpected symbol type %u\n"),
7596 ELF64_ST_TYPE (sym
->st_info
));
7601 compunit
.cu_abbrev_offset
+= rp
->r_addend
;
7609 tags
= start
+ sizeof (* external
);
7610 cu_offset
= start
- section_begin
;
7611 start
+= compunit
.cu_length
+ sizeof (external
->cu_length
);
7613 printf (_(" Compilation Unit @ %lx:\n"), cu_offset
);
7614 printf (_(" Length: %ld\n"), compunit
.cu_length
);
7615 printf (_(" Version: %d\n"), compunit
.cu_version
);
7616 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
7617 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
7619 if (compunit
.cu_version
!= 2)
7621 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
7627 /* Read in the abbrevs used by this compilation unit. */
7630 Elf32_Internal_Shdr
* sec
;
7631 unsigned char * begin
;
7633 /* Locate the .debug_abbrev section and process it. */
7634 for (i
= 0, sec
= section_headers
;
7635 i
< elf_header
.e_shnum
;
7637 if (strcmp (SECTION_NAME (sec
), ".debug_abbrev") == 0)
7640 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
7642 warn (_("Unable to locate .debug_abbrev section!\n"));
7646 begin
= ((unsigned char *)
7647 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7648 _("debug_abbrev section data")));
7652 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
7653 begin
+ sec
->sh_size
);
7659 while (tags
< start
)
7662 unsigned long abbrev_number
;
7663 abbrev_entry
* entry
;
7666 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
7669 /* A null DIE marks the end of a list of children. */
7670 if (abbrev_number
== 0)
7676 /* Scan through the abbreviation list until we reach the
7678 for (entry
= first_abbrev
;
7679 entry
&& entry
->entry
!= abbrev_number
;
7680 entry
= entry
->next
)
7685 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
7690 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
7692 (unsigned long) (tags
- section_begin
- bytes_read
),
7694 get_TAG_name (entry
->tag
));
7696 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
7697 tags
= read_and_display_attr (attr
->attribute
,
7700 compunit
.cu_pointer_size
);
7702 if (entry
->children
)
7715 display_debug_aranges (section
, start
, file
)
7716 Elf32_Internal_Shdr
* section
;
7717 unsigned char * start
;
7718 FILE * file ATTRIBUTE_UNUSED
;
7720 unsigned char * end
= start
+ section
->sh_size
;
7722 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
7726 DWARF2_External_ARange
* external
;
7727 DWARF2_Internal_ARange arange
;
7728 unsigned char * ranges
;
7729 unsigned long length
;
7730 unsigned long address
;
7733 external
= (DWARF2_External_ARange
*) start
;
7735 arange
.ar_length
= BYTE_GET (external
->ar_length
);
7736 arange
.ar_version
= BYTE_GET (external
->ar_version
);
7737 arange
.ar_info_offset
= BYTE_GET (external
->ar_info_offset
);
7738 arange
.ar_pointer_size
= BYTE_GET (external
->ar_pointer_size
);
7739 arange
.ar_segment_size
= BYTE_GET (external
->ar_segment_size
);
7741 if (arange
.ar_length
== 0xffffffff)
7743 warn (_("64-bit DWARF aranges are not supported yet.\n"));
7747 if (arange
.ar_version
!= 2)
7749 warn (_("Only DWARF 2 aranges are currently supported.\n"));
7753 printf (_(" Length: %ld\n"), arange
.ar_length
);
7754 printf (_(" Version: %d\n"), arange
.ar_version
);
7755 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
7756 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
7757 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
7759 printf (_("\n Address Length\n"));
7761 ranges
= start
+ sizeof (* external
);
7763 /* Must pad to an alignment boundary that is twice the pointer size. */
7764 excess
= sizeof (* external
) % (2 * arange
.ar_pointer_size
);
7766 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
7770 address
= byte_get (ranges
, arange
.ar_pointer_size
);
7772 ranges
+= arange
.ar_pointer_size
;
7774 length
= byte_get (ranges
, arange
.ar_pointer_size
);
7776 ranges
+= arange
.ar_pointer_size
;
7778 /* A pair of zeros marks the end of the list. */
7779 if (address
== 0 && length
== 0)
7782 printf (" %8.8lx %lu\n", address
, length
);
7785 start
+= arange
.ar_length
+ sizeof (external
->ar_length
);
7793 typedef struct Frame_Chunk
7795 struct Frame_Chunk
* next
;
7796 unsigned char * chunk_start
;
7798 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
7799 short int * col_type
;
7801 char * augmentation
;
7802 unsigned int code_factor
;
7804 unsigned long pc_begin
;
7805 unsigned long pc_range
;
7809 unsigned char fde_encoding
;
7813 /* A marker for a col_type that means this column was never referenced
7814 in the frame info. */
7815 #define DW_CFA_unreferenced (-1)
7817 static void frame_need_space
PARAMS ((Frame_Chunk
*, int));
7818 static void frame_display_row
PARAMS ((Frame_Chunk
*, int *, int *));
7819 static int size_of_encoded_value
PARAMS ((int));
7822 frame_need_space (fc
, reg
)
7826 int prev
= fc
->ncols
;
7828 if (reg
< fc
->ncols
)
7831 fc
->ncols
= reg
+ 1;
7832 fc
->col_type
= (short int *) xrealloc (fc
->col_type
,
7833 fc
->ncols
* sizeof (short int));
7834 fc
->col_offset
= (int *) xrealloc (fc
->col_offset
,
7835 fc
->ncols
* sizeof (int));
7837 while (prev
< fc
->ncols
)
7839 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
7840 fc
->col_offset
[prev
] = 0;
7846 frame_display_row (fc
, need_col_headers
, max_regs
)
7848 int * need_col_headers
;
7854 if (* max_regs
< fc
->ncols
)
7855 * max_regs
= fc
->ncols
;
7857 if (* need_col_headers
)
7859 * need_col_headers
= 0;
7861 printf (" LOC CFA ");
7863 for (r
= 0; r
< * max_regs
; r
++)
7864 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
7869 printf ("r%-4d", r
);
7875 printf ("%08lx ", fc
->pc_begin
);
7876 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
7877 printf ("%-8s ", tmp
);
7879 for (r
= 0; r
< fc
->ncols
; r
++)
7881 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
7883 switch (fc
->col_type
[r
])
7885 case DW_CFA_undefined
:
7888 case DW_CFA_same_value
:
7892 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
7894 case DW_CFA_register
:
7895 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
7898 strcpy (tmp
, "n/a");
7901 printf ("%-5s", tmp
);
7908 size_of_encoded_value (encoding
)
7911 switch (encoding
& 0x7)
7914 case 0: return is_32bit_elf
? 4 : 8;
7921 #define GET(N) byte_get (start, N); start += N
7922 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
7923 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
7926 display_debug_frames (section
, start
, file
)
7927 Elf32_Internal_Shdr
* section
;
7928 unsigned char * start
;
7929 FILE * file ATTRIBUTE_UNUSED
;
7931 unsigned char * end
= start
+ section
->sh_size
;
7932 unsigned char * section_start
= start
;
7933 Frame_Chunk
* chunks
= 0;
7934 Frame_Chunk
* remembered_state
= 0;
7936 int is_eh
= (strcmp (SECTION_NAME (section
), ".eh_frame") == 0);
7939 int addr_size
= is_32bit_elf
? 4 : 8;
7941 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
7945 unsigned char * saved_start
;
7946 unsigned char * block_end
;
7947 unsigned long length
;
7948 unsigned long cie_id
;
7951 int need_col_headers
= 1;
7952 unsigned char * augmentation_data
= NULL
;
7953 unsigned long augmentation_data_len
= 0;
7954 int encoded_ptr_size
= addr_size
;
7956 saved_start
= start
;
7957 length
= byte_get (start
, 4); start
+= 4;
7962 if (length
== 0xffffffff)
7964 warn (_("64-bit DWARF format frames are not supported yet.\n"));
7968 block_end
= saved_start
+ length
+ 4;
7969 cie_id
= byte_get (start
, 4); start
+= 4;
7971 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
7975 fc
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
7976 memset (fc
, 0, sizeof (Frame_Chunk
));
7980 fc
->chunk_start
= saved_start
;
7982 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
7983 fc
->col_offset
= (int *) xmalloc (sizeof (int));
7984 frame_need_space (fc
, max_regs
-1);
7988 fc
->augmentation
= start
;
7989 start
= strchr (start
, '\0') + 1;
7991 if (fc
->augmentation
[0] == 'z')
7993 fc
->code_factor
= LEB ();
7994 fc
->data_factor
= SLEB ();
7995 fc
->ra
= byte_get (start
, 1); start
+= 1;
7996 augmentation_data_len
= LEB ();
7997 augmentation_data
= start
;
7998 start
+= augmentation_data_len
;
8000 else if (strcmp (fc
->augmentation
, "eh") == 0)
8003 fc
->code_factor
= LEB ();
8004 fc
->data_factor
= SLEB ();
8005 fc
->ra
= byte_get (start
, 1); start
+= 1;
8009 fc
->code_factor
= LEB ();
8010 fc
->data_factor
= SLEB ();
8011 fc
->ra
= byte_get (start
, 1); start
+= 1;
8015 if (do_debug_frames_interp
)
8016 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
8017 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
8018 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
8022 printf ("\n%08lx %08lx %08lx CIE\n",
8023 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
8024 printf (" Version: %d\n", version
);
8025 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
8026 printf (" Code alignment factor: %u\n", fc
->code_factor
);
8027 printf (" Data alignment factor: %d\n", fc
->data_factor
);
8028 printf (" Return address column: %d\n", fc
->ra
);
8030 if (augmentation_data_len
)
8033 printf (" Augmentation data: ");
8034 for (i
= 0; i
< augmentation_data_len
; ++i
)
8035 printf (" %02x", augmentation_data
[i
]);
8041 if (augmentation_data_len
)
8043 unsigned char *p
, *q
;
8044 p
= fc
->augmentation
+ 1;
8045 q
= augmentation_data
;
8052 q
+= 1 + size_of_encoded_value (*q
);
8054 fc
->fde_encoding
= *q
++;
8060 if (fc
->fde_encoding
)
8061 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
8064 frame_need_space (fc
, fc
->ra
);
8068 unsigned char * look_for
;
8069 static Frame_Chunk fde_fc
;
8072 memset (fc
, 0, sizeof (Frame_Chunk
));
8074 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
8076 for (cie
= chunks
; cie
; cie
= cie
->next
)
8077 if (cie
->chunk_start
== look_for
)
8082 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
8083 cie_id
, saved_start
);
8086 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
8087 fc
->col_offset
= (int *) xmalloc (sizeof (int));
8088 frame_need_space (fc
, max_regs
- 1);
8090 fc
->augmentation
= "";
8091 fc
->fde_encoding
= 0;
8095 fc
->ncols
= cie
->ncols
;
8096 fc
->col_type
= (short int *) xmalloc (fc
->ncols
* sizeof (short int));
8097 fc
->col_offset
= (int *) xmalloc (fc
->ncols
* sizeof (int));
8098 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
8099 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
8100 fc
->augmentation
= cie
->augmentation
;
8101 fc
->code_factor
= cie
->code_factor
;
8102 fc
->data_factor
= cie
->data_factor
;
8103 fc
->cfa_reg
= cie
->cfa_reg
;
8104 fc
->cfa_offset
= cie
->cfa_offset
;
8106 frame_need_space (fc
, max_regs
-1);
8107 fc
->fde_encoding
= cie
->fde_encoding
;
8110 if (fc
->fde_encoding
)
8111 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
8113 fc
->pc_begin
= byte_get (start
, encoded_ptr_size
);
8114 start
+= encoded_ptr_size
;
8115 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
8116 start
+= encoded_ptr_size
;
8118 if (cie
->augmentation
[0] == 'z')
8120 augmentation_data_len
= LEB ();
8121 augmentation_data
= start
;
8122 start
+= augmentation_data_len
;
8125 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
8126 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
8127 (unsigned long)(cie
->chunk_start
- section_start
),
8128 fc
->pc_begin
, fc
->pc_begin
+ fc
->pc_range
);
8129 if (! do_debug_frames_interp
&& augmentation_data_len
)
8132 printf (" Augmentation data: ");
8133 for (i
= 0; i
< augmentation_data_len
; ++i
)
8134 printf (" %02x", augmentation_data
[i
]);
8140 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8141 about to interpret instructions for the chunk. */
8143 if (do_debug_frames_interp
)
8145 /* Start by making a pass over the chunk, allocating storage
8146 and taking note of what registers are used. */
8147 unsigned char * tmp
= start
;
8149 while (start
< block_end
)
8159 /* Warning: if you add any more cases to this switch, be
8160 sure to add them to the corresponding switch below. */
8163 case DW_CFA_advance_loc
:
8167 frame_need_space (fc
, opa
);
8168 fc
->col_type
[opa
] = DW_CFA_undefined
;
8170 case DW_CFA_restore
:
8171 frame_need_space (fc
, opa
);
8172 fc
->col_type
[opa
] = DW_CFA_undefined
;
8174 case DW_CFA_set_loc
:
8175 start
+= encoded_ptr_size
;
8177 case DW_CFA_advance_loc1
:
8180 case DW_CFA_advance_loc2
:
8183 case DW_CFA_advance_loc4
:
8186 case DW_CFA_offset_extended
:
8187 reg
= LEB (); LEB ();
8188 frame_need_space (fc
, reg
);
8189 fc
->col_type
[reg
] = DW_CFA_undefined
;
8191 case DW_CFA_restore_extended
:
8193 frame_need_space (fc
, reg
);
8194 fc
->col_type
[reg
] = DW_CFA_undefined
;
8196 case DW_CFA_undefined
:
8198 frame_need_space (fc
, reg
);
8199 fc
->col_type
[reg
] = DW_CFA_undefined
;
8201 case DW_CFA_same_value
:
8203 frame_need_space (fc
, reg
);
8204 fc
->col_type
[reg
] = DW_CFA_undefined
;
8206 case DW_CFA_register
:
8207 reg
= LEB (); LEB ();
8208 frame_need_space (fc
, reg
);
8209 fc
->col_type
[reg
] = DW_CFA_undefined
;
8211 case DW_CFA_def_cfa
:
8214 case DW_CFA_def_cfa_register
:
8217 case DW_CFA_def_cfa_offset
:
8220 #ifndef DW_CFA_GNU_args_size
8221 #define DW_CFA_GNU_args_size 0x2e
8223 case DW_CFA_GNU_args_size
:
8226 #ifndef DW_CFA_GNU_negative_offset_extended
8227 #define DW_CFA_GNU_negative_offset_extended 0x2f
8229 case DW_CFA_GNU_negative_offset_extended
:
8230 reg
= LEB (); LEB ();
8231 frame_need_space (fc
, reg
);
8232 fc
->col_type
[reg
] = DW_CFA_undefined
;
8241 /* Now we know what registers are used, make a second pass over
8242 the chunk, this time actually printing out the info. */
8244 while (start
< block_end
)
8247 unsigned long ul
, reg
, roffs
;
8256 /* Warning: if you add any more cases to this switch, be
8257 sure to add them to the corresponding switch above. */
8260 case DW_CFA_advance_loc
:
8261 if (do_debug_frames_interp
)
8262 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8264 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8265 opa
* fc
->code_factor
,
8266 fc
->pc_begin
+ opa
* fc
->code_factor
);
8267 fc
->pc_begin
+= opa
* fc
->code_factor
;
8272 if (! do_debug_frames_interp
)
8273 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8274 opa
, roffs
* fc
->data_factor
);
8275 fc
->col_type
[opa
] = DW_CFA_offset
;
8276 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
8279 case DW_CFA_restore
:
8280 if (! do_debug_frames_interp
)
8281 printf (" DW_CFA_restore: r%d\n", opa
);
8282 fc
->col_type
[opa
] = cie
->col_type
[opa
];
8283 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
8286 case DW_CFA_set_loc
:
8287 vma
= byte_get (start
, encoded_ptr_size
);
8288 start
+= encoded_ptr_size
;
8289 if (do_debug_frames_interp
)
8290 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8292 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
8296 case DW_CFA_advance_loc1
:
8297 ofs
= byte_get (start
, 1); start
+= 1;
8298 if (do_debug_frames_interp
)
8299 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8301 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8302 ofs
* fc
->code_factor
,
8303 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8304 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8307 case DW_CFA_advance_loc2
:
8308 ofs
= byte_get (start
, 2); start
+= 2;
8309 if (do_debug_frames_interp
)
8310 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8312 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8313 ofs
* fc
->code_factor
,
8314 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8315 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8318 case DW_CFA_advance_loc4
:
8319 ofs
= byte_get (start
, 4); start
+= 4;
8320 if (do_debug_frames_interp
)
8321 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8323 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8324 ofs
* fc
->code_factor
,
8325 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8326 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8329 case DW_CFA_offset_extended
:
8332 if (! do_debug_frames_interp
)
8333 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8334 reg
, roffs
* fc
->data_factor
);
8335 fc
->col_type
[reg
] = DW_CFA_offset
;
8336 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
8339 case DW_CFA_restore_extended
:
8341 if (! do_debug_frames_interp
)
8342 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
8343 fc
->col_type
[reg
] = cie
->col_type
[reg
];
8344 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
8347 case DW_CFA_undefined
:
8349 if (! do_debug_frames_interp
)
8350 printf (" DW_CFA_undefined: r%ld\n", reg
);
8351 fc
->col_type
[reg
] = DW_CFA_undefined
;
8352 fc
->col_offset
[reg
] = 0;
8355 case DW_CFA_same_value
:
8357 if (! do_debug_frames_interp
)
8358 printf (" DW_CFA_same_value: r%ld\n", reg
);
8359 fc
->col_type
[reg
] = DW_CFA_same_value
;
8360 fc
->col_offset
[reg
] = 0;
8363 case DW_CFA_register
:
8366 if (! do_debug_frames_interp
)
8367 printf (" DW_CFA_register: r%ld\n", reg
);
8368 fc
->col_type
[reg
] = DW_CFA_register
;
8369 fc
->col_offset
[reg
] = roffs
;
8372 case DW_CFA_remember_state
:
8373 if (! do_debug_frames_interp
)
8374 printf (" DW_CFA_remember_state\n");
8375 rs
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
8376 rs
->ncols
= fc
->ncols
;
8377 rs
->col_type
= (short int *) xmalloc (rs
->ncols
* sizeof (short int));
8378 rs
->col_offset
= (int *) xmalloc (rs
->ncols
* sizeof (int));
8379 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
8380 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
8381 rs
->next
= remembered_state
;
8382 remembered_state
= rs
;
8385 case DW_CFA_restore_state
:
8386 if (! do_debug_frames_interp
)
8387 printf (" DW_CFA_restore_state\n");
8388 rs
= remembered_state
;
8389 remembered_state
= rs
->next
;
8390 frame_need_space (fc
, rs
->ncols
-1);
8391 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
8392 memcpy (fc
->col_offset
, rs
->col_offset
, rs
->ncols
* sizeof (int));
8393 free (rs
->col_type
);
8394 free (rs
->col_offset
);
8398 case DW_CFA_def_cfa
:
8399 fc
->cfa_reg
= LEB ();
8400 fc
->cfa_offset
= LEB ();
8401 if (! do_debug_frames_interp
)
8402 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
8403 fc
->cfa_reg
, fc
->cfa_offset
);
8406 case DW_CFA_def_cfa_register
:
8407 fc
->cfa_reg
= LEB ();
8408 if (! do_debug_frames_interp
)
8409 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
8412 case DW_CFA_def_cfa_offset
:
8413 fc
->cfa_offset
= LEB ();
8414 if (! do_debug_frames_interp
)
8415 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
8419 if (! do_debug_frames_interp
)
8420 printf (" DW_CFA_nop\n");
8423 #ifndef DW_CFA_GNU_window_save
8424 #define DW_CFA_GNU_window_save 0x2d
8426 case DW_CFA_GNU_window_save
:
8427 if (! do_debug_frames_interp
)
8428 printf (" DW_CFA_GNU_window_save\n");
8431 case DW_CFA_GNU_args_size
:
8433 if (! do_debug_frames_interp
)
8434 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
8437 case DW_CFA_GNU_negative_offset_extended
:
8440 frame_need_space (fc
, reg
);
8441 if (! do_debug_frames_interp
)
8442 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
8443 reg
, l
* fc
->data_factor
);
8444 fc
->col_type
[reg
] = DW_CFA_offset
;
8445 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
8449 fprintf (stderr
, "unsupported or unknown DW_CFA_%d\n", op
);
8454 if (do_debug_frames_interp
)
8455 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8470 display_debug_not_supported (section
, start
, file
)
8471 Elf32_Internal_Shdr
* section
;
8472 unsigned char * start ATTRIBUTE_UNUSED
;
8473 FILE * file ATTRIBUTE_UNUSED
;
8475 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
8476 SECTION_NAME (section
));
8481 /* Pre-scan the .debug_info section to record the size of address.
8482 When dumping the .debug_line, we use that size information, assuming
8483 that all compilation units have the same address size. */
8485 prescan_debug_info (section
, start
, file
)
8486 Elf32_Internal_Shdr
* section ATTRIBUTE_UNUSED
;
8487 unsigned char * start
;
8488 FILE * file ATTRIBUTE_UNUSED
;
8490 DWARF2_External_CompUnit
* external
;
8492 external
= (DWARF2_External_CompUnit
*) start
;
8494 debug_line_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
8498 /* A structure containing the name of a debug section and a pointer
8499 to a function that can decode it. The third field is a prescan
8500 function to be run over the section before displaying any of the
8504 const char * const name
;
8505 int (* display
) PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
8506 int (* prescan
) PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
8510 { ".debug_abbrev", display_debug_abbrev
, NULL
},
8511 { ".debug_aranges", display_debug_aranges
, NULL
},
8512 { ".debug_frame", display_debug_frames
, NULL
},
8513 { ".debug_info", display_debug_info
, prescan_debug_info
},
8514 { ".debug_line", display_debug_lines
, NULL
},
8515 { ".debug_pubnames", display_debug_pubnames
, NULL
},
8516 { ".eh_frame", display_debug_frames
, NULL
},
8517 { ".debug_macinfo", display_debug_macinfo
, NULL
},
8518 { ".debug_str", display_debug_str
, NULL
},
8520 { ".debug_pubtypes", display_debug_not_supported
, NULL
},
8521 { ".debug_ranges", display_debug_not_supported
, NULL
},
8522 { ".debug_static_func", display_debug_not_supported
, NULL
},
8523 { ".debug_static_vars", display_debug_not_supported
, NULL
},
8524 { ".debug_types", display_debug_not_supported
, NULL
},
8525 { ".debug_weaknames", display_debug_not_supported
, NULL
}
8529 display_debug_section (section
, file
)
8530 Elf32_Internal_Shdr
* section
;
8533 char * name
= SECTION_NAME (section
);
8534 bfd_size_type length
;
8535 unsigned char * start
;
8538 length
= section
->sh_size
;
8541 printf (_("\nSection '%s' has no debugging data.\n"), name
);
8545 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
, length
,
8546 _("debug section data"));
8550 /* See if we know how to display the contents of this section. */
8551 if (strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
8552 name
= ".debug_info";
8554 for (i
= NUM_ELEM (debug_displays
); i
--;)
8555 if (strcmp (debug_displays
[i
].name
, name
) == 0)
8557 debug_displays
[i
].display (section
, start
, file
);
8562 printf (_("Unrecognised debug section: %s\n"), name
);
8566 /* If we loaded in the abbrev section at some point,
8567 we must release it here. */
8574 process_section_contents (file
)
8577 Elf32_Internal_Shdr
* section
;
8583 /* Pre-scan the debug sections to find some debug information not
8584 present in some of them. For the .debug_line, we must find out the
8585 size of address (specified in .debug_info and .debug_aranges). */
8586 for (i
= 0, section
= section_headers
;
8587 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
8590 char * name
= SECTION_NAME (section
);
8593 if (section
->sh_size
== 0)
8596 /* See if there is some pre-scan operation for this section. */
8597 for (j
= NUM_ELEM (debug_displays
); j
--;)
8598 if (strcmp (debug_displays
[j
].name
, name
) == 0)
8600 if (debug_displays
[j
].prescan
!= NULL
)
8602 bfd_size_type length
;
8603 unsigned char * start
;
8605 length
= section
->sh_size
;
8606 start
= ((unsigned char *)
8607 get_data (NULL
, file
, section
->sh_offset
, length
,
8608 _("debug section data")));
8612 debug_displays
[j
].prescan (section
, start
, file
);
8620 for (i
= 0, section
= section_headers
;
8621 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
8624 #ifdef SUPPORT_DISASSEMBLY
8625 if (dump_sects
[i
] & DISASS_DUMP
)
8626 disassemble_section (section
, file
);
8628 if (dump_sects
[i
] & HEX_DUMP
)
8629 dump_section (section
, file
);
8631 if (dump_sects
[i
] & DEBUG_DUMP
)
8632 display_debug_section (section
, file
);
8635 if (i
< num_dump_sects
)
8636 warn (_("Some sections were not dumped because they do not exist!\n"));
8642 process_mips_fpe_exception (mask
)
8648 if (mask
& OEX_FPU_INEX
)
8649 fputs ("INEX", stdout
), first
= 0;
8650 if (mask
& OEX_FPU_UFLO
)
8651 printf ("%sUFLO", first
? "" : "|"), first
= 0;
8652 if (mask
& OEX_FPU_OFLO
)
8653 printf ("%sOFLO", first
? "" : "|"), first
= 0;
8654 if (mask
& OEX_FPU_DIV0
)
8655 printf ("%sDIV0", first
? "" : "|"), first
= 0;
8656 if (mask
& OEX_FPU_INVAL
)
8657 printf ("%sINVAL", first
? "" : "|");
8660 fputs ("0", stdout
);
8664 process_mips_specific (file
)
8667 Elf_Internal_Dyn
* entry
;
8668 size_t liblist_offset
= 0;
8669 size_t liblistno
= 0;
8670 size_t conflictsno
= 0;
8671 size_t options_offset
= 0;
8672 size_t conflicts_offset
= 0;
8674 /* We have a lot of special sections. Thanks SGI! */
8675 if (dynamic_segment
== NULL
)
8676 /* No information available. */
8679 for (entry
= dynamic_segment
; entry
->d_tag
!= DT_NULL
; ++entry
)
8680 switch (entry
->d_tag
)
8682 case DT_MIPS_LIBLIST
:
8683 liblist_offset
= entry
->d_un
.d_val
- loadaddr
;
8685 case DT_MIPS_LIBLISTNO
:
8686 liblistno
= entry
->d_un
.d_val
;
8688 case DT_MIPS_OPTIONS
:
8689 options_offset
= entry
->d_un
.d_val
- loadaddr
;
8691 case DT_MIPS_CONFLICT
:
8692 conflicts_offset
= entry
->d_un
.d_val
- loadaddr
;
8694 case DT_MIPS_CONFLICTNO
:
8695 conflictsno
= entry
->d_un
.d_val
;
8701 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
8703 Elf32_External_Lib
* elib
;
8706 elib
= ((Elf32_External_Lib
*)
8707 get_data (NULL
, file
, liblist_offset
,
8708 liblistno
* sizeof (Elf32_External_Lib
),
8712 printf ("\nSection '.liblist' contains %lu entries:\n",
8713 (unsigned long) liblistno
);
8714 fputs (" Library Time Stamp Checksum Version Flags\n",
8717 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
8724 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
8725 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
8726 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
8727 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
8728 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
8730 tmp
= gmtime (&time
);
8731 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
8732 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
8733 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
8735 printf ("%3lu: ", (unsigned long) cnt
);
8736 print_symbol (20, dynamic_strings
+ liblist
.l_name
);
8737 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
8740 if (liblist
.l_flags
== 0)
8751 { " EXACT_MATCH", LL_EXACT_MATCH
},
8752 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
8753 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
8754 { " EXPORTS", LL_EXPORTS
},
8755 { " DELAY_LOAD", LL_DELAY_LOAD
},
8756 { " DELTA", LL_DELTA
}
8758 int flags
= liblist
.l_flags
;
8762 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
8764 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
8766 fputs (l_flags_vals
[fcnt
].name
, stdout
);
8767 flags
^= l_flags_vals
[fcnt
].bit
;
8770 printf (" %#x", (unsigned int) flags
);
8780 if (options_offset
!= 0)
8782 Elf_External_Options
* eopt
;
8783 Elf_Internal_Shdr
* sect
= section_headers
;
8784 Elf_Internal_Options
* iopt
;
8785 Elf_Internal_Options
* option
;
8789 /* Find the section header so that we get the size. */
8790 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
8793 eopt
= (Elf_External_Options
*) get_data (NULL
, file
, options_offset
,
8794 sect
->sh_size
, _("options"));
8797 iopt
= ((Elf_Internal_Options
*)
8798 malloc ((sect
->sh_size
/ sizeof (eopt
)) * sizeof (* iopt
)));
8801 error (_("Out of memory"));
8808 while (offset
< sect
->sh_size
)
8810 Elf_External_Options
* eoption
;
8812 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
8814 option
->kind
= BYTE_GET (eoption
->kind
);
8815 option
->size
= BYTE_GET (eoption
->size
);
8816 option
->section
= BYTE_GET (eoption
->section
);
8817 option
->info
= BYTE_GET (eoption
->info
);
8819 offset
+= option
->size
;
8825 printf (_("\nSection '%s' contains %d entries:\n"),
8826 SECTION_NAME (sect
), cnt
);
8834 switch (option
->kind
)
8837 /* This shouldn't happen. */
8838 printf (" NULL %d %lx", option
->section
, option
->info
);
8841 printf (" REGINFO ");
8842 if (elf_header
.e_machine
== EM_MIPS
)
8845 Elf32_External_RegInfo
* ereg
;
8846 Elf32_RegInfo reginfo
;
8848 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
8849 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8850 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8851 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8852 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8853 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8854 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
8856 printf ("GPR %08lx GP 0x%lx\n",
8858 (unsigned long) reginfo
.ri_gp_value
);
8859 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8860 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8861 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8866 Elf64_External_RegInfo
* ereg
;
8867 Elf64_Internal_RegInfo reginfo
;
8869 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
8870 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8871 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8872 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8873 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8874 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8875 reginfo
.ri_gp_value
= BYTE_GET8 (ereg
->ri_gp_value
);
8877 printf ("GPR %08lx GP 0x",
8878 reginfo
.ri_gprmask
);
8879 printf_vma (reginfo
.ri_gp_value
);
8882 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8883 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8884 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8888 case ODK_EXCEPTIONS
:
8889 fputs (" EXCEPTIONS fpe_min(", stdout
);
8890 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
8891 fputs (") fpe_max(", stdout
);
8892 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
8893 fputs (")", stdout
);
8895 if (option
->info
& OEX_PAGE0
)
8896 fputs (" PAGE0", stdout
);
8897 if (option
->info
& OEX_SMM
)
8898 fputs (" SMM", stdout
);
8899 if (option
->info
& OEX_FPDBUG
)
8900 fputs (" FPDBUG", stdout
);
8901 if (option
->info
& OEX_DISMISS
)
8902 fputs (" DISMISS", stdout
);
8905 fputs (" PAD ", stdout
);
8906 if (option
->info
& OPAD_PREFIX
)
8907 fputs (" PREFIX", stdout
);
8908 if (option
->info
& OPAD_POSTFIX
)
8909 fputs (" POSTFIX", stdout
);
8910 if (option
->info
& OPAD_SYMBOL
)
8911 fputs (" SYMBOL", stdout
);
8914 fputs (" HWPATCH ", stdout
);
8915 if (option
->info
& OHW_R4KEOP
)
8916 fputs (" R4KEOP", stdout
);
8917 if (option
->info
& OHW_R8KPFETCH
)
8918 fputs (" R8KPFETCH", stdout
);
8919 if (option
->info
& OHW_R5KEOP
)
8920 fputs (" R5KEOP", stdout
);
8921 if (option
->info
& OHW_R5KCVTL
)
8922 fputs (" R5KCVTL", stdout
);
8925 fputs (" FILL ", stdout
);
8926 /* XXX Print content of info word? */
8929 fputs (" TAGS ", stdout
);
8930 /* XXX Print content of info word? */
8933 fputs (" HWAND ", stdout
);
8934 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8935 fputs (" R4KEOP_CHECKED", stdout
);
8936 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8937 fputs (" R4KEOP_CLEAN", stdout
);
8940 fputs (" HWOR ", stdout
);
8941 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8942 fputs (" R4KEOP_CHECKED", stdout
);
8943 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8944 fputs (" R4KEOP_CLEAN", stdout
);
8947 printf (" GP_GROUP %#06lx self-contained %#06lx",
8948 option
->info
& OGP_GROUP
,
8949 (option
->info
& OGP_SELF
) >> 16);
8952 printf (" IDENT %#06lx self-contained %#06lx",
8953 option
->info
& OGP_GROUP
,
8954 (option
->info
& OGP_SELF
) >> 16);
8957 /* This shouldn't happen. */
8958 printf (" %3d ??? %d %lx",
8959 option
->kind
, option
->section
, option
->info
);
8963 len
= sizeof (* eopt
);
8964 while (len
< option
->size
)
8965 if (((char *) option
)[len
] >= ' '
8966 && ((char *) option
)[len
] < 0x7f)
8967 printf ("%c", ((char *) option
)[len
++]);
8969 printf ("\\%03o", ((char *) option
)[len
++]);
8971 fputs ("\n", stdout
);
8979 if (conflicts_offset
!= 0 && conflictsno
!= 0)
8981 Elf32_Conflict
* iconf
;
8984 if (dynamic_symbols
== NULL
)
8986 error (_("conflict list with without table"));
8990 iconf
= (Elf32_Conflict
*) malloc (conflictsno
* sizeof (* iconf
));
8993 error (_("Out of memory"));
8999 Elf32_External_Conflict
* econf32
;
9001 econf32
= ((Elf32_External_Conflict
*)
9002 get_data (NULL
, file
, conflicts_offset
,
9003 conflictsno
* sizeof (* econf32
),
9008 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9009 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
9015 Elf64_External_Conflict
* econf64
;
9017 econf64
= ((Elf64_External_Conflict
*)
9018 get_data (NULL
, file
, conflicts_offset
,
9019 conflictsno
* sizeof (* econf64
),
9024 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9025 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
9030 printf (_("\nSection '.conflict' contains %ld entries:\n"),
9031 (long) conflictsno
);
9032 puts (_(" Num: Index Value Name"));
9034 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9036 Elf_Internal_Sym
* psym
= & dynamic_symbols
[iconf
[cnt
]];
9038 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
9039 print_vma (psym
->st_value
, FULL_HEX
);
9041 print_symbol (25, dynamic_strings
+ psym
->st_name
);
9052 get_note_type (e_type
)
9055 static char buff
[64];
9059 case NT_PRSTATUS
: return _("NT_PRSTATUS (prstatus structure)");
9060 case NT_FPREGSET
: return _("NT_FPREGSET (floating point registers)");
9061 case NT_PRPSINFO
: return _("NT_PRPSINFO (prpsinfo structure)");
9062 case NT_TASKSTRUCT
: return _("NT_TASKSTRUCT (task structure)");
9063 case NT_PRXFPREG
: return _("NT_PRXFPREG (user_xfpregs structure)");
9064 case NT_PSTATUS
: return _("NT_PSTATUS (pstatus structure)");
9065 case NT_FPREGS
: return _("NT_FPREGS (floating point registers)");
9066 case NT_PSINFO
: return _("NT_PSINFO (psinfo structure)");
9067 case NT_LWPSTATUS
: return _("NT_LWPSTATUS (lwpstatus_t structure)");
9068 case NT_LWPSINFO
: return _("NT_LWPSINFO (lwpsinfo_t structure)");
9069 case NT_WIN32PSTATUS
: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
9071 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
9076 /* Note that by the ELF standard, the name field is already null byte
9077 terminated, and namesz includes the terminating null byte.
9078 I.E. the value of namesz for the name "FSF" is 4.
9080 If the value of namesz is zero, there is no name present. */
9082 process_note (pnote
)
9083 Elf32_Internal_Note
* pnote
;
9085 printf (" %s\t\t0x%08lx\t%s\n",
9086 pnote
->namesz
? pnote
->namedata
: "(NONE)",
9087 pnote
->descsz
, get_note_type (pnote
->type
));
9093 process_corefile_note_segment (file
, offset
, length
)
9098 Elf_External_Note
* pnotes
;
9099 Elf_External_Note
* external
;
9105 pnotes
= (Elf_External_Note
*) get_data (NULL
, file
, offset
, length
,
9112 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9113 (unsigned long) offset
, (unsigned long) length
);
9114 printf (_(" Owner\t\tData size\tDescription\n"));
9116 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
9118 Elf32_Internal_Note inote
;
9121 inote
.type
= BYTE_GET (external
->type
);
9122 inote
.namesz
= BYTE_GET (external
->namesz
);
9123 inote
.namedata
= external
->name
;
9124 inote
.descsz
= BYTE_GET (external
->descsz
);
9125 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
9126 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
9128 external
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
9130 /* Verify that name is null terminated. It appears that at least
9131 one version of Linux (RedHat 6.0) generates corefiles that don't
9132 comply with the ELF spec by failing to include the null byte in
9134 if (inote
.namedata
[inote
.namesz
] != '\0')
9136 temp
= malloc (inote
.namesz
+ 1);
9140 error (_("Out of memory\n"));
9145 strncpy (temp
, inote
.namedata
, inote
.namesz
);
9146 temp
[inote
.namesz
] = 0;
9148 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9149 inote
.namedata
= temp
;
9152 res
&= process_note (& inote
);
9167 process_corefile_note_segments (file
)
9170 Elf_Internal_Phdr
* program_headers
;
9171 Elf_Internal_Phdr
* segment
;
9175 program_headers
= (Elf_Internal_Phdr
*) malloc
9176 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
9178 if (program_headers
== NULL
)
9180 error (_("Out of memory\n"));
9185 i
= get_32bit_program_headers (file
, program_headers
);
9187 i
= get_64bit_program_headers (file
, program_headers
);
9191 free (program_headers
);
9195 for (i
= 0, segment
= program_headers
;
9196 i
< elf_header
.e_phnum
;
9199 if (segment
->p_type
== PT_NOTE
)
9200 res
&= process_corefile_note_segment (file
,
9201 (bfd_vma
) segment
->p_offset
,
9202 (bfd_vma
) segment
->p_filesz
);
9205 free (program_headers
);
9211 process_corefile_contents (file
)
9214 /* If we have not been asked to display the notes then do nothing. */
9218 /* If file is not a core file then exit. */
9219 if (elf_header
.e_type
!= ET_CORE
)
9222 /* No program headers means no NOTE segment. */
9223 if (elf_header
.e_phnum
== 0)
9225 printf (_("No note segments present in the core file.\n"));
9229 return process_corefile_note_segments (file
);
9233 process_arch_specific (file
)
9239 switch (elf_header
.e_machine
)
9242 case EM_MIPS_RS3_LE
:
9243 return process_mips_specific (file
);
9252 get_file_header (file
)
9255 /* Read in the identity array. */
9256 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
9259 /* Determine how to read the rest of the header. */
9260 switch (elf_header
.e_ident
[EI_DATA
])
9262 default: /* fall through */
9263 case ELFDATANONE
: /* fall through */
9264 case ELFDATA2LSB
: byte_get
= byte_get_little_endian
; break;
9265 case ELFDATA2MSB
: byte_get
= byte_get_big_endian
; break;
9268 /* For now we only support 32 bit and 64 bit ELF files. */
9269 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
9271 /* Read in the rest of the header. */
9274 Elf32_External_Ehdr ehdr32
;
9276 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
9279 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
9280 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
9281 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
9282 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
9283 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
9284 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
9285 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
9286 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
9287 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
9288 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
9289 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
9290 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
9291 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
9295 Elf64_External_Ehdr ehdr64
;
9297 /* If we have been compiled with sizeof (bfd_vma) == 4, then
9298 we will not be able to cope with the 64bit data found in
9299 64 ELF files. Detect this now and abort before we start
9300 overwritting things. */
9301 if (sizeof (bfd_vma
) < 8)
9303 error (_("This instance of readelf has been built without support for a\n\
9304 64 bit data type and so it cannot read 64 bit ELF files.\n"));
9308 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
9311 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
9312 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
9313 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
9314 elf_header
.e_entry
= BYTE_GET8 (ehdr64
.e_entry
);
9315 elf_header
.e_phoff
= BYTE_GET8 (ehdr64
.e_phoff
);
9316 elf_header
.e_shoff
= BYTE_GET8 (ehdr64
.e_shoff
);
9317 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
9318 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
9319 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
9320 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
9321 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
9322 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
9323 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
9326 /* There may be some extensions in the first section header. Don't
9327 bomb if we can't read it. */
9329 get_32bit_section_headers (file
, 1);
9331 get_64bit_section_headers (file
, 1);
9337 process_file (file_name
)
9341 struct stat statbuf
;
9344 if (stat (file_name
, & statbuf
) < 0)
9346 error (_("Cannot stat input file %s.\n"), file_name
);
9350 file
= fopen (file_name
, "rb");
9353 error (_("Input file %s not found.\n"), file_name
);
9357 if (! get_file_header (file
))
9359 error (_("%s: Failed to read file header\n"), file_name
);
9364 /* Initialise per file variables. */
9365 for (i
= NUM_ELEM (version_info
); i
--;)
9366 version_info
[i
] = 0;
9368 for (i
= NUM_ELEM (dynamic_info
); i
--;)
9369 dynamic_info
[i
] = 0;
9371 /* Process the file. */
9373 printf (_("\nFile: %s\n"), file_name
);
9375 if (! process_file_header ())
9381 process_section_headers (file
);
9383 process_program_headers (file
);
9385 process_dynamic_segment (file
);
9387 process_relocs (file
);
9389 process_unwind (file
);
9391 process_symbol_table (file
);
9393 process_syminfo (file
);
9395 process_version_sections (file
);
9397 process_section_contents (file
);
9399 process_corefile_contents (file
);
9401 process_arch_specific (file
);
9405 if (section_headers
)
9407 free (section_headers
);
9408 section_headers
= NULL
;
9413 free (string_table
);
9414 string_table
= NULL
;
9415 string_table_length
= 0;
9418 if (dynamic_strings
)
9420 free (dynamic_strings
);
9421 dynamic_strings
= NULL
;
9424 if (dynamic_symbols
)
9426 free (dynamic_symbols
);
9427 dynamic_symbols
= NULL
;
9428 num_dynamic_syms
= 0;
9431 if (dynamic_syminfo
)
9433 free (dynamic_syminfo
);
9434 dynamic_syminfo
= NULL
;
9440 #ifdef SUPPORT_DISASSEMBLY
9441 /* Needed by the i386 disassembler. For extra credit, someone could
9442 fix this so that we insert symbolic addresses here, esp for GOT/PLT
9446 print_address (unsigned int addr
, FILE * outfile
)
9448 fprintf (outfile
,"0x%8.8x", addr
);
9451 /* Needed by the i386 disassembler. */
9453 db_task_printsym (unsigned int addr
)
9455 print_address (addr
, stderr
);
9459 int main
PARAMS ((int, char **));
9468 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9469 setlocale (LC_MESSAGES
, "");
9471 #if defined (HAVE_SETLOCALE)
9472 setlocale (LC_CTYPE
, "");
9474 bindtextdomain (PACKAGE
, LOCALEDIR
);
9475 textdomain (PACKAGE
);
9477 parse_args (argc
, argv
);
9479 if (optind
< (argc
- 1))
9483 while (optind
< argc
)
9484 err
|= process_file (argv
[optind
++]);
9486 if (dump_sects
!= NULL
)