1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 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
24 /* The difference between readelf and objdump:
26 Both programs are capabale of displaying the contents of ELF format files,
27 so why does the binutils project have two file dumpers ?
29 The reason is that objdump sees an ELF file through a BFD filter of the
30 world; if BFD has a bug where, say, it disagrees about a machine constant
31 in e_flags, then the odds are good that it will remain internally
32 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
33 GAS sees it the BFD way. There was need for a tool to go find out what
34 the file actually says.
36 This is why the readelf program does not link against the BFD library - it
37 exists as an independent program to help verify the correct working of BFD.
39 There is also the case that readelf can provide more information about an
40 ELF file than is provided by objdump. In particular it can display DWARF
41 debugging information which (at the moment) objdump cannot. */
44 #include <sys/types.h>
50 /* Define BFD64 here, even if our default architecture is 32 bit ELF
51 as this will allow us to read in and parse 64bit and 32bit ELF files.
52 Only do this if we believe that the compiler can support a 64 bit
53 data type. For now we only rely on GCC being able to do this. */
59 #include "elf/common.h"
60 #include "elf/external.h"
61 #include "elf/internal.h"
62 #include "elf/dwarf2.h"
64 /* The following headers use the elf/reloc-macros.h file to
65 automatically generate relocation recognition functions
66 such as elf_mips_reloc_type() */
68 #define RELOC_MACROS_GEN_FUNC
70 #include "elf/alpha.h"
90 #include "elf/m68hc11.h"
91 #include "elf/mcore.h"
94 #include "elf/mn10200.h"
95 #include "elf/mn10300.h"
96 #include "elf/msp430.h"
100 #include "elf/ppc64.h"
101 #include "elf/s390.h"
103 #include "elf/sparc.h"
104 #include "elf/v850.h"
106 #include "elf/x86-64.h"
107 #include "elf/xstormy16.h"
109 #include "elf/iq2000.h"
110 #include "elf/xtensa.h"
116 #include "libiberty.h"
118 char *program_name
= "readelf";
119 long archive_file_offset
;
120 unsigned long archive_file_size
;
121 unsigned long dynamic_addr
;
122 bfd_size_type dynamic_size
;
123 unsigned int dynamic_nent
;
124 char *dynamic_strings
;
126 unsigned long string_table_length
;
127 unsigned long num_dynamic_syms
;
128 Elf_Internal_Sym
*dynamic_symbols
;
129 Elf_Internal_Syminfo
*dynamic_syminfo
;
130 unsigned long dynamic_syminfo_offset
;
131 unsigned int dynamic_syminfo_nent
;
132 char program_interpreter
[64];
133 bfd_vma dynamic_info
[DT_JMPREL
+ 1];
134 bfd_vma version_info
[16];
135 Elf_Internal_Ehdr elf_header
;
136 Elf_Internal_Shdr
*section_headers
;
137 Elf_Internal_Phdr
*program_headers
;
138 Elf_Internal_Dyn
*dynamic_section
;
139 Elf_Internal_Shdr
*symtab_shndx_hdr
;
145 int do_section_groups
;
148 int do_using_dynamic
;
156 int do_debug_abbrevs
;
158 int do_debug_pubnames
;
159 int do_debug_aranges
;
161 int do_debug_frames_interp
;
162 int do_debug_macinfo
;
171 struct group_list
*next
;
172 unsigned int section_index
;
177 struct group_list
*root
;
178 unsigned int group_index
;
181 struct group
*section_groups
;
182 size_t group_count
= 0;
184 struct group
**section_headers_groups
;
186 /* A dynamic array of flags indicating which sections require dumping. */
187 char *dump_sects
= NULL
;
188 unsigned int num_dump_sects
= 0;
190 #define HEX_DUMP (1 << 0)
191 #define DISASS_DUMP (1 << 1)
192 #define DEBUG_DUMP (1 << 2)
194 /* How to rpint a vma value. */
195 typedef enum print_mode
207 static bfd_vma (*byte_get
) (unsigned char *, int);
208 static void (*byte_put
) (unsigned char *, bfd_vma
, int);
212 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
213 ((X)->sh_name >= string_table_length \
214 ? "<corrupt>" : string_table + (X)->sh_name))
216 /* Given st_shndx I, map to section_headers index. */
217 #define SECTION_HEADER_INDEX(I) \
218 ((I) < SHN_LORESERVE \
220 : ((I) <= SHN_HIRESERVE \
222 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
224 /* Reverse of the above. */
225 #define SECTION_HEADER_NUM(N) \
226 ((N) < SHN_LORESERVE \
228 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
230 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
232 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
234 #define BYTE_GET(field) byte_get (field, sizeof (field))
236 /* If we can support a 64 bit data type then BFD64 should be defined
237 and sizeof (bfd_vma) == 8. In this case when translating from an
238 external 8 byte field to an internal field, we can assume that the
239 internal field is also 8 bytes wide and so we can extract all the data.
240 If, however, BFD64 is not defined, then we must assume that the
241 internal data structure only has 4 byte wide fields that are the
242 equivalent of the 8 byte wide external counterparts, and so we must
243 truncate the data. */
245 #define BYTE_GET8(field) byte_get (field, -8)
247 #define BYTE_GET8(field) byte_get (field, 8)
250 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
252 #define GET_ELF_SYMBOLS(file, section) \
253 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
254 : get_64bit_elf_symbols (file, section))
258 error (const char *message
, ...)
262 va_start (args
, message
);
263 fprintf (stderr
, _("%s: Error: "), program_name
);
264 vfprintf (stderr
, message
, args
);
269 warn (const char *message
, ...)
273 va_start (args
, message
);
274 fprintf (stderr
, _("%s: Warning: "), program_name
);
275 vfprintf (stderr
, message
, args
);
280 get_data (void *var
, FILE *file
, long offset
, size_t size
, const char *reason
)
287 if (fseek (file
, archive_file_offset
+ offset
, SEEK_SET
))
289 error (_("Unable to seek to 0x%x for %s\n"),
290 archive_file_offset
+ offset
, reason
);
297 mvar
= malloc (size
);
301 error (_("Out of memory allocating 0x%x bytes for %s\n"),
307 if (fread (mvar
, size
, 1, file
) != 1)
309 error (_("Unable to read in 0x%x bytes of %s\n"), size
, reason
);
319 byte_get_little_endian (unsigned char *field
, int size
)
327 return ((unsigned int) (field
[0]))
328 | (((unsigned int) (field
[1])) << 8);
332 /* We want to extract data from an 8 byte wide field and
333 place it into a 4 byte wide field. Since this is a little
334 endian source we can just use the 4 byte extraction code. */
338 return ((unsigned long) (field
[0]))
339 | (((unsigned long) (field
[1])) << 8)
340 | (((unsigned long) (field
[2])) << 16)
341 | (((unsigned long) (field
[3])) << 24);
346 /* This is a special case, generated by the BYTE_GET8 macro.
347 It means that we are loading an 8 byte value from a field
348 in an external structure into an 8 byte value in a field
349 in an internal structure. */
350 return ((bfd_vma
) (field
[0]))
351 | (((bfd_vma
) (field
[1])) << 8)
352 | (((bfd_vma
) (field
[2])) << 16)
353 | (((bfd_vma
) (field
[3])) << 24)
354 | (((bfd_vma
) (field
[4])) << 32)
355 | (((bfd_vma
) (field
[5])) << 40)
356 | (((bfd_vma
) (field
[6])) << 48)
357 | (((bfd_vma
) (field
[7])) << 56);
360 error (_("Unhandled data length: %d\n"), size
);
366 byte_get_signed (unsigned char *field
, int size
)
368 bfd_vma x
= byte_get (field
, size
);
373 return (x
^ 0x80) - 0x80;
375 return (x
^ 0x8000) - 0x8000;
377 return (x
^ 0x80000000) - 0x80000000;
387 byte_put_little_endian (unsigned char *field
, bfd_vma value
, int size
)
392 field
[7] = (((value
>> 24) >> 24) >> 8) & 0xff;
393 field
[6] = ((value
>> 24) >> 24) & 0xff;
394 field
[5] = ((value
>> 24) >> 16) & 0xff;
395 field
[4] = ((value
>> 24) >> 8) & 0xff;
398 field
[3] = (value
>> 24) & 0xff;
399 field
[2] = (value
>> 16) & 0xff;
402 field
[1] = (value
>> 8) & 0xff;
405 field
[0] = value
& 0xff;
409 error (_("Unhandled data length: %d\n"), size
);
414 /* Print a VMA value. */
416 print_vma (bfd_vma vma
, print_mode mode
)
428 printf ("%8.8lx", (unsigned long) vma
);
434 printf ("%5ld", (long) vma
);
442 printf ("%lx", (unsigned long) vma
);
446 printf ("%ld", (unsigned long) vma
);
450 printf ("%lu", (unsigned long) vma
);
472 #if BFD_HOST_64BIT_LONG
475 if (_bfd_int64_high (vma
))
476 printf ("%lx%8.8lx", _bfd_int64_high (vma
), _bfd_int64_low (vma
));
478 printf ("%lx", _bfd_int64_low (vma
));
483 #if BFD_HOST_64BIT_LONG
486 if (_bfd_int64_high (vma
))
488 printf ("++%ld", _bfd_int64_low (vma
));
490 printf ("%ld", _bfd_int64_low (vma
));
495 #if BFD_HOST_64BIT_LONG
497 printf ("%5ld", vma
);
499 printf ("%#lx", vma
);
501 if (_bfd_int64_high (vma
))
503 printf ("++%ld", _bfd_int64_low (vma
));
504 else if (vma
<= 99999)
505 printf ("%5ld", _bfd_int64_low (vma
));
507 printf ("%#lx", _bfd_int64_low (vma
));
512 #if BFD_HOST_64BIT_LONG
515 if (_bfd_int64_high (vma
))
517 printf ("++%lu", _bfd_int64_low (vma
));
519 printf ("%lu", _bfd_int64_low (vma
));
527 /* Display a symbol on stdout. If do_wide is not true then
528 format the symbol to be at most WIDTH characters,
529 truncating as necessary. If WIDTH is negative then
530 format the string to be exactly - WIDTH characters,
531 truncating or padding as necessary. */
534 print_symbol (int width
, const char *symbol
)
537 printf ("%s", symbol
);
539 printf ("%-*.*s", width
, width
, symbol
);
541 printf ("%-.*s", width
, symbol
);
545 byte_get_big_endian (unsigned char *field
, int size
)
553 return ((unsigned int) (field
[1])) | (((int) (field
[0])) << 8);
556 return ((unsigned long) (field
[3]))
557 | (((unsigned long) (field
[2])) << 8)
558 | (((unsigned long) (field
[1])) << 16)
559 | (((unsigned long) (field
[0])) << 24);
563 /* Although we are extracing data from an 8 byte wide field, we
564 are returning only 4 bytes of data. */
565 return ((unsigned long) (field
[7]))
566 | (((unsigned long) (field
[6])) << 8)
567 | (((unsigned long) (field
[5])) << 16)
568 | (((unsigned long) (field
[4])) << 24);
572 /* This is a special case, generated by the BYTE_GET8 macro.
573 It means that we are loading an 8 byte value from a field
574 in an external structure into an 8 byte value in a field
575 in an internal structure. */
576 return ((bfd_vma
) (field
[7]))
577 | (((bfd_vma
) (field
[6])) << 8)
578 | (((bfd_vma
) (field
[5])) << 16)
579 | (((bfd_vma
) (field
[4])) << 24)
580 | (((bfd_vma
) (field
[3])) << 32)
581 | (((bfd_vma
) (field
[2])) << 40)
582 | (((bfd_vma
) (field
[1])) << 48)
583 | (((bfd_vma
) (field
[0])) << 56);
587 error (_("Unhandled data length: %d\n"), size
);
593 byte_put_big_endian (unsigned char *field
, bfd_vma value
, int size
)
598 field
[7] = value
& 0xff;
599 field
[6] = (value
>> 8) & 0xff;
600 field
[5] = (value
>> 16) & 0xff;
601 field
[4] = (value
>> 24) & 0xff;
606 field
[3] = value
& 0xff;
607 field
[2] = (value
>> 8) & 0xff;
611 field
[1] = value
& 0xff;
615 field
[0] = value
& 0xff;
619 error (_("Unhandled data length: %d\n"), size
);
624 /* Guess the relocation size commonly used by the specific machines. */
627 guess_is_rela (unsigned long e_machine
)
631 /* Targets that use REL relocations. */
646 /* Targets that use RELA relocations. */
661 case EM_CYGNUS_MN10200
:
663 case EM_CYGNUS_MN10300
:
710 warn (_("Don't know about relocations on this machine architecture\n"));
716 slurp_rela_relocs (FILE *file
,
717 unsigned long rel_offset
,
718 unsigned long rel_size
,
719 Elf_Internal_Rela
**relasp
,
720 unsigned long *nrelasp
)
722 Elf_Internal_Rela
*relas
;
723 unsigned long nrelas
;
728 Elf32_External_Rela
*erelas
;
730 erelas
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
734 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
736 relas
= malloc (nrelas
* sizeof (Elf_Internal_Rela
));
740 error(_("out of memory parsing relocs"));
744 for (i
= 0; i
< nrelas
; i
++)
746 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
747 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
748 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
755 Elf64_External_Rela
*erelas
;
757 erelas
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
761 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
763 relas
= malloc (nrelas
* sizeof (Elf_Internal_Rela
));
767 error(_("out of memory parsing relocs"));
771 for (i
= 0; i
< nrelas
; i
++)
773 relas
[i
].r_offset
= BYTE_GET8 (erelas
[i
].r_offset
);
774 relas
[i
].r_info
= BYTE_GET8 (erelas
[i
].r_info
);
775 relas
[i
].r_addend
= BYTE_GET8 (erelas
[i
].r_addend
);
786 slurp_rel_relocs (FILE *file
,
787 unsigned long rel_offset
,
788 unsigned long rel_size
,
789 Elf_Internal_Rela
**relsp
,
790 unsigned long *nrelsp
)
792 Elf_Internal_Rela
*rels
;
798 Elf32_External_Rel
*erels
;
800 erels
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
804 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
806 rels
= malloc (nrels
* sizeof (Elf_Internal_Rela
));
810 error(_("out of memory parsing relocs"));
814 for (i
= 0; i
< nrels
; i
++)
816 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
817 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
818 rels
[i
].r_addend
= 0;
825 Elf64_External_Rel
*erels
;
827 erels
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
831 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
833 rels
= malloc (nrels
* sizeof (Elf_Internal_Rela
));
837 error(_("out of memory parsing relocs"));
841 for (i
= 0; i
< nrels
; i
++)
843 rels
[i
].r_offset
= BYTE_GET8 (erels
[i
].r_offset
);
844 rels
[i
].r_info
= BYTE_GET8 (erels
[i
].r_info
);
845 rels
[i
].r_addend
= 0;
855 /* Display the contents of the relocation data found at the specified
859 dump_relocations (FILE *file
,
860 unsigned long rel_offset
,
861 unsigned long rel_size
,
862 Elf_Internal_Sym
*symtab
,
868 Elf_Internal_Rela
*rels
;
871 if (is_rela
== UNKNOWN
)
872 is_rela
= guess_is_rela (elf_header
.e_machine
);
876 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
881 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
890 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
892 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
897 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
899 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
907 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
909 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
914 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
916 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
920 for (i
= 0; i
< rel_size
; i
++)
923 const char *rtype2
= NULL
;
924 const char *rtype3
= NULL
;
927 bfd_vma symtab_index
;
932 offset
= rels
[i
].r_offset
;
933 info
= rels
[i
].r_info
;
937 type
= ELF32_R_TYPE (info
);
938 symtab_index
= ELF32_R_SYM (info
);
942 /* The #ifdef BFD64 below is to prevent a compile time warning.
943 We know that if we do not have a 64 bit data type that we
944 will never execute this code anyway. */
946 if (elf_header
.e_machine
== EM_MIPS
)
948 /* In little-endian objects, r_info isn't really a 64-bit
949 little-endian value: it has a 32-bit little-endian
950 symbol index followed by four individual byte fields.
951 Reorder INFO accordingly. */
952 if (elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
953 info
= (((info
& 0xffffffff) << 32)
954 | ((info
>> 56) & 0xff)
955 | ((info
>> 40) & 0xff00)
956 | ((info
>> 24) & 0xff0000)
957 | ((info
>> 8) & 0xff000000));
958 type
= ELF64_MIPS_R_TYPE (info
);
959 type2
= ELF64_MIPS_R_TYPE2 (info
);
960 type3
= ELF64_MIPS_R_TYPE3 (info
);
962 else if (elf_header
.e_machine
== EM_SPARCV9
)
963 type
= ELF64_R_TYPE_ID (info
);
965 type
= ELF64_R_TYPE (info
);
967 symtab_index
= ELF64_R_SYM (info
);
973 #ifdef _bfd_int64_low
974 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
976 printf ("%8.8lx %8.8lx ", offset
, info
);
981 #ifdef _bfd_int64_low
983 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
984 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
985 _bfd_int64_high (offset
),
986 _bfd_int64_low (offset
),
987 _bfd_int64_high (info
),
988 _bfd_int64_low (info
));
991 ? "%16.16lx %16.16lx "
992 : "%12.12lx %12.12lx ",
997 switch (elf_header
.e_machine
)
1004 case EM_CYGNUS_M32R
:
1005 rtype
= elf_m32r_reloc_type (type
);
1010 rtype
= elf_i386_reloc_type (type
);
1015 rtype
= elf_m68hc11_reloc_type (type
);
1019 rtype
= elf_m68k_reloc_type (type
);
1023 rtype
= elf_i960_reloc_type (type
);
1028 rtype
= elf_avr_reloc_type (type
);
1031 case EM_OLD_SPARCV9
:
1032 case EM_SPARC32PLUS
:
1035 rtype
= elf_sparc_reloc_type (type
);
1039 case EM_CYGNUS_V850
:
1040 rtype
= v850_reloc_type (type
);
1044 case EM_CYGNUS_D10V
:
1045 rtype
= elf_d10v_reloc_type (type
);
1049 case EM_CYGNUS_D30V
:
1050 rtype
= elf_d30v_reloc_type (type
);
1054 rtype
= elf_dlx_reloc_type (type
);
1058 rtype
= elf_sh_reloc_type (type
);
1062 case EM_CYGNUS_MN10300
:
1063 rtype
= elf_mn10300_reloc_type (type
);
1067 case EM_CYGNUS_MN10200
:
1068 rtype
= elf_mn10200_reloc_type (type
);
1072 case EM_CYGNUS_FR30
:
1073 rtype
= elf_fr30_reloc_type (type
);
1077 rtype
= elf_frv_reloc_type (type
);
1081 rtype
= elf_mcore_reloc_type (type
);
1085 rtype
= elf_mmix_reloc_type (type
);
1090 rtype
= elf_msp430_reloc_type (type
);
1094 rtype
= elf_ppc_reloc_type (type
);
1098 rtype
= elf_ppc64_reloc_type (type
);
1102 case EM_MIPS_RS3_LE
:
1103 rtype
= elf_mips_reloc_type (type
);
1106 rtype2
= elf_mips_reloc_type (type2
);
1107 rtype3
= elf_mips_reloc_type (type3
);
1112 rtype
= elf_alpha_reloc_type (type
);
1116 rtype
= elf_arm_reloc_type (type
);
1120 rtype
= elf_arc_reloc_type (type
);
1124 rtype
= elf_hppa_reloc_type (type
);
1130 rtype
= elf_h8_reloc_type (type
);
1135 rtype
= elf_or32_reloc_type (type
);
1140 rtype
= elf_pj_reloc_type (type
);
1143 rtype
= elf_ia64_reloc_type (type
);
1147 rtype
= elf_cris_reloc_type (type
);
1151 rtype
= elf_i860_reloc_type (type
);
1155 rtype
= elf_x86_64_reloc_type (type
);
1159 rtype
= i370_reloc_type (type
);
1164 rtype
= elf_s390_reloc_type (type
);
1168 rtype
= elf_xstormy16_reloc_type (type
);
1172 rtype
= elf_crx_reloc_type (type
);
1176 rtype
= elf_vax_reloc_type (type
);
1181 rtype
= elf_ip2k_reloc_type (type
);
1185 rtype
= elf_iq2000_reloc_type (type
);
1190 rtype
= elf_xtensa_reloc_type (type
);
1195 #ifdef _bfd_int64_low
1196 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type
));
1198 printf (_("unrecognized: %-7lx"), type
);
1201 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1205 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1206 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1209 Elf_Internal_Sym
*psym
;
1211 psym
= symtab
+ symtab_index
;
1214 print_vma (psym
->st_value
, LONG_HEX
);
1215 printf (is_32bit_elf
? " " : " ");
1217 if (psym
->st_name
== 0)
1219 const char *sec_name
= "<null>";
1222 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1224 bfd_vma sec_index
= (bfd_vma
) -1;
1226 if (psym
->st_shndx
< SHN_LORESERVE
)
1227 sec_index
= psym
->st_shndx
;
1228 else if (psym
->st_shndx
> SHN_LORESERVE
)
1229 sec_index
= psym
->st_shndx
- (SHN_HIRESERVE
+ 1
1232 if (sec_index
!= (bfd_vma
) -1)
1233 sec_name
= SECTION_NAME (section_headers
+ sec_index
);
1234 else if (psym
->st_shndx
== SHN_ABS
)
1236 else if (psym
->st_shndx
== SHN_COMMON
)
1237 sec_name
= "COMMON";
1238 else if (elf_header
.e_machine
== EM_IA_64
1239 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1240 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1241 sec_name
= "ANSI_COM";
1244 sprintf (name_buf
, "<section 0x%x>",
1245 (unsigned int) psym
->st_shndx
);
1246 sec_name
= name_buf
;
1249 print_symbol (22, sec_name
);
1251 else if (strtab
== NULL
)
1252 printf (_("<string table index %3ld>"), psym
->st_name
);
1254 print_symbol (22, strtab
+ psym
->st_name
);
1257 printf (" + %lx", (unsigned long) rels
[i
].r_addend
);
1262 printf ("%*c", is_32bit_elf
? (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1263 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1266 if (elf_header
.e_machine
== EM_SPARCV9
1267 && !strcmp (rtype
, "R_SPARC_OLO10"))
1268 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1272 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1274 printf (" Type2: ");
1277 #ifdef _bfd_int64_low
1278 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2
));
1280 printf (_("unrecognized: %-7lx"), type2
);
1283 printf ("%-17.17s", rtype2
);
1285 printf("\n Type3: ");
1288 #ifdef _bfd_int64_low
1289 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3
));
1291 printf (_("unrecognized: %-7lx"), type3
);
1294 printf ("%-17.17s", rtype3
);
1306 get_mips_dynamic_type (unsigned long type
)
1310 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1311 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1312 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1313 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1314 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1315 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1316 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1317 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1318 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1319 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1320 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1321 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1322 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1323 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1324 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1325 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1326 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1327 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1328 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1329 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1330 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1331 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1332 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1333 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1334 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1335 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1336 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1337 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1338 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1339 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1340 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1341 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1342 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1343 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1344 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1345 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1346 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1347 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1348 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1349 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1350 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1351 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1352 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1359 get_sparc64_dynamic_type (unsigned long type
)
1363 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1370 get_ppc64_dynamic_type (unsigned long type
)
1374 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1375 case DT_PPC64_OPD
: return "PPC64_OPD";
1376 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1383 get_parisc_dynamic_type (unsigned long type
)
1387 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1388 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1389 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1390 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1391 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1392 case DT_HP_PREINIT
: return "HP_PREINIT";
1393 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1394 case DT_HP_NEEDED
: return "HP_NEEDED";
1395 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1396 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1397 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1398 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1399 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1406 get_ia64_dynamic_type (unsigned long type
)
1410 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1417 get_dynamic_type (unsigned long type
)
1419 static char buff
[32];
1423 case DT_NULL
: return "NULL";
1424 case DT_NEEDED
: return "NEEDED";
1425 case DT_PLTRELSZ
: return "PLTRELSZ";
1426 case DT_PLTGOT
: return "PLTGOT";
1427 case DT_HASH
: return "HASH";
1428 case DT_STRTAB
: return "STRTAB";
1429 case DT_SYMTAB
: return "SYMTAB";
1430 case DT_RELA
: return "RELA";
1431 case DT_RELASZ
: return "RELASZ";
1432 case DT_RELAENT
: return "RELAENT";
1433 case DT_STRSZ
: return "STRSZ";
1434 case DT_SYMENT
: return "SYMENT";
1435 case DT_INIT
: return "INIT";
1436 case DT_FINI
: return "FINI";
1437 case DT_SONAME
: return "SONAME";
1438 case DT_RPATH
: return "RPATH";
1439 case DT_SYMBOLIC
: return "SYMBOLIC";
1440 case DT_REL
: return "REL";
1441 case DT_RELSZ
: return "RELSZ";
1442 case DT_RELENT
: return "RELENT";
1443 case DT_PLTREL
: return "PLTREL";
1444 case DT_DEBUG
: return "DEBUG";
1445 case DT_TEXTREL
: return "TEXTREL";
1446 case DT_JMPREL
: return "JMPREL";
1447 case DT_BIND_NOW
: return "BIND_NOW";
1448 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1449 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1450 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1451 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1452 case DT_RUNPATH
: return "RUNPATH";
1453 case DT_FLAGS
: return "FLAGS";
1455 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1456 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1458 case DT_CHECKSUM
: return "CHECKSUM";
1459 case DT_PLTPADSZ
: return "PLTPADSZ";
1460 case DT_MOVEENT
: return "MOVEENT";
1461 case DT_MOVESZ
: return "MOVESZ";
1462 case DT_FEATURE
: return "FEATURE";
1463 case DT_POSFLAG_1
: return "POSFLAG_1";
1464 case DT_SYMINSZ
: return "SYMINSZ";
1465 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1467 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1468 case DT_CONFIG
: return "CONFIG";
1469 case DT_DEPAUDIT
: return "DEPAUDIT";
1470 case DT_AUDIT
: return "AUDIT";
1471 case DT_PLTPAD
: return "PLTPAD";
1472 case DT_MOVETAB
: return "MOVETAB";
1473 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1475 case DT_VERSYM
: return "VERSYM";
1477 case DT_RELACOUNT
: return "RELACOUNT";
1478 case DT_RELCOUNT
: return "RELCOUNT";
1479 case DT_FLAGS_1
: return "FLAGS_1";
1480 case DT_VERDEF
: return "VERDEF";
1481 case DT_VERDEFNUM
: return "VERDEFNUM";
1482 case DT_VERNEED
: return "VERNEED";
1483 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1485 case DT_AUXILIARY
: return "AUXILIARY";
1486 case DT_USED
: return "USED";
1487 case DT_FILTER
: return "FILTER";
1489 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1490 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1491 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1492 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1493 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1496 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1500 switch (elf_header
.e_machine
)
1503 case EM_MIPS_RS3_LE
:
1504 result
= get_mips_dynamic_type (type
);
1507 result
= get_sparc64_dynamic_type (type
);
1510 result
= get_ppc64_dynamic_type (type
);
1513 result
= get_ia64_dynamic_type (type
);
1523 sprintf (buff
, _("Processor Specific: %lx"), type
);
1525 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1529 switch (elf_header
.e_machine
)
1532 result
= get_parisc_dynamic_type (type
);
1542 sprintf (buff
, _("Operating System specific: %lx"), type
);
1545 sprintf (buff
, _("<unknown>: %lx"), type
);
1552 get_file_type (unsigned e_type
)
1554 static char buff
[32];
1558 case ET_NONE
: return _("NONE (None)");
1559 case ET_REL
: return _("REL (Relocatable file)");
1560 case ET_EXEC
: return _("EXEC (Executable file)");
1561 case ET_DYN
: return _("DYN (Shared object file)");
1562 case ET_CORE
: return _("CORE (Core file)");
1565 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1566 sprintf (buff
, _("Processor Specific: (%x)"), e_type
);
1567 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1568 sprintf (buff
, _("OS Specific: (%x)"), e_type
);
1570 sprintf (buff
, _("<unknown>: %x"), e_type
);
1576 get_machine_name (unsigned e_machine
)
1578 static char buff
[64]; /* XXX */
1582 case EM_NONE
: return _("None");
1583 case EM_M32
: return "WE32100";
1584 case EM_SPARC
: return "Sparc";
1585 case EM_386
: return "Intel 80386";
1586 case EM_68K
: return "MC68000";
1587 case EM_88K
: return "MC88000";
1588 case EM_486
: return "Intel 80486";
1589 case EM_860
: return "Intel 80860";
1590 case EM_MIPS
: return "MIPS R3000";
1591 case EM_S370
: return "IBM System/370";
1592 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1593 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1594 case EM_PARISC
: return "HPPA";
1595 case EM_PPC_OLD
: return "Power PC (old)";
1596 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1597 case EM_960
: return "Intel 90860";
1598 case EM_PPC
: return "PowerPC";
1599 case EM_PPC64
: return "PowerPC64";
1600 case EM_V800
: return "NEC V800";
1601 case EM_FR20
: return "Fujitsu FR20";
1602 case EM_RH32
: return "TRW RH32";
1603 case EM_MCORE
: return "MCORE";
1604 case EM_ARM
: return "ARM";
1605 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1606 case EM_SH
: return "Renesas / SuperH SH";
1607 case EM_SPARCV9
: return "Sparc v9";
1608 case EM_TRICORE
: return "Siemens Tricore";
1609 case EM_ARC
: return "ARC";
1610 case EM_H8_300
: return "Renesas H8/300";
1611 case EM_H8_300H
: return "Renesas H8/300H";
1612 case EM_H8S
: return "Renesas H8S";
1613 case EM_H8_500
: return "Renesas H8/500";
1614 case EM_IA_64
: return "Intel IA-64";
1615 case EM_MIPS_X
: return "Stanford MIPS-X";
1616 case EM_COLDFIRE
: return "Motorola Coldfire";
1617 case EM_68HC12
: return "Motorola M68HC12";
1618 case EM_ALPHA
: return "Alpha";
1619 case EM_CYGNUS_D10V
:
1620 case EM_D10V
: return "d10v";
1621 case EM_CYGNUS_D30V
:
1622 case EM_D30V
: return "d30v";
1623 case EM_CYGNUS_M32R
:
1624 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
1625 case EM_CYGNUS_V850
:
1626 case EM_V850
: return "NEC v850";
1627 case EM_CYGNUS_MN10300
:
1628 case EM_MN10300
: return "mn10300";
1629 case EM_CYGNUS_MN10200
:
1630 case EM_MN10200
: return "mn10200";
1631 case EM_CYGNUS_FR30
:
1632 case EM_FR30
: return "Fujitsu FR30";
1633 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1635 case EM_PJ
: return "picoJava";
1636 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1637 case EM_PCP
: return "Siemens PCP";
1638 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1639 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1640 case EM_STARCORE
: return "Motorola Star*Core processor";
1641 case EM_ME16
: return "Toyota ME16 processor";
1642 case EM_ST100
: return "STMicroelectronics ST100 processor";
1643 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1644 case EM_FX66
: return "Siemens FX66 microcontroller";
1645 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1646 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1647 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1648 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1649 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1650 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1651 case EM_SVX
: return "Silicon Graphics SVx";
1652 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1653 case EM_VAX
: return "Digital VAX";
1655 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1656 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1657 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1658 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1659 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1660 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1661 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1662 case EM_PRISM
: return "Vitesse Prism";
1663 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1665 case EM_S390
: return "IBM S/390";
1666 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1668 case EM_OR32
: return "OpenRISC";
1669 case EM_CRX
: return "National Semiconductor CRX microprocessor";
1670 case EM_DLX
: return "OpenDLX";
1672 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1673 case EM_IQ2000
: return "Vitesse IQ2000";
1675 case EM_XTENSA
: return "Tensilica Xtensa Processor";
1677 sprintf (buff
, _("<unknown>: %x"), e_machine
);
1683 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
1688 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1689 e_flags
&= ~ EF_ARM_EABIMASK
;
1691 /* Handle "generic" ARM flags. */
1692 if (e_flags
& EF_ARM_RELEXEC
)
1694 strcat (buf
, ", relocatable executable");
1695 e_flags
&= ~ EF_ARM_RELEXEC
;
1698 if (e_flags
& EF_ARM_HASENTRY
)
1700 strcat (buf
, ", has entry point");
1701 e_flags
&= ~ EF_ARM_HASENTRY
;
1704 /* Now handle EABI specific flags. */
1708 strcat (buf
, ", <unrecognized EABI>");
1713 case EF_ARM_EABI_VER1
:
1714 strcat (buf
, ", Version1 EABI");
1719 /* Process flags one bit at a time. */
1720 flag
= e_flags
& - e_flags
;
1725 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1726 strcat (buf
, ", sorted symbol tables");
1736 case EF_ARM_EABI_VER2
:
1737 strcat (buf
, ", Version2 EABI");
1742 /* Process flags one bit at a time. */
1743 flag
= e_flags
& - e_flags
;
1748 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1749 strcat (buf
, ", sorted symbol tables");
1752 case EF_ARM_DYNSYMSUSESEGIDX
:
1753 strcat (buf
, ", dynamic symbols use segment index");
1756 case EF_ARM_MAPSYMSFIRST
:
1757 strcat (buf
, ", mapping symbols precede others");
1767 case EF_ARM_EABI_VER3
:
1768 strcat (buf
, ", Version3 EABI");
1773 /* Process flags one bit at a time. */
1774 flag
= e_flags
& - e_flags
;
1780 strcat (buf
, ", BE8");
1784 strcat (buf
, ", LE8");
1794 case EF_ARM_EABI_UNKNOWN
:
1795 strcat (buf
, ", GNU EABI");
1800 /* Process flags one bit at a time. */
1801 flag
= e_flags
& - e_flags
;
1806 case EF_ARM_INTERWORK
:
1807 strcat (buf
, ", interworking enabled");
1810 case EF_ARM_APCS_26
:
1811 strcat (buf
, ", uses APCS/26");
1814 case EF_ARM_APCS_FLOAT
:
1815 strcat (buf
, ", uses APCS/float");
1819 strcat (buf
, ", position independent");
1823 strcat (buf
, ", 8 bit structure alignment");
1826 case EF_ARM_NEW_ABI
:
1827 strcat (buf
, ", uses new ABI");
1830 case EF_ARM_OLD_ABI
:
1831 strcat (buf
, ", uses old ABI");
1834 case EF_ARM_SOFT_FLOAT
:
1835 strcat (buf
, ", software FP");
1838 case EF_ARM_VFP_FLOAT
:
1839 strcat (buf
, ", VFP");
1842 case EF_ARM_MAVERICK_FLOAT
:
1843 strcat (buf
, ", Maverick FP");
1854 strcat (buf
,", <unknown>");
1858 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
1860 static char buf
[1024];
1872 decode_ARM_machine_flags (e_flags
, buf
);
1876 if (e_flags
& EF_CPU32
)
1877 strcat (buf
, ", cpu32");
1878 if (e_flags
& EF_M68000
)
1879 strcat (buf
, ", m68000");
1883 if (e_flags
& EF_PPC_EMB
)
1884 strcat (buf
, ", emb");
1886 if (e_flags
& EF_PPC_RELOCATABLE
)
1887 strcat (buf
, ", relocatable");
1889 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
1890 strcat (buf
, ", relocatable-lib");
1894 case EM_CYGNUS_V850
:
1895 switch (e_flags
& EF_V850_ARCH
)
1898 strcat (buf
, ", v850e1");
1901 strcat (buf
, ", v850e");
1904 strcat (buf
, ", v850");
1907 strcat (buf
, ", unknown v850 architecture variant");
1913 case EM_CYGNUS_M32R
:
1914 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
1915 strcat (buf
, ", m32r");
1920 case EM_MIPS_RS3_LE
:
1921 if (e_flags
& EF_MIPS_NOREORDER
)
1922 strcat (buf
, ", noreorder");
1924 if (e_flags
& EF_MIPS_PIC
)
1925 strcat (buf
, ", pic");
1927 if (e_flags
& EF_MIPS_CPIC
)
1928 strcat (buf
, ", cpic");
1930 if (e_flags
& EF_MIPS_UCODE
)
1931 strcat (buf
, ", ugen_reserved");
1933 if (e_flags
& EF_MIPS_ABI2
)
1934 strcat (buf
, ", abi2");
1936 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
1937 strcat (buf
, ", odk first");
1939 if (e_flags
& EF_MIPS_32BITMODE
)
1940 strcat (buf
, ", 32bitmode");
1942 switch ((e_flags
& EF_MIPS_MACH
))
1944 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
1945 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
1946 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
1947 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
1948 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
1949 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
1950 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
1951 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
1952 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
1954 /* We simply ignore the field in this case to avoid confusion:
1955 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
1958 default: strcat (buf
, ", unknown CPU"); break;
1961 switch ((e_flags
& EF_MIPS_ABI
))
1963 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
1964 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
1965 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
1966 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
1968 /* We simply ignore the field in this case to avoid confusion:
1969 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
1970 This means it is likely to be an o32 file, but not for
1973 default: strcat (buf
, ", unknown ABI"); break;
1976 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
1977 strcat (buf
, ", mdmx");
1979 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
1980 strcat (buf
, ", mips16");
1982 switch ((e_flags
& EF_MIPS_ARCH
))
1984 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
1985 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
1986 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
1987 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
1988 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
1989 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
1990 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
1991 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
1992 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
1993 default: strcat (buf
, ", unknown ISA"); break;
1999 if (e_flags
& EF_SPARC_32PLUS
)
2000 strcat (buf
, ", v8+");
2002 if (e_flags
& EF_SPARC_SUN_US1
)
2003 strcat (buf
, ", ultrasparcI");
2005 if (e_flags
& EF_SPARC_SUN_US3
)
2006 strcat (buf
, ", ultrasparcIII");
2008 if (e_flags
& EF_SPARC_HAL_R1
)
2009 strcat (buf
, ", halr1");
2011 if (e_flags
& EF_SPARC_LEDATA
)
2012 strcat (buf
, ", ledata");
2014 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2015 strcat (buf
, ", tso");
2017 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2018 strcat (buf
, ", pso");
2020 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2021 strcat (buf
, ", rmo");
2025 switch (e_flags
& EF_PARISC_ARCH
)
2027 case EFA_PARISC_1_0
:
2028 strcpy (buf
, ", PA-RISC 1.0");
2030 case EFA_PARISC_1_1
:
2031 strcpy (buf
, ", PA-RISC 1.1");
2033 case EFA_PARISC_2_0
:
2034 strcpy (buf
, ", PA-RISC 2.0");
2039 if (e_flags
& EF_PARISC_TRAPNIL
)
2040 strcat (buf
, ", trapnil");
2041 if (e_flags
& EF_PARISC_EXT
)
2042 strcat (buf
, ", ext");
2043 if (e_flags
& EF_PARISC_LSB
)
2044 strcat (buf
, ", lsb");
2045 if (e_flags
& EF_PARISC_WIDE
)
2046 strcat (buf
, ", wide");
2047 if (e_flags
& EF_PARISC_NO_KABP
)
2048 strcat (buf
, ", no kabp");
2049 if (e_flags
& EF_PARISC_LAZYSWAP
)
2050 strcat (buf
, ", lazyswap");
2055 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2056 strcat (buf
, ", new calling convention");
2058 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2059 strcat (buf
, ", gnu calling convention");
2063 if ((e_flags
& EF_IA_64_ABI64
))
2064 strcat (buf
, ", 64-bit");
2066 strcat (buf
, ", 32-bit");
2067 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2068 strcat (buf
, ", reduced fp model");
2069 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2070 strcat (buf
, ", no function descriptors, constant gp");
2071 else if ((e_flags
& EF_IA_64_CONS_GP
))
2072 strcat (buf
, ", constant gp");
2073 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2074 strcat (buf
, ", absolute");
2078 if ((e_flags
& EF_VAX_NONPIC
))
2079 strcat (buf
, ", non-PIC");
2080 if ((e_flags
& EF_VAX_DFLOAT
))
2081 strcat (buf
, ", D-Float");
2082 if ((e_flags
& EF_VAX_GFLOAT
))
2083 strcat (buf
, ", G-Float");
2092 get_osabi_name (unsigned int osabi
)
2094 static char buff
[32];
2098 case ELFOSABI_NONE
: return "UNIX - System V";
2099 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2100 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2101 case ELFOSABI_LINUX
: return "UNIX - Linux";
2102 case ELFOSABI_HURD
: return "GNU/Hurd";
2103 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2104 case ELFOSABI_AIX
: return "UNIX - AIX";
2105 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2106 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2107 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2108 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2109 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2110 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2111 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2112 case ELFOSABI_AROS
: return "Amiga Research OS";
2113 case ELFOSABI_STANDALONE
: return _("Standalone App");
2114 case ELFOSABI_ARM
: return "ARM";
2116 sprintf (buff
, _("<unknown: %x>"), osabi
);
2122 get_mips_segment_type (unsigned long type
)
2126 case PT_MIPS_REGINFO
:
2128 case PT_MIPS_RTPROC
:
2130 case PT_MIPS_OPTIONS
:
2140 get_parisc_segment_type (unsigned long type
)
2144 case PT_HP_TLS
: return "HP_TLS";
2145 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2146 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2147 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2148 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2149 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2150 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2151 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2152 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2153 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2154 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2155 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2156 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2157 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2166 get_ia64_segment_type (unsigned long type
)
2170 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2171 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2172 case PT_HP_TLS
: return "HP_TLS";
2173 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2174 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2175 case PT_IA_64_HP_STACK
: return "HP_STACK";
2184 get_segment_type (unsigned long p_type
)
2186 static char buff
[32];
2190 case PT_NULL
: return "NULL";
2191 case PT_LOAD
: return "LOAD";
2192 case PT_DYNAMIC
: return "DYNAMIC";
2193 case PT_INTERP
: return "INTERP";
2194 case PT_NOTE
: return "NOTE";
2195 case PT_SHLIB
: return "SHLIB";
2196 case PT_PHDR
: return "PHDR";
2197 case PT_TLS
: return "TLS";
2199 case PT_GNU_EH_FRAME
:
2200 return "GNU_EH_FRAME";
2201 case PT_GNU_STACK
: return "GNU_STACK";
2202 case PT_GNU_RELRO
: return "GNU_RELRO";
2205 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2209 switch (elf_header
.e_machine
)
2212 case EM_MIPS_RS3_LE
:
2213 result
= get_mips_segment_type (p_type
);
2216 result
= get_parisc_segment_type (p_type
);
2219 result
= get_ia64_segment_type (p_type
);
2229 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2231 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2235 switch (elf_header
.e_machine
)
2238 result
= get_parisc_segment_type (p_type
);
2241 result
= get_ia64_segment_type (p_type
);
2251 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2254 sprintf (buff
, _("<unknown>: %lx"), p_type
);
2261 get_mips_section_type_name (unsigned int sh_type
)
2265 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2266 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2267 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2268 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2269 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2270 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2271 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2272 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2273 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2274 case SHT_MIPS_RELD
: return "MIPS_RELD";
2275 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2276 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2277 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2278 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2279 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2280 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2281 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2282 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2283 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2284 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2285 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2286 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2287 case SHT_MIPS_LINE
: return "MIPS_LINE";
2288 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2289 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2290 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2291 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2292 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2293 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2294 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2295 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2296 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2297 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2298 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2299 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2300 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2301 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2302 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2303 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2311 get_parisc_section_type_name (unsigned int sh_type
)
2315 case SHT_PARISC_EXT
: return "PARISC_EXT";
2316 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2317 case SHT_PARISC_DOC
: return "PARISC_DOC";
2325 get_ia64_section_type_name (unsigned int sh_type
)
2327 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2328 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2329 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2333 case SHT_IA_64_EXT
: return "IA_64_EXT";
2334 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2335 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2343 get_section_type_name (unsigned int sh_type
)
2345 static char buff
[32];
2349 case SHT_NULL
: return "NULL";
2350 case SHT_PROGBITS
: return "PROGBITS";
2351 case SHT_SYMTAB
: return "SYMTAB";
2352 case SHT_STRTAB
: return "STRTAB";
2353 case SHT_RELA
: return "RELA";
2354 case SHT_HASH
: return "HASH";
2355 case SHT_DYNAMIC
: return "DYNAMIC";
2356 case SHT_NOTE
: return "NOTE";
2357 case SHT_NOBITS
: return "NOBITS";
2358 case SHT_REL
: return "REL";
2359 case SHT_SHLIB
: return "SHLIB";
2360 case SHT_DYNSYM
: return "DYNSYM";
2361 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2362 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2363 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2364 case SHT_GROUP
: return "GROUP";
2365 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2366 case SHT_GNU_verdef
: return "VERDEF";
2367 case SHT_GNU_verneed
: return "VERNEED";
2368 case SHT_GNU_versym
: return "VERSYM";
2369 case 0x6ffffff0: return "VERSYM";
2370 case 0x6ffffffc: return "VERDEF";
2371 case 0x7ffffffd: return "AUXILIARY";
2372 case 0x7fffffff: return "FILTER";
2373 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2376 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2380 switch (elf_header
.e_machine
)
2383 case EM_MIPS_RS3_LE
:
2384 result
= get_mips_section_type_name (sh_type
);
2387 result
= get_parisc_section_type_name (sh_type
);
2390 result
= get_ia64_section_type_name (sh_type
);
2400 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2402 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2403 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2404 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2405 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2407 sprintf (buff
, _("<unknown>: %x"), sh_type
);
2413 #define OPTION_DEBUG_DUMP 512
2415 struct option options
[] =
2417 {"all", no_argument
, 0, 'a'},
2418 {"file-header", no_argument
, 0, 'h'},
2419 {"program-headers", no_argument
, 0, 'l'},
2420 {"headers", no_argument
, 0, 'e'},
2421 {"histogram", no_argument
, 0, 'I'},
2422 {"segments", no_argument
, 0, 'l'},
2423 {"sections", no_argument
, 0, 'S'},
2424 {"section-headers", no_argument
, 0, 'S'},
2425 {"section-groups", no_argument
, 0, 'g'},
2426 {"symbols", no_argument
, 0, 's'},
2427 {"syms", no_argument
, 0, 's'},
2428 {"relocs", no_argument
, 0, 'r'},
2429 {"notes", no_argument
, 0, 'n'},
2430 {"dynamic", no_argument
, 0, 'd'},
2431 {"arch-specific", no_argument
, 0, 'A'},
2432 {"version-info", no_argument
, 0, 'V'},
2433 {"use-dynamic", no_argument
, 0, 'D'},
2434 {"hex-dump", required_argument
, 0, 'x'},
2435 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2436 {"unwind", no_argument
, 0, 'u'},
2437 #ifdef SUPPORT_DISASSEMBLY
2438 {"instruction-dump", required_argument
, 0, 'i'},
2441 {"version", no_argument
, 0, 'v'},
2442 {"wide", no_argument
, 0, 'W'},
2443 {"help", no_argument
, 0, 'H'},
2444 {0, no_argument
, 0, 0}
2450 fprintf (stdout
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2451 fprintf (stdout
, _(" Display information about the contents of ELF format files\n"));
2452 fprintf (stdout
, _(" Options are:\n\
2453 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2454 -h --file-header Display the ELF file header\n\
2455 -l --program-headers Display the program headers\n\
2456 --segments An alias for --program-headers\n\
2457 -S --section-headers Display the sections' header\n\
2458 --sections An alias for --section-headers\n\
2459 -g --section-groups Display the section groups\n\
2460 -e --headers Equivalent to: -h -l -S\n\
2461 -s --syms Display the symbol table\n\
2462 --symbols An alias for --syms\n\
2463 -n --notes Display the core notes (if present)\n\
2464 -r --relocs Display the relocations (if present)\n\
2465 -u --unwind Display the unwind info (if present)\n\
2466 -d --dynamic Display the dynamic section (if present)\n\
2467 -V --version-info Display the version sections (if present)\n\
2468 -A --arch-specific Display architecture specific information (if any).\n\
2469 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2470 -x --hex-dump=<number> Dump the contents of section <number>\n\
2471 -w[liaprmfFso] or\n\
2472 --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]\n\
2473 Display the contents of DWARF2 debug sections\n"));
2474 #ifdef SUPPORT_DISASSEMBLY
2475 fprintf (stdout
, _("\
2476 -i --instruction-dump=<number>\n\
2477 Disassemble the contents of section <number>\n"));
2479 fprintf (stdout
, _("\
2480 -I --histogram Display histogram of bucket list lengths\n\
2481 -W --wide Allow output width to exceed 80 characters\n\
2482 -H --help Display this information\n\
2483 -v --version Display the version number of readelf\n"));
2484 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2490 request_dump (unsigned int section
, int type
)
2492 if (section
>= num_dump_sects
)
2494 char *new_dump_sects
;
2496 new_dump_sects
= calloc (section
+ 1, 1);
2498 if (new_dump_sects
== NULL
)
2499 error (_("Out of memory allocating dump request table."));
2502 /* Copy current flag settings. */
2503 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2507 dump_sects
= new_dump_sects
;
2508 num_dump_sects
= section
+ 1;
2513 dump_sects
[section
] |= type
;
2519 parse_args (int argc
, char **argv
)
2526 while ((c
= getopt_long
2527 (argc
, argv
, "ersuahnldSDAIgw::x:i:vVWH", options
, NULL
)) != EOF
)
2548 do_section_groups
++;
2556 do_section_groups
++;
2598 section
= strtoul (optarg
, & cp
, 0);
2599 if (! *cp
&& section
>= 0)
2601 request_dump (section
, HEX_DUMP
);
2611 unsigned int index
= 0;
2615 while (optarg
[index
])
2616 switch (optarg
[index
++])
2625 do_debug_abbrevs
= 1;
2635 do_debug_pubnames
= 1;
2640 do_debug_aranges
= 1;
2644 do_debug_frames_interp
= 1;
2646 do_debug_frames
= 1;
2651 do_debug_macinfo
= 1;
2665 warn (_("Unrecognized debug option '%s'\n"), optarg
);
2670 case OPTION_DEBUG_DUMP
:
2676 static const char *debug_dump_opt
[]
2677 = { "line", "info", "abbrev", "pubnames", "ranges",
2678 "macro", "frames", "frames-interp", "str", "loc", NULL
};
2687 for (index
= 0; debug_dump_opt
[index
]; index
++)
2689 size_t len
= strlen (debug_dump_opt
[index
]);
2691 if (strncmp (p
, debug_dump_opt
[index
], len
) == 0
2692 && (p
[len
] == ',' || p
[len
] == '\0'))
2701 do_debug_abbrevs
= 1;
2712 do_debug_pubnames
= 1;
2716 do_debug_aranges
= 1;
2721 do_debug_frames_interp
= 1;
2722 do_debug_frames
= 1;
2726 do_debug_macinfo
= 1;
2739 if (debug_dump_opt
[index
] == NULL
)
2741 warn (_("Unrecognized debug option '%s'\n"), p
);
2742 p
= strchr (p
, ',');
2752 #ifdef SUPPORT_DISASSEMBLY
2755 section
= strtoul (optarg
, & cp
, 0);
2756 if (! *cp
&& section
>= 0)
2758 request_dump (section
, DISASS_DUMP
);
2764 print_version (program_name
);
2774 /* xgettext:c-format */
2775 error (_("Invalid option '-%c'\n"), c
);
2782 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
2783 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2784 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
2785 && !do_section_groups
)
2789 warn (_("Nothing to do.\n"));
2795 get_elf_class (unsigned int elf_class
)
2797 static char buff
[32];
2801 case ELFCLASSNONE
: return _("none");
2802 case ELFCLASS32
: return "ELF32";
2803 case ELFCLASS64
: return "ELF64";
2805 sprintf (buff
, _("<unknown: %x>"), elf_class
);
2811 get_data_encoding (unsigned int encoding
)
2813 static char buff
[32];
2817 case ELFDATANONE
: return _("none");
2818 case ELFDATA2LSB
: return _("2's complement, little endian");
2819 case ELFDATA2MSB
: return _("2's complement, big endian");
2821 sprintf (buff
, _("<unknown: %x>"), encoding
);
2826 /* Decode the data held in 'elf_header'. */
2829 process_file_header (void)
2831 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2832 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
2833 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
2834 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
2837 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2845 printf (_("ELF Header:\n"));
2846 printf (_(" Magic: "));
2847 for (i
= 0; i
< EI_NIDENT
; i
++)
2848 printf ("%2.2x ", elf_header
.e_ident
[i
]);
2850 printf (_(" Class: %s\n"),
2851 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
2852 printf (_(" Data: %s\n"),
2853 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
2854 printf (_(" Version: %d %s\n"),
2855 elf_header
.e_ident
[EI_VERSION
],
2856 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
2858 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
2861 printf (_(" OS/ABI: %s\n"),
2862 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
2863 printf (_(" ABI Version: %d\n"),
2864 elf_header
.e_ident
[EI_ABIVERSION
]);
2865 printf (_(" Type: %s\n"),
2866 get_file_type (elf_header
.e_type
));
2867 printf (_(" Machine: %s\n"),
2868 get_machine_name (elf_header
.e_machine
));
2869 printf (_(" Version: 0x%lx\n"),
2870 (unsigned long) elf_header
.e_version
);
2872 printf (_(" Entry point address: "));
2873 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2874 printf (_("\n Start of program headers: "));
2875 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2876 printf (_(" (bytes into file)\n Start of section headers: "));
2877 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
2878 printf (_(" (bytes into file)\n"));
2880 printf (_(" Flags: 0x%lx%s\n"),
2881 (unsigned long) elf_header
.e_flags
,
2882 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
2883 printf (_(" Size of this header: %ld (bytes)\n"),
2884 (long) elf_header
.e_ehsize
);
2885 printf (_(" Size of program headers: %ld (bytes)\n"),
2886 (long) elf_header
.e_phentsize
);
2887 printf (_(" Number of program headers: %ld\n"),
2888 (long) elf_header
.e_phnum
);
2889 printf (_(" Size of section headers: %ld (bytes)\n"),
2890 (long) elf_header
.e_shentsize
);
2891 printf (_(" Number of section headers: %ld"),
2892 (long) elf_header
.e_shnum
);
2893 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
2894 printf (" (%ld)", (long) section_headers
[0].sh_size
);
2895 putc ('\n', stdout
);
2896 printf (_(" Section header string table index: %ld"),
2897 (long) elf_header
.e_shstrndx
);
2898 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
2899 printf (" (%ld)", (long) section_headers
[0].sh_link
);
2900 putc ('\n', stdout
);
2903 if (section_headers
!= NULL
)
2905 if (elf_header
.e_shnum
== 0)
2906 elf_header
.e_shnum
= section_headers
[0].sh_size
;
2907 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
2908 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
2909 free (section_headers
);
2910 section_headers
= NULL
;
2918 get_32bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
2920 Elf32_External_Phdr
*phdrs
;
2921 Elf32_External_Phdr
*external
;
2922 Elf_Internal_Phdr
*internal
;
2925 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
2926 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2927 _("program headers"));
2931 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2932 i
< elf_header
.e_phnum
;
2933 i
++, internal
++, external
++)
2935 internal
->p_type
= BYTE_GET (external
->p_type
);
2936 internal
->p_offset
= BYTE_GET (external
->p_offset
);
2937 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
2938 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
2939 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
2940 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
2941 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2942 internal
->p_align
= BYTE_GET (external
->p_align
);
2951 get_64bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
2953 Elf64_External_Phdr
*phdrs
;
2954 Elf64_External_Phdr
*external
;
2955 Elf_Internal_Phdr
*internal
;
2958 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
2959 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2960 _("program headers"));
2964 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2965 i
< elf_header
.e_phnum
;
2966 i
++, internal
++, external
++)
2968 internal
->p_type
= BYTE_GET (external
->p_type
);
2969 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2970 internal
->p_offset
= BYTE_GET8 (external
->p_offset
);
2971 internal
->p_vaddr
= BYTE_GET8 (external
->p_vaddr
);
2972 internal
->p_paddr
= BYTE_GET8 (external
->p_paddr
);
2973 internal
->p_filesz
= BYTE_GET8 (external
->p_filesz
);
2974 internal
->p_memsz
= BYTE_GET8 (external
->p_memsz
);
2975 internal
->p_align
= BYTE_GET8 (external
->p_align
);
2983 /* Returns 1 if the program headers were read into `program_headers'. */
2986 get_program_headers (FILE *file
)
2988 Elf_Internal_Phdr
*phdrs
;
2990 /* Check cache of prior read. */
2991 if (program_headers
!= NULL
)
2994 phdrs
= malloc (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
2998 error (_("Out of memory\n"));
3003 ? get_32bit_program_headers (file
, phdrs
)
3004 : get_64bit_program_headers (file
, phdrs
))
3006 program_headers
= phdrs
;
3014 /* Returns 1 if the program headers were loaded. */
3017 process_program_headers (FILE *file
)
3019 Elf_Internal_Phdr
*segment
;
3022 if (elf_header
.e_phnum
== 0)
3025 printf (_("\nThere are no program headers in this file.\n"));
3029 if (do_segments
&& !do_header
)
3031 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3032 printf (_("Entry point "));
3033 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3034 printf (_("\nThere are %d program headers, starting at offset "),
3035 elf_header
.e_phnum
);
3036 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3040 if (! get_program_headers (file
))
3045 if (elf_header
.e_phnum
> 1)
3046 printf (_("\nProgram Headers:\n"));
3048 printf (_("\nProgram Headers:\n"));
3052 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3055 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3059 (_(" Type Offset VirtAddr PhysAddr\n"));
3061 (_(" FileSiz MemSiz Flags Align\n"));
3068 for (i
= 0, segment
= program_headers
;
3069 i
< elf_header
.e_phnum
;
3074 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3078 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3079 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3080 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3081 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3082 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3084 (segment
->p_flags
& PF_R
? 'R' : ' '),
3085 (segment
->p_flags
& PF_W
? 'W' : ' '),
3086 (segment
->p_flags
& PF_X
? 'E' : ' '));
3087 printf ("%#lx", (unsigned long) segment
->p_align
);
3091 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3092 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3095 print_vma (segment
->p_offset
, FULL_HEX
);
3099 print_vma (segment
->p_vaddr
, FULL_HEX
);
3101 print_vma (segment
->p_paddr
, FULL_HEX
);
3104 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3105 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3108 print_vma (segment
->p_filesz
, FULL_HEX
);
3112 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3113 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3116 print_vma (segment
->p_offset
, FULL_HEX
);
3120 (segment
->p_flags
& PF_R
? 'R' : ' '),
3121 (segment
->p_flags
& PF_W
? 'W' : ' '),
3122 (segment
->p_flags
& PF_X
? 'E' : ' '));
3124 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3125 printf ("%#lx", (unsigned long) segment
->p_align
);
3128 print_vma (segment
->p_align
, PREFIX_HEX
);
3133 print_vma (segment
->p_offset
, FULL_HEX
);
3135 print_vma (segment
->p_vaddr
, FULL_HEX
);
3137 print_vma (segment
->p_paddr
, FULL_HEX
);
3139 print_vma (segment
->p_filesz
, FULL_HEX
);
3141 print_vma (segment
->p_memsz
, FULL_HEX
);
3143 (segment
->p_flags
& PF_R
? 'R' : ' '),
3144 (segment
->p_flags
& PF_W
? 'W' : ' '),
3145 (segment
->p_flags
& PF_X
? 'E' : ' '));
3146 print_vma (segment
->p_align
, HEX
);
3150 switch (segment
->p_type
)
3154 error (_("more than one dynamic segment\n"));
3156 /* Try to locate the .dynamic section. If there is
3157 a section header table, we can easily locate it. */
3158 if (section_headers
!= NULL
)
3160 Elf_Internal_Shdr
*sec
;
3163 for (j
= 0, sec
= section_headers
;
3164 j
< elf_header
.e_shnum
;
3166 if (strcmp (SECTION_NAME (sec
), ".dynamic") == 0)
3169 if (j
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
3171 error (_("no .dynamic section in the dynamic segment"));
3175 dynamic_addr
= sec
->sh_offset
;
3176 dynamic_size
= sec
->sh_size
;
3178 if (dynamic_addr
< segment
->p_offset
3179 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
3180 warn (_("the .dynamic section is not contained within the dynamic segment"));
3181 else if (dynamic_addr
> segment
->p_offset
)
3182 warn (_("the .dynamic section is not the first section in the dynamic segment."));
3186 /* Otherwise, we can only assume that the .dynamic
3187 section is the first section in the DYNAMIC segment. */
3188 dynamic_addr
= segment
->p_offset
;
3189 dynamic_size
= segment
->p_filesz
;
3194 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3196 error (_("Unable to find program interpreter name\n"));
3199 program_interpreter
[0] = 0;
3200 fscanf (file
, "%63s", program_interpreter
);
3203 printf (_("\n [Requesting program interpreter: %s]"),
3204 program_interpreter
);
3210 putc ('\n', stdout
);
3213 if (do_segments
&& section_headers
!= NULL
)
3215 printf (_("\n Section to Segment mapping:\n"));
3216 printf (_(" Segment Sections...\n"));
3218 assert (string_table
!= NULL
);
3220 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3223 Elf_Internal_Shdr
*section
;
3225 segment
= program_headers
+ i
;
3226 section
= section_headers
;
3228 printf (" %2.2d ", i
);
3230 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3232 if (section
->sh_size
> 0
3233 /* Compare allocated sections by VMA, unallocated
3234 sections by file offset. */
3235 && (section
->sh_flags
& SHF_ALLOC
3236 ? (section
->sh_addr
>= segment
->p_vaddr
3237 && section
->sh_addr
+ section
->sh_size
3238 <= segment
->p_vaddr
+ segment
->p_memsz
)
3239 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
3240 && (section
->sh_offset
+ section
->sh_size
3241 <= segment
->p_offset
+ segment
->p_filesz
))))
3242 printf ("%s ", SECTION_NAME (section
));
3253 /* Find the file offset corresponding to VMA by using the program headers. */
3256 offset_from_vma (FILE *file
, bfd_vma vma
, bfd_size_type size
)
3258 Elf_Internal_Phdr
*seg
;
3260 if (! get_program_headers (file
))
3262 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3266 for (seg
= program_headers
;
3267 seg
< program_headers
+ elf_header
.e_phnum
;
3270 if (seg
->p_type
!= PT_LOAD
)
3273 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3274 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3275 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3278 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3285 get_32bit_section_headers (FILE *file
, unsigned int num
)
3287 Elf32_External_Shdr
*shdrs
;
3288 Elf_Internal_Shdr
*internal
;
3291 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3292 elf_header
.e_shentsize
* num
, _("section headers"));
3296 section_headers
= malloc (num
* sizeof (Elf_Internal_Shdr
));
3298 if (section_headers
== NULL
)
3300 error (_("Out of memory\n"));
3304 for (i
= 0, internal
= section_headers
;
3308 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3309 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3310 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3311 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3312 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3313 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3314 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3315 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3316 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3317 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3326 get_64bit_section_headers (FILE *file
, unsigned int num
)
3328 Elf64_External_Shdr
*shdrs
;
3329 Elf_Internal_Shdr
*internal
;
3332 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3333 elf_header
.e_shentsize
* num
, _("section headers"));
3337 section_headers
= malloc (num
* sizeof (Elf_Internal_Shdr
));
3339 if (section_headers
== NULL
)
3341 error (_("Out of memory\n"));
3345 for (i
= 0, internal
= section_headers
;
3349 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3350 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3351 internal
->sh_flags
= BYTE_GET8 (shdrs
[i
].sh_flags
);
3352 internal
->sh_addr
= BYTE_GET8 (shdrs
[i
].sh_addr
);
3353 internal
->sh_size
= BYTE_GET8 (shdrs
[i
].sh_size
);
3354 internal
->sh_entsize
= BYTE_GET8 (shdrs
[i
].sh_entsize
);
3355 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3356 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3357 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3358 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3366 static Elf_Internal_Sym
*
3367 get_32bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3369 unsigned long number
;
3370 Elf32_External_Sym
*esyms
;
3371 Elf_External_Sym_Shndx
*shndx
;
3372 Elf_Internal_Sym
*isyms
;
3373 Elf_Internal_Sym
*psym
;
3376 esyms
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
3382 if (symtab_shndx_hdr
!= NULL
3383 && (symtab_shndx_hdr
->sh_link
3384 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3386 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3387 symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3395 number
= section
->sh_size
/ section
->sh_entsize
;
3396 isyms
= malloc (number
* sizeof (Elf_Internal_Sym
));
3400 error (_("Out of memory\n"));
3407 for (j
= 0, psym
= isyms
;
3411 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3412 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3413 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3414 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3415 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3417 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3418 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3419 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3429 static Elf_Internal_Sym
*
3430 get_64bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3432 unsigned long number
;
3433 Elf64_External_Sym
*esyms
;
3434 Elf_External_Sym_Shndx
*shndx
;
3435 Elf_Internal_Sym
*isyms
;
3436 Elf_Internal_Sym
*psym
;
3439 esyms
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
3445 if (symtab_shndx_hdr
!= NULL
3446 && (symtab_shndx_hdr
->sh_link
3447 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3449 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3450 symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3458 number
= section
->sh_size
/ section
->sh_entsize
;
3459 isyms
= malloc (number
* sizeof (Elf_Internal_Sym
));
3463 error (_("Out of memory\n"));
3470 for (j
= 0, psym
= isyms
;
3474 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3475 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3476 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3477 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3478 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3480 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3481 psym
->st_value
= BYTE_GET8 (esyms
[j
].st_value
);
3482 psym
->st_size
= BYTE_GET8 (esyms
[j
].st_size
);
3493 get_elf_section_flags (bfd_vma sh_flags
)
3495 static char buff
[32];
3503 flag
= sh_flags
& - sh_flags
;
3508 case SHF_WRITE
: strcat (buff
, "W"); break;
3509 case SHF_ALLOC
: strcat (buff
, "A"); break;
3510 case SHF_EXECINSTR
: strcat (buff
, "X"); break;
3511 case SHF_MERGE
: strcat (buff
, "M"); break;
3512 case SHF_STRINGS
: strcat (buff
, "S"); break;
3513 case SHF_INFO_LINK
: strcat (buff
, "I"); break;
3514 case SHF_LINK_ORDER
: strcat (buff
, "L"); break;
3515 case SHF_OS_NONCONFORMING
: strcat (buff
, "O"); break;
3516 case SHF_GROUP
: strcat (buff
, "G"); break;
3517 case SHF_TLS
: strcat (buff
, "T"); break;
3520 if (flag
& SHF_MASKOS
)
3523 sh_flags
&= ~ SHF_MASKOS
;
3525 else if (flag
& SHF_MASKPROC
)
3528 sh_flags
&= ~ SHF_MASKPROC
;
3540 process_section_headers (FILE *file
)
3542 Elf_Internal_Shdr
*section
;
3545 section_headers
= NULL
;
3547 if (elf_header
.e_shnum
== 0)
3550 printf (_("\nThere are no sections in this file.\n"));
3555 if (do_sections
&& !do_header
)
3556 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3557 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3561 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3564 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3567 /* Read in the string table, so that we have names to display. */
3568 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3570 if (section
->sh_size
!= 0)
3572 string_table
= get_data (NULL
, file
, section
->sh_offset
,
3573 section
->sh_size
, _("string table"));
3575 if (string_table
== NULL
)
3578 string_table_length
= section
->sh_size
;
3581 /* Scan the sections for the dynamic symbol table
3582 and dynamic string table and debug sections. */
3583 dynamic_symbols
= NULL
;
3584 dynamic_strings
= NULL
;
3585 dynamic_syminfo
= NULL
;
3586 symtab_shndx_hdr
= NULL
;
3588 for (i
= 0, section
= section_headers
;
3589 i
< elf_header
.e_shnum
;
3592 char *name
= SECTION_NAME (section
);
3594 if (section
->sh_type
== SHT_DYNSYM
)
3596 if (dynamic_symbols
!= NULL
)
3598 error (_("File contains multiple dynamic symbol tables\n"));
3602 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3603 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3605 else if (section
->sh_type
== SHT_STRTAB
3606 && strcmp (name
, ".dynstr") == 0)
3608 if (dynamic_strings
!= NULL
)
3610 error (_("File contains multiple dynamic string tables\n"));
3614 dynamic_strings
= get_data (NULL
, file
, section
->sh_offset
,
3615 section
->sh_size
, _("dynamic strings"));
3617 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
3619 if (symtab_shndx_hdr
!= NULL
)
3621 error (_("File contains multiple symtab shndx tables\n"));
3624 symtab_shndx_hdr
= section
;
3626 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
3627 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
3628 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
3630 && strncmp (name
, ".debug_", 7) == 0)
3635 || (do_debug_info
&& (strcmp (name
, "info") == 0))
3636 || (do_debug_abbrevs
&& (strcmp (name
, "abbrev") == 0))
3637 || (do_debug_lines
&& (strcmp (name
, "line") == 0))
3638 || (do_debug_pubnames
&& (strcmp (name
, "pubnames") == 0))
3639 || (do_debug_aranges
&& (strcmp (name
, "aranges") == 0))
3640 || (do_debug_frames
&& (strcmp (name
, "frame") == 0))
3641 || (do_debug_macinfo
&& (strcmp (name
, "macinfo") == 0))
3642 || (do_debug_str
&& (strcmp (name
, "str") == 0))
3643 || (do_debug_loc
&& (strcmp (name
, "loc") == 0))
3645 request_dump (i
, DEBUG_DUMP
);
3647 /* linkonce section to be combined with .debug_info at link time. */
3648 else if ((do_debugging
|| do_debug_info
)
3649 && strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
3650 request_dump (i
, DEBUG_DUMP
);
3651 else if (do_debug_frames
&& strcmp (name
, ".eh_frame") == 0)
3652 request_dump (i
, DEBUG_DUMP
);
3658 if (elf_header
.e_shnum
> 1)
3659 printf (_("\nSection Headers:\n"));
3661 printf (_("\nSection Header:\n"));
3665 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3668 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3671 printf (_(" [Nr] Name Type Address Offset\n"));
3672 printf (_(" Size EntSize Flags Link Info Align\n"));
3675 for (i
= 0, section
= section_headers
;
3676 i
< elf_header
.e_shnum
;
3679 printf (" [%2u] %-17.17s %-15.15s ",
3680 SECTION_HEADER_NUM (i
),
3681 SECTION_NAME (section
),
3682 get_section_type_name (section
->sh_type
));
3686 print_vma (section
->sh_addr
, LONG_HEX
);
3688 printf ( " %6.6lx %6.6lx %2.2lx",
3689 (unsigned long) section
->sh_offset
,
3690 (unsigned long) section
->sh_size
,
3691 (unsigned long) section
->sh_entsize
);
3693 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3695 printf ("%2ld %3lu %2ld\n",
3696 (unsigned long) section
->sh_link
,
3697 (unsigned long) section
->sh_info
,
3698 (unsigned long) section
->sh_addralign
);
3702 print_vma (section
->sh_addr
, LONG_HEX
);
3704 if ((long) section
->sh_offset
== section
->sh_offset
)
3705 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
3709 print_vma (section
->sh_offset
, LONG_HEX
);
3712 if ((unsigned long) section
->sh_size
== section
->sh_size
)
3713 printf (" %6.6lx", (unsigned long) section
->sh_size
);
3717 print_vma (section
->sh_size
, LONG_HEX
);
3720 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
3721 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
3725 print_vma (section
->sh_entsize
, LONG_HEX
);
3728 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3730 printf ("%2ld %3lu ",
3731 (unsigned long) section
->sh_link
,
3732 (unsigned long) section
->sh_info
);
3734 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
3735 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
3738 print_vma (section
->sh_addralign
, DEC
);
3745 print_vma (section
->sh_addr
, LONG_HEX
);
3746 if ((long) section
->sh_offset
== section
->sh_offset
)
3747 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
3751 print_vma (section
->sh_offset
, LONG_HEX
);
3754 print_vma (section
->sh_size
, LONG_HEX
);
3756 print_vma (section
->sh_entsize
, LONG_HEX
);
3758 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3760 printf (" %2ld %3lu %ld\n",
3761 (unsigned long) section
->sh_link
,
3762 (unsigned long) section
->sh_info
,
3763 (unsigned long) section
->sh_addralign
);
3767 printf (_("Key to Flags:\n\
3768 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3769 I (info), L (link order), G (group), x (unknown)\n\
3770 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3776 get_group_flags (unsigned int flags
)
3778 static char buff
[32];
3785 sprintf (buff
, _("[<unknown>: 0x%x]"), flags
);
3792 process_section_groups (FILE *file
)
3794 Elf_Internal_Shdr
*section
;
3796 struct group
*group
;
3798 if (elf_header
.e_shnum
== 0)
3800 if (do_section_groups
)
3801 printf (_("\nThere are no section groups in this file.\n"));
3806 if (section_headers
== NULL
)
3808 error (_("Section headers are not available!\n"));
3812 section_headers_groups
= calloc (elf_header
.e_shnum
,
3813 sizeof (struct group
*));
3815 if (section_headers_groups
== NULL
)
3817 error (_("Out of memory\n"));
3821 /* Scan the sections for the group section. */
3822 for (i
= 0, section
= section_headers
;
3823 i
< elf_header
.e_shnum
;
3825 if (section
->sh_type
== SHT_GROUP
)
3828 section_groups
= calloc (group_count
, sizeof (struct group
));
3830 if (section_groups
== NULL
)
3832 error (_("Out of memory\n"));
3836 for (i
= 0, section
= section_headers
, group
= section_groups
;
3837 i
< elf_header
.e_shnum
;
3840 if (section
->sh_type
== SHT_GROUP
)
3842 char *name
= SECTION_NAME (section
);
3843 char *group_name
, *strtab
, *start
, *indices
;
3844 unsigned int entry
, j
, size
;
3845 Elf_Internal_Sym
*sym
;
3846 Elf_Internal_Shdr
*symtab_sec
, *strtab_sec
, *sec
;
3847 Elf_Internal_Sym
*symtab
;
3849 /* Get the symbol table. */
3850 symtab_sec
= SECTION_HEADER (section
->sh_link
);
3851 if (symtab_sec
->sh_type
!= SHT_SYMTAB
)
3853 error (_("Bad sh_link in group section `%s'\n"), name
);
3856 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
);
3858 sym
= symtab
+ section
->sh_info
;
3860 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
3862 bfd_vma sec_index
= SECTION_HEADER_INDEX (sym
->st_shndx
);
3865 error (_("Bad sh_info in group section `%s'\n"), name
);
3869 group_name
= SECTION_NAME (section_headers
+ sec_index
);
3874 /* Get the string table. */
3875 strtab_sec
= SECTION_HEADER (symtab_sec
->sh_link
);
3876 strtab
= get_data (NULL
, file
, strtab_sec
->sh_offset
,
3877 strtab_sec
->sh_size
,
3880 group_name
= strtab
+ sym
->st_name
;
3883 start
= get_data (NULL
, file
, section
->sh_offset
,
3884 section
->sh_size
, _("section data"));
3887 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
3888 entry
= byte_get (indices
, 4);
3891 if (do_section_groups
)
3893 printf ("\n%s group section `%s' [%s] contains %u sections:\n",
3894 get_group_flags (entry
), name
, group_name
, size
);
3896 printf (_(" [Index] Name\n"));
3899 group
->group_index
= i
;
3901 for (j
= 0; j
< size
; j
++)
3903 struct group_list
*g
;
3905 entry
= byte_get (indices
, 4);
3908 if (section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
3911 error (_("section [%5u] already in group section [%5u]\n"),
3912 entry
, section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
3916 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
3919 if (do_section_groups
)
3921 sec
= SECTION_HEADER (entry
);
3922 printf (" [%5u] %s\n",
3923 entry
, SECTION_NAME (sec
));
3926 g
= xmalloc (sizeof (struct group_list
));
3927 g
->section_index
= entry
;
3928 g
->next
= group
->root
;
3950 } dynamic_relocations
[] =
3952 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
3953 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
3954 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
3957 /* Process the reloc section. */
3959 process_relocs (FILE *file
)
3961 unsigned long rel_size
;
3962 unsigned long rel_offset
;
3968 if (do_using_dynamic
)
3972 int has_dynamic_reloc
;
3975 has_dynamic_reloc
= 0;
3977 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
3979 is_rela
= dynamic_relocations
[i
].rela
;
3980 name
= dynamic_relocations
[i
].name
;
3981 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
3982 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
3984 has_dynamic_reloc
|= rel_size
;
3986 if (is_rela
== UNKNOWN
)
3988 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
3989 switch (dynamic_info
[DT_PLTREL
])
4003 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4004 name
, rel_offset
, rel_size
);
4006 dump_relocations (file
,
4007 offset_from_vma (file
, rel_offset
, rel_size
),
4009 dynamic_symbols
, num_dynamic_syms
,
4010 dynamic_strings
, is_rela
);
4014 if (! has_dynamic_reloc
)
4015 printf (_("\nThere are no dynamic relocations in this file.\n"));
4019 Elf_Internal_Shdr
*section
;
4023 for (i
= 0, section
= section_headers
;
4024 i
< elf_header
.e_shnum
;
4027 if ( section
->sh_type
!= SHT_RELA
4028 && section
->sh_type
!= SHT_REL
)
4031 rel_offset
= section
->sh_offset
;
4032 rel_size
= section
->sh_size
;
4036 Elf_Internal_Shdr
*strsec
;
4037 Elf_Internal_Sym
*symtab
;
4040 unsigned long nsyms
;
4042 printf (_("\nRelocation section "));
4044 if (string_table
== NULL
)
4045 printf ("%d", section
->sh_name
);
4047 printf (_("'%s'"), SECTION_NAME (section
));
4049 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4050 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4055 if (section
->sh_link
)
4057 Elf_Internal_Shdr
*symsec
;
4059 symsec
= SECTION_HEADER (section
->sh_link
);
4060 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4061 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4066 strsec
= SECTION_HEADER (symsec
->sh_link
);
4068 strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4069 strsec
->sh_size
, _("string table"));
4071 is_rela
= section
->sh_type
== SHT_RELA
;
4073 dump_relocations (file
, rel_offset
, rel_size
,
4074 symtab
, nsyms
, strtab
, is_rela
);
4086 printf (_("\nThere are no relocations in this file.\n"));
4092 #include "unwind-ia64.h"
4094 /* An absolute address consists of a section and an offset. If the
4095 section is NULL, the offset itself is the address, otherwise, the
4096 address equals to LOAD_ADDRESS(section) + offset. */
4100 unsigned short section
;
4106 struct unw_table_entry
4108 struct absaddr start
;
4110 struct absaddr info
;
4112 *table
; /* Unwind table. */
4113 unsigned long table_len
; /* Length of unwind table. */
4114 unsigned char *info
; /* Unwind info. */
4115 unsigned long info_size
; /* Size of unwind info. */
4116 bfd_vma info_addr
; /* starting address of unwind info. */
4117 bfd_vma seg_base
; /* Starting address of segment. */
4118 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4119 unsigned long nsyms
; /* Number of symbols. */
4120 char *strtab
; /* The string table. */
4121 unsigned long strtab_size
; /* Size of string table. */
4125 find_symbol_for_address (struct unw_aux_info
*aux
,
4126 struct absaddr addr
,
4127 const char **symname
,
4130 bfd_vma dist
= 0x100000;
4131 Elf_Internal_Sym
*sym
, *best
= NULL
;
4134 for (i
= 0, sym
= aux
->symtab
; i
< aux
->nsyms
; ++i
, ++sym
)
4136 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
4137 && sym
->st_name
!= 0
4138 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
4139 && addr
.offset
>= sym
->st_value
4140 && addr
.offset
- sym
->st_value
< dist
)
4143 dist
= addr
.offset
- sym
->st_value
;
4150 *symname
= (best
->st_name
>= aux
->strtab_size
4151 ? "<corrupt>" : aux
->strtab
+ best
->st_name
);
4156 *offset
= addr
.offset
;
4160 dump_ia64_unwind (struct unw_aux_info
*aux
)
4163 struct unw_table_entry
*tp
;
4166 addr_size
= is_32bit_elf
? 4 : 8;
4168 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4172 const unsigned char *dp
;
4173 const unsigned char *head
;
4174 const char *procname
;
4176 find_symbol_for_address (aux
, tp
->start
, &procname
, &offset
);
4178 fputs ("\n<", stdout
);
4182 fputs (procname
, stdout
);
4185 printf ("+%lx", (unsigned long) offset
);
4188 fputs (">: [", stdout
);
4189 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4190 fputc ('-', stdout
);
4191 print_vma (tp
->end
.offset
, PREFIX_HEX
);
4192 printf ("], info at +0x%lx\n",
4193 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
4195 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
4196 stamp
= BYTE_GET8 ((unsigned char *) head
);
4198 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4199 (unsigned) UNW_VER (stamp
),
4200 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
4201 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
4202 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
4203 (unsigned long) (addr_size
* UNW_LENGTH (stamp
)));
4205 if (UNW_VER (stamp
) != 1)
4207 printf ("\tUnknown version.\n");
4212 for (dp
= head
+ 8; dp
< head
+ 8 + addr_size
* UNW_LENGTH (stamp
);)
4213 dp
= unw_decode (dp
, in_body
, & in_body
);
4218 slurp_ia64_unwind_table (FILE *file
,
4219 struct unw_aux_info
*aux
,
4220 Elf_Internal_Shdr
*sec
)
4222 unsigned long size
, addr_size
, nrelas
, i
;
4223 Elf_Internal_Phdr
*seg
;
4224 struct unw_table_entry
*tep
;
4225 Elf_Internal_Shdr
*relsec
;
4226 Elf_Internal_Rela
*rela
, *rp
;
4227 unsigned char *table
, *tp
;
4228 Elf_Internal_Sym
*sym
;
4229 const char *relname
;
4231 addr_size
= is_32bit_elf
? 4 : 8;
4233 /* First, find the starting address of the segment that includes
4236 if (elf_header
.e_phnum
)
4238 if (! get_program_headers (file
))
4241 for (seg
= program_headers
;
4242 seg
< program_headers
+ elf_header
.e_phnum
;
4245 if (seg
->p_type
!= PT_LOAD
)
4248 if (sec
->sh_addr
>= seg
->p_vaddr
4249 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
4251 aux
->seg_base
= seg
->p_vaddr
;
4257 /* Second, build the unwind table from the contents of the unwind section: */
4258 size
= sec
->sh_size
;
4259 table
= get_data (NULL
, file
, sec
->sh_offset
, size
, _("unwind table"));
4263 tep
= aux
->table
= xmalloc (size
/ (3 * addr_size
) * sizeof (aux
->table
[0]));
4264 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * addr_size
, ++tep
)
4266 tep
->start
.section
= SHN_UNDEF
;
4267 tep
->end
.section
= SHN_UNDEF
;
4268 tep
->info
.section
= SHN_UNDEF
;
4271 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
4272 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
4273 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
4277 tep
->start
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 0);
4278 tep
->end
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 8);
4279 tep
->info
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 16);
4281 tep
->start
.offset
+= aux
->seg_base
;
4282 tep
->end
.offset
+= aux
->seg_base
;
4283 tep
->info
.offset
+= aux
->seg_base
;
4287 /* Third, apply any relocations to the unwind table: */
4289 for (relsec
= section_headers
;
4290 relsec
< section_headers
+ elf_header
.e_shnum
;
4293 if (relsec
->sh_type
!= SHT_RELA
4294 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4297 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
4301 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
4305 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
4306 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
4308 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
4310 warn (_("Skipping unexpected symbol type %u\n"),
4311 ELF32_ST_TYPE (sym
->st_info
));
4317 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
4318 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
4320 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
4322 warn (_("Skipping unexpected symbol type %u\n"),
4323 ELF64_ST_TYPE (sym
->st_info
));
4328 if (strncmp (relname
, "R_IA64_SEGREL", 13) != 0)
4330 warn (_("Skipping unexpected relocation type %s\n"), relname
);
4334 i
= rp
->r_offset
/ (3 * addr_size
);
4336 switch (rp
->r_offset
/addr_size
% 3)
4339 aux
->table
[i
].start
.section
= sym
->st_shndx
;
4340 aux
->table
[i
].start
.offset
+= rp
->r_addend
;
4343 aux
->table
[i
].end
.section
= sym
->st_shndx
;
4344 aux
->table
[i
].end
.offset
+= rp
->r_addend
;
4347 aux
->table
[i
].info
.section
= sym
->st_shndx
;
4348 aux
->table
[i
].info
.offset
+= rp
->r_addend
;
4358 aux
->table_len
= size
/ (3 * addr_size
);
4363 process_unwind (FILE *file
)
4365 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
4366 unsigned long i
, addr_size
, unwcount
= 0, unwstart
= 0;
4367 struct unw_aux_info aux
;
4372 if (elf_header
.e_machine
!= EM_IA_64
)
4374 printf (_("\nThere are no unwind sections in this file.\n"));
4378 memset (& aux
, 0, sizeof (aux
));
4380 addr_size
= is_32bit_elf
? 4 : 8;
4382 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
4384 if (sec
->sh_type
== SHT_SYMTAB
)
4386 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
4387 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
4389 strsec
= SECTION_HEADER (sec
->sh_link
);
4390 aux
.strtab_size
= strsec
->sh_size
;
4391 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4392 aux
.strtab_size
, _("string table"));
4394 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4399 printf (_("\nThere are no unwind sections in this file.\n"));
4401 while (unwcount
-- > 0)
4406 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
4407 i
< elf_header
.e_shnum
; ++i
, ++sec
)
4408 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4415 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
4417 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
4419 /* We need to find which section group it is in. */
4420 struct group_list
*g
= section_headers_groups
[i
]->root
;
4422 for (; g
!= NULL
; g
= g
->next
)
4424 sec
= SECTION_HEADER (g
->section_index
);
4425 if (strcmp (SECTION_NAME (sec
),
4426 ELF_STRING_ia64_unwind_info
) == 0)
4431 i
= elf_header
.e_shnum
;
4433 else if (strncmp (SECTION_NAME (unwsec
),
4434 ELF_STRING_ia64_unwind_once
, len
) == 0)
4436 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
4437 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
4438 suffix
= SECTION_NAME (unwsec
) + len
;
4439 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4441 if (strncmp (SECTION_NAME (sec
),
4442 ELF_STRING_ia64_unwind_info_once
, len2
) == 0
4443 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
4448 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4449 .IA_64.unwind or BAR -> .IA_64.unwind_info */
4450 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
4451 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
4453 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
,
4455 suffix
= SECTION_NAME (unwsec
) + len
;
4456 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4458 if (strncmp (SECTION_NAME (sec
),
4459 ELF_STRING_ia64_unwind_info
, len2
) == 0
4460 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
4464 if (i
== elf_header
.e_shnum
)
4466 printf (_("\nCould not find unwind info section for "));
4468 if (string_table
== NULL
)
4469 printf ("%d", unwsec
->sh_name
);
4471 printf (_("'%s'"), SECTION_NAME (unwsec
));
4475 aux
.info_size
= sec
->sh_size
;
4476 aux
.info_addr
= sec
->sh_addr
;
4477 aux
.info
= get_data (NULL
, file
, sec
->sh_offset
, aux
.info_size
,
4480 printf (_("\nUnwind section "));
4482 if (string_table
== NULL
)
4483 printf ("%d", unwsec
->sh_name
);
4485 printf (_("'%s'"), SECTION_NAME (unwsec
));
4487 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4488 (unsigned long) unwsec
->sh_offset
,
4489 (unsigned long) (unwsec
->sh_size
/ (3 * addr_size
)));
4491 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
4493 if (aux
.table_len
> 0)
4494 dump_ia64_unwind (& aux
);
4497 free ((char *) aux
.table
);
4499 free ((char *) aux
.info
);
4508 free ((char *) aux
.strtab
);
4514 dynamic_section_mips_val (Elf_Internal_Dyn
*entry
)
4516 switch (entry
->d_tag
)
4519 if (entry
->d_un
.d_val
== 0)
4523 static const char * opts
[] =
4525 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
4526 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
4527 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
4528 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
4533 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++cnt
)
4534 if (entry
->d_un
.d_val
& (1 << cnt
))
4536 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
4543 case DT_MIPS_IVERSION
:
4544 if (dynamic_strings
!= NULL
)
4545 printf ("Interface Version: %s\n",
4546 dynamic_strings
+ entry
->d_un
.d_val
);
4548 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4551 case DT_MIPS_TIME_STAMP
:
4556 time_t time
= entry
->d_un
.d_val
;
4557 tmp
= gmtime (&time
);
4558 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
4559 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
4560 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
4561 printf ("Time Stamp: %s\n", timebuf
);
4565 case DT_MIPS_RLD_VERSION
:
4566 case DT_MIPS_LOCAL_GOTNO
:
4567 case DT_MIPS_CONFLICTNO
:
4568 case DT_MIPS_LIBLISTNO
:
4569 case DT_MIPS_SYMTABNO
:
4570 case DT_MIPS_UNREFEXTNO
:
4571 case DT_MIPS_HIPAGENO
:
4572 case DT_MIPS_DELTA_CLASS_NO
:
4573 case DT_MIPS_DELTA_INSTANCE_NO
:
4574 case DT_MIPS_DELTA_RELOC_NO
:
4575 case DT_MIPS_DELTA_SYM_NO
:
4576 case DT_MIPS_DELTA_CLASSSYM_NO
:
4577 case DT_MIPS_COMPACT_SIZE
:
4578 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4582 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
4588 dynamic_section_parisc_val (Elf_Internal_Dyn
*entry
)
4590 switch (entry
->d_tag
)
4592 case DT_HP_DLD_FLAGS
:
4601 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
4602 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
4603 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
4604 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
4605 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
4606 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
4607 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
4608 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
4609 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
4610 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
4611 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
4615 bfd_vma val
= entry
->d_un
.d_val
;
4617 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
4618 if (val
& flags
[cnt
].bit
)
4622 fputs (flags
[cnt
].str
, stdout
);
4624 val
^= flags
[cnt
].bit
;
4627 if (val
!= 0 || first
)
4631 print_vma (val
, HEX
);
4637 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4644 dynamic_section_ia64_val (Elf_Internal_Dyn
*entry
)
4646 switch (entry
->d_tag
)
4648 case DT_IA_64_PLT_RESERVE
:
4649 /* First 3 slots reserved. */
4650 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4652 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
4656 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4663 get_32bit_dynamic_section (FILE *file
)
4665 Elf32_External_Dyn
*edyn
, *ext
;
4666 Elf_Internal_Dyn
*entry
;
4668 edyn
= get_data (NULL
, file
, dynamic_addr
, dynamic_size
,
4669 _("dynamic section"));
4673 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
4674 might not have the luxury of section headers. Look for the DT_NULL
4675 terminator to determine the number of entries. */
4676 for (ext
= edyn
, dynamic_nent
= 0;
4677 (char *) ext
< (char *) edyn
+ dynamic_size
;
4681 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
4685 dynamic_section
= malloc (dynamic_nent
* sizeof (*entry
));
4686 if (dynamic_section
== NULL
)
4688 error (_("Out of memory\n"));
4693 for (ext
= edyn
, entry
= dynamic_section
;
4694 entry
< dynamic_section
+ dynamic_nent
;
4697 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
4698 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
4707 get_64bit_dynamic_section (FILE *file
)
4709 Elf64_External_Dyn
*edyn
, *ext
;
4710 Elf_Internal_Dyn
*entry
;
4712 edyn
= get_data (NULL
, file
, dynamic_addr
, dynamic_size
,
4713 _("dynamic section"));
4717 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
4718 might not have the luxury of section headers. Look for the DT_NULL
4719 terminator to determine the number of entries. */
4720 for (ext
= edyn
, dynamic_nent
= 0;
4721 (char *) ext
< (char *) edyn
+ dynamic_size
;
4725 if (BYTE_GET8 (ext
->d_tag
) == DT_NULL
)
4729 dynamic_section
= malloc (dynamic_nent
* sizeof (*entry
));
4730 if (dynamic_section
== NULL
)
4732 error (_("Out of memory\n"));
4737 for (ext
= edyn
, entry
= dynamic_section
;
4738 entry
< dynamic_section
+ dynamic_nent
;
4741 entry
->d_tag
= BYTE_GET8 (ext
->d_tag
);
4742 entry
->d_un
.d_val
= BYTE_GET8 (ext
->d_un
.d_val
);
4751 get_dynamic_flags (bfd_vma flags
)
4753 static char buff
[128];
4761 flag
= flags
& - flags
;
4769 case DF_ORIGIN
: strcpy (p
, "ORIGIN"); break;
4770 case DF_SYMBOLIC
: strcpy (p
, "SYMBOLIC"); break;
4771 case DF_TEXTREL
: strcpy (p
, "TEXTREL"); break;
4772 case DF_BIND_NOW
: strcpy (p
, "BIND_NOW"); break;
4773 case DF_STATIC_TLS
: strcpy (p
, "STATIC_TLS"); break;
4774 default: strcpy (p
, "unknown"); break;
4777 p
= strchr (p
, '\0');
4782 /* Parse and display the contents of the dynamic section. */
4785 process_dynamic_section (FILE *file
)
4787 Elf_Internal_Dyn
*entry
;
4789 if (dynamic_size
== 0)
4792 printf (_("\nThere is no dynamic section in this file.\n"));
4799 if (! get_32bit_dynamic_section (file
))
4802 else if (! get_64bit_dynamic_section (file
))
4805 /* Find the appropriate symbol table. */
4806 if (dynamic_symbols
== NULL
)
4808 for (entry
= dynamic_section
;
4809 entry
< dynamic_section
+ dynamic_nent
;
4812 Elf_Internal_Shdr section
;
4814 if (entry
->d_tag
!= DT_SYMTAB
)
4817 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
4819 /* Since we do not know how big the symbol table is,
4820 we default to reading in the entire file (!) and
4821 processing that. This is overkill, I know, but it
4823 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
4825 if (archive_file_offset
!= 0)
4826 section
.sh_size
= archive_file_size
- section
.sh_offset
;
4829 if (fseek (file
, 0, SEEK_END
))
4830 error (_("Unable to seek to end of file!"));
4832 section
.sh_size
= ftell (file
) - section
.sh_offset
;
4836 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
4838 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
4840 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
4841 if (num_dynamic_syms
< 1)
4843 error (_("Unable to determine the number of symbols to load\n"));
4847 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
4851 /* Similarly find a string table. */
4852 if (dynamic_strings
== NULL
)
4854 for (entry
= dynamic_section
;
4855 entry
< dynamic_section
+ dynamic_nent
;
4858 unsigned long offset
;
4861 if (entry
->d_tag
!= DT_STRTAB
)
4864 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
4866 /* Since we do not know how big the string table is,
4867 we default to reading in the entire file (!) and
4868 processing that. This is overkill, I know, but it
4871 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
4873 if (archive_file_offset
!= 0)
4874 str_tab_len
= archive_file_size
- offset
;
4877 if (fseek (file
, 0, SEEK_END
))
4878 error (_("Unable to seek to end of file\n"));
4879 str_tab_len
= ftell (file
) - offset
;
4882 if (str_tab_len
< 1)
4885 (_("Unable to determine the length of the dynamic string table\n"));
4889 dynamic_strings
= get_data (NULL
, file
, offset
, str_tab_len
,
4890 _("dynamic string table"));
4895 /* And find the syminfo section if available. */
4896 if (dynamic_syminfo
== NULL
)
4898 unsigned long syminsz
= 0;
4900 for (entry
= dynamic_section
;
4901 entry
< dynamic_section
+ dynamic_nent
;
4904 if (entry
->d_tag
== DT_SYMINENT
)
4906 /* Note: these braces are necessary to avoid a syntax
4907 error from the SunOS4 C compiler. */
4908 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
4910 else if (entry
->d_tag
== DT_SYMINSZ
)
4911 syminsz
= entry
->d_un
.d_val
;
4912 else if (entry
->d_tag
== DT_SYMINFO
)
4913 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
4917 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
4919 Elf_External_Syminfo
*extsyminfo
, *extsym
;
4920 Elf_Internal_Syminfo
*syminfo
;
4922 /* There is a syminfo section. Read the data. */
4923 extsyminfo
= get_data (NULL
, file
, dynamic_syminfo_offset
, syminsz
,
4924 _("symbol information"));
4928 dynamic_syminfo
= malloc (syminsz
);
4929 if (dynamic_syminfo
== NULL
)
4931 error (_("Out of memory\n"));
4935 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
4936 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
4937 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
4938 ++syminfo
, ++extsym
)
4940 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
4941 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
4948 if (do_dynamic
&& dynamic_addr
)
4949 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
4950 dynamic_addr
, dynamic_nent
);
4952 printf (_(" Tag Type Name/Value\n"));
4954 for (entry
= dynamic_section
;
4955 entry
< dynamic_section
+ dynamic_nent
;
4963 print_vma (entry
->d_tag
, FULL_HEX
);
4964 dtype
= get_dynamic_type (entry
->d_tag
);
4965 printf (" (%s)%*s", dtype
,
4966 ((is_32bit_elf
? 27 : 19)
4967 - (int) strlen (dtype
)),
4971 switch (entry
->d_tag
)
4975 puts (get_dynamic_flags (entry
->d_un
.d_val
));
4985 switch (entry
->d_tag
)
4988 printf (_("Auxiliary library"));
4992 printf (_("Filter library"));
4996 printf (_("Configuration file"));
5000 printf (_("Dependency audit library"));
5004 printf (_("Audit library"));
5008 if (dynamic_strings
)
5009 printf (": [%s]\n", dynamic_strings
+ entry
->d_un
.d_val
);
5013 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5022 printf (_("Flags:"));
5024 if (entry
->d_un
.d_val
== 0)
5025 printf (_(" None\n"));
5028 unsigned long int val
= entry
->d_un
.d_val
;
5030 if (val
& DTF_1_PARINIT
)
5032 printf (" PARINIT");
5033 val
^= DTF_1_PARINIT
;
5035 if (val
& DTF_1_CONFEXP
)
5037 printf (" CONFEXP");
5038 val
^= DTF_1_CONFEXP
;
5041 printf (" %lx", val
);
5050 printf (_("Flags:"));
5052 if (entry
->d_un
.d_val
== 0)
5053 printf (_(" None\n"));
5056 unsigned long int val
= entry
->d_un
.d_val
;
5058 if (val
& DF_P1_LAZYLOAD
)
5060 printf (" LAZYLOAD");
5061 val
^= DF_P1_LAZYLOAD
;
5063 if (val
& DF_P1_GROUPPERM
)
5065 printf (" GROUPPERM");
5066 val
^= DF_P1_GROUPPERM
;
5069 printf (" %lx", val
);
5078 printf (_("Flags:"));
5079 if (entry
->d_un
.d_val
== 0)
5080 printf (_(" None\n"));
5083 unsigned long int val
= entry
->d_un
.d_val
;
5090 if (val
& DF_1_GLOBAL
)
5095 if (val
& DF_1_GROUP
)
5100 if (val
& DF_1_NODELETE
)
5102 printf (" NODELETE");
5103 val
^= DF_1_NODELETE
;
5105 if (val
& DF_1_LOADFLTR
)
5107 printf (" LOADFLTR");
5108 val
^= DF_1_LOADFLTR
;
5110 if (val
& DF_1_INITFIRST
)
5112 printf (" INITFIRST");
5113 val
^= DF_1_INITFIRST
;
5115 if (val
& DF_1_NOOPEN
)
5120 if (val
& DF_1_ORIGIN
)
5125 if (val
& DF_1_DIRECT
)
5130 if (val
& DF_1_TRANS
)
5135 if (val
& DF_1_INTERPOSE
)
5137 printf (" INTERPOSE");
5138 val
^= DF_1_INTERPOSE
;
5140 if (val
& DF_1_NODEFLIB
)
5142 printf (" NODEFLIB");
5143 val
^= DF_1_NODEFLIB
;
5145 if (val
& DF_1_NODUMP
)
5150 if (val
& DF_1_CONLFAT
)
5152 printf (" CONLFAT");
5153 val
^= DF_1_CONLFAT
;
5156 printf (" %lx", val
);
5163 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5165 puts (get_dynamic_type (entry
->d_un
.d_val
));
5185 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5191 if (dynamic_strings
== NULL
)
5194 name
= dynamic_strings
+ entry
->d_un
.d_val
;
5198 switch (entry
->d_tag
)
5201 printf (_("Shared library: [%s]"), name
);
5203 if (strcmp (name
, program_interpreter
) == 0)
5204 printf (_(" program interpreter"));
5208 printf (_("Library soname: [%s]"), name
);
5212 printf (_("Library rpath: [%s]"), name
);
5216 printf (_("Library runpath: [%s]"), name
);
5220 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5225 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5238 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5242 case DT_INIT_ARRAYSZ
:
5243 case DT_FINI_ARRAYSZ
:
5244 case DT_GNU_CONFLICTSZ
:
5245 case DT_GNU_LIBLISTSZ
:
5248 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
5249 printf (" (bytes)\n");
5259 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
5272 if (dynamic_strings
!= NULL
&& entry
->d_tag
== DT_USED
)
5276 name
= dynamic_strings
+ entry
->d_un
.d_val
;
5280 printf (_("Not needed object: [%s]\n"), name
);
5285 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5291 /* The value of this entry is ignored. */
5296 case DT_GNU_PRELINKED
:
5300 time_t time
= entry
->d_un
.d_val
;
5302 tmp
= gmtime (&time
);
5303 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
5304 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5305 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5311 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
5312 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
5317 switch (elf_header
.e_machine
)
5320 case EM_MIPS_RS3_LE
:
5321 dynamic_section_mips_val (entry
);
5324 dynamic_section_parisc_val (entry
);
5327 dynamic_section_ia64_val (entry
);
5330 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5342 get_ver_flags (unsigned int flags
)
5344 static char buff
[32];
5351 if (flags
& VER_FLG_BASE
)
5352 strcat (buff
, "BASE ");
5354 if (flags
& VER_FLG_WEAK
)
5356 if (flags
& VER_FLG_BASE
)
5357 strcat (buff
, "| ");
5359 strcat (buff
, "WEAK ");
5362 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
5363 strcat (buff
, "| <unknown>");
5368 /* Display the contents of the version sections. */
5370 process_version_sections (FILE *file
)
5372 Elf_Internal_Shdr
*section
;
5379 for (i
= 0, section
= section_headers
;
5380 i
< elf_header
.e_shnum
;
5383 switch (section
->sh_type
)
5385 case SHT_GNU_verdef
:
5387 Elf_External_Verdef
*edefs
;
5394 (_("\nVersion definition section '%s' contains %ld entries:\n"),
5395 SECTION_NAME (section
), section
->sh_info
);
5397 printf (_(" Addr: 0x"));
5398 printf_vma (section
->sh_addr
);
5399 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5400 (unsigned long) section
->sh_offset
, section
->sh_link
,
5401 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5403 edefs
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
5404 _("version definition section"));
5408 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5411 Elf_External_Verdef
*edef
;
5412 Elf_Internal_Verdef ent
;
5413 Elf_External_Verdaux
*eaux
;
5414 Elf_Internal_Verdaux aux
;
5418 vstart
= ((char *) edefs
) + idx
;
5420 edef
= (Elf_External_Verdef
*) vstart
;
5422 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
5423 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
5424 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
5425 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
5426 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
5427 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
5428 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
5430 printf (_(" %#06x: Rev: %d Flags: %s"),
5431 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
5433 printf (_(" Index: %d Cnt: %d "),
5434 ent
.vd_ndx
, ent
.vd_cnt
);
5436 vstart
+= ent
.vd_aux
;
5438 eaux
= (Elf_External_Verdaux
*) vstart
;
5440 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5441 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
5443 if (dynamic_strings
)
5444 printf (_("Name: %s\n"), dynamic_strings
+ aux
.vda_name
);
5446 printf (_("Name index: %ld\n"), aux
.vda_name
);
5448 isum
= idx
+ ent
.vd_aux
;
5450 for (j
= 1; j
< ent
.vd_cnt
; j
++)
5452 isum
+= aux
.vda_next
;
5453 vstart
+= aux
.vda_next
;
5455 eaux
= (Elf_External_Verdaux
*) vstart
;
5457 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5458 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
5460 if (dynamic_strings
)
5461 printf (_(" %#06x: Parent %d: %s\n"),
5462 isum
, j
, dynamic_strings
+ aux
.vda_name
);
5464 printf (_(" %#06x: Parent %d, name index: %ld\n"),
5465 isum
, j
, aux
.vda_name
);
5475 case SHT_GNU_verneed
:
5477 Elf_External_Verneed
*eneed
;
5483 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
5484 SECTION_NAME (section
), section
->sh_info
);
5486 printf (_(" Addr: 0x"));
5487 printf_vma (section
->sh_addr
);
5488 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
5489 (unsigned long) section
->sh_offset
, section
->sh_link
,
5490 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5492 eneed
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
5493 _("version need section"));
5497 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5499 Elf_External_Verneed
*entry
;
5500 Elf_Internal_Verneed ent
;
5505 vstart
= ((char *) eneed
) + idx
;
5507 entry
= (Elf_External_Verneed
*) vstart
;
5509 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
5510 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
5511 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
5512 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
5513 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
5515 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
5517 if (dynamic_strings
)
5518 printf (_(" File: %s"), dynamic_strings
+ ent
.vn_file
);
5520 printf (_(" File: %lx"), ent
.vn_file
);
5522 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
5524 vstart
+= ent
.vn_aux
;
5526 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
5528 Elf_External_Vernaux
*eaux
;
5529 Elf_Internal_Vernaux aux
;
5531 eaux
= (Elf_External_Vernaux
*) vstart
;
5533 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
5534 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
5535 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
5536 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
5537 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
5539 if (dynamic_strings
)
5540 printf (_(" %#06x: Name: %s"),
5541 isum
, dynamic_strings
+ aux
.vna_name
);
5543 printf (_(" %#06x: Name index: %lx"),
5544 isum
, aux
.vna_name
);
5546 printf (_(" Flags: %s Version: %d\n"),
5547 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
5549 isum
+= aux
.vna_next
;
5550 vstart
+= aux
.vna_next
;
5560 case SHT_GNU_versym
:
5562 Elf_Internal_Shdr
*link_section
;
5565 unsigned char *edata
;
5566 unsigned short *data
;
5568 Elf_Internal_Sym
*symbols
;
5569 Elf_Internal_Shdr
*string_sec
;
5572 link_section
= SECTION_HEADER (section
->sh_link
);
5573 total
= section
->sh_size
/ section
->sh_entsize
;
5577 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
5579 string_sec
= SECTION_HEADER (link_section
->sh_link
);
5581 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
5582 string_sec
->sh_size
, _("version string table"));
5586 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
5587 SECTION_NAME (section
), total
);
5589 printf (_(" Addr: "));
5590 printf_vma (section
->sh_addr
);
5591 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5592 (unsigned long) section
->sh_offset
, section
->sh_link
,
5593 SECTION_NAME (link_section
));
5595 off
= offset_from_vma (file
,
5596 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
5597 total
* sizeof (short));
5598 edata
= get_data (NULL
, file
, off
, total
* sizeof (short),
5599 _("version symbol data"));
5606 data
= malloc (total
* sizeof (short));
5608 for (cnt
= total
; cnt
--;)
5609 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
5614 for (cnt
= 0; cnt
< total
; cnt
+= 4)
5617 int check_def
, check_need
;
5620 printf (" %03x:", cnt
);
5622 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
5623 switch (data
[cnt
+ j
])
5626 fputs (_(" 0 (*local*) "), stdout
);
5630 fputs (_(" 1 (*global*) "), stdout
);
5634 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
5635 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
5639 if (SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
5642 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
5649 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
5651 Elf_Internal_Verneed ivn
;
5652 unsigned long offset
;
5654 offset
= offset_from_vma
5655 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
5656 sizeof (Elf_External_Verneed
));
5660 Elf_Internal_Vernaux ivna
;
5661 Elf_External_Verneed evn
;
5662 Elf_External_Vernaux evna
;
5663 unsigned long a_off
;
5665 get_data (&evn
, file
, offset
, sizeof (evn
),
5668 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5669 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5671 a_off
= offset
+ ivn
.vn_aux
;
5675 get_data (&evna
, file
, a_off
, sizeof (evna
),
5676 _("version need aux (2)"));
5678 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5679 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5681 a_off
+= ivna
.vna_next
;
5683 while (ivna
.vna_other
!= data
[cnt
+ j
]
5684 && ivna
.vna_next
!= 0);
5686 if (ivna
.vna_other
== data
[cnt
+ j
])
5688 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5690 name
= strtab
+ ivna
.vna_name
;
5691 nn
+= printf ("(%s%-*s",
5693 12 - (int) strlen (name
),
5699 offset
+= ivn
.vn_next
;
5701 while (ivn
.vn_next
);
5704 if (check_def
&& data
[cnt
+ j
] != 0x8001
5705 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5707 Elf_Internal_Verdef ivd
;
5708 Elf_External_Verdef evd
;
5709 unsigned long offset
;
5711 offset
= offset_from_vma
5712 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
5717 get_data (&evd
, file
, offset
, sizeof (evd
),
5720 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5721 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5723 offset
+= ivd
.vd_next
;
5725 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
5726 && ivd
.vd_next
!= 0);
5728 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
5730 Elf_External_Verdaux evda
;
5731 Elf_Internal_Verdaux ivda
;
5733 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5735 get_data (&evda
, file
,
5736 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
5737 sizeof (evda
), _("version def aux"));
5739 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5741 name
= strtab
+ ivda
.vda_name
;
5742 nn
+= printf ("(%s%-*s",
5744 12 - (int) strlen (name
),
5750 printf ("%*c", 18 - nn
, ' ');
5768 printf (_("\nNo version information found in this file.\n"));
5774 get_symbol_binding (unsigned int binding
)
5776 static char buff
[32];
5780 case STB_LOCAL
: return "LOCAL";
5781 case STB_GLOBAL
: return "GLOBAL";
5782 case STB_WEAK
: return "WEAK";
5784 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
5785 sprintf (buff
, _("<processor specific>: %d"), binding
);
5786 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
5787 sprintf (buff
, _("<OS specific>: %d"), binding
);
5789 sprintf (buff
, _("<unknown>: %d"), binding
);
5795 get_symbol_type (unsigned int type
)
5797 static char buff
[32];
5801 case STT_NOTYPE
: return "NOTYPE";
5802 case STT_OBJECT
: return "OBJECT";
5803 case STT_FUNC
: return "FUNC";
5804 case STT_SECTION
: return "SECTION";
5805 case STT_FILE
: return "FILE";
5806 case STT_COMMON
: return "COMMON";
5807 case STT_TLS
: return "TLS";
5809 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
5811 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
5812 return "THUMB_FUNC";
5814 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
5817 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
5818 return "PARISC_MILLI";
5820 sprintf (buff
, _("<processor specific>: %d"), type
);
5822 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
5824 if (elf_header
.e_machine
== EM_PARISC
)
5826 if (type
== STT_HP_OPAQUE
)
5828 if (type
== STT_HP_STUB
)
5832 sprintf (buff
, _("<OS specific>: %d"), type
);
5835 sprintf (buff
, _("<unknown>: %d"), type
);
5841 get_symbol_visibility (unsigned int visibility
)
5845 case STV_DEFAULT
: return "DEFAULT";
5846 case STV_INTERNAL
: return "INTERNAL";
5847 case STV_HIDDEN
: return "HIDDEN";
5848 case STV_PROTECTED
: return "PROTECTED";
5854 get_symbol_index_type (unsigned int type
)
5856 static char buff
[32];
5860 case SHN_UNDEF
: return "UND";
5861 case SHN_ABS
: return "ABS";
5862 case SHN_COMMON
: return "COM";
5864 if (type
== SHN_IA_64_ANSI_COMMON
5865 && elf_header
.e_machine
== EM_IA_64
5866 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
5868 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
5869 sprintf (buff
, "PRC[0x%04x]", type
);
5870 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
5871 sprintf (buff
, "OS [0x%04x]", type
);
5872 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
5873 sprintf (buff
, "RSV[0x%04x]", type
);
5875 sprintf (buff
, "%3d", type
);
5883 get_dynamic_data (FILE *file
, unsigned int number
)
5885 unsigned char *e_data
;
5888 e_data
= malloc (number
* 4);
5892 error (_("Out of memory\n"));
5896 if (fread (e_data
, 4, number
, file
) != number
)
5898 error (_("Unable to read in dynamic data\n"));
5902 i_data
= malloc (number
* sizeof (*i_data
));
5906 error (_("Out of memory\n"));
5912 i_data
[number
] = byte_get (e_data
+ number
* 4, 4);
5919 /* Dump the symbol table. */
5921 process_symbol_table (FILE *file
)
5923 Elf_Internal_Shdr
*section
;
5924 unsigned char nb
[4];
5925 unsigned char nc
[4];
5928 int *buckets
= NULL
;
5931 if (! do_syms
&& !do_histogram
)
5934 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
5938 (archive_file_offset
5939 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
5940 sizeof nb
+ sizeof nc
)),
5943 error (_("Unable to seek to start of dynamic information"));
5947 if (fread (nb
, sizeof (nb
), 1, file
) != 1)
5949 error (_("Failed to read in number of buckets\n"));
5953 if (fread (nc
, sizeof (nc
), 1, file
) != 1)
5955 error (_("Failed to read in number of chains\n"));
5959 nbuckets
= byte_get (nb
, 4);
5960 nchains
= byte_get (nc
, 4);
5962 buckets
= get_dynamic_data (file
, nbuckets
);
5963 chains
= get_dynamic_data (file
, nchains
);
5965 if (buckets
== NULL
|| chains
== NULL
)
5970 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
5975 printf (_("\nSymbol table for image:\n"));
5977 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5979 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5981 for (hn
= 0; hn
< nbuckets
; hn
++)
5986 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
5988 Elf_Internal_Sym
*psym
;
5990 psym
= dynamic_symbols
+ si
;
5992 printf (" %3d %3d: ", si
, hn
);
5993 print_vma (psym
->st_value
, LONG_HEX
);
5995 print_vma (psym
->st_size
, DEC_5
);
5997 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5998 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5999 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6000 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
6001 print_symbol (25, dynamic_strings
+ psym
->st_name
);
6006 else if (do_syms
&& !do_using_dynamic
)
6010 for (i
= 0, section
= section_headers
;
6011 i
< elf_header
.e_shnum
;
6016 Elf_Internal_Sym
*symtab
;
6017 Elf_Internal_Sym
*psym
;
6020 if ( section
->sh_type
!= SHT_SYMTAB
6021 && section
->sh_type
!= SHT_DYNSYM
)
6024 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
6025 SECTION_NAME (section
),
6026 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
6028 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6030 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6032 symtab
= GET_ELF_SYMBOLS (file
, section
);
6036 if (section
->sh_link
== elf_header
.e_shstrndx
)
6037 strtab
= string_table
;
6040 Elf_Internal_Shdr
*string_sec
;
6042 string_sec
= SECTION_HEADER (section
->sh_link
);
6044 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
6045 string_sec
->sh_size
, _("string table"));
6048 for (si
= 0, psym
= symtab
;
6049 si
< section
->sh_size
/ section
->sh_entsize
;
6052 printf ("%6d: ", si
);
6053 print_vma (psym
->st_value
, LONG_HEX
);
6055 print_vma (psym
->st_size
, DEC_5
);
6056 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6057 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
6058 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6059 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
6060 print_symbol (25, strtab
+ psym
->st_name
);
6062 if (section
->sh_type
== SHT_DYNSYM
&&
6063 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
6065 unsigned char data
[2];
6066 unsigned short vers_data
;
6067 unsigned long offset
;
6071 offset
= offset_from_vma
6072 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6073 sizeof data
+ si
* sizeof (vers_data
));
6075 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
6076 sizeof (data
), _("version data"));
6078 vers_data
= byte_get (data
, 2);
6080 is_nobits
= (SECTION_HEADER (psym
->st_shndx
)->sh_type
6083 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
6085 if ((vers_data
& 0x8000) || vers_data
> 1)
6087 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
6088 && (is_nobits
|| ! check_def
))
6090 Elf_External_Verneed evn
;
6091 Elf_Internal_Verneed ivn
;
6092 Elf_Internal_Vernaux ivna
;
6094 /* We must test both. */
6095 offset
= offset_from_vma
6096 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6101 unsigned long vna_off
;
6103 get_data (&evn
, file
, offset
, sizeof (evn
),
6106 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6107 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6109 vna_off
= offset
+ ivn
.vn_aux
;
6113 Elf_External_Vernaux evna
;
6115 get_data (&evna
, file
, vna_off
,
6117 _("version need aux (3)"));
6119 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6120 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6121 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6123 vna_off
+= ivna
.vna_next
;
6125 while (ivna
.vna_other
!= vers_data
6126 && ivna
.vna_next
!= 0);
6128 if (ivna
.vna_other
== vers_data
)
6131 offset
+= ivn
.vn_next
;
6133 while (ivn
.vn_next
!= 0);
6135 if (ivna
.vna_other
== vers_data
)
6138 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
6141 else if (! is_nobits
)
6142 error (_("bad dynamic symbol"));
6149 if (vers_data
!= 0x8001
6150 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6152 Elf_Internal_Verdef ivd
;
6153 Elf_Internal_Verdaux ivda
;
6154 Elf_External_Verdaux evda
;
6155 unsigned long offset
;
6157 offset
= offset_from_vma
6159 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6160 sizeof (Elf_External_Verdef
));
6164 Elf_External_Verdef evd
;
6166 get_data (&evd
, file
, offset
, sizeof (evd
),
6169 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6170 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6171 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6173 offset
+= ivd
.vd_next
;
6175 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
6176 && ivd
.vd_next
!= 0);
6178 offset
-= ivd
.vd_next
;
6179 offset
+= ivd
.vd_aux
;
6181 get_data (&evda
, file
, offset
, sizeof (evda
),
6182 _("version def aux"));
6184 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6186 if (psym
->st_name
!= ivda
.vda_name
)
6187 printf ((vers_data
& 0x8000)
6189 strtab
+ ivda
.vda_name
);
6199 if (strtab
!= string_table
)
6205 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
6207 if (do_histogram
&& buckets
!= NULL
)
6214 int nzero_counts
= 0;
6217 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
6219 printf (_(" Length Number %% of total Coverage\n"));
6221 lengths
= calloc (nbuckets
, sizeof (int));
6222 if (lengths
== NULL
)
6224 error (_("Out of memory"));
6227 for (hn
= 0; hn
< nbuckets
; ++hn
)
6232 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
6235 if (maxlength
< ++lengths
[hn
])
6240 counts
= calloc (maxlength
+ 1, sizeof (int));
6243 error (_("Out of memory"));
6247 for (hn
= 0; hn
< nbuckets
; ++hn
)
6248 ++counts
[lengths
[hn
]];
6252 printf (" 0 %-10d (%5.1f%%)\n",
6253 counts
[0], (counts
[0] * 100.0) / nbuckets
);
6254 for (si
= 1; si
<= maxlength
; ++si
)
6256 nzero_counts
+= counts
[si
] * si
;
6257 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
6258 si
, counts
[si
], (counts
[si
] * 100.0) / nbuckets
,
6259 (nzero_counts
* 100.0) / nsyms
);
6267 if (buckets
!= NULL
)
6277 process_syminfo (FILE *file ATTRIBUTE_UNUSED
)
6281 if (dynamic_syminfo
== NULL
6283 /* No syminfo, this is ok. */
6286 /* There better should be a dynamic symbol section. */
6287 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
6291 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
6292 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
6294 printf (_(" Num: Name BoundTo Flags\n"));
6295 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
6297 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
6299 printf ("%4d: ", i
);
6300 print_symbol (30, dynamic_strings
+ dynamic_symbols
[i
].st_name
);
6303 switch (dynamic_syminfo
[i
].si_boundto
)
6305 case SYMINFO_BT_SELF
:
6306 fputs ("SELF ", stdout
);
6308 case SYMINFO_BT_PARENT
:
6309 fputs ("PARENT ", stdout
);
6312 if (dynamic_syminfo
[i
].si_boundto
> 0
6313 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
)
6318 [dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
6322 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
6326 if (flags
& SYMINFO_FLG_DIRECT
)
6328 if (flags
& SYMINFO_FLG_PASSTHRU
)
6329 printf (" PASSTHRU");
6330 if (flags
& SYMINFO_FLG_COPY
)
6332 if (flags
& SYMINFO_FLG_LAZYLOAD
)
6333 printf (" LAZYLOAD");
6341 #ifdef SUPPORT_DISASSEMBLY
6343 disassemble_section (Elf_Internal_Shdr
*section
, FILE *file
)
6345 printf (_("\nAssembly dump of section %s\n"),
6346 SECTION_NAME (section
));
6348 /* XXX -- to be done --- XXX */
6355 dump_section (Elf_Internal_Shdr
*section
, FILE *file
)
6357 bfd_size_type bytes
;
6359 unsigned char *data
;
6360 unsigned char *start
;
6362 bytes
= section
->sh_size
;
6364 if (bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
6366 printf (_("\nSection '%s' has no data to dump.\n"),
6367 SECTION_NAME (section
));
6371 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
6373 addr
= section
->sh_addr
;
6375 start
= get_data (NULL
, file
, section
->sh_offset
, bytes
, _("section data"));
6387 lbytes
= (bytes
> 16 ? 16 : bytes
);
6389 printf (" 0x%8.8lx ", (unsigned long) addr
);
6391 switch (elf_header
.e_ident
[EI_DATA
])
6395 for (j
= 15; j
>= 0; j
--)
6398 printf ("%2.2x", data
[j
]);
6408 for (j
= 0; j
< 16; j
++)
6411 printf ("%2.2x", data
[j
]);
6421 for (j
= 0; j
< lbytes
; j
++)
6424 if (k
>= ' ' && k
< 0x7f)
6443 static unsigned long int
6444 read_leb128 (unsigned char *data
, int *length_return
, int sign
)
6446 unsigned long int result
= 0;
6447 unsigned int num_read
= 0;
6456 result
|= (byte
& 0x7f) << shift
;
6461 while (byte
& 0x80);
6463 if (length_return
!= NULL
)
6464 *length_return
= num_read
;
6466 if (sign
&& (shift
< 32) && (byte
& 0x40))
6467 result
|= -1 << shift
;
6472 typedef struct State_Machine_Registers
6474 unsigned long address
;
6477 unsigned int column
;
6481 /* This variable hold the number of the last entry seen
6482 in the File Table. */
6483 unsigned int last_file_entry
;
6486 static SMR state_machine_regs
;
6489 reset_state_machine (int is_stmt
)
6491 state_machine_regs
.address
= 0;
6492 state_machine_regs
.file
= 1;
6493 state_machine_regs
.line
= 1;
6494 state_machine_regs
.column
= 0;
6495 state_machine_regs
.is_stmt
= is_stmt
;
6496 state_machine_regs
.basic_block
= 0;
6497 state_machine_regs
.end_sequence
= 0;
6498 state_machine_regs
.last_file_entry
= 0;
6501 /* Handled an extend line op. Returns true if this is the end
6504 process_extended_line_op (unsigned char *data
, int is_stmt
, int pointer_size
)
6506 unsigned char op_code
;
6509 unsigned char *name
;
6512 len
= read_leb128 (data
, & bytes_read
, 0);
6517 warn (_("badly formed extended line op encountered!\n"));
6524 printf (_(" Extended opcode %d: "), op_code
);
6528 case DW_LNE_end_sequence
:
6529 printf (_("End of Sequence\n\n"));
6530 reset_state_machine (is_stmt
);
6533 case DW_LNE_set_address
:
6534 adr
= byte_get (data
, pointer_size
);
6535 printf (_("set Address to 0x%lx\n"), adr
);
6536 state_machine_regs
.address
= adr
;
6539 case DW_LNE_define_file
:
6540 printf (_(" define new File Table entry\n"));
6541 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6543 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
6545 data
+= strlen ((char *) data
) + 1;
6546 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6548 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6550 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6551 printf (_("%s\n\n"), name
);
6555 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
6562 /* Finds section NAME inside FILE and returns a
6563 pointer to it, or NULL upon failure. */
6565 static Elf_Internal_Shdr
*
6566 find_section (const char * name
)
6568 Elf_Internal_Shdr
*sec
;
6571 for (i
= elf_header
.e_shnum
, sec
= section_headers
+ i
- 1;
6573 if (strcmp (SECTION_NAME (sec
), name
) == 0)
6576 if (i
&& sec
&& sec
->sh_size
!= 0)
6582 /* Size of pointers in the .debug_line section. This information is not
6583 really present in that section. It's obtained before dumping the debug
6584 sections by doing some pre-scan of the .debug_info section. */
6585 static unsigned int * debug_line_pointer_sizes
= NULL
;
6586 static unsigned int num_debug_line_pointer_sizes
= 0;
6588 /* Locate and scan the .debug_info section in the file and record the pointer
6589 sizes for the compilation units in it. Usually an executable will have
6590 just one pointer size, but this is not guaranteed, and so we try not to
6591 make any assumptions. Returns zero upon failure, or the number of
6592 compilation units upon success. */
6595 get_debug_line_pointer_sizes (FILE * file
)
6597 Elf_Internal_Shdr
* section
;
6598 unsigned char * start
;
6599 unsigned char * end
;
6600 unsigned char * begin
;
6601 unsigned long length
;
6602 unsigned int num_units
;
6605 section
= find_section (".debug_info");
6606 if (section
== NULL
)
6609 length
= section
->sh_size
;
6610 start
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
6611 _("extracting pointer sizes from .debug_info section"));
6615 end
= start
+ section
->sh_size
;
6616 /* First scan the section to get the number of comp units. */
6617 for (begin
= start
, num_units
= 0; begin
< end
; num_units
++)
6619 /* Read the first 4 bytes. For a 32-bit DWARF section, this will
6620 be the length. For a 64-bit DWARF section, it'll be the escape
6621 code 0xffffffff followed by an 8 byte length. */
6622 length
= byte_get (begin
, 4);
6624 if (length
== 0xffffffff)
6626 length
= byte_get (begin
+ 4, 8);
6627 begin
+= length
+ 12;
6630 begin
+= length
+ 4;
6635 error (_("No comp units in .debug_info section ?"));
6640 /* Then allocate an array to hold the pointer sizes. */
6641 debug_line_pointer_sizes
= malloc (num_units
* sizeof * debug_line_pointer_sizes
);
6642 if (debug_line_pointer_sizes
== NULL
)
6644 error (_("Not enough memory for a pointer size array of %u entries"),
6650 /* Populate the array. */
6651 for (begin
= start
, unit
= 0; begin
< end
; unit
++)
6653 length
= byte_get (begin
, 4);
6654 if (length
== 0xffffffff)
6656 /* For 64-bit DWARF, the 1-byte address_size field is 22 bytes
6657 from the start of the section. This is computed as follows:
6659 unit_length: 12 bytes
6661 debug_abbrev_offset: 8 bytes
6662 -----------------------------
6665 debug_line_pointer_sizes
[unit
] = byte_get (begin
+ 22, 1);
6666 length
= byte_get (begin
+ 4, 8);
6667 begin
+= length
+ 12;
6671 /* For 32-bit DWARF, the 1-byte address_size field is 10 bytes from
6672 the start of the section:
6674 unit_length: 4 bytes
6676 debug_abbrev_offset: 4 bytes
6677 -----------------------------
6680 debug_line_pointer_sizes
[unit
] = byte_get (begin
+ 10, 1);
6681 begin
+= length
+ 4;
6686 num_debug_line_pointer_sizes
= num_units
;
6691 display_debug_lines (Elf_Internal_Shdr
*section
,
6692 unsigned char *start
, FILE *file
)
6694 unsigned char *hdrptr
;
6695 DWARF2_Internal_LineInfo info
;
6696 unsigned char *standard_opcodes
;
6697 unsigned char *data
= start
;
6698 unsigned char *end
= start
+ section
->sh_size
;
6699 unsigned char *end_of_sequence
;
6702 int initial_length_size
;
6703 unsigned int comp_unit
= 0;
6705 printf (_("\nDump of debug contents of section %s:\n\n"),
6706 SECTION_NAME (section
));
6708 if (num_debug_line_pointer_sizes
== 0)
6709 get_debug_line_pointer_sizes (file
);
6713 unsigned int pointer_size
;
6717 /* Check the length of the block. */
6718 info
.li_length
= byte_get (hdrptr
, 4);
6721 if (info
.li_length
== 0xffffffff)
6723 /* This section is 64-bit DWARF 3. */
6724 info
.li_length
= byte_get (hdrptr
, 8);
6727 initial_length_size
= 12;
6732 initial_length_size
= 4;
6735 if (info
.li_length
+ initial_length_size
> section
->sh_size
)
6738 (_("The line info appears to be corrupt - the section is too small\n"));
6742 /* Check its version number. */
6743 info
.li_version
= byte_get (hdrptr
, 2);
6745 if (info
.li_version
!= 2 && info
.li_version
!= 3)
6747 warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
6751 info
.li_prologue_length
= byte_get (hdrptr
, offset_size
);
6752 hdrptr
+= offset_size
;
6753 info
.li_min_insn_length
= byte_get (hdrptr
, 1);
6755 info
.li_default_is_stmt
= byte_get (hdrptr
, 1);
6757 info
.li_line_base
= byte_get (hdrptr
, 1);
6759 info
.li_line_range
= byte_get (hdrptr
, 1);
6761 info
.li_opcode_base
= byte_get (hdrptr
, 1);
6764 /* Sign extend the line base field. */
6765 info
.li_line_base
<<= 24;
6766 info
.li_line_base
>>= 24;
6768 /* Get the pointer size from the comp unit associated
6769 with this block of line number information. */
6770 if (comp_unit
>= num_debug_line_pointer_sizes
)
6772 error (_("Not enough comp units for .debug_lines section\n"));
6777 pointer_size
= debug_line_pointer_sizes
[comp_unit
];
6781 printf (_(" Length: %ld\n"), info
.li_length
);
6782 printf (_(" DWARF Version: %d\n"), info
.li_version
);
6783 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
6784 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
6785 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
6786 printf (_(" Line Base: %d\n"), info
.li_line_base
);
6787 printf (_(" Line Range: %d\n"), info
.li_line_range
);
6788 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
6789 printf (_(" (Pointer size: %u)\n"), pointer_size
);
6791 end_of_sequence
= data
+ info
.li_length
+ initial_length_size
;
6793 reset_state_machine (info
.li_default_is_stmt
);
6795 /* Display the contents of the Opcodes table. */
6796 standard_opcodes
= hdrptr
;
6798 printf (_("\n Opcodes:\n"));
6800 for (i
= 1; i
< info
.li_opcode_base
; i
++)
6801 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
6803 /* Display the contents of the Directory table. */
6804 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
6807 printf (_("\n The Directory Table is empty.\n"));
6810 printf (_("\n The Directory Table:\n"));
6814 printf (_(" %s\n"), data
);
6816 data
+= strlen ((char *) data
) + 1;
6820 /* Skip the NUL at the end of the table. */
6823 /* Display the contents of the File Name table. */
6825 printf (_("\n The File Name Table is empty.\n"));
6828 printf (_("\n The File Name Table:\n"));
6829 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6833 unsigned char *name
;
6836 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
6839 data
+= strlen ((char *) data
) + 1;
6841 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6843 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6845 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6847 printf (_("%s\n"), name
);
6851 /* Skip the NUL at the end of the table. */
6854 /* Now display the statements. */
6855 printf (_("\n Line Number Statements:\n"));
6858 while (data
< end_of_sequence
)
6860 unsigned char op_code
;
6866 if (op_code
>= info
.li_opcode_base
)
6868 op_code
-= info
.li_opcode_base
;
6869 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
6870 state_machine_regs
.address
+= adv
;
6871 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6872 op_code
, adv
, state_machine_regs
.address
);
6873 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
6874 state_machine_regs
.line
+= adv
;
6875 printf (_(" and Line by %d to %d\n"),
6876 adv
, state_machine_regs
.line
);
6878 else switch (op_code
)
6880 case DW_LNS_extended_op
:
6881 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
6886 printf (_(" Copy\n"));
6889 case DW_LNS_advance_pc
:
6890 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
6892 state_machine_regs
.address
+= adv
;
6893 printf (_(" Advance PC by %d to %lx\n"), adv
,
6894 state_machine_regs
.address
);
6897 case DW_LNS_advance_line
:
6898 adv
= read_leb128 (data
, & bytes_read
, 1);
6900 state_machine_regs
.line
+= adv
;
6901 printf (_(" Advance Line by %d to %d\n"), adv
,
6902 state_machine_regs
.line
);
6905 case DW_LNS_set_file
:
6906 adv
= read_leb128 (data
, & bytes_read
, 0);
6908 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6910 state_machine_regs
.file
= adv
;
6913 case DW_LNS_set_column
:
6914 adv
= read_leb128 (data
, & bytes_read
, 0);
6916 printf (_(" Set column to %d\n"), adv
);
6917 state_machine_regs
.column
= adv
;
6920 case DW_LNS_negate_stmt
:
6921 adv
= state_machine_regs
.is_stmt
;
6923 printf (_(" Set is_stmt to %d\n"), adv
);
6924 state_machine_regs
.is_stmt
= adv
;
6927 case DW_LNS_set_basic_block
:
6928 printf (_(" Set basic block\n"));
6929 state_machine_regs
.basic_block
= 1;
6932 case DW_LNS_const_add_pc
:
6933 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
6934 * info
.li_min_insn_length
);
6935 state_machine_regs
.address
+= adv
;
6936 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
6937 state_machine_regs
.address
);
6940 case DW_LNS_fixed_advance_pc
:
6941 adv
= byte_get (data
, 2);
6943 state_machine_regs
.address
+= adv
;
6944 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6945 adv
, state_machine_regs
.address
);
6948 case DW_LNS_set_prologue_end
:
6949 printf (_(" Set prologue_end to true\n"));
6952 case DW_LNS_set_epilogue_begin
:
6953 printf (_(" Set epilogue_begin to true\n"));
6956 case DW_LNS_set_isa
:
6957 adv
= read_leb128 (data
, & bytes_read
, 0);
6959 printf (_(" Set ISA to %d\n"), adv
);
6963 printf (_(" Unknown opcode %d with operands: "), op_code
);
6966 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
6968 printf ("0x%lx%s", read_leb128 (data
, &bytes_read
, 0),
6969 i
== 1 ? "" : ", ");
6984 display_debug_pubnames (Elf_Internal_Shdr
*section
,
6985 unsigned char *start
,
6986 FILE *file ATTRIBUTE_UNUSED
)
6988 DWARF2_Internal_PubNames pubnames
;
6991 end
= start
+ section
->sh_size
;
6993 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6997 unsigned char *data
;
6998 unsigned long offset
;
6999 int offset_size
, initial_length_size
;
7003 pubnames
.pn_length
= byte_get (data
, 4);
7005 if (pubnames
.pn_length
== 0xffffffff)
7007 pubnames
.pn_length
= byte_get (data
, 8);
7010 initial_length_size
= 12;
7015 initial_length_size
= 4;
7018 pubnames
.pn_version
= byte_get (data
, 2);
7020 pubnames
.pn_offset
= byte_get (data
, offset_size
);
7021 data
+= offset_size
;
7022 pubnames
.pn_size
= byte_get (data
, offset_size
);
7023 data
+= offset_size
;
7025 start
+= pubnames
.pn_length
+ initial_length_size
;
7027 if (pubnames
.pn_version
!= 2 && pubnames
.pn_version
!= 3)
7029 static int warned
= 0;
7033 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
7040 printf (_(" Length: %ld\n"),
7041 pubnames
.pn_length
);
7042 printf (_(" Version: %d\n"),
7043 pubnames
.pn_version
);
7044 printf (_(" Offset into .debug_info section: %ld\n"),
7045 pubnames
.pn_offset
);
7046 printf (_(" Size of area in .debug_info section: %ld\n"),
7049 printf (_("\n Offset\tName\n"));
7053 offset
= byte_get (data
, offset_size
);
7057 data
+= offset_size
;
7058 printf (" %-6ld\t\t%s\n", offset
, data
);
7059 data
+= strlen ((char *) data
) + 1;
7062 while (offset
!= 0);
7070 get_TAG_name (unsigned long tag
)
7074 case DW_TAG_padding
: return "DW_TAG_padding";
7075 case DW_TAG_array_type
: return "DW_TAG_array_type";
7076 case DW_TAG_class_type
: return "DW_TAG_class_type";
7077 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
7078 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
7079 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
7080 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
7081 case DW_TAG_label
: return "DW_TAG_label";
7082 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
7083 case DW_TAG_member
: return "DW_TAG_member";
7084 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
7085 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
7086 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
7087 case DW_TAG_string_type
: return "DW_TAG_string_type";
7088 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
7089 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
7090 case DW_TAG_typedef
: return "DW_TAG_typedef";
7091 case DW_TAG_union_type
: return "DW_TAG_union_type";
7092 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
7093 case DW_TAG_variant
: return "DW_TAG_variant";
7094 case DW_TAG_common_block
: return "DW_TAG_common_block";
7095 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
7096 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
7097 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
7098 case DW_TAG_module
: return "DW_TAG_module";
7099 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
7100 case DW_TAG_set_type
: return "DW_TAG_set_type";
7101 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
7102 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
7103 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
7104 case DW_TAG_base_type
: return "DW_TAG_base_type";
7105 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
7106 case DW_TAG_const_type
: return "DW_TAG_const_type";
7107 case DW_TAG_constant
: return "DW_TAG_constant";
7108 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
7109 case DW_TAG_file_type
: return "DW_TAG_file_type";
7110 case DW_TAG_friend
: return "DW_TAG_friend";
7111 case DW_TAG_namelist
: return "DW_TAG_namelist";
7112 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
7113 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
7114 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
7115 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
7116 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
7117 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
7118 case DW_TAG_try_block
: return "DW_TAG_try_block";
7119 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
7120 case DW_TAG_variable
: return "DW_TAG_variable";
7121 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
7122 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
7123 case DW_TAG_format_label
: return "DW_TAG_format_label";
7124 case DW_TAG_function_template
: return "DW_TAG_function_template";
7125 case DW_TAG_class_template
: return "DW_TAG_class_template";
7126 /* DWARF 2.1 values. */
7127 case DW_TAG_dwarf_procedure
: return "DW_TAG_dwarf_procedure";
7128 case DW_TAG_restrict_type
: return "DW_TAG_restrict_type";
7129 case DW_TAG_interface_type
: return "DW_TAG_interface_type";
7130 case DW_TAG_namespace
: return "DW_TAG_namespace";
7131 case DW_TAG_imported_module
: return "DW_TAG_imported_module";
7132 case DW_TAG_unspecified_type
: return "DW_TAG_unspecified_type";
7133 case DW_TAG_partial_unit
: return "DW_TAG_partial_unit";
7134 case DW_TAG_imported_unit
: return "DW_TAG_imported_unit";
7136 case DW_TAG_upc_shared_type
: return "DW_TAG_upc_shared_type";
7137 case DW_TAG_upc_strict_type
: return "DW_TAG_upc_strict_type";
7138 case DW_TAG_upc_relaxed_type
: return "DW_TAG_upc_relaxed_type";
7141 static char buffer
[100];
7143 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
7150 get_AT_name (unsigned long attribute
)
7154 case DW_AT_sibling
: return "DW_AT_sibling";
7155 case DW_AT_location
: return "DW_AT_location";
7156 case DW_AT_name
: return "DW_AT_name";
7157 case DW_AT_ordering
: return "DW_AT_ordering";
7158 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
7159 case DW_AT_byte_size
: return "DW_AT_byte_size";
7160 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
7161 case DW_AT_bit_size
: return "DW_AT_bit_size";
7162 case DW_AT_element_list
: return "DW_AT_element_list";
7163 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
7164 case DW_AT_low_pc
: return "DW_AT_low_pc";
7165 case DW_AT_high_pc
: return "DW_AT_high_pc";
7166 case DW_AT_language
: return "DW_AT_language";
7167 case DW_AT_member
: return "DW_AT_member";
7168 case DW_AT_discr
: return "DW_AT_discr";
7169 case DW_AT_discr_value
: return "DW_AT_discr_value";
7170 case DW_AT_visibility
: return "DW_AT_visibility";
7171 case DW_AT_import
: return "DW_AT_import";
7172 case DW_AT_string_length
: return "DW_AT_string_length";
7173 case DW_AT_common_reference
: return "DW_AT_common_reference";
7174 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
7175 case DW_AT_const_value
: return "DW_AT_const_value";
7176 case DW_AT_containing_type
: return "DW_AT_containing_type";
7177 case DW_AT_default_value
: return "DW_AT_default_value";
7178 case DW_AT_inline
: return "DW_AT_inline";
7179 case DW_AT_is_optional
: return "DW_AT_is_optional";
7180 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
7181 case DW_AT_producer
: return "DW_AT_producer";
7182 case DW_AT_prototyped
: return "DW_AT_prototyped";
7183 case DW_AT_return_addr
: return "DW_AT_return_addr";
7184 case DW_AT_start_scope
: return "DW_AT_start_scope";
7185 case DW_AT_stride_size
: return "DW_AT_stride_size";
7186 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
7187 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
7188 case DW_AT_accessibility
: return "DW_AT_accessibility";
7189 case DW_AT_address_class
: return "DW_AT_address_class";
7190 case DW_AT_artificial
: return "DW_AT_artificial";
7191 case DW_AT_base_types
: return "DW_AT_base_types";
7192 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
7193 case DW_AT_count
: return "DW_AT_count";
7194 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
7195 case DW_AT_decl_column
: return "DW_AT_decl_column";
7196 case DW_AT_decl_file
: return "DW_AT_decl_file";
7197 case DW_AT_decl_line
: return "DW_AT_decl_line";
7198 case DW_AT_declaration
: return "DW_AT_declaration";
7199 case DW_AT_discr_list
: return "DW_AT_discr_list";
7200 case DW_AT_encoding
: return "DW_AT_encoding";
7201 case DW_AT_external
: return "DW_AT_external";
7202 case DW_AT_frame_base
: return "DW_AT_frame_base";
7203 case DW_AT_friend
: return "DW_AT_friend";
7204 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
7205 case DW_AT_macro_info
: return "DW_AT_macro_info";
7206 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
7207 case DW_AT_priority
: return "DW_AT_priority";
7208 case DW_AT_segment
: return "DW_AT_segment";
7209 case DW_AT_specification
: return "DW_AT_specification";
7210 case DW_AT_static_link
: return "DW_AT_static_link";
7211 case DW_AT_type
: return "DW_AT_type";
7212 case DW_AT_use_location
: return "DW_AT_use_location";
7213 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
7214 case DW_AT_virtuality
: return "DW_AT_virtuality";
7215 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
7216 /* DWARF 2.1 values. */
7217 case DW_AT_allocated
: return "DW_AT_allocated";
7218 case DW_AT_associated
: return "DW_AT_associated";
7219 case DW_AT_data_location
: return "DW_AT_data_location";
7220 case DW_AT_stride
: return "DW_AT_stride";
7221 case DW_AT_entry_pc
: return "DW_AT_entry_pc";
7222 case DW_AT_use_UTF8
: return "DW_AT_use_UTF8";
7223 case DW_AT_extension
: return "DW_AT_extension";
7224 case DW_AT_ranges
: return "DW_AT_ranges";
7225 case DW_AT_trampoline
: return "DW_AT_trampoline";
7226 case DW_AT_call_column
: return "DW_AT_call_column";
7227 case DW_AT_call_file
: return "DW_AT_call_file";
7228 case DW_AT_call_line
: return "DW_AT_call_line";
7229 /* SGI/MIPS extensions. */
7230 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
7231 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
7232 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
7233 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
7234 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
7235 case DW_AT_MIPS_software_pipeline_depth
:
7236 return "DW_AT_MIPS_software_pipeline_depth";
7237 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
7238 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
7239 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
7240 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
7241 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
7242 /* GNU extensions. */
7243 case DW_AT_sf_names
: return "DW_AT_sf_names";
7244 case DW_AT_src_info
: return "DW_AT_src_info";
7245 case DW_AT_mac_info
: return "DW_AT_mac_info";
7246 case DW_AT_src_coords
: return "DW_AT_src_coords";
7247 case DW_AT_body_begin
: return "DW_AT_body_begin";
7248 case DW_AT_body_end
: return "DW_AT_body_end";
7249 case DW_AT_GNU_vector
: return "DW_AT_GNU_vector";
7250 /* UPC extension. */
7251 case DW_AT_upc_threads_scaled
: return "DW_AT_upc_threads_scaled";
7254 static char buffer
[100];
7256 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
7263 get_FORM_name (unsigned long form
)
7267 case DW_FORM_addr
: return "DW_FORM_addr";
7268 case DW_FORM_block2
: return "DW_FORM_block2";
7269 case DW_FORM_block4
: return "DW_FORM_block4";
7270 case DW_FORM_data2
: return "DW_FORM_data2";
7271 case DW_FORM_data4
: return "DW_FORM_data4";
7272 case DW_FORM_data8
: return "DW_FORM_data8";
7273 case DW_FORM_string
: return "DW_FORM_string";
7274 case DW_FORM_block
: return "DW_FORM_block";
7275 case DW_FORM_block1
: return "DW_FORM_block1";
7276 case DW_FORM_data1
: return "DW_FORM_data1";
7277 case DW_FORM_flag
: return "DW_FORM_flag";
7278 case DW_FORM_sdata
: return "DW_FORM_sdata";
7279 case DW_FORM_strp
: return "DW_FORM_strp";
7280 case DW_FORM_udata
: return "DW_FORM_udata";
7281 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
7282 case DW_FORM_ref1
: return "DW_FORM_ref1";
7283 case DW_FORM_ref2
: return "DW_FORM_ref2";
7284 case DW_FORM_ref4
: return "DW_FORM_ref4";
7285 case DW_FORM_ref8
: return "DW_FORM_ref8";
7286 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
7287 case DW_FORM_indirect
: return "DW_FORM_indirect";
7290 static char buffer
[100];
7292 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
7298 /* FIXME: There are better and more efficient ways to handle
7299 these structures. For now though, I just want something that
7300 is simple to implement. */
7301 typedef struct abbrev_attr
7303 unsigned long attribute
;
7305 struct abbrev_attr
*next
;
7309 typedef struct abbrev_entry
7311 unsigned long entry
;
7314 struct abbrev_attr
*first_attr
;
7315 struct abbrev_attr
*last_attr
;
7316 struct abbrev_entry
*next
;
7320 static abbrev_entry
*first_abbrev
= NULL
;
7321 static abbrev_entry
*last_abbrev
= NULL
;
7326 abbrev_entry
*abbrev
;
7328 for (abbrev
= first_abbrev
; abbrev
;)
7330 abbrev_entry
*next
= abbrev
->next
;
7333 for (attr
= abbrev
->first_attr
; attr
;)
7335 abbrev_attr
*next
= attr
->next
;
7345 last_abbrev
= first_abbrev
= NULL
;
7349 add_abbrev (unsigned long number
, unsigned long tag
, int children
)
7351 abbrev_entry
*entry
;
7353 entry
= malloc (sizeof (*entry
));
7359 entry
->entry
= number
;
7361 entry
->children
= children
;
7362 entry
->first_attr
= NULL
;
7363 entry
->last_attr
= NULL
;
7366 if (first_abbrev
== NULL
)
7367 first_abbrev
= entry
;
7369 last_abbrev
->next
= entry
;
7371 last_abbrev
= entry
;
7375 add_abbrev_attr (unsigned long attribute
, unsigned long form
)
7379 attr
= malloc (sizeof (*attr
));
7385 attr
->attribute
= attribute
;
7389 if (last_abbrev
->first_attr
== NULL
)
7390 last_abbrev
->first_attr
= attr
;
7392 last_abbrev
->last_attr
->next
= attr
;
7394 last_abbrev
->last_attr
= attr
;
7397 /* Processes the (partial) contents of a .debug_abbrev section.
7398 Returns NULL if the end of the section was encountered.
7399 Returns the address after the last byte read if the end of
7400 an abbreviation set was found. */
7402 static unsigned char *
7403 process_abbrev_section (unsigned char *start
, unsigned char *end
)
7405 if (first_abbrev
!= NULL
)
7411 unsigned long entry
;
7413 unsigned long attribute
;
7416 entry
= read_leb128 (start
, & bytes_read
, 0);
7417 start
+= bytes_read
;
7419 /* A single zero is supposed to end the section according
7420 to the standard. If there's more, then signal that to
7423 return start
== end
? NULL
: start
;
7425 tag
= read_leb128 (start
, & bytes_read
, 0);
7426 start
+= bytes_read
;
7428 children
= *start
++;
7430 add_abbrev (entry
, tag
, children
);
7436 attribute
= read_leb128 (start
, & bytes_read
, 0);
7437 start
+= bytes_read
;
7439 form
= read_leb128 (start
, & bytes_read
, 0);
7440 start
+= bytes_read
;
7443 add_abbrev_attr (attribute
, form
);
7445 while (attribute
!= 0);
7453 display_debug_macinfo (Elf_Internal_Shdr
*section
,
7454 unsigned char *start
,
7455 FILE *file ATTRIBUTE_UNUSED
)
7457 unsigned char *end
= start
+ section
->sh_size
;
7458 unsigned char *curr
= start
;
7459 unsigned int bytes_read
;
7460 enum dwarf_macinfo_record_type op
;
7462 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7466 unsigned int lineno
;
7474 case DW_MACINFO_start_file
:
7476 unsigned int filenum
;
7478 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7480 filenum
= read_leb128 (curr
, & bytes_read
, 0);
7483 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno
, filenum
);
7487 case DW_MACINFO_end_file
:
7488 printf (_(" DW_MACINFO_end_file\n"));
7491 case DW_MACINFO_define
:
7492 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7495 curr
+= strlen (string
) + 1;
7496 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno
, string
);
7499 case DW_MACINFO_undef
:
7500 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7503 curr
+= strlen (string
) + 1;
7504 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno
, string
);
7507 case DW_MACINFO_vendor_ext
:
7509 unsigned int constant
;
7511 constant
= read_leb128 (curr
, & bytes_read
, 0);
7514 curr
+= strlen (string
) + 1;
7515 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant
, string
);
7526 display_debug_abbrev (Elf_Internal_Shdr
*section
,
7527 unsigned char *start
,
7528 FILE *file ATTRIBUTE_UNUSED
)
7530 abbrev_entry
*entry
;
7531 unsigned char *end
= start
+ section
->sh_size
;
7533 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7537 start
= process_abbrev_section (start
, end
);
7539 if (first_abbrev
== NULL
)
7542 printf (_(" Number TAG\n"));
7544 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
7548 printf (_(" %ld %s [%s]\n"),
7550 get_TAG_name (entry
->tag
),
7551 entry
->children
? _("has children") : _("no children"));
7553 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
7555 printf (_(" %-18s %s\n"),
7556 get_AT_name (attr
->attribute
),
7557 get_FORM_name (attr
->form
));
7571 static unsigned char *
7572 display_block (unsigned char *data
, unsigned long length
)
7574 printf (_(" %lu byte block: "), length
);
7577 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
7583 decode_location_expression (unsigned char * data
,
7584 unsigned int pointer_size
,
7585 unsigned long length
)
7589 unsigned long uvalue
;
7590 unsigned char *end
= data
+ length
;
7599 printf ("DW_OP_addr: %lx",
7600 (unsigned long) byte_get (data
, pointer_size
));
7601 data
+= pointer_size
;
7604 printf ("DW_OP_deref");
7607 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
7610 printf ("DW_OP_const1s: %ld", (long) byte_get (data
++, 1));
7613 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
7617 printf ("DW_OP_const2s: %ld", (long) byte_get (data
, 2));
7621 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
7625 printf ("DW_OP_const4s: %ld", (long) byte_get (data
, 4));
7629 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
7630 (unsigned long) byte_get (data
+ 4, 4));
7634 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
7635 (long) byte_get (data
+ 4, 4));
7639 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
7643 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
7647 printf ("DW_OP_dup");
7650 printf ("DW_OP_drop");
7653 printf ("DW_OP_over");
7656 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
7659 printf ("DW_OP_swap");
7662 printf ("DW_OP_rot");
7665 printf ("DW_OP_xderef");
7668 printf ("DW_OP_abs");
7671 printf ("DW_OP_and");
7674 printf ("DW_OP_div");
7677 printf ("DW_OP_minus");
7680 printf ("DW_OP_mod");
7683 printf ("DW_OP_mul");
7686 printf ("DW_OP_neg");
7689 printf ("DW_OP_not");
7692 printf ("DW_OP_or");
7695 printf ("DW_OP_plus");
7697 case DW_OP_plus_uconst
:
7698 printf ("DW_OP_plus_uconst: %lu",
7699 read_leb128 (data
, &bytes_read
, 0));
7703 printf ("DW_OP_shl");
7706 printf ("DW_OP_shr");
7709 printf ("DW_OP_shra");
7712 printf ("DW_OP_xor");
7715 printf ("DW_OP_bra: %ld", (long) byte_get (data
, 2));
7719 printf ("DW_OP_eq");
7722 printf ("DW_OP_ge");
7725 printf ("DW_OP_gt");
7728 printf ("DW_OP_le");
7731 printf ("DW_OP_lt");
7734 printf ("DW_OP_ne");
7737 printf ("DW_OP_skip: %ld", (long) byte_get (data
, 2));
7773 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
7808 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
7843 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
7844 read_leb128 (data
, &bytes_read
, 1));
7849 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
7853 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
7857 uvalue
= read_leb128 (data
, &bytes_read
, 0);
7859 printf ("DW_OP_bregx: %lu %ld", uvalue
,
7860 read_leb128 (data
, &bytes_read
, 1));
7864 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
7867 case DW_OP_deref_size
:
7868 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
7870 case DW_OP_xderef_size
:
7871 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
7874 printf ("DW_OP_nop");
7877 /* DWARF 3 extensions. */
7878 case DW_OP_push_object_address
:
7879 printf ("DW_OP_push_object_address");
7882 printf ("DW_OP_call2: <%lx>", (long) byte_get (data
, 2));
7886 printf ("DW_OP_call4: <%lx>", (long) byte_get (data
, 4));
7889 case DW_OP_call_ref
:
7890 printf ("DW_OP_call_ref");
7893 /* GNU extensions. */
7894 case DW_OP_GNU_push_tls_address
:
7895 printf ("DW_OP_GNU_push_tls_address");
7899 if (op
>= DW_OP_lo_user
7900 && op
<= DW_OP_hi_user
)
7901 printf (_("(User defined location op)"));
7903 printf (_("(Unknown location op)"));
7904 /* No way to tell where the next op is, so just bail. */
7908 /* Separate the ops. */
7914 static const char *debug_loc_contents
;
7915 static bfd_vma debug_loc_size
;
7918 load_debug_loc (FILE *file
)
7920 Elf_Internal_Shdr
*sec
;
7922 /* If it is already loaded, do nothing. */
7923 if (debug_loc_contents
!= NULL
)
7926 /* Locate the .debug_loc section. */
7927 sec
= find_section (".debug_loc");
7931 debug_loc_size
= sec
->sh_size
;
7933 debug_loc_contents
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7934 _("debug_loc section data"));
7938 free_debug_loc (void)
7940 if (debug_loc_contents
== NULL
)
7943 free ((char *) debug_loc_contents
);
7944 debug_loc_contents
= NULL
;
7950 display_debug_loc (Elf_Internal_Shdr
*section
,
7951 unsigned char *start
, FILE *file
)
7953 unsigned char *section_end
;
7954 unsigned long bytes
;
7955 unsigned char *section_begin
= start
;
7957 unsigned int comp_unit
= 0;
7959 addr
= section
->sh_addr
;
7960 bytes
= section
->sh_size
;
7961 section_end
= start
+ bytes
;
7965 printf (_("\nThe .debug_loc section is empty.\n"));
7969 if (num_debug_line_pointer_sizes
== 0)
7970 get_debug_line_pointer_sizes (file
);
7972 printf (_("Contents of the .debug_loc section:\n\n"));
7973 printf (_("\n Offset Begin End Expression\n"));
7975 while (start
< section_end
)
7977 unsigned long begin
;
7979 unsigned short length
;
7980 unsigned long offset
;
7981 unsigned int pointer_size
;
7983 offset
= start
- section_begin
;
7985 /* Get the pointer size from the comp unit associated
7986 with this block of location information. */
7987 if (comp_unit
>= num_debug_line_pointer_sizes
)
7989 error (_("Not enough comp units for .debug_loc section\n"));
7994 pointer_size
= debug_line_pointer_sizes
[comp_unit
];
8000 begin
= byte_get (start
, pointer_size
);
8001 start
+= pointer_size
;
8002 end
= byte_get (start
, pointer_size
);
8003 start
+= pointer_size
;
8005 if (begin
== 0 && end
== 0)
8008 /* For now, skip any base address specifiers. */
8009 if (begin
== 0xffffffff)
8015 length
= byte_get (start
, 2);
8018 printf (" %8.8lx %8.8lx %8.8lx (", offset
, begin
, end
);
8019 decode_location_expression (start
, pointer_size
, length
);
8029 static const char *debug_str_contents
;
8030 static bfd_vma debug_str_size
;
8033 load_debug_str (FILE *file
)
8035 Elf_Internal_Shdr
*sec
;
8037 /* If it is already loaded, do nothing. */
8038 if (debug_str_contents
!= NULL
)
8041 /* Locate the .debug_str section. */
8042 sec
= find_section (".debug_str");
8046 debug_str_size
= sec
->sh_size
;
8048 debug_str_contents
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
8049 _("debug_str section data"));
8053 free_debug_str (void)
8055 if (debug_str_contents
== NULL
)
8058 free ((char *) debug_str_contents
);
8059 debug_str_contents
= NULL
;
8064 fetch_indirect_string (unsigned long offset
)
8066 if (debug_str_contents
== NULL
)
8067 return _("<no .debug_str section>");
8069 if (offset
> debug_str_size
)
8070 return _("<offset is too big>");
8072 return debug_str_contents
+ offset
;
8076 display_debug_str (Elf_Internal_Shdr
*section
,
8077 unsigned char *start
,
8078 FILE *file ATTRIBUTE_UNUSED
)
8080 unsigned long bytes
;
8083 addr
= section
->sh_addr
;
8084 bytes
= section
->sh_size
;
8088 printf (_("\nThe .debug_str section is empty.\n"));
8092 printf (_("Contents of the .debug_str section:\n\n"));
8100 lbytes
= (bytes
> 16 ? 16 : bytes
);
8102 printf (" 0x%8.8lx ", (unsigned long) addr
);
8104 for (j
= 0; j
< 16; j
++)
8107 printf ("%2.2x", start
[j
]);
8115 for (j
= 0; j
< lbytes
; j
++)
8118 if (k
>= ' ' && k
< 0x80)
8134 static unsigned char *
8135 read_and_display_attr_value (unsigned long attribute
,
8137 unsigned char *data
,
8138 unsigned long cu_offset
,
8139 unsigned long pointer_size
,
8140 unsigned long offset_size
,
8143 unsigned long uvalue
= 0;
8144 unsigned char *block_start
= NULL
;
8152 case DW_FORM_ref_addr
:
8153 if (dwarf_version
== 2)
8155 uvalue
= byte_get (data
, pointer_size
);
8156 data
+= pointer_size
;
8158 else if (dwarf_version
== 3)
8160 uvalue
= byte_get (data
, offset_size
);
8161 data
+= offset_size
;
8165 error (_("Internal error: DWARF version is not 2 or 3.\n"));
8170 uvalue
= byte_get (data
, pointer_size
);
8171 data
+= pointer_size
;
8175 uvalue
= byte_get (data
, offset_size
);
8176 data
+= offset_size
;
8182 uvalue
= byte_get (data
++, 1);
8187 uvalue
= byte_get (data
, 2);
8193 uvalue
= byte_get (data
, 4);
8198 uvalue
= read_leb128 (data
, & bytes_read
, 1);
8202 case DW_FORM_ref_udata
:
8204 uvalue
= read_leb128 (data
, & bytes_read
, 0);
8208 case DW_FORM_indirect
:
8209 form
= read_leb128 (data
, & bytes_read
, 0);
8211 printf (" %s", get_FORM_name (form
));
8212 return read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
8213 pointer_size
, offset_size
,
8219 case DW_FORM_ref_addr
:
8220 printf (" <#%lx>", uvalue
);
8226 case DW_FORM_ref_udata
:
8227 printf (" <%lx>", uvalue
+ cu_offset
);
8231 printf (" %#lx", uvalue
);
8240 printf (" %ld", uvalue
);
8245 uvalue
= byte_get (data
, 4);
8246 printf (" %lx", uvalue
);
8247 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
8251 case DW_FORM_string
:
8252 printf (" %s", data
);
8253 data
+= strlen ((char *) data
) + 1;
8257 uvalue
= read_leb128 (data
, & bytes_read
, 0);
8258 block_start
= data
+ bytes_read
;
8259 data
= display_block (block_start
, uvalue
);
8262 case DW_FORM_block1
:
8263 uvalue
= byte_get (data
, 1);
8264 block_start
= data
+ 1;
8265 data
= display_block (block_start
, uvalue
);
8268 case DW_FORM_block2
:
8269 uvalue
= byte_get (data
, 2);
8270 block_start
= data
+ 2;
8271 data
= display_block (block_start
, uvalue
);
8274 case DW_FORM_block4
:
8275 uvalue
= byte_get (data
, 4);
8276 block_start
= data
+ 4;
8277 data
= display_block (block_start
, uvalue
);
8281 printf (_(" (indirect string, offset: 0x%lx): %s"),
8282 uvalue
, fetch_indirect_string (uvalue
));
8285 case DW_FORM_indirect
:
8286 /* Handled above. */
8290 warn (_("Unrecognized form: %d\n"), form
);
8294 /* For some attributes we can display further information. */
8303 case DW_INL_not_inlined
:
8304 printf (_("(not inlined)"));
8306 case DW_INL_inlined
:
8307 printf (_("(inlined)"));
8309 case DW_INL_declared_not_inlined
:
8310 printf (_("(declared as inline but ignored)"));
8312 case DW_INL_declared_inlined
:
8313 printf (_("(declared as inline and inlined)"));
8316 printf (_(" (Unknown inline attribute value: %lx)"), uvalue
);
8321 case DW_AT_language
:
8324 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
8325 case DW_LANG_C89
: printf ("(ANSI C)"); break;
8326 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
8327 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
8328 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
8329 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
8330 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
8331 case DW_LANG_Ada83
: printf ("(Ada)"); break;
8332 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
8333 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
8334 /* DWARF 2.1 values. */
8335 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
8336 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
8337 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
8338 /* MIPS extension. */
8339 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
8340 /* UPC extension. */
8341 case DW_LANG_Upc
: printf ("(Unified Parallel C)"); break;
8343 printf ("(Unknown: %lx)", uvalue
);
8348 case DW_AT_encoding
:
8351 case DW_ATE_void
: printf ("(void)"); break;
8352 case DW_ATE_address
: printf ("(machine address)"); break;
8353 case DW_ATE_boolean
: printf ("(boolean)"); break;
8354 case DW_ATE_complex_float
: printf ("(complex float)"); break;
8355 case DW_ATE_float
: printf ("(float)"); break;
8356 case DW_ATE_signed
: printf ("(signed)"); break;
8357 case DW_ATE_signed_char
: printf ("(signed char)"); break;
8358 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
8359 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
8360 /* DWARF 2.1 value. */
8361 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
8363 if (uvalue
>= DW_ATE_lo_user
8364 && uvalue
<= DW_ATE_hi_user
)
8365 printf ("(user defined type)");
8367 printf ("(unknown type)");
8372 case DW_AT_accessibility
:
8375 case DW_ACCESS_public
: printf ("(public)"); break;
8376 case DW_ACCESS_protected
: printf ("(protected)"); break;
8377 case DW_ACCESS_private
: printf ("(private)"); break;
8379 printf ("(unknown accessibility)");
8384 case DW_AT_visibility
:
8387 case DW_VIS_local
: printf ("(local)"); break;
8388 case DW_VIS_exported
: printf ("(exported)"); break;
8389 case DW_VIS_qualified
: printf ("(qualified)"); break;
8390 default: printf ("(unknown visibility)"); break;
8394 case DW_AT_virtuality
:
8397 case DW_VIRTUALITY_none
: printf ("(none)"); break;
8398 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
8399 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
8400 default: printf ("(unknown virtuality)"); break;
8404 case DW_AT_identifier_case
:
8407 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
8408 case DW_ID_up_case
: printf ("(up_case)"); break;
8409 case DW_ID_down_case
: printf ("(down_case)"); break;
8410 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
8411 default: printf ("(unknown case)"); break;
8415 case DW_AT_calling_convention
:
8418 case DW_CC_normal
: printf ("(normal)"); break;
8419 case DW_CC_program
: printf ("(program)"); break;
8420 case DW_CC_nocall
: printf ("(nocall)"); break;
8422 if (uvalue
>= DW_CC_lo_user
8423 && uvalue
<= DW_CC_hi_user
)
8424 printf ("(user defined)");
8426 printf ("(unknown convention)");
8430 case DW_AT_ordering
:
8433 case -1: printf ("(undefined)"); break;
8434 case 0: printf ("(row major)"); break;
8435 case 1: printf ("(column major)"); break;
8439 case DW_AT_frame_base
:
8440 case DW_AT_location
:
8441 case DW_AT_data_member_location
:
8442 case DW_AT_vtable_elem_location
:
8443 case DW_AT_allocated
:
8444 case DW_AT_associated
:
8445 case DW_AT_data_location
:
8447 case DW_AT_upper_bound
:
8448 case DW_AT_lower_bound
:
8452 decode_location_expression (block_start
, pointer_size
, uvalue
);
8455 else if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
8458 printf ("location list");
8470 static unsigned char *
8471 read_and_display_attr (unsigned long attribute
,
8473 unsigned char *data
,
8474 unsigned long cu_offset
,
8475 unsigned long pointer_size
,
8476 unsigned long offset_size
,
8479 printf (" %-18s:", get_AT_name (attribute
));
8480 data
= read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
8481 pointer_size
, offset_size
, dwarf_version
);
8487 display_debug_info (Elf_Internal_Shdr
*section
,
8488 unsigned char *start
,
8491 unsigned char *end
= start
+ section
->sh_size
;
8492 unsigned char *section_begin
= start
;
8494 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
8496 load_debug_str (file
);
8497 load_debug_loc (file
);
8501 DWARF2_Internal_CompUnit compunit
;
8502 Elf_Internal_Shdr
*relsec
;
8503 unsigned char *hdrptr
;
8504 unsigned char *cu_abbrev_offset_ptr
;
8505 unsigned char *tags
;
8507 unsigned long cu_offset
;
8509 int initial_length_size
;
8513 compunit
.cu_length
= byte_get (hdrptr
, 4);
8516 if (compunit
.cu_length
== 0xffffffff)
8518 compunit
.cu_length
= byte_get (hdrptr
, 8);
8521 initial_length_size
= 12;
8526 initial_length_size
= 4;
8529 compunit
.cu_version
= byte_get (hdrptr
, 2);
8532 /* Apply addends of RELA relocations. */
8533 for (relsec
= section_headers
;
8534 relsec
< section_headers
+ elf_header
.e_shnum
;
8537 unsigned long nrelas
;
8538 Elf_Internal_Rela
*rela
, *rp
;
8539 Elf_Internal_Shdr
*symsec
;
8540 Elf_Internal_Sym
*symtab
;
8541 Elf_Internal_Sym
*sym
;
8543 if (relsec
->sh_type
!= SHT_RELA
8544 || SECTION_HEADER (relsec
->sh_info
) != section
8545 || relsec
->sh_size
== 0)
8548 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
8552 symsec
= SECTION_HEADER (relsec
->sh_link
);
8553 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
8555 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
8559 if (rp
->r_offset
>= (bfd_vma
) (hdrptr
- section_begin
)
8560 && section
->sh_size
> (bfd_vma
) offset_size
8561 && rp
->r_offset
<= section
->sh_size
- offset_size
)
8562 loc
= section_begin
+ rp
->r_offset
;
8568 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
8570 if (ELF32_R_SYM (rp
->r_info
) != 0
8571 && ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
8573 warn (_("Skipping unexpected symbol type %u\n"),
8574 ELF32_ST_TYPE (sym
->st_info
));
8580 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
8582 if (ELF64_R_SYM (rp
->r_info
) != 0
8583 && ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
8585 warn (_("Skipping unexpected symbol type %u\n"),
8586 ELF64_ST_TYPE (sym
->st_info
));
8591 byte_put (loc
, rp
->r_addend
, offset_size
);
8598 cu_abbrev_offset_ptr
= hdrptr
;
8599 compunit
.cu_abbrev_offset
= byte_get (hdrptr
, offset_size
);
8600 hdrptr
+= offset_size
;
8602 compunit
.cu_pointer_size
= byte_get (hdrptr
, 1);
8606 cu_offset
= start
- section_begin
;
8607 start
+= compunit
.cu_length
+ initial_length_size
;
8609 printf (_(" Compilation Unit @ %lx:\n"), cu_offset
);
8610 printf (_(" Length: %ld\n"), compunit
.cu_length
);
8611 printf (_(" Version: %d\n"), compunit
.cu_version
);
8612 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
8613 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
8615 if (compunit
.cu_version
!= 2 && compunit
.cu_version
!= 3)
8617 warn (_("Only version 2 and 3 DWARF debug information is currently supported.\n"));
8623 /* Read in the abbrevs used by this compilation unit. */
8625 Elf_Internal_Shdr
*sec
;
8626 unsigned char *begin
;
8628 /* Locate the .debug_abbrev section and process it. */
8629 sec
= find_section (".debug_abbrev");
8632 warn (_("Unable to locate .debug_abbrev section!\n"));
8636 begin
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
8637 _("debug_abbrev section data"));
8641 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
8642 begin
+ sec
->sh_size
);
8648 while (tags
< start
)
8651 unsigned long abbrev_number
;
8652 abbrev_entry
*entry
;
8655 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
8658 /* A null DIE marks the end of a list of children. */
8659 if (abbrev_number
== 0)
8665 /* Scan through the abbreviation list until we reach the
8667 for (entry
= first_abbrev
;
8668 entry
&& entry
->entry
!= abbrev_number
;
8669 entry
= entry
->next
)
8674 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
8679 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
8681 (unsigned long) (tags
- section_begin
- bytes_read
),
8683 get_TAG_name (entry
->tag
));
8685 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
8686 tags
= read_and_display_attr (attr
->attribute
,
8689 compunit
.cu_pointer_size
,
8691 compunit
.cu_version
);
8693 if (entry
->children
)
8707 display_debug_aranges (Elf_Internal_Shdr
*section
,
8708 unsigned char *start
,
8709 FILE *file ATTRIBUTE_UNUSED
)
8711 unsigned char *end
= start
+ section
->sh_size
;
8713 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
8717 unsigned char *hdrptr
;
8718 DWARF2_Internal_ARange arange
;
8719 unsigned char *ranges
;
8720 unsigned long length
;
8721 unsigned long address
;
8724 int initial_length_size
;
8728 arange
.ar_length
= byte_get (hdrptr
, 4);
8731 if (arange
.ar_length
== 0xffffffff)
8733 arange
.ar_length
= byte_get (hdrptr
, 8);
8736 initial_length_size
= 12;
8741 initial_length_size
= 4;
8744 arange
.ar_version
= byte_get (hdrptr
, 2);
8747 arange
.ar_info_offset
= byte_get (hdrptr
, offset_size
);
8748 hdrptr
+= offset_size
;
8750 arange
.ar_pointer_size
= byte_get (hdrptr
, 1);
8753 arange
.ar_segment_size
= byte_get (hdrptr
, 1);
8756 if (arange
.ar_version
!= 2 && arange
.ar_version
!= 3)
8758 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
8762 printf (_(" Length: %ld\n"), arange
.ar_length
);
8763 printf (_(" Version: %d\n"), arange
.ar_version
);
8764 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
8765 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
8766 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
8768 printf (_("\n Address Length\n"));
8772 /* Must pad to an alignment boundary that is twice the pointer size. */
8773 excess
= (hdrptr
- start
) % (2 * arange
.ar_pointer_size
);
8775 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
8779 address
= byte_get (ranges
, arange
.ar_pointer_size
);
8781 ranges
+= arange
.ar_pointer_size
;
8783 length
= byte_get (ranges
, arange
.ar_pointer_size
);
8785 ranges
+= arange
.ar_pointer_size
;
8787 /* A pair of zeros marks the end of the list. */
8788 if (address
== 0 && length
== 0)
8791 printf (" %8.8lx %lu\n", address
, length
);
8794 start
+= arange
.ar_length
+ initial_length_size
;
8802 typedef struct Frame_Chunk
8804 struct Frame_Chunk
*next
;
8805 unsigned char *chunk_start
;
8807 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
8808 short int *col_type
;
8811 unsigned int code_factor
;
8813 unsigned long pc_begin
;
8814 unsigned long pc_range
;
8818 unsigned char fde_encoding
;
8819 unsigned char cfa_exp
;
8823 /* A marker for a col_type that means this column was never referenced
8824 in the frame info. */
8825 #define DW_CFA_unreferenced (-1)
8828 frame_need_space (Frame_Chunk
*fc
, int reg
)
8830 int prev
= fc
->ncols
;
8832 if (reg
< fc
->ncols
)
8835 fc
->ncols
= reg
+ 1;
8836 fc
->col_type
= xrealloc (fc
->col_type
, fc
->ncols
* sizeof (short int));
8837 fc
->col_offset
= xrealloc (fc
->col_offset
, fc
->ncols
* sizeof (int));
8839 while (prev
< fc
->ncols
)
8841 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
8842 fc
->col_offset
[prev
] = 0;
8848 frame_display_row (Frame_Chunk
*fc
, int *need_col_headers
, int *max_regs
)
8853 if (*max_regs
< fc
->ncols
)
8854 *max_regs
= fc
->ncols
;
8856 if (*need_col_headers
)
8858 *need_col_headers
= 0;
8860 printf (" LOC CFA ");
8862 for (r
= 0; r
< *max_regs
; r
++)
8863 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
8868 printf ("r%-4d", r
);
8874 printf ("%08lx ", fc
->pc_begin
);
8876 strcpy (tmp
, "exp");
8878 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
8879 printf ("%-8s ", tmp
);
8881 for (r
= 0; r
< fc
->ncols
; r
++)
8883 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
8885 switch (fc
->col_type
[r
])
8887 case DW_CFA_undefined
:
8890 case DW_CFA_same_value
:
8894 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
8896 case DW_CFA_register
:
8897 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
8899 case DW_CFA_expression
:
8900 strcpy (tmp
, "exp");
8903 strcpy (tmp
, "n/a");
8906 printf ("%-5s", tmp
);
8913 size_of_encoded_value (int encoding
)
8915 switch (encoding
& 0x7)
8918 case 0: return is_32bit_elf
? 4 : 8;
8926 get_encoded_value (unsigned char *data
, int encoding
)
8928 int size
= size_of_encoded_value (encoding
);
8929 if (encoding
& DW_EH_PE_signed
)
8930 return byte_get_signed (data
, size
);
8932 return byte_get (data
, size
);
8935 #define GET(N) byte_get (start, N); start += N
8936 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
8937 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
8940 display_debug_frames (Elf_Internal_Shdr
*section
,
8941 unsigned char *start
,
8942 FILE *file ATTRIBUTE_UNUSED
)
8944 unsigned char *end
= start
+ section
->sh_size
;
8945 unsigned char *section_start
= start
;
8946 Frame_Chunk
*chunks
= 0;
8947 Frame_Chunk
*remembered_state
= 0;
8949 int is_eh
= (strcmp (SECTION_NAME (section
), ".eh_frame") == 0);
8952 int addr_size
= is_32bit_elf
? 4 : 8;
8954 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
8958 unsigned char *saved_start
;
8959 unsigned char *block_end
;
8960 unsigned long length
;
8961 unsigned long cie_id
;
8964 int need_col_headers
= 1;
8965 unsigned char *augmentation_data
= NULL
;
8966 unsigned long augmentation_data_len
= 0;
8967 int encoded_ptr_size
= addr_size
;
8969 int initial_length_size
;
8971 saved_start
= start
;
8972 length
= byte_get (start
, 4); start
+= 4;
8976 printf ("\n%08lx ZERO terminator\n\n",
8977 (unsigned long)(saved_start
- section_start
));
8981 if (length
== 0xffffffff)
8983 length
= byte_get (start
, 8);
8986 initial_length_size
= 12;
8991 initial_length_size
= 4;
8994 block_end
= saved_start
+ length
+ initial_length_size
;
8995 cie_id
= byte_get (start
, offset_size
); start
+= offset_size
;
8997 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
9001 fc
= xmalloc (sizeof (Frame_Chunk
));
9002 memset (fc
, 0, sizeof (Frame_Chunk
));
9006 fc
->chunk_start
= saved_start
;
9008 fc
->col_type
= xmalloc (sizeof (short int));
9009 fc
->col_offset
= xmalloc (sizeof (int));
9010 frame_need_space (fc
, max_regs
-1);
9014 fc
->augmentation
= start
;
9015 start
= strchr (start
, '\0') + 1;
9017 if (fc
->augmentation
[0] == 'z')
9019 fc
->code_factor
= LEB ();
9020 fc
->data_factor
= SLEB ();
9029 augmentation_data_len
= LEB ();
9030 augmentation_data
= start
;
9031 start
+= augmentation_data_len
;
9033 else if (strcmp (fc
->augmentation
, "eh") == 0)
9036 fc
->code_factor
= LEB ();
9037 fc
->data_factor
= SLEB ();
9049 fc
->code_factor
= LEB ();
9050 fc
->data_factor
= SLEB ();
9062 if (do_debug_frames_interp
)
9063 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
9064 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
9065 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
9069 printf ("\n%08lx %08lx %08lx CIE\n",
9070 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
9071 printf (" Version: %d\n", version
);
9072 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
9073 printf (" Code alignment factor: %u\n", fc
->code_factor
);
9074 printf (" Data alignment factor: %d\n", fc
->data_factor
);
9075 printf (" Return address column: %d\n", fc
->ra
);
9077 if (augmentation_data_len
)
9080 printf (" Augmentation data: ");
9081 for (i
= 0; i
< augmentation_data_len
; ++i
)
9082 printf (" %02x", augmentation_data
[i
]);
9088 if (augmentation_data_len
)
9090 unsigned char *p
, *q
;
9091 p
= fc
->augmentation
+ 1;
9092 q
= augmentation_data
;
9099 q
+= 1 + size_of_encoded_value (*q
);
9101 fc
->fde_encoding
= *q
++;
9107 if (fc
->fde_encoding
)
9108 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
9111 frame_need_space (fc
, fc
->ra
);
9115 unsigned char *look_for
;
9116 static Frame_Chunk fde_fc
;
9119 memset (fc
, 0, sizeof (Frame_Chunk
));
9121 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
9123 for (cie
= chunks
; cie
; cie
= cie
->next
)
9124 if (cie
->chunk_start
== look_for
)
9129 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
9130 cie_id
, saved_start
);
9133 fc
->col_type
= xmalloc (sizeof (short int));
9134 fc
->col_offset
= xmalloc (sizeof (int));
9135 frame_need_space (fc
, max_regs
- 1);
9137 fc
->augmentation
= "";
9138 fc
->fde_encoding
= 0;
9142 fc
->ncols
= cie
->ncols
;
9143 fc
->col_type
= xmalloc (fc
->ncols
* sizeof (short int));
9144 fc
->col_offset
= xmalloc (fc
->ncols
* sizeof (int));
9145 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
9146 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
9147 fc
->augmentation
= cie
->augmentation
;
9148 fc
->code_factor
= cie
->code_factor
;
9149 fc
->data_factor
= cie
->data_factor
;
9150 fc
->cfa_reg
= cie
->cfa_reg
;
9151 fc
->cfa_offset
= cie
->cfa_offset
;
9153 frame_need_space (fc
, max_regs
-1);
9154 fc
->fde_encoding
= cie
->fde_encoding
;
9157 if (fc
->fde_encoding
)
9158 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
9160 fc
->pc_begin
= get_encoded_value (start
, fc
->fde_encoding
);
9161 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
)
9162 fc
->pc_begin
+= section
->sh_addr
+ (start
- section_start
);
9163 start
+= encoded_ptr_size
;
9164 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
9165 start
+= encoded_ptr_size
;
9167 if (cie
->augmentation
[0] == 'z')
9169 augmentation_data_len
= LEB ();
9170 augmentation_data
= start
;
9171 start
+= augmentation_data_len
;
9174 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
9175 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
9176 (unsigned long)(cie
->chunk_start
- section_start
),
9177 fc
->pc_begin
, fc
->pc_begin
+ fc
->pc_range
);
9178 if (! do_debug_frames_interp
&& augmentation_data_len
)
9181 printf (" Augmentation data: ");
9182 for (i
= 0; i
< augmentation_data_len
; ++i
)
9183 printf (" %02x", augmentation_data
[i
]);
9189 /* At this point, fc is the current chunk, cie (if any) is set, and we're
9190 about to interpret instructions for the chunk. */
9191 /* ??? At present we need to do this always, since this sizes the
9192 fc->col_type and fc->col_offset arrays, which we write into always.
9193 We should probably split the interpreted and non-interpreted bits
9194 into two different routines, since there's so much that doesn't
9195 really overlap between them. */
9196 if (1 || do_debug_frames_interp
)
9198 /* Start by making a pass over the chunk, allocating storage
9199 and taking note of what registers are used. */
9200 unsigned char *tmp
= start
;
9202 while (start
< block_end
)
9205 unsigned long reg
, tmp
;
9212 /* Warning: if you add any more cases to this switch, be
9213 sure to add them to the corresponding switch below. */
9216 case DW_CFA_advance_loc
:
9220 frame_need_space (fc
, opa
);
9221 fc
->col_type
[opa
] = DW_CFA_undefined
;
9223 case DW_CFA_restore
:
9224 frame_need_space (fc
, opa
);
9225 fc
->col_type
[opa
] = DW_CFA_undefined
;
9227 case DW_CFA_set_loc
:
9228 start
+= encoded_ptr_size
;
9230 case DW_CFA_advance_loc1
:
9233 case DW_CFA_advance_loc2
:
9236 case DW_CFA_advance_loc4
:
9239 case DW_CFA_offset_extended
:
9240 reg
= LEB (); LEB ();
9241 frame_need_space (fc
, reg
);
9242 fc
->col_type
[reg
] = DW_CFA_undefined
;
9244 case DW_CFA_restore_extended
:
9246 frame_need_space (fc
, reg
);
9247 fc
->col_type
[reg
] = DW_CFA_undefined
;
9249 case DW_CFA_undefined
:
9251 frame_need_space (fc
, reg
);
9252 fc
->col_type
[reg
] = DW_CFA_undefined
;
9254 case DW_CFA_same_value
:
9256 frame_need_space (fc
, reg
);
9257 fc
->col_type
[reg
] = DW_CFA_undefined
;
9259 case DW_CFA_register
:
9260 reg
= LEB (); LEB ();
9261 frame_need_space (fc
, reg
);
9262 fc
->col_type
[reg
] = DW_CFA_undefined
;
9264 case DW_CFA_def_cfa
:
9267 case DW_CFA_def_cfa_register
:
9270 case DW_CFA_def_cfa_offset
:
9273 case DW_CFA_def_cfa_expression
:
9277 case DW_CFA_expression
:
9281 frame_need_space (fc
, reg
);
9282 fc
->col_type
[reg
] = DW_CFA_undefined
;
9284 case DW_CFA_offset_extended_sf
:
9285 reg
= LEB (); SLEB ();
9286 frame_need_space (fc
, reg
);
9287 fc
->col_type
[reg
] = DW_CFA_undefined
;
9289 case DW_CFA_def_cfa_sf
:
9292 case DW_CFA_def_cfa_offset_sf
:
9295 case DW_CFA_MIPS_advance_loc8
:
9298 case DW_CFA_GNU_args_size
:
9301 case DW_CFA_GNU_negative_offset_extended
:
9302 reg
= LEB (); LEB ();
9303 frame_need_space (fc
, reg
);
9304 fc
->col_type
[reg
] = DW_CFA_undefined
;
9313 /* Now we know what registers are used, make a second pass over
9314 the chunk, this time actually printing out the info. */
9316 while (start
< block_end
)
9319 unsigned long ul
, reg
, roffs
;
9328 /* Warning: if you add any more cases to this switch, be
9329 sure to add them to the corresponding switch above. */
9332 case DW_CFA_advance_loc
:
9333 if (do_debug_frames_interp
)
9334 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9336 printf (" DW_CFA_advance_loc: %d to %08lx\n",
9337 opa
* fc
->code_factor
,
9338 fc
->pc_begin
+ opa
* fc
->code_factor
);
9339 fc
->pc_begin
+= opa
* fc
->code_factor
;
9344 if (! do_debug_frames_interp
)
9345 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
9346 opa
, roffs
* fc
->data_factor
);
9347 fc
->col_type
[opa
] = DW_CFA_offset
;
9348 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
9351 case DW_CFA_restore
:
9352 if (! do_debug_frames_interp
)
9353 printf (" DW_CFA_restore: r%d\n", opa
);
9354 fc
->col_type
[opa
] = cie
->col_type
[opa
];
9355 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
9358 case DW_CFA_set_loc
:
9359 vma
= get_encoded_value (start
, fc
->fde_encoding
);
9360 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
)
9361 vma
+= section
->sh_addr
+ (start
- section_start
);
9362 start
+= encoded_ptr_size
;
9363 if (do_debug_frames_interp
)
9364 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9366 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
9370 case DW_CFA_advance_loc1
:
9371 ofs
= byte_get (start
, 1); start
+= 1;
9372 if (do_debug_frames_interp
)
9373 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9375 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
9376 ofs
* fc
->code_factor
,
9377 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9378 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9381 case DW_CFA_advance_loc2
:
9382 ofs
= byte_get (start
, 2); start
+= 2;
9383 if (do_debug_frames_interp
)
9384 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9386 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
9387 ofs
* fc
->code_factor
,
9388 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9389 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9392 case DW_CFA_advance_loc4
:
9393 ofs
= byte_get (start
, 4); start
+= 4;
9394 if (do_debug_frames_interp
)
9395 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9397 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
9398 ofs
* fc
->code_factor
,
9399 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9400 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9403 case DW_CFA_offset_extended
:
9406 if (! do_debug_frames_interp
)
9407 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
9408 reg
, roffs
* fc
->data_factor
);
9409 fc
->col_type
[reg
] = DW_CFA_offset
;
9410 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
9413 case DW_CFA_restore_extended
:
9415 if (! do_debug_frames_interp
)
9416 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
9417 fc
->col_type
[reg
] = cie
->col_type
[reg
];
9418 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
9421 case DW_CFA_undefined
:
9423 if (! do_debug_frames_interp
)
9424 printf (" DW_CFA_undefined: r%ld\n", reg
);
9425 fc
->col_type
[reg
] = DW_CFA_undefined
;
9426 fc
->col_offset
[reg
] = 0;
9429 case DW_CFA_same_value
:
9431 if (! do_debug_frames_interp
)
9432 printf (" DW_CFA_same_value: r%ld\n", reg
);
9433 fc
->col_type
[reg
] = DW_CFA_same_value
;
9434 fc
->col_offset
[reg
] = 0;
9437 case DW_CFA_register
:
9440 if (! do_debug_frames_interp
)
9441 printf (" DW_CFA_register: r%ld in r%ld\n", reg
, roffs
);
9442 fc
->col_type
[reg
] = DW_CFA_register
;
9443 fc
->col_offset
[reg
] = roffs
;
9446 case DW_CFA_remember_state
:
9447 if (! do_debug_frames_interp
)
9448 printf (" DW_CFA_remember_state\n");
9449 rs
= xmalloc (sizeof (Frame_Chunk
));
9450 rs
->ncols
= fc
->ncols
;
9451 rs
->col_type
= xmalloc (rs
->ncols
* sizeof (short int));
9452 rs
->col_offset
= xmalloc (rs
->ncols
* sizeof (int));
9453 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
9454 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
9455 rs
->next
= remembered_state
;
9456 remembered_state
= rs
;
9459 case DW_CFA_restore_state
:
9460 if (! do_debug_frames_interp
)
9461 printf (" DW_CFA_restore_state\n");
9462 rs
= remembered_state
;
9465 remembered_state
= rs
->next
;
9466 frame_need_space (fc
, rs
->ncols
-1);
9467 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
9468 memcpy (fc
->col_offset
, rs
->col_offset
,
9469 rs
->ncols
* sizeof (int));
9470 free (rs
->col_type
);
9471 free (rs
->col_offset
);
9474 else if (do_debug_frames_interp
)
9475 printf ("Mismatched DW_CFA_restore_state\n");
9478 case DW_CFA_def_cfa
:
9479 fc
->cfa_reg
= LEB ();
9480 fc
->cfa_offset
= LEB ();
9482 if (! do_debug_frames_interp
)
9483 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
9484 fc
->cfa_reg
, fc
->cfa_offset
);
9487 case DW_CFA_def_cfa_register
:
9488 fc
->cfa_reg
= LEB ();
9490 if (! do_debug_frames_interp
)
9491 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
9494 case DW_CFA_def_cfa_offset
:
9495 fc
->cfa_offset
= LEB ();
9496 if (! do_debug_frames_interp
)
9497 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
9501 if (! do_debug_frames_interp
)
9502 printf (" DW_CFA_nop\n");
9505 case DW_CFA_def_cfa_expression
:
9507 if (! do_debug_frames_interp
)
9509 printf (" DW_CFA_def_cfa_expression (");
9510 decode_location_expression (start
, addr_size
, ul
);
9517 case DW_CFA_expression
:
9520 if (! do_debug_frames_interp
)
9522 printf (" DW_CFA_expression: r%ld (", reg
);
9523 decode_location_expression (start
, addr_size
, ul
);
9526 fc
->col_type
[reg
] = DW_CFA_expression
;
9530 case DW_CFA_offset_extended_sf
:
9533 frame_need_space (fc
, reg
);
9534 if (! do_debug_frames_interp
)
9535 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
9536 reg
, l
* fc
->data_factor
);
9537 fc
->col_type
[reg
] = DW_CFA_offset
;
9538 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
9541 case DW_CFA_def_cfa_sf
:
9542 fc
->cfa_reg
= LEB ();
9543 fc
->cfa_offset
= SLEB ();
9545 if (! do_debug_frames_interp
)
9546 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
9547 fc
->cfa_reg
, fc
->cfa_offset
);
9550 case DW_CFA_def_cfa_offset_sf
:
9551 fc
->cfa_offset
= SLEB ();
9552 if (! do_debug_frames_interp
)
9553 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc
->cfa_offset
);
9556 case DW_CFA_MIPS_advance_loc8
:
9557 ofs
= byte_get (start
, 8); start
+= 8;
9558 if (do_debug_frames_interp
)
9559 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9561 printf (" DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
9562 ofs
* fc
->code_factor
,
9563 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9564 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9567 case DW_CFA_GNU_window_save
:
9568 if (! do_debug_frames_interp
)
9569 printf (" DW_CFA_GNU_window_save\n");
9572 case DW_CFA_GNU_args_size
:
9574 if (! do_debug_frames_interp
)
9575 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
9578 case DW_CFA_GNU_negative_offset_extended
:
9581 frame_need_space (fc
, reg
);
9582 if (! do_debug_frames_interp
)
9583 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
9584 reg
, l
* fc
->data_factor
);
9585 fc
->col_type
[reg
] = DW_CFA_offset
;
9586 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
9590 fprintf (stderr
, "unsupported or unknown DW_CFA_%d\n", op
);
9595 if (do_debug_frames_interp
)
9596 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9611 display_debug_not_supported (Elf_Internal_Shdr
*section
,
9612 unsigned char *start ATTRIBUTE_UNUSED
,
9613 FILE *file ATTRIBUTE_UNUSED
)
9615 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
9616 SECTION_NAME (section
));
9621 /* A structure containing the name of a debug section
9622 and a pointer to a function that can decode it. */
9625 const char *const name
;
9626 int (*display
) (Elf_Internal_Shdr
*, unsigned char *, FILE *);
9630 { ".debug_abbrev", display_debug_abbrev
},
9631 { ".debug_aranges", display_debug_aranges
},
9632 { ".debug_frame", display_debug_frames
},
9633 { ".debug_info", display_debug_info
},
9634 { ".debug_line", display_debug_lines
},
9635 { ".debug_pubnames", display_debug_pubnames
},
9636 { ".eh_frame", display_debug_frames
},
9637 { ".debug_macinfo", display_debug_macinfo
},
9638 { ".debug_str", display_debug_str
},
9639 { ".debug_loc", display_debug_loc
},
9640 { ".debug_pubtypes", display_debug_pubnames
},
9641 { ".debug_ranges", display_debug_not_supported
},
9642 { ".debug_static_func", display_debug_not_supported
},
9643 { ".debug_static_vars", display_debug_not_supported
},
9644 { ".debug_types", display_debug_not_supported
},
9645 { ".debug_weaknames", display_debug_not_supported
}
9649 display_debug_section (Elf_Internal_Shdr
*section
, FILE *file
)
9651 char *name
= SECTION_NAME (section
);
9652 bfd_size_type length
;
9653 unsigned char *start
;
9656 length
= section
->sh_size
;
9659 printf (_("\nSection '%s' has no debugging data.\n"), name
);
9663 start
= get_data (NULL
, file
, section
->sh_offset
, length
,
9664 _("debug section data"));
9668 /* See if we know how to display the contents of this section. */
9669 if (strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
9670 name
= ".debug_info";
9672 for (i
= NUM_ELEM (debug_displays
); i
--;)
9673 if (strcmp (debug_displays
[i
].name
, name
) == 0)
9675 debug_displays
[i
].display (section
, start
, file
);
9680 printf (_("Unrecognized debug section: %s\n"), name
);
9684 /* If we loaded in the abbrev section at some point,
9685 we must release it here. */
9692 process_section_contents (FILE *file
)
9694 Elf_Internal_Shdr
*section
;
9700 for (i
= 0, section
= section_headers
;
9701 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
9704 #ifdef SUPPORT_DISASSEMBLY
9705 if (dump_sects
[i
] & DISASS_DUMP
)
9706 disassemble_section (section
, file
);
9708 if (dump_sects
[i
] & HEX_DUMP
)
9709 dump_section (section
, file
);
9711 if (dump_sects
[i
] & DEBUG_DUMP
)
9712 display_debug_section (section
, file
);
9715 if (i
< num_dump_sects
)
9716 warn (_("Some sections were not dumped because they do not exist!\n"));
9722 process_mips_fpe_exception (int mask
)
9727 if (mask
& OEX_FPU_INEX
)
9728 fputs ("INEX", stdout
), first
= 0;
9729 if (mask
& OEX_FPU_UFLO
)
9730 printf ("%sUFLO", first
? "" : "|"), first
= 0;
9731 if (mask
& OEX_FPU_OFLO
)
9732 printf ("%sOFLO", first
? "" : "|"), first
= 0;
9733 if (mask
& OEX_FPU_DIV0
)
9734 printf ("%sDIV0", first
? "" : "|"), first
= 0;
9735 if (mask
& OEX_FPU_INVAL
)
9736 printf ("%sINVAL", first
? "" : "|");
9739 fputs ("0", stdout
);
9743 process_mips_specific (FILE *file
)
9745 Elf_Internal_Dyn
*entry
;
9746 size_t liblist_offset
= 0;
9747 size_t liblistno
= 0;
9748 size_t conflictsno
= 0;
9749 size_t options_offset
= 0;
9750 size_t conflicts_offset
= 0;
9752 /* We have a lot of special sections. Thanks SGI! */
9753 if (dynamic_section
== NULL
)
9754 /* No information available. */
9757 for (entry
= dynamic_section
; entry
->d_tag
!= DT_NULL
; ++entry
)
9758 switch (entry
->d_tag
)
9760 case DT_MIPS_LIBLIST
:
9762 = offset_from_vma (file
, entry
->d_un
.d_val
,
9763 liblistno
* sizeof (Elf32_External_Lib
));
9765 case DT_MIPS_LIBLISTNO
:
9766 liblistno
= entry
->d_un
.d_val
;
9768 case DT_MIPS_OPTIONS
:
9769 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
9771 case DT_MIPS_CONFLICT
:
9773 = offset_from_vma (file
, entry
->d_un
.d_val
,
9774 conflictsno
* sizeof (Elf32_External_Conflict
));
9776 case DT_MIPS_CONFLICTNO
:
9777 conflictsno
= entry
->d_un
.d_val
;
9783 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
9785 Elf32_External_Lib
*elib
;
9788 elib
= get_data (NULL
, file
, liblist_offset
,
9789 liblistno
* sizeof (Elf32_External_Lib
),
9793 printf ("\nSection '.liblist' contains %lu entries:\n",
9794 (unsigned long) liblistno
);
9795 fputs (" Library Time Stamp Checksum Version Flags\n",
9798 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
9805 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9806 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9807 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9808 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9809 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9811 tmp
= gmtime (&time
);
9812 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
9813 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9814 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9816 printf ("%3lu: ", (unsigned long) cnt
);
9817 print_symbol (20, dynamic_strings
+ liblist
.l_name
);
9818 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
9821 if (liblist
.l_flags
== 0)
9832 { " EXACT_MATCH", LL_EXACT_MATCH
},
9833 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
9834 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
9835 { " EXPORTS", LL_EXPORTS
},
9836 { " DELAY_LOAD", LL_DELAY_LOAD
},
9837 { " DELTA", LL_DELTA
}
9839 int flags
= liblist
.l_flags
;
9843 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
9845 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
9847 fputs (l_flags_vals
[fcnt
].name
, stdout
);
9848 flags
^= l_flags_vals
[fcnt
].bit
;
9851 printf (" %#x", (unsigned int) flags
);
9861 if (options_offset
!= 0)
9863 Elf_External_Options
*eopt
;
9864 Elf_Internal_Shdr
*sect
= section_headers
;
9865 Elf_Internal_Options
*iopt
;
9866 Elf_Internal_Options
*option
;
9870 /* Find the section header so that we get the size. */
9871 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
9874 eopt
= get_data (NULL
, file
, options_offset
, sect
->sh_size
,
9878 iopt
= malloc ((sect
->sh_size
/ sizeof (eopt
)) * sizeof (*iopt
));
9881 error (_("Out of memory"));
9888 while (offset
< sect
->sh_size
)
9890 Elf_External_Options
*eoption
;
9892 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
9894 option
->kind
= BYTE_GET (eoption
->kind
);
9895 option
->size
= BYTE_GET (eoption
->size
);
9896 option
->section
= BYTE_GET (eoption
->section
);
9897 option
->info
= BYTE_GET (eoption
->info
);
9899 offset
+= option
->size
;
9905 printf (_("\nSection '%s' contains %d entries:\n"),
9906 SECTION_NAME (sect
), cnt
);
9914 switch (option
->kind
)
9917 /* This shouldn't happen. */
9918 printf (" NULL %d %lx", option
->section
, option
->info
);
9921 printf (" REGINFO ");
9922 if (elf_header
.e_machine
== EM_MIPS
)
9925 Elf32_External_RegInfo
*ereg
;
9926 Elf32_RegInfo reginfo
;
9928 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
9929 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9930 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9931 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9932 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9933 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9934 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9936 printf ("GPR %08lx GP 0x%lx\n",
9938 (unsigned long) reginfo
.ri_gp_value
);
9939 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9940 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9941 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9946 Elf64_External_RegInfo
*ereg
;
9947 Elf64_Internal_RegInfo reginfo
;
9949 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
9950 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9951 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9952 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9953 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9954 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9955 reginfo
.ri_gp_value
= BYTE_GET8 (ereg
->ri_gp_value
);
9957 printf ("GPR %08lx GP 0x",
9958 reginfo
.ri_gprmask
);
9959 printf_vma (reginfo
.ri_gp_value
);
9962 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9963 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9964 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9968 case ODK_EXCEPTIONS
:
9969 fputs (" EXCEPTIONS fpe_min(", stdout
);
9970 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
9971 fputs (") fpe_max(", stdout
);
9972 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
9973 fputs (")", stdout
);
9975 if (option
->info
& OEX_PAGE0
)
9976 fputs (" PAGE0", stdout
);
9977 if (option
->info
& OEX_SMM
)
9978 fputs (" SMM", stdout
);
9979 if (option
->info
& OEX_FPDBUG
)
9980 fputs (" FPDBUG", stdout
);
9981 if (option
->info
& OEX_DISMISS
)
9982 fputs (" DISMISS", stdout
);
9985 fputs (" PAD ", stdout
);
9986 if (option
->info
& OPAD_PREFIX
)
9987 fputs (" PREFIX", stdout
);
9988 if (option
->info
& OPAD_POSTFIX
)
9989 fputs (" POSTFIX", stdout
);
9990 if (option
->info
& OPAD_SYMBOL
)
9991 fputs (" SYMBOL", stdout
);
9994 fputs (" HWPATCH ", stdout
);
9995 if (option
->info
& OHW_R4KEOP
)
9996 fputs (" R4KEOP", stdout
);
9997 if (option
->info
& OHW_R8KPFETCH
)
9998 fputs (" R8KPFETCH", stdout
);
9999 if (option
->info
& OHW_R5KEOP
)
10000 fputs (" R5KEOP", stdout
);
10001 if (option
->info
& OHW_R5KCVTL
)
10002 fputs (" R5KCVTL", stdout
);
10005 fputs (" FILL ", stdout
);
10006 /* XXX Print content of info word? */
10009 fputs (" TAGS ", stdout
);
10010 /* XXX Print content of info word? */
10013 fputs (" HWAND ", stdout
);
10014 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
10015 fputs (" R4KEOP_CHECKED", stdout
);
10016 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
10017 fputs (" R4KEOP_CLEAN", stdout
);
10020 fputs (" HWOR ", stdout
);
10021 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
10022 fputs (" R4KEOP_CHECKED", stdout
);
10023 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
10024 fputs (" R4KEOP_CLEAN", stdout
);
10027 printf (" GP_GROUP %#06lx self-contained %#06lx",
10028 option
->info
& OGP_GROUP
,
10029 (option
->info
& OGP_SELF
) >> 16);
10032 printf (" IDENT %#06lx self-contained %#06lx",
10033 option
->info
& OGP_GROUP
,
10034 (option
->info
& OGP_SELF
) >> 16);
10037 /* This shouldn't happen. */
10038 printf (" %3d ??? %d %lx",
10039 option
->kind
, option
->section
, option
->info
);
10043 len
= sizeof (*eopt
);
10044 while (len
< option
->size
)
10045 if (((char *) option
)[len
] >= ' '
10046 && ((char *) option
)[len
] < 0x7f)
10047 printf ("%c", ((char *) option
)[len
++]);
10049 printf ("\\%03o", ((char *) option
)[len
++]);
10051 fputs ("\n", stdout
);
10059 if (conflicts_offset
!= 0 && conflictsno
!= 0)
10061 Elf32_Conflict
*iconf
;
10064 if (dynamic_symbols
== NULL
)
10066 error (_("conflict list found without a dynamic symbol table"));
10070 iconf
= malloc (conflictsno
* sizeof (*iconf
));
10073 error (_("Out of memory"));
10079 Elf32_External_Conflict
*econf32
;
10081 econf32
= get_data (NULL
, file
, conflicts_offset
,
10082 conflictsno
* sizeof (*econf32
), _("conflict"));
10086 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10087 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
10093 Elf64_External_Conflict
*econf64
;
10095 econf64
= get_data (NULL
, file
, conflicts_offset
,
10096 conflictsno
* sizeof (*econf64
), _("conflict"));
10100 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10101 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
10106 printf (_("\nSection '.conflict' contains %lu entries:\n"),
10107 (unsigned long) conflictsno
);
10108 puts (_(" Num: Index Value Name"));
10110 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10112 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
10114 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
10115 print_vma (psym
->st_value
, FULL_HEX
);
10117 print_symbol (25, dynamic_strings
+ psym
->st_name
);
10128 process_gnu_liblist (FILE *file
)
10130 Elf_Internal_Shdr
*section
, *string_sec
;
10131 Elf32_External_Lib
*elib
;
10139 for (i
= 0, section
= section_headers
;
10140 i
< elf_header
.e_shnum
;
10143 switch (section
->sh_type
)
10145 case SHT_GNU_LIBLIST
:
10146 elib
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
10151 string_sec
= SECTION_HEADER (section
->sh_link
);
10153 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
10154 string_sec
->sh_size
, _("liblist string table"));
10157 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
10163 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
10164 SECTION_NAME (section
),
10165 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
10167 puts (" Library Time Stamp Checksum Version Flags");
10169 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
10177 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
10178 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
10179 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
10180 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
10181 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
10183 tmp
= gmtime (&time
);
10184 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
10185 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
10186 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
10188 printf ("%3lu: ", (unsigned long) cnt
);
10190 printf ("%-20s", strtab
+ liblist
.l_name
);
10192 printf ("%-20.20s", strtab
+ liblist
.l_name
);
10193 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
10194 liblist
.l_version
, liblist
.l_flags
);
10204 static const char *
10205 get_note_type (unsigned e_type
)
10207 static char buff
[64];
10211 case NT_AUXV
: return _("NT_AUXV (auxiliary vector)");
10212 case NT_PRSTATUS
: return _("NT_PRSTATUS (prstatus structure)");
10213 case NT_FPREGSET
: return _("NT_FPREGSET (floating point registers)");
10214 case NT_PRPSINFO
: return _("NT_PRPSINFO (prpsinfo structure)");
10215 case NT_TASKSTRUCT
: return _("NT_TASKSTRUCT (task structure)");
10216 case NT_PRXFPREG
: return _("NT_PRXFPREG (user_xfpregs structure)");
10217 case NT_PSTATUS
: return _("NT_PSTATUS (pstatus structure)");
10218 case NT_FPREGS
: return _("NT_FPREGS (floating point registers)");
10219 case NT_PSINFO
: return _("NT_PSINFO (psinfo structure)");
10220 case NT_LWPSTATUS
: return _("NT_LWPSTATUS (lwpstatus_t structure)");
10221 case NT_LWPSINFO
: return _("NT_LWPSINFO (lwpsinfo_t structure)");
10222 case NT_WIN32PSTATUS
: return _("NT_WIN32PSTATUS (win32_pstatus structure)");
10224 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
10229 static const char *
10230 get_netbsd_elfcore_note_type (unsigned e_type
)
10232 static char buff
[64];
10234 if (e_type
== NT_NETBSDCORE_PROCINFO
)
10236 /* NetBSD core "procinfo" structure. */
10237 return _("NetBSD procinfo structure");
10240 /* As of Jan 2002 there are no other machine-independent notes
10241 defined for NetBSD core files. If the note type is less
10242 than the start of the machine-dependent note types, we don't
10245 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
10247 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
10251 switch (elf_header
.e_machine
)
10253 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
10254 and PT_GETFPREGS == mach+2. */
10259 case EM_SPARC32PLUS
:
10263 case NT_NETBSDCORE_FIRSTMACH
+0:
10264 return _("PT_GETREGS (reg structure)");
10265 case NT_NETBSDCORE_FIRSTMACH
+2:
10266 return _("PT_GETFPREGS (fpreg structure)");
10272 /* On all other arch's, PT_GETREGS == mach+1 and
10273 PT_GETFPREGS == mach+3. */
10277 case NT_NETBSDCORE_FIRSTMACH
+1:
10278 return _("PT_GETREGS (reg structure)");
10279 case NT_NETBSDCORE_FIRSTMACH
+3:
10280 return _("PT_GETFPREGS (fpreg structure)");
10286 sprintf (buff
, _("PT_FIRSTMACH+%d"), e_type
- NT_NETBSDCORE_FIRSTMACH
);
10290 /* Note that by the ELF standard, the name field is already null byte
10291 terminated, and namesz includes the terminating null byte.
10292 I.E. the value of namesz for the name "FSF" is 4.
10294 If the value of namesz is zero, there is no name present. */
10296 process_note (Elf_Internal_Note
*pnote
)
10300 if (pnote
->namesz
== 0)
10302 /* If there is no note name, then use the default set of
10303 note type strings. */
10304 nt
= get_note_type (pnote
->type
);
10306 else if (strncmp (pnote
->namedata
, "NetBSD-CORE", 11) == 0)
10308 /* NetBSD-specific core file notes. */
10309 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
10313 /* Don't recognize this note name; just use the default set of
10314 note type strings. */
10315 nt
= get_note_type (pnote
->type
);
10318 printf (" %s\t\t0x%08lx\t%s\n",
10319 pnote
->namesz
? pnote
->namedata
: "(NONE)",
10320 pnote
->descsz
, nt
);
10326 process_corefile_note_segment (FILE *file
, bfd_vma offset
, bfd_vma length
)
10328 Elf_External_Note
*pnotes
;
10329 Elf_External_Note
*external
;
10335 pnotes
= get_data (NULL
, file
, offset
, length
, _("notes"));
10341 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
10342 (unsigned long) offset
, (unsigned long) length
);
10343 printf (_(" Owner\t\tData size\tDescription\n"));
10345 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
10347 Elf_External_Note
*next
;
10348 Elf_Internal_Note inote
;
10351 inote
.type
= BYTE_GET (external
->type
);
10352 inote
.namesz
= BYTE_GET (external
->namesz
);
10353 inote
.namedata
= external
->name
;
10354 inote
.descsz
= BYTE_GET (external
->descsz
);
10355 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
10356 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
10358 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
10360 if (((char *) next
) > (((char *) pnotes
) + length
))
10362 warn (_("corrupt note found at offset %x into core notes\n"),
10363 ((char *) external
) - ((char *) pnotes
));
10364 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
10365 inote
.type
, inote
.namesz
, inote
.descsz
);
10371 /* Verify that name is null terminated. It appears that at least
10372 one version of Linux (RedHat 6.0) generates corefiles that don't
10373 comply with the ELF spec by failing to include the null byte in
10375 if (inote
.namedata
[inote
.namesz
] != '\0')
10377 temp
= malloc (inote
.namesz
+ 1);
10381 error (_("Out of memory\n"));
10386 strncpy (temp
, inote
.namedata
, inote
.namesz
);
10387 temp
[inote
.namesz
] = 0;
10389 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
10390 inote
.namedata
= temp
;
10393 res
&= process_note (& inote
);
10408 process_corefile_note_segments (FILE *file
)
10410 Elf_Internal_Phdr
*segment
;
10414 if (! get_program_headers (file
))
10417 for (i
= 0, segment
= program_headers
;
10418 i
< elf_header
.e_phnum
;
10421 if (segment
->p_type
== PT_NOTE
)
10422 res
&= process_corefile_note_segment (file
,
10423 (bfd_vma
) segment
->p_offset
,
10424 (bfd_vma
) segment
->p_filesz
);
10431 process_corefile_contents (FILE *file
)
10433 /* If we have not been asked to display the notes then do nothing. */
10437 /* If file is not a core file then exit. */
10438 if (elf_header
.e_type
!= ET_CORE
)
10441 /* No program headers means no NOTE segment. */
10442 if (elf_header
.e_phnum
== 0)
10444 printf (_("No note segments present in the core file.\n"));
10448 return process_corefile_note_segments (file
);
10452 process_arch_specific (FILE *file
)
10457 switch (elf_header
.e_machine
)
10460 case EM_MIPS_RS3_LE
:
10461 return process_mips_specific (file
);
10470 get_file_header (FILE *file
)
10472 /* Read in the identity array. */
10473 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
10476 /* Determine how to read the rest of the header. */
10477 switch (elf_header
.e_ident
[EI_DATA
])
10479 default: /* fall through */
10480 case ELFDATANONE
: /* fall through */
10482 byte_get
= byte_get_little_endian
;
10483 byte_put
= byte_put_little_endian
;
10486 byte_get
= byte_get_big_endian
;
10487 byte_put
= byte_put_big_endian
;
10491 /* For now we only support 32 bit and 64 bit ELF files. */
10492 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
10494 /* Read in the rest of the header. */
10497 Elf32_External_Ehdr ehdr32
;
10499 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
10502 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
10503 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
10504 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
10505 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
10506 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
10507 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
10508 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
10509 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
10510 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
10511 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
10512 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
10513 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
10514 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
10518 Elf64_External_Ehdr ehdr64
;
10520 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10521 we will not be able to cope with the 64bit data found in
10522 64 ELF files. Detect this now and abort before we start
10523 overwriting things. */
10524 if (sizeof (bfd_vma
) < 8)
10526 error (_("This instance of readelf has been built without support for a\n\
10527 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10531 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
10534 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
10535 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
10536 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
10537 elf_header
.e_entry
= BYTE_GET8 (ehdr64
.e_entry
);
10538 elf_header
.e_phoff
= BYTE_GET8 (ehdr64
.e_phoff
);
10539 elf_header
.e_shoff
= BYTE_GET8 (ehdr64
.e_shoff
);
10540 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
10541 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
10542 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
10543 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
10544 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
10545 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
10546 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
10549 if (elf_header
.e_shoff
)
10551 /* There may be some extensions in the first section header. Don't
10552 bomb if we can't read it. */
10554 get_32bit_section_headers (file
, 1);
10556 get_64bit_section_headers (file
, 1);
10562 /* Process one ELF object file according to the command line options.
10563 This file may actually be stored in an archive. The file is
10564 positioned at the start of the ELF object. */
10567 process_object (char *file_name
, FILE *file
)
10571 if (! get_file_header (file
))
10573 error (_("%s: Failed to read file header\n"), file_name
);
10577 /* Initialise per file variables. */
10578 for (i
= NUM_ELEM (version_info
); i
--;)
10579 version_info
[i
] = 0;
10581 for (i
= NUM_ELEM (dynamic_info
); i
--;)
10582 dynamic_info
[i
] = 0;
10584 /* Process the file. */
10586 printf (_("\nFile: %s\n"), file_name
);
10588 if (! process_file_header ())
10591 if (! process_section_headers (file
)
10592 || ! process_section_groups (file
))
10594 /* Without loaded section headers and section groups we
10595 cannot process lots of things. */
10596 do_unwind
= do_version
= do_dump
= do_arch
= 0;
10598 if (! do_using_dynamic
)
10599 do_syms
= do_reloc
= 0;
10602 if (process_program_headers (file
))
10603 process_dynamic_section (file
);
10605 process_relocs (file
);
10607 process_unwind (file
);
10609 process_symbol_table (file
);
10611 process_syminfo (file
);
10613 process_version_sections (file
);
10615 process_section_contents (file
);
10617 process_corefile_contents (file
);
10619 process_gnu_liblist (file
);
10621 process_arch_specific (file
);
10623 if (program_headers
)
10625 free (program_headers
);
10626 program_headers
= NULL
;
10629 if (section_headers
)
10631 free (section_headers
);
10632 section_headers
= NULL
;
10637 free (string_table
);
10638 string_table
= NULL
;
10639 string_table_length
= 0;
10642 if (dynamic_strings
)
10644 free (dynamic_strings
);
10645 dynamic_strings
= NULL
;
10648 if (dynamic_symbols
)
10650 free (dynamic_symbols
);
10651 dynamic_symbols
= NULL
;
10652 num_dynamic_syms
= 0;
10655 if (dynamic_syminfo
)
10657 free (dynamic_syminfo
);
10658 dynamic_syminfo
= NULL
;
10661 if (section_headers_groups
)
10663 free (section_headers_groups
);
10664 section_headers_groups
= NULL
;
10667 if (section_groups
)
10669 struct group_list
*g
, *next
;
10671 for (i
= 0; i
< group_count
; i
++)
10673 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
10680 free (section_groups
);
10681 section_groups
= NULL
;
10687 /* Process an ELF archive. The file is positioned just after the
10691 process_archive (char *file_name
, FILE *file
)
10693 struct ar_hdr arhdr
;
10695 unsigned long size
;
10696 char *longnames
= NULL
;
10697 unsigned long longnames_size
= 0;
10698 size_t file_name_size
;
10703 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10704 if (got
!= sizeof arhdr
)
10709 error (_("%s: failed to read archive header\n"), file_name
);
10713 if (memcmp (arhdr
.ar_name
, "/ ", 16) == 0)
10715 /* This is the archive symbol table. Skip it.
10716 FIXME: We should have an option to dump it. */
10717 size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10718 if (fseek (file
, size
+ (size
& 1), SEEK_CUR
) != 0)
10720 error (_("%s: failed to skip archive symbol table\n"), file_name
);
10724 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10725 if (got
!= sizeof arhdr
)
10730 error (_("%s: failed to read archive header\n"), file_name
);
10735 if (memcmp (arhdr
.ar_name
, "// ", 16) == 0)
10737 /* This is the archive string table holding long member
10740 longnames_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10742 longnames
= malloc (longnames_size
);
10743 if (longnames
== NULL
)
10745 error (_("Out of memory\n"));
10749 if (fread (longnames
, longnames_size
, 1, file
) != 1)
10752 error(_("%s: failed to read string table\n"), file_name
);
10756 if ((longnames_size
& 1) != 0)
10759 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10760 if (got
!= sizeof arhdr
)
10767 error (_("%s: failed to read archive header\n"), file_name
);
10772 file_name_size
= strlen (file_name
);
10781 if (arhdr
.ar_name
[0] == '/')
10785 off
= strtoul (arhdr
.ar_name
+ 1, NULL
, 10);
10786 if (off
>= longnames_size
)
10788 error (_("%s: invalid archive string table offset %lu\n"), off
);
10793 name
= longnames
+ off
;
10794 nameend
= memchr (name
, '/', longnames_size
- off
);
10798 name
= arhdr
.ar_name
;
10799 nameend
= memchr (name
, '/', 16);
10802 if (nameend
== NULL
)
10804 error (_("%s: bad archive file name\n"));
10809 namealc
= malloc (file_name_size
+ (nameend
- name
) + 3);
10810 if (namealc
== NULL
)
10812 error (_("Out of memory\n"));
10817 memcpy (namealc
, file_name
, file_name_size
);
10818 namealc
[file_name_size
] = '(';
10819 memcpy (namealc
+ file_name_size
+ 1, name
, nameend
- name
);
10820 namealc
[file_name_size
+ 1 + (nameend
- name
)] = ')';
10821 namealc
[file_name_size
+ 2 + (nameend
- name
)] = '\0';
10823 archive_file_offset
= ftell (file
);
10824 archive_file_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10826 ret
|= process_object (namealc
, file
);
10831 (archive_file_offset
10832 + archive_file_size
10833 + (archive_file_size
& 1)),
10836 error (_("%s: failed to seek to next archive header\n"), file_name
);
10841 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10842 if (got
!= sizeof arhdr
)
10847 error (_("%s: failed to read archive header\n"), file_name
);
10853 if (longnames
!= 0)
10860 process_file (char *file_name
)
10863 struct stat statbuf
;
10864 char armag
[SARMAG
];
10867 if (stat (file_name
, &statbuf
) < 0)
10869 if (errno
== ENOENT
)
10870 error (_("'%s': No such file\n"), file_name
);
10872 error (_("Could not locate '%s'. System error message: %s\n"),
10873 file_name
, strerror (errno
));
10877 if (! S_ISREG (statbuf
.st_mode
))
10879 error (_("'%s' is not an ordinary file\n"), file_name
);
10883 file
= fopen (file_name
, "rb");
10886 error (_("Input file '%s' is not readable.\n"), file_name
);
10890 if (fread (armag
, SARMAG
, 1, file
) != 1)
10892 error (_("%s: Failed to read file header\n"), file_name
);
10897 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
10898 ret
= process_archive (file_name
, file
);
10902 archive_file_size
= archive_file_offset
= 0;
10903 ret
= process_object (file_name
, file
);
10911 #ifdef SUPPORT_DISASSEMBLY
10912 /* Needed by the i386 disassembler. For extra credit, someone could
10913 fix this so that we insert symbolic addresses here, esp for GOT/PLT
10917 print_address (unsigned int addr
, FILE *outfile
)
10919 fprintf (outfile
,"0x%8.8x", addr
);
10922 /* Needed by the i386 disassembler. */
10924 db_task_printsym (unsigned int addr
)
10926 print_address (addr
, stderr
);
10931 main (int argc
, char **argv
)
10934 char *cmdline_dump_sects
= NULL
;
10935 unsigned num_cmdline_dump_sects
= 0;
10937 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
10938 setlocale (LC_MESSAGES
, "");
10940 #if defined (HAVE_SETLOCALE)
10941 setlocale (LC_CTYPE
, "");
10943 bindtextdomain (PACKAGE
, LOCALEDIR
);
10944 textdomain (PACKAGE
);
10946 parse_args (argc
, argv
);
10948 if (optind
< (argc
- 1))
10951 /* When processing more than one file remember the dump requests
10952 issued on command line to reset them after each file. */
10953 if (optind
+ 1 < argc
&& dump_sects
!= NULL
)
10955 cmdline_dump_sects
= malloc (num_dump_sects
);
10956 if (cmdline_dump_sects
== NULL
)
10957 error (_("Out of memory allocating dump request table."));
10960 memcpy (cmdline_dump_sects
, dump_sects
, num_dump_sects
);
10961 num_cmdline_dump_sects
= num_dump_sects
;
10966 while (optind
< argc
)
10968 err
|= process_file (argv
[optind
++]);
10970 /* Reset dump requests. */
10971 if (optind
< argc
&& dump_sects
!= NULL
)
10973 num_dump_sects
= num_cmdline_dump_sects
;
10974 if (num_cmdline_dump_sects
> 0)
10975 memcpy (dump_sects
, cmdline_dump_sects
, num_cmdline_dump_sects
);
10979 if (dump_sects
!= NULL
)
10981 if (cmdline_dump_sects
!= NULL
)
10982 free (cmdline_dump_sects
);