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"
108 #include "elf/iq2000.h"
109 #include "elf/xtensa.h"
115 #include "libiberty.h"
117 char *program_name
= "readelf";
118 long archive_file_offset
;
119 unsigned long archive_file_size
;
120 unsigned long dynamic_addr
;
121 bfd_size_type dynamic_size
;
122 char *dynamic_strings
;
124 unsigned long string_table_length
;
125 unsigned long num_dynamic_syms
;
126 Elf_Internal_Sym
*dynamic_symbols
;
127 Elf_Internal_Syminfo
*dynamic_syminfo
;
128 unsigned long dynamic_syminfo_offset
;
129 unsigned int dynamic_syminfo_nent
;
130 char program_interpreter
[64];
131 bfd_vma dynamic_info
[DT_JMPREL
+ 1];
132 bfd_vma version_info
[16];
133 Elf_Internal_Ehdr elf_header
;
134 Elf_Internal_Shdr
*section_headers
;
135 Elf_Internal_Phdr
*program_headers
;
136 Elf_Internal_Dyn
*dynamic_section
;
137 Elf_Internal_Shdr
*symtab_shndx_hdr
;
143 int do_section_groups
;
146 int do_using_dynamic
;
154 int do_debug_abbrevs
;
156 int do_debug_pubnames
;
157 int do_debug_aranges
;
159 int do_debug_frames_interp
;
160 int do_debug_macinfo
;
169 struct group_list
*next
;
170 unsigned int section_index
;
175 struct group_list
*root
;
176 unsigned int group_index
;
179 struct group
*section_groups
;
180 size_t group_count
= 0;
182 struct group
**section_headers_groups
;
184 /* A dynamic array of flags indicating which sections require dumping. */
185 char *dump_sects
= NULL
;
186 unsigned int num_dump_sects
= 0;
188 #define HEX_DUMP (1 << 0)
189 #define DISASS_DUMP (1 << 1)
190 #define DEBUG_DUMP (1 << 2)
192 /* How to rpint a vma value. */
193 typedef enum print_mode
205 static bfd_vma (*byte_get
) (unsigned char *, int);
206 static void (*byte_put
) (unsigned char *, bfd_vma
, int);
208 typedef int Elf32_Word
;
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
:
709 warn (_("Don't know about relocations on this machine architecture\n"));
715 slurp_rela_relocs (FILE *file
,
716 unsigned long rel_offset
,
717 unsigned long rel_size
,
718 Elf_Internal_Rela
**relasp
,
719 unsigned long *nrelasp
)
721 Elf_Internal_Rela
*relas
;
722 unsigned long nrelas
;
727 Elf32_External_Rela
*erelas
;
729 erelas
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
733 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
735 relas
= malloc (nrelas
* sizeof (Elf_Internal_Rela
));
739 error(_("out of memory parsing relocs"));
743 for (i
= 0; i
< nrelas
; i
++)
745 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
746 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
747 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
754 Elf64_External_Rela
*erelas
;
756 erelas
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
760 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
762 relas
= malloc (nrelas
* sizeof (Elf_Internal_Rela
));
766 error(_("out of memory parsing relocs"));
770 for (i
= 0; i
< nrelas
; i
++)
772 relas
[i
].r_offset
= BYTE_GET8 (erelas
[i
].r_offset
);
773 relas
[i
].r_info
= BYTE_GET8 (erelas
[i
].r_info
);
774 relas
[i
].r_addend
= BYTE_GET8 (erelas
[i
].r_addend
);
785 slurp_rel_relocs (FILE *file
,
786 unsigned long rel_offset
,
787 unsigned long rel_size
,
788 Elf_Internal_Rela
**relsp
,
789 unsigned long *nrelsp
)
791 Elf_Internal_Rela
*rels
;
797 Elf32_External_Rel
*erels
;
799 erels
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
803 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
805 rels
= malloc (nrels
* sizeof (Elf_Internal_Rela
));
809 error(_("out of memory parsing relocs"));
813 for (i
= 0; i
< nrels
; i
++)
815 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
816 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
817 rels
[i
].r_addend
= 0;
824 Elf64_External_Rel
*erels
;
826 erels
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
830 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
832 rels
= malloc (nrels
* sizeof (Elf_Internal_Rela
));
836 error(_("out of memory parsing relocs"));
840 for (i
= 0; i
< nrels
; i
++)
842 rels
[i
].r_offset
= BYTE_GET8 (erels
[i
].r_offset
);
843 rels
[i
].r_info
= BYTE_GET8 (erels
[i
].r_info
);
844 rels
[i
].r_addend
= 0;
854 /* Display the contents of the relocation data found at the specified
858 dump_relocations (FILE *file
,
859 unsigned long rel_offset
,
860 unsigned long rel_size
,
861 Elf_Internal_Sym
*symtab
,
867 Elf_Internal_Rela
*rels
;
870 if (is_rela
== UNKNOWN
)
871 is_rela
= guess_is_rela (elf_header
.e_machine
);
875 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
880 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
889 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
891 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
896 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
898 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
906 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
908 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
913 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
915 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
919 for (i
= 0; i
< rel_size
; i
++)
922 const char *rtype2
= NULL
;
923 const char *rtype3
= NULL
;
926 bfd_vma symtab_index
;
931 offset
= rels
[i
].r_offset
;
932 info
= rels
[i
].r_info
;
936 type
= ELF32_R_TYPE (info
);
937 symtab_index
= ELF32_R_SYM (info
);
941 /* The #ifdef BFD64 below is to prevent a compile time warning.
942 We know that if we do not have a 64 bit data type that we
943 will never execute this code anyway. */
945 if (elf_header
.e_machine
== EM_MIPS
)
947 /* In little-endian objects, r_info isn't really a 64-bit
948 little-endian value: it has a 32-bit little-endian
949 symbol index followed by four individual byte fields.
950 Reorder INFO accordingly. */
951 if (elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
952 info
= (((info
& 0xffffffff) << 32)
953 | ((info
>> 56) & 0xff)
954 | ((info
>> 40) & 0xff00)
955 | ((info
>> 24) & 0xff0000)
956 | ((info
>> 8) & 0xff000000));
957 type
= ELF64_MIPS_R_TYPE (info
);
958 type2
= ELF64_MIPS_R_TYPE2 (info
);
959 type3
= ELF64_MIPS_R_TYPE3 (info
);
961 else if (elf_header
.e_machine
== EM_SPARCV9
)
962 type
= ELF64_R_TYPE_ID (info
);
964 type
= ELF64_R_TYPE (info
);
966 symtab_index
= ELF64_R_SYM (info
);
972 #ifdef _bfd_int64_low
973 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
975 printf ("%8.8lx %8.8lx ", offset
, info
);
980 #ifdef _bfd_int64_low
982 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
983 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
984 _bfd_int64_high (offset
),
985 _bfd_int64_low (offset
),
986 _bfd_int64_high (info
),
987 _bfd_int64_low (info
));
990 ? "%16.16lx %16.16lx "
991 : "%12.12lx %12.12lx ",
996 switch (elf_header
.e_machine
)
1003 case EM_CYGNUS_M32R
:
1004 rtype
= elf_m32r_reloc_type (type
);
1009 rtype
= elf_i386_reloc_type (type
);
1014 rtype
= elf_m68hc11_reloc_type (type
);
1018 rtype
= elf_m68k_reloc_type (type
);
1022 rtype
= elf_i960_reloc_type (type
);
1027 rtype
= elf_avr_reloc_type (type
);
1030 case EM_OLD_SPARCV9
:
1031 case EM_SPARC32PLUS
:
1034 rtype
= elf_sparc_reloc_type (type
);
1038 case EM_CYGNUS_V850
:
1039 rtype
= v850_reloc_type (type
);
1043 case EM_CYGNUS_D10V
:
1044 rtype
= elf_d10v_reloc_type (type
);
1048 case EM_CYGNUS_D30V
:
1049 rtype
= elf_d30v_reloc_type (type
);
1053 rtype
= elf_dlx_reloc_type (type
);
1057 rtype
= elf_sh_reloc_type (type
);
1061 case EM_CYGNUS_MN10300
:
1062 rtype
= elf_mn10300_reloc_type (type
);
1066 case EM_CYGNUS_MN10200
:
1067 rtype
= elf_mn10200_reloc_type (type
);
1071 case EM_CYGNUS_FR30
:
1072 rtype
= elf_fr30_reloc_type (type
);
1076 rtype
= elf_frv_reloc_type (type
);
1080 rtype
= elf_mcore_reloc_type (type
);
1084 rtype
= elf_mmix_reloc_type (type
);
1089 rtype
= elf_msp430_reloc_type (type
);
1093 rtype
= elf_ppc_reloc_type (type
);
1097 rtype
= elf_ppc64_reloc_type (type
);
1101 case EM_MIPS_RS3_LE
:
1102 rtype
= elf_mips_reloc_type (type
);
1105 rtype2
= elf_mips_reloc_type (type2
);
1106 rtype3
= elf_mips_reloc_type (type3
);
1111 rtype
= elf_alpha_reloc_type (type
);
1115 rtype
= elf_arm_reloc_type (type
);
1119 rtype
= elf_arc_reloc_type (type
);
1123 rtype
= elf_hppa_reloc_type (type
);
1129 rtype
= elf_h8_reloc_type (type
);
1134 rtype
= elf_or32_reloc_type (type
);
1139 rtype
= elf_pj_reloc_type (type
);
1142 rtype
= elf_ia64_reloc_type (type
);
1146 rtype
= elf_cris_reloc_type (type
);
1150 rtype
= elf_i860_reloc_type (type
);
1154 rtype
= elf_x86_64_reloc_type (type
);
1158 rtype
= i370_reloc_type (type
);
1163 rtype
= elf_s390_reloc_type (type
);
1167 rtype
= elf_xstormy16_reloc_type (type
);
1171 rtype
= elf_vax_reloc_type (type
);
1176 rtype
= elf_ip2k_reloc_type (type
);
1180 rtype
= elf_iq2000_reloc_type (type
);
1185 rtype
= elf_xtensa_reloc_type (type
);
1190 #ifdef _bfd_int64_low
1191 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type
));
1193 printf (_("unrecognized: %-7lx"), type
);
1196 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1200 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1201 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1204 Elf_Internal_Sym
*psym
;
1206 psym
= symtab
+ symtab_index
;
1209 print_vma (psym
->st_value
, LONG_HEX
);
1210 printf (is_32bit_elf
? " " : " ");
1212 if (psym
->st_name
== 0)
1214 const char *sec_name
= "<null>";
1217 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1219 bfd_vma sec_index
= (bfd_vma
) -1;
1221 if (psym
->st_shndx
< SHN_LORESERVE
)
1222 sec_index
= psym
->st_shndx
;
1223 else if (psym
->st_shndx
> SHN_LORESERVE
)
1224 sec_index
= psym
->st_shndx
- (SHN_HIRESERVE
+ 1
1227 if (sec_index
!= (bfd_vma
) -1)
1228 sec_name
= SECTION_NAME (section_headers
+ sec_index
);
1229 else if (psym
->st_shndx
== SHN_ABS
)
1231 else if (psym
->st_shndx
== SHN_COMMON
)
1232 sec_name
= "COMMON";
1233 else if (elf_header
.e_machine
== EM_IA_64
1234 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1235 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1236 sec_name
= "ANSI_COM";
1239 sprintf (name_buf
, "<section 0x%x>",
1240 (unsigned int) psym
->st_shndx
);
1241 sec_name
= name_buf
;
1244 print_symbol (22, sec_name
);
1246 else if (strtab
== NULL
)
1247 printf (_("<string table index %3ld>"), psym
->st_name
);
1249 print_symbol (22, strtab
+ psym
->st_name
);
1252 printf (" + %lx", (unsigned long) rels
[i
].r_addend
);
1257 printf ("%*c", is_32bit_elf
? (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1258 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1261 if (elf_header
.e_machine
== EM_SPARCV9
1262 && !strcmp (rtype
, "R_SPARC_OLO10"))
1263 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1267 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1269 printf (" Type2: ");
1272 #ifdef _bfd_int64_low
1273 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2
));
1275 printf (_("unrecognized: %-7lx"), type2
);
1278 printf ("%-17.17s", rtype2
);
1280 printf("\n Type3: ");
1283 #ifdef _bfd_int64_low
1284 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3
));
1286 printf (_("unrecognized: %-7lx"), type3
);
1289 printf ("%-17.17s", rtype3
);
1301 get_mips_dynamic_type (unsigned long type
)
1305 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1306 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1307 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1308 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1309 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1310 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1311 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1312 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1313 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1314 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1315 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1316 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1317 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1318 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1319 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1320 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1321 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1322 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1323 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1324 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1325 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1326 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1327 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1328 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1329 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1330 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1331 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1332 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1333 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1334 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1335 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1336 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1337 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1338 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1339 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1340 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1341 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1342 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1343 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1344 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1345 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1346 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1347 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1354 get_sparc64_dynamic_type (unsigned long type
)
1358 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1365 get_ppc64_dynamic_type (unsigned long type
)
1369 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1370 case DT_PPC64_OPD
: return "PPC64_OPD";
1371 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1378 get_parisc_dynamic_type (unsigned long type
)
1382 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1383 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1384 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1385 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1386 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1387 case DT_HP_PREINIT
: return "HP_PREINIT";
1388 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1389 case DT_HP_NEEDED
: return "HP_NEEDED";
1390 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1391 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1392 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1393 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1394 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1401 get_ia64_dynamic_type (unsigned long type
)
1405 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1412 get_dynamic_type (unsigned long type
)
1414 static char buff
[32];
1418 case DT_NULL
: return "NULL";
1419 case DT_NEEDED
: return "NEEDED";
1420 case DT_PLTRELSZ
: return "PLTRELSZ";
1421 case DT_PLTGOT
: return "PLTGOT";
1422 case DT_HASH
: return "HASH";
1423 case DT_STRTAB
: return "STRTAB";
1424 case DT_SYMTAB
: return "SYMTAB";
1425 case DT_RELA
: return "RELA";
1426 case DT_RELASZ
: return "RELASZ";
1427 case DT_RELAENT
: return "RELAENT";
1428 case DT_STRSZ
: return "STRSZ";
1429 case DT_SYMENT
: return "SYMENT";
1430 case DT_INIT
: return "INIT";
1431 case DT_FINI
: return "FINI";
1432 case DT_SONAME
: return "SONAME";
1433 case DT_RPATH
: return "RPATH";
1434 case DT_SYMBOLIC
: return "SYMBOLIC";
1435 case DT_REL
: return "REL";
1436 case DT_RELSZ
: return "RELSZ";
1437 case DT_RELENT
: return "RELENT";
1438 case DT_PLTREL
: return "PLTREL";
1439 case DT_DEBUG
: return "DEBUG";
1440 case DT_TEXTREL
: return "TEXTREL";
1441 case DT_JMPREL
: return "JMPREL";
1442 case DT_BIND_NOW
: return "BIND_NOW";
1443 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1444 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1445 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1446 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1447 case DT_RUNPATH
: return "RUNPATH";
1448 case DT_FLAGS
: return "FLAGS";
1450 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1451 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1453 case DT_CHECKSUM
: return "CHECKSUM";
1454 case DT_PLTPADSZ
: return "PLTPADSZ";
1455 case DT_MOVEENT
: return "MOVEENT";
1456 case DT_MOVESZ
: return "MOVESZ";
1457 case DT_FEATURE
: return "FEATURE";
1458 case DT_POSFLAG_1
: return "POSFLAG_1";
1459 case DT_SYMINSZ
: return "SYMINSZ";
1460 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1462 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1463 case DT_CONFIG
: return "CONFIG";
1464 case DT_DEPAUDIT
: return "DEPAUDIT";
1465 case DT_AUDIT
: return "AUDIT";
1466 case DT_PLTPAD
: return "PLTPAD";
1467 case DT_MOVETAB
: return "MOVETAB";
1468 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1470 case DT_VERSYM
: return "VERSYM";
1472 case DT_RELACOUNT
: return "RELACOUNT";
1473 case DT_RELCOUNT
: return "RELCOUNT";
1474 case DT_FLAGS_1
: return "FLAGS_1";
1475 case DT_VERDEF
: return "VERDEF";
1476 case DT_VERDEFNUM
: return "VERDEFNUM";
1477 case DT_VERNEED
: return "VERNEED";
1478 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1480 case DT_AUXILIARY
: return "AUXILIARY";
1481 case DT_USED
: return "USED";
1482 case DT_FILTER
: return "FILTER";
1484 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1485 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1486 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1487 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1488 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1491 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1495 switch (elf_header
.e_machine
)
1498 case EM_MIPS_RS3_LE
:
1499 result
= get_mips_dynamic_type (type
);
1502 result
= get_sparc64_dynamic_type (type
);
1505 result
= get_ppc64_dynamic_type (type
);
1508 result
= get_ia64_dynamic_type (type
);
1518 sprintf (buff
, _("Processor Specific: %lx"), type
);
1520 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1524 switch (elf_header
.e_machine
)
1527 result
= get_parisc_dynamic_type (type
);
1537 sprintf (buff
, _("Operating System specific: %lx"), type
);
1540 sprintf (buff
, _("<unknown>: %lx"), type
);
1547 get_file_type (unsigned e_type
)
1549 static char buff
[32];
1553 case ET_NONE
: return _("NONE (None)");
1554 case ET_REL
: return _("REL (Relocatable file)");
1555 case ET_EXEC
: return _("EXEC (Executable file)");
1556 case ET_DYN
: return _("DYN (Shared object file)");
1557 case ET_CORE
: return _("CORE (Core file)");
1560 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1561 sprintf (buff
, _("Processor Specific: (%x)"), e_type
);
1562 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1563 sprintf (buff
, _("OS Specific: (%x)"), e_type
);
1565 sprintf (buff
, _("<unknown>: %x"), e_type
);
1571 get_machine_name (unsigned e_machine
)
1573 static char buff
[64]; /* XXX */
1577 case EM_NONE
: return _("None");
1578 case EM_M32
: return "WE32100";
1579 case EM_SPARC
: return "Sparc";
1580 case EM_386
: return "Intel 80386";
1581 case EM_68K
: return "MC68000";
1582 case EM_88K
: return "MC88000";
1583 case EM_486
: return "Intel 80486";
1584 case EM_860
: return "Intel 80860";
1585 case EM_MIPS
: return "MIPS R3000";
1586 case EM_S370
: return "IBM System/370";
1587 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1588 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1589 case EM_PARISC
: return "HPPA";
1590 case EM_PPC_OLD
: return "Power PC (old)";
1591 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1592 case EM_960
: return "Intel 90860";
1593 case EM_PPC
: return "PowerPC";
1594 case EM_PPC64
: return "PowerPC64";
1595 case EM_V800
: return "NEC V800";
1596 case EM_FR20
: return "Fujitsu FR20";
1597 case EM_RH32
: return "TRW RH32";
1598 case EM_MCORE
: return "MCORE";
1599 case EM_ARM
: return "ARM";
1600 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1601 case EM_SH
: return "Renesas / SuperH SH";
1602 case EM_SPARCV9
: return "Sparc v9";
1603 case EM_TRICORE
: return "Siemens Tricore";
1604 case EM_ARC
: return "ARC";
1605 case EM_H8_300
: return "Renesas H8/300";
1606 case EM_H8_300H
: return "Renesas H8/300H";
1607 case EM_H8S
: return "Renesas H8S";
1608 case EM_H8_500
: return "Renesas H8/500";
1609 case EM_IA_64
: return "Intel IA-64";
1610 case EM_MIPS_X
: return "Stanford MIPS-X";
1611 case EM_COLDFIRE
: return "Motorola Coldfire";
1612 case EM_68HC12
: return "Motorola M68HC12";
1613 case EM_ALPHA
: return "Alpha";
1614 case EM_CYGNUS_D10V
:
1615 case EM_D10V
: return "d10v";
1616 case EM_CYGNUS_D30V
:
1617 case EM_D30V
: return "d30v";
1618 case EM_CYGNUS_M32R
:
1619 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
1620 case EM_CYGNUS_V850
:
1621 case EM_V850
: return "NEC v850";
1622 case EM_CYGNUS_MN10300
:
1623 case EM_MN10300
: return "mn10300";
1624 case EM_CYGNUS_MN10200
:
1625 case EM_MN10200
: return "mn10200";
1626 case EM_CYGNUS_FR30
:
1627 case EM_FR30
: return "Fujitsu FR30";
1628 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1630 case EM_PJ
: return "picoJava";
1631 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1632 case EM_PCP
: return "Siemens PCP";
1633 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1634 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1635 case EM_STARCORE
: return "Motorola Star*Core processor";
1636 case EM_ME16
: return "Toyota ME16 processor";
1637 case EM_ST100
: return "STMicroelectronics ST100 processor";
1638 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1639 case EM_FX66
: return "Siemens FX66 microcontroller";
1640 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1641 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1642 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1643 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1644 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1645 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1646 case EM_SVX
: return "Silicon Graphics SVx";
1647 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1648 case EM_VAX
: return "Digital VAX";
1650 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1651 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1652 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1653 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1654 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1655 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1656 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1657 case EM_PRISM
: return "Vitesse Prism";
1658 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1660 case EM_S390
: return "IBM S/390";
1661 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1663 case EM_OR32
: return "OpenRISC";
1664 case EM_DLX
: return "OpenDLX";
1666 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1667 case EM_IQ2000
: return "Vitesse IQ2000";
1669 case EM_XTENSA
: return "Tensilica Xtensa Processor";
1671 sprintf (buff
, _("<unknown>: %x"), e_machine
);
1677 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
1682 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1683 e_flags
&= ~ EF_ARM_EABIMASK
;
1685 /* Handle "generic" ARM flags. */
1686 if (e_flags
& EF_ARM_RELEXEC
)
1688 strcat (buf
, ", relocatable executable");
1689 e_flags
&= ~ EF_ARM_RELEXEC
;
1692 if (e_flags
& EF_ARM_HASENTRY
)
1694 strcat (buf
, ", has entry point");
1695 e_flags
&= ~ EF_ARM_HASENTRY
;
1698 /* Now handle EABI specific flags. */
1702 strcat (buf
, ", <unrecognized EABI>");
1707 case EF_ARM_EABI_VER1
:
1708 strcat (buf
, ", Version1 EABI");
1713 /* Process flags one bit at a time. */
1714 flag
= e_flags
& - e_flags
;
1719 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1720 strcat (buf
, ", sorted symbol tables");
1730 case EF_ARM_EABI_VER2
:
1731 strcat (buf
, ", Version2 EABI");
1736 /* Process flags one bit at a time. */
1737 flag
= e_flags
& - e_flags
;
1742 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1743 strcat (buf
, ", sorted symbol tables");
1746 case EF_ARM_DYNSYMSUSESEGIDX
:
1747 strcat (buf
, ", dynamic symbols use segment index");
1750 case EF_ARM_MAPSYMSFIRST
:
1751 strcat (buf
, ", mapping symbols precede others");
1761 case EF_ARM_EABI_VER3
:
1762 strcat (buf
, ", Version3 EABI");
1767 /* Process flags one bit at a time. */
1768 flag
= e_flags
& - e_flags
;
1774 strcat (buf
, ", BE8");
1778 strcat (buf
, ", LE8");
1788 case EF_ARM_EABI_UNKNOWN
:
1789 strcat (buf
, ", GNU EABI");
1794 /* Process flags one bit at a time. */
1795 flag
= e_flags
& - e_flags
;
1800 case EF_ARM_INTERWORK
:
1801 strcat (buf
, ", interworking enabled");
1804 case EF_ARM_APCS_26
:
1805 strcat (buf
, ", uses APCS/26");
1808 case EF_ARM_APCS_FLOAT
:
1809 strcat (buf
, ", uses APCS/float");
1813 strcat (buf
, ", position independent");
1817 strcat (buf
, ", 8 bit structure alignment");
1820 case EF_ARM_NEW_ABI
:
1821 strcat (buf
, ", uses new ABI");
1824 case EF_ARM_OLD_ABI
:
1825 strcat (buf
, ", uses old ABI");
1828 case EF_ARM_SOFT_FLOAT
:
1829 strcat (buf
, ", software FP");
1832 case EF_ARM_VFP_FLOAT
:
1833 strcat (buf
, ", VFP");
1836 case EF_ARM_MAVERICK_FLOAT
:
1837 strcat (buf
, ", Maverick FP");
1848 strcat (buf
,", <unknown>");
1852 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
1854 static char buf
[1024];
1866 decode_ARM_machine_flags (e_flags
, buf
);
1870 if (e_flags
& EF_CPU32
)
1871 strcat (buf
, ", cpu32");
1872 if (e_flags
& EF_M68000
)
1873 strcat (buf
, ", m68000");
1877 if (e_flags
& EF_PPC_EMB
)
1878 strcat (buf
, ", emb");
1880 if (e_flags
& EF_PPC_RELOCATABLE
)
1881 strcat (buf
, ", relocatable");
1883 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
1884 strcat (buf
, ", relocatable-lib");
1888 case EM_CYGNUS_V850
:
1889 switch (e_flags
& EF_V850_ARCH
)
1892 strcat (buf
, ", v850e1");
1895 strcat (buf
, ", v850e");
1898 strcat (buf
, ", v850");
1901 strcat (buf
, ", unknown v850 architecture variant");
1907 case EM_CYGNUS_M32R
:
1908 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
1909 strcat (buf
, ", m32r");
1914 case EM_MIPS_RS3_LE
:
1915 if (e_flags
& EF_MIPS_NOREORDER
)
1916 strcat (buf
, ", noreorder");
1918 if (e_flags
& EF_MIPS_PIC
)
1919 strcat (buf
, ", pic");
1921 if (e_flags
& EF_MIPS_CPIC
)
1922 strcat (buf
, ", cpic");
1924 if (e_flags
& EF_MIPS_UCODE
)
1925 strcat (buf
, ", ugen_reserved");
1927 if (e_flags
& EF_MIPS_ABI2
)
1928 strcat (buf
, ", abi2");
1930 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
1931 strcat (buf
, ", odk first");
1933 if (e_flags
& EF_MIPS_32BITMODE
)
1934 strcat (buf
, ", 32bitmode");
1936 switch ((e_flags
& EF_MIPS_MACH
))
1938 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
1939 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
1940 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
1941 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
1942 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
1943 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
1944 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
1945 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
1946 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
1948 /* We simply ignore the field in this case to avoid confusion:
1949 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
1952 default: strcat (buf
, ", unknown CPU"); break;
1955 switch ((e_flags
& EF_MIPS_ABI
))
1957 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
1958 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
1959 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
1960 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
1962 /* We simply ignore the field in this case to avoid confusion:
1963 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
1964 This means it is likely to be an o32 file, but not for
1967 default: strcat (buf
, ", unknown ABI"); break;
1970 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
1971 strcat (buf
, ", mdmx");
1973 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
1974 strcat (buf
, ", mips16");
1976 switch ((e_flags
& EF_MIPS_ARCH
))
1978 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
1979 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
1980 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
1981 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
1982 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
1983 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
1984 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
1985 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
1986 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
1987 default: strcat (buf
, ", unknown ISA"); break;
1993 if (e_flags
& EF_SPARC_32PLUS
)
1994 strcat (buf
, ", v8+");
1996 if (e_flags
& EF_SPARC_SUN_US1
)
1997 strcat (buf
, ", ultrasparcI");
1999 if (e_flags
& EF_SPARC_SUN_US3
)
2000 strcat (buf
, ", ultrasparcIII");
2002 if (e_flags
& EF_SPARC_HAL_R1
)
2003 strcat (buf
, ", halr1");
2005 if (e_flags
& EF_SPARC_LEDATA
)
2006 strcat (buf
, ", ledata");
2008 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2009 strcat (buf
, ", tso");
2011 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2012 strcat (buf
, ", pso");
2014 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2015 strcat (buf
, ", rmo");
2019 switch (e_flags
& EF_PARISC_ARCH
)
2021 case EFA_PARISC_1_0
:
2022 strcpy (buf
, ", PA-RISC 1.0");
2024 case EFA_PARISC_1_1
:
2025 strcpy (buf
, ", PA-RISC 1.1");
2027 case EFA_PARISC_2_0
:
2028 strcpy (buf
, ", PA-RISC 2.0");
2033 if (e_flags
& EF_PARISC_TRAPNIL
)
2034 strcat (buf
, ", trapnil");
2035 if (e_flags
& EF_PARISC_EXT
)
2036 strcat (buf
, ", ext");
2037 if (e_flags
& EF_PARISC_LSB
)
2038 strcat (buf
, ", lsb");
2039 if (e_flags
& EF_PARISC_WIDE
)
2040 strcat (buf
, ", wide");
2041 if (e_flags
& EF_PARISC_NO_KABP
)
2042 strcat (buf
, ", no kabp");
2043 if (e_flags
& EF_PARISC_LAZYSWAP
)
2044 strcat (buf
, ", lazyswap");
2049 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2050 strcat (buf
, ", new calling convention");
2052 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2053 strcat (buf
, ", gnu calling convention");
2057 if ((e_flags
& EF_IA_64_ABI64
))
2058 strcat (buf
, ", 64-bit");
2060 strcat (buf
, ", 32-bit");
2061 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2062 strcat (buf
, ", reduced fp model");
2063 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2064 strcat (buf
, ", no function descriptors, constant gp");
2065 else if ((e_flags
& EF_IA_64_CONS_GP
))
2066 strcat (buf
, ", constant gp");
2067 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2068 strcat (buf
, ", absolute");
2072 if ((e_flags
& EF_VAX_NONPIC
))
2073 strcat (buf
, ", non-PIC");
2074 if ((e_flags
& EF_VAX_DFLOAT
))
2075 strcat (buf
, ", D-Float");
2076 if ((e_flags
& EF_VAX_GFLOAT
))
2077 strcat (buf
, ", G-Float");
2086 get_osabi_name (unsigned int osabi
)
2088 static char buff
[32];
2092 case ELFOSABI_NONE
: return "UNIX - System V";
2093 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2094 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2095 case ELFOSABI_LINUX
: return "UNIX - Linux";
2096 case ELFOSABI_HURD
: return "GNU/Hurd";
2097 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2098 case ELFOSABI_AIX
: return "UNIX - AIX";
2099 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2100 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2101 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2102 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2103 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2104 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2105 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2106 case ELFOSABI_AROS
: return "Amiga Research OS";
2107 case ELFOSABI_STANDALONE
: return _("Standalone App");
2108 case ELFOSABI_ARM
: return "ARM";
2110 sprintf (buff
, _("<unknown: %x>"), osabi
);
2116 get_mips_segment_type (unsigned long type
)
2120 case PT_MIPS_REGINFO
:
2122 case PT_MIPS_RTPROC
:
2124 case PT_MIPS_OPTIONS
:
2134 get_parisc_segment_type (unsigned long type
)
2138 case PT_HP_TLS
: return "HP_TLS";
2139 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2140 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2141 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2142 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2143 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2144 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2145 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2146 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2147 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2148 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2149 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2150 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2151 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2160 get_ia64_segment_type (unsigned long type
)
2164 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2165 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2166 case PT_HP_TLS
: return "HP_TLS";
2167 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2168 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2169 case PT_IA_64_HP_STACK
: return "HP_STACK";
2178 get_segment_type (unsigned long p_type
)
2180 static char buff
[32];
2184 case PT_NULL
: return "NULL";
2185 case PT_LOAD
: return "LOAD";
2186 case PT_DYNAMIC
: return "DYNAMIC";
2187 case PT_INTERP
: return "INTERP";
2188 case PT_NOTE
: return "NOTE";
2189 case PT_SHLIB
: return "SHLIB";
2190 case PT_PHDR
: return "PHDR";
2191 case PT_TLS
: return "TLS";
2193 case PT_GNU_EH_FRAME
:
2194 return "GNU_EH_FRAME";
2195 case PT_GNU_STACK
: return "STACK";
2196 case PT_GNU_RELRO
: return "GNU_RELRO";
2199 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2203 switch (elf_header
.e_machine
)
2206 case EM_MIPS_RS3_LE
:
2207 result
= get_mips_segment_type (p_type
);
2210 result
= get_parisc_segment_type (p_type
);
2213 result
= get_ia64_segment_type (p_type
);
2223 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2225 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2229 switch (elf_header
.e_machine
)
2232 result
= get_parisc_segment_type (p_type
);
2235 result
= get_ia64_segment_type (p_type
);
2245 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2248 sprintf (buff
, _("<unknown>: %lx"), p_type
);
2255 get_mips_section_type_name (unsigned int sh_type
)
2259 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2260 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2261 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2262 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2263 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2264 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2265 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2266 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2267 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2268 case SHT_MIPS_RELD
: return "MIPS_RELD";
2269 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2270 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2271 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2272 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2273 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2274 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2275 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2276 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2277 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2278 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2279 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2280 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2281 case SHT_MIPS_LINE
: return "MIPS_LINE";
2282 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2283 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2284 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2285 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2286 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2287 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2288 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2289 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2290 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2291 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2292 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2293 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2294 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2295 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2296 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2297 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2305 get_parisc_section_type_name (unsigned int sh_type
)
2309 case SHT_PARISC_EXT
: return "PARISC_EXT";
2310 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2311 case SHT_PARISC_DOC
: return "PARISC_DOC";
2319 get_ia64_section_type_name (unsigned int sh_type
)
2321 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2322 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2323 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2327 case SHT_IA_64_EXT
: return "IA_64_EXT";
2328 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2329 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2337 get_section_type_name (unsigned int sh_type
)
2339 static char buff
[32];
2343 case SHT_NULL
: return "NULL";
2344 case SHT_PROGBITS
: return "PROGBITS";
2345 case SHT_SYMTAB
: return "SYMTAB";
2346 case SHT_STRTAB
: return "STRTAB";
2347 case SHT_RELA
: return "RELA";
2348 case SHT_HASH
: return "HASH";
2349 case SHT_DYNAMIC
: return "DYNAMIC";
2350 case SHT_NOTE
: return "NOTE";
2351 case SHT_NOBITS
: return "NOBITS";
2352 case SHT_REL
: return "REL";
2353 case SHT_SHLIB
: return "SHLIB";
2354 case SHT_DYNSYM
: return "DYNSYM";
2355 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2356 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2357 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2358 case SHT_GROUP
: return "GROUP";
2359 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2360 case SHT_GNU_verdef
: return "VERDEF";
2361 case SHT_GNU_verneed
: return "VERNEED";
2362 case SHT_GNU_versym
: return "VERSYM";
2363 case 0x6ffffff0: return "VERSYM";
2364 case 0x6ffffffc: return "VERDEF";
2365 case 0x7ffffffd: return "AUXILIARY";
2366 case 0x7fffffff: return "FILTER";
2367 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2370 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2374 switch (elf_header
.e_machine
)
2377 case EM_MIPS_RS3_LE
:
2378 result
= get_mips_section_type_name (sh_type
);
2381 result
= get_parisc_section_type_name (sh_type
);
2384 result
= get_ia64_section_type_name (sh_type
);
2394 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2396 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2397 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2398 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2399 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2401 sprintf (buff
, _("<unknown>: %x"), sh_type
);
2407 #define OPTION_DEBUG_DUMP 512
2409 struct option options
[] =
2411 {"all", no_argument
, 0, 'a'},
2412 {"file-header", no_argument
, 0, 'h'},
2413 {"program-headers", no_argument
, 0, 'l'},
2414 {"headers", no_argument
, 0, 'e'},
2415 {"histogram", no_argument
, 0, 'I'},
2416 {"segments", no_argument
, 0, 'l'},
2417 {"sections", no_argument
, 0, 'S'},
2418 {"section-headers", no_argument
, 0, 'S'},
2419 {"section-groups", no_argument
, 0, 'g'},
2420 {"symbols", no_argument
, 0, 's'},
2421 {"syms", no_argument
, 0, 's'},
2422 {"relocs", no_argument
, 0, 'r'},
2423 {"notes", no_argument
, 0, 'n'},
2424 {"dynamic", no_argument
, 0, 'd'},
2425 {"arch-specific", no_argument
, 0, 'A'},
2426 {"version-info", no_argument
, 0, 'V'},
2427 {"use-dynamic", no_argument
, 0, 'D'},
2428 {"hex-dump", required_argument
, 0, 'x'},
2429 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2430 {"unwind", no_argument
, 0, 'u'},
2431 #ifdef SUPPORT_DISASSEMBLY
2432 {"instruction-dump", required_argument
, 0, 'i'},
2435 {"version", no_argument
, 0, 'v'},
2436 {"wide", no_argument
, 0, 'W'},
2437 {"help", no_argument
, 0, 'H'},
2438 {0, no_argument
, 0, 0}
2444 fprintf (stdout
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2445 fprintf (stdout
, _(" Display information about the contents of ELF format files\n"));
2446 fprintf (stdout
, _(" Options are:\n\
2447 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2448 -h --file-header Display the ELF file header\n\
2449 -l --program-headers Display the program headers\n\
2450 --segments An alias for --program-headers\n\
2451 -S --section-headers Display the sections' header\n\
2452 --sections An alias for --section-headers\n\
2453 -g --section-groups Display the section groups\n\
2454 -e --headers Equivalent to: -h -l -S\n\
2455 -s --syms Display the symbol table\n\
2456 --symbols An alias for --syms\n\
2457 -n --notes Display the core notes (if present)\n\
2458 -r --relocs Display the relocations (if present)\n\
2459 -u --unwind Display the unwind info (if present)\n\
2460 -d --dynamic Display the dynamic section (if present)\n\
2461 -V --version-info Display the version sections (if present)\n\
2462 -A --arch-specific Display architecture specific information (if any).\n\
2463 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2464 -x --hex-dump=<number> Dump the contents of section <number>\n\
2465 -w[liaprmfFso] or\n\
2466 --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]\n\
2467 Display the contents of DWARF2 debug sections\n"));
2468 #ifdef SUPPORT_DISASSEMBLY
2469 fprintf (stdout
, _("\
2470 -i --instruction-dump=<number>\n\
2471 Disassemble the contents of section <number>\n"));
2473 fprintf (stdout
, _("\
2474 -I --histogram Display histogram of bucket list lengths\n\
2475 -W --wide Allow output width to exceed 80 characters\n\
2476 -H --help Display this information\n\
2477 -v --version Display the version number of readelf\n"));
2478 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2484 request_dump (unsigned int section
, int type
)
2486 if (section
>= num_dump_sects
)
2488 char *new_dump_sects
;
2490 new_dump_sects
= calloc (section
+ 1, 1);
2492 if (new_dump_sects
== NULL
)
2493 error (_("Out of memory allocating dump request table."));
2496 /* Copy current flag settings. */
2497 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2501 dump_sects
= new_dump_sects
;
2502 num_dump_sects
= section
+ 1;
2507 dump_sects
[section
] |= type
;
2513 parse_args (int argc
, char **argv
)
2520 while ((c
= getopt_long
2521 (argc
, argv
, "ersuahnldSDAIgw::x:i:vVWH", options
, NULL
)) != EOF
)
2542 do_section_groups
++;
2550 do_section_groups
++;
2592 section
= strtoul (optarg
, & cp
, 0);
2593 if (! *cp
&& section
>= 0)
2595 request_dump (section
, HEX_DUMP
);
2605 unsigned int index
= 0;
2609 while (optarg
[index
])
2610 switch (optarg
[index
++])
2619 do_debug_abbrevs
= 1;
2629 do_debug_pubnames
= 1;
2634 do_debug_aranges
= 1;
2638 do_debug_frames_interp
= 1;
2640 do_debug_frames
= 1;
2645 do_debug_macinfo
= 1;
2659 warn (_("Unrecognized debug option '%s'\n"), optarg
);
2664 case OPTION_DEBUG_DUMP
:
2670 static const char *debug_dump_opt
[]
2671 = { "line", "info", "abbrev", "pubnames", "ranges",
2672 "macro", "frames", "frames-interp", "str", "loc", NULL
};
2681 for (index
= 0; debug_dump_opt
[index
]; index
++)
2683 size_t len
= strlen (debug_dump_opt
[index
]);
2685 if (strncmp (p
, debug_dump_opt
[index
], len
) == 0
2686 && (p
[len
] == ',' || p
[len
] == '\0'))
2695 do_debug_abbrevs
= 1;
2706 do_debug_pubnames
= 1;
2710 do_debug_aranges
= 1;
2715 do_debug_frames_interp
= 1;
2716 do_debug_frames
= 1;
2720 do_debug_macinfo
= 1;
2733 if (debug_dump_opt
[index
] == NULL
)
2735 warn (_("Unrecognized debug option '%s'\n"), p
);
2736 p
= strchr (p
, ',');
2746 #ifdef SUPPORT_DISASSEMBLY
2749 section
= strtoul (optarg
, & cp
, 0);
2750 if (! *cp
&& section
>= 0)
2752 request_dump (section
, DISASS_DUMP
);
2758 print_version (program_name
);
2768 /* xgettext:c-format */
2769 error (_("Invalid option '-%c'\n"), c
);
2776 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
2777 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2778 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
2779 && !do_section_groups
)
2783 warn (_("Nothing to do.\n"));
2789 get_elf_class (unsigned int elf_class
)
2791 static char buff
[32];
2795 case ELFCLASSNONE
: return _("none");
2796 case ELFCLASS32
: return "ELF32";
2797 case ELFCLASS64
: return "ELF64";
2799 sprintf (buff
, _("<unknown: %x>"), elf_class
);
2805 get_data_encoding (unsigned int encoding
)
2807 static char buff
[32];
2811 case ELFDATANONE
: return _("none");
2812 case ELFDATA2LSB
: return _("2's complement, little endian");
2813 case ELFDATA2MSB
: return _("2's complement, big endian");
2815 sprintf (buff
, _("<unknown: %x>"), encoding
);
2820 /* Decode the data held in 'elf_header'. */
2823 process_file_header (void)
2825 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2826 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
2827 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
2828 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
2831 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2839 printf (_("ELF Header:\n"));
2840 printf (_(" Magic: "));
2841 for (i
= 0; i
< EI_NIDENT
; i
++)
2842 printf ("%2.2x ", elf_header
.e_ident
[i
]);
2844 printf (_(" Class: %s\n"),
2845 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
2846 printf (_(" Data: %s\n"),
2847 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
2848 printf (_(" Version: %d %s\n"),
2849 elf_header
.e_ident
[EI_VERSION
],
2850 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
2852 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
2855 printf (_(" OS/ABI: %s\n"),
2856 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
2857 printf (_(" ABI Version: %d\n"),
2858 elf_header
.e_ident
[EI_ABIVERSION
]);
2859 printf (_(" Type: %s\n"),
2860 get_file_type (elf_header
.e_type
));
2861 printf (_(" Machine: %s\n"),
2862 get_machine_name (elf_header
.e_machine
));
2863 printf (_(" Version: 0x%lx\n"),
2864 (unsigned long) elf_header
.e_version
);
2866 printf (_(" Entry point address: "));
2867 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2868 printf (_("\n Start of program headers: "));
2869 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2870 printf (_(" (bytes into file)\n Start of section headers: "));
2871 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
2872 printf (_(" (bytes into file)\n"));
2874 printf (_(" Flags: 0x%lx%s\n"),
2875 (unsigned long) elf_header
.e_flags
,
2876 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
2877 printf (_(" Size of this header: %ld (bytes)\n"),
2878 (long) elf_header
.e_ehsize
);
2879 printf (_(" Size of program headers: %ld (bytes)\n"),
2880 (long) elf_header
.e_phentsize
);
2881 printf (_(" Number of program headers: %ld\n"),
2882 (long) elf_header
.e_phnum
);
2883 printf (_(" Size of section headers: %ld (bytes)\n"),
2884 (long) elf_header
.e_shentsize
);
2885 printf (_(" Number of section headers: %ld"),
2886 (long) elf_header
.e_shnum
);
2887 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
2888 printf (" (%ld)", (long) section_headers
[0].sh_size
);
2889 putc ('\n', stdout
);
2890 printf (_(" Section header string table index: %ld"),
2891 (long) elf_header
.e_shstrndx
);
2892 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
2893 printf (" (%ld)", (long) section_headers
[0].sh_link
);
2894 putc ('\n', stdout
);
2897 if (section_headers
!= NULL
)
2899 if (elf_header
.e_shnum
== 0)
2900 elf_header
.e_shnum
= section_headers
[0].sh_size
;
2901 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
2902 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
2903 free (section_headers
);
2904 section_headers
= NULL
;
2912 get_32bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
2914 Elf32_External_Phdr
*phdrs
;
2915 Elf32_External_Phdr
*external
;
2916 Elf_Internal_Phdr
*internal
;
2919 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
2920 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2921 _("program headers"));
2925 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2926 i
< elf_header
.e_phnum
;
2927 i
++, internal
++, external
++)
2929 internal
->p_type
= BYTE_GET (external
->p_type
);
2930 internal
->p_offset
= BYTE_GET (external
->p_offset
);
2931 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
2932 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
2933 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
2934 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
2935 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2936 internal
->p_align
= BYTE_GET (external
->p_align
);
2945 get_64bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
2947 Elf64_External_Phdr
*phdrs
;
2948 Elf64_External_Phdr
*external
;
2949 Elf_Internal_Phdr
*internal
;
2952 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
2953 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2954 _("program headers"));
2958 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2959 i
< elf_header
.e_phnum
;
2960 i
++, internal
++, external
++)
2962 internal
->p_type
= BYTE_GET (external
->p_type
);
2963 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2964 internal
->p_offset
= BYTE_GET8 (external
->p_offset
);
2965 internal
->p_vaddr
= BYTE_GET8 (external
->p_vaddr
);
2966 internal
->p_paddr
= BYTE_GET8 (external
->p_paddr
);
2967 internal
->p_filesz
= BYTE_GET8 (external
->p_filesz
);
2968 internal
->p_memsz
= BYTE_GET8 (external
->p_memsz
);
2969 internal
->p_align
= BYTE_GET8 (external
->p_align
);
2977 /* Returns 1 if the program headers were read into `program_headers'. */
2980 get_program_headers (FILE *file
)
2982 Elf_Internal_Phdr
*phdrs
;
2984 /* Check cache of prior read. */
2985 if (program_headers
!= NULL
)
2988 phdrs
= malloc (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
2992 error (_("Out of memory\n"));
2997 ? get_32bit_program_headers (file
, phdrs
)
2998 : get_64bit_program_headers (file
, phdrs
))
3000 program_headers
= phdrs
;
3008 /* Returns 1 if the program headers were loaded. */
3011 process_program_headers (FILE *file
)
3013 Elf_Internal_Phdr
*segment
;
3016 if (elf_header
.e_phnum
== 0)
3019 printf (_("\nThere are no program headers in this file.\n"));
3023 if (do_segments
&& !do_header
)
3025 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3026 printf (_("Entry point "));
3027 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3028 printf (_("\nThere are %d program headers, starting at offset "),
3029 elf_header
.e_phnum
);
3030 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3034 if (! get_program_headers (file
))
3039 if (elf_header
.e_phnum
> 1)
3040 printf (_("\nProgram Headers:\n"));
3042 printf (_("\nProgram Headers:\n"));
3046 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3049 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3053 (_(" Type Offset VirtAddr PhysAddr\n"));
3055 (_(" FileSiz MemSiz Flags Align\n"));
3062 for (i
= 0, segment
= program_headers
;
3063 i
< elf_header
.e_phnum
;
3068 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3072 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3073 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3074 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3075 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3076 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3078 (segment
->p_flags
& PF_R
? 'R' : ' '),
3079 (segment
->p_flags
& PF_W
? 'W' : ' '),
3080 (segment
->p_flags
& PF_X
? 'E' : ' '));
3081 printf ("%#lx", (unsigned long) segment
->p_align
);
3085 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3086 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3089 print_vma (segment
->p_offset
, FULL_HEX
);
3093 print_vma (segment
->p_vaddr
, FULL_HEX
);
3095 print_vma (segment
->p_paddr
, FULL_HEX
);
3098 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3099 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3102 print_vma (segment
->p_filesz
, FULL_HEX
);
3106 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3107 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3110 print_vma (segment
->p_offset
, FULL_HEX
);
3114 (segment
->p_flags
& PF_R
? 'R' : ' '),
3115 (segment
->p_flags
& PF_W
? 'W' : ' '),
3116 (segment
->p_flags
& PF_X
? 'E' : ' '));
3118 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3119 printf ("%#lx", (unsigned long) segment
->p_align
);
3122 print_vma (segment
->p_align
, PREFIX_HEX
);
3127 print_vma (segment
->p_offset
, FULL_HEX
);
3129 print_vma (segment
->p_vaddr
, FULL_HEX
);
3131 print_vma (segment
->p_paddr
, FULL_HEX
);
3133 print_vma (segment
->p_filesz
, FULL_HEX
);
3135 print_vma (segment
->p_memsz
, FULL_HEX
);
3137 (segment
->p_flags
& PF_R
? 'R' : ' '),
3138 (segment
->p_flags
& PF_W
? 'W' : ' '),
3139 (segment
->p_flags
& PF_X
? 'E' : ' '));
3140 print_vma (segment
->p_align
, HEX
);
3144 switch (segment
->p_type
)
3148 error (_("more than one dynamic segment\n"));
3150 /* Try to locate the .dynamic section. If there is
3151 a section header table, we can easily locate it. */
3152 if (section_headers
!= NULL
)
3154 Elf_Internal_Shdr
*sec
;
3157 for (j
= 0, sec
= section_headers
;
3158 j
< elf_header
.e_shnum
;
3160 if (strcmp (SECTION_NAME (sec
), ".dynamic") == 0)
3163 if (j
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
3165 error (_("no .dynamic section in the dynamic segment"));
3169 dynamic_addr
= sec
->sh_offset
;
3170 dynamic_size
= sec
->sh_size
;
3172 if (dynamic_addr
< segment
->p_offset
3173 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
3174 warn (_("the .dynamic section is not contained within the dynamic segment"));
3175 else if (dynamic_addr
> segment
->p_offset
)
3176 warn (_("the .dynamic section is not the first section in the dynamic segment."));
3180 /* Otherwise, we can only assume that the .dynamic
3181 section is the first section in the DYNAMIC segment. */
3182 dynamic_addr
= segment
->p_offset
;
3183 dynamic_size
= segment
->p_filesz
;
3188 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3190 error (_("Unable to find program interpreter name\n"));
3193 program_interpreter
[0] = 0;
3194 fscanf (file
, "%63s", program_interpreter
);
3197 printf (_("\n [Requesting program interpreter: %s]"),
3198 program_interpreter
);
3204 putc ('\n', stdout
);
3207 if (do_segments
&& section_headers
!= NULL
)
3209 printf (_("\n Section to Segment mapping:\n"));
3210 printf (_(" Segment Sections...\n"));
3212 assert (string_table
!= NULL
);
3214 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3217 Elf_Internal_Shdr
*section
;
3219 segment
= program_headers
+ i
;
3220 section
= section_headers
;
3222 printf (" %2.2d ", i
);
3224 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3226 if (section
->sh_size
> 0
3227 /* Compare allocated sections by VMA, unallocated
3228 sections by file offset. */
3229 && (section
->sh_flags
& SHF_ALLOC
3230 ? (section
->sh_addr
>= segment
->p_vaddr
3231 && section
->sh_addr
+ section
->sh_size
3232 <= segment
->p_vaddr
+ segment
->p_memsz
)
3233 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
3234 && (section
->sh_offset
+ section
->sh_size
3235 <= segment
->p_offset
+ segment
->p_filesz
))))
3236 printf ("%s ", SECTION_NAME (section
));
3247 /* Find the file offset corresponding to VMA by using the program headers. */
3250 offset_from_vma (FILE *file
, bfd_vma vma
, bfd_size_type size
)
3252 Elf_Internal_Phdr
*seg
;
3254 if (! get_program_headers (file
))
3256 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3260 for (seg
= program_headers
;
3261 seg
< program_headers
+ elf_header
.e_phnum
;
3264 if (seg
->p_type
!= PT_LOAD
)
3267 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3268 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3269 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3272 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3279 get_32bit_section_headers (FILE *file
, unsigned int num
)
3281 Elf32_External_Shdr
*shdrs
;
3282 Elf_Internal_Shdr
*internal
;
3285 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3286 elf_header
.e_shentsize
* num
, _("section headers"));
3290 section_headers
= malloc (num
* sizeof (Elf_Internal_Shdr
));
3292 if (section_headers
== NULL
)
3294 error (_("Out of memory\n"));
3298 for (i
= 0, internal
= section_headers
;
3302 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3303 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3304 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3305 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3306 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3307 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3308 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3309 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3310 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3311 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3320 get_64bit_section_headers (FILE *file
, unsigned int num
)
3322 Elf64_External_Shdr
*shdrs
;
3323 Elf_Internal_Shdr
*internal
;
3326 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3327 elf_header
.e_shentsize
* num
, _("section headers"));
3331 section_headers
= malloc (num
* sizeof (Elf_Internal_Shdr
));
3333 if (section_headers
== NULL
)
3335 error (_("Out of memory\n"));
3339 for (i
= 0, internal
= section_headers
;
3343 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3344 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3345 internal
->sh_flags
= BYTE_GET8 (shdrs
[i
].sh_flags
);
3346 internal
->sh_addr
= BYTE_GET8 (shdrs
[i
].sh_addr
);
3347 internal
->sh_size
= BYTE_GET8 (shdrs
[i
].sh_size
);
3348 internal
->sh_entsize
= BYTE_GET8 (shdrs
[i
].sh_entsize
);
3349 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3350 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3351 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3352 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3360 static Elf_Internal_Sym
*
3361 get_32bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3363 unsigned long number
;
3364 Elf32_External_Sym
*esyms
;
3365 Elf_External_Sym_Shndx
*shndx
;
3366 Elf_Internal_Sym
*isyms
;
3367 Elf_Internal_Sym
*psym
;
3370 esyms
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
3376 if (symtab_shndx_hdr
!= NULL
3377 && (symtab_shndx_hdr
->sh_link
3378 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3380 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3381 symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3389 number
= section
->sh_size
/ section
->sh_entsize
;
3390 isyms
= malloc (number
* sizeof (Elf_Internal_Sym
));
3394 error (_("Out of memory\n"));
3401 for (j
= 0, psym
= isyms
;
3405 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3406 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3407 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3408 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3409 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3411 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3412 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3413 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3423 static Elf_Internal_Sym
*
3424 get_64bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3426 unsigned long number
;
3427 Elf64_External_Sym
*esyms
;
3428 Elf_External_Sym_Shndx
*shndx
;
3429 Elf_Internal_Sym
*isyms
;
3430 Elf_Internal_Sym
*psym
;
3433 esyms
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
3439 if (symtab_shndx_hdr
!= NULL
3440 && (symtab_shndx_hdr
->sh_link
3441 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3443 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3444 symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3452 number
= section
->sh_size
/ section
->sh_entsize
;
3453 isyms
= malloc (number
* sizeof (Elf_Internal_Sym
));
3457 error (_("Out of memory\n"));
3464 for (j
= 0, psym
= isyms
;
3468 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3469 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3470 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3471 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3472 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3474 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3475 psym
->st_value
= BYTE_GET8 (esyms
[j
].st_value
);
3476 psym
->st_size
= BYTE_GET8 (esyms
[j
].st_size
);
3487 get_elf_section_flags (bfd_vma sh_flags
)
3489 static char buff
[32];
3497 flag
= sh_flags
& - sh_flags
;
3502 case SHF_WRITE
: strcat (buff
, "W"); break;
3503 case SHF_ALLOC
: strcat (buff
, "A"); break;
3504 case SHF_EXECINSTR
: strcat (buff
, "X"); break;
3505 case SHF_MERGE
: strcat (buff
, "M"); break;
3506 case SHF_STRINGS
: strcat (buff
, "S"); break;
3507 case SHF_INFO_LINK
: strcat (buff
, "I"); break;
3508 case SHF_LINK_ORDER
: strcat (buff
, "L"); break;
3509 case SHF_OS_NONCONFORMING
: strcat (buff
, "O"); break;
3510 case SHF_GROUP
: strcat (buff
, "G"); break;
3511 case SHF_TLS
: strcat (buff
, "T"); break;
3514 if (flag
& SHF_MASKOS
)
3517 sh_flags
&= ~ SHF_MASKOS
;
3519 else if (flag
& SHF_MASKPROC
)
3522 sh_flags
&= ~ SHF_MASKPROC
;
3534 process_section_headers (FILE *file
)
3536 Elf_Internal_Shdr
*section
;
3539 section_headers
= NULL
;
3541 if (elf_header
.e_shnum
== 0)
3544 printf (_("\nThere are no sections in this file.\n"));
3549 if (do_sections
&& !do_header
)
3550 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3551 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3555 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3558 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3561 /* Read in the string table, so that we have names to display. */
3562 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3564 if (section
->sh_size
!= 0)
3566 string_table
= get_data (NULL
, file
, section
->sh_offset
,
3567 section
->sh_size
, _("string table"));
3569 if (string_table
== NULL
)
3572 string_table_length
= section
->sh_size
;
3575 /* Scan the sections for the dynamic symbol table
3576 and dynamic string table and debug sections. */
3577 dynamic_symbols
= NULL
;
3578 dynamic_strings
= NULL
;
3579 dynamic_syminfo
= NULL
;
3580 symtab_shndx_hdr
= NULL
;
3582 for (i
= 0, section
= section_headers
;
3583 i
< elf_header
.e_shnum
;
3586 char *name
= SECTION_NAME (section
);
3588 if (section
->sh_type
== SHT_DYNSYM
)
3590 if (dynamic_symbols
!= NULL
)
3592 error (_("File contains multiple dynamic symbol tables\n"));
3596 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3597 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3599 else if (section
->sh_type
== SHT_STRTAB
3600 && strcmp (name
, ".dynstr") == 0)
3602 if (dynamic_strings
!= NULL
)
3604 error (_("File contains multiple dynamic string tables\n"));
3608 dynamic_strings
= get_data (NULL
, file
, section
->sh_offset
,
3609 section
->sh_size
, _("dynamic strings"));
3611 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
3613 if (symtab_shndx_hdr
!= NULL
)
3615 error (_("File contains multiple symtab shndx tables\n"));
3618 symtab_shndx_hdr
= section
;
3620 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
3621 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
3622 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
3624 && strncmp (name
, ".debug_", 7) == 0)
3629 || (do_debug_info
&& (strcmp (name
, "info") == 0))
3630 || (do_debug_abbrevs
&& (strcmp (name
, "abbrev") == 0))
3631 || (do_debug_lines
&& (strcmp (name
, "line") == 0))
3632 || (do_debug_pubnames
&& (strcmp (name
, "pubnames") == 0))
3633 || (do_debug_aranges
&& (strcmp (name
, "aranges") == 0))
3634 || (do_debug_frames
&& (strcmp (name
, "frame") == 0))
3635 || (do_debug_macinfo
&& (strcmp (name
, "macinfo") == 0))
3636 || (do_debug_str
&& (strcmp (name
, "str") == 0))
3637 || (do_debug_loc
&& (strcmp (name
, "loc") == 0))
3639 request_dump (i
, DEBUG_DUMP
);
3641 /* linkonce section to be combined with .debug_info at link time. */
3642 else if ((do_debugging
|| do_debug_info
)
3643 && strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
3644 request_dump (i
, DEBUG_DUMP
);
3645 else if (do_debug_frames
&& strcmp (name
, ".eh_frame") == 0)
3646 request_dump (i
, DEBUG_DUMP
);
3652 if (elf_header
.e_shnum
> 1)
3653 printf (_("\nSection Headers:\n"));
3655 printf (_("\nSection Header:\n"));
3659 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3662 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3665 printf (_(" [Nr] Name Type Address Offset\n"));
3666 printf (_(" Size EntSize Flags Link Info Align\n"));
3669 for (i
= 0, section
= section_headers
;
3670 i
< elf_header
.e_shnum
;
3673 printf (" [%2u] %-17.17s %-15.15s ",
3674 SECTION_HEADER_NUM (i
),
3675 SECTION_NAME (section
),
3676 get_section_type_name (section
->sh_type
));
3680 print_vma (section
->sh_addr
, LONG_HEX
);
3682 printf ( " %6.6lx %6.6lx %2.2lx",
3683 (unsigned long) section
->sh_offset
,
3684 (unsigned long) section
->sh_size
,
3685 (unsigned long) section
->sh_entsize
);
3687 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3689 printf ("%2ld %3lu %2ld\n",
3690 (unsigned long) section
->sh_link
,
3691 (unsigned long) section
->sh_info
,
3692 (unsigned long) section
->sh_addralign
);
3696 print_vma (section
->sh_addr
, LONG_HEX
);
3698 if ((long) section
->sh_offset
== section
->sh_offset
)
3699 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
3703 print_vma (section
->sh_offset
, LONG_HEX
);
3706 if ((unsigned long) section
->sh_size
== section
->sh_size
)
3707 printf (" %6.6lx", (unsigned long) section
->sh_size
);
3711 print_vma (section
->sh_size
, LONG_HEX
);
3714 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
3715 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
3719 print_vma (section
->sh_entsize
, LONG_HEX
);
3722 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3724 printf ("%2ld %3lu ",
3725 (unsigned long) section
->sh_link
,
3726 (unsigned long) section
->sh_info
);
3728 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
3729 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
3732 print_vma (section
->sh_addralign
, DEC
);
3739 print_vma (section
->sh_addr
, LONG_HEX
);
3740 if ((long) section
->sh_offset
== section
->sh_offset
)
3741 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
3745 print_vma (section
->sh_offset
, LONG_HEX
);
3748 print_vma (section
->sh_size
, LONG_HEX
);
3750 print_vma (section
->sh_entsize
, LONG_HEX
);
3752 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3754 printf (" %2ld %3lu %ld\n",
3755 (unsigned long) section
->sh_link
,
3756 (unsigned long) section
->sh_info
,
3757 (unsigned long) section
->sh_addralign
);
3761 printf (_("Key to Flags:\n\
3762 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3763 I (info), L (link order), G (group), x (unknown)\n\
3764 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3770 get_group_flags (unsigned int flags
)
3772 static char buff
[32];
3779 sprintf (buff
, _("[<unknown>: 0x%x]"), flags
);
3786 process_section_groups (FILE *file
)
3788 Elf_Internal_Shdr
*section
;
3790 struct group
*group
;
3792 if (elf_header
.e_shnum
== 0)
3794 if (do_section_groups
)
3795 printf (_("\nThere are no section groups in this file.\n"));
3800 if (section_headers
== NULL
)
3802 error (_("Section headers are not available!\n"));
3806 section_headers_groups
= calloc (elf_header
.e_shnum
,
3807 sizeof (struct group
*));
3809 if (section_headers_groups
== NULL
)
3811 error (_("Out of memory\n"));
3815 /* Scan the sections for the group section. */
3816 for (i
= 0, section
= section_headers
;
3817 i
< elf_header
.e_shnum
;
3819 if (section
->sh_type
== SHT_GROUP
)
3822 section_groups
= calloc (group_count
, sizeof (struct group
));
3824 if (section_groups
== NULL
)
3826 error (_("Out of memory\n"));
3830 for (i
= 0, section
= section_headers
, group
= section_groups
;
3831 i
< elf_header
.e_shnum
;
3834 if (section
->sh_type
== SHT_GROUP
)
3836 char *name
= SECTION_NAME (section
);
3837 char *group_name
, *strtab
, *start
, *indices
;
3838 unsigned int entry
, j
, size
;
3839 Elf_Internal_Sym
*sym
;
3840 Elf_Internal_Shdr
*symtab_sec
, *strtab_sec
, *sec
;
3841 Elf_Internal_Sym
*symtab
;
3843 /* Get the symbol table. */
3844 symtab_sec
= SECTION_HEADER (section
->sh_link
);
3845 if (symtab_sec
->sh_type
!= SHT_SYMTAB
)
3847 error (_("Bad sh_link in group section `%s'\n"), name
);
3850 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
);
3852 sym
= symtab
+ section
->sh_info
;
3854 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
3856 bfd_vma sec_index
= SECTION_HEADER_INDEX (sym
->st_shndx
);
3859 error (_("Bad sh_info in group section `%s'\n"), name
);
3863 group_name
= SECTION_NAME (section_headers
+ sec_index
);
3868 /* Get the string table. */
3869 strtab_sec
= SECTION_HEADER (symtab_sec
->sh_link
);
3870 strtab
= get_data (NULL
, file
, strtab_sec
->sh_offset
,
3871 strtab_sec
->sh_size
,
3874 group_name
= strtab
+ sym
->st_name
;
3877 start
= get_data (NULL
, file
, section
->sh_offset
,
3878 section
->sh_size
, _("section data"));
3881 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
3882 entry
= byte_get (indices
, 4);
3885 if (do_section_groups
)
3887 printf ("\n%s group section `%s' [%s] contains %u sections:\n",
3888 get_group_flags (entry
), name
, group_name
, size
);
3890 printf (_(" [Index] Name\n"));
3893 group
->group_index
= i
;
3895 for (j
= 0; j
< size
; j
++)
3897 struct group_list
*g
;
3899 entry
= byte_get (indices
, 4);
3902 if (section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
3905 error (_("section [%5u] already in group section [%5u]\n"),
3906 entry
, section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
3910 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
3913 if (do_section_groups
)
3915 sec
= SECTION_HEADER (entry
);
3916 printf (" [%5u] %s\n",
3917 entry
, SECTION_NAME (sec
));
3920 g
= xmalloc (sizeof (struct group_list
));
3921 g
->section_index
= entry
;
3922 g
->next
= group
->root
;
3944 } dynamic_relocations
[] =
3946 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
3947 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
3948 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
3951 /* Process the reloc section. */
3953 process_relocs (FILE *file
)
3955 unsigned long rel_size
;
3956 unsigned long rel_offset
;
3962 if (do_using_dynamic
)
3966 int has_dynamic_reloc
;
3969 has_dynamic_reloc
= 0;
3971 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
3973 is_rela
= dynamic_relocations
[i
].rela
;
3974 name
= dynamic_relocations
[i
].name
;
3975 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
3976 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
3978 has_dynamic_reloc
|= rel_size
;
3980 if (is_rela
== UNKNOWN
)
3982 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
3983 switch (dynamic_info
[DT_PLTREL
])
3997 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
3998 name
, rel_offset
, rel_size
);
4000 dump_relocations (file
,
4001 offset_from_vma (file
, rel_offset
, rel_size
),
4003 dynamic_symbols
, num_dynamic_syms
,
4004 dynamic_strings
, is_rela
);
4008 if (! has_dynamic_reloc
)
4009 printf (_("\nThere are no dynamic relocations in this file.\n"));
4013 Elf_Internal_Shdr
*section
;
4017 for (i
= 0, section
= section_headers
;
4018 i
< elf_header
.e_shnum
;
4021 if ( section
->sh_type
!= SHT_RELA
4022 && section
->sh_type
!= SHT_REL
)
4025 rel_offset
= section
->sh_offset
;
4026 rel_size
= section
->sh_size
;
4030 Elf_Internal_Shdr
*strsec
;
4031 Elf_Internal_Sym
*symtab
;
4034 unsigned long nsyms
;
4036 printf (_("\nRelocation section "));
4038 if (string_table
== NULL
)
4039 printf ("%d", section
->sh_name
);
4041 printf (_("'%s'"), SECTION_NAME (section
));
4043 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4044 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4049 if (section
->sh_link
)
4051 Elf_Internal_Shdr
*symsec
;
4053 symsec
= SECTION_HEADER (section
->sh_link
);
4054 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4055 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4060 strsec
= SECTION_HEADER (symsec
->sh_link
);
4062 strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4063 strsec
->sh_size
, _("string table"));
4065 is_rela
= section
->sh_type
== SHT_RELA
;
4067 dump_relocations (file
, rel_offset
, rel_size
,
4068 symtab
, nsyms
, strtab
, is_rela
);
4080 printf (_("\nThere are no relocations in this file.\n"));
4086 #include "unwind-ia64.h"
4088 /* An absolute address consists of a section and an offset. If the
4089 section is NULL, the offset itself is the address, otherwise, the
4090 address equals to LOAD_ADDRESS(section) + offset. */
4094 unsigned short section
;
4100 struct unw_table_entry
4102 struct absaddr start
;
4104 struct absaddr info
;
4106 *table
; /* Unwind table. */
4107 unsigned long table_len
; /* Length of unwind table. */
4108 unsigned char *info
; /* Unwind info. */
4109 unsigned long info_size
; /* Size of unwind info. */
4110 bfd_vma info_addr
; /* starting address of unwind info. */
4111 bfd_vma seg_base
; /* Starting address of segment. */
4112 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4113 unsigned long nsyms
; /* Number of symbols. */
4114 char *strtab
; /* The string table. */
4115 unsigned long strtab_size
; /* Size of string table. */
4119 find_symbol_for_address (struct unw_aux_info
*aux
,
4120 struct absaddr addr
,
4121 const char **symname
,
4124 bfd_vma dist
= 0x100000;
4125 Elf_Internal_Sym
*sym
, *best
= NULL
;
4128 for (i
= 0, sym
= aux
->symtab
; i
< aux
->nsyms
; ++i
, ++sym
)
4130 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
4131 && sym
->st_name
!= 0
4132 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
4133 && addr
.offset
>= sym
->st_value
4134 && addr
.offset
- sym
->st_value
< dist
)
4137 dist
= addr
.offset
- sym
->st_value
;
4144 *symname
= (best
->st_name
>= aux
->strtab_size
4145 ? "<corrupt>" : aux
->strtab
+ best
->st_name
);
4150 *offset
= addr
.offset
;
4154 dump_ia64_unwind (struct unw_aux_info
*aux
)
4157 struct unw_table_entry
*tp
;
4160 addr_size
= is_32bit_elf
? 4 : 8;
4162 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4166 const unsigned char *dp
;
4167 const unsigned char *head
;
4168 const char *procname
;
4170 find_symbol_for_address (aux
, tp
->start
, &procname
, &offset
);
4172 fputs ("\n<", stdout
);
4176 fputs (procname
, stdout
);
4179 printf ("+%lx", (unsigned long) offset
);
4182 fputs (">: [", stdout
);
4183 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4184 fputc ('-', stdout
);
4185 print_vma (tp
->end
.offset
, PREFIX_HEX
);
4186 printf ("], info at +0x%lx\n",
4187 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
4189 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
4190 stamp
= BYTE_GET8 ((unsigned char *) head
);
4192 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4193 (unsigned) UNW_VER (stamp
),
4194 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
4195 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
4196 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
4197 (unsigned long) (addr_size
* UNW_LENGTH (stamp
)));
4199 if (UNW_VER (stamp
) != 1)
4201 printf ("\tUnknown version.\n");
4206 for (dp
= head
+ 8; dp
< head
+ 8 + addr_size
* UNW_LENGTH (stamp
);)
4207 dp
= unw_decode (dp
, in_body
, & in_body
);
4212 slurp_ia64_unwind_table (FILE *file
,
4213 struct unw_aux_info
*aux
,
4214 Elf_Internal_Shdr
*sec
)
4216 unsigned long size
, addr_size
, nrelas
, i
;
4217 Elf_Internal_Phdr
*seg
;
4218 struct unw_table_entry
*tep
;
4219 Elf_Internal_Shdr
*relsec
;
4220 Elf_Internal_Rela
*rela
, *rp
;
4221 unsigned char *table
, *tp
;
4222 Elf_Internal_Sym
*sym
;
4223 const char *relname
;
4225 addr_size
= is_32bit_elf
? 4 : 8;
4227 /* First, find the starting address of the segment that includes
4230 if (elf_header
.e_phnum
)
4232 if (! get_program_headers (file
))
4235 for (seg
= program_headers
;
4236 seg
< program_headers
+ elf_header
.e_phnum
;
4239 if (seg
->p_type
!= PT_LOAD
)
4242 if (sec
->sh_addr
>= seg
->p_vaddr
4243 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
4245 aux
->seg_base
= seg
->p_vaddr
;
4251 /* Second, build the unwind table from the contents of the unwind section: */
4252 size
= sec
->sh_size
;
4253 table
= get_data (NULL
, file
, sec
->sh_offset
, size
, _("unwind table"));
4257 tep
= aux
->table
= xmalloc (size
/ (3 * addr_size
) * sizeof (aux
->table
[0]));
4258 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * addr_size
, ++tep
)
4260 tep
->start
.section
= SHN_UNDEF
;
4261 tep
->end
.section
= SHN_UNDEF
;
4262 tep
->info
.section
= SHN_UNDEF
;
4265 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
4266 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
4267 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
4271 tep
->start
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 0);
4272 tep
->end
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 8);
4273 tep
->info
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 16);
4275 tep
->start
.offset
+= aux
->seg_base
;
4276 tep
->end
.offset
+= aux
->seg_base
;
4277 tep
->info
.offset
+= aux
->seg_base
;
4281 /* Third, apply any relocations to the unwind table: */
4283 for (relsec
= section_headers
;
4284 relsec
< section_headers
+ elf_header
.e_shnum
;
4287 if (relsec
->sh_type
!= SHT_RELA
4288 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4291 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
4295 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
4299 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
4300 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
4302 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
4304 warn (_("Skipping unexpected symbol type %u\n"),
4305 ELF32_ST_TYPE (sym
->st_info
));
4311 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
4312 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
4314 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
4316 warn (_("Skipping unexpected symbol type %u\n"),
4317 ELF64_ST_TYPE (sym
->st_info
));
4322 if (strncmp (relname
, "R_IA64_SEGREL", 13) != 0)
4324 warn (_("Skipping unexpected relocation type %s\n"), relname
);
4328 i
= rp
->r_offset
/ (3 * addr_size
);
4330 switch (rp
->r_offset
/addr_size
% 3)
4333 aux
->table
[i
].start
.section
= sym
->st_shndx
;
4334 aux
->table
[i
].start
.offset
+= rp
->r_addend
;
4337 aux
->table
[i
].end
.section
= sym
->st_shndx
;
4338 aux
->table
[i
].end
.offset
+= rp
->r_addend
;
4341 aux
->table
[i
].info
.section
= sym
->st_shndx
;
4342 aux
->table
[i
].info
.offset
+= rp
->r_addend
;
4352 aux
->table_len
= size
/ (3 * addr_size
);
4357 process_unwind (FILE *file
)
4359 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
4360 unsigned long i
, addr_size
, unwcount
= 0, unwstart
= 0;
4361 struct unw_aux_info aux
;
4366 if (elf_header
.e_machine
!= EM_IA_64
)
4368 printf (_("\nThere are no unwind sections in this file.\n"));
4372 memset (& aux
, 0, sizeof (aux
));
4374 addr_size
= is_32bit_elf
? 4 : 8;
4376 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
4378 if (sec
->sh_type
== SHT_SYMTAB
)
4380 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
4381 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
4383 strsec
= SECTION_HEADER (sec
->sh_link
);
4384 aux
.strtab_size
= strsec
->sh_size
;
4385 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4386 aux
.strtab_size
, _("string table"));
4388 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4393 printf (_("\nThere are no unwind sections in this file.\n"));
4395 while (unwcount
-- > 0)
4400 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
4401 i
< elf_header
.e_shnum
; ++i
, ++sec
)
4402 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4409 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
4411 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
4413 /* We need to find which section group it is in. */
4414 struct group_list
*g
= section_headers_groups
[i
]->root
;
4416 for (; g
!= NULL
; g
= g
->next
)
4418 sec
= SECTION_HEADER (g
->section_index
);
4419 if (strcmp (SECTION_NAME (sec
),
4420 ELF_STRING_ia64_unwind_info
) == 0)
4425 i
= elf_header
.e_shnum
;
4427 else if (strncmp (SECTION_NAME (unwsec
),
4428 ELF_STRING_ia64_unwind_once
, len
) == 0)
4430 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
4431 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
4432 suffix
= SECTION_NAME (unwsec
) + len
;
4433 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4435 if (strncmp (SECTION_NAME (sec
),
4436 ELF_STRING_ia64_unwind_info_once
, len2
) == 0
4437 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
4442 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4443 .IA_64.unwind or BAR -> .IA_64.unwind_info */
4444 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
4445 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
4447 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
,
4449 suffix
= SECTION_NAME (unwsec
) + len
;
4450 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4452 if (strncmp (SECTION_NAME (sec
),
4453 ELF_STRING_ia64_unwind_info
, len2
) == 0
4454 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
4458 if (i
== elf_header
.e_shnum
)
4460 printf (_("\nCould not find unwind info section for "));
4462 if (string_table
== NULL
)
4463 printf ("%d", unwsec
->sh_name
);
4465 printf (_("'%s'"), SECTION_NAME (unwsec
));
4469 aux
.info_size
= sec
->sh_size
;
4470 aux
.info_addr
= sec
->sh_addr
;
4471 aux
.info
= get_data (NULL
, file
, sec
->sh_offset
, aux
.info_size
,
4474 printf (_("\nUnwind section "));
4476 if (string_table
== NULL
)
4477 printf ("%d", unwsec
->sh_name
);
4479 printf (_("'%s'"), SECTION_NAME (unwsec
));
4481 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4482 (unsigned long) unwsec
->sh_offset
,
4483 (unsigned long) (unwsec
->sh_size
/ (3 * addr_size
)));
4485 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
4487 if (aux
.table_len
> 0)
4488 dump_ia64_unwind (& aux
);
4491 free ((char *) aux
.table
);
4493 free ((char *) aux
.info
);
4502 free ((char *) aux
.strtab
);
4508 dynamic_section_mips_val (Elf_Internal_Dyn
*entry
)
4510 switch (entry
->d_tag
)
4513 if (entry
->d_un
.d_val
== 0)
4517 static const char * opts
[] =
4519 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
4520 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
4521 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
4522 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
4527 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++cnt
)
4528 if (entry
->d_un
.d_val
& (1 << cnt
))
4530 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
4537 case DT_MIPS_IVERSION
:
4538 if (dynamic_strings
!= NULL
)
4539 printf ("Interface Version: %s\n",
4540 dynamic_strings
+ entry
->d_un
.d_val
);
4542 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4545 case DT_MIPS_TIME_STAMP
:
4550 time_t time
= entry
->d_un
.d_val
;
4551 tmp
= gmtime (&time
);
4552 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
4553 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
4554 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
4555 printf ("Time Stamp: %s\n", timebuf
);
4559 case DT_MIPS_RLD_VERSION
:
4560 case DT_MIPS_LOCAL_GOTNO
:
4561 case DT_MIPS_CONFLICTNO
:
4562 case DT_MIPS_LIBLISTNO
:
4563 case DT_MIPS_SYMTABNO
:
4564 case DT_MIPS_UNREFEXTNO
:
4565 case DT_MIPS_HIPAGENO
:
4566 case DT_MIPS_DELTA_CLASS_NO
:
4567 case DT_MIPS_DELTA_INSTANCE_NO
:
4568 case DT_MIPS_DELTA_RELOC_NO
:
4569 case DT_MIPS_DELTA_SYM_NO
:
4570 case DT_MIPS_DELTA_CLASSSYM_NO
:
4571 case DT_MIPS_COMPACT_SIZE
:
4572 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4576 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
4582 dynamic_section_parisc_val (Elf_Internal_Dyn
*entry
)
4584 switch (entry
->d_tag
)
4586 case DT_HP_DLD_FLAGS
:
4595 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
4596 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
4597 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
4598 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
4599 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
4600 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
4601 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
4602 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
4603 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
4604 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
4605 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
4609 bfd_vma val
= entry
->d_un
.d_val
;
4611 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
4612 if (val
& flags
[cnt
].bit
)
4616 fputs (flags
[cnt
].str
, stdout
);
4618 val
^= flags
[cnt
].bit
;
4621 if (val
!= 0 || first
)
4625 print_vma (val
, HEX
);
4631 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4638 dynamic_section_ia64_val (Elf_Internal_Dyn
*entry
)
4640 switch (entry
->d_tag
)
4642 case DT_IA_64_PLT_RESERVE
:
4643 /* First 3 slots reserved. */
4644 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4646 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
4650 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4657 get_32bit_dynamic_section (FILE *file
)
4659 Elf32_External_Dyn
*edyn
, *ext
;
4660 Elf_Internal_Dyn
*entry
;
4662 edyn
= get_data (NULL
, file
, dynamic_addr
, dynamic_size
,
4663 _("dynamic section"));
4667 dynamic_section
= malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
4669 if (dynamic_section
== NULL
)
4671 error (_("Out of memory\n"));
4676 for (ext
= edyn
, entry
= dynamic_section
;
4677 (char *) ext
< (char *) edyn
+ dynamic_size
;
4680 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
4681 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
4690 get_64bit_dynamic_section (FILE *file
)
4692 Elf64_External_Dyn
*edyn
, *ext
;
4693 Elf_Internal_Dyn
*entry
;
4695 edyn
= get_data (NULL
, file
, dynamic_addr
, dynamic_size
,
4696 _("dynamic section"));
4700 dynamic_section
= malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
4702 if (dynamic_section
== NULL
)
4704 error (_("Out of memory\n"));
4709 for (ext
= edyn
, entry
= dynamic_section
;
4710 (char *) ext
< (char *) edyn
+ dynamic_size
;
4713 entry
->d_tag
= BYTE_GET8 (ext
->d_tag
);
4714 entry
->d_un
.d_val
= BYTE_GET8 (ext
->d_un
.d_val
);
4723 get_dynamic_flags (bfd_vma flags
)
4725 static char buff
[128];
4733 flag
= flags
& - flags
;
4741 case DF_ORIGIN
: strcpy (p
, "ORIGIN"); break;
4742 case DF_SYMBOLIC
: strcpy (p
, "SYMBOLIC"); break;
4743 case DF_TEXTREL
: strcpy (p
, "TEXTREL"); break;
4744 case DF_BIND_NOW
: strcpy (p
, "BIND_NOW"); break;
4745 case DF_STATIC_TLS
: strcpy (p
, "STATIC_TLS"); break;
4746 default: strcpy (p
, "unknown"); break;
4749 p
= strchr (p
, '\0');
4754 /* Parse and display the contents of the dynamic section. */
4757 process_dynamic_section (FILE *file
)
4759 Elf_Internal_Dyn
*entry
;
4762 if (dynamic_size
== 0)
4765 printf (_("\nThere is no dynamic section in this file.\n"));
4772 if (! get_32bit_dynamic_section (file
))
4775 else if (! get_64bit_dynamic_section (file
))
4778 /* Find the appropriate symbol table. */
4779 if (dynamic_symbols
== NULL
)
4781 for (i
= 0, entry
= dynamic_section
;
4785 Elf_Internal_Shdr section
;
4787 if (entry
->d_tag
!= DT_SYMTAB
)
4790 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
4792 /* Since we do not know how big the symbol table is,
4793 we default to reading in the entire file (!) and
4794 processing that. This is overkill, I know, but it
4796 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
4798 if (archive_file_offset
!= 0)
4799 section
.sh_size
= archive_file_size
- section
.sh_offset
;
4802 if (fseek (file
, 0, SEEK_END
))
4803 error (_("Unable to seek to end of file!"));
4805 section
.sh_size
= ftell (file
) - section
.sh_offset
;
4809 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
4811 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
4813 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
4814 if (num_dynamic_syms
< 1)
4816 error (_("Unable to determine the number of symbols to load\n"));
4820 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
4824 /* Similarly find a string table. */
4825 if (dynamic_strings
== NULL
)
4827 for (i
= 0, entry
= dynamic_section
;
4831 unsigned long offset
;
4834 if (entry
->d_tag
!= DT_STRTAB
)
4837 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
4839 /* Since we do not know how big the string table is,
4840 we default to reading in the entire file (!) and
4841 processing that. This is overkill, I know, but it
4844 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
4846 if (archive_file_offset
!= 0)
4847 str_tab_len
= archive_file_size
- offset
;
4850 if (fseek (file
, 0, SEEK_END
))
4851 error (_("Unable to seek to end of file\n"));
4852 str_tab_len
= ftell (file
) - offset
;
4855 if (str_tab_len
< 1)
4858 (_("Unable to determine the length of the dynamic string table\n"));
4862 dynamic_strings
= get_data (NULL
, file
, offset
, str_tab_len
,
4863 _("dynamic string table"));
4868 /* And find the syminfo section if available. */
4869 if (dynamic_syminfo
== NULL
)
4871 unsigned long syminsz
= 0;
4873 for (i
= 0, entry
= dynamic_section
;
4877 if (entry
->d_tag
== DT_SYMINENT
)
4879 /* Note: these braces are necessary to avoid a syntax
4880 error from the SunOS4 C compiler. */
4881 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
4883 else if (entry
->d_tag
== DT_SYMINSZ
)
4884 syminsz
= entry
->d_un
.d_val
;
4885 else if (entry
->d_tag
== DT_SYMINFO
)
4886 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
4890 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
4892 Elf_External_Syminfo
*extsyminfo
;
4893 Elf_Internal_Syminfo
*syminfo
;
4895 /* There is a syminfo section. Read the data. */
4896 extsyminfo
= get_data (NULL
, file
, dynamic_syminfo_offset
, syminsz
,
4897 _("symbol information"));
4901 dynamic_syminfo
= malloc (syminsz
);
4902 if (dynamic_syminfo
== NULL
)
4904 error (_("Out of memory\n"));
4908 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
4909 for (i
= 0, syminfo
= dynamic_syminfo
; i
< dynamic_syminfo_nent
;
4912 syminfo
->si_boundto
= BYTE_GET (extsyminfo
[i
].si_boundto
);
4913 syminfo
->si_flags
= BYTE_GET (extsyminfo
[i
].si_flags
);
4920 if (do_dynamic
&& dynamic_addr
)
4921 printf (_("\nDynamic section at offset 0x%lx contains %ld entries:\n"),
4922 dynamic_addr
, (long) dynamic_size
);
4924 printf (_(" Tag Type Name/Value\n"));
4926 for (i
= 0, entry
= dynamic_section
;
4935 print_vma (entry
->d_tag
, FULL_HEX
);
4936 dtype
= get_dynamic_type (entry
->d_tag
);
4937 printf (" (%s)%*s", dtype
,
4938 ((is_32bit_elf
? 27 : 19)
4939 - (int) strlen (dtype
)),
4943 switch (entry
->d_tag
)
4947 puts (get_dynamic_flags (entry
->d_un
.d_val
));
4957 switch (entry
->d_tag
)
4960 printf (_("Auxiliary library"));
4964 printf (_("Filter library"));
4968 printf (_("Configuration file"));
4972 printf (_("Dependency audit library"));
4976 printf (_("Audit library"));
4980 if (dynamic_strings
)
4981 printf (": [%s]\n", dynamic_strings
+ entry
->d_un
.d_val
);
4985 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4994 printf (_("Flags:"));
4996 if (entry
->d_un
.d_val
== 0)
4997 printf (_(" None\n"));
5000 unsigned long int val
= entry
->d_un
.d_val
;
5002 if (val
& DTF_1_PARINIT
)
5004 printf (" PARINIT");
5005 val
^= DTF_1_PARINIT
;
5007 if (val
& DTF_1_CONFEXP
)
5009 printf (" CONFEXP");
5010 val
^= DTF_1_CONFEXP
;
5013 printf (" %lx", val
);
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
& DF_P1_LAZYLOAD
)
5032 printf (" LAZYLOAD");
5033 val
^= DF_P1_LAZYLOAD
;
5035 if (val
& DF_P1_GROUPPERM
)
5037 printf (" GROUPPERM");
5038 val
^= DF_P1_GROUPPERM
;
5041 printf (" %lx", val
);
5050 printf (_("Flags:"));
5051 if (entry
->d_un
.d_val
== 0)
5052 printf (_(" None\n"));
5055 unsigned long int val
= entry
->d_un
.d_val
;
5062 if (val
& DF_1_GLOBAL
)
5067 if (val
& DF_1_GROUP
)
5072 if (val
& DF_1_NODELETE
)
5074 printf (" NODELETE");
5075 val
^= DF_1_NODELETE
;
5077 if (val
& DF_1_LOADFLTR
)
5079 printf (" LOADFLTR");
5080 val
^= DF_1_LOADFLTR
;
5082 if (val
& DF_1_INITFIRST
)
5084 printf (" INITFIRST");
5085 val
^= DF_1_INITFIRST
;
5087 if (val
& DF_1_NOOPEN
)
5092 if (val
& DF_1_ORIGIN
)
5097 if (val
& DF_1_DIRECT
)
5102 if (val
& DF_1_TRANS
)
5107 if (val
& DF_1_INTERPOSE
)
5109 printf (" INTERPOSE");
5110 val
^= DF_1_INTERPOSE
;
5112 if (val
& DF_1_NODEFLIB
)
5114 printf (" NODEFLIB");
5115 val
^= DF_1_NODEFLIB
;
5117 if (val
& DF_1_NODUMP
)
5122 if (val
& DF_1_CONLFAT
)
5124 printf (" CONLFAT");
5125 val
^= DF_1_CONLFAT
;
5128 printf (" %lx", val
);
5135 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5137 puts (get_dynamic_type (entry
->d_un
.d_val
));
5157 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5163 if (dynamic_strings
== NULL
)
5166 name
= dynamic_strings
+ entry
->d_un
.d_val
;
5170 switch (entry
->d_tag
)
5173 printf (_("Shared library: [%s]"), name
);
5175 if (strcmp (name
, program_interpreter
) == 0)
5176 printf (_(" program interpreter"));
5180 printf (_("Library soname: [%s]"), name
);
5184 printf (_("Library rpath: [%s]"), name
);
5188 printf (_("Library runpath: [%s]"), name
);
5192 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5197 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5210 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5214 case DT_INIT_ARRAYSZ
:
5215 case DT_FINI_ARRAYSZ
:
5216 case DT_GNU_CONFLICTSZ
:
5217 case DT_GNU_LIBLISTSZ
:
5220 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
5221 printf (" (bytes)\n");
5231 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
5244 if (dynamic_strings
!= NULL
&& entry
->d_tag
== DT_USED
)
5248 name
= dynamic_strings
+ entry
->d_un
.d_val
;
5252 printf (_("Not needed object: [%s]\n"), name
);
5257 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5263 /* The value of this entry is ignored. */
5268 case DT_GNU_PRELINKED
:
5272 time_t time
= entry
->d_un
.d_val
;
5274 tmp
= gmtime (&time
);
5275 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
5276 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5277 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5283 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
5284 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
5289 switch (elf_header
.e_machine
)
5292 case EM_MIPS_RS3_LE
:
5293 dynamic_section_mips_val (entry
);
5296 dynamic_section_parisc_val (entry
);
5299 dynamic_section_ia64_val (entry
);
5302 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5314 get_ver_flags (unsigned int flags
)
5316 static char buff
[32];
5323 if (flags
& VER_FLG_BASE
)
5324 strcat (buff
, "BASE ");
5326 if (flags
& VER_FLG_WEAK
)
5328 if (flags
& VER_FLG_BASE
)
5329 strcat (buff
, "| ");
5331 strcat (buff
, "WEAK ");
5334 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
5335 strcat (buff
, "| <unknown>");
5340 /* Display the contents of the version sections. */
5342 process_version_sections (FILE *file
)
5344 Elf_Internal_Shdr
*section
;
5351 for (i
= 0, section
= section_headers
;
5352 i
< elf_header
.e_shnum
;
5355 switch (section
->sh_type
)
5357 case SHT_GNU_verdef
:
5359 Elf_External_Verdef
*edefs
;
5366 (_("\nVersion definition section '%s' contains %ld entries:\n"),
5367 SECTION_NAME (section
), section
->sh_info
);
5369 printf (_(" Addr: 0x"));
5370 printf_vma (section
->sh_addr
);
5371 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5372 (unsigned long) section
->sh_offset
, section
->sh_link
,
5373 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5375 edefs
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
5376 _("version definition section"));
5380 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5383 Elf_External_Verdef
*edef
;
5384 Elf_Internal_Verdef ent
;
5385 Elf_External_Verdaux
*eaux
;
5386 Elf_Internal_Verdaux aux
;
5390 vstart
= ((char *) edefs
) + idx
;
5392 edef
= (Elf_External_Verdef
*) vstart
;
5394 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
5395 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
5396 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
5397 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
5398 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
5399 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
5400 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
5402 printf (_(" %#06x: Rev: %d Flags: %s"),
5403 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
5405 printf (_(" Index: %d Cnt: %d "),
5406 ent
.vd_ndx
, ent
.vd_cnt
);
5408 vstart
+= ent
.vd_aux
;
5410 eaux
= (Elf_External_Verdaux
*) vstart
;
5412 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5413 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
5415 if (dynamic_strings
)
5416 printf (_("Name: %s\n"), dynamic_strings
+ aux
.vda_name
);
5418 printf (_("Name index: %ld\n"), aux
.vda_name
);
5420 isum
= idx
+ ent
.vd_aux
;
5422 for (j
= 1; j
< ent
.vd_cnt
; j
++)
5424 isum
+= aux
.vda_next
;
5425 vstart
+= aux
.vda_next
;
5427 eaux
= (Elf_External_Verdaux
*) vstart
;
5429 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5430 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
5432 if (dynamic_strings
)
5433 printf (_(" %#06x: Parent %d: %s\n"),
5434 isum
, j
, dynamic_strings
+ aux
.vda_name
);
5436 printf (_(" %#06x: Parent %d, name index: %ld\n"),
5437 isum
, j
, aux
.vda_name
);
5447 case SHT_GNU_verneed
:
5449 Elf_External_Verneed
*eneed
;
5455 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
5456 SECTION_NAME (section
), section
->sh_info
);
5458 printf (_(" Addr: 0x"));
5459 printf_vma (section
->sh_addr
);
5460 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
5461 (unsigned long) section
->sh_offset
, section
->sh_link
,
5462 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5464 eneed
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
5465 _("version need section"));
5469 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5471 Elf_External_Verneed
*entry
;
5472 Elf_Internal_Verneed ent
;
5477 vstart
= ((char *) eneed
) + idx
;
5479 entry
= (Elf_External_Verneed
*) vstart
;
5481 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
5482 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
5483 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
5484 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
5485 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
5487 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
5489 if (dynamic_strings
)
5490 printf (_(" File: %s"), dynamic_strings
+ ent
.vn_file
);
5492 printf (_(" File: %lx"), ent
.vn_file
);
5494 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
5496 vstart
+= ent
.vn_aux
;
5498 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
5500 Elf_External_Vernaux
*eaux
;
5501 Elf_Internal_Vernaux aux
;
5503 eaux
= (Elf_External_Vernaux
*) vstart
;
5505 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
5506 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
5507 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
5508 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
5509 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
5511 if (dynamic_strings
)
5512 printf (_(" %#06x: Name: %s"),
5513 isum
, dynamic_strings
+ aux
.vna_name
);
5515 printf (_(" %#06x: Name index: %lx"),
5516 isum
, aux
.vna_name
);
5518 printf (_(" Flags: %s Version: %d\n"),
5519 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
5521 isum
+= aux
.vna_next
;
5522 vstart
+= aux
.vna_next
;
5532 case SHT_GNU_versym
:
5534 Elf_Internal_Shdr
*link_section
;
5537 unsigned char *edata
;
5538 unsigned short *data
;
5540 Elf_Internal_Sym
*symbols
;
5541 Elf_Internal_Shdr
*string_sec
;
5544 link_section
= SECTION_HEADER (section
->sh_link
);
5545 total
= section
->sh_size
/ section
->sh_entsize
;
5549 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
5551 string_sec
= SECTION_HEADER (link_section
->sh_link
);
5553 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
5554 string_sec
->sh_size
, _("version string table"));
5558 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
5559 SECTION_NAME (section
), total
);
5561 printf (_(" Addr: "));
5562 printf_vma (section
->sh_addr
);
5563 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5564 (unsigned long) section
->sh_offset
, section
->sh_link
,
5565 SECTION_NAME (link_section
));
5567 off
= offset_from_vma (file
,
5568 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
5569 total
* sizeof (short));
5570 edata
= get_data (NULL
, file
, off
, total
* sizeof (short),
5571 _("version symbol data"));
5578 data
= malloc (total
* sizeof (short));
5580 for (cnt
= total
; cnt
--;)
5581 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
5586 for (cnt
= 0; cnt
< total
; cnt
+= 4)
5589 int check_def
, check_need
;
5592 printf (" %03x:", cnt
);
5594 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
5595 switch (data
[cnt
+ j
])
5598 fputs (_(" 0 (*local*) "), stdout
);
5602 fputs (_(" 1 (*global*) "), stdout
);
5606 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
5607 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
5611 if (SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
5614 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
5621 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
5623 Elf_Internal_Verneed ivn
;
5624 unsigned long offset
;
5626 offset
= offset_from_vma
5627 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
5628 sizeof (Elf_External_Verneed
));
5632 Elf_Internal_Vernaux ivna
;
5633 Elf_External_Verneed evn
;
5634 Elf_External_Vernaux evna
;
5635 unsigned long a_off
;
5637 get_data (&evn
, file
, offset
, sizeof (evn
),
5640 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5641 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5643 a_off
= offset
+ ivn
.vn_aux
;
5647 get_data (&evna
, file
, a_off
, sizeof (evna
),
5648 _("version need aux (2)"));
5650 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5651 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5653 a_off
+= ivna
.vna_next
;
5655 while (ivna
.vna_other
!= data
[cnt
+ j
]
5656 && ivna
.vna_next
!= 0);
5658 if (ivna
.vna_other
== data
[cnt
+ j
])
5660 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5662 name
= strtab
+ ivna
.vna_name
;
5663 nn
+= printf ("(%s%-*s",
5665 12 - (int) strlen (name
),
5671 offset
+= ivn
.vn_next
;
5673 while (ivn
.vn_next
);
5676 if (check_def
&& data
[cnt
+ j
] != 0x8001
5677 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5679 Elf_Internal_Verdef ivd
;
5680 Elf_External_Verdef evd
;
5681 unsigned long offset
;
5683 offset
= offset_from_vma
5684 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
5689 get_data (&evd
, file
, offset
, sizeof (evd
),
5692 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5693 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5695 offset
+= ivd
.vd_next
;
5697 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
5698 && ivd
.vd_next
!= 0);
5700 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
5702 Elf_External_Verdaux evda
;
5703 Elf_Internal_Verdaux ivda
;
5705 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5707 get_data (&evda
, file
,
5708 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
5709 sizeof (evda
), _("version def aux"));
5711 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5713 name
= strtab
+ ivda
.vda_name
;
5714 nn
+= printf ("(%s%-*s",
5716 12 - (int) strlen (name
),
5722 printf ("%*c", 18 - nn
, ' ');
5740 printf (_("\nNo version information found in this file.\n"));
5746 get_symbol_binding (unsigned int binding
)
5748 static char buff
[32];
5752 case STB_LOCAL
: return "LOCAL";
5753 case STB_GLOBAL
: return "GLOBAL";
5754 case STB_WEAK
: return "WEAK";
5756 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
5757 sprintf (buff
, _("<processor specific>: %d"), binding
);
5758 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
5759 sprintf (buff
, _("<OS specific>: %d"), binding
);
5761 sprintf (buff
, _("<unknown>: %d"), binding
);
5767 get_symbol_type (unsigned int type
)
5769 static char buff
[32];
5773 case STT_NOTYPE
: return "NOTYPE";
5774 case STT_OBJECT
: return "OBJECT";
5775 case STT_FUNC
: return "FUNC";
5776 case STT_SECTION
: return "SECTION";
5777 case STT_FILE
: return "FILE";
5778 case STT_COMMON
: return "COMMON";
5779 case STT_TLS
: return "TLS";
5781 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
5783 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
5784 return "THUMB_FUNC";
5786 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
5789 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
5790 return "PARISC_MILLI";
5792 sprintf (buff
, _("<processor specific>: %d"), type
);
5794 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
5796 if (elf_header
.e_machine
== EM_PARISC
)
5798 if (type
== STT_HP_OPAQUE
)
5800 if (type
== STT_HP_STUB
)
5804 sprintf (buff
, _("<OS specific>: %d"), type
);
5807 sprintf (buff
, _("<unknown>: %d"), type
);
5813 get_symbol_visibility (unsigned int visibility
)
5817 case STV_DEFAULT
: return "DEFAULT";
5818 case STV_INTERNAL
: return "INTERNAL";
5819 case STV_HIDDEN
: return "HIDDEN";
5820 case STV_PROTECTED
: return "PROTECTED";
5826 get_symbol_index_type (unsigned int type
)
5828 static char buff
[32];
5832 case SHN_UNDEF
: return "UND";
5833 case SHN_ABS
: return "ABS";
5834 case SHN_COMMON
: return "COM";
5836 if (type
== SHN_IA_64_ANSI_COMMON
5837 && elf_header
.e_machine
== EM_IA_64
5838 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
5840 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
5841 sprintf (buff
, "PRC[0x%04x]", type
);
5842 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
5843 sprintf (buff
, "OS [0x%04x]", type
);
5844 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
5845 sprintf (buff
, "RSV[0x%04x]", type
);
5847 sprintf (buff
, "%3d", type
);
5855 get_dynamic_data (FILE *file
, unsigned int number
)
5857 unsigned char *e_data
;
5860 e_data
= malloc (number
* 4);
5864 error (_("Out of memory\n"));
5868 if (fread (e_data
, 4, number
, file
) != number
)
5870 error (_("Unable to read in dynamic data\n"));
5874 i_data
= malloc (number
* sizeof (*i_data
));
5878 error (_("Out of memory\n"));
5884 i_data
[number
] = byte_get (e_data
+ number
* 4, 4);
5891 /* Dump the symbol table. */
5893 process_symbol_table (FILE *file
)
5895 Elf_Internal_Shdr
*section
;
5896 unsigned char nb
[4];
5897 unsigned char nc
[4];
5900 int *buckets
= NULL
;
5903 if (! do_syms
&& !do_histogram
)
5906 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
5910 (archive_file_offset
5911 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
5912 sizeof nb
+ sizeof nc
)),
5915 error (_("Unable to seek to start of dynamic information"));
5919 if (fread (nb
, sizeof (nb
), 1, file
) != 1)
5921 error (_("Failed to read in number of buckets\n"));
5925 if (fread (nc
, sizeof (nc
), 1, file
) != 1)
5927 error (_("Failed to read in number of chains\n"));
5931 nbuckets
= byte_get (nb
, 4);
5932 nchains
= byte_get (nc
, 4);
5934 buckets
= get_dynamic_data (file
, nbuckets
);
5935 chains
= get_dynamic_data (file
, nchains
);
5937 if (buckets
== NULL
|| chains
== NULL
)
5942 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
5947 printf (_("\nSymbol table for image:\n"));
5949 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5951 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5953 for (hn
= 0; hn
< nbuckets
; hn
++)
5958 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
5960 Elf_Internal_Sym
*psym
;
5962 psym
= dynamic_symbols
+ si
;
5964 printf (" %3d %3d: ", si
, hn
);
5965 print_vma (psym
->st_value
, LONG_HEX
);
5967 print_vma (psym
->st_size
, DEC_5
);
5969 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5970 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5971 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5972 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
5973 print_symbol (25, dynamic_strings
+ psym
->st_name
);
5978 else if (do_syms
&& !do_using_dynamic
)
5982 for (i
= 0, section
= section_headers
;
5983 i
< elf_header
.e_shnum
;
5988 Elf_Internal_Sym
*symtab
;
5989 Elf_Internal_Sym
*psym
;
5992 if ( section
->sh_type
!= SHT_SYMTAB
5993 && section
->sh_type
!= SHT_DYNSYM
)
5996 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5997 SECTION_NAME (section
),
5998 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
6000 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6002 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6004 symtab
= GET_ELF_SYMBOLS (file
, section
);
6008 if (section
->sh_link
== elf_header
.e_shstrndx
)
6009 strtab
= string_table
;
6012 Elf_Internal_Shdr
*string_sec
;
6014 string_sec
= SECTION_HEADER (section
->sh_link
);
6016 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
6017 string_sec
->sh_size
, _("string table"));
6020 for (si
= 0, psym
= symtab
;
6021 si
< section
->sh_size
/ section
->sh_entsize
;
6024 printf ("%6d: ", si
);
6025 print_vma (psym
->st_value
, LONG_HEX
);
6027 print_vma (psym
->st_size
, DEC_5
);
6028 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6029 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
6030 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6031 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
6032 print_symbol (25, strtab
+ psym
->st_name
);
6034 if (section
->sh_type
== SHT_DYNSYM
&&
6035 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
6037 unsigned char data
[2];
6038 unsigned short vers_data
;
6039 unsigned long offset
;
6043 offset
= offset_from_vma
6044 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6045 sizeof data
+ si
* sizeof (vers_data
));
6047 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
6048 sizeof (data
), _("version data"));
6050 vers_data
= byte_get (data
, 2);
6052 is_nobits
= (SECTION_HEADER (psym
->st_shndx
)->sh_type
6055 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
6057 if ((vers_data
& 0x8000) || vers_data
> 1)
6059 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
6060 && (is_nobits
|| ! check_def
))
6062 Elf_External_Verneed evn
;
6063 Elf_Internal_Verneed ivn
;
6064 Elf_Internal_Vernaux ivna
;
6066 /* We must test both. */
6067 offset
= offset_from_vma
6068 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6073 unsigned long vna_off
;
6075 get_data (&evn
, file
, offset
, sizeof (evn
),
6078 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6079 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6081 vna_off
= offset
+ ivn
.vn_aux
;
6085 Elf_External_Vernaux evna
;
6087 get_data (&evna
, file
, vna_off
,
6089 _("version need aux (3)"));
6091 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6092 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6093 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6095 vna_off
+= ivna
.vna_next
;
6097 while (ivna
.vna_other
!= vers_data
6098 && ivna
.vna_next
!= 0);
6100 if (ivna
.vna_other
== vers_data
)
6103 offset
+= ivn
.vn_next
;
6105 while (ivn
.vn_next
!= 0);
6107 if (ivna
.vna_other
== vers_data
)
6110 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
6113 else if (! is_nobits
)
6114 error (_("bad dynamic symbol"));
6121 if (vers_data
!= 0x8001
6122 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6124 Elf_Internal_Verdef ivd
;
6125 Elf_Internal_Verdaux ivda
;
6126 Elf_External_Verdaux evda
;
6127 unsigned long offset
;
6129 offset
= offset_from_vma
6131 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6132 sizeof (Elf_External_Verdef
));
6136 Elf_External_Verdef evd
;
6138 get_data (&evd
, file
, offset
, sizeof (evd
),
6141 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6142 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6143 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6145 offset
+= ivd
.vd_next
;
6147 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
6148 && ivd
.vd_next
!= 0);
6150 offset
-= ivd
.vd_next
;
6151 offset
+= ivd
.vd_aux
;
6153 get_data (&evda
, file
, offset
, sizeof (evda
),
6154 _("version def aux"));
6156 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6158 if (psym
->st_name
!= ivda
.vda_name
)
6159 printf ((vers_data
& 0x8000)
6161 strtab
+ ivda
.vda_name
);
6171 if (strtab
!= string_table
)
6177 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
6179 if (do_histogram
&& buckets
!= NULL
)
6186 int nzero_counts
= 0;
6189 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
6191 printf (_(" Length Number %% of total Coverage\n"));
6193 lengths
= calloc (nbuckets
, sizeof (int));
6194 if (lengths
== NULL
)
6196 error (_("Out of memory"));
6199 for (hn
= 0; hn
< nbuckets
; ++hn
)
6204 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
6207 if (maxlength
< ++lengths
[hn
])
6212 counts
= calloc (maxlength
+ 1, sizeof (int));
6215 error (_("Out of memory"));
6219 for (hn
= 0; hn
< nbuckets
; ++hn
)
6220 ++counts
[lengths
[hn
]];
6224 printf (" 0 %-10d (%5.1f%%)\n",
6225 counts
[0], (counts
[0] * 100.0) / nbuckets
);
6226 for (si
= 1; si
<= maxlength
; ++si
)
6228 nzero_counts
+= counts
[si
] * si
;
6229 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
6230 si
, counts
[si
], (counts
[si
] * 100.0) / nbuckets
,
6231 (nzero_counts
* 100.0) / nsyms
);
6239 if (buckets
!= NULL
)
6249 process_syminfo (FILE *file ATTRIBUTE_UNUSED
)
6253 if (dynamic_syminfo
== NULL
6255 /* No syminfo, this is ok. */
6258 /* There better should be a dynamic symbol section. */
6259 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
6263 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
6264 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
6266 printf (_(" Num: Name BoundTo Flags\n"));
6267 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
6269 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
6271 printf ("%4d: ", i
);
6272 print_symbol (30, dynamic_strings
+ dynamic_symbols
[i
].st_name
);
6275 switch (dynamic_syminfo
[i
].si_boundto
)
6277 case SYMINFO_BT_SELF
:
6278 fputs ("SELF ", stdout
);
6280 case SYMINFO_BT_PARENT
:
6281 fputs ("PARENT ", stdout
);
6284 if (dynamic_syminfo
[i
].si_boundto
> 0
6285 && dynamic_syminfo
[i
].si_boundto
< dynamic_size
)
6290 [dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
6294 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
6298 if (flags
& SYMINFO_FLG_DIRECT
)
6300 if (flags
& SYMINFO_FLG_PASSTHRU
)
6301 printf (" PASSTHRU");
6302 if (flags
& SYMINFO_FLG_COPY
)
6304 if (flags
& SYMINFO_FLG_LAZYLOAD
)
6305 printf (" LAZYLOAD");
6313 #ifdef SUPPORT_DISASSEMBLY
6315 disassemble_section (Elf_Internal_Shdr
*section
, FILE *file
)
6317 printf (_("\nAssembly dump of section %s\n"),
6318 SECTION_NAME (section
));
6320 /* XXX -- to be done --- XXX */
6327 dump_section (Elf_Internal_Shdr
*section
, FILE *file
)
6329 bfd_size_type bytes
;
6331 unsigned char *data
;
6332 unsigned char *start
;
6334 bytes
= section
->sh_size
;
6336 if (bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
6338 printf (_("\nSection '%s' has no data to dump.\n"),
6339 SECTION_NAME (section
));
6343 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
6345 addr
= section
->sh_addr
;
6347 start
= get_data (NULL
, file
, section
->sh_offset
, bytes
, _("section data"));
6359 lbytes
= (bytes
> 16 ? 16 : bytes
);
6361 printf (" 0x%8.8lx ", (unsigned long) addr
);
6363 switch (elf_header
.e_ident
[EI_DATA
])
6367 for (j
= 15; j
>= 0; j
--)
6370 printf ("%2.2x", data
[j
]);
6380 for (j
= 0; j
< 16; j
++)
6383 printf ("%2.2x", data
[j
]);
6393 for (j
= 0; j
< lbytes
; j
++)
6396 if (k
>= ' ' && k
< 0x7f)
6415 static unsigned long int
6416 read_leb128 (unsigned char *data
, int *length_return
, int sign
)
6418 unsigned long int result
= 0;
6419 unsigned int num_read
= 0;
6428 result
|= (byte
& 0x7f) << shift
;
6433 while (byte
& 0x80);
6435 if (length_return
!= NULL
)
6436 *length_return
= num_read
;
6438 if (sign
&& (shift
< 32) && (byte
& 0x40))
6439 result
|= -1 << shift
;
6444 typedef struct State_Machine_Registers
6446 unsigned long address
;
6449 unsigned int column
;
6453 /* This variable hold the number of the last entry seen
6454 in the File Table. */
6455 unsigned int last_file_entry
;
6458 static SMR state_machine_regs
;
6461 reset_state_machine (int is_stmt
)
6463 state_machine_regs
.address
= 0;
6464 state_machine_regs
.file
= 1;
6465 state_machine_regs
.line
= 1;
6466 state_machine_regs
.column
= 0;
6467 state_machine_regs
.is_stmt
= is_stmt
;
6468 state_machine_regs
.basic_block
= 0;
6469 state_machine_regs
.end_sequence
= 0;
6470 state_machine_regs
.last_file_entry
= 0;
6473 /* Handled an extend line op. Returns true if this is the end
6476 process_extended_line_op (unsigned char *data
, int is_stmt
, int pointer_size
)
6478 unsigned char op_code
;
6481 unsigned char *name
;
6484 len
= read_leb128 (data
, & bytes_read
, 0);
6489 warn (_("badly formed extended line op encountered!\n"));
6496 printf (_(" Extended opcode %d: "), op_code
);
6500 case DW_LNE_end_sequence
:
6501 printf (_("End of Sequence\n\n"));
6502 reset_state_machine (is_stmt
);
6505 case DW_LNE_set_address
:
6506 adr
= byte_get (data
, pointer_size
);
6507 printf (_("set Address to 0x%lx\n"), adr
);
6508 state_machine_regs
.address
= adr
;
6511 case DW_LNE_define_file
:
6512 printf (_(" define new File Table entry\n"));
6513 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6515 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
6517 data
+= strlen ((char *) data
) + 1;
6518 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6520 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6522 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6523 printf (_("%s\n\n"), name
);
6527 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
6534 /* Finds section NAME inside FILE and returns a
6535 pointer to it, or NULL upon failure. */
6537 static Elf_Internal_Shdr
*
6538 find_section (const char * name
)
6540 Elf_Internal_Shdr
*sec
;
6543 for (i
= elf_header
.e_shnum
, sec
= section_headers
+ i
- 1;
6545 if (strcmp (SECTION_NAME (sec
), name
) == 0)
6548 if (i
&& sec
&& sec
->sh_size
!= 0)
6554 /* Size of pointers in the .debug_line section. This information is not
6555 really present in that section. It's obtained before dumping the debug
6556 sections by doing some pre-scan of the .debug_info section. */
6557 static unsigned int * debug_line_pointer_sizes
= NULL
;
6558 static unsigned int num_debug_line_pointer_sizes
= 0;
6560 /* Locate and scan the .debug_info section in the file and record the pointer
6561 sizes for the compilation units in it. Usually an executable will have
6562 just one pointer size, but this is not guaranteed, and so we try not to
6563 make any assumptions. Returns zero upon failure, or the number of
6564 compilation units upon success. */
6567 get_debug_line_pointer_sizes (FILE * file
)
6569 Elf_Internal_Shdr
* section
;
6570 unsigned char * start
;
6571 unsigned char * end
;
6572 unsigned char * begin
;
6573 unsigned long length
;
6574 unsigned int num_units
;
6577 section
= find_section (".debug_info");
6578 if (section
== NULL
)
6581 length
= section
->sh_size
;
6582 start
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
6583 _("extracting pointer sizes from .debug_info section"));
6587 end
= start
+ section
->sh_size
;
6588 /* First scan the section to get the number of comp units. */
6589 for (begin
= start
, num_units
= 0; begin
< end
; num_units
++)
6591 /* Read the first 4 bytes. For a 32-bit DWARF section, this will
6592 be the length. For a 64-bit DWARF section, it'll be the escape
6593 code 0xffffffff followed by an 8 byte length. */
6594 length
= byte_get (begin
, 4);
6596 if (length
== 0xffffffff)
6598 length
= byte_get (begin
+ 4, 8);
6599 begin
+= length
+ 12;
6602 begin
+= length
+ 4;
6607 error (_("No comp units in .debug_info section ?"));
6612 /* Then allocate an array to hold the pointer sizes. */
6613 debug_line_pointer_sizes
= malloc (num_units
* sizeof * debug_line_pointer_sizes
);
6614 if (debug_line_pointer_sizes
== NULL
)
6616 error (_("Not enough memory for a pointer size array of %u entries"),
6622 /* Populate the array. */
6623 for (begin
= start
, unit
= 0; begin
< end
; unit
++)
6625 length
= byte_get (begin
, 4);
6626 if (length
== 0xffffffff)
6628 /* For 64-bit DWARF, the 1-byte address_size field is 22 bytes
6629 from the start of the section. This is computed as follows:
6631 unit_length: 12 bytes
6633 debug_abbrev_offset: 8 bytes
6634 -----------------------------
6637 debug_line_pointer_sizes
[unit
] = byte_get (begin
+ 22, 1);
6638 length
= byte_get (begin
+ 4, 8);
6639 begin
+= length
+ 12;
6643 /* For 32-bit DWARF, the 1-byte address_size field is 10 bytes from
6644 the start of the section:
6646 unit_length: 4 bytes
6648 debug_abbrev_offset: 4 bytes
6649 -----------------------------
6652 debug_line_pointer_sizes
[unit
] = byte_get (begin
+ 10, 1);
6653 begin
+= length
+ 4;
6658 num_debug_line_pointer_sizes
= num_units
;
6663 display_debug_lines (Elf_Internal_Shdr
*section
,
6664 unsigned char *start
, FILE *file
)
6666 unsigned char *hdrptr
;
6667 DWARF2_Internal_LineInfo info
;
6668 unsigned char *standard_opcodes
;
6669 unsigned char *data
= start
;
6670 unsigned char *end
= start
+ section
->sh_size
;
6671 unsigned char *end_of_sequence
;
6674 int initial_length_size
;
6675 unsigned int comp_unit
= 0;
6677 printf (_("\nDump of debug contents of section %s:\n\n"),
6678 SECTION_NAME (section
));
6680 if (num_debug_line_pointer_sizes
== 0)
6681 get_debug_line_pointer_sizes (file
);
6685 unsigned int pointer_size
;
6689 /* Check the length of the block. */
6690 info
.li_length
= byte_get (hdrptr
, 4);
6693 if (info
.li_length
== 0xffffffff)
6695 /* This section is 64-bit DWARF 3. */
6696 info
.li_length
= byte_get (hdrptr
, 8);
6699 initial_length_size
= 12;
6704 initial_length_size
= 4;
6707 if (info
.li_length
+ initial_length_size
> section
->sh_size
)
6710 (_("The line info appears to be corrupt - the section is too small\n"));
6714 /* Check its version number. */
6715 info
.li_version
= byte_get (hdrptr
, 2);
6717 if (info
.li_version
!= 2 && info
.li_version
!= 3)
6719 warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
6723 info
.li_prologue_length
= byte_get (hdrptr
, offset_size
);
6724 hdrptr
+= offset_size
;
6725 info
.li_min_insn_length
= byte_get (hdrptr
, 1);
6727 info
.li_default_is_stmt
= byte_get (hdrptr
, 1);
6729 info
.li_line_base
= byte_get (hdrptr
, 1);
6731 info
.li_line_range
= byte_get (hdrptr
, 1);
6733 info
.li_opcode_base
= byte_get (hdrptr
, 1);
6736 /* Sign extend the line base field. */
6737 info
.li_line_base
<<= 24;
6738 info
.li_line_base
>>= 24;
6740 /* Get the pointer size from the comp unit associated
6741 with this block of line number information. */
6742 if (comp_unit
>= num_debug_line_pointer_sizes
)
6744 error (_("Not enough comp units for .debug_lines section\n"));
6749 pointer_size
= debug_line_pointer_sizes
[comp_unit
];
6753 printf (_(" Length: %ld\n"), info
.li_length
);
6754 printf (_(" DWARF Version: %d\n"), info
.li_version
);
6755 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
6756 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
6757 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
6758 printf (_(" Line Base: %d\n"), info
.li_line_base
);
6759 printf (_(" Line Range: %d\n"), info
.li_line_range
);
6760 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
6761 printf (_(" (Pointer size: %u)\n"), pointer_size
);
6763 end_of_sequence
= data
+ info
.li_length
+ initial_length_size
;
6765 reset_state_machine (info
.li_default_is_stmt
);
6767 /* Display the contents of the Opcodes table. */
6768 standard_opcodes
= hdrptr
;
6770 printf (_("\n Opcodes:\n"));
6772 for (i
= 1; i
< info
.li_opcode_base
; i
++)
6773 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
6775 /* Display the contents of the Directory table. */
6776 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
6779 printf (_("\n The Directory Table is empty.\n"));
6782 printf (_("\n The Directory Table:\n"));
6786 printf (_(" %s\n"), data
);
6788 data
+= strlen ((char *) data
) + 1;
6792 /* Skip the NUL at the end of the table. */
6795 /* Display the contents of the File Name table. */
6797 printf (_("\n The File Name Table is empty.\n"));
6800 printf (_("\n The File Name Table:\n"));
6801 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6805 unsigned char *name
;
6808 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
6811 data
+= strlen ((char *) data
) + 1;
6813 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6815 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6817 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6819 printf (_("%s\n"), name
);
6823 /* Skip the NUL at the end of the table. */
6826 /* Now display the statements. */
6827 printf (_("\n Line Number Statements:\n"));
6830 while (data
< end_of_sequence
)
6832 unsigned char op_code
;
6838 if (op_code
>= info
.li_opcode_base
)
6840 op_code
-= info
.li_opcode_base
;
6841 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
6842 state_machine_regs
.address
+= adv
;
6843 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6844 op_code
, adv
, state_machine_regs
.address
);
6845 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
6846 state_machine_regs
.line
+= adv
;
6847 printf (_(" and Line by %d to %d\n"),
6848 adv
, state_machine_regs
.line
);
6850 else switch (op_code
)
6852 case DW_LNS_extended_op
:
6853 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
6858 printf (_(" Copy\n"));
6861 case DW_LNS_advance_pc
:
6862 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
6864 state_machine_regs
.address
+= adv
;
6865 printf (_(" Advance PC by %d to %lx\n"), adv
,
6866 state_machine_regs
.address
);
6869 case DW_LNS_advance_line
:
6870 adv
= read_leb128 (data
, & bytes_read
, 1);
6872 state_machine_regs
.line
+= adv
;
6873 printf (_(" Advance Line by %d to %d\n"), adv
,
6874 state_machine_regs
.line
);
6877 case DW_LNS_set_file
:
6878 adv
= read_leb128 (data
, & bytes_read
, 0);
6880 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6882 state_machine_regs
.file
= adv
;
6885 case DW_LNS_set_column
:
6886 adv
= read_leb128 (data
, & bytes_read
, 0);
6888 printf (_(" Set column to %d\n"), adv
);
6889 state_machine_regs
.column
= adv
;
6892 case DW_LNS_negate_stmt
:
6893 adv
= state_machine_regs
.is_stmt
;
6895 printf (_(" Set is_stmt to %d\n"), adv
);
6896 state_machine_regs
.is_stmt
= adv
;
6899 case DW_LNS_set_basic_block
:
6900 printf (_(" Set basic block\n"));
6901 state_machine_regs
.basic_block
= 1;
6904 case DW_LNS_const_add_pc
:
6905 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
6906 * info
.li_min_insn_length
);
6907 state_machine_regs
.address
+= adv
;
6908 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
6909 state_machine_regs
.address
);
6912 case DW_LNS_fixed_advance_pc
:
6913 adv
= byte_get (data
, 2);
6915 state_machine_regs
.address
+= adv
;
6916 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6917 adv
, state_machine_regs
.address
);
6920 case DW_LNS_set_prologue_end
:
6921 printf (_(" Set prologue_end to true\n"));
6924 case DW_LNS_set_epilogue_begin
:
6925 printf (_(" Set epilogue_begin to true\n"));
6928 case DW_LNS_set_isa
:
6929 adv
= read_leb128 (data
, & bytes_read
, 0);
6931 printf (_(" Set ISA to %d\n"), adv
);
6935 printf (_(" Unknown opcode %d with operands: "), op_code
);
6938 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
6940 printf ("0x%lx%s", read_leb128 (data
, &bytes_read
, 0),
6941 i
== 1 ? "" : ", ");
6956 display_debug_pubnames (Elf_Internal_Shdr
*section
,
6957 unsigned char *start
,
6958 FILE *file ATTRIBUTE_UNUSED
)
6960 DWARF2_Internal_PubNames pubnames
;
6963 end
= start
+ section
->sh_size
;
6965 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6969 unsigned char *data
;
6970 unsigned long offset
;
6971 int offset_size
, initial_length_size
;
6975 pubnames
.pn_length
= byte_get (data
, 4);
6977 if (pubnames
.pn_length
== 0xffffffff)
6979 pubnames
.pn_length
= byte_get (data
, 8);
6982 initial_length_size
= 12;
6987 initial_length_size
= 4;
6990 pubnames
.pn_version
= byte_get (data
, 2);
6992 pubnames
.pn_offset
= byte_get (data
, offset_size
);
6993 data
+= offset_size
;
6994 pubnames
.pn_size
= byte_get (data
, offset_size
);
6995 data
+= offset_size
;
6997 start
+= pubnames
.pn_length
+ initial_length_size
;
6999 if (pubnames
.pn_version
!= 2 && pubnames
.pn_version
!= 3)
7001 static int warned
= 0;
7005 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
7012 printf (_(" Length: %ld\n"),
7013 pubnames
.pn_length
);
7014 printf (_(" Version: %d\n"),
7015 pubnames
.pn_version
);
7016 printf (_(" Offset into .debug_info section: %ld\n"),
7017 pubnames
.pn_offset
);
7018 printf (_(" Size of area in .debug_info section: %ld\n"),
7021 printf (_("\n Offset\tName\n"));
7025 offset
= byte_get (data
, offset_size
);
7029 data
+= offset_size
;
7030 printf (" %-6ld\t\t%s\n", offset
, data
);
7031 data
+= strlen ((char *) data
) + 1;
7034 while (offset
!= 0);
7042 get_TAG_name (unsigned long tag
)
7046 case DW_TAG_padding
: return "DW_TAG_padding";
7047 case DW_TAG_array_type
: return "DW_TAG_array_type";
7048 case DW_TAG_class_type
: return "DW_TAG_class_type";
7049 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
7050 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
7051 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
7052 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
7053 case DW_TAG_label
: return "DW_TAG_label";
7054 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
7055 case DW_TAG_member
: return "DW_TAG_member";
7056 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
7057 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
7058 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
7059 case DW_TAG_string_type
: return "DW_TAG_string_type";
7060 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
7061 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
7062 case DW_TAG_typedef
: return "DW_TAG_typedef";
7063 case DW_TAG_union_type
: return "DW_TAG_union_type";
7064 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
7065 case DW_TAG_variant
: return "DW_TAG_variant";
7066 case DW_TAG_common_block
: return "DW_TAG_common_block";
7067 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
7068 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
7069 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
7070 case DW_TAG_module
: return "DW_TAG_module";
7071 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
7072 case DW_TAG_set_type
: return "DW_TAG_set_type";
7073 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
7074 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
7075 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
7076 case DW_TAG_base_type
: return "DW_TAG_base_type";
7077 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
7078 case DW_TAG_const_type
: return "DW_TAG_const_type";
7079 case DW_TAG_constant
: return "DW_TAG_constant";
7080 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
7081 case DW_TAG_file_type
: return "DW_TAG_file_type";
7082 case DW_TAG_friend
: return "DW_TAG_friend";
7083 case DW_TAG_namelist
: return "DW_TAG_namelist";
7084 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
7085 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
7086 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
7087 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
7088 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
7089 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
7090 case DW_TAG_try_block
: return "DW_TAG_try_block";
7091 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
7092 case DW_TAG_variable
: return "DW_TAG_variable";
7093 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
7094 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
7095 case DW_TAG_format_label
: return "DW_TAG_format_label";
7096 case DW_TAG_function_template
: return "DW_TAG_function_template";
7097 case DW_TAG_class_template
: return "DW_TAG_class_template";
7098 /* DWARF 2.1 values. */
7099 case DW_TAG_dwarf_procedure
: return "DW_TAG_dwarf_procedure";
7100 case DW_TAG_restrict_type
: return "DW_TAG_restrict_type";
7101 case DW_TAG_interface_type
: return "DW_TAG_interface_type";
7102 case DW_TAG_namespace
: return "DW_TAG_namespace";
7103 case DW_TAG_imported_module
: return "DW_TAG_imported_module";
7104 case DW_TAG_unspecified_type
: return "DW_TAG_unspecified_type";
7105 case DW_TAG_partial_unit
: return "DW_TAG_partial_unit";
7106 case DW_TAG_imported_unit
: return "DW_TAG_imported_unit";
7108 case DW_TAG_upc_shared_type
: return "DW_TAG_upc_shared_type";
7109 case DW_TAG_upc_strict_type
: return "DW_TAG_upc_strict_type";
7110 case DW_TAG_upc_relaxed_type
: return "DW_TAG_upc_relaxed_type";
7113 static char buffer
[100];
7115 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
7122 get_AT_name (unsigned long attribute
)
7126 case DW_AT_sibling
: return "DW_AT_sibling";
7127 case DW_AT_location
: return "DW_AT_location";
7128 case DW_AT_name
: return "DW_AT_name";
7129 case DW_AT_ordering
: return "DW_AT_ordering";
7130 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
7131 case DW_AT_byte_size
: return "DW_AT_byte_size";
7132 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
7133 case DW_AT_bit_size
: return "DW_AT_bit_size";
7134 case DW_AT_element_list
: return "DW_AT_element_list";
7135 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
7136 case DW_AT_low_pc
: return "DW_AT_low_pc";
7137 case DW_AT_high_pc
: return "DW_AT_high_pc";
7138 case DW_AT_language
: return "DW_AT_language";
7139 case DW_AT_member
: return "DW_AT_member";
7140 case DW_AT_discr
: return "DW_AT_discr";
7141 case DW_AT_discr_value
: return "DW_AT_discr_value";
7142 case DW_AT_visibility
: return "DW_AT_visibility";
7143 case DW_AT_import
: return "DW_AT_import";
7144 case DW_AT_string_length
: return "DW_AT_string_length";
7145 case DW_AT_common_reference
: return "DW_AT_common_reference";
7146 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
7147 case DW_AT_const_value
: return "DW_AT_const_value";
7148 case DW_AT_containing_type
: return "DW_AT_containing_type";
7149 case DW_AT_default_value
: return "DW_AT_default_value";
7150 case DW_AT_inline
: return "DW_AT_inline";
7151 case DW_AT_is_optional
: return "DW_AT_is_optional";
7152 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
7153 case DW_AT_producer
: return "DW_AT_producer";
7154 case DW_AT_prototyped
: return "DW_AT_prototyped";
7155 case DW_AT_return_addr
: return "DW_AT_return_addr";
7156 case DW_AT_start_scope
: return "DW_AT_start_scope";
7157 case DW_AT_stride_size
: return "DW_AT_stride_size";
7158 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
7159 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
7160 case DW_AT_accessibility
: return "DW_AT_accessibility";
7161 case DW_AT_address_class
: return "DW_AT_address_class";
7162 case DW_AT_artificial
: return "DW_AT_artificial";
7163 case DW_AT_base_types
: return "DW_AT_base_types";
7164 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
7165 case DW_AT_count
: return "DW_AT_count";
7166 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
7167 case DW_AT_decl_column
: return "DW_AT_decl_column";
7168 case DW_AT_decl_file
: return "DW_AT_decl_file";
7169 case DW_AT_decl_line
: return "DW_AT_decl_line";
7170 case DW_AT_declaration
: return "DW_AT_declaration";
7171 case DW_AT_discr_list
: return "DW_AT_discr_list";
7172 case DW_AT_encoding
: return "DW_AT_encoding";
7173 case DW_AT_external
: return "DW_AT_external";
7174 case DW_AT_frame_base
: return "DW_AT_frame_base";
7175 case DW_AT_friend
: return "DW_AT_friend";
7176 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
7177 case DW_AT_macro_info
: return "DW_AT_macro_info";
7178 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
7179 case DW_AT_priority
: return "DW_AT_priority";
7180 case DW_AT_segment
: return "DW_AT_segment";
7181 case DW_AT_specification
: return "DW_AT_specification";
7182 case DW_AT_static_link
: return "DW_AT_static_link";
7183 case DW_AT_type
: return "DW_AT_type";
7184 case DW_AT_use_location
: return "DW_AT_use_location";
7185 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
7186 case DW_AT_virtuality
: return "DW_AT_virtuality";
7187 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
7188 /* DWARF 2.1 values. */
7189 case DW_AT_allocated
: return "DW_AT_allocated";
7190 case DW_AT_associated
: return "DW_AT_associated";
7191 case DW_AT_data_location
: return "DW_AT_data_location";
7192 case DW_AT_stride
: return "DW_AT_stride";
7193 case DW_AT_entry_pc
: return "DW_AT_entry_pc";
7194 case DW_AT_use_UTF8
: return "DW_AT_use_UTF8";
7195 case DW_AT_extension
: return "DW_AT_extension";
7196 case DW_AT_ranges
: return "DW_AT_ranges";
7197 case DW_AT_trampoline
: return "DW_AT_trampoline";
7198 case DW_AT_call_column
: return "DW_AT_call_column";
7199 case DW_AT_call_file
: return "DW_AT_call_file";
7200 case DW_AT_call_line
: return "DW_AT_call_line";
7201 /* SGI/MIPS extensions. */
7202 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
7203 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
7204 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
7205 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
7206 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
7207 case DW_AT_MIPS_software_pipeline_depth
:
7208 return "DW_AT_MIPS_software_pipeline_depth";
7209 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
7210 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
7211 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
7212 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
7213 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
7214 /* GNU extensions. */
7215 case DW_AT_sf_names
: return "DW_AT_sf_names";
7216 case DW_AT_src_info
: return "DW_AT_src_info";
7217 case DW_AT_mac_info
: return "DW_AT_mac_info";
7218 case DW_AT_src_coords
: return "DW_AT_src_coords";
7219 case DW_AT_body_begin
: return "DW_AT_body_begin";
7220 case DW_AT_body_end
: return "DW_AT_body_end";
7221 case DW_AT_GNU_vector
: return "DW_AT_GNU_vector";
7222 /* UPC extension. */
7223 case DW_AT_upc_threads_scaled
: return "DW_AT_upc_threads_scaled";
7226 static char buffer
[100];
7228 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
7235 get_FORM_name (unsigned long form
)
7239 case DW_FORM_addr
: return "DW_FORM_addr";
7240 case DW_FORM_block2
: return "DW_FORM_block2";
7241 case DW_FORM_block4
: return "DW_FORM_block4";
7242 case DW_FORM_data2
: return "DW_FORM_data2";
7243 case DW_FORM_data4
: return "DW_FORM_data4";
7244 case DW_FORM_data8
: return "DW_FORM_data8";
7245 case DW_FORM_string
: return "DW_FORM_string";
7246 case DW_FORM_block
: return "DW_FORM_block";
7247 case DW_FORM_block1
: return "DW_FORM_block1";
7248 case DW_FORM_data1
: return "DW_FORM_data1";
7249 case DW_FORM_flag
: return "DW_FORM_flag";
7250 case DW_FORM_sdata
: return "DW_FORM_sdata";
7251 case DW_FORM_strp
: return "DW_FORM_strp";
7252 case DW_FORM_udata
: return "DW_FORM_udata";
7253 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
7254 case DW_FORM_ref1
: return "DW_FORM_ref1";
7255 case DW_FORM_ref2
: return "DW_FORM_ref2";
7256 case DW_FORM_ref4
: return "DW_FORM_ref4";
7257 case DW_FORM_ref8
: return "DW_FORM_ref8";
7258 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
7259 case DW_FORM_indirect
: return "DW_FORM_indirect";
7262 static char buffer
[100];
7264 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
7270 /* FIXME: There are better and more efficient ways to handle
7271 these structures. For now though, I just want something that
7272 is simple to implement. */
7273 typedef struct abbrev_attr
7275 unsigned long attribute
;
7277 struct abbrev_attr
*next
;
7281 typedef struct abbrev_entry
7283 unsigned long entry
;
7286 struct abbrev_attr
*first_attr
;
7287 struct abbrev_attr
*last_attr
;
7288 struct abbrev_entry
*next
;
7292 static abbrev_entry
*first_abbrev
= NULL
;
7293 static abbrev_entry
*last_abbrev
= NULL
;
7298 abbrev_entry
*abbrev
;
7300 for (abbrev
= first_abbrev
; abbrev
;)
7302 abbrev_entry
*next
= abbrev
->next
;
7305 for (attr
= abbrev
->first_attr
; attr
;)
7307 abbrev_attr
*next
= attr
->next
;
7317 last_abbrev
= first_abbrev
= NULL
;
7321 add_abbrev (unsigned long number
, unsigned long tag
, int children
)
7323 abbrev_entry
*entry
;
7325 entry
= malloc (sizeof (*entry
));
7331 entry
->entry
= number
;
7333 entry
->children
= children
;
7334 entry
->first_attr
= NULL
;
7335 entry
->last_attr
= NULL
;
7338 if (first_abbrev
== NULL
)
7339 first_abbrev
= entry
;
7341 last_abbrev
->next
= entry
;
7343 last_abbrev
= entry
;
7347 add_abbrev_attr (unsigned long attribute
, unsigned long form
)
7351 attr
= malloc (sizeof (*attr
));
7357 attr
->attribute
= attribute
;
7361 if (last_abbrev
->first_attr
== NULL
)
7362 last_abbrev
->first_attr
= attr
;
7364 last_abbrev
->last_attr
->next
= attr
;
7366 last_abbrev
->last_attr
= attr
;
7369 /* Processes the (partial) contents of a .debug_abbrev section.
7370 Returns NULL if the end of the section was encountered.
7371 Returns the address after the last byte read if the end of
7372 an abbreviation set was found. */
7374 static unsigned char *
7375 process_abbrev_section (unsigned char *start
, unsigned char *end
)
7377 if (first_abbrev
!= NULL
)
7383 unsigned long entry
;
7385 unsigned long attribute
;
7388 entry
= read_leb128 (start
, & bytes_read
, 0);
7389 start
+= bytes_read
;
7391 /* A single zero is supposed to end the section according
7392 to the standard. If there's more, then signal that to
7395 return start
== end
? NULL
: start
;
7397 tag
= read_leb128 (start
, & bytes_read
, 0);
7398 start
+= bytes_read
;
7400 children
= *start
++;
7402 add_abbrev (entry
, tag
, children
);
7408 attribute
= read_leb128 (start
, & bytes_read
, 0);
7409 start
+= bytes_read
;
7411 form
= read_leb128 (start
, & bytes_read
, 0);
7412 start
+= bytes_read
;
7415 add_abbrev_attr (attribute
, form
);
7417 while (attribute
!= 0);
7425 display_debug_macinfo (Elf_Internal_Shdr
*section
,
7426 unsigned char *start
,
7427 FILE *file ATTRIBUTE_UNUSED
)
7429 unsigned char *end
= start
+ section
->sh_size
;
7430 unsigned char *curr
= start
;
7431 unsigned int bytes_read
;
7432 enum dwarf_macinfo_record_type op
;
7434 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7438 unsigned int lineno
;
7446 case DW_MACINFO_start_file
:
7448 unsigned int filenum
;
7450 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7452 filenum
= read_leb128 (curr
, & bytes_read
, 0);
7455 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno
, filenum
);
7459 case DW_MACINFO_end_file
:
7460 printf (_(" DW_MACINFO_end_file\n"));
7463 case DW_MACINFO_define
:
7464 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7467 curr
+= strlen (string
) + 1;
7468 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno
, string
);
7471 case DW_MACINFO_undef
:
7472 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7475 curr
+= strlen (string
) + 1;
7476 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno
, string
);
7479 case DW_MACINFO_vendor_ext
:
7481 unsigned int constant
;
7483 constant
= read_leb128 (curr
, & bytes_read
, 0);
7486 curr
+= strlen (string
) + 1;
7487 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant
, string
);
7498 display_debug_abbrev (Elf_Internal_Shdr
*section
,
7499 unsigned char *start
,
7500 FILE *file ATTRIBUTE_UNUSED
)
7502 abbrev_entry
*entry
;
7503 unsigned char *end
= start
+ section
->sh_size
;
7505 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7509 start
= process_abbrev_section (start
, end
);
7511 if (first_abbrev
== NULL
)
7514 printf (_(" Number TAG\n"));
7516 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
7520 printf (_(" %ld %s [%s]\n"),
7522 get_TAG_name (entry
->tag
),
7523 entry
->children
? _("has children") : _("no children"));
7525 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
7527 printf (_(" %-18s %s\n"),
7528 get_AT_name (attr
->attribute
),
7529 get_FORM_name (attr
->form
));
7543 static unsigned char *
7544 display_block (unsigned char *data
, unsigned long length
)
7546 printf (_(" %lu byte block: "), length
);
7549 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
7555 decode_location_expression (unsigned char * data
,
7556 unsigned int pointer_size
,
7557 unsigned long length
)
7561 unsigned long uvalue
;
7562 unsigned char *end
= data
+ length
;
7571 printf ("DW_OP_addr: %lx",
7572 (unsigned long) byte_get (data
, pointer_size
));
7573 data
+= pointer_size
;
7576 printf ("DW_OP_deref");
7579 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
7582 printf ("DW_OP_const1s: %ld", (long) byte_get (data
++, 1));
7585 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
7589 printf ("DW_OP_const2s: %ld", (long) byte_get (data
, 2));
7593 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
7597 printf ("DW_OP_const4s: %ld", (long) byte_get (data
, 4));
7601 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
7602 (unsigned long) byte_get (data
+ 4, 4));
7606 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
7607 (long) byte_get (data
+ 4, 4));
7611 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
7615 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
7619 printf ("DW_OP_dup");
7622 printf ("DW_OP_drop");
7625 printf ("DW_OP_over");
7628 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
7631 printf ("DW_OP_swap");
7634 printf ("DW_OP_rot");
7637 printf ("DW_OP_xderef");
7640 printf ("DW_OP_abs");
7643 printf ("DW_OP_and");
7646 printf ("DW_OP_div");
7649 printf ("DW_OP_minus");
7652 printf ("DW_OP_mod");
7655 printf ("DW_OP_mul");
7658 printf ("DW_OP_neg");
7661 printf ("DW_OP_not");
7664 printf ("DW_OP_or");
7667 printf ("DW_OP_plus");
7669 case DW_OP_plus_uconst
:
7670 printf ("DW_OP_plus_uconst: %lu",
7671 read_leb128 (data
, &bytes_read
, 0));
7675 printf ("DW_OP_shl");
7678 printf ("DW_OP_shr");
7681 printf ("DW_OP_shra");
7684 printf ("DW_OP_xor");
7687 printf ("DW_OP_bra: %ld", (long) byte_get (data
, 2));
7691 printf ("DW_OP_eq");
7694 printf ("DW_OP_ge");
7697 printf ("DW_OP_gt");
7700 printf ("DW_OP_le");
7703 printf ("DW_OP_lt");
7706 printf ("DW_OP_ne");
7709 printf ("DW_OP_skip: %ld", (long) byte_get (data
, 2));
7745 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
7780 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
7815 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
7816 read_leb128 (data
, &bytes_read
, 1));
7821 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
7825 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
7829 uvalue
= read_leb128 (data
, &bytes_read
, 0);
7831 printf ("DW_OP_bregx: %lu %ld", uvalue
,
7832 read_leb128 (data
, &bytes_read
, 1));
7836 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
7839 case DW_OP_deref_size
:
7840 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
7842 case DW_OP_xderef_size
:
7843 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
7846 printf ("DW_OP_nop");
7849 /* DWARF 3 extensions. */
7850 case DW_OP_push_object_address
:
7851 printf ("DW_OP_push_object_address");
7854 printf ("DW_OP_call2: <%lx>", (long) byte_get (data
, 2));
7858 printf ("DW_OP_call4: <%lx>", (long) byte_get (data
, 4));
7861 case DW_OP_call_ref
:
7862 printf ("DW_OP_call_ref");
7865 /* GNU extensions. */
7866 case DW_OP_GNU_push_tls_address
:
7867 printf ("DW_OP_GNU_push_tls_address");
7871 if (op
>= DW_OP_lo_user
7872 && op
<= DW_OP_hi_user
)
7873 printf (_("(User defined location op)"));
7875 printf (_("(Unknown location op)"));
7876 /* No way to tell where the next op is, so just bail. */
7880 /* Separate the ops. */
7886 static const char *debug_loc_contents
;
7887 static bfd_vma debug_loc_size
;
7890 load_debug_loc (FILE *file
)
7892 Elf_Internal_Shdr
*sec
;
7894 /* If it is already loaded, do nothing. */
7895 if (debug_loc_contents
!= NULL
)
7898 /* Locate the .debug_loc section. */
7899 sec
= find_section (".debug_loc");
7903 debug_loc_size
= sec
->sh_size
;
7905 debug_loc_contents
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7906 _("debug_loc section data"));
7910 free_debug_loc (void)
7912 if (debug_loc_contents
== NULL
)
7915 free ((char *) debug_loc_contents
);
7916 debug_loc_contents
= NULL
;
7922 display_debug_loc (Elf_Internal_Shdr
*section
,
7923 unsigned char *start
, FILE *file
)
7925 unsigned char *section_end
;
7926 unsigned long bytes
;
7927 unsigned char *section_begin
= start
;
7929 unsigned int comp_unit
= 0;
7931 addr
= section
->sh_addr
;
7932 bytes
= section
->sh_size
;
7933 section_end
= start
+ bytes
;
7937 printf (_("\nThe .debug_loc section is empty.\n"));
7941 if (num_debug_line_pointer_sizes
== 0)
7942 get_debug_line_pointer_sizes (file
);
7944 printf (_("Contents of the .debug_loc section:\n\n"));
7945 printf (_("\n Offset Begin End Expression\n"));
7947 while (start
< section_end
)
7949 unsigned long begin
;
7951 unsigned short length
;
7952 unsigned long offset
;
7953 unsigned int pointer_size
;
7955 offset
= start
- section_begin
;
7957 /* Get the pointer size from the comp unit associated
7958 with this block of location information. */
7959 if (comp_unit
>= num_debug_line_pointer_sizes
)
7961 error (_("Not enough comp units for .debug_loc section\n"));
7966 pointer_size
= debug_line_pointer_sizes
[comp_unit
];
7972 begin
= byte_get (start
, pointer_size
);
7973 start
+= pointer_size
;
7974 end
= byte_get (start
, pointer_size
);
7975 start
+= pointer_size
;
7977 if (begin
== 0 && end
== 0)
7980 /* For now, skip any base address specifiers. */
7981 if (begin
== 0xffffffff)
7987 length
= byte_get (start
, 2);
7990 printf (" %8.8lx %8.8lx %8.8lx (", offset
, begin
, end
);
7991 decode_location_expression (start
, pointer_size
, length
);
8001 static const char *debug_str_contents
;
8002 static bfd_vma debug_str_size
;
8005 load_debug_str (FILE *file
)
8007 Elf_Internal_Shdr
*sec
;
8009 /* If it is already loaded, do nothing. */
8010 if (debug_str_contents
!= NULL
)
8013 /* Locate the .debug_str section. */
8014 sec
= find_section (".debug_str");
8018 debug_str_size
= sec
->sh_size
;
8020 debug_str_contents
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
8021 _("debug_str section data"));
8025 free_debug_str (void)
8027 if (debug_str_contents
== NULL
)
8030 free ((char *) debug_str_contents
);
8031 debug_str_contents
= NULL
;
8036 fetch_indirect_string (unsigned long offset
)
8038 if (debug_str_contents
== NULL
)
8039 return _("<no .debug_str section>");
8041 if (offset
> debug_str_size
)
8042 return _("<offset is too big>");
8044 return debug_str_contents
+ offset
;
8048 display_debug_str (Elf_Internal_Shdr
*section
,
8049 unsigned char *start
,
8050 FILE *file ATTRIBUTE_UNUSED
)
8052 unsigned long bytes
;
8055 addr
= section
->sh_addr
;
8056 bytes
= section
->sh_size
;
8060 printf (_("\nThe .debug_str section is empty.\n"));
8064 printf (_("Contents of the .debug_str section:\n\n"));
8072 lbytes
= (bytes
> 16 ? 16 : bytes
);
8074 printf (" 0x%8.8lx ", (unsigned long) addr
);
8076 for (j
= 0; j
< 16; j
++)
8079 printf ("%2.2x", start
[j
]);
8087 for (j
= 0; j
< lbytes
; j
++)
8090 if (k
>= ' ' && k
< 0x80)
8106 static unsigned char *
8107 read_and_display_attr_value (unsigned long attribute
,
8109 unsigned char *data
,
8110 unsigned long cu_offset
,
8111 unsigned long pointer_size
,
8112 unsigned long offset_size
,
8115 unsigned long uvalue
= 0;
8116 unsigned char *block_start
= NULL
;
8124 case DW_FORM_ref_addr
:
8125 if (dwarf_version
== 2)
8127 uvalue
= byte_get (data
, pointer_size
);
8128 data
+= pointer_size
;
8130 else if (dwarf_version
== 3)
8132 uvalue
= byte_get (data
, offset_size
);
8133 data
+= offset_size
;
8137 error (_("Internal error: DWARF version is not 2 or 3.\n"));
8142 uvalue
= byte_get (data
, pointer_size
);
8143 data
+= pointer_size
;
8147 uvalue
= byte_get (data
, offset_size
);
8148 data
+= offset_size
;
8154 uvalue
= byte_get (data
++, 1);
8159 uvalue
= byte_get (data
, 2);
8165 uvalue
= byte_get (data
, 4);
8170 uvalue
= read_leb128 (data
, & bytes_read
, 1);
8174 case DW_FORM_ref_udata
:
8176 uvalue
= read_leb128 (data
, & bytes_read
, 0);
8180 case DW_FORM_indirect
:
8181 form
= read_leb128 (data
, & bytes_read
, 0);
8183 printf (" %s", get_FORM_name (form
));
8184 return read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
8185 pointer_size
, offset_size
,
8191 case DW_FORM_ref_addr
:
8192 printf (" <#%lx>", uvalue
);
8198 case DW_FORM_ref_udata
:
8199 printf (" <%lx>", uvalue
+ cu_offset
);
8203 printf (" %#lx", uvalue
);
8212 printf (" %ld", uvalue
);
8217 uvalue
= byte_get (data
, 4);
8218 printf (" %lx", uvalue
);
8219 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
8223 case DW_FORM_string
:
8224 printf (" %s", data
);
8225 data
+= strlen ((char *) data
) + 1;
8229 uvalue
= read_leb128 (data
, & bytes_read
, 0);
8230 block_start
= data
+ bytes_read
;
8231 data
= display_block (block_start
, uvalue
);
8234 case DW_FORM_block1
:
8235 uvalue
= byte_get (data
, 1);
8236 block_start
= data
+ 1;
8237 data
= display_block (block_start
, uvalue
);
8240 case DW_FORM_block2
:
8241 uvalue
= byte_get (data
, 2);
8242 block_start
= data
+ 2;
8243 data
= display_block (block_start
, uvalue
);
8246 case DW_FORM_block4
:
8247 uvalue
= byte_get (data
, 4);
8248 block_start
= data
+ 4;
8249 data
= display_block (block_start
, uvalue
);
8253 printf (_(" (indirect string, offset: 0x%lx): %s"),
8254 uvalue
, fetch_indirect_string (uvalue
));
8257 case DW_FORM_indirect
:
8258 /* Handled above. */
8262 warn (_("Unrecognized form: %d\n"), form
);
8266 /* For some attributes we can display further information. */
8275 case DW_INL_not_inlined
:
8276 printf (_("(not inlined)"));
8278 case DW_INL_inlined
:
8279 printf (_("(inlined)"));
8281 case DW_INL_declared_not_inlined
:
8282 printf (_("(declared as inline but ignored)"));
8284 case DW_INL_declared_inlined
:
8285 printf (_("(declared as inline and inlined)"));
8288 printf (_(" (Unknown inline attribute value: %lx)"), uvalue
);
8293 case DW_AT_language
:
8296 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
8297 case DW_LANG_C89
: printf ("(ANSI C)"); break;
8298 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
8299 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
8300 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
8301 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
8302 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
8303 case DW_LANG_Ada83
: printf ("(Ada)"); break;
8304 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
8305 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
8306 /* DWARF 2.1 values. */
8307 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
8308 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
8309 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
8310 /* MIPS extension. */
8311 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
8312 /* UPC extension. */
8313 case DW_LANG_Upc
: printf ("(Unified Parallel C)"); break;
8315 printf ("(Unknown: %lx)", uvalue
);
8320 case DW_AT_encoding
:
8323 case DW_ATE_void
: printf ("(void)"); break;
8324 case DW_ATE_address
: printf ("(machine address)"); break;
8325 case DW_ATE_boolean
: printf ("(boolean)"); break;
8326 case DW_ATE_complex_float
: printf ("(complex float)"); break;
8327 case DW_ATE_float
: printf ("(float)"); break;
8328 case DW_ATE_signed
: printf ("(signed)"); break;
8329 case DW_ATE_signed_char
: printf ("(signed char)"); break;
8330 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
8331 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
8332 /* DWARF 2.1 value. */
8333 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
8335 if (uvalue
>= DW_ATE_lo_user
8336 && uvalue
<= DW_ATE_hi_user
)
8337 printf ("(user defined type)");
8339 printf ("(unknown type)");
8344 case DW_AT_accessibility
:
8347 case DW_ACCESS_public
: printf ("(public)"); break;
8348 case DW_ACCESS_protected
: printf ("(protected)"); break;
8349 case DW_ACCESS_private
: printf ("(private)"); break;
8351 printf ("(unknown accessibility)");
8356 case DW_AT_visibility
:
8359 case DW_VIS_local
: printf ("(local)"); break;
8360 case DW_VIS_exported
: printf ("(exported)"); break;
8361 case DW_VIS_qualified
: printf ("(qualified)"); break;
8362 default: printf ("(unknown visibility)"); break;
8366 case DW_AT_virtuality
:
8369 case DW_VIRTUALITY_none
: printf ("(none)"); break;
8370 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
8371 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
8372 default: printf ("(unknown virtuality)"); break;
8376 case DW_AT_identifier_case
:
8379 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
8380 case DW_ID_up_case
: printf ("(up_case)"); break;
8381 case DW_ID_down_case
: printf ("(down_case)"); break;
8382 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
8383 default: printf ("(unknown case)"); break;
8387 case DW_AT_calling_convention
:
8390 case DW_CC_normal
: printf ("(normal)"); break;
8391 case DW_CC_program
: printf ("(program)"); break;
8392 case DW_CC_nocall
: printf ("(nocall)"); break;
8394 if (uvalue
>= DW_CC_lo_user
8395 && uvalue
<= DW_CC_hi_user
)
8396 printf ("(user defined)");
8398 printf ("(unknown convention)");
8402 case DW_AT_ordering
:
8405 case -1: printf ("(undefined)"); break;
8406 case 0: printf ("(row major)"); break;
8407 case 1: printf ("(column major)"); break;
8411 case DW_AT_frame_base
:
8412 case DW_AT_location
:
8413 case DW_AT_data_member_location
:
8414 case DW_AT_vtable_elem_location
:
8415 case DW_AT_allocated
:
8416 case DW_AT_associated
:
8417 case DW_AT_data_location
:
8419 case DW_AT_upper_bound
:
8420 case DW_AT_lower_bound
:
8424 decode_location_expression (block_start
, pointer_size
, uvalue
);
8427 else if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
8430 printf ("location list");
8442 static unsigned char *
8443 read_and_display_attr (unsigned long attribute
,
8445 unsigned char *data
,
8446 unsigned long cu_offset
,
8447 unsigned long pointer_size
,
8448 unsigned long offset_size
,
8451 printf (" %-18s:", get_AT_name (attribute
));
8452 data
= read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
8453 pointer_size
, offset_size
, dwarf_version
);
8459 display_debug_info (Elf_Internal_Shdr
*section
,
8460 unsigned char *start
,
8463 unsigned char *end
= start
+ section
->sh_size
;
8464 unsigned char *section_begin
= start
;
8466 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
8468 load_debug_str (file
);
8469 load_debug_loc (file
);
8473 DWARF2_Internal_CompUnit compunit
;
8474 Elf_Internal_Shdr
*relsec
;
8475 unsigned char *hdrptr
;
8476 unsigned char *cu_abbrev_offset_ptr
;
8477 unsigned char *tags
;
8479 unsigned long cu_offset
;
8481 int initial_length_size
;
8485 compunit
.cu_length
= byte_get (hdrptr
, 4);
8488 if (compunit
.cu_length
== 0xffffffff)
8490 compunit
.cu_length
= byte_get (hdrptr
, 8);
8493 initial_length_size
= 12;
8498 initial_length_size
= 4;
8501 compunit
.cu_version
= byte_get (hdrptr
, 2);
8504 /* Apply addends of RELA relocations. */
8505 for (relsec
= section_headers
;
8506 relsec
< section_headers
+ elf_header
.e_shnum
;
8509 unsigned long nrelas
;
8510 Elf_Internal_Rela
*rela
, *rp
;
8511 Elf_Internal_Shdr
*symsec
;
8512 Elf_Internal_Sym
*symtab
;
8513 Elf_Internal_Sym
*sym
;
8515 if (relsec
->sh_type
!= SHT_RELA
8516 || SECTION_HEADER (relsec
->sh_info
) != section
8517 || relsec
->sh_size
== 0)
8520 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
8524 symsec
= SECTION_HEADER (relsec
->sh_link
);
8525 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
8527 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
8531 if (rp
->r_offset
>= (bfd_vma
) (hdrptr
- section_begin
)
8532 && section
->sh_size
> (bfd_vma
) offset_size
8533 && rp
->r_offset
<= section
->sh_size
- offset_size
)
8534 loc
= section_begin
+ rp
->r_offset
;
8540 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
8542 if (ELF32_R_SYM (rp
->r_info
) != 0
8543 && ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
8545 warn (_("Skipping unexpected symbol type %u\n"),
8546 ELF32_ST_TYPE (sym
->st_info
));
8552 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
8554 if (ELF64_R_SYM (rp
->r_info
) != 0
8555 && ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
8557 warn (_("Skipping unexpected symbol type %u\n"),
8558 ELF64_ST_TYPE (sym
->st_info
));
8563 byte_put (loc
, rp
->r_addend
, offset_size
);
8570 cu_abbrev_offset_ptr
= hdrptr
;
8571 compunit
.cu_abbrev_offset
= byte_get (hdrptr
, offset_size
);
8572 hdrptr
+= offset_size
;
8574 compunit
.cu_pointer_size
= byte_get (hdrptr
, 1);
8578 cu_offset
= start
- section_begin
;
8579 start
+= compunit
.cu_length
+ initial_length_size
;
8581 printf (_(" Compilation Unit @ %lx:\n"), cu_offset
);
8582 printf (_(" Length: %ld\n"), compunit
.cu_length
);
8583 printf (_(" Version: %d\n"), compunit
.cu_version
);
8584 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
8585 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
8587 if (compunit
.cu_version
!= 2 && compunit
.cu_version
!= 3)
8589 warn (_("Only version 2 and 3 DWARF debug information is currently supported.\n"));
8595 /* Read in the abbrevs used by this compilation unit. */
8597 Elf_Internal_Shdr
*sec
;
8598 unsigned char *begin
;
8600 /* Locate the .debug_abbrev section and process it. */
8601 sec
= find_section (".debug_abbrev");
8604 warn (_("Unable to locate .debug_abbrev section!\n"));
8608 begin
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
8609 _("debug_abbrev section data"));
8613 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
8614 begin
+ sec
->sh_size
);
8620 while (tags
< start
)
8623 unsigned long abbrev_number
;
8624 abbrev_entry
*entry
;
8627 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
8630 /* A null DIE marks the end of a list of children. */
8631 if (abbrev_number
== 0)
8637 /* Scan through the abbreviation list until we reach the
8639 for (entry
= first_abbrev
;
8640 entry
&& entry
->entry
!= abbrev_number
;
8641 entry
= entry
->next
)
8646 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
8651 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
8653 (unsigned long) (tags
- section_begin
- bytes_read
),
8655 get_TAG_name (entry
->tag
));
8657 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
8658 tags
= read_and_display_attr (attr
->attribute
,
8661 compunit
.cu_pointer_size
,
8663 compunit
.cu_version
);
8665 if (entry
->children
)
8679 display_debug_aranges (Elf_Internal_Shdr
*section
,
8680 unsigned char *start
,
8681 FILE *file ATTRIBUTE_UNUSED
)
8683 unsigned char *end
= start
+ section
->sh_size
;
8685 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
8689 unsigned char *hdrptr
;
8690 DWARF2_Internal_ARange arange
;
8691 unsigned char *ranges
;
8692 unsigned long length
;
8693 unsigned long address
;
8696 int initial_length_size
;
8700 arange
.ar_length
= byte_get (hdrptr
, 4);
8703 if (arange
.ar_length
== 0xffffffff)
8705 arange
.ar_length
= byte_get (hdrptr
, 8);
8708 initial_length_size
= 12;
8713 initial_length_size
= 4;
8716 arange
.ar_version
= byte_get (hdrptr
, 2);
8719 arange
.ar_info_offset
= byte_get (hdrptr
, offset_size
);
8720 hdrptr
+= offset_size
;
8722 arange
.ar_pointer_size
= byte_get (hdrptr
, 1);
8725 arange
.ar_segment_size
= byte_get (hdrptr
, 1);
8728 if (arange
.ar_version
!= 2 && arange
.ar_version
!= 3)
8730 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
8734 printf (_(" Length: %ld\n"), arange
.ar_length
);
8735 printf (_(" Version: %d\n"), arange
.ar_version
);
8736 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
8737 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
8738 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
8740 printf (_("\n Address Length\n"));
8744 /* Must pad to an alignment boundary that is twice the pointer size. */
8745 excess
= (hdrptr
- start
) % (2 * arange
.ar_pointer_size
);
8747 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
8751 address
= byte_get (ranges
, arange
.ar_pointer_size
);
8753 ranges
+= arange
.ar_pointer_size
;
8755 length
= byte_get (ranges
, arange
.ar_pointer_size
);
8757 ranges
+= arange
.ar_pointer_size
;
8759 /* A pair of zeros marks the end of the list. */
8760 if (address
== 0 && length
== 0)
8763 printf (" %8.8lx %lu\n", address
, length
);
8766 start
+= arange
.ar_length
+ initial_length_size
;
8774 typedef struct Frame_Chunk
8776 struct Frame_Chunk
*next
;
8777 unsigned char *chunk_start
;
8779 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
8780 short int *col_type
;
8783 unsigned int code_factor
;
8785 unsigned long pc_begin
;
8786 unsigned long pc_range
;
8790 unsigned char fde_encoding
;
8791 unsigned char cfa_exp
;
8795 /* A marker for a col_type that means this column was never referenced
8796 in the frame info. */
8797 #define DW_CFA_unreferenced (-1)
8800 frame_need_space (Frame_Chunk
*fc
, int reg
)
8802 int prev
= fc
->ncols
;
8804 if (reg
< fc
->ncols
)
8807 fc
->ncols
= reg
+ 1;
8808 fc
->col_type
= xrealloc (fc
->col_type
, fc
->ncols
* sizeof (short int));
8809 fc
->col_offset
= xrealloc (fc
->col_offset
, fc
->ncols
* sizeof (int));
8811 while (prev
< fc
->ncols
)
8813 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
8814 fc
->col_offset
[prev
] = 0;
8820 frame_display_row (Frame_Chunk
*fc
, int *need_col_headers
, int *max_regs
)
8825 if (*max_regs
< fc
->ncols
)
8826 *max_regs
= fc
->ncols
;
8828 if (*need_col_headers
)
8830 *need_col_headers
= 0;
8832 printf (" LOC CFA ");
8834 for (r
= 0; r
< *max_regs
; r
++)
8835 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
8840 printf ("r%-4d", r
);
8846 printf ("%08lx ", fc
->pc_begin
);
8848 strcpy (tmp
, "exp");
8850 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
8851 printf ("%-8s ", tmp
);
8853 for (r
= 0; r
< fc
->ncols
; r
++)
8855 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
8857 switch (fc
->col_type
[r
])
8859 case DW_CFA_undefined
:
8862 case DW_CFA_same_value
:
8866 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
8868 case DW_CFA_register
:
8869 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
8871 case DW_CFA_expression
:
8872 strcpy (tmp
, "exp");
8875 strcpy (tmp
, "n/a");
8878 printf ("%-5s", tmp
);
8885 size_of_encoded_value (int encoding
)
8887 switch (encoding
& 0x7)
8890 case 0: return is_32bit_elf
? 4 : 8;
8898 get_encoded_value (unsigned char *data
, int encoding
)
8900 int size
= size_of_encoded_value (encoding
);
8901 if (encoding
& DW_EH_PE_signed
)
8902 return byte_get_signed (data
, size
);
8904 return byte_get (data
, size
);
8907 #define GET(N) byte_get (start, N); start += N
8908 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
8909 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
8912 display_debug_frames (Elf_Internal_Shdr
*section
,
8913 unsigned char *start
,
8914 FILE *file ATTRIBUTE_UNUSED
)
8916 unsigned char *end
= start
+ section
->sh_size
;
8917 unsigned char *section_start
= start
;
8918 Frame_Chunk
*chunks
= 0;
8919 Frame_Chunk
*remembered_state
= 0;
8921 int is_eh
= (strcmp (SECTION_NAME (section
), ".eh_frame") == 0);
8924 int addr_size
= is_32bit_elf
? 4 : 8;
8926 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
8930 unsigned char *saved_start
;
8931 unsigned char *block_end
;
8932 unsigned long length
;
8933 unsigned long cie_id
;
8936 int need_col_headers
= 1;
8937 unsigned char *augmentation_data
= NULL
;
8938 unsigned long augmentation_data_len
= 0;
8939 int encoded_ptr_size
= addr_size
;
8941 int initial_length_size
;
8943 saved_start
= start
;
8944 length
= byte_get (start
, 4); start
+= 4;
8948 printf ("\n%08lx ZERO terminator\n\n",
8949 (unsigned long)(saved_start
- section_start
));
8953 if (length
== 0xffffffff)
8955 length
= byte_get (start
, 8);
8958 initial_length_size
= 12;
8963 initial_length_size
= 4;
8966 block_end
= saved_start
+ length
+ initial_length_size
;
8967 cie_id
= byte_get (start
, offset_size
); start
+= offset_size
;
8969 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
8973 fc
= xmalloc (sizeof (Frame_Chunk
));
8974 memset (fc
, 0, sizeof (Frame_Chunk
));
8978 fc
->chunk_start
= saved_start
;
8980 fc
->col_type
= xmalloc (sizeof (short int));
8981 fc
->col_offset
= xmalloc (sizeof (int));
8982 frame_need_space (fc
, max_regs
-1);
8986 fc
->augmentation
= start
;
8987 start
= strchr (start
, '\0') + 1;
8989 if (fc
->augmentation
[0] == 'z')
8991 fc
->code_factor
= LEB ();
8992 fc
->data_factor
= SLEB ();
9001 augmentation_data_len
= LEB ();
9002 augmentation_data
= start
;
9003 start
+= augmentation_data_len
;
9005 else if (strcmp (fc
->augmentation
, "eh") == 0)
9008 fc
->code_factor
= LEB ();
9009 fc
->data_factor
= SLEB ();
9021 fc
->code_factor
= LEB ();
9022 fc
->data_factor
= SLEB ();
9034 if (do_debug_frames_interp
)
9035 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
9036 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
9037 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
9041 printf ("\n%08lx %08lx %08lx CIE\n",
9042 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
9043 printf (" Version: %d\n", version
);
9044 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
9045 printf (" Code alignment factor: %u\n", fc
->code_factor
);
9046 printf (" Data alignment factor: %d\n", fc
->data_factor
);
9047 printf (" Return address column: %d\n", fc
->ra
);
9049 if (augmentation_data_len
)
9052 printf (" Augmentation data: ");
9053 for (i
= 0; i
< augmentation_data_len
; ++i
)
9054 printf (" %02x", augmentation_data
[i
]);
9060 if (augmentation_data_len
)
9062 unsigned char *p
, *q
;
9063 p
= fc
->augmentation
+ 1;
9064 q
= augmentation_data
;
9071 q
+= 1 + size_of_encoded_value (*q
);
9073 fc
->fde_encoding
= *q
++;
9079 if (fc
->fde_encoding
)
9080 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
9083 frame_need_space (fc
, fc
->ra
);
9087 unsigned char *look_for
;
9088 static Frame_Chunk fde_fc
;
9091 memset (fc
, 0, sizeof (Frame_Chunk
));
9093 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
9095 for (cie
= chunks
; cie
; cie
= cie
->next
)
9096 if (cie
->chunk_start
== look_for
)
9101 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
9102 cie_id
, saved_start
);
9105 fc
->col_type
= xmalloc (sizeof (short int));
9106 fc
->col_offset
= xmalloc (sizeof (int));
9107 frame_need_space (fc
, max_regs
- 1);
9109 fc
->augmentation
= "";
9110 fc
->fde_encoding
= 0;
9114 fc
->ncols
= cie
->ncols
;
9115 fc
->col_type
= xmalloc (fc
->ncols
* sizeof (short int));
9116 fc
->col_offset
= xmalloc (fc
->ncols
* sizeof (int));
9117 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
9118 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
9119 fc
->augmentation
= cie
->augmentation
;
9120 fc
->code_factor
= cie
->code_factor
;
9121 fc
->data_factor
= cie
->data_factor
;
9122 fc
->cfa_reg
= cie
->cfa_reg
;
9123 fc
->cfa_offset
= cie
->cfa_offset
;
9125 frame_need_space (fc
, max_regs
-1);
9126 fc
->fde_encoding
= cie
->fde_encoding
;
9129 if (fc
->fde_encoding
)
9130 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
9132 fc
->pc_begin
= get_encoded_value (start
, fc
->fde_encoding
);
9133 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
)
9134 fc
->pc_begin
+= section
->sh_addr
+ (start
- section_start
);
9135 start
+= encoded_ptr_size
;
9136 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
9137 start
+= encoded_ptr_size
;
9139 if (cie
->augmentation
[0] == 'z')
9141 augmentation_data_len
= LEB ();
9142 augmentation_data
= start
;
9143 start
+= augmentation_data_len
;
9146 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
9147 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
9148 (unsigned long)(cie
->chunk_start
- section_start
),
9149 fc
->pc_begin
, fc
->pc_begin
+ fc
->pc_range
);
9150 if (! do_debug_frames_interp
&& augmentation_data_len
)
9153 printf (" Augmentation data: ");
9154 for (i
= 0; i
< augmentation_data_len
; ++i
)
9155 printf (" %02x", augmentation_data
[i
]);
9161 /* At this point, fc is the current chunk, cie (if any) is set, and we're
9162 about to interpret instructions for the chunk. */
9163 /* ??? At present we need to do this always, since this sizes the
9164 fc->col_type and fc->col_offset arrays, which we write into always.
9165 We should probably split the interpreted and non-interpreted bits
9166 into two different routines, since there's so much that doesn't
9167 really overlap between them. */
9168 if (1 || do_debug_frames_interp
)
9170 /* Start by making a pass over the chunk, allocating storage
9171 and taking note of what registers are used. */
9172 unsigned char *tmp
= start
;
9174 while (start
< block_end
)
9177 unsigned long reg
, tmp
;
9184 /* Warning: if you add any more cases to this switch, be
9185 sure to add them to the corresponding switch below. */
9188 case DW_CFA_advance_loc
:
9192 frame_need_space (fc
, opa
);
9193 fc
->col_type
[opa
] = DW_CFA_undefined
;
9195 case DW_CFA_restore
:
9196 frame_need_space (fc
, opa
);
9197 fc
->col_type
[opa
] = DW_CFA_undefined
;
9199 case DW_CFA_set_loc
:
9200 start
+= encoded_ptr_size
;
9202 case DW_CFA_advance_loc1
:
9205 case DW_CFA_advance_loc2
:
9208 case DW_CFA_advance_loc4
:
9211 case DW_CFA_offset_extended
:
9212 reg
= LEB (); LEB ();
9213 frame_need_space (fc
, reg
);
9214 fc
->col_type
[reg
] = DW_CFA_undefined
;
9216 case DW_CFA_restore_extended
:
9218 frame_need_space (fc
, reg
);
9219 fc
->col_type
[reg
] = DW_CFA_undefined
;
9221 case DW_CFA_undefined
:
9223 frame_need_space (fc
, reg
);
9224 fc
->col_type
[reg
] = DW_CFA_undefined
;
9226 case DW_CFA_same_value
:
9228 frame_need_space (fc
, reg
);
9229 fc
->col_type
[reg
] = DW_CFA_undefined
;
9231 case DW_CFA_register
:
9232 reg
= LEB (); LEB ();
9233 frame_need_space (fc
, reg
);
9234 fc
->col_type
[reg
] = DW_CFA_undefined
;
9236 case DW_CFA_def_cfa
:
9239 case DW_CFA_def_cfa_register
:
9242 case DW_CFA_def_cfa_offset
:
9245 case DW_CFA_def_cfa_expression
:
9249 case DW_CFA_expression
:
9253 frame_need_space (fc
, reg
);
9254 fc
->col_type
[reg
] = DW_CFA_undefined
;
9256 case DW_CFA_offset_extended_sf
:
9257 reg
= LEB (); SLEB ();
9258 frame_need_space (fc
, reg
);
9259 fc
->col_type
[reg
] = DW_CFA_undefined
;
9261 case DW_CFA_def_cfa_sf
:
9264 case DW_CFA_def_cfa_offset_sf
:
9267 case DW_CFA_MIPS_advance_loc8
:
9270 case DW_CFA_GNU_args_size
:
9273 case DW_CFA_GNU_negative_offset_extended
:
9274 reg
= LEB (); LEB ();
9275 frame_need_space (fc
, reg
);
9276 fc
->col_type
[reg
] = DW_CFA_undefined
;
9285 /* Now we know what registers are used, make a second pass over
9286 the chunk, this time actually printing out the info. */
9288 while (start
< block_end
)
9291 unsigned long ul
, reg
, roffs
;
9300 /* Warning: if you add any more cases to this switch, be
9301 sure to add them to the corresponding switch above. */
9304 case DW_CFA_advance_loc
:
9305 if (do_debug_frames_interp
)
9306 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9308 printf (" DW_CFA_advance_loc: %d to %08lx\n",
9309 opa
* fc
->code_factor
,
9310 fc
->pc_begin
+ opa
* fc
->code_factor
);
9311 fc
->pc_begin
+= opa
* fc
->code_factor
;
9316 if (! do_debug_frames_interp
)
9317 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
9318 opa
, roffs
* fc
->data_factor
);
9319 fc
->col_type
[opa
] = DW_CFA_offset
;
9320 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
9323 case DW_CFA_restore
:
9324 if (! do_debug_frames_interp
)
9325 printf (" DW_CFA_restore: r%d\n", opa
);
9326 fc
->col_type
[opa
] = cie
->col_type
[opa
];
9327 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
9330 case DW_CFA_set_loc
:
9331 vma
= get_encoded_value (start
, fc
->fde_encoding
);
9332 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
)
9333 vma
+= section
->sh_addr
+ (start
- section_start
);
9334 start
+= encoded_ptr_size
;
9335 if (do_debug_frames_interp
)
9336 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9338 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
9342 case DW_CFA_advance_loc1
:
9343 ofs
= byte_get (start
, 1); start
+= 1;
9344 if (do_debug_frames_interp
)
9345 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9347 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
9348 ofs
* fc
->code_factor
,
9349 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9350 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9353 case DW_CFA_advance_loc2
:
9354 ofs
= byte_get (start
, 2); start
+= 2;
9355 if (do_debug_frames_interp
)
9356 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9358 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
9359 ofs
* fc
->code_factor
,
9360 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9361 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9364 case DW_CFA_advance_loc4
:
9365 ofs
= byte_get (start
, 4); start
+= 4;
9366 if (do_debug_frames_interp
)
9367 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9369 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
9370 ofs
* fc
->code_factor
,
9371 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9372 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9375 case DW_CFA_offset_extended
:
9378 if (! do_debug_frames_interp
)
9379 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
9380 reg
, roffs
* fc
->data_factor
);
9381 fc
->col_type
[reg
] = DW_CFA_offset
;
9382 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
9385 case DW_CFA_restore_extended
:
9387 if (! do_debug_frames_interp
)
9388 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
9389 fc
->col_type
[reg
] = cie
->col_type
[reg
];
9390 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
9393 case DW_CFA_undefined
:
9395 if (! do_debug_frames_interp
)
9396 printf (" DW_CFA_undefined: r%ld\n", reg
);
9397 fc
->col_type
[reg
] = DW_CFA_undefined
;
9398 fc
->col_offset
[reg
] = 0;
9401 case DW_CFA_same_value
:
9403 if (! do_debug_frames_interp
)
9404 printf (" DW_CFA_same_value: r%ld\n", reg
);
9405 fc
->col_type
[reg
] = DW_CFA_same_value
;
9406 fc
->col_offset
[reg
] = 0;
9409 case DW_CFA_register
:
9412 if (! do_debug_frames_interp
)
9413 printf (" DW_CFA_register: r%ld in r%ld\n", reg
, roffs
);
9414 fc
->col_type
[reg
] = DW_CFA_register
;
9415 fc
->col_offset
[reg
] = roffs
;
9418 case DW_CFA_remember_state
:
9419 if (! do_debug_frames_interp
)
9420 printf (" DW_CFA_remember_state\n");
9421 rs
= xmalloc (sizeof (Frame_Chunk
));
9422 rs
->ncols
= fc
->ncols
;
9423 rs
->col_type
= xmalloc (rs
->ncols
* sizeof (short int));
9424 rs
->col_offset
= xmalloc (rs
->ncols
* sizeof (int));
9425 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
9426 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
9427 rs
->next
= remembered_state
;
9428 remembered_state
= rs
;
9431 case DW_CFA_restore_state
:
9432 if (! do_debug_frames_interp
)
9433 printf (" DW_CFA_restore_state\n");
9434 rs
= remembered_state
;
9437 remembered_state
= rs
->next
;
9438 frame_need_space (fc
, rs
->ncols
-1);
9439 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
9440 memcpy (fc
->col_offset
, rs
->col_offset
,
9441 rs
->ncols
* sizeof (int));
9442 free (rs
->col_type
);
9443 free (rs
->col_offset
);
9446 else if (do_debug_frames_interp
)
9447 printf ("Mismatched DW_CFA_restore_state\n");
9450 case DW_CFA_def_cfa
:
9451 fc
->cfa_reg
= LEB ();
9452 fc
->cfa_offset
= LEB ();
9454 if (! do_debug_frames_interp
)
9455 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
9456 fc
->cfa_reg
, fc
->cfa_offset
);
9459 case DW_CFA_def_cfa_register
:
9460 fc
->cfa_reg
= LEB ();
9462 if (! do_debug_frames_interp
)
9463 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
9466 case DW_CFA_def_cfa_offset
:
9467 fc
->cfa_offset
= LEB ();
9468 if (! do_debug_frames_interp
)
9469 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
9473 if (! do_debug_frames_interp
)
9474 printf (" DW_CFA_nop\n");
9477 case DW_CFA_def_cfa_expression
:
9479 if (! do_debug_frames_interp
)
9481 printf (" DW_CFA_def_cfa_expression (");
9482 decode_location_expression (start
, addr_size
, ul
);
9489 case DW_CFA_expression
:
9492 if (! do_debug_frames_interp
)
9494 printf (" DW_CFA_expression: r%ld (", reg
);
9495 decode_location_expression (start
, addr_size
, ul
);
9498 fc
->col_type
[reg
] = DW_CFA_expression
;
9502 case DW_CFA_offset_extended_sf
:
9505 frame_need_space (fc
, reg
);
9506 if (! do_debug_frames_interp
)
9507 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
9508 reg
, l
* fc
->data_factor
);
9509 fc
->col_type
[reg
] = DW_CFA_offset
;
9510 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
9513 case DW_CFA_def_cfa_sf
:
9514 fc
->cfa_reg
= LEB ();
9515 fc
->cfa_offset
= SLEB ();
9517 if (! do_debug_frames_interp
)
9518 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
9519 fc
->cfa_reg
, fc
->cfa_offset
);
9522 case DW_CFA_def_cfa_offset_sf
:
9523 fc
->cfa_offset
= SLEB ();
9524 if (! do_debug_frames_interp
)
9525 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc
->cfa_offset
);
9528 case DW_CFA_MIPS_advance_loc8
:
9529 ofs
= byte_get (start
, 8); start
+= 8;
9530 if (do_debug_frames_interp
)
9531 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9533 printf (" DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
9534 ofs
* fc
->code_factor
,
9535 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9536 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9539 case DW_CFA_GNU_window_save
:
9540 if (! do_debug_frames_interp
)
9541 printf (" DW_CFA_GNU_window_save\n");
9544 case DW_CFA_GNU_args_size
:
9546 if (! do_debug_frames_interp
)
9547 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
9550 case DW_CFA_GNU_negative_offset_extended
:
9553 frame_need_space (fc
, reg
);
9554 if (! do_debug_frames_interp
)
9555 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
9556 reg
, l
* fc
->data_factor
);
9557 fc
->col_type
[reg
] = DW_CFA_offset
;
9558 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
9562 fprintf (stderr
, "unsupported or unknown DW_CFA_%d\n", op
);
9567 if (do_debug_frames_interp
)
9568 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9583 display_debug_not_supported (Elf_Internal_Shdr
*section
,
9584 unsigned char *start ATTRIBUTE_UNUSED
,
9585 FILE *file ATTRIBUTE_UNUSED
)
9587 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
9588 SECTION_NAME (section
));
9593 /* A structure containing the name of a debug section
9594 and a pointer to a function that can decode it. */
9597 const char *const name
;
9598 int (*display
) (Elf_Internal_Shdr
*, unsigned char *, FILE *);
9602 { ".debug_abbrev", display_debug_abbrev
},
9603 { ".debug_aranges", display_debug_aranges
},
9604 { ".debug_frame", display_debug_frames
},
9605 { ".debug_info", display_debug_info
},
9606 { ".debug_line", display_debug_lines
},
9607 { ".debug_pubnames", display_debug_pubnames
},
9608 { ".eh_frame", display_debug_frames
},
9609 { ".debug_macinfo", display_debug_macinfo
},
9610 { ".debug_str", display_debug_str
},
9611 { ".debug_loc", display_debug_loc
},
9612 { ".debug_pubtypes", display_debug_pubnames
},
9613 { ".debug_ranges", display_debug_not_supported
},
9614 { ".debug_static_func", display_debug_not_supported
},
9615 { ".debug_static_vars", display_debug_not_supported
},
9616 { ".debug_types", display_debug_not_supported
},
9617 { ".debug_weaknames", display_debug_not_supported
}
9621 display_debug_section (Elf_Internal_Shdr
*section
, FILE *file
)
9623 char *name
= SECTION_NAME (section
);
9624 bfd_size_type length
;
9625 unsigned char *start
;
9628 length
= section
->sh_size
;
9631 printf (_("\nSection '%s' has no debugging data.\n"), name
);
9635 start
= get_data (NULL
, file
, section
->sh_offset
, length
,
9636 _("debug section data"));
9640 /* See if we know how to display the contents of this section. */
9641 if (strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
9642 name
= ".debug_info";
9644 for (i
= NUM_ELEM (debug_displays
); i
--;)
9645 if (strcmp (debug_displays
[i
].name
, name
) == 0)
9647 debug_displays
[i
].display (section
, start
, file
);
9652 printf (_("Unrecognized debug section: %s\n"), name
);
9656 /* If we loaded in the abbrev section at some point,
9657 we must release it here. */
9664 process_section_contents (FILE *file
)
9666 Elf_Internal_Shdr
*section
;
9672 for (i
= 0, section
= section_headers
;
9673 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
9676 #ifdef SUPPORT_DISASSEMBLY
9677 if (dump_sects
[i
] & DISASS_DUMP
)
9678 disassemble_section (section
, file
);
9680 if (dump_sects
[i
] & HEX_DUMP
)
9681 dump_section (section
, file
);
9683 if (dump_sects
[i
] & DEBUG_DUMP
)
9684 display_debug_section (section
, file
);
9687 if (i
< num_dump_sects
)
9688 warn (_("Some sections were not dumped because they do not exist!\n"));
9694 process_mips_fpe_exception (int mask
)
9699 if (mask
& OEX_FPU_INEX
)
9700 fputs ("INEX", stdout
), first
= 0;
9701 if (mask
& OEX_FPU_UFLO
)
9702 printf ("%sUFLO", first
? "" : "|"), first
= 0;
9703 if (mask
& OEX_FPU_OFLO
)
9704 printf ("%sOFLO", first
? "" : "|"), first
= 0;
9705 if (mask
& OEX_FPU_DIV0
)
9706 printf ("%sDIV0", first
? "" : "|"), first
= 0;
9707 if (mask
& OEX_FPU_INVAL
)
9708 printf ("%sINVAL", first
? "" : "|");
9711 fputs ("0", stdout
);
9715 process_mips_specific (FILE *file
)
9717 Elf_Internal_Dyn
*entry
;
9718 size_t liblist_offset
= 0;
9719 size_t liblistno
= 0;
9720 size_t conflictsno
= 0;
9721 size_t options_offset
= 0;
9722 size_t conflicts_offset
= 0;
9724 /* We have a lot of special sections. Thanks SGI! */
9725 if (dynamic_section
== NULL
)
9726 /* No information available. */
9729 for (entry
= dynamic_section
; entry
->d_tag
!= DT_NULL
; ++entry
)
9730 switch (entry
->d_tag
)
9732 case DT_MIPS_LIBLIST
:
9734 = offset_from_vma (file
, entry
->d_un
.d_val
,
9735 liblistno
* sizeof (Elf32_External_Lib
));
9737 case DT_MIPS_LIBLISTNO
:
9738 liblistno
= entry
->d_un
.d_val
;
9740 case DT_MIPS_OPTIONS
:
9741 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
9743 case DT_MIPS_CONFLICT
:
9745 = offset_from_vma (file
, entry
->d_un
.d_val
,
9746 conflictsno
* sizeof (Elf32_External_Conflict
));
9748 case DT_MIPS_CONFLICTNO
:
9749 conflictsno
= entry
->d_un
.d_val
;
9755 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
9757 Elf32_External_Lib
*elib
;
9760 elib
= get_data (NULL
, file
, liblist_offset
,
9761 liblistno
* sizeof (Elf32_External_Lib
),
9765 printf ("\nSection '.liblist' contains %lu entries:\n",
9766 (unsigned long) liblistno
);
9767 fputs (" Library Time Stamp Checksum Version Flags\n",
9770 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
9777 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9778 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9779 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9780 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9781 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9783 tmp
= gmtime (&time
);
9784 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
9785 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9786 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9788 printf ("%3lu: ", (unsigned long) cnt
);
9789 print_symbol (20, dynamic_strings
+ liblist
.l_name
);
9790 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
9793 if (liblist
.l_flags
== 0)
9804 { " EXACT_MATCH", LL_EXACT_MATCH
},
9805 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
9806 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
9807 { " EXPORTS", LL_EXPORTS
},
9808 { " DELAY_LOAD", LL_DELAY_LOAD
},
9809 { " DELTA", LL_DELTA
}
9811 int flags
= liblist
.l_flags
;
9815 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
9817 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
9819 fputs (l_flags_vals
[fcnt
].name
, stdout
);
9820 flags
^= l_flags_vals
[fcnt
].bit
;
9823 printf (" %#x", (unsigned int) flags
);
9833 if (options_offset
!= 0)
9835 Elf_External_Options
*eopt
;
9836 Elf_Internal_Shdr
*sect
= section_headers
;
9837 Elf_Internal_Options
*iopt
;
9838 Elf_Internal_Options
*option
;
9842 /* Find the section header so that we get the size. */
9843 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
9846 eopt
= get_data (NULL
, file
, options_offset
, sect
->sh_size
,
9850 iopt
= malloc ((sect
->sh_size
/ sizeof (eopt
)) * sizeof (*iopt
));
9853 error (_("Out of memory"));
9860 while (offset
< sect
->sh_size
)
9862 Elf_External_Options
*eoption
;
9864 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
9866 option
->kind
= BYTE_GET (eoption
->kind
);
9867 option
->size
= BYTE_GET (eoption
->size
);
9868 option
->section
= BYTE_GET (eoption
->section
);
9869 option
->info
= BYTE_GET (eoption
->info
);
9871 offset
+= option
->size
;
9877 printf (_("\nSection '%s' contains %d entries:\n"),
9878 SECTION_NAME (sect
), cnt
);
9886 switch (option
->kind
)
9889 /* This shouldn't happen. */
9890 printf (" NULL %d %lx", option
->section
, option
->info
);
9893 printf (" REGINFO ");
9894 if (elf_header
.e_machine
== EM_MIPS
)
9897 Elf32_External_RegInfo
*ereg
;
9898 Elf32_RegInfo reginfo
;
9900 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
9901 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9902 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9903 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9904 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9905 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9906 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9908 printf ("GPR %08lx GP 0x%lx\n",
9910 (unsigned long) reginfo
.ri_gp_value
);
9911 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9912 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9913 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9918 Elf64_External_RegInfo
*ereg
;
9919 Elf64_Internal_RegInfo reginfo
;
9921 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
9922 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9923 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9924 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9925 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9926 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9927 reginfo
.ri_gp_value
= BYTE_GET8 (ereg
->ri_gp_value
);
9929 printf ("GPR %08lx GP 0x",
9930 reginfo
.ri_gprmask
);
9931 printf_vma (reginfo
.ri_gp_value
);
9934 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9935 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9936 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9940 case ODK_EXCEPTIONS
:
9941 fputs (" EXCEPTIONS fpe_min(", stdout
);
9942 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
9943 fputs (") fpe_max(", stdout
);
9944 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
9945 fputs (")", stdout
);
9947 if (option
->info
& OEX_PAGE0
)
9948 fputs (" PAGE0", stdout
);
9949 if (option
->info
& OEX_SMM
)
9950 fputs (" SMM", stdout
);
9951 if (option
->info
& OEX_FPDBUG
)
9952 fputs (" FPDBUG", stdout
);
9953 if (option
->info
& OEX_DISMISS
)
9954 fputs (" DISMISS", stdout
);
9957 fputs (" PAD ", stdout
);
9958 if (option
->info
& OPAD_PREFIX
)
9959 fputs (" PREFIX", stdout
);
9960 if (option
->info
& OPAD_POSTFIX
)
9961 fputs (" POSTFIX", stdout
);
9962 if (option
->info
& OPAD_SYMBOL
)
9963 fputs (" SYMBOL", stdout
);
9966 fputs (" HWPATCH ", stdout
);
9967 if (option
->info
& OHW_R4KEOP
)
9968 fputs (" R4KEOP", stdout
);
9969 if (option
->info
& OHW_R8KPFETCH
)
9970 fputs (" R8KPFETCH", stdout
);
9971 if (option
->info
& OHW_R5KEOP
)
9972 fputs (" R5KEOP", stdout
);
9973 if (option
->info
& OHW_R5KCVTL
)
9974 fputs (" R5KCVTL", stdout
);
9977 fputs (" FILL ", stdout
);
9978 /* XXX Print content of info word? */
9981 fputs (" TAGS ", stdout
);
9982 /* XXX Print content of info word? */
9985 fputs (" HWAND ", stdout
);
9986 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9987 fputs (" R4KEOP_CHECKED", stdout
);
9988 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9989 fputs (" R4KEOP_CLEAN", stdout
);
9992 fputs (" HWOR ", stdout
);
9993 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9994 fputs (" R4KEOP_CHECKED", stdout
);
9995 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9996 fputs (" R4KEOP_CLEAN", stdout
);
9999 printf (" GP_GROUP %#06lx self-contained %#06lx",
10000 option
->info
& OGP_GROUP
,
10001 (option
->info
& OGP_SELF
) >> 16);
10004 printf (" IDENT %#06lx self-contained %#06lx",
10005 option
->info
& OGP_GROUP
,
10006 (option
->info
& OGP_SELF
) >> 16);
10009 /* This shouldn't happen. */
10010 printf (" %3d ??? %d %lx",
10011 option
->kind
, option
->section
, option
->info
);
10015 len
= sizeof (*eopt
);
10016 while (len
< option
->size
)
10017 if (((char *) option
)[len
] >= ' '
10018 && ((char *) option
)[len
] < 0x7f)
10019 printf ("%c", ((char *) option
)[len
++]);
10021 printf ("\\%03o", ((char *) option
)[len
++]);
10023 fputs ("\n", stdout
);
10031 if (conflicts_offset
!= 0 && conflictsno
!= 0)
10033 Elf32_Conflict
*iconf
;
10036 if (dynamic_symbols
== NULL
)
10038 error (_("conflict list found without a dynamic symbol table"));
10042 iconf
= malloc (conflictsno
* sizeof (*iconf
));
10045 error (_("Out of memory"));
10051 Elf32_External_Conflict
*econf32
;
10053 econf32
= get_data (NULL
, file
, conflicts_offset
,
10054 conflictsno
* sizeof (*econf32
), _("conflict"));
10058 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10059 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
10065 Elf64_External_Conflict
*econf64
;
10067 econf64
= get_data (NULL
, file
, conflicts_offset
,
10068 conflictsno
* sizeof (*econf64
), _("conflict"));
10072 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10073 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
10078 printf (_("\nSection '.conflict' contains %lu entries:\n"),
10079 (unsigned long) conflictsno
);
10080 puts (_(" Num: Index Value Name"));
10082 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10084 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
10086 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
10087 print_vma (psym
->st_value
, FULL_HEX
);
10089 print_symbol (25, dynamic_strings
+ psym
->st_name
);
10100 process_gnu_liblist (FILE *file
)
10102 Elf_Internal_Shdr
*section
, *string_sec
;
10103 Elf32_External_Lib
*elib
;
10111 for (i
= 0, section
= section_headers
;
10112 i
< elf_header
.e_shnum
;
10115 switch (section
->sh_type
)
10117 case SHT_GNU_LIBLIST
:
10118 elib
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
10123 string_sec
= SECTION_HEADER (section
->sh_link
);
10125 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
10126 string_sec
->sh_size
, _("liblist string table"));
10129 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
10135 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
10136 SECTION_NAME (section
),
10137 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
10139 puts (" Library Time Stamp Checksum Version Flags");
10141 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
10149 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
10150 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
10151 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
10152 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
10153 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
10155 tmp
= gmtime (&time
);
10156 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
10157 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
10158 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
10160 printf ("%3lu: ", (unsigned long) cnt
);
10162 printf ("%-20s", strtab
+ liblist
.l_name
);
10164 printf ("%-20.20s", strtab
+ liblist
.l_name
);
10165 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
10166 liblist
.l_version
, liblist
.l_flags
);
10176 static const char *
10177 get_note_type (unsigned e_type
)
10179 static char buff
[64];
10183 case NT_AUXV
: return _("NT_AUXV (auxiliary vector)");
10184 case NT_PRSTATUS
: return _("NT_PRSTATUS (prstatus structure)");
10185 case NT_FPREGSET
: return _("NT_FPREGSET (floating point registers)");
10186 case NT_PRPSINFO
: return _("NT_PRPSINFO (prpsinfo structure)");
10187 case NT_TASKSTRUCT
: return _("NT_TASKSTRUCT (task structure)");
10188 case NT_PRXFPREG
: return _("NT_PRXFPREG (user_xfpregs structure)");
10189 case NT_PSTATUS
: return _("NT_PSTATUS (pstatus structure)");
10190 case NT_FPREGS
: return _("NT_FPREGS (floating point registers)");
10191 case NT_PSINFO
: return _("NT_PSINFO (psinfo structure)");
10192 case NT_LWPSTATUS
: return _("NT_LWPSTATUS (lwpstatus_t structure)");
10193 case NT_LWPSINFO
: return _("NT_LWPSINFO (lwpsinfo_t structure)");
10194 case NT_WIN32PSTATUS
: return _("NT_WIN32PSTATUS (win32_pstatus structure)");
10196 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
10201 static const char *
10202 get_netbsd_elfcore_note_type (unsigned e_type
)
10204 static char buff
[64];
10206 if (e_type
== NT_NETBSDCORE_PROCINFO
)
10208 /* NetBSD core "procinfo" structure. */
10209 return _("NetBSD procinfo structure");
10212 /* As of Jan 2002 there are no other machine-independent notes
10213 defined for NetBSD core files. If the note type is less
10214 than the start of the machine-dependent note types, we don't
10217 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
10219 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
10223 switch (elf_header
.e_machine
)
10225 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
10226 and PT_GETFPREGS == mach+2. */
10231 case EM_SPARC32PLUS
:
10235 case NT_NETBSDCORE_FIRSTMACH
+0:
10236 return _("PT_GETREGS (reg structure)");
10237 case NT_NETBSDCORE_FIRSTMACH
+2:
10238 return _("PT_GETFPREGS (fpreg structure)");
10244 /* On all other arch's, PT_GETREGS == mach+1 and
10245 PT_GETFPREGS == mach+3. */
10249 case NT_NETBSDCORE_FIRSTMACH
+1:
10250 return _("PT_GETREGS (reg structure)");
10251 case NT_NETBSDCORE_FIRSTMACH
+3:
10252 return _("PT_GETFPREGS (fpreg structure)");
10258 sprintf (buff
, _("PT_FIRSTMACH+%d"), e_type
- NT_NETBSDCORE_FIRSTMACH
);
10262 /* Note that by the ELF standard, the name field is already null byte
10263 terminated, and namesz includes the terminating null byte.
10264 I.E. the value of namesz for the name "FSF" is 4.
10266 If the value of namesz is zero, there is no name present. */
10268 process_note (Elf_Internal_Note
*pnote
)
10272 if (pnote
->namesz
== 0)
10274 /* If there is no note name, then use the default set of
10275 note type strings. */
10276 nt
= get_note_type (pnote
->type
);
10278 else if (strncmp (pnote
->namedata
, "NetBSD-CORE", 11) == 0)
10280 /* NetBSD-specific core file notes. */
10281 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
10285 /* Don't recognize this note name; just use the default set of
10286 note type strings. */
10287 nt
= get_note_type (pnote
->type
);
10290 printf (" %s\t\t0x%08lx\t%s\n",
10291 pnote
->namesz
? pnote
->namedata
: "(NONE)",
10292 pnote
->descsz
, nt
);
10298 process_corefile_note_segment (FILE *file
, bfd_vma offset
, bfd_vma length
)
10300 Elf_External_Note
*pnotes
;
10301 Elf_External_Note
*external
;
10307 pnotes
= get_data (NULL
, file
, offset
, length
, _("notes"));
10313 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
10314 (unsigned long) offset
, (unsigned long) length
);
10315 printf (_(" Owner\t\tData size\tDescription\n"));
10317 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
10319 Elf_External_Note
*next
;
10320 Elf_Internal_Note inote
;
10323 inote
.type
= BYTE_GET (external
->type
);
10324 inote
.namesz
= BYTE_GET (external
->namesz
);
10325 inote
.namedata
= external
->name
;
10326 inote
.descsz
= BYTE_GET (external
->descsz
);
10327 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
10328 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
10330 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
10332 if (((char *) next
) > (((char *) pnotes
) + length
))
10334 warn (_("corrupt note found at offset %x into core notes\n"),
10335 ((char *) external
) - ((char *) pnotes
));
10336 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
10337 inote
.type
, inote
.namesz
, inote
.descsz
);
10343 /* Verify that name is null terminated. It appears that at least
10344 one version of Linux (RedHat 6.0) generates corefiles that don't
10345 comply with the ELF spec by failing to include the null byte in
10347 if (inote
.namedata
[inote
.namesz
] != '\0')
10349 temp
= malloc (inote
.namesz
+ 1);
10353 error (_("Out of memory\n"));
10358 strncpy (temp
, inote
.namedata
, inote
.namesz
);
10359 temp
[inote
.namesz
] = 0;
10361 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
10362 inote
.namedata
= temp
;
10365 res
&= process_note (& inote
);
10380 process_corefile_note_segments (FILE *file
)
10382 Elf_Internal_Phdr
*segment
;
10386 if (! get_program_headers (file
))
10389 for (i
= 0, segment
= program_headers
;
10390 i
< elf_header
.e_phnum
;
10393 if (segment
->p_type
== PT_NOTE
)
10394 res
&= process_corefile_note_segment (file
,
10395 (bfd_vma
) segment
->p_offset
,
10396 (bfd_vma
) segment
->p_filesz
);
10403 process_corefile_contents (FILE *file
)
10405 /* If we have not been asked to display the notes then do nothing. */
10409 /* If file is not a core file then exit. */
10410 if (elf_header
.e_type
!= ET_CORE
)
10413 /* No program headers means no NOTE segment. */
10414 if (elf_header
.e_phnum
== 0)
10416 printf (_("No note segments present in the core file.\n"));
10420 return process_corefile_note_segments (file
);
10424 process_arch_specific (FILE *file
)
10429 switch (elf_header
.e_machine
)
10432 case EM_MIPS_RS3_LE
:
10433 return process_mips_specific (file
);
10442 get_file_header (FILE *file
)
10444 /* Read in the identity array. */
10445 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
10448 /* Determine how to read the rest of the header. */
10449 switch (elf_header
.e_ident
[EI_DATA
])
10451 default: /* fall through */
10452 case ELFDATANONE
: /* fall through */
10454 byte_get
= byte_get_little_endian
;
10455 byte_put
= byte_put_little_endian
;
10458 byte_get
= byte_get_big_endian
;
10459 byte_put
= byte_put_big_endian
;
10463 /* For now we only support 32 bit and 64 bit ELF files. */
10464 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
10466 /* Read in the rest of the header. */
10469 Elf32_External_Ehdr ehdr32
;
10471 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
10474 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
10475 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
10476 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
10477 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
10478 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
10479 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
10480 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
10481 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
10482 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
10483 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
10484 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
10485 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
10486 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
10490 Elf64_External_Ehdr ehdr64
;
10492 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10493 we will not be able to cope with the 64bit data found in
10494 64 ELF files. Detect this now and abort before we start
10495 overwriting things. */
10496 if (sizeof (bfd_vma
) < 8)
10498 error (_("This instance of readelf has been built without support for a\n\
10499 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10503 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
10506 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
10507 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
10508 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
10509 elf_header
.e_entry
= BYTE_GET8 (ehdr64
.e_entry
);
10510 elf_header
.e_phoff
= BYTE_GET8 (ehdr64
.e_phoff
);
10511 elf_header
.e_shoff
= BYTE_GET8 (ehdr64
.e_shoff
);
10512 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
10513 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
10514 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
10515 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
10516 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
10517 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
10518 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
10521 if (elf_header
.e_shoff
)
10523 /* There may be some extensions in the first section header. Don't
10524 bomb if we can't read it. */
10526 get_32bit_section_headers (file
, 1);
10528 get_64bit_section_headers (file
, 1);
10534 /* Process one ELF object file according to the command line options.
10535 This file may actually be stored in an archive. The file is
10536 positioned at the start of the ELF object. */
10539 process_object (char *file_name
, FILE *file
)
10543 if (! get_file_header (file
))
10545 error (_("%s: Failed to read file header\n"), file_name
);
10549 /* Initialise per file variables. */
10550 for (i
= NUM_ELEM (version_info
); i
--;)
10551 version_info
[i
] = 0;
10553 for (i
= NUM_ELEM (dynamic_info
); i
--;)
10554 dynamic_info
[i
] = 0;
10556 /* Process the file. */
10558 printf (_("\nFile: %s\n"), file_name
);
10560 if (! process_file_header ())
10563 if (! process_section_headers (file
)
10564 || ! process_section_groups (file
))
10566 /* Without loaded section headers and section groups we
10567 cannot process lots of things. */
10568 do_unwind
= do_version
= do_dump
= do_arch
= 0;
10570 if (! do_using_dynamic
)
10571 do_syms
= do_reloc
= 0;
10574 if (process_program_headers (file
))
10575 process_dynamic_section (file
);
10577 process_relocs (file
);
10579 process_unwind (file
);
10581 process_symbol_table (file
);
10583 process_syminfo (file
);
10585 process_version_sections (file
);
10587 process_section_contents (file
);
10589 process_corefile_contents (file
);
10591 process_gnu_liblist (file
);
10593 process_arch_specific (file
);
10595 if (program_headers
)
10597 free (program_headers
);
10598 program_headers
= NULL
;
10601 if (section_headers
)
10603 free (section_headers
);
10604 section_headers
= NULL
;
10609 free (string_table
);
10610 string_table
= NULL
;
10611 string_table_length
= 0;
10614 if (dynamic_strings
)
10616 free (dynamic_strings
);
10617 dynamic_strings
= NULL
;
10620 if (dynamic_symbols
)
10622 free (dynamic_symbols
);
10623 dynamic_symbols
= NULL
;
10624 num_dynamic_syms
= 0;
10627 if (dynamic_syminfo
)
10629 free (dynamic_syminfo
);
10630 dynamic_syminfo
= NULL
;
10633 if (section_headers_groups
)
10635 free (section_headers_groups
);
10636 section_headers_groups
= NULL
;
10639 if (section_groups
)
10641 struct group_list
*g
, *next
;
10643 for (i
= 0; i
< group_count
; i
++)
10645 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
10652 free (section_groups
);
10653 section_groups
= NULL
;
10659 /* Process an ELF archive. The file is positioned just after the
10663 process_archive (char *file_name
, FILE *file
)
10665 struct ar_hdr arhdr
;
10667 unsigned long size
;
10668 char *longnames
= NULL
;
10669 unsigned long longnames_size
= 0;
10670 size_t file_name_size
;
10675 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10676 if (got
!= sizeof arhdr
)
10681 error (_("%s: failed to read archive header\n"), file_name
);
10685 if (memcmp (arhdr
.ar_name
, "/ ", 16) == 0)
10687 /* This is the archive symbol table. Skip it.
10688 FIXME: We should have an option to dump it. */
10689 size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10690 if (fseek (file
, size
+ (size
& 1), SEEK_CUR
) != 0)
10692 error (_("%s: failed to skip archive symbol table\n"), file_name
);
10696 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10697 if (got
!= sizeof arhdr
)
10702 error (_("%s: failed to read archive header\n"), file_name
);
10707 if (memcmp (arhdr
.ar_name
, "// ", 16) == 0)
10709 /* This is the archive string table holding long member
10712 longnames_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10714 longnames
= malloc (longnames_size
);
10715 if (longnames
== NULL
)
10717 error (_("Out of memory\n"));
10721 if (fread (longnames
, longnames_size
, 1, file
) != 1)
10724 error(_("%s: failed to read string table\n"), file_name
);
10728 if ((longnames_size
& 1) != 0)
10731 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10732 if (got
!= sizeof arhdr
)
10739 error (_("%s: failed to read archive header\n"), file_name
);
10744 file_name_size
= strlen (file_name
);
10753 if (arhdr
.ar_name
[0] == '/')
10757 off
= strtoul (arhdr
.ar_name
+ 1, NULL
, 10);
10758 if (off
>= longnames_size
)
10760 error (_("%s: invalid archive string table offset %lu\n"), off
);
10765 name
= longnames
+ off
;
10766 nameend
= memchr (name
, '/', longnames_size
- off
);
10770 name
= arhdr
.ar_name
;
10771 nameend
= memchr (name
, '/', 16);
10774 if (nameend
== NULL
)
10776 error (_("%s: bad archive file name\n"));
10781 namealc
= malloc (file_name_size
+ (nameend
- name
) + 3);
10782 if (namealc
== NULL
)
10784 error (_("Out of memory\n"));
10789 memcpy (namealc
, file_name
, file_name_size
);
10790 namealc
[file_name_size
] = '(';
10791 memcpy (namealc
+ file_name_size
+ 1, name
, nameend
- name
);
10792 namealc
[file_name_size
+ 1 + (nameend
- name
)] = ')';
10793 namealc
[file_name_size
+ 2 + (nameend
- name
)] = '\0';
10795 archive_file_offset
= ftell (file
);
10796 archive_file_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10798 ret
|= process_object (namealc
, file
);
10803 (archive_file_offset
10804 + archive_file_size
10805 + (archive_file_size
& 1)),
10808 error (_("%s: failed to seek to next archive header\n"), file_name
);
10813 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10814 if (got
!= sizeof arhdr
)
10819 error (_("%s: failed to read archive header\n"), file_name
);
10825 if (longnames
!= 0)
10832 process_file (char *file_name
)
10835 struct stat statbuf
;
10836 char armag
[SARMAG
];
10839 if (stat (file_name
, &statbuf
) < 0)
10841 if (errno
== ENOENT
)
10842 error (_("'%s': No such file\n"), file_name
);
10844 error (_("Could not locate '%s'. System error message: %s\n"),
10845 file_name
, strerror (errno
));
10849 if (! S_ISREG (statbuf
.st_mode
))
10851 error (_("'%s' is not an ordinary file\n"), file_name
);
10855 file
= fopen (file_name
, "rb");
10858 error (_("Input file '%s' is not readable.\n"), file_name
);
10862 if (fread (armag
, SARMAG
, 1, file
) != 1)
10864 error (_("%s: Failed to read file header\n"), file_name
);
10869 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
10870 ret
= process_archive (file_name
, file
);
10874 archive_file_size
= archive_file_offset
= 0;
10875 ret
= process_object (file_name
, file
);
10883 #ifdef SUPPORT_DISASSEMBLY
10884 /* Needed by the i386 disassembler. For extra credit, someone could
10885 fix this so that we insert symbolic addresses here, esp for GOT/PLT
10889 print_address (unsigned int addr
, FILE *outfile
)
10891 fprintf (outfile
,"0x%8.8x", addr
);
10894 /* Needed by the i386 disassembler. */
10896 db_task_printsym (unsigned int addr
)
10898 print_address (addr
, stderr
);
10903 main (int argc
, char **argv
)
10906 char *cmdline_dump_sects
= NULL
;
10907 unsigned num_cmdline_dump_sects
= 0;
10909 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
10910 setlocale (LC_MESSAGES
, "");
10912 #if defined (HAVE_SETLOCALE)
10913 setlocale (LC_CTYPE
, "");
10915 bindtextdomain (PACKAGE
, LOCALEDIR
);
10916 textdomain (PACKAGE
);
10918 parse_args (argc
, argv
);
10920 if (optind
< (argc
- 1))
10923 /* When processing more than one file remember the dump requests
10924 issued on command line to reset them after each file. */
10925 if (optind
+ 1 < argc
&& dump_sects
!= NULL
)
10927 cmdline_dump_sects
= malloc (num_dump_sects
);
10928 if (cmdline_dump_sects
== NULL
)
10929 error (_("Out of memory allocating dump request table."));
10932 memcpy (cmdline_dump_sects
, dump_sects
, num_dump_sects
);
10933 num_cmdline_dump_sects
= num_dump_sects
;
10938 while (optind
< argc
)
10940 err
|= process_file (argv
[optind
++]);
10942 /* Reset dump requests. */
10943 if (optind
< argc
&& dump_sects
!= NULL
)
10945 num_dump_sects
= num_cmdline_dump_sects
;
10946 if (num_cmdline_dump_sects
> 0)
10947 memcpy (dump_sects
, cmdline_dump_sects
, num_cmdline_dump_sects
);
10951 if (dump_sects
!= NULL
)
10953 if (cmdline_dump_sects
!= NULL
)
10954 free (cmdline_dump_sects
);