1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 #include <sys/types.h>
32 /* Define BFD64 here, even if our default architecture is 32 bit ELF
33 as this will allow us to read in and parse 64bit and 32bit ELF files.
34 Only do this if we believe that the compiler can support a 64 bit
35 data type. For now we only rely on GCC being able to do this. */
41 #include "elf/common.h"
42 #include "elf/external.h"
43 #include "elf/internal.h"
44 #include "elf/dwarf2.h"
46 /* The following headers use the elf/reloc-macros.h file to
47 automatically generate relocation recognition functions
48 such as elf_mips_reloc_type() */
50 #define RELOC_MACROS_GEN_FUNC
52 #include "elf/alpha.h"
72 #include "elf/m68hc11.h"
73 #include "elf/mcore.h"
76 #include "elf/mn10200.h"
77 #include "elf/mn10300.h"
78 #include "elf/msp430.h"
82 #include "elf/ppc64.h"
85 #include "elf/sparc.h"
88 #include "elf/x86-64.h"
89 #include "elf/xstormy16.h"
90 #include "elf/iq2000.h"
91 #include "elf/xtensa.h"
97 #include "libiberty.h"
99 char *program_name
= "readelf";
100 long archive_file_offset
;
101 unsigned long archive_file_size
;
102 unsigned long dynamic_addr
;
103 bfd_size_type dynamic_size
;
104 char *dynamic_strings
;
106 unsigned long string_table_length
;
107 unsigned long num_dynamic_syms
;
108 Elf_Internal_Sym
*dynamic_symbols
;
109 Elf_Internal_Syminfo
*dynamic_syminfo
;
110 unsigned long dynamic_syminfo_offset
;
111 unsigned int dynamic_syminfo_nent
;
112 char program_interpreter
[64];
113 bfd_vma dynamic_info
[DT_JMPREL
+ 1];
114 bfd_vma version_info
[16];
115 Elf_Internal_Ehdr elf_header
;
116 Elf_Internal_Shdr
*section_headers
;
117 Elf_Internal_Phdr
*program_headers
;
118 Elf_Internal_Dyn
*dynamic_segment
;
119 Elf_Internal_Shdr
*symtab_shndx_hdr
;
127 int do_using_dynamic
;
135 int do_debug_abbrevs
;
137 int do_debug_pubnames
;
138 int do_debug_aranges
;
140 int do_debug_frames_interp
;
141 int do_debug_macinfo
;
148 /* A dynamic array of flags indicating which sections require dumping. */
149 char *dump_sects
= NULL
;
150 unsigned int num_dump_sects
= 0;
152 #define HEX_DUMP (1 << 0)
153 #define DISASS_DUMP (1 << 1)
154 #define DEBUG_DUMP (1 << 2)
156 /* How to rpint a vma value. */
157 typedef enum print_mode
169 static bfd_vma (*byte_get
) (unsigned char *, int);
170 static void (*byte_put
) (unsigned char *, bfd_vma
, int);
172 typedef int Elf32_Word
;
176 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
177 ((X)->sh_name >= string_table_length \
178 ? "<corrupt>" : string_table + (X)->sh_name))
180 /* Given st_shndx I, map to section_headers index. */
181 #define SECTION_HEADER_INDEX(I) \
182 ((I) < SHN_LORESERVE \
184 : ((I) <= SHN_HIRESERVE \
186 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
188 /* Reverse of the above. */
189 #define SECTION_HEADER_NUM(N) \
190 ((N) < SHN_LORESERVE \
192 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
194 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
196 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
198 #define BYTE_GET(field) byte_get (field, sizeof (field))
200 /* If we can support a 64 bit data type then BFD64 should be defined
201 and sizeof (bfd_vma) == 8. In this case when translating from an
202 external 8 byte field to an internal field, we can assume that the
203 internal field is also 8 bytes wide and so we can extract all the data.
204 If, however, BFD64 is not defined, then we must assume that the
205 internal data structure only has 4 byte wide fields that are the
206 equivalent of the 8 byte wide external counterparts, and so we must
207 truncate the data. */
209 #define BYTE_GET8(field) byte_get (field, -8)
211 #define BYTE_GET8(field) byte_get (field, 8)
214 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
216 #define GET_ELF_SYMBOLS(file, section) \
217 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
218 : get_64bit_elf_symbols (file, section))
222 error (const char *message
, ...)
226 va_start (args
, message
);
227 fprintf (stderr
, _("%s: Error: "), program_name
);
228 vfprintf (stderr
, message
, args
);
233 warn (const char *message
, ...)
237 va_start (args
, message
);
238 fprintf (stderr
, _("%s: Warning: "), program_name
);
239 vfprintf (stderr
, message
, args
);
244 get_data (void *var
, FILE *file
, long offset
, size_t size
, const char *reason
)
251 if (fseek (file
, archive_file_offset
+ offset
, SEEK_SET
))
253 error (_("Unable to seek to 0x%x for %s\n"),
254 archive_file_offset
+ offset
, reason
);
261 mvar
= malloc (size
);
265 error (_("Out of memory allocating 0x%x bytes for %s\n"),
271 if (fread (mvar
, size
, 1, file
) != 1)
273 error (_("Unable to read in 0x%x bytes of %s\n"), size
, reason
);
283 byte_get_little_endian (unsigned char *field
, int size
)
291 return ((unsigned int) (field
[0]))
292 | (((unsigned int) (field
[1])) << 8);
296 /* We want to extract data from an 8 byte wide field and
297 place it into a 4 byte wide field. Since this is a little
298 endian source we can just use the 4 byte extraction code. */
302 return ((unsigned long) (field
[0]))
303 | (((unsigned long) (field
[1])) << 8)
304 | (((unsigned long) (field
[2])) << 16)
305 | (((unsigned long) (field
[3])) << 24);
310 /* This is a special case, generated by the BYTE_GET8 macro.
311 It means that we are loading an 8 byte value from a field
312 in an external structure into an 8 byte value in a field
313 in an internal strcuture. */
314 return ((bfd_vma
) (field
[0]))
315 | (((bfd_vma
) (field
[1])) << 8)
316 | (((bfd_vma
) (field
[2])) << 16)
317 | (((bfd_vma
) (field
[3])) << 24)
318 | (((bfd_vma
) (field
[4])) << 32)
319 | (((bfd_vma
) (field
[5])) << 40)
320 | (((bfd_vma
) (field
[6])) << 48)
321 | (((bfd_vma
) (field
[7])) << 56);
324 error (_("Unhandled data length: %d\n"), size
);
330 byte_get_signed (unsigned char *field
, int size
)
332 bfd_vma x
= byte_get (field
, size
);
337 return (x
^ 0x80) - 0x80;
339 return (x
^ 0x8000) - 0x8000;
341 return (x
^ 0x80000000) - 0x80000000;
351 byte_put_little_endian (unsigned char *field
, bfd_vma value
, int size
)
356 field
[7] = (((value
>> 24) >> 24) >> 8) & 0xff;
357 field
[6] = ((value
>> 24) >> 24) & 0xff;
358 field
[5] = ((value
>> 24) >> 16) & 0xff;
359 field
[4] = ((value
>> 24) >> 8) & 0xff;
362 field
[3] = (value
>> 24) & 0xff;
363 field
[2] = (value
>> 16) & 0xff;
366 field
[1] = (value
>> 8) & 0xff;
369 field
[0] = value
& 0xff;
373 error (_("Unhandled data length: %d\n"), size
);
378 /* Print a VMA value. */
380 print_vma (bfd_vma vma
, print_mode mode
)
392 printf ("%8.8lx", (unsigned long) vma
);
398 printf ("%5ld", (long) vma
);
406 printf ("%lx", (unsigned long) vma
);
410 printf ("%ld", (unsigned long) vma
);
414 printf ("%lu", (unsigned long) vma
);
436 #if BFD_HOST_64BIT_LONG
439 if (_bfd_int64_high (vma
))
440 printf ("%lx%8.8lx", _bfd_int64_high (vma
), _bfd_int64_low (vma
));
442 printf ("%lx", _bfd_int64_low (vma
));
447 #if BFD_HOST_64BIT_LONG
450 if (_bfd_int64_high (vma
))
452 printf ("++%ld", _bfd_int64_low (vma
));
454 printf ("%ld", _bfd_int64_low (vma
));
459 #if BFD_HOST_64BIT_LONG
461 printf ("%5ld", vma
);
463 printf ("%#lx", vma
);
465 if (_bfd_int64_high (vma
))
467 printf ("++%ld", _bfd_int64_low (vma
));
468 else if (vma
<= 99999)
469 printf ("%5ld", _bfd_int64_low (vma
));
471 printf ("%#lx", _bfd_int64_low (vma
));
476 #if BFD_HOST_64BIT_LONG
479 if (_bfd_int64_high (vma
))
481 printf ("++%lu", _bfd_int64_low (vma
));
483 printf ("%lu", _bfd_int64_low (vma
));
491 /* Display a symbol on stdout. If do_wide is not true then
492 format the symbol to be at most WIDTH characters,
493 truncating as necessary. If WIDTH is negative then
494 format the string to be exactly - WIDTH characters,
495 truncating or padding as necessary. */
498 print_symbol (int width
, const char *symbol
)
501 printf ("%s", symbol
);
503 printf ("%-*.*s", width
, width
, symbol
);
505 printf ("%-.*s", width
, symbol
);
509 byte_get_big_endian (unsigned char *field
, int size
)
517 return ((unsigned int) (field
[1])) | (((int) (field
[0])) << 8);
520 return ((unsigned long) (field
[3]))
521 | (((unsigned long) (field
[2])) << 8)
522 | (((unsigned long) (field
[1])) << 16)
523 | (((unsigned long) (field
[0])) << 24);
527 /* Although we are extracing data from an 8 byte wide field, we
528 are returning only 4 bytes of data. */
529 return ((unsigned long) (field
[7]))
530 | (((unsigned long) (field
[6])) << 8)
531 | (((unsigned long) (field
[5])) << 16)
532 | (((unsigned long) (field
[4])) << 24);
536 /* This is a special case, generated by the BYTE_GET8 macro.
537 It means that we are loading an 8 byte value from a field
538 in an external structure into an 8 byte value in a field
539 in an internal strcuture. */
540 return ((bfd_vma
) (field
[7]))
541 | (((bfd_vma
) (field
[6])) << 8)
542 | (((bfd_vma
) (field
[5])) << 16)
543 | (((bfd_vma
) (field
[4])) << 24)
544 | (((bfd_vma
) (field
[3])) << 32)
545 | (((bfd_vma
) (field
[2])) << 40)
546 | (((bfd_vma
) (field
[1])) << 48)
547 | (((bfd_vma
) (field
[0])) << 56);
551 error (_("Unhandled data length: %d\n"), size
);
557 byte_put_big_endian (unsigned char *field
, bfd_vma value
, int size
)
562 field
[7] = value
& 0xff;
563 field
[6] = (value
>> 8) & 0xff;
564 field
[5] = (value
>> 16) & 0xff;
565 field
[4] = (value
>> 24) & 0xff;
570 field
[3] = value
& 0xff;
571 field
[2] = (value
>> 8) & 0xff;
575 field
[1] = value
& 0xff;
579 field
[0] = value
& 0xff;
583 error (_("Unhandled data length: %d\n"), size
);
588 /* Guess the relocation size commonly used by the specific machines. */
591 guess_is_rela (unsigned long e_machine
)
595 /* Targets that use REL relocations. */
611 /* Targets that use RELA relocations. */
626 case EM_CYGNUS_MN10200
:
628 case EM_CYGNUS_MN10300
:
673 warn (_("Don't know about relocations on this machine architecture\n"));
679 slurp_rela_relocs (FILE *file
,
680 unsigned long rel_offset
,
681 unsigned long rel_size
,
682 Elf_Internal_Rela
**relasp
,
683 unsigned long *nrelasp
)
685 Elf_Internal_Rela
*relas
;
686 unsigned long nrelas
;
691 Elf32_External_Rela
*erelas
;
693 erelas
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
697 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
699 relas
= malloc (nrelas
* sizeof (Elf_Internal_Rela
));
703 error(_("out of memory parsing relocs"));
707 for (i
= 0; i
< nrelas
; i
++)
709 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
710 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
711 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
718 Elf64_External_Rela
*erelas
;
720 erelas
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
724 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
726 relas
= malloc (nrelas
* sizeof (Elf_Internal_Rela
));
730 error(_("out of memory parsing relocs"));
734 for (i
= 0; i
< nrelas
; i
++)
736 relas
[i
].r_offset
= BYTE_GET8 (erelas
[i
].r_offset
);
737 relas
[i
].r_info
= BYTE_GET8 (erelas
[i
].r_info
);
738 relas
[i
].r_addend
= BYTE_GET8 (erelas
[i
].r_addend
);
749 slurp_rel_relocs (FILE *file
,
750 unsigned long rel_offset
,
751 unsigned long rel_size
,
752 Elf_Internal_Rela
**relsp
,
753 unsigned long *nrelsp
)
755 Elf_Internal_Rela
*rels
;
761 Elf32_External_Rel
*erels
;
763 erels
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
767 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
769 rels
= malloc (nrels
* sizeof (Elf_Internal_Rela
));
773 error(_("out of memory parsing relocs"));
777 for (i
= 0; i
< nrels
; i
++)
779 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
780 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
781 rels
[i
].r_addend
= 0;
788 Elf64_External_Rel
*erels
;
790 erels
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
794 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
796 rels
= malloc (nrels
* sizeof (Elf_Internal_Rela
));
800 error(_("out of memory parsing relocs"));
804 for (i
= 0; i
< nrels
; i
++)
806 rels
[i
].r_offset
= BYTE_GET8 (erels
[i
].r_offset
);
807 rels
[i
].r_info
= BYTE_GET8 (erels
[i
].r_info
);
808 rels
[i
].r_addend
= 0;
818 /* Display the contents of the relocation data found at the specified
822 dump_relocations (FILE *file
,
823 unsigned long rel_offset
,
824 unsigned long rel_size
,
825 Elf_Internal_Sym
*symtab
,
831 Elf_Internal_Rela
*rels
;
834 if (is_rela
== UNKNOWN
)
835 is_rela
= guess_is_rela (elf_header
.e_machine
);
839 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
844 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
853 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
855 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
860 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
862 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
870 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
872 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
877 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
879 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
883 for (i
= 0; i
< rel_size
; i
++)
886 const char *rtype2
= NULL
;
887 const char *rtype3
= NULL
;
890 bfd_vma symtab_index
;
895 offset
= rels
[i
].r_offset
;
896 info
= rels
[i
].r_info
;
900 type
= ELF32_R_TYPE (info
);
901 symtab_index
= ELF32_R_SYM (info
);
905 /* The #ifdef BFD64 below is to prevent a compile time warning.
906 We know that if we do not have a 64 bit data type that we
907 will never execute this code anyway. */
909 if (elf_header
.e_machine
== EM_MIPS
)
911 /* In little-endian objects, r_info isn't really a 64-bit
912 little-endian value: it has a 32-bit little-endian
913 symbol index followed by four individual byte fields.
914 Reorder INFO accordingly. */
915 if (elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
916 info
= (((info
& 0xffffffff) << 32)
917 | ((info
>> 56) & 0xff)
918 | ((info
>> 40) & 0xff00)
919 | ((info
>> 24) & 0xff0000)
920 | ((info
>> 8) & 0xff000000));
921 type
= ELF64_MIPS_R_TYPE (info
);
922 type2
= ELF64_MIPS_R_TYPE2 (info
);
923 type3
= ELF64_MIPS_R_TYPE3 (info
);
925 else if (elf_header
.e_machine
== EM_SPARCV9
)
926 type
= ELF64_R_TYPE_ID (info
);
928 type
= ELF64_R_TYPE (info
);
930 symtab_index
= ELF64_R_SYM (info
);
936 #ifdef _bfd_int64_low
937 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
939 printf ("%8.8lx %8.8lx ", offset
, info
);
944 #ifdef _bfd_int64_low
946 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
947 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
948 _bfd_int64_high (offset
),
949 _bfd_int64_low (offset
),
950 _bfd_int64_high (info
),
951 _bfd_int64_low (info
));
954 ? "%16.16lx %16.16lx "
955 : "%12.12lx %12.12lx ",
960 switch (elf_header
.e_machine
)
968 rtype
= elf_m32r_reloc_type (type
);
973 rtype
= elf_i386_reloc_type (type
);
978 rtype
= elf_m68hc11_reloc_type (type
);
982 rtype
= elf_m68k_reloc_type (type
);
986 rtype
= elf_i960_reloc_type (type
);
991 rtype
= elf_avr_reloc_type (type
);
998 rtype
= elf_sparc_reloc_type (type
);
1002 case EM_CYGNUS_V850
:
1003 rtype
= v850_reloc_type (type
);
1007 case EM_CYGNUS_D10V
:
1008 rtype
= elf_d10v_reloc_type (type
);
1012 case EM_CYGNUS_D30V
:
1013 rtype
= elf_d30v_reloc_type (type
);
1017 rtype
= elf_dlx_reloc_type (type
);
1021 rtype
= elf_sh_reloc_type (type
);
1025 case EM_CYGNUS_MN10300
:
1026 rtype
= elf_mn10300_reloc_type (type
);
1030 case EM_CYGNUS_MN10200
:
1031 rtype
= elf_mn10200_reloc_type (type
);
1035 case EM_CYGNUS_FR30
:
1036 rtype
= elf_fr30_reloc_type (type
);
1040 rtype
= elf_frv_reloc_type (type
);
1044 rtype
= elf_mcore_reloc_type (type
);
1048 rtype
= elf_mmix_reloc_type (type
);
1053 rtype
= elf_msp430_reloc_type (type
);
1057 rtype
= elf_ppc_reloc_type (type
);
1061 rtype
= elf_ppc64_reloc_type (type
);
1065 case EM_MIPS_RS3_LE
:
1066 rtype
= elf_mips_reloc_type (type
);
1069 rtype2
= elf_mips_reloc_type (type2
);
1070 rtype3
= elf_mips_reloc_type (type3
);
1075 rtype
= elf_alpha_reloc_type (type
);
1079 rtype
= elf_arm_reloc_type (type
);
1083 rtype
= elf_arc_reloc_type (type
);
1087 rtype
= elf_hppa_reloc_type (type
);
1093 rtype
= elf_h8_reloc_type (type
);
1098 rtype
= elf_or32_reloc_type (type
);
1103 rtype
= elf_pj_reloc_type (type
);
1106 rtype
= elf_ia64_reloc_type (type
);
1110 rtype
= elf_cris_reloc_type (type
);
1114 rtype
= elf_i860_reloc_type (type
);
1118 rtype
= elf_x86_64_reloc_type (type
);
1122 rtype
= i370_reloc_type (type
);
1127 rtype
= elf_s390_reloc_type (type
);
1131 rtype
= elf_xstormy16_reloc_type (type
);
1135 rtype
= elf_vax_reloc_type (type
);
1140 rtype
= elf_ip2k_reloc_type (type
);
1144 rtype
= elf_iq2000_reloc_type (type
);
1149 rtype
= elf_xtensa_reloc_type (type
);
1154 #ifdef _bfd_int64_low
1155 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type
));
1157 printf (_("unrecognized: %-7lx"), type
);
1160 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1164 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1165 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1168 Elf_Internal_Sym
*psym
;
1170 psym
= symtab
+ symtab_index
;
1173 print_vma (psym
->st_value
, LONG_HEX
);
1174 printf (is_32bit_elf
? " " : " ");
1176 if (psym
->st_name
== 0)
1178 const char *sec_name
= "<null>";
1181 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1183 bfd_vma sec_index
= (bfd_vma
) -1;
1185 if (psym
->st_shndx
< SHN_LORESERVE
)
1186 sec_index
= psym
->st_shndx
;
1187 else if (psym
->st_shndx
> SHN_LORESERVE
)
1188 sec_index
= psym
->st_shndx
- (SHN_HIRESERVE
+ 1
1191 if (sec_index
!= (bfd_vma
) -1)
1192 sec_name
= SECTION_NAME (section_headers
+ sec_index
);
1193 else if (psym
->st_shndx
== SHN_ABS
)
1195 else if (psym
->st_shndx
== SHN_COMMON
)
1196 sec_name
= "COMMON";
1197 else if (elf_header
.e_machine
== EM_IA_64
1198 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1199 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1200 sec_name
= "ANSI_COM";
1203 sprintf (name_buf
, "<section 0x%x>",
1204 (unsigned int) psym
->st_shndx
);
1205 sec_name
= name_buf
;
1208 print_symbol (22, sec_name
);
1210 else if (strtab
== NULL
)
1211 printf (_("<string table index %3ld>"), psym
->st_name
);
1213 print_symbol (22, strtab
+ psym
->st_name
);
1216 printf (" + %lx", (unsigned long) rels
[i
].r_addend
);
1221 printf ("%*c", is_32bit_elf
? (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1222 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1225 if (elf_header
.e_machine
== EM_SPARCV9
1226 && !strcmp (rtype
, "R_SPARC_OLO10"))
1227 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1231 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1233 printf (" Type2: ");
1236 #ifdef _bfd_int64_low
1237 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2
));
1239 printf (_("unrecognized: %-7lx"), type2
);
1242 printf ("%-17.17s", rtype2
);
1244 printf("\n Type3: ");
1247 #ifdef _bfd_int64_low
1248 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3
));
1250 printf (_("unrecognized: %-7lx"), type3
);
1253 printf ("%-17.17s", rtype3
);
1265 get_mips_dynamic_type (unsigned long type
)
1269 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1270 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1271 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1272 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1273 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1274 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1275 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1276 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1277 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1278 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1279 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1280 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1281 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1282 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1283 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1284 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1285 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1286 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1287 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1288 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1289 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1290 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1291 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1292 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1293 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1294 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1295 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1296 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1297 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1298 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1299 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1300 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1301 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1302 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1303 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1304 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1305 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1306 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1307 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1308 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1309 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1310 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1311 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1318 get_sparc64_dynamic_type (unsigned long type
)
1322 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1329 get_ppc64_dynamic_type (unsigned long type
)
1333 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1334 case DT_PPC64_OPD
: return "PPC64_OPD";
1335 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1342 get_parisc_dynamic_type (unsigned long type
)
1346 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1347 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1348 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1349 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1350 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1351 case DT_HP_PREINIT
: return "HP_PREINIT";
1352 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1353 case DT_HP_NEEDED
: return "HP_NEEDED";
1354 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1355 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1356 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1357 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1358 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1365 get_ia64_dynamic_type (unsigned long type
)
1369 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1376 get_dynamic_type (unsigned long type
)
1378 static char buff
[32];
1382 case DT_NULL
: return "NULL";
1383 case DT_NEEDED
: return "NEEDED";
1384 case DT_PLTRELSZ
: return "PLTRELSZ";
1385 case DT_PLTGOT
: return "PLTGOT";
1386 case DT_HASH
: return "HASH";
1387 case DT_STRTAB
: return "STRTAB";
1388 case DT_SYMTAB
: return "SYMTAB";
1389 case DT_RELA
: return "RELA";
1390 case DT_RELASZ
: return "RELASZ";
1391 case DT_RELAENT
: return "RELAENT";
1392 case DT_STRSZ
: return "STRSZ";
1393 case DT_SYMENT
: return "SYMENT";
1394 case DT_INIT
: return "INIT";
1395 case DT_FINI
: return "FINI";
1396 case DT_SONAME
: return "SONAME";
1397 case DT_RPATH
: return "RPATH";
1398 case DT_SYMBOLIC
: return "SYMBOLIC";
1399 case DT_REL
: return "REL";
1400 case DT_RELSZ
: return "RELSZ";
1401 case DT_RELENT
: return "RELENT";
1402 case DT_PLTREL
: return "PLTREL";
1403 case DT_DEBUG
: return "DEBUG";
1404 case DT_TEXTREL
: return "TEXTREL";
1405 case DT_JMPREL
: return "JMPREL";
1406 case DT_BIND_NOW
: return "BIND_NOW";
1407 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1408 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1409 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1410 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1411 case DT_RUNPATH
: return "RUNPATH";
1412 case DT_FLAGS
: return "FLAGS";
1414 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1415 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1417 case DT_CHECKSUM
: return "CHECKSUM";
1418 case DT_PLTPADSZ
: return "PLTPADSZ";
1419 case DT_MOVEENT
: return "MOVEENT";
1420 case DT_MOVESZ
: return "MOVESZ";
1421 case DT_FEATURE
: return "FEATURE";
1422 case DT_POSFLAG_1
: return "POSFLAG_1";
1423 case DT_SYMINSZ
: return "SYMINSZ";
1424 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1426 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1427 case DT_CONFIG
: return "CONFIG";
1428 case DT_DEPAUDIT
: return "DEPAUDIT";
1429 case DT_AUDIT
: return "AUDIT";
1430 case DT_PLTPAD
: return "PLTPAD";
1431 case DT_MOVETAB
: return "MOVETAB";
1432 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1434 case DT_VERSYM
: return "VERSYM";
1436 case DT_RELACOUNT
: return "RELACOUNT";
1437 case DT_RELCOUNT
: return "RELCOUNT";
1438 case DT_FLAGS_1
: return "FLAGS_1";
1439 case DT_VERDEF
: return "VERDEF";
1440 case DT_VERDEFNUM
: return "VERDEFNUM";
1441 case DT_VERNEED
: return "VERNEED";
1442 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1444 case DT_AUXILIARY
: return "AUXILIARY";
1445 case DT_USED
: return "USED";
1446 case DT_FILTER
: return "FILTER";
1448 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1449 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1450 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1451 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1452 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1455 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1459 switch (elf_header
.e_machine
)
1462 case EM_MIPS_RS3_LE
:
1463 result
= get_mips_dynamic_type (type
);
1466 result
= get_sparc64_dynamic_type (type
);
1469 result
= get_ppc64_dynamic_type (type
);
1472 result
= get_ia64_dynamic_type (type
);
1482 sprintf (buff
, _("Processor Specific: %lx"), type
);
1484 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1488 switch (elf_header
.e_machine
)
1491 result
= get_parisc_dynamic_type (type
);
1501 sprintf (buff
, _("Operating System specific: %lx"), type
);
1504 sprintf (buff
, _("<unknown>: %lx"), type
);
1511 get_file_type (unsigned e_type
)
1513 static char buff
[32];
1517 case ET_NONE
: return _("NONE (None)");
1518 case ET_REL
: return _("REL (Relocatable file)");
1519 case ET_EXEC
: return _("EXEC (Executable file)");
1520 case ET_DYN
: return _("DYN (Shared object file)");
1521 case ET_CORE
: return _("CORE (Core file)");
1524 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1525 sprintf (buff
, _("Processor Specific: (%x)"), e_type
);
1526 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1527 sprintf (buff
, _("OS Specific: (%x)"), e_type
);
1529 sprintf (buff
, _("<unknown>: %x"), e_type
);
1535 get_machine_name (unsigned e_machine
)
1537 static char buff
[64]; /* XXX */
1541 case EM_NONE
: return _("None");
1542 case EM_M32
: return "WE32100";
1543 case EM_SPARC
: return "Sparc";
1544 case EM_386
: return "Intel 80386";
1545 case EM_68K
: return "MC68000";
1546 case EM_88K
: return "MC88000";
1547 case EM_486
: return "Intel 80486";
1548 case EM_860
: return "Intel 80860";
1549 case EM_MIPS
: return "MIPS R3000";
1550 case EM_S370
: return "IBM System/370";
1551 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1552 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1553 case EM_PARISC
: return "HPPA";
1554 case EM_PPC_OLD
: return "Power PC (old)";
1555 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1556 case EM_960
: return "Intel 90860";
1557 case EM_PPC
: return "PowerPC";
1558 case EM_PPC64
: return "PowerPC64";
1559 case EM_V800
: return "NEC V800";
1560 case EM_FR20
: return "Fujitsu FR20";
1561 case EM_RH32
: return "TRW RH32";
1562 case EM_MCORE
: return "MCORE";
1563 case EM_ARM
: return "ARM";
1564 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1565 case EM_SH
: return "Renesas / SuperH SH";
1566 case EM_SPARCV9
: return "Sparc v9";
1567 case EM_TRICORE
: return "Siemens Tricore";
1568 case EM_ARC
: return "ARC";
1569 case EM_H8_300
: return "Renesas H8/300";
1570 case EM_H8_300H
: return "Renesas H8/300H";
1571 case EM_H8S
: return "Renesas H8S";
1572 case EM_H8_500
: return "Renesas H8/500";
1573 case EM_IA_64
: return "Intel IA-64";
1574 case EM_MIPS_X
: return "Stanford MIPS-X";
1575 case EM_COLDFIRE
: return "Motorola Coldfire";
1576 case EM_68HC12
: return "Motorola M68HC12";
1577 case EM_ALPHA
: return "Alpha";
1578 case EM_CYGNUS_D10V
:
1579 case EM_D10V
: return "d10v";
1580 case EM_CYGNUS_D30V
:
1581 case EM_D30V
: return "d30v";
1582 case EM_CYGNUS_M32R
:
1583 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
1584 case EM_CYGNUS_V850
:
1585 case EM_V850
: return "NEC v850";
1586 case EM_CYGNUS_MN10300
:
1587 case EM_MN10300
: return "mn10300";
1588 case EM_CYGNUS_MN10200
:
1589 case EM_MN10200
: return "mn10200";
1590 case EM_CYGNUS_FR30
:
1591 case EM_FR30
: return "Fujitsu FR30";
1592 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1594 case EM_PJ
: return "picoJava";
1595 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1596 case EM_PCP
: return "Siemens PCP";
1597 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1598 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1599 case EM_STARCORE
: return "Motorola Star*Core processor";
1600 case EM_ME16
: return "Toyota ME16 processor";
1601 case EM_ST100
: return "STMicroelectronics ST100 processor";
1602 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1603 case EM_FX66
: return "Siemens FX66 microcontroller";
1604 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1605 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1606 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1607 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1608 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1609 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1610 case EM_SVX
: return "Silicon Graphics SVx";
1611 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1612 case EM_VAX
: return "Digital VAX";
1614 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1615 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1616 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1617 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1618 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1619 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1620 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1621 case EM_PRISM
: return "Vitesse Prism";
1622 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1624 case EM_S390
: return "IBM S/390";
1625 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1627 case EM_OR32
: return "OpenRISC";
1628 case EM_DLX
: return "OpenDLX";
1630 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1631 case EM_IQ2000
: return "Vitesse IQ2000";
1633 case EM_XTENSA
: return "Tensilica Xtensa Processor";
1635 sprintf (buff
, _("<unknown>: %x"), e_machine
);
1641 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
1646 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1647 e_flags
&= ~ EF_ARM_EABIMASK
;
1649 /* Handle "generic" ARM flags. */
1650 if (e_flags
& EF_ARM_RELEXEC
)
1652 strcat (buf
, ", relocatable executable");
1653 e_flags
&= ~ EF_ARM_RELEXEC
;
1656 if (e_flags
& EF_ARM_HASENTRY
)
1658 strcat (buf
, ", has entry point");
1659 e_flags
&= ~ EF_ARM_HASENTRY
;
1662 /* Now handle EABI specific flags. */
1666 strcat (buf
, ", <unrecognized EABI>");
1671 case EF_ARM_EABI_VER1
:
1672 strcat (buf
, ", Version1 EABI");
1677 /* Process flags one bit at a time. */
1678 flag
= e_flags
& - e_flags
;
1683 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1684 strcat (buf
, ", sorted symbol tables");
1694 case EF_ARM_EABI_VER2
:
1695 strcat (buf
, ", Version2 EABI");
1700 /* Process flags one bit at a time. */
1701 flag
= e_flags
& - e_flags
;
1706 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1707 strcat (buf
, ", sorted symbol tables");
1710 case EF_ARM_DYNSYMSUSESEGIDX
:
1711 strcat (buf
, ", dynamic symbols use segment index");
1714 case EF_ARM_MAPSYMSFIRST
:
1715 strcat (buf
, ", mapping symbols precede others");
1725 case EF_ARM_EABI_UNKNOWN
:
1726 strcat (buf
, ", GNU EABI");
1731 /* Process flags one bit at a time. */
1732 flag
= e_flags
& - e_flags
;
1737 case EF_ARM_INTERWORK
:
1738 strcat (buf
, ", interworking enabled");
1741 case EF_ARM_APCS_26
:
1742 strcat (buf
, ", uses APCS/26");
1745 case EF_ARM_APCS_FLOAT
:
1746 strcat (buf
, ", uses APCS/float");
1750 strcat (buf
, ", position independent");
1754 strcat (buf
, ", 8 bit structure alignment");
1757 case EF_ARM_NEW_ABI
:
1758 strcat (buf
, ", uses new ABI");
1761 case EF_ARM_OLD_ABI
:
1762 strcat (buf
, ", uses old ABI");
1765 case EF_ARM_SOFT_FLOAT
:
1766 strcat (buf
, ", software FP");
1769 case EF_ARM_MAVERICK_FLOAT
:
1770 strcat (buf
, ", Maverick FP");
1781 strcat (buf
,", <unknown>");
1785 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
1787 static char buf
[1024];
1799 decode_ARM_machine_flags (e_flags
, buf
);
1803 if (e_flags
& EF_CPU32
)
1804 strcat (buf
, ", cpu32");
1805 if (e_flags
& EF_M68000
)
1806 strcat (buf
, ", m68000");
1810 if (e_flags
& EF_PPC_EMB
)
1811 strcat (buf
, ", emb");
1813 if (e_flags
& EF_PPC_RELOCATABLE
)
1814 strcat (buf
, ", relocatable");
1816 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
1817 strcat (buf
, ", relocatable-lib");
1821 case EM_CYGNUS_V850
:
1822 switch (e_flags
& EF_V850_ARCH
)
1825 strcat (buf
, ", v850e1");
1828 strcat (buf
, ", v850e");
1831 strcat (buf
, ", v850");
1834 strcat (buf
, ", unknown v850 architecture variant");
1840 case EM_CYGNUS_M32R
:
1841 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
1842 strcat (buf
, ", m32r");
1847 case EM_MIPS_RS3_LE
:
1848 if (e_flags
& EF_MIPS_NOREORDER
)
1849 strcat (buf
, ", noreorder");
1851 if (e_flags
& EF_MIPS_PIC
)
1852 strcat (buf
, ", pic");
1854 if (e_flags
& EF_MIPS_CPIC
)
1855 strcat (buf
, ", cpic");
1857 if (e_flags
& EF_MIPS_UCODE
)
1858 strcat (buf
, ", ugen_reserved");
1860 if (e_flags
& EF_MIPS_ABI2
)
1861 strcat (buf
, ", abi2");
1863 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
1864 strcat (buf
, ", odk first");
1866 if (e_flags
& EF_MIPS_32BITMODE
)
1867 strcat (buf
, ", 32bitmode");
1869 switch ((e_flags
& EF_MIPS_MACH
))
1871 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
1872 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
1873 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
1874 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
1875 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
1876 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
1877 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
1878 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
1879 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
1881 /* We simply ignore the field in this case to avoid confusion:
1882 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
1885 default: strcat (buf
, ", unknown CPU"); break;
1888 switch ((e_flags
& EF_MIPS_ABI
))
1890 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
1891 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
1892 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
1893 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
1895 /* We simply ignore the field in this case to avoid confusion:
1896 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
1897 This means it is likely to be an o32 file, but not for
1900 default: strcat (buf
, ", unknown ABI"); break;
1903 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
1904 strcat (buf
, ", mdmx");
1906 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
1907 strcat (buf
, ", mips16");
1909 switch ((e_flags
& EF_MIPS_ARCH
))
1911 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
1912 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
1913 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
1914 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
1915 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
1916 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
1917 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
1918 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
1919 default: strcat (buf
, ", unknown ISA"); break;
1925 if (e_flags
& EF_SPARC_32PLUS
)
1926 strcat (buf
, ", v8+");
1928 if (e_flags
& EF_SPARC_SUN_US1
)
1929 strcat (buf
, ", ultrasparcI");
1931 if (e_flags
& EF_SPARC_SUN_US3
)
1932 strcat (buf
, ", ultrasparcIII");
1934 if (e_flags
& EF_SPARC_HAL_R1
)
1935 strcat (buf
, ", halr1");
1937 if (e_flags
& EF_SPARC_LEDATA
)
1938 strcat (buf
, ", ledata");
1940 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
1941 strcat (buf
, ", tso");
1943 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
1944 strcat (buf
, ", pso");
1946 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
1947 strcat (buf
, ", rmo");
1951 switch (e_flags
& EF_PARISC_ARCH
)
1953 case EFA_PARISC_1_0
:
1954 strcpy (buf
, ", PA-RISC 1.0");
1956 case EFA_PARISC_1_1
:
1957 strcpy (buf
, ", PA-RISC 1.1");
1959 case EFA_PARISC_2_0
:
1960 strcpy (buf
, ", PA-RISC 2.0");
1965 if (e_flags
& EF_PARISC_TRAPNIL
)
1966 strcat (buf
, ", trapnil");
1967 if (e_flags
& EF_PARISC_EXT
)
1968 strcat (buf
, ", ext");
1969 if (e_flags
& EF_PARISC_LSB
)
1970 strcat (buf
, ", lsb");
1971 if (e_flags
& EF_PARISC_WIDE
)
1972 strcat (buf
, ", wide");
1973 if (e_flags
& EF_PARISC_NO_KABP
)
1974 strcat (buf
, ", no kabp");
1975 if (e_flags
& EF_PARISC_LAZYSWAP
)
1976 strcat (buf
, ", lazyswap");
1981 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
1982 strcat (buf
, ", new calling convention");
1984 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
1985 strcat (buf
, ", gnu calling convention");
1989 if ((e_flags
& EF_IA_64_ABI64
))
1990 strcat (buf
, ", 64-bit");
1992 strcat (buf
, ", 32-bit");
1993 if ((e_flags
& EF_IA_64_REDUCEDFP
))
1994 strcat (buf
, ", reduced fp model");
1995 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
1996 strcat (buf
, ", no function descriptors, constant gp");
1997 else if ((e_flags
& EF_IA_64_CONS_GP
))
1998 strcat (buf
, ", constant gp");
1999 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2000 strcat (buf
, ", absolute");
2004 if ((e_flags
& EF_VAX_NONPIC
))
2005 strcat (buf
, ", non-PIC");
2006 if ((e_flags
& EF_VAX_DFLOAT
))
2007 strcat (buf
, ", D-Float");
2008 if ((e_flags
& EF_VAX_GFLOAT
))
2009 strcat (buf
, ", G-Float");
2018 get_osabi_name (unsigned int osabi
)
2020 static char buff
[32];
2024 case ELFOSABI_NONE
: return "UNIX - System V";
2025 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2026 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2027 case ELFOSABI_LINUX
: return "UNIX - Linux";
2028 case ELFOSABI_HURD
: return "GNU/Hurd";
2029 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2030 case ELFOSABI_AIX
: return "UNIX - AIX";
2031 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2032 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2033 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2034 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2035 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2036 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2037 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2038 case ELFOSABI_AROS
: return "Amiga Research OS";
2039 case ELFOSABI_STANDALONE
: return _("Standalone App");
2040 case ELFOSABI_ARM
: return "ARM";
2042 sprintf (buff
, _("<unknown: %x>"), osabi
);
2048 get_mips_segment_type (unsigned long type
)
2052 case PT_MIPS_REGINFO
:
2054 case PT_MIPS_RTPROC
:
2056 case PT_MIPS_OPTIONS
:
2066 get_parisc_segment_type (unsigned long type
)
2070 case PT_HP_TLS
: return "HP_TLS";
2071 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2072 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2073 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2074 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2075 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2076 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2077 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2078 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2079 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2080 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2081 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2082 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2083 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2092 get_ia64_segment_type (unsigned long type
)
2096 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2097 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2098 case PT_HP_TLS
: return "HP_TLS";
2099 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2100 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2101 case PT_IA_64_HP_STACK
: return "HP_STACK";
2110 get_segment_type (unsigned long p_type
)
2112 static char buff
[32];
2116 case PT_NULL
: return "NULL";
2117 case PT_LOAD
: return "LOAD";
2118 case PT_DYNAMIC
: return "DYNAMIC";
2119 case PT_INTERP
: return "INTERP";
2120 case PT_NOTE
: return "NOTE";
2121 case PT_SHLIB
: return "SHLIB";
2122 case PT_PHDR
: return "PHDR";
2123 case PT_TLS
: return "TLS";
2125 case PT_GNU_EH_FRAME
:
2126 return "GNU_EH_FRAME";
2127 case PT_GNU_STACK
: return "STACK";
2130 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2134 switch (elf_header
.e_machine
)
2137 case EM_MIPS_RS3_LE
:
2138 result
= get_mips_segment_type (p_type
);
2141 result
= get_parisc_segment_type (p_type
);
2144 result
= get_ia64_segment_type (p_type
);
2154 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2156 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2160 switch (elf_header
.e_machine
)
2163 result
= get_parisc_segment_type (p_type
);
2166 result
= get_ia64_segment_type (p_type
);
2176 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2179 sprintf (buff
, _("<unknown>: %lx"), p_type
);
2186 get_mips_section_type_name (unsigned int sh_type
)
2190 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2191 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2192 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2193 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2194 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2195 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2196 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2197 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2198 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2199 case SHT_MIPS_RELD
: return "MIPS_RELD";
2200 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2201 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2202 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2203 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2204 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2205 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2206 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2207 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2208 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2209 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2210 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2211 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2212 case SHT_MIPS_LINE
: return "MIPS_LINE";
2213 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2214 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2215 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2216 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2217 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2218 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2219 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2220 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2221 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2222 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2223 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2224 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2225 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2226 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2227 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2228 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2236 get_parisc_section_type_name (unsigned int sh_type
)
2240 case SHT_PARISC_EXT
: return "PARISC_EXT";
2241 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2242 case SHT_PARISC_DOC
: return "PARISC_DOC";
2250 get_ia64_section_type_name (unsigned int sh_type
)
2252 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2253 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2254 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2258 case SHT_IA_64_EXT
: return "IA_64_EXT";
2259 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2260 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2268 get_section_type_name (unsigned int sh_type
)
2270 static char buff
[32];
2274 case SHT_NULL
: return "NULL";
2275 case SHT_PROGBITS
: return "PROGBITS";
2276 case SHT_SYMTAB
: return "SYMTAB";
2277 case SHT_STRTAB
: return "STRTAB";
2278 case SHT_RELA
: return "RELA";
2279 case SHT_HASH
: return "HASH";
2280 case SHT_DYNAMIC
: return "DYNAMIC";
2281 case SHT_NOTE
: return "NOTE";
2282 case SHT_NOBITS
: return "NOBITS";
2283 case SHT_REL
: return "REL";
2284 case SHT_SHLIB
: return "SHLIB";
2285 case SHT_DYNSYM
: return "DYNSYM";
2286 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2287 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2288 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2289 case SHT_GROUP
: return "GROUP";
2290 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2291 case SHT_GNU_verdef
: return "VERDEF";
2292 case SHT_GNU_verneed
: return "VERNEED";
2293 case SHT_GNU_versym
: return "VERSYM";
2294 case 0x6ffffff0: return "VERSYM";
2295 case 0x6ffffffc: return "VERDEF";
2296 case 0x7ffffffd: return "AUXILIARY";
2297 case 0x7fffffff: return "FILTER";
2298 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2301 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2305 switch (elf_header
.e_machine
)
2308 case EM_MIPS_RS3_LE
:
2309 result
= get_mips_section_type_name (sh_type
);
2312 result
= get_parisc_section_type_name (sh_type
);
2315 result
= get_ia64_section_type_name (sh_type
);
2325 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2327 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2328 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2329 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2330 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2332 sprintf (buff
, _("<unknown>: %x"), sh_type
);
2338 #define OPTION_DEBUG_DUMP 512
2340 struct option options
[] =
2342 {"all", no_argument
, 0, 'a'},
2343 {"file-header", no_argument
, 0, 'h'},
2344 {"program-headers", no_argument
, 0, 'l'},
2345 {"headers", no_argument
, 0, 'e'},
2346 {"histogram", no_argument
, 0, 'I'},
2347 {"segments", no_argument
, 0, 'l'},
2348 {"sections", no_argument
, 0, 'S'},
2349 {"section-headers", no_argument
, 0, 'S'},
2350 {"symbols", no_argument
, 0, 's'},
2351 {"syms", no_argument
, 0, 's'},
2352 {"relocs", no_argument
, 0, 'r'},
2353 {"notes", no_argument
, 0, 'n'},
2354 {"dynamic", no_argument
, 0, 'd'},
2355 {"arch-specific", no_argument
, 0, 'A'},
2356 {"version-info", no_argument
, 0, 'V'},
2357 {"use-dynamic", no_argument
, 0, 'D'},
2358 {"hex-dump", required_argument
, 0, 'x'},
2359 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2360 {"unwind", no_argument
, 0, 'u'},
2361 #ifdef SUPPORT_DISASSEMBLY
2362 {"instruction-dump", required_argument
, 0, 'i'},
2365 {"version", no_argument
, 0, 'v'},
2366 {"wide", no_argument
, 0, 'W'},
2367 {"help", no_argument
, 0, 'H'},
2368 {0, no_argument
, 0, 0}
2374 fprintf (stdout
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2375 fprintf (stdout
, _(" Display information about the contents of ELF format files\n"));
2376 fprintf (stdout
, _(" Options are:\n\
2377 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2378 -h --file-header Display the ELF file header\n\
2379 -l --program-headers Display the program headers\n\
2380 --segments An alias for --program-headers\n\
2381 -S --section-headers Display the sections' header\n\
2382 --sections An alias for --section-headers\n\
2383 -e --headers Equivalent to: -h -l -S\n\
2384 -s --syms Display the symbol table\n\
2385 --symbols An alias for --syms\n\
2386 -n --notes Display the core notes (if present)\n\
2387 -r --relocs Display the relocations (if present)\n\
2388 -u --unwind Display the unwind info (if present)\n\
2389 -d --dynamic Display the dynamic segment (if present)\n\
2390 -V --version-info Display the version sections (if present)\n\
2391 -A --arch-specific Display architecture specific information (if any).\n\
2392 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2393 -x --hex-dump=<number> Dump the contents of section <number>\n\
2394 -w[liaprmfFso] or\n\
2395 --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]\n\
2396 Display the contents of DWARF2 debug sections\n"));
2397 #ifdef SUPPORT_DISASSEMBLY
2398 fprintf (stdout
, _("\
2399 -i --instruction-dump=<number>\n\
2400 Disassemble the contents of section <number>\n"));
2402 fprintf (stdout
, _("\
2403 -I --histogram Display histogram of bucket list lengths\n\
2404 -W --wide Allow output width to exceed 80 characters\n\
2405 -H --help Display this information\n\
2406 -v --version Display the version number of readelf\n"));
2407 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2413 request_dump (unsigned int section
, int type
)
2415 if (section
>= num_dump_sects
)
2417 char *new_dump_sects
;
2419 new_dump_sects
= calloc (section
+ 1, 1);
2421 if (new_dump_sects
== NULL
)
2422 error (_("Out of memory allocating dump request table."));
2425 /* Copy current flag settings. */
2426 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2430 dump_sects
= new_dump_sects
;
2431 num_dump_sects
= section
+ 1;
2436 dump_sects
[section
] |= type
;
2442 parse_args (int argc
, char **argv
)
2449 while ((c
= getopt_long
2450 (argc
, argv
, "ersuahnldSDAIw::x:i:vVWH", options
, NULL
)) != EOF
)
2517 section
= strtoul (optarg
, & cp
, 0);
2518 if (! *cp
&& section
>= 0)
2520 request_dump (section
, HEX_DUMP
);
2530 unsigned int index
= 0;
2534 while (optarg
[index
])
2535 switch (optarg
[index
++])
2544 do_debug_abbrevs
= 1;
2554 do_debug_pubnames
= 1;
2559 do_debug_aranges
= 1;
2563 do_debug_frames_interp
= 1;
2565 do_debug_frames
= 1;
2570 do_debug_macinfo
= 1;
2584 warn (_("Unrecognized debug option '%s'\n"), optarg
);
2589 case OPTION_DEBUG_DUMP
:
2595 static const char *debug_dump_opt
[]
2596 = { "line", "info", "abbrev", "pubnames", "ranges",
2597 "macro", "frames", "frames-interp", "str", "loc", NULL
};
2606 for (index
= 0; debug_dump_opt
[index
]; index
++)
2608 size_t len
= strlen (debug_dump_opt
[index
]);
2610 if (strncmp (p
, debug_dump_opt
[index
], len
) == 0
2611 && (p
[len
] == ',' || p
[len
] == '\0'))
2620 do_debug_abbrevs
= 1;
2631 do_debug_pubnames
= 1;
2635 do_debug_aranges
= 1;
2640 do_debug_frames_interp
= 1;
2641 do_debug_frames
= 1;
2645 do_debug_macinfo
= 1;
2658 if (debug_dump_opt
[index
] == NULL
)
2660 warn (_("Unrecognized debug option '%s'\n"), p
);
2661 p
= strchr (p
, ',');
2671 #ifdef SUPPORT_DISASSEMBLY
2674 section
= strtoul (optarg
, & cp
, 0);
2675 if (! *cp
&& section
>= 0)
2677 request_dump (section
, DISASS_DUMP
);
2683 print_version (program_name
);
2693 /* xgettext:c-format */
2694 error (_("Invalid option '-%c'\n"), c
);
2701 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
2702 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2703 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
)
2707 warn (_("Nothing to do.\n"));
2713 get_elf_class (unsigned int elf_class
)
2715 static char buff
[32];
2719 case ELFCLASSNONE
: return _("none");
2720 case ELFCLASS32
: return "ELF32";
2721 case ELFCLASS64
: return "ELF64";
2723 sprintf (buff
, _("<unknown: %x>"), elf_class
);
2729 get_data_encoding (unsigned int encoding
)
2731 static char buff
[32];
2735 case ELFDATANONE
: return _("none");
2736 case ELFDATA2LSB
: return _("2's complement, little endian");
2737 case ELFDATA2MSB
: return _("2's complement, big endian");
2739 sprintf (buff
, _("<unknown: %x>"), encoding
);
2744 /* Decode the data held in 'elf_header'. */
2747 process_file_header (void)
2749 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2750 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
2751 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
2752 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
2755 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2763 printf (_("ELF Header:\n"));
2764 printf (_(" Magic: "));
2765 for (i
= 0; i
< EI_NIDENT
; i
++)
2766 printf ("%2.2x ", elf_header
.e_ident
[i
]);
2768 printf (_(" Class: %s\n"),
2769 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
2770 printf (_(" Data: %s\n"),
2771 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
2772 printf (_(" Version: %d %s\n"),
2773 elf_header
.e_ident
[EI_VERSION
],
2774 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
2776 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
2779 printf (_(" OS/ABI: %s\n"),
2780 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
2781 printf (_(" ABI Version: %d\n"),
2782 elf_header
.e_ident
[EI_ABIVERSION
]);
2783 printf (_(" Type: %s\n"),
2784 get_file_type (elf_header
.e_type
));
2785 printf (_(" Machine: %s\n"),
2786 get_machine_name (elf_header
.e_machine
));
2787 printf (_(" Version: 0x%lx\n"),
2788 (unsigned long) elf_header
.e_version
);
2790 printf (_(" Entry point address: "));
2791 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2792 printf (_("\n Start of program headers: "));
2793 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2794 printf (_(" (bytes into file)\n Start of section headers: "));
2795 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
2796 printf (_(" (bytes into file)\n"));
2798 printf (_(" Flags: 0x%lx%s\n"),
2799 (unsigned long) elf_header
.e_flags
,
2800 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
2801 printf (_(" Size of this header: %ld (bytes)\n"),
2802 (long) elf_header
.e_ehsize
);
2803 printf (_(" Size of program headers: %ld (bytes)\n"),
2804 (long) elf_header
.e_phentsize
);
2805 printf (_(" Number of program headers: %ld\n"),
2806 (long) elf_header
.e_phnum
);
2807 printf (_(" Size of section headers: %ld (bytes)\n"),
2808 (long) elf_header
.e_shentsize
);
2809 printf (_(" Number of section headers: %ld"),
2810 (long) elf_header
.e_shnum
);
2811 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
2812 printf (" (%ld)", (long) section_headers
[0].sh_size
);
2813 putc ('\n', stdout
);
2814 printf (_(" Section header string table index: %ld"),
2815 (long) elf_header
.e_shstrndx
);
2816 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
2817 printf (" (%ld)", (long) section_headers
[0].sh_link
);
2818 putc ('\n', stdout
);
2821 if (section_headers
!= NULL
)
2823 if (elf_header
.e_shnum
== 0)
2824 elf_header
.e_shnum
= section_headers
[0].sh_size
;
2825 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
2826 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
2827 free (section_headers
);
2828 section_headers
= NULL
;
2836 get_32bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
2838 Elf32_External_Phdr
*phdrs
;
2839 Elf32_External_Phdr
*external
;
2840 Elf_Internal_Phdr
*internal
;
2843 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
2844 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2845 _("program headers"));
2849 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2850 i
< elf_header
.e_phnum
;
2851 i
++, internal
++, external
++)
2853 internal
->p_type
= BYTE_GET (external
->p_type
);
2854 internal
->p_offset
= BYTE_GET (external
->p_offset
);
2855 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
2856 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
2857 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
2858 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
2859 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2860 internal
->p_align
= BYTE_GET (external
->p_align
);
2869 get_64bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
2871 Elf64_External_Phdr
*phdrs
;
2872 Elf64_External_Phdr
*external
;
2873 Elf_Internal_Phdr
*internal
;
2876 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
2877 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2878 _("program headers"));
2882 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2883 i
< elf_header
.e_phnum
;
2884 i
++, internal
++, external
++)
2886 internal
->p_type
= BYTE_GET (external
->p_type
);
2887 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2888 internal
->p_offset
= BYTE_GET8 (external
->p_offset
);
2889 internal
->p_vaddr
= BYTE_GET8 (external
->p_vaddr
);
2890 internal
->p_paddr
= BYTE_GET8 (external
->p_paddr
);
2891 internal
->p_filesz
= BYTE_GET8 (external
->p_filesz
);
2892 internal
->p_memsz
= BYTE_GET8 (external
->p_memsz
);
2893 internal
->p_align
= BYTE_GET8 (external
->p_align
);
2901 /* Returns 1 if the program headers were read into `program_headers'. */
2904 get_program_headers (FILE *file
)
2906 Elf_Internal_Phdr
*phdrs
;
2908 /* Check cache of prior read. */
2909 if (program_headers
!= NULL
)
2912 phdrs
= malloc (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
2916 error (_("Out of memory\n"));
2921 ? get_32bit_program_headers (file
, phdrs
)
2922 : get_64bit_program_headers (file
, phdrs
))
2924 program_headers
= phdrs
;
2932 /* Returns 1 if the program headers were loaded. */
2935 process_program_headers (FILE *file
)
2937 Elf_Internal_Phdr
*segment
;
2940 if (elf_header
.e_phnum
== 0)
2943 printf (_("\nThere are no program headers in this file.\n"));
2947 if (do_segments
&& !do_header
)
2949 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
2950 printf (_("Entry point "));
2951 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2952 printf (_("\nThere are %d program headers, starting at offset "),
2953 elf_header
.e_phnum
);
2954 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2958 if (! get_program_headers (file
))
2963 if (elf_header
.e_phnum
> 1)
2964 printf (_("\nProgram Headers:\n"));
2966 printf (_("\nProgram Headers:\n"));
2970 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2973 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2977 (_(" Type Offset VirtAddr PhysAddr\n"));
2979 (_(" FileSiz MemSiz Flags Align\n"));
2986 for (i
= 0, segment
= program_headers
;
2987 i
< elf_header
.e_phnum
;
2992 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
2996 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
2997 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
2998 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
2999 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3000 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3002 (segment
->p_flags
& PF_R
? 'R' : ' '),
3003 (segment
->p_flags
& PF_W
? 'W' : ' '),
3004 (segment
->p_flags
& PF_X
? 'E' : ' '));
3005 printf ("%#lx", (unsigned long) segment
->p_align
);
3009 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3010 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3013 print_vma (segment
->p_offset
, FULL_HEX
);
3017 print_vma (segment
->p_vaddr
, FULL_HEX
);
3019 print_vma (segment
->p_paddr
, FULL_HEX
);
3022 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3023 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3026 print_vma (segment
->p_filesz
, FULL_HEX
);
3030 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3031 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3034 print_vma (segment
->p_offset
, FULL_HEX
);
3038 (segment
->p_flags
& PF_R
? 'R' : ' '),
3039 (segment
->p_flags
& PF_W
? 'W' : ' '),
3040 (segment
->p_flags
& PF_X
? 'E' : ' '));
3042 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3043 printf ("%#lx", (unsigned long) segment
->p_align
);
3046 print_vma (segment
->p_align
, PREFIX_HEX
);
3051 print_vma (segment
->p_offset
, FULL_HEX
);
3053 print_vma (segment
->p_vaddr
, FULL_HEX
);
3055 print_vma (segment
->p_paddr
, FULL_HEX
);
3057 print_vma (segment
->p_filesz
, FULL_HEX
);
3059 print_vma (segment
->p_memsz
, FULL_HEX
);
3061 (segment
->p_flags
& PF_R
? 'R' : ' '),
3062 (segment
->p_flags
& PF_W
? 'W' : ' '),
3063 (segment
->p_flags
& PF_X
? 'E' : ' '));
3064 print_vma (segment
->p_align
, HEX
);
3068 switch (segment
->p_type
)
3072 error (_("more than one dynamic segment\n"));
3074 dynamic_addr
= segment
->p_offset
;
3075 dynamic_size
= segment
->p_filesz
;
3079 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3081 error (_("Unable to find program interpreter name\n"));
3084 program_interpreter
[0] = 0;
3085 fscanf (file
, "%63s", program_interpreter
);
3088 printf (_("\n [Requesting program interpreter: %s]"),
3089 program_interpreter
);
3095 putc ('\n', stdout
);
3098 if (do_segments
&& section_headers
!= NULL
)
3100 printf (_("\n Section to Segment mapping:\n"));
3101 printf (_(" Segment Sections...\n"));
3103 assert (string_table
!= NULL
);
3105 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3108 Elf_Internal_Shdr
*section
;
3110 segment
= program_headers
+ i
;
3111 section
= section_headers
;
3113 printf (" %2.2d ", i
);
3115 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3117 if (section
->sh_size
> 0
3118 /* Compare allocated sections by VMA, unallocated
3119 sections by file offset. */
3120 && (section
->sh_flags
& SHF_ALLOC
3121 ? (section
->sh_addr
>= segment
->p_vaddr
3122 && section
->sh_addr
+ section
->sh_size
3123 <= segment
->p_vaddr
+ segment
->p_memsz
)
3124 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
3125 && (section
->sh_offset
+ section
->sh_size
3126 <= segment
->p_offset
+ segment
->p_filesz
))))
3127 printf ("%s ", SECTION_NAME (section
));
3138 /* Find the file offset corresponding to VMA by using the program headers. */
3141 offset_from_vma (FILE *file
, bfd_vma vma
, bfd_size_type size
)
3143 Elf_Internal_Phdr
*seg
;
3145 if (! get_program_headers (file
))
3147 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3151 for (seg
= program_headers
;
3152 seg
< program_headers
+ elf_header
.e_phnum
;
3155 if (seg
->p_type
!= PT_LOAD
)
3158 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3159 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3160 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3163 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3170 get_32bit_section_headers (FILE *file
, unsigned int num
)
3172 Elf32_External_Shdr
*shdrs
;
3173 Elf_Internal_Shdr
*internal
;
3176 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3177 elf_header
.e_shentsize
* num
, _("section headers"));
3181 section_headers
= malloc (num
* sizeof (Elf_Internal_Shdr
));
3183 if (section_headers
== NULL
)
3185 error (_("Out of memory\n"));
3189 for (i
= 0, internal
= section_headers
;
3193 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3194 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3195 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3196 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3197 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3198 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3199 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3200 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3201 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3202 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3211 get_64bit_section_headers (FILE *file
, unsigned int num
)
3213 Elf64_External_Shdr
*shdrs
;
3214 Elf_Internal_Shdr
*internal
;
3217 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3218 elf_header
.e_shentsize
* num
, _("section headers"));
3222 section_headers
= malloc (num
* sizeof (Elf_Internal_Shdr
));
3224 if (section_headers
== NULL
)
3226 error (_("Out of memory\n"));
3230 for (i
= 0, internal
= section_headers
;
3234 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3235 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3236 internal
->sh_flags
= BYTE_GET8 (shdrs
[i
].sh_flags
);
3237 internal
->sh_addr
= BYTE_GET8 (shdrs
[i
].sh_addr
);
3238 internal
->sh_size
= BYTE_GET8 (shdrs
[i
].sh_size
);
3239 internal
->sh_entsize
= BYTE_GET8 (shdrs
[i
].sh_entsize
);
3240 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3241 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3242 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3243 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3251 static Elf_Internal_Sym
*
3252 get_32bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3254 unsigned long number
;
3255 Elf32_External_Sym
*esyms
;
3256 Elf_External_Sym_Shndx
*shndx
;
3257 Elf_Internal_Sym
*isyms
;
3258 Elf_Internal_Sym
*psym
;
3261 esyms
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
3267 if (symtab_shndx_hdr
!= NULL
3268 && (symtab_shndx_hdr
->sh_link
3269 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3271 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3272 symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3280 number
= section
->sh_size
/ section
->sh_entsize
;
3281 isyms
= malloc (number
* sizeof (Elf_Internal_Sym
));
3285 error (_("Out of memory\n"));
3292 for (j
= 0, psym
= isyms
;
3296 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3297 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3298 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3299 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3300 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3302 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3303 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3304 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3314 static Elf_Internal_Sym
*
3315 get_64bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3317 unsigned long number
;
3318 Elf64_External_Sym
*esyms
;
3319 Elf_External_Sym_Shndx
*shndx
;
3320 Elf_Internal_Sym
*isyms
;
3321 Elf_Internal_Sym
*psym
;
3324 esyms
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
3330 if (symtab_shndx_hdr
!= NULL
3331 && (symtab_shndx_hdr
->sh_link
3332 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3334 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3335 symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3343 number
= section
->sh_size
/ section
->sh_entsize
;
3344 isyms
= malloc (number
* sizeof (Elf_Internal_Sym
));
3348 error (_("Out of memory\n"));
3355 for (j
= 0, psym
= isyms
;
3359 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3360 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3361 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3362 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3363 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3365 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3366 psym
->st_value
= BYTE_GET8 (esyms
[j
].st_value
);
3367 psym
->st_size
= BYTE_GET8 (esyms
[j
].st_size
);
3378 get_elf_section_flags (bfd_vma sh_flags
)
3380 static char buff
[32];
3388 flag
= sh_flags
& - sh_flags
;
3393 case SHF_WRITE
: strcat (buff
, "W"); break;
3394 case SHF_ALLOC
: strcat (buff
, "A"); break;
3395 case SHF_EXECINSTR
: strcat (buff
, "X"); break;
3396 case SHF_MERGE
: strcat (buff
, "M"); break;
3397 case SHF_STRINGS
: strcat (buff
, "S"); break;
3398 case SHF_INFO_LINK
: strcat (buff
, "I"); break;
3399 case SHF_LINK_ORDER
: strcat (buff
, "L"); break;
3400 case SHF_OS_NONCONFORMING
: strcat (buff
, "O"); break;
3401 case SHF_GROUP
: strcat (buff
, "G"); break;
3402 case SHF_TLS
: strcat (buff
, "T"); break;
3405 if (flag
& SHF_MASKOS
)
3408 sh_flags
&= ~ SHF_MASKOS
;
3410 else if (flag
& SHF_MASKPROC
)
3413 sh_flags
&= ~ SHF_MASKPROC
;
3425 process_section_headers (FILE *file
)
3427 Elf_Internal_Shdr
*section
;
3430 section_headers
= NULL
;
3432 if (elf_header
.e_shnum
== 0)
3435 printf (_("\nThere are no sections in this file.\n"));
3440 if (do_sections
&& !do_header
)
3441 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3442 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3446 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3449 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3452 /* Read in the string table, so that we have names to display. */
3453 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3455 if (section
->sh_size
!= 0)
3457 string_table
= get_data (NULL
, file
, section
->sh_offset
,
3458 section
->sh_size
, _("string table"));
3460 if (string_table
== NULL
)
3463 string_table_length
= section
->sh_size
;
3466 /* Scan the sections for the dynamic symbol table
3467 and dynamic string table and debug sections. */
3468 dynamic_symbols
= NULL
;
3469 dynamic_strings
= NULL
;
3470 dynamic_syminfo
= NULL
;
3471 symtab_shndx_hdr
= NULL
;
3473 for (i
= 0, section
= section_headers
;
3474 i
< elf_header
.e_shnum
;
3477 char *name
= SECTION_NAME (section
);
3479 if (section
->sh_type
== SHT_DYNSYM
)
3481 if (dynamic_symbols
!= NULL
)
3483 error (_("File contains multiple dynamic symbol tables\n"));
3487 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3488 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3490 else if (section
->sh_type
== SHT_STRTAB
3491 && strcmp (name
, ".dynstr") == 0)
3493 if (dynamic_strings
!= NULL
)
3495 error (_("File contains multiple dynamic string tables\n"));
3499 dynamic_strings
= get_data (NULL
, file
, section
->sh_offset
,
3500 section
->sh_size
, _("dynamic strings"));
3502 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
3504 if (symtab_shndx_hdr
!= NULL
)
3506 error (_("File contains multiple symtab shndx tables\n"));
3509 symtab_shndx_hdr
= section
;
3511 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
3512 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
3513 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
3515 && strncmp (name
, ".debug_", 7) == 0)
3520 || (do_debug_info
&& (strcmp (name
, "info") == 0))
3521 || (do_debug_abbrevs
&& (strcmp (name
, "abbrev") == 0))
3522 || (do_debug_lines
&& (strcmp (name
, "line") == 0))
3523 || (do_debug_pubnames
&& (strcmp (name
, "pubnames") == 0))
3524 || (do_debug_aranges
&& (strcmp (name
, "aranges") == 0))
3525 || (do_debug_frames
&& (strcmp (name
, "frame") == 0))
3526 || (do_debug_macinfo
&& (strcmp (name
, "macinfo") == 0))
3527 || (do_debug_str
&& (strcmp (name
, "str") == 0))
3528 || (do_debug_loc
&& (strcmp (name
, "loc") == 0))
3530 request_dump (i
, DEBUG_DUMP
);
3532 /* linkonce section to be combined with .debug_info at link time. */
3533 else if ((do_debugging
|| do_debug_info
)
3534 && strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
3535 request_dump (i
, DEBUG_DUMP
);
3536 else if (do_debug_frames
&& strcmp (name
, ".eh_frame") == 0)
3537 request_dump (i
, DEBUG_DUMP
);
3543 if (elf_header
.e_shnum
> 1)
3544 printf (_("\nSection Headers:\n"));
3546 printf (_("\nSection Header:\n"));
3550 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3553 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3556 printf (_(" [Nr] Name Type Address Offset\n"));
3557 printf (_(" Size EntSize Flags Link Info Align\n"));
3560 for (i
= 0, section
= section_headers
;
3561 i
< elf_header
.e_shnum
;
3564 printf (" [%2u] %-17.17s %-15.15s ",
3565 SECTION_HEADER_NUM (i
),
3566 SECTION_NAME (section
),
3567 get_section_type_name (section
->sh_type
));
3571 print_vma (section
->sh_addr
, LONG_HEX
);
3573 printf ( " %6.6lx %6.6lx %2.2lx",
3574 (unsigned long) section
->sh_offset
,
3575 (unsigned long) section
->sh_size
,
3576 (unsigned long) section
->sh_entsize
);
3578 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3580 printf ("%2ld %3lx %2ld\n",
3581 (unsigned long) section
->sh_link
,
3582 (unsigned long) section
->sh_info
,
3583 (unsigned long) section
->sh_addralign
);
3587 print_vma (section
->sh_addr
, LONG_HEX
);
3589 if ((long) section
->sh_offset
== section
->sh_offset
)
3590 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
3594 print_vma (section
->sh_offset
, LONG_HEX
);
3597 if ((unsigned long) section
->sh_size
== section
->sh_size
)
3598 printf (" %6.6lx", (unsigned long) section
->sh_size
);
3602 print_vma (section
->sh_size
, LONG_HEX
);
3605 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
3606 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
3610 print_vma (section
->sh_entsize
, LONG_HEX
);
3613 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3615 printf ("%2ld %3lx ",
3616 (unsigned long) section
->sh_link
,
3617 (unsigned long) section
->sh_info
);
3619 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
3620 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
3623 print_vma (section
->sh_addralign
, DEC
);
3630 print_vma (section
->sh_addr
, LONG_HEX
);
3631 if ((long) section
->sh_offset
== section
->sh_offset
)
3632 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
3636 print_vma (section
->sh_offset
, LONG_HEX
);
3639 print_vma (section
->sh_size
, LONG_HEX
);
3641 print_vma (section
->sh_entsize
, LONG_HEX
);
3643 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3645 printf (" %2ld %3lx %ld\n",
3646 (unsigned long) section
->sh_link
,
3647 (unsigned long) section
->sh_info
,
3648 (unsigned long) section
->sh_addralign
);
3652 printf (_("Key to Flags:\n\
3653 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3654 I (info), L (link order), G (group), x (unknown)\n\
3655 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3666 } dynamic_relocations
[] =
3668 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
3669 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
3670 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
3673 /* Process the reloc section. */
3675 process_relocs (FILE *file
)
3677 unsigned long rel_size
;
3678 unsigned long rel_offset
;
3684 if (do_using_dynamic
)
3688 int has_dynamic_reloc
;
3691 has_dynamic_reloc
= 0;
3693 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
3695 is_rela
= dynamic_relocations
[i
].rela
;
3696 name
= dynamic_relocations
[i
].name
;
3697 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
3698 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
3700 has_dynamic_reloc
|= rel_size
;
3702 if (is_rela
== UNKNOWN
)
3704 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
3705 switch (dynamic_info
[DT_PLTREL
])
3719 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
3720 name
, rel_offset
, rel_size
);
3722 dump_relocations (file
,
3723 offset_from_vma (file
, rel_offset
, rel_size
),
3725 dynamic_symbols
, num_dynamic_syms
,
3726 dynamic_strings
, is_rela
);
3730 if (! has_dynamic_reloc
)
3731 printf (_("\nThere are no dynamic relocations in this file.\n"));
3735 Elf_Internal_Shdr
*section
;
3739 for (i
= 0, section
= section_headers
;
3740 i
< elf_header
.e_shnum
;
3743 if ( section
->sh_type
!= SHT_RELA
3744 && section
->sh_type
!= SHT_REL
)
3747 rel_offset
= section
->sh_offset
;
3748 rel_size
= section
->sh_size
;
3752 Elf_Internal_Shdr
*strsec
;
3753 Elf_Internal_Sym
*symtab
;
3756 unsigned long nsyms
;
3758 printf (_("\nRelocation section "));
3760 if (string_table
== NULL
)
3761 printf ("%d", section
->sh_name
);
3763 printf (_("'%s'"), SECTION_NAME (section
));
3765 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3766 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
3771 if (section
->sh_link
)
3773 Elf_Internal_Shdr
*symsec
;
3775 symsec
= SECTION_HEADER (section
->sh_link
);
3776 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
3777 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
3782 strsec
= SECTION_HEADER (symsec
->sh_link
);
3784 strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
3785 strsec
->sh_size
, _("string table"));
3787 is_rela
= section
->sh_type
== SHT_RELA
;
3789 dump_relocations (file
, rel_offset
, rel_size
,
3790 symtab
, nsyms
, strtab
, is_rela
);
3802 printf (_("\nThere are no relocations in this file.\n"));
3808 #include "unwind-ia64.h"
3810 /* An absolute address consists of a section and an offset. If the
3811 section is NULL, the offset itself is the address, otherwise, the
3812 address equals to LOAD_ADDRESS(section) + offset. */
3816 unsigned short section
;
3822 struct unw_table_entry
3824 struct absaddr start
;
3826 struct absaddr info
;
3828 *table
; /* Unwind table. */
3829 unsigned long table_len
; /* Length of unwind table. */
3830 unsigned char *info
; /* Unwind info. */
3831 unsigned long info_size
; /* Size of unwind info. */
3832 bfd_vma info_addr
; /* starting address of unwind info. */
3833 bfd_vma seg_base
; /* Starting address of segment. */
3834 Elf_Internal_Sym
*symtab
; /* The symbol table. */
3835 unsigned long nsyms
; /* Number of symbols. */
3836 char *strtab
; /* The string table. */
3837 unsigned long strtab_size
; /* Size of string table. */
3841 find_symbol_for_address (struct unw_aux_info
*aux
,
3842 struct absaddr addr
,
3843 const char **symname
,
3846 bfd_vma dist
= 0x100000;
3847 Elf_Internal_Sym
*sym
, *best
= NULL
;
3850 for (i
= 0, sym
= aux
->symtab
; i
< aux
->nsyms
; ++i
, ++sym
)
3852 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
3853 && sym
->st_name
!= 0
3854 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
3855 && addr
.offset
>= sym
->st_value
3856 && addr
.offset
- sym
->st_value
< dist
)
3859 dist
= addr
.offset
- sym
->st_value
;
3866 *symname
= (best
->st_name
>= aux
->strtab_size
3867 ? "<corrupt>" : aux
->strtab
+ best
->st_name
);
3872 *offset
= addr
.offset
;
3876 dump_ia64_unwind (struct unw_aux_info
*aux
)
3879 struct unw_table_entry
*tp
;
3882 addr_size
= is_32bit_elf
? 4 : 8;
3884 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
3888 const unsigned char *dp
;
3889 const unsigned char *head
;
3890 const char *procname
;
3892 find_symbol_for_address (aux
, tp
->start
, &procname
, &offset
);
3894 fputs ("\n<", stdout
);
3898 fputs (procname
, stdout
);
3901 printf ("+%lx", (unsigned long) offset
);
3904 fputs (">: [", stdout
);
3905 print_vma (tp
->start
.offset
, PREFIX_HEX
);
3906 fputc ('-', stdout
);
3907 print_vma (tp
->end
.offset
, PREFIX_HEX
);
3908 printf ("], info at +0x%lx\n",
3909 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
3911 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
3912 stamp
= BYTE_GET8 ((unsigned char *) head
);
3914 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
3915 (unsigned) UNW_VER (stamp
),
3916 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
3917 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
3918 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
3919 (unsigned long) (addr_size
* UNW_LENGTH (stamp
)));
3921 if (UNW_VER (stamp
) != 1)
3923 printf ("\tUnknown version.\n");
3928 for (dp
= head
+ 8; dp
< head
+ 8 + addr_size
* UNW_LENGTH (stamp
);)
3929 dp
= unw_decode (dp
, in_body
, & in_body
);
3934 slurp_ia64_unwind_table (FILE *file
,
3935 struct unw_aux_info
*aux
,
3936 Elf_Internal_Shdr
*sec
)
3938 unsigned long size
, addr_size
, nrelas
, i
;
3939 Elf_Internal_Phdr
*seg
;
3940 struct unw_table_entry
*tep
;
3941 Elf_Internal_Shdr
*relsec
;
3942 Elf_Internal_Rela
*rela
, *rp
;
3943 unsigned char *table
, *tp
;
3944 Elf_Internal_Sym
*sym
;
3945 const char *relname
;
3947 addr_size
= is_32bit_elf
? 4 : 8;
3949 /* First, find the starting address of the segment that includes
3952 if (elf_header
.e_phnum
)
3954 if (! get_program_headers (file
))
3957 for (seg
= program_headers
;
3958 seg
< program_headers
+ elf_header
.e_phnum
;
3961 if (seg
->p_type
!= PT_LOAD
)
3964 if (sec
->sh_addr
>= seg
->p_vaddr
3965 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
3967 aux
->seg_base
= seg
->p_vaddr
;
3973 /* Second, build the unwind table from the contents of the unwind section: */
3974 size
= sec
->sh_size
;
3975 table
= get_data (NULL
, file
, sec
->sh_offset
, size
, _("unwind table"));
3979 tep
= aux
->table
= xmalloc (size
/ (3 * addr_size
) * sizeof (aux
->table
[0]));
3980 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * addr_size
, ++tep
)
3982 tep
->start
.section
= SHN_UNDEF
;
3983 tep
->end
.section
= SHN_UNDEF
;
3984 tep
->info
.section
= SHN_UNDEF
;
3987 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
3988 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
3989 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
3993 tep
->start
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 0);
3994 tep
->end
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 8);
3995 tep
->info
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 16);
3997 tep
->start
.offset
+= aux
->seg_base
;
3998 tep
->end
.offset
+= aux
->seg_base
;
3999 tep
->info
.offset
+= aux
->seg_base
;
4003 /* Third, apply any relocations to the unwind table: */
4005 for (relsec
= section_headers
;
4006 relsec
< section_headers
+ elf_header
.e_shnum
;
4009 if (relsec
->sh_type
!= SHT_RELA
4010 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4013 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
4017 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
4021 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
4022 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
4024 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
4026 warn (_("Skipping unexpected symbol type %u\n"),
4027 ELF32_ST_TYPE (sym
->st_info
));
4033 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
4034 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
4036 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
4038 warn (_("Skipping unexpected symbol type %u\n"),
4039 ELF64_ST_TYPE (sym
->st_info
));
4044 if (strncmp (relname
, "R_IA64_SEGREL", 13) != 0)
4046 warn (_("Skipping unexpected relocation type %s\n"), relname
);
4050 i
= rp
->r_offset
/ (3 * addr_size
);
4052 switch (rp
->r_offset
/addr_size
% 3)
4055 aux
->table
[i
].start
.section
= sym
->st_shndx
;
4056 aux
->table
[i
].start
.offset
+= rp
->r_addend
;
4059 aux
->table
[i
].end
.section
= sym
->st_shndx
;
4060 aux
->table
[i
].end
.offset
+= rp
->r_addend
;
4063 aux
->table
[i
].info
.section
= sym
->st_shndx
;
4064 aux
->table
[i
].info
.offset
+= rp
->r_addend
;
4074 aux
->table_len
= size
/ (3 * addr_size
);
4079 process_unwind (FILE *file
)
4081 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
4082 unsigned long i
, addr_size
, unwcount
= 0, unwstart
= 0;
4083 struct unw_aux_info aux
;
4088 if (elf_header
.e_machine
!= EM_IA_64
)
4090 printf (_("\nThere are no unwind sections in this file.\n"));
4094 memset (& aux
, 0, sizeof (aux
));
4096 addr_size
= is_32bit_elf
? 4 : 8;
4098 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
4100 if (sec
->sh_type
== SHT_SYMTAB
)
4102 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
4103 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
4105 strsec
= SECTION_HEADER (sec
->sh_link
);
4106 aux
.strtab_size
= strsec
->sh_size
;
4107 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4108 aux
.strtab_size
, _("string table"));
4110 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4115 printf (_("\nThere are no unwind sections in this file.\n"));
4117 while (unwcount
-- > 0)
4122 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
4123 i
< elf_header
.e_shnum
; ++i
, ++sec
)
4124 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4131 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
4133 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
,
4136 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
4137 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
4138 suffix
= SECTION_NAME (unwsec
) + len
;
4139 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4141 if (strncmp (SECTION_NAME (sec
),
4142 ELF_STRING_ia64_unwind_info_once
, len2
) == 0
4143 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
4148 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4149 .IA_64.unwind or BAR -> .IA_64.unwind_info */
4150 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
4151 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
4153 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
,
4155 suffix
= SECTION_NAME (unwsec
) + len
;
4156 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4158 if (strncmp (SECTION_NAME (sec
),
4159 ELF_STRING_ia64_unwind_info
, len2
) == 0
4160 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
4164 if (i
== elf_header
.e_shnum
)
4166 printf (_("\nCould not find unwind info section for "));
4168 if (string_table
== NULL
)
4169 printf ("%d", unwsec
->sh_name
);
4171 printf (_("'%s'"), SECTION_NAME (unwsec
));
4175 aux
.info_size
= sec
->sh_size
;
4176 aux
.info_addr
= sec
->sh_addr
;
4177 aux
.info
= get_data (NULL
, file
, sec
->sh_offset
, aux
.info_size
,
4180 printf (_("\nUnwind section "));
4182 if (string_table
== NULL
)
4183 printf ("%d", unwsec
->sh_name
);
4185 printf (_("'%s'"), SECTION_NAME (unwsec
));
4187 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4188 (unsigned long) unwsec
->sh_offset
,
4189 (unsigned long) (unwsec
->sh_size
/ (3 * addr_size
)));
4191 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
4193 if (aux
.table_len
> 0)
4194 dump_ia64_unwind (& aux
);
4197 free ((char *) aux
.table
);
4199 free ((char *) aux
.info
);
4208 free ((char *) aux
.strtab
);
4214 dynamic_segment_mips_val (Elf_Internal_Dyn
*entry
)
4216 switch (entry
->d_tag
)
4219 if (entry
->d_un
.d_val
== 0)
4223 static const char * opts
[] =
4225 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
4226 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
4227 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
4228 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
4233 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++cnt
)
4234 if (entry
->d_un
.d_val
& (1 << cnt
))
4236 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
4243 case DT_MIPS_IVERSION
:
4244 if (dynamic_strings
!= NULL
)
4245 printf ("Interface Version: %s\n",
4246 dynamic_strings
+ entry
->d_un
.d_val
);
4248 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4251 case DT_MIPS_TIME_STAMP
:
4256 time_t time
= entry
->d_un
.d_val
;
4257 tmp
= gmtime (&time
);
4258 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
4259 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
4260 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
4261 printf ("Time Stamp: %s\n", timebuf
);
4265 case DT_MIPS_RLD_VERSION
:
4266 case DT_MIPS_LOCAL_GOTNO
:
4267 case DT_MIPS_CONFLICTNO
:
4268 case DT_MIPS_LIBLISTNO
:
4269 case DT_MIPS_SYMTABNO
:
4270 case DT_MIPS_UNREFEXTNO
:
4271 case DT_MIPS_HIPAGENO
:
4272 case DT_MIPS_DELTA_CLASS_NO
:
4273 case DT_MIPS_DELTA_INSTANCE_NO
:
4274 case DT_MIPS_DELTA_RELOC_NO
:
4275 case DT_MIPS_DELTA_SYM_NO
:
4276 case DT_MIPS_DELTA_CLASSSYM_NO
:
4277 case DT_MIPS_COMPACT_SIZE
:
4278 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4282 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
4288 dynamic_segment_parisc_val (Elf_Internal_Dyn
*entry
)
4290 switch (entry
->d_tag
)
4292 case DT_HP_DLD_FLAGS
:
4301 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
4302 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
4303 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
4304 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
4305 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
4306 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
4307 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
4308 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
4309 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
4310 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
4311 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
4315 bfd_vma val
= entry
->d_un
.d_val
;
4317 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
4318 if (val
& flags
[cnt
].bit
)
4322 fputs (flags
[cnt
].str
, stdout
);
4324 val
^= flags
[cnt
].bit
;
4327 if (val
!= 0 || first
)
4331 print_vma (val
, HEX
);
4337 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4344 dynamic_segment_ia64_val (Elf_Internal_Dyn
*entry
)
4346 switch (entry
->d_tag
)
4348 case DT_IA_64_PLT_RESERVE
:
4349 /* First 3 slots reserved. */
4350 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4352 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
4356 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4363 get_32bit_dynamic_segment (FILE *file
)
4365 Elf32_External_Dyn
*edyn
;
4366 Elf_Internal_Dyn
*entry
;
4369 edyn
= get_data (NULL
, file
, dynamic_addr
, dynamic_size
,
4370 _("dynamic segment"));
4374 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4375 how large this .dynamic is now. We can do this even before the byte
4376 swapping since the DT_NULL tag is recognizable. */
4378 while (*(Elf32_Word
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
4381 dynamic_segment
= malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
4383 if (dynamic_segment
== NULL
)
4385 error (_("Out of memory\n"));
4390 for (i
= 0, entry
= dynamic_segment
;
4394 entry
->d_tag
= BYTE_GET (edyn
[i
].d_tag
);
4395 entry
->d_un
.d_val
= BYTE_GET (edyn
[i
].d_un
.d_val
);
4404 get_64bit_dynamic_segment (FILE *file
)
4406 Elf64_External_Dyn
*edyn
;
4407 Elf_Internal_Dyn
*entry
;
4410 edyn
= get_data (NULL
, file
, dynamic_addr
, dynamic_size
,
4411 _("dynamic segment"));
4415 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4416 how large this .dynamic is now. We can do this even before the byte
4417 swapping since the DT_NULL tag is recognizable. */
4419 while (*(bfd_vma
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
4422 dynamic_segment
= malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
4424 if (dynamic_segment
== NULL
)
4426 error (_("Out of memory\n"));
4431 for (i
= 0, entry
= dynamic_segment
;
4435 entry
->d_tag
= BYTE_GET8 (edyn
[i
].d_tag
);
4436 entry
->d_un
.d_val
= BYTE_GET8 (edyn
[i
].d_un
.d_val
);
4445 get_dynamic_flags (bfd_vma flags
)
4447 static char buff
[128];
4455 flag
= flags
& - flags
;
4463 case DF_ORIGIN
: strcpy (p
, "ORIGIN"); break;
4464 case DF_SYMBOLIC
: strcpy (p
, "SYMBOLIC"); break;
4465 case DF_TEXTREL
: strcpy (p
, "TEXTREL"); break;
4466 case DF_BIND_NOW
: strcpy (p
, "BIND_NOW"); break;
4467 case DF_STATIC_TLS
: strcpy (p
, "STATIC_TLS"); break;
4468 default: strcpy (p
, "unknown"); break;
4471 p
= strchr (p
, '\0');
4476 /* Parse and display the contents of the dynamic segment. */
4478 process_dynamic_segment (FILE *file
)
4480 Elf_Internal_Dyn
*entry
;
4483 if (dynamic_size
== 0)
4486 printf (_("\nThere is no dynamic segment in this file.\n"));
4493 if (! get_32bit_dynamic_segment (file
))
4496 else if (! get_64bit_dynamic_segment (file
))
4499 /* Find the appropriate symbol table. */
4500 if (dynamic_symbols
== NULL
)
4502 for (i
= 0, entry
= dynamic_segment
;
4506 Elf_Internal_Shdr section
;
4508 if (entry
->d_tag
!= DT_SYMTAB
)
4511 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
4513 /* Since we do not know how big the symbol table is,
4514 we default to reading in the entire file (!) and
4515 processing that. This is overkill, I know, but it
4517 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
4519 if (archive_file_offset
!= 0)
4520 section
.sh_size
= archive_file_size
- section
.sh_offset
;
4523 if (fseek (file
, 0, SEEK_END
))
4524 error (_("Unable to seek to end of file!"));
4526 section
.sh_size
= ftell (file
) - section
.sh_offset
;
4530 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
4532 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
4534 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
4535 if (num_dynamic_syms
< 1)
4537 error (_("Unable to determine the number of symbols to load\n"));
4541 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
4545 /* Similarly find a string table. */
4546 if (dynamic_strings
== NULL
)
4548 for (i
= 0, entry
= dynamic_segment
;
4552 unsigned long offset
;
4555 if (entry
->d_tag
!= DT_STRTAB
)
4558 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
4560 /* Since we do not know how big the string table is,
4561 we default to reading in the entire file (!) and
4562 processing that. This is overkill, I know, but it
4565 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
4567 if (archive_file_offset
!= 0)
4568 str_tab_len
= archive_file_size
- offset
;
4571 if (fseek (file
, 0, SEEK_END
))
4572 error (_("Unable to seek to end of file\n"));
4573 str_tab_len
= ftell (file
) - offset
;
4576 if (str_tab_len
< 1)
4579 (_("Unable to determine the length of the dynamic string table\n"));
4583 dynamic_strings
= get_data (NULL
, file
, offset
, str_tab_len
,
4584 _("dynamic string table"));
4589 /* And find the syminfo section if available. */
4590 if (dynamic_syminfo
== NULL
)
4592 unsigned long syminsz
= 0;
4594 for (i
= 0, entry
= dynamic_segment
;
4598 if (entry
->d_tag
== DT_SYMINENT
)
4600 /* Note: these braces are necessary to avoid a syntax
4601 error from the SunOS4 C compiler. */
4602 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
4604 else if (entry
->d_tag
== DT_SYMINSZ
)
4605 syminsz
= entry
->d_un
.d_val
;
4606 else if (entry
->d_tag
== DT_SYMINFO
)
4607 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
4611 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
4613 Elf_External_Syminfo
*extsyminfo
;
4614 Elf_Internal_Syminfo
*syminfo
;
4616 /* There is a syminfo section. Read the data. */
4617 extsyminfo
= get_data (NULL
, file
, dynamic_syminfo_offset
, syminsz
,
4618 _("symbol information"));
4622 dynamic_syminfo
= malloc (syminsz
);
4623 if (dynamic_syminfo
== NULL
)
4625 error (_("Out of memory\n"));
4629 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
4630 for (i
= 0, syminfo
= dynamic_syminfo
; i
< dynamic_syminfo_nent
;
4633 syminfo
->si_boundto
= BYTE_GET (extsyminfo
[i
].si_boundto
);
4634 syminfo
->si_flags
= BYTE_GET (extsyminfo
[i
].si_flags
);
4641 if (do_dynamic
&& dynamic_addr
)
4642 printf (_("\nDynamic segment at offset 0x%lx contains %ld entries:\n"),
4643 dynamic_addr
, (long) dynamic_size
);
4645 printf (_(" Tag Type Name/Value\n"));
4647 for (i
= 0, entry
= dynamic_segment
;
4656 print_vma (entry
->d_tag
, FULL_HEX
);
4657 dtype
= get_dynamic_type (entry
->d_tag
);
4658 printf (" (%s)%*s", dtype
,
4659 ((is_32bit_elf
? 27 : 19)
4660 - (int) strlen (dtype
)),
4664 switch (entry
->d_tag
)
4668 puts (get_dynamic_flags (entry
->d_un
.d_val
));
4678 switch (entry
->d_tag
)
4681 printf (_("Auxiliary library"));
4685 printf (_("Filter library"));
4689 printf (_("Configuration file"));
4693 printf (_("Dependency audit library"));
4697 printf (_("Audit library"));
4701 if (dynamic_strings
)
4702 printf (": [%s]\n", dynamic_strings
+ entry
->d_un
.d_val
);
4706 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4715 printf (_("Flags:"));
4717 if (entry
->d_un
.d_val
== 0)
4718 printf (_(" None\n"));
4721 unsigned long int val
= entry
->d_un
.d_val
;
4723 if (val
& DTF_1_PARINIT
)
4725 printf (" PARINIT");
4726 val
^= DTF_1_PARINIT
;
4728 if (val
& DTF_1_CONFEXP
)
4730 printf (" CONFEXP");
4731 val
^= DTF_1_CONFEXP
;
4734 printf (" %lx", val
);
4743 printf (_("Flags:"));
4745 if (entry
->d_un
.d_val
== 0)
4746 printf (_(" None\n"));
4749 unsigned long int val
= entry
->d_un
.d_val
;
4751 if (val
& DF_P1_LAZYLOAD
)
4753 printf (" LAZYLOAD");
4754 val
^= DF_P1_LAZYLOAD
;
4756 if (val
& DF_P1_GROUPPERM
)
4758 printf (" GROUPPERM");
4759 val
^= DF_P1_GROUPPERM
;
4762 printf (" %lx", val
);
4771 printf (_("Flags:"));
4772 if (entry
->d_un
.d_val
== 0)
4773 printf (_(" None\n"));
4776 unsigned long int val
= entry
->d_un
.d_val
;
4783 if (val
& DF_1_GLOBAL
)
4788 if (val
& DF_1_GROUP
)
4793 if (val
& DF_1_NODELETE
)
4795 printf (" NODELETE");
4796 val
^= DF_1_NODELETE
;
4798 if (val
& DF_1_LOADFLTR
)
4800 printf (" LOADFLTR");
4801 val
^= DF_1_LOADFLTR
;
4803 if (val
& DF_1_INITFIRST
)
4805 printf (" INITFIRST");
4806 val
^= DF_1_INITFIRST
;
4808 if (val
& DF_1_NOOPEN
)
4813 if (val
& DF_1_ORIGIN
)
4818 if (val
& DF_1_DIRECT
)
4823 if (val
& DF_1_TRANS
)
4828 if (val
& DF_1_INTERPOSE
)
4830 printf (" INTERPOSE");
4831 val
^= DF_1_INTERPOSE
;
4833 if (val
& DF_1_NODEFLIB
)
4835 printf (" NODEFLIB");
4836 val
^= DF_1_NODEFLIB
;
4838 if (val
& DF_1_NODUMP
)
4843 if (val
& DF_1_CONLFAT
)
4845 printf (" CONLFAT");
4846 val
^= DF_1_CONLFAT
;
4849 printf (" %lx", val
);
4856 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
4858 puts (get_dynamic_type (entry
->d_un
.d_val
));
4878 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
4884 if (dynamic_strings
== NULL
)
4887 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4891 switch (entry
->d_tag
)
4894 printf (_("Shared library: [%s]"), name
);
4896 if (strcmp (name
, program_interpreter
) == 0)
4897 printf (_(" program interpreter"));
4901 printf (_("Library soname: [%s]"), name
);
4905 printf (_("Library rpath: [%s]"), name
);
4909 printf (_("Library runpath: [%s]"), name
);
4913 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4918 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4931 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
4935 case DT_INIT_ARRAYSZ
:
4936 case DT_FINI_ARRAYSZ
:
4937 case DT_GNU_CONFLICTSZ
:
4938 case DT_GNU_LIBLISTSZ
:
4941 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
4942 printf (" (bytes)\n");
4952 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
4965 if (dynamic_strings
!= NULL
&& entry
->d_tag
== DT_USED
)
4969 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4973 printf (_("Not needed object: [%s]\n"), name
);
4978 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4984 /* The value of this entry is ignored. */
4989 case DT_GNU_PRELINKED
:
4993 time_t time
= entry
->d_un
.d_val
;
4995 tmp
= gmtime (&time
);
4996 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
4997 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
4998 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5004 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
5005 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
5010 switch (elf_header
.e_machine
)
5013 case EM_MIPS_RS3_LE
:
5014 dynamic_segment_mips_val (entry
);
5017 dynamic_segment_parisc_val (entry
);
5020 dynamic_segment_ia64_val (entry
);
5023 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5035 get_ver_flags (unsigned int flags
)
5037 static char buff
[32];
5044 if (flags
& VER_FLG_BASE
)
5045 strcat (buff
, "BASE ");
5047 if (flags
& VER_FLG_WEAK
)
5049 if (flags
& VER_FLG_BASE
)
5050 strcat (buff
, "| ");
5052 strcat (buff
, "WEAK ");
5055 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
5056 strcat (buff
, "| <unknown>");
5061 /* Display the contents of the version sections. */
5063 process_version_sections (FILE *file
)
5065 Elf_Internal_Shdr
*section
;
5072 for (i
= 0, section
= section_headers
;
5073 i
< elf_header
.e_shnum
;
5076 switch (section
->sh_type
)
5078 case SHT_GNU_verdef
:
5080 Elf_External_Verdef
*edefs
;
5087 (_("\nVersion definition section '%s' contains %ld entries:\n"),
5088 SECTION_NAME (section
), section
->sh_info
);
5090 printf (_(" Addr: 0x"));
5091 printf_vma (section
->sh_addr
);
5092 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5093 (unsigned long) section
->sh_offset
, section
->sh_link
,
5094 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5096 edefs
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
5097 _("version definition section"));
5101 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5104 Elf_External_Verdef
*edef
;
5105 Elf_Internal_Verdef ent
;
5106 Elf_External_Verdaux
*eaux
;
5107 Elf_Internal_Verdaux aux
;
5111 vstart
= ((char *) edefs
) + idx
;
5113 edef
= (Elf_External_Verdef
*) vstart
;
5115 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
5116 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
5117 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
5118 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
5119 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
5120 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
5121 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
5123 printf (_(" %#06x: Rev: %d Flags: %s"),
5124 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
5126 printf (_(" Index: %d Cnt: %d "),
5127 ent
.vd_ndx
, ent
.vd_cnt
);
5129 vstart
+= ent
.vd_aux
;
5131 eaux
= (Elf_External_Verdaux
*) vstart
;
5133 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5134 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
5136 if (dynamic_strings
)
5137 printf (_("Name: %s\n"), dynamic_strings
+ aux
.vda_name
);
5139 printf (_("Name index: %ld\n"), aux
.vda_name
);
5141 isum
= idx
+ ent
.vd_aux
;
5143 for (j
= 1; j
< ent
.vd_cnt
; j
++)
5145 isum
+= aux
.vda_next
;
5146 vstart
+= aux
.vda_next
;
5148 eaux
= (Elf_External_Verdaux
*) vstart
;
5150 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5151 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
5153 if (dynamic_strings
)
5154 printf (_(" %#06x: Parent %d: %s\n"),
5155 isum
, j
, dynamic_strings
+ aux
.vda_name
);
5157 printf (_(" %#06x: Parent %d, name index: %ld\n"),
5158 isum
, j
, aux
.vda_name
);
5168 case SHT_GNU_verneed
:
5170 Elf_External_Verneed
*eneed
;
5176 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
5177 SECTION_NAME (section
), section
->sh_info
);
5179 printf (_(" Addr: 0x"));
5180 printf_vma (section
->sh_addr
);
5181 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
5182 (unsigned long) section
->sh_offset
, section
->sh_link
,
5183 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5185 eneed
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
5186 _("version need section"));
5190 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5192 Elf_External_Verneed
*entry
;
5193 Elf_Internal_Verneed ent
;
5198 vstart
= ((char *) eneed
) + idx
;
5200 entry
= (Elf_External_Verneed
*) vstart
;
5202 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
5203 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
5204 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
5205 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
5206 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
5208 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
5210 if (dynamic_strings
)
5211 printf (_(" File: %s"), dynamic_strings
+ ent
.vn_file
);
5213 printf (_(" File: %lx"), ent
.vn_file
);
5215 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
5217 vstart
+= ent
.vn_aux
;
5219 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
5221 Elf_External_Vernaux
*eaux
;
5222 Elf_Internal_Vernaux aux
;
5224 eaux
= (Elf_External_Vernaux
*) vstart
;
5226 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
5227 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
5228 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
5229 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
5230 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
5232 if (dynamic_strings
)
5233 printf (_(" %#06x: Name: %s"),
5234 isum
, dynamic_strings
+ aux
.vna_name
);
5236 printf (_(" %#06x: Name index: %lx"),
5237 isum
, aux
.vna_name
);
5239 printf (_(" Flags: %s Version: %d\n"),
5240 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
5242 isum
+= aux
.vna_next
;
5243 vstart
+= aux
.vna_next
;
5253 case SHT_GNU_versym
:
5255 Elf_Internal_Shdr
*link_section
;
5258 unsigned char *edata
;
5259 unsigned short *data
;
5261 Elf_Internal_Sym
*symbols
;
5262 Elf_Internal_Shdr
*string_sec
;
5265 link_section
= SECTION_HEADER (section
->sh_link
);
5266 total
= section
->sh_size
/ section
->sh_entsize
;
5270 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
5272 string_sec
= SECTION_HEADER (link_section
->sh_link
);
5274 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
5275 string_sec
->sh_size
, _("version string table"));
5279 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
5280 SECTION_NAME (section
), total
);
5282 printf (_(" Addr: "));
5283 printf_vma (section
->sh_addr
);
5284 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5285 (unsigned long) section
->sh_offset
, section
->sh_link
,
5286 SECTION_NAME (link_section
));
5288 off
= offset_from_vma (file
,
5289 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
5290 total
* sizeof (short));
5291 edata
= get_data (NULL
, file
, off
, total
* sizeof (short),
5292 _("version symbol data"));
5299 data
= malloc (total
* sizeof (short));
5301 for (cnt
= total
; cnt
--;)
5302 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
5307 for (cnt
= 0; cnt
< total
; cnt
+= 4)
5310 int check_def
, check_need
;
5313 printf (" %03x:", cnt
);
5315 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
5316 switch (data
[cnt
+ j
])
5319 fputs (_(" 0 (*local*) "), stdout
);
5323 fputs (_(" 1 (*global*) "), stdout
);
5327 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
5328 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
5332 if (SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
5335 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
5342 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
5344 Elf_Internal_Verneed ivn
;
5345 unsigned long offset
;
5347 offset
= offset_from_vma
5348 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
5349 sizeof (Elf_External_Verneed
));
5353 Elf_Internal_Vernaux ivna
;
5354 Elf_External_Verneed evn
;
5355 Elf_External_Vernaux evna
;
5356 unsigned long a_off
;
5358 get_data (&evn
, file
, offset
, sizeof (evn
),
5361 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5362 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5364 a_off
= offset
+ ivn
.vn_aux
;
5368 get_data (&evna
, file
, a_off
, sizeof (evna
),
5369 _("version need aux (2)"));
5371 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5372 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5374 a_off
+= ivna
.vna_next
;
5376 while (ivna
.vna_other
!= data
[cnt
+ j
]
5377 && ivna
.vna_next
!= 0);
5379 if (ivna
.vna_other
== data
[cnt
+ j
])
5381 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5383 name
= strtab
+ ivna
.vna_name
;
5384 nn
+= printf ("(%s%-*s",
5386 12 - (int) strlen (name
),
5392 offset
+= ivn
.vn_next
;
5394 while (ivn
.vn_next
);
5397 if (check_def
&& data
[cnt
+ j
] != 0x8001
5398 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5400 Elf_Internal_Verdef ivd
;
5401 Elf_External_Verdef evd
;
5402 unsigned long offset
;
5404 offset
= offset_from_vma
5405 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
5410 get_data (&evd
, file
, offset
, sizeof (evd
),
5413 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5414 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5416 offset
+= ivd
.vd_next
;
5418 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
5419 && ivd
.vd_next
!= 0);
5421 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
5423 Elf_External_Verdaux evda
;
5424 Elf_Internal_Verdaux ivda
;
5426 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5428 get_data (&evda
, file
,
5429 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
5430 sizeof (evda
), _("version def aux"));
5432 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5434 name
= strtab
+ ivda
.vda_name
;
5435 nn
+= printf ("(%s%-*s",
5437 12 - (int) strlen (name
),
5443 printf ("%*c", 18 - nn
, ' ');
5461 printf (_("\nNo version information found in this file.\n"));
5467 get_symbol_binding (unsigned int binding
)
5469 static char buff
[32];
5473 case STB_LOCAL
: return "LOCAL";
5474 case STB_GLOBAL
: return "GLOBAL";
5475 case STB_WEAK
: return "WEAK";
5477 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
5478 sprintf (buff
, _("<processor specific>: %d"), binding
);
5479 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
5480 sprintf (buff
, _("<OS specific>: %d"), binding
);
5482 sprintf (buff
, _("<unknown>: %d"), binding
);
5488 get_symbol_type (unsigned int type
)
5490 static char buff
[32];
5494 case STT_NOTYPE
: return "NOTYPE";
5495 case STT_OBJECT
: return "OBJECT";
5496 case STT_FUNC
: return "FUNC";
5497 case STT_SECTION
: return "SECTION";
5498 case STT_FILE
: return "FILE";
5499 case STT_COMMON
: return "COMMON";
5500 case STT_TLS
: return "TLS";
5502 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
5504 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
5505 return "THUMB_FUNC";
5507 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
5510 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
5511 return "PARISC_MILLI";
5513 sprintf (buff
, _("<processor specific>: %d"), type
);
5515 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
5517 if (elf_header
.e_machine
== EM_PARISC
)
5519 if (type
== STT_HP_OPAQUE
)
5521 if (type
== STT_HP_STUB
)
5525 sprintf (buff
, _("<OS specific>: %d"), type
);
5528 sprintf (buff
, _("<unknown>: %d"), type
);
5534 get_symbol_visibility (unsigned int visibility
)
5538 case STV_DEFAULT
: return "DEFAULT";
5539 case STV_INTERNAL
: return "INTERNAL";
5540 case STV_HIDDEN
: return "HIDDEN";
5541 case STV_PROTECTED
: return "PROTECTED";
5547 get_symbol_index_type (unsigned int type
)
5549 static char buff
[32];
5553 case SHN_UNDEF
: return "UND";
5554 case SHN_ABS
: return "ABS";
5555 case SHN_COMMON
: return "COM";
5557 if (type
== SHN_IA_64_ANSI_COMMON
5558 && elf_header
.e_machine
== EM_IA_64
5559 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
5561 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
5562 sprintf (buff
, "PRC[0x%04x]", type
);
5563 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
5564 sprintf (buff
, "OS [0x%04x]", type
);
5565 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
5566 sprintf (buff
, "RSV[0x%04x]", type
);
5568 sprintf (buff
, "%3d", type
);
5576 get_dynamic_data (FILE *file
, unsigned int number
)
5578 unsigned char *e_data
;
5581 e_data
= malloc (number
* 4);
5585 error (_("Out of memory\n"));
5589 if (fread (e_data
, 4, number
, file
) != number
)
5591 error (_("Unable to read in dynamic data\n"));
5595 i_data
= malloc (number
* sizeof (*i_data
));
5599 error (_("Out of memory\n"));
5605 i_data
[number
] = byte_get (e_data
+ number
* 4, 4);
5612 /* Dump the symbol table. */
5614 process_symbol_table (FILE *file
)
5616 Elf_Internal_Shdr
*section
;
5617 unsigned char nb
[4];
5618 unsigned char nc
[4];
5621 int *buckets
= NULL
;
5624 if (! do_syms
&& !do_histogram
)
5627 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
5631 (archive_file_offset
5632 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
5633 sizeof nb
+ sizeof nc
)),
5636 error (_("Unable to seek to start of dynamic information"));
5640 if (fread (nb
, sizeof (nb
), 1, file
) != 1)
5642 error (_("Failed to read in number of buckets\n"));
5646 if (fread (nc
, sizeof (nc
), 1, file
) != 1)
5648 error (_("Failed to read in number of chains\n"));
5652 nbuckets
= byte_get (nb
, 4);
5653 nchains
= byte_get (nc
, 4);
5655 buckets
= get_dynamic_data (file
, nbuckets
);
5656 chains
= get_dynamic_data (file
, nchains
);
5658 if (buckets
== NULL
|| chains
== NULL
)
5663 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
5668 printf (_("\nSymbol table for image:\n"));
5670 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5672 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5674 for (hn
= 0; hn
< nbuckets
; hn
++)
5679 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
5681 Elf_Internal_Sym
*psym
;
5683 psym
= dynamic_symbols
+ si
;
5685 printf (" %3d %3d: ", si
, hn
);
5686 print_vma (psym
->st_value
, LONG_HEX
);
5688 print_vma (psym
->st_size
, DEC_5
);
5690 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5691 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5692 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5693 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
5694 print_symbol (25, dynamic_strings
+ psym
->st_name
);
5699 else if (do_syms
&& !do_using_dynamic
)
5703 for (i
= 0, section
= section_headers
;
5704 i
< elf_header
.e_shnum
;
5709 Elf_Internal_Sym
*symtab
;
5710 Elf_Internal_Sym
*psym
;
5713 if ( section
->sh_type
!= SHT_SYMTAB
5714 && section
->sh_type
!= SHT_DYNSYM
)
5717 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5718 SECTION_NAME (section
),
5719 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
5721 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5723 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5725 symtab
= GET_ELF_SYMBOLS (file
, section
);
5729 if (section
->sh_link
== elf_header
.e_shstrndx
)
5730 strtab
= string_table
;
5733 Elf_Internal_Shdr
*string_sec
;
5735 string_sec
= SECTION_HEADER (section
->sh_link
);
5737 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
5738 string_sec
->sh_size
, _("string table"));
5741 for (si
= 0, psym
= symtab
;
5742 si
< section
->sh_size
/ section
->sh_entsize
;
5745 printf ("%6d: ", si
);
5746 print_vma (psym
->st_value
, LONG_HEX
);
5748 print_vma (psym
->st_size
, DEC_5
);
5749 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5750 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5751 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5752 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
5753 print_symbol (25, strtab
+ psym
->st_name
);
5755 if (section
->sh_type
== SHT_DYNSYM
&&
5756 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
5758 unsigned char data
[2];
5759 unsigned short vers_data
;
5760 unsigned long offset
;
5764 offset
= offset_from_vma
5765 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
5766 sizeof data
+ si
* sizeof (vers_data
));
5768 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
5769 sizeof (data
), _("version data"));
5771 vers_data
= byte_get (data
, 2);
5773 is_nobits
= (SECTION_HEADER (psym
->st_shndx
)->sh_type
5776 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
5778 if ((vers_data
& 0x8000) || vers_data
> 1)
5780 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
5781 && (is_nobits
|| ! check_def
))
5783 Elf_External_Verneed evn
;
5784 Elf_Internal_Verneed ivn
;
5785 Elf_Internal_Vernaux ivna
;
5787 /* We must test both. */
5788 offset
= offset_from_vma
5789 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
5794 unsigned long vna_off
;
5796 get_data (&evn
, file
, offset
, sizeof (evn
),
5799 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5800 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5802 vna_off
= offset
+ ivn
.vn_aux
;
5806 Elf_External_Vernaux evna
;
5808 get_data (&evna
, file
, vna_off
,
5810 _("version need aux (3)"));
5812 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5813 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5814 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5816 vna_off
+= ivna
.vna_next
;
5818 while (ivna
.vna_other
!= vers_data
5819 && ivna
.vna_next
!= 0);
5821 if (ivna
.vna_other
== vers_data
)
5824 offset
+= ivn
.vn_next
;
5826 while (ivn
.vn_next
!= 0);
5828 if (ivna
.vna_other
== vers_data
)
5831 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
5834 else if (! is_nobits
)
5835 error (_("bad dynamic symbol"));
5842 if (vers_data
!= 0x8001
5843 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5845 Elf_Internal_Verdef ivd
;
5846 Elf_Internal_Verdaux ivda
;
5847 Elf_External_Verdaux evda
;
5848 unsigned long offset
;
5850 offset
= offset_from_vma
5852 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
5853 sizeof (Elf_External_Verdef
));
5857 Elf_External_Verdef evd
;
5859 get_data (&evd
, file
, offset
, sizeof (evd
),
5862 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5863 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5864 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5866 offset
+= ivd
.vd_next
;
5868 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
5869 && ivd
.vd_next
!= 0);
5871 offset
-= ivd
.vd_next
;
5872 offset
+= ivd
.vd_aux
;
5874 get_data (&evda
, file
, offset
, sizeof (evda
),
5875 _("version def aux"));
5877 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5879 if (psym
->st_name
!= ivda
.vda_name
)
5880 printf ((vers_data
& 0x8000)
5882 strtab
+ ivda
.vda_name
);
5892 if (strtab
!= string_table
)
5898 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5900 if (do_histogram
&& buckets
!= NULL
)
5907 int nzero_counts
= 0;
5910 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5912 printf (_(" Length Number %% of total Coverage\n"));
5914 lengths
= calloc (nbuckets
, sizeof (int));
5915 if (lengths
== NULL
)
5917 error (_("Out of memory"));
5920 for (hn
= 0; hn
< nbuckets
; ++hn
)
5925 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
5928 if (maxlength
< ++lengths
[hn
])
5933 counts
= calloc (maxlength
+ 1, sizeof (int));
5936 error (_("Out of memory"));
5940 for (hn
= 0; hn
< nbuckets
; ++hn
)
5941 ++counts
[lengths
[hn
]];
5945 printf (" 0 %-10d (%5.1f%%)\n",
5946 counts
[0], (counts
[0] * 100.0) / nbuckets
);
5947 for (si
= 1; si
<= maxlength
; ++si
)
5949 nzero_counts
+= counts
[si
] * si
;
5950 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5951 si
, counts
[si
], (counts
[si
] * 100.0) / nbuckets
,
5952 (nzero_counts
* 100.0) / nsyms
);
5960 if (buckets
!= NULL
)
5970 process_syminfo (FILE *file ATTRIBUTE_UNUSED
)
5974 if (dynamic_syminfo
== NULL
5976 /* No syminfo, this is ok. */
5979 /* There better should be a dynamic symbol section. */
5980 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
5984 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5985 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
5987 printf (_(" Num: Name BoundTo Flags\n"));
5988 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
5990 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
5992 printf ("%4d: ", i
);
5993 print_symbol (30, dynamic_strings
+ dynamic_symbols
[i
].st_name
);
5996 switch (dynamic_syminfo
[i
].si_boundto
)
5998 case SYMINFO_BT_SELF
:
5999 fputs ("SELF ", stdout
);
6001 case SYMINFO_BT_PARENT
:
6002 fputs ("PARENT ", stdout
);
6005 if (dynamic_syminfo
[i
].si_boundto
> 0
6006 && dynamic_syminfo
[i
].si_boundto
< dynamic_size
)
6011 [dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
6015 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
6019 if (flags
& SYMINFO_FLG_DIRECT
)
6021 if (flags
& SYMINFO_FLG_PASSTHRU
)
6022 printf (" PASSTHRU");
6023 if (flags
& SYMINFO_FLG_COPY
)
6025 if (flags
& SYMINFO_FLG_LAZYLOAD
)
6026 printf (" LAZYLOAD");
6034 #ifdef SUPPORT_DISASSEMBLY
6036 disassemble_section (Elf_Internal_Shdr
*section
, FILE *file
)
6038 printf (_("\nAssembly dump of section %s\n"),
6039 SECTION_NAME (section
));
6041 /* XXX -- to be done --- XXX */
6048 dump_section (Elf_Internal_Shdr
*section
, FILE *file
)
6050 bfd_size_type bytes
;
6052 unsigned char *data
;
6053 unsigned char *start
;
6055 bytes
= section
->sh_size
;
6059 printf (_("\nSection '%s' has no data to dump.\n"),
6060 SECTION_NAME (section
));
6064 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
6066 addr
= section
->sh_addr
;
6068 start
= get_data (NULL
, file
, section
->sh_offset
, bytes
, _("section data"));
6080 lbytes
= (bytes
> 16 ? 16 : bytes
);
6082 printf (" 0x%8.8lx ", (unsigned long) addr
);
6084 switch (elf_header
.e_ident
[EI_DATA
])
6088 for (j
= 15; j
>= 0; j
--)
6091 printf ("%2.2x", data
[j
]);
6101 for (j
= 0; j
< 16; j
++)
6104 printf ("%2.2x", data
[j
]);
6114 for (j
= 0; j
< lbytes
; j
++)
6117 if (k
>= ' ' && k
< 0x80)
6136 static unsigned long int
6137 read_leb128 (unsigned char *data
, int *length_return
, int sign
)
6139 unsigned long int result
= 0;
6140 unsigned int num_read
= 0;
6149 result
|= (byte
& 0x7f) << shift
;
6154 while (byte
& 0x80);
6156 if (length_return
!= NULL
)
6157 *length_return
= num_read
;
6159 if (sign
&& (shift
< 32) && (byte
& 0x40))
6160 result
|= -1 << shift
;
6165 typedef struct State_Machine_Registers
6167 unsigned long address
;
6170 unsigned int column
;
6174 /* This variable hold the number of the last entry seen
6175 in the File Table. */
6176 unsigned int last_file_entry
;
6179 static SMR state_machine_regs
;
6182 reset_state_machine (int is_stmt
)
6184 state_machine_regs
.address
= 0;
6185 state_machine_regs
.file
= 1;
6186 state_machine_regs
.line
= 1;
6187 state_machine_regs
.column
= 0;
6188 state_machine_regs
.is_stmt
= is_stmt
;
6189 state_machine_regs
.basic_block
= 0;
6190 state_machine_regs
.end_sequence
= 0;
6191 state_machine_regs
.last_file_entry
= 0;
6194 /* Handled an extend line op. Returns true if this is the end
6197 process_extended_line_op (unsigned char *data
, int is_stmt
, int pointer_size
)
6199 unsigned char op_code
;
6202 unsigned char *name
;
6205 len
= read_leb128 (data
, & bytes_read
, 0);
6210 warn (_("badly formed extended line op encountered!\n"));
6217 printf (_(" Extended opcode %d: "), op_code
);
6221 case DW_LNE_end_sequence
:
6222 printf (_("End of Sequence\n\n"));
6223 reset_state_machine (is_stmt
);
6226 case DW_LNE_set_address
:
6227 adr
= byte_get (data
, pointer_size
);
6228 printf (_("set Address to 0x%lx\n"), adr
);
6229 state_machine_regs
.address
= adr
;
6232 case DW_LNE_define_file
:
6233 printf (_(" define new File Table entry\n"));
6234 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6236 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
6238 data
+= strlen ((char *) data
) + 1;
6239 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6241 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6243 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6244 printf (_("%s\n\n"), name
);
6248 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
6255 /* Size of pointers in the .debug_line section. This information is not
6256 really present in that section. It's obtained before dumping the debug
6257 sections by doing some pre-scan of the .debug_info section. */
6258 static int debug_line_pointer_size
= 4;
6261 display_debug_lines (Elf_Internal_Shdr
*section
,
6262 unsigned char * start
,
6263 FILE *file ATTRIBUTE_UNUSED
)
6265 unsigned char *hdrptr
;
6266 DWARF2_Internal_LineInfo info
;
6267 unsigned char *standard_opcodes
;
6268 unsigned char *data
= start
;
6269 unsigned char *end
= start
+ section
->sh_size
;
6270 unsigned char *end_of_sequence
;
6273 int initial_length_size
;
6275 printf (_("\nDump of debug contents of section %s:\n\n"),
6276 SECTION_NAME (section
));
6282 /* Check the length of the block. */
6283 info
.li_length
= byte_get (hdrptr
, 4);
6286 if (info
.li_length
== 0xffffffff)
6288 /* This section is 64-bit DWARF 3. */
6289 info
.li_length
= byte_get (hdrptr
, 8);
6292 initial_length_size
= 12;
6297 initial_length_size
= 4;
6300 if (info
.li_length
+ initial_length_size
> section
->sh_size
)
6303 (_("The line info appears to be corrupt - the section is too small\n"));
6307 /* Check its version number. */
6308 info
.li_version
= byte_get (hdrptr
, 2);
6310 if (info
.li_version
!= 2 && info
.li_version
!= 3)
6312 warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
6316 info
.li_prologue_length
= byte_get (hdrptr
, offset_size
);
6317 hdrptr
+= offset_size
;
6318 info
.li_min_insn_length
= byte_get (hdrptr
, 1);
6320 info
.li_default_is_stmt
= byte_get (hdrptr
, 1);
6322 info
.li_line_base
= byte_get (hdrptr
, 1);
6324 info
.li_line_range
= byte_get (hdrptr
, 1);
6326 info
.li_opcode_base
= byte_get (hdrptr
, 1);
6329 /* Sign extend the line base field. */
6330 info
.li_line_base
<<= 24;
6331 info
.li_line_base
>>= 24;
6333 printf (_(" Length: %ld\n"), info
.li_length
);
6334 printf (_(" DWARF Version: %d\n"), info
.li_version
);
6335 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
6336 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
6337 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
6338 printf (_(" Line Base: %d\n"), info
.li_line_base
);
6339 printf (_(" Line Range: %d\n"), info
.li_line_range
);
6340 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
6342 end_of_sequence
= data
+ info
.li_length
+ initial_length_size
;
6344 reset_state_machine (info
.li_default_is_stmt
);
6346 /* Display the contents of the Opcodes table. */
6347 standard_opcodes
= hdrptr
;
6349 printf (_("\n Opcodes:\n"));
6351 for (i
= 1; i
< info
.li_opcode_base
; i
++)
6352 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
6354 /* Display the contents of the Directory table. */
6355 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
6358 printf (_("\n The Directory Table is empty.\n"));
6361 printf (_("\n The Directory Table:\n"));
6365 printf (_(" %s\n"), data
);
6367 data
+= strlen ((char *) data
) + 1;
6371 /* Skip the NUL at the end of the table. */
6374 /* Display the contents of the File Name table. */
6376 printf (_("\n The File Name Table is empty.\n"));
6379 printf (_("\n The File Name Table:\n"));
6380 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6384 unsigned char *name
;
6387 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
6390 data
+= strlen ((char *) data
) + 1;
6392 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6394 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6396 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6398 printf (_("%s\n"), name
);
6402 /* Skip the NUL at the end of the table. */
6405 /* Now display the statements. */
6406 printf (_("\n Line Number Statements:\n"));
6409 while (data
< end_of_sequence
)
6411 unsigned char op_code
;
6417 if (op_code
>= info
.li_opcode_base
)
6419 op_code
-= info
.li_opcode_base
;
6420 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
6421 state_machine_regs
.address
+= adv
;
6422 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6423 op_code
, adv
, state_machine_regs
.address
);
6424 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
6425 state_machine_regs
.line
+= adv
;
6426 printf (_(" and Line by %d to %d\n"),
6427 adv
, state_machine_regs
.line
);
6429 else switch (op_code
)
6431 case DW_LNS_extended_op
:
6432 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
6433 debug_line_pointer_size
);
6437 printf (_(" Copy\n"));
6440 case DW_LNS_advance_pc
:
6441 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
6443 state_machine_regs
.address
+= adv
;
6444 printf (_(" Advance PC by %d to %lx\n"), adv
,
6445 state_machine_regs
.address
);
6448 case DW_LNS_advance_line
:
6449 adv
= read_leb128 (data
, & bytes_read
, 1);
6451 state_machine_regs
.line
+= adv
;
6452 printf (_(" Advance Line by %d to %d\n"), adv
,
6453 state_machine_regs
.line
);
6456 case DW_LNS_set_file
:
6457 adv
= read_leb128 (data
, & bytes_read
, 0);
6459 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6461 state_machine_regs
.file
= adv
;
6464 case DW_LNS_set_column
:
6465 adv
= read_leb128 (data
, & bytes_read
, 0);
6467 printf (_(" Set column to %d\n"), adv
);
6468 state_machine_regs
.column
= adv
;
6471 case DW_LNS_negate_stmt
:
6472 adv
= state_machine_regs
.is_stmt
;
6474 printf (_(" Set is_stmt to %d\n"), adv
);
6475 state_machine_regs
.is_stmt
= adv
;
6478 case DW_LNS_set_basic_block
:
6479 printf (_(" Set basic block\n"));
6480 state_machine_regs
.basic_block
= 1;
6483 case DW_LNS_const_add_pc
:
6484 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
6485 * info
.li_min_insn_length
);
6486 state_machine_regs
.address
+= adv
;
6487 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
6488 state_machine_regs
.address
);
6491 case DW_LNS_fixed_advance_pc
:
6492 adv
= byte_get (data
, 2);
6494 state_machine_regs
.address
+= adv
;
6495 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6496 adv
, state_machine_regs
.address
);
6499 case DW_LNS_set_prologue_end
:
6500 printf (_(" Set prologue_end to true\n"));
6503 case DW_LNS_set_epilogue_begin
:
6504 printf (_(" Set epilogue_begin to true\n"));
6507 case DW_LNS_set_isa
:
6508 adv
= read_leb128 (data
, & bytes_read
, 0);
6510 printf (_(" Set ISA to %d\n"), adv
);
6514 printf (_(" Unknown opcode %d with operands: "), op_code
);
6517 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
6519 printf ("0x%lx%s", read_leb128 (data
, &bytes_read
, 0),
6520 i
== 1 ? "" : ", ");
6535 display_debug_pubnames (Elf_Internal_Shdr
*section
,
6536 unsigned char *start
,
6537 FILE *file ATTRIBUTE_UNUSED
)
6539 DWARF2_Internal_PubNames pubnames
;
6542 end
= start
+ section
->sh_size
;
6544 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6548 unsigned char *data
;
6549 unsigned long offset
;
6550 int offset_size
, initial_length_size
;
6554 pubnames
.pn_length
= byte_get (data
, 4);
6556 if (pubnames
.pn_length
== 0xffffffff)
6558 pubnames
.pn_length
= byte_get (data
, 8);
6561 initial_length_size
= 12;
6566 initial_length_size
= 4;
6569 pubnames
.pn_version
= byte_get (data
, 2);
6571 pubnames
.pn_offset
= byte_get (data
, offset_size
);
6572 data
+= offset_size
;
6573 pubnames
.pn_size
= byte_get (data
, offset_size
);
6574 data
+= offset_size
;
6576 start
+= pubnames
.pn_length
+ initial_length_size
;
6578 if (pubnames
.pn_version
!= 2 && pubnames
.pn_version
!= 3)
6580 static int warned
= 0;
6584 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
6591 printf (_(" Length: %ld\n"),
6592 pubnames
.pn_length
);
6593 printf (_(" Version: %d\n"),
6594 pubnames
.pn_version
);
6595 printf (_(" Offset into .debug_info section: %ld\n"),
6596 pubnames
.pn_offset
);
6597 printf (_(" Size of area in .debug_info section: %ld\n"),
6600 printf (_("\n Offset\tName\n"));
6604 offset
= byte_get (data
, offset_size
);
6608 data
+= offset_size
;
6609 printf (" %ld\t\t%s\n", offset
, data
);
6610 data
+= strlen ((char *) data
) + 1;
6613 while (offset
!= 0);
6621 get_TAG_name (unsigned long tag
)
6625 case DW_TAG_padding
: return "DW_TAG_padding";
6626 case DW_TAG_array_type
: return "DW_TAG_array_type";
6627 case DW_TAG_class_type
: return "DW_TAG_class_type";
6628 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
6629 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
6630 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
6631 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
6632 case DW_TAG_label
: return "DW_TAG_label";
6633 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
6634 case DW_TAG_member
: return "DW_TAG_member";
6635 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
6636 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
6637 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
6638 case DW_TAG_string_type
: return "DW_TAG_string_type";
6639 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
6640 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
6641 case DW_TAG_typedef
: return "DW_TAG_typedef";
6642 case DW_TAG_union_type
: return "DW_TAG_union_type";
6643 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
6644 case DW_TAG_variant
: return "DW_TAG_variant";
6645 case DW_TAG_common_block
: return "DW_TAG_common_block";
6646 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
6647 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
6648 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
6649 case DW_TAG_module
: return "DW_TAG_module";
6650 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
6651 case DW_TAG_set_type
: return "DW_TAG_set_type";
6652 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
6653 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
6654 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
6655 case DW_TAG_base_type
: return "DW_TAG_base_type";
6656 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
6657 case DW_TAG_const_type
: return "DW_TAG_const_type";
6658 case DW_TAG_constant
: return "DW_TAG_constant";
6659 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
6660 case DW_TAG_file_type
: return "DW_TAG_file_type";
6661 case DW_TAG_friend
: return "DW_TAG_friend";
6662 case DW_TAG_namelist
: return "DW_TAG_namelist";
6663 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
6664 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
6665 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
6666 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
6667 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
6668 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
6669 case DW_TAG_try_block
: return "DW_TAG_try_block";
6670 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
6671 case DW_TAG_variable
: return "DW_TAG_variable";
6672 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
6673 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
6674 case DW_TAG_format_label
: return "DW_TAG_format_label";
6675 case DW_TAG_function_template
: return "DW_TAG_function_template";
6676 case DW_TAG_class_template
: return "DW_TAG_class_template";
6677 /* DWARF 2.1 values. */
6678 case DW_TAG_dwarf_procedure
: return "DW_TAG_dwarf_procedure";
6679 case DW_TAG_restrict_type
: return "DW_TAG_restrict_type";
6680 case DW_TAG_interface_type
: return "DW_TAG_interface_type";
6681 case DW_TAG_namespace
: return "DW_TAG_namespace";
6682 case DW_TAG_imported_module
: return "DW_TAG_imported_module";
6683 case DW_TAG_unspecified_type
: return "DW_TAG_unspecified_type";
6684 case DW_TAG_partial_unit
: return "DW_TAG_partial_unit";
6685 case DW_TAG_imported_unit
: return "DW_TAG_imported_unit";
6687 case DW_TAG_upc_shared_type
: return "DW_TAG_upc_shared_type";
6688 case DW_TAG_upc_strict_type
: return "DW_TAG_upc_strict_type";
6689 case DW_TAG_upc_relaxed_type
: return "DW_TAG_upc_relaxed_type";
6692 static char buffer
[100];
6694 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
6701 get_AT_name (unsigned long attribute
)
6705 case DW_AT_sibling
: return "DW_AT_sibling";
6706 case DW_AT_location
: return "DW_AT_location";
6707 case DW_AT_name
: return "DW_AT_name";
6708 case DW_AT_ordering
: return "DW_AT_ordering";
6709 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
6710 case DW_AT_byte_size
: return "DW_AT_byte_size";
6711 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
6712 case DW_AT_bit_size
: return "DW_AT_bit_size";
6713 case DW_AT_element_list
: return "DW_AT_element_list";
6714 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
6715 case DW_AT_low_pc
: return "DW_AT_low_pc";
6716 case DW_AT_high_pc
: return "DW_AT_high_pc";
6717 case DW_AT_language
: return "DW_AT_language";
6718 case DW_AT_member
: return "DW_AT_member";
6719 case DW_AT_discr
: return "DW_AT_discr";
6720 case DW_AT_discr_value
: return "DW_AT_discr_value";
6721 case DW_AT_visibility
: return "DW_AT_visibility";
6722 case DW_AT_import
: return "DW_AT_import";
6723 case DW_AT_string_length
: return "DW_AT_string_length";
6724 case DW_AT_common_reference
: return "DW_AT_common_reference";
6725 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
6726 case DW_AT_const_value
: return "DW_AT_const_value";
6727 case DW_AT_containing_type
: return "DW_AT_containing_type";
6728 case DW_AT_default_value
: return "DW_AT_default_value";
6729 case DW_AT_inline
: return "DW_AT_inline";
6730 case DW_AT_is_optional
: return "DW_AT_is_optional";
6731 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
6732 case DW_AT_producer
: return "DW_AT_producer";
6733 case DW_AT_prototyped
: return "DW_AT_prototyped";
6734 case DW_AT_return_addr
: return "DW_AT_return_addr";
6735 case DW_AT_start_scope
: return "DW_AT_start_scope";
6736 case DW_AT_stride_size
: return "DW_AT_stride_size";
6737 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
6738 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
6739 case DW_AT_accessibility
: return "DW_AT_accessibility";
6740 case DW_AT_address_class
: return "DW_AT_address_class";
6741 case DW_AT_artificial
: return "DW_AT_artificial";
6742 case DW_AT_base_types
: return "DW_AT_base_types";
6743 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
6744 case DW_AT_count
: return "DW_AT_count";
6745 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
6746 case DW_AT_decl_column
: return "DW_AT_decl_column";
6747 case DW_AT_decl_file
: return "DW_AT_decl_file";
6748 case DW_AT_decl_line
: return "DW_AT_decl_line";
6749 case DW_AT_declaration
: return "DW_AT_declaration";
6750 case DW_AT_discr_list
: return "DW_AT_discr_list";
6751 case DW_AT_encoding
: return "DW_AT_encoding";
6752 case DW_AT_external
: return "DW_AT_external";
6753 case DW_AT_frame_base
: return "DW_AT_frame_base";
6754 case DW_AT_friend
: return "DW_AT_friend";
6755 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
6756 case DW_AT_macro_info
: return "DW_AT_macro_info";
6757 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
6758 case DW_AT_priority
: return "DW_AT_priority";
6759 case DW_AT_segment
: return "DW_AT_segment";
6760 case DW_AT_specification
: return "DW_AT_specification";
6761 case DW_AT_static_link
: return "DW_AT_static_link";
6762 case DW_AT_type
: return "DW_AT_type";
6763 case DW_AT_use_location
: return "DW_AT_use_location";
6764 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
6765 case DW_AT_virtuality
: return "DW_AT_virtuality";
6766 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
6767 /* DWARF 2.1 values. */
6768 case DW_AT_allocated
: return "DW_AT_allocated";
6769 case DW_AT_associated
: return "DW_AT_associated";
6770 case DW_AT_data_location
: return "DW_AT_data_location";
6771 case DW_AT_stride
: return "DW_AT_stride";
6772 case DW_AT_entry_pc
: return "DW_AT_entry_pc";
6773 case DW_AT_use_UTF8
: return "DW_AT_use_UTF8";
6774 case DW_AT_extension
: return "DW_AT_extension";
6775 case DW_AT_ranges
: return "DW_AT_ranges";
6776 case DW_AT_trampoline
: return "DW_AT_trampoline";
6777 case DW_AT_call_column
: return "DW_AT_call_column";
6778 case DW_AT_call_file
: return "DW_AT_call_file";
6779 case DW_AT_call_line
: return "DW_AT_call_line";
6780 /* SGI/MIPS extensions. */
6781 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
6782 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
6783 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
6784 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
6785 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
6786 case DW_AT_MIPS_software_pipeline_depth
:
6787 return "DW_AT_MIPS_software_pipeline_depth";
6788 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
6789 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
6790 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
6791 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
6792 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
6793 /* GNU extensions. */
6794 case DW_AT_sf_names
: return "DW_AT_sf_names";
6795 case DW_AT_src_info
: return "DW_AT_src_info";
6796 case DW_AT_mac_info
: return "DW_AT_mac_info";
6797 case DW_AT_src_coords
: return "DW_AT_src_coords";
6798 case DW_AT_body_begin
: return "DW_AT_body_begin";
6799 case DW_AT_body_end
: return "DW_AT_body_end";
6800 case DW_AT_GNU_vector
: return "DW_AT_GNU_vector";
6801 /* UPC extension. */
6802 case DW_AT_upc_threads_scaled
: return "DW_AT_upc_threads_scaled";
6805 static char buffer
[100];
6807 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
6814 get_FORM_name (unsigned long form
)
6818 case DW_FORM_addr
: return "DW_FORM_addr";
6819 case DW_FORM_block2
: return "DW_FORM_block2";
6820 case DW_FORM_block4
: return "DW_FORM_block4";
6821 case DW_FORM_data2
: return "DW_FORM_data2";
6822 case DW_FORM_data4
: return "DW_FORM_data4";
6823 case DW_FORM_data8
: return "DW_FORM_data8";
6824 case DW_FORM_string
: return "DW_FORM_string";
6825 case DW_FORM_block
: return "DW_FORM_block";
6826 case DW_FORM_block1
: return "DW_FORM_block1";
6827 case DW_FORM_data1
: return "DW_FORM_data1";
6828 case DW_FORM_flag
: return "DW_FORM_flag";
6829 case DW_FORM_sdata
: return "DW_FORM_sdata";
6830 case DW_FORM_strp
: return "DW_FORM_strp";
6831 case DW_FORM_udata
: return "DW_FORM_udata";
6832 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
6833 case DW_FORM_ref1
: return "DW_FORM_ref1";
6834 case DW_FORM_ref2
: return "DW_FORM_ref2";
6835 case DW_FORM_ref4
: return "DW_FORM_ref4";
6836 case DW_FORM_ref8
: return "DW_FORM_ref8";
6837 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
6838 case DW_FORM_indirect
: return "DW_FORM_indirect";
6841 static char buffer
[100];
6843 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
6849 /* FIXME: There are better and more effiecint ways to handle
6850 these structures. For now though, I just want something that
6851 is simple to implement. */
6852 typedef struct abbrev_attr
6854 unsigned long attribute
;
6856 struct abbrev_attr
*next
;
6860 typedef struct abbrev_entry
6862 unsigned long entry
;
6865 struct abbrev_attr
*first_attr
;
6866 struct abbrev_attr
*last_attr
;
6867 struct abbrev_entry
*next
;
6871 static abbrev_entry
*first_abbrev
= NULL
;
6872 static abbrev_entry
*last_abbrev
= NULL
;
6877 abbrev_entry
*abbrev
;
6879 for (abbrev
= first_abbrev
; abbrev
;)
6881 abbrev_entry
*next
= abbrev
->next
;
6884 for (attr
= abbrev
->first_attr
; attr
;)
6886 abbrev_attr
*next
= attr
->next
;
6896 last_abbrev
= first_abbrev
= NULL
;
6900 add_abbrev (unsigned long number
, unsigned long tag
, int children
)
6902 abbrev_entry
*entry
;
6904 entry
= malloc (sizeof (*entry
));
6910 entry
->entry
= number
;
6912 entry
->children
= children
;
6913 entry
->first_attr
= NULL
;
6914 entry
->last_attr
= NULL
;
6917 if (first_abbrev
== NULL
)
6918 first_abbrev
= entry
;
6920 last_abbrev
->next
= entry
;
6922 last_abbrev
= entry
;
6926 add_abbrev_attr (unsigned long attribute
, unsigned long form
)
6930 attr
= malloc (sizeof (*attr
));
6936 attr
->attribute
= attribute
;
6940 if (last_abbrev
->first_attr
== NULL
)
6941 last_abbrev
->first_attr
= attr
;
6943 last_abbrev
->last_attr
->next
= attr
;
6945 last_abbrev
->last_attr
= attr
;
6948 /* Processes the (partial) contents of a .debug_abbrev section.
6949 Returns NULL if the end of the section was encountered.
6950 Returns the address after the last byte read if the end of
6951 an abbreviation set was found. */
6953 static unsigned char *
6954 process_abbrev_section (unsigned char *start
, unsigned char *end
)
6956 if (first_abbrev
!= NULL
)
6962 unsigned long entry
;
6964 unsigned long attribute
;
6967 entry
= read_leb128 (start
, & bytes_read
, 0);
6968 start
+= bytes_read
;
6970 /* A single zero is supposed to end the section according
6971 to the standard. If there's more, then signal that to
6974 return start
== end
? NULL
: start
;
6976 tag
= read_leb128 (start
, & bytes_read
, 0);
6977 start
+= bytes_read
;
6979 children
= *start
++;
6981 add_abbrev (entry
, tag
, children
);
6987 attribute
= read_leb128 (start
, & bytes_read
, 0);
6988 start
+= bytes_read
;
6990 form
= read_leb128 (start
, & bytes_read
, 0);
6991 start
+= bytes_read
;
6994 add_abbrev_attr (attribute
, form
);
6996 while (attribute
!= 0);
7004 display_debug_macinfo (Elf_Internal_Shdr
*section
,
7005 unsigned char *start
,
7006 FILE *file ATTRIBUTE_UNUSED
)
7008 unsigned char *end
= start
+ section
->sh_size
;
7009 unsigned char *curr
= start
;
7010 unsigned int bytes_read
;
7011 enum dwarf_macinfo_record_type op
;
7013 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7017 unsigned int lineno
;
7025 case DW_MACINFO_start_file
:
7027 unsigned int filenum
;
7029 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7031 filenum
= read_leb128 (curr
, & bytes_read
, 0);
7034 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno
, filenum
);
7038 case DW_MACINFO_end_file
:
7039 printf (_(" DW_MACINFO_end_file\n"));
7042 case DW_MACINFO_define
:
7043 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7046 curr
+= strlen (string
) + 1;
7047 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno
, string
);
7050 case DW_MACINFO_undef
:
7051 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7054 curr
+= strlen (string
) + 1;
7055 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno
, string
);
7058 case DW_MACINFO_vendor_ext
:
7060 unsigned int constant
;
7062 constant
= read_leb128 (curr
, & bytes_read
, 0);
7065 curr
+= strlen (string
) + 1;
7066 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant
, string
);
7077 display_debug_abbrev (Elf_Internal_Shdr
*section
,
7078 unsigned char *start
,
7079 FILE *file ATTRIBUTE_UNUSED
)
7081 abbrev_entry
*entry
;
7082 unsigned char *end
= start
+ section
->sh_size
;
7084 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7088 start
= process_abbrev_section (start
, end
);
7090 if (first_abbrev
== NULL
)
7093 printf (_(" Number TAG\n"));
7095 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
7099 printf (_(" %ld %s [%s]\n"),
7101 get_TAG_name (entry
->tag
),
7102 entry
->children
? _("has children") : _("no children"));
7104 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
7106 printf (_(" %-18s %s\n"),
7107 get_AT_name (attr
->attribute
),
7108 get_FORM_name (attr
->form
));
7122 static unsigned char *
7123 display_block (unsigned char *data
, unsigned long length
)
7125 printf (_(" %lu byte block: "), length
);
7128 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
7134 decode_location_expression (unsigned char * data
,
7135 unsigned int pointer_size
,
7136 unsigned long length
)
7140 unsigned long uvalue
;
7141 unsigned char *end
= data
+ length
;
7150 printf ("DW_OP_addr: %lx",
7151 (unsigned long) byte_get (data
, pointer_size
));
7152 data
+= pointer_size
;
7155 printf ("DW_OP_deref");
7158 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
7161 printf ("DW_OP_const1s: %ld", (long) byte_get (data
++, 1));
7164 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
7168 printf ("DW_OP_const2s: %ld", (long) byte_get (data
, 2));
7172 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
7176 printf ("DW_OP_const4s: %ld", (long) byte_get (data
, 4));
7180 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
7181 (unsigned long) byte_get (data
+ 4, 4));
7185 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
7186 (long) byte_get (data
+ 4, 4));
7190 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
7194 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
7198 printf ("DW_OP_dup");
7201 printf ("DW_OP_drop");
7204 printf ("DW_OP_over");
7207 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
7210 printf ("DW_OP_swap");
7213 printf ("DW_OP_rot");
7216 printf ("DW_OP_xderef");
7219 printf ("DW_OP_abs");
7222 printf ("DW_OP_and");
7225 printf ("DW_OP_div");
7228 printf ("DW_OP_minus");
7231 printf ("DW_OP_mod");
7234 printf ("DW_OP_mul");
7237 printf ("DW_OP_neg");
7240 printf ("DW_OP_not");
7243 printf ("DW_OP_or");
7246 printf ("DW_OP_plus");
7248 case DW_OP_plus_uconst
:
7249 printf ("DW_OP_plus_uconst: %lu",
7250 read_leb128 (data
, &bytes_read
, 0));
7254 printf ("DW_OP_shl");
7257 printf ("DW_OP_shr");
7260 printf ("DW_OP_shra");
7263 printf ("DW_OP_xor");
7266 printf ("DW_OP_bra: %ld", (long) byte_get (data
, 2));
7270 printf ("DW_OP_eq");
7273 printf ("DW_OP_ge");
7276 printf ("DW_OP_gt");
7279 printf ("DW_OP_le");
7282 printf ("DW_OP_lt");
7285 printf ("DW_OP_ne");
7288 printf ("DW_OP_skip: %ld", (long) byte_get (data
, 2));
7324 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
7359 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
7394 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
7395 read_leb128 (data
, &bytes_read
, 1));
7400 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
7404 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
7408 uvalue
= read_leb128 (data
, &bytes_read
, 0);
7410 printf ("DW_OP_bregx: %lu %ld", uvalue
,
7411 read_leb128 (data
, &bytes_read
, 1));
7415 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
7418 case DW_OP_deref_size
:
7419 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
7421 case DW_OP_xderef_size
:
7422 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
7425 printf ("DW_OP_nop");
7428 /* DWARF 3 extensions. */
7429 case DW_OP_push_object_address
:
7430 printf ("DW_OP_push_object_address");
7433 printf ("DW_OP_call2: <%lx>", (long) byte_get (data
, 2));
7437 printf ("DW_OP_call4: <%lx>", (long) byte_get (data
, 4));
7440 case DW_OP_call_ref
:
7441 printf ("DW_OP_call_ref");
7444 /* GNU extensions. */
7445 case DW_OP_GNU_push_tls_address
:
7446 printf ("DW_OP_GNU_push_tls_address");
7450 if (op
>= DW_OP_lo_user
7451 && op
<= DW_OP_hi_user
)
7452 printf (_("(User defined location op)"));
7454 printf (_("(Unknown location op)"));
7455 /* No way to tell where the next op is, so just bail. */
7459 /* Separate the ops. */
7465 static const char *debug_loc_contents
;
7466 static bfd_vma debug_loc_size
;
7469 load_debug_loc (FILE *file
)
7471 Elf_Internal_Shdr
*sec
;
7474 /* If it is already loaded, do nothing. */
7475 if (debug_loc_contents
!= NULL
)
7478 /* Locate the .debug_loc section. */
7479 for (i
= 0, sec
= section_headers
;
7480 i
< elf_header
.e_shnum
;
7482 if (strcmp (SECTION_NAME (sec
), ".debug_loc") == 0)
7485 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
7488 debug_loc_size
= sec
->sh_size
;
7490 debug_loc_contents
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7491 _("debug_loc section data"));
7495 free_debug_loc (void)
7497 if (debug_loc_contents
== NULL
)
7500 free ((char *) debug_loc_contents
);
7501 debug_loc_contents
= NULL
;
7507 display_debug_loc (Elf_Internal_Shdr
*section
,
7508 unsigned char *start
,
7509 FILE *file ATTRIBUTE_UNUSED
)
7511 unsigned char *section_end
;
7512 unsigned long bytes
;
7513 unsigned char *section_begin
= start
;
7516 addr
= section
->sh_addr
;
7517 bytes
= section
->sh_size
;
7518 section_end
= start
+ bytes
;
7522 printf (_("\nThe .debug_loc section is empty.\n"));
7526 printf (_("Contents of the .debug_loc section:\n\n"));
7527 printf (_("\n Offset Begin End Expression\n"));
7529 while (start
< section_end
)
7531 unsigned long begin
;
7533 unsigned short length
;
7534 unsigned long offset
;
7536 offset
= start
- section_begin
;
7540 /* Normally, the lists in the debug_loc section are related to a
7541 given compilation unit, and thus, we would use the pointer size
7542 of that compilation unit. However, since we are displaying it
7543 seperately here, we either have to store pointer sizes of all
7544 compilation units, or assume they don't change. We assume,
7545 like the debug_line display, that it doesn't change. */
7546 begin
= byte_get (start
, debug_line_pointer_size
);
7547 start
+= debug_line_pointer_size
;
7548 end
= byte_get (start
, debug_line_pointer_size
);
7549 start
+= debug_line_pointer_size
;
7551 if (begin
== 0 && end
== 0)
7554 /* For now, skip any base address specifiers. */
7555 if (begin
== 0xffffffff)
7561 length
= byte_get (start
, 2);
7564 printf (" %8.8lx %8.8lx %8.8lx (", offset
, begin
, end
);
7565 decode_location_expression (start
, debug_line_pointer_size
, length
);
7575 static const char *debug_str_contents
;
7576 static bfd_vma debug_str_size
;
7579 load_debug_str (FILE *file
)
7581 Elf_Internal_Shdr
*sec
;
7584 /* If it is already loaded, do nothing. */
7585 if (debug_str_contents
!= NULL
)
7588 /* Locate the .debug_str section. */
7589 for (i
= 0, sec
= section_headers
;
7590 i
< elf_header
.e_shnum
;
7592 if (strcmp (SECTION_NAME (sec
), ".debug_str") == 0)
7595 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
7598 debug_str_size
= sec
->sh_size
;
7600 debug_str_contents
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7601 _("debug_str section data"));
7605 free_debug_str (void)
7607 if (debug_str_contents
== NULL
)
7610 free ((char *) debug_str_contents
);
7611 debug_str_contents
= NULL
;
7616 fetch_indirect_string (unsigned long offset
)
7618 if (debug_str_contents
== NULL
)
7619 return _("<no .debug_str section>");
7621 if (offset
> debug_str_size
)
7622 return _("<offset is too big>");
7624 return debug_str_contents
+ offset
;
7628 display_debug_str (Elf_Internal_Shdr
*section
,
7629 unsigned char *start
,
7630 FILE *file ATTRIBUTE_UNUSED
)
7632 unsigned long bytes
;
7635 addr
= section
->sh_addr
;
7636 bytes
= section
->sh_size
;
7640 printf (_("\nThe .debug_str section is empty.\n"));
7644 printf (_("Contents of the .debug_str section:\n\n"));
7652 lbytes
= (bytes
> 16 ? 16 : bytes
);
7654 printf (" 0x%8.8lx ", (unsigned long) addr
);
7656 for (j
= 0; j
< 16; j
++)
7659 printf ("%2.2x", start
[j
]);
7667 for (j
= 0; j
< lbytes
; j
++)
7670 if (k
>= ' ' && k
< 0x80)
7686 static unsigned char *
7687 read_and_display_attr_value (unsigned long attribute
,
7689 unsigned char *data
,
7690 unsigned long cu_offset
,
7691 unsigned long pointer_size
,
7692 unsigned long offset_size
,
7695 unsigned long uvalue
= 0;
7696 unsigned char *block_start
= NULL
;
7704 case DW_FORM_ref_addr
:
7705 if (dwarf_version
== 2)
7707 uvalue
= byte_get (data
, pointer_size
);
7708 data
+= pointer_size
;
7710 else if (dwarf_version
== 3)
7712 uvalue
= byte_get (data
, offset_size
);
7713 data
+= offset_size
;
7717 error (_("Internal error: DWARF version is not 2 or 3.\n"));
7722 uvalue
= byte_get (data
, pointer_size
);
7723 data
+= pointer_size
;
7727 uvalue
= byte_get (data
, offset_size
);
7728 data
+= offset_size
;
7734 uvalue
= byte_get (data
++, 1);
7739 uvalue
= byte_get (data
, 2);
7745 uvalue
= byte_get (data
, 4);
7750 uvalue
= read_leb128 (data
, & bytes_read
, 1);
7754 case DW_FORM_ref_udata
:
7756 uvalue
= read_leb128 (data
, & bytes_read
, 0);
7760 case DW_FORM_indirect
:
7761 form
= read_leb128 (data
, & bytes_read
, 0);
7763 printf (" %s", get_FORM_name (form
));
7764 return read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
7765 pointer_size
, offset_size
,
7771 case DW_FORM_ref_addr
:
7772 printf (" <#%lx>", uvalue
);
7778 case DW_FORM_ref_udata
:
7779 printf (" <%lx>", uvalue
+ cu_offset
);
7783 printf (" %#lx", uvalue
);
7791 printf (" %ld", uvalue
);
7796 uvalue
= byte_get (data
, 4);
7797 printf (" %lx", uvalue
);
7798 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
7802 case DW_FORM_string
:
7803 printf (" %s", data
);
7804 data
+= strlen ((char *) data
) + 1;
7808 uvalue
= read_leb128 (data
, & bytes_read
, 0);
7809 block_start
= data
+ bytes_read
;
7810 data
= display_block (block_start
, uvalue
);
7813 case DW_FORM_block1
:
7814 uvalue
= byte_get (data
, 1);
7815 block_start
= data
+ 1;
7816 data
= display_block (block_start
, uvalue
);
7819 case DW_FORM_block2
:
7820 uvalue
= byte_get (data
, 2);
7821 block_start
= data
+ 2;
7822 data
= display_block (block_start
, uvalue
);
7825 case DW_FORM_block4
:
7826 uvalue
= byte_get (data
, 4);
7827 block_start
= data
+ 4;
7828 data
= display_block (block_start
, uvalue
);
7832 printf (_(" (indirect string, offset: 0x%lx): %s"),
7833 uvalue
, fetch_indirect_string (uvalue
));
7836 case DW_FORM_indirect
:
7837 /* Handled above. */
7841 warn (_("Unrecognized form: %d\n"), form
);
7845 /* For some attributes we can display futher information. */
7854 case DW_INL_not_inlined
:
7855 printf (_("(not inlined)"));
7857 case DW_INL_inlined
:
7858 printf (_("(inlined)"));
7860 case DW_INL_declared_not_inlined
:
7861 printf (_("(declared as inline but ignored)"));
7863 case DW_INL_declared_inlined
:
7864 printf (_("(declared as inline and inlined)"));
7867 printf (_(" (Unknown inline attribute value: %lx)"), uvalue
);
7872 case DW_AT_language
:
7875 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
7876 case DW_LANG_C89
: printf ("(ANSI C)"); break;
7877 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
7878 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
7879 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
7880 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
7881 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
7882 case DW_LANG_Ada83
: printf ("(Ada)"); break;
7883 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
7884 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
7885 /* DWARF 2.1 values. */
7886 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
7887 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
7888 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
7889 /* MIPS extension. */
7890 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
7891 /* UPC extension. */
7892 case DW_LANG_Upc
: printf ("(Unified Parallel C)"); break;
7894 printf ("(Unknown: %lx)", uvalue
);
7899 case DW_AT_encoding
:
7902 case DW_ATE_void
: printf ("(void)"); break;
7903 case DW_ATE_address
: printf ("(machine address)"); break;
7904 case DW_ATE_boolean
: printf ("(boolean)"); break;
7905 case DW_ATE_complex_float
: printf ("(complex float)"); break;
7906 case DW_ATE_float
: printf ("(float)"); break;
7907 case DW_ATE_signed
: printf ("(signed)"); break;
7908 case DW_ATE_signed_char
: printf ("(signed char)"); break;
7909 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
7910 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
7911 /* DWARF 2.1 value. */
7912 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
7914 if (uvalue
>= DW_ATE_lo_user
7915 && uvalue
<= DW_ATE_hi_user
)
7916 printf ("(user defined type)");
7918 printf ("(unknown type)");
7923 case DW_AT_accessibility
:
7926 case DW_ACCESS_public
: printf ("(public)"); break;
7927 case DW_ACCESS_protected
: printf ("(protected)"); break;
7928 case DW_ACCESS_private
: printf ("(private)"); break;
7930 printf ("(unknown accessibility)");
7935 case DW_AT_visibility
:
7938 case DW_VIS_local
: printf ("(local)"); break;
7939 case DW_VIS_exported
: printf ("(exported)"); break;
7940 case DW_VIS_qualified
: printf ("(qualified)"); break;
7941 default: printf ("(unknown visibility)"); break;
7945 case DW_AT_virtuality
:
7948 case DW_VIRTUALITY_none
: printf ("(none)"); break;
7949 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
7950 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
7951 default: printf ("(unknown virtuality)"); break;
7955 case DW_AT_identifier_case
:
7958 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
7959 case DW_ID_up_case
: printf ("(up_case)"); break;
7960 case DW_ID_down_case
: printf ("(down_case)"); break;
7961 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
7962 default: printf ("(unknown case)"); break;
7966 case DW_AT_calling_convention
:
7969 case DW_CC_normal
: printf ("(normal)"); break;
7970 case DW_CC_program
: printf ("(program)"); break;
7971 case DW_CC_nocall
: printf ("(nocall)"); break;
7973 if (uvalue
>= DW_CC_lo_user
7974 && uvalue
<= DW_CC_hi_user
)
7975 printf ("(user defined)");
7977 printf ("(unknown convention)");
7981 case DW_AT_ordering
:
7984 case -1: printf ("(undefined)"); break;
7985 case 0: printf ("(row major)"); break;
7986 case 1: printf ("(column major)"); break;
7990 case DW_AT_frame_base
:
7991 case DW_AT_location
:
7992 case DW_AT_data_member_location
:
7993 case DW_AT_vtable_elem_location
:
7994 case DW_AT_allocated
:
7995 case DW_AT_associated
:
7996 case DW_AT_data_location
:
7998 case DW_AT_upper_bound
:
7999 case DW_AT_lower_bound
:
8003 decode_location_expression (block_start
, pointer_size
, uvalue
);
8006 else if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
8009 printf ("location list");
8021 static unsigned char *
8022 read_and_display_attr (unsigned long attribute
,
8024 unsigned char *data
,
8025 unsigned long cu_offset
,
8026 unsigned long pointer_size
,
8027 unsigned long offset_size
,
8030 printf (" %-18s:", get_AT_name (attribute
));
8031 data
= read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
8032 pointer_size
, offset_size
, dwarf_version
);
8038 display_debug_info (Elf_Internal_Shdr
*section
,
8039 unsigned char *start
,
8042 unsigned char *end
= start
+ section
->sh_size
;
8043 unsigned char *section_begin
= start
;
8045 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
8047 load_debug_str (file
);
8048 load_debug_loc (file
);
8052 DWARF2_Internal_CompUnit compunit
;
8053 Elf_Internal_Shdr
*relsec
;
8054 unsigned char *hdrptr
;
8055 unsigned char *cu_abbrev_offset_ptr
;
8056 unsigned char *tags
;
8059 unsigned long cu_offset
;
8061 int initial_length_size
;
8065 compunit
.cu_length
= byte_get (hdrptr
, 4);
8068 if (compunit
.cu_length
== 0xffffffff)
8070 compunit
.cu_length
= byte_get (hdrptr
, 8);
8073 initial_length_size
= 12;
8078 initial_length_size
= 4;
8081 compunit
.cu_version
= byte_get (hdrptr
, 2);
8084 /* Apply addends of RELA relocations. */
8085 for (relsec
= section_headers
;
8086 relsec
< section_headers
+ elf_header
.e_shnum
;
8089 unsigned long nrelas
;
8090 Elf_Internal_Rela
*rela
, *rp
;
8091 Elf_Internal_Shdr
*symsec
;
8092 Elf_Internal_Sym
*symtab
;
8093 Elf_Internal_Sym
*sym
;
8095 if (relsec
->sh_type
!= SHT_RELA
8096 || SECTION_HEADER (relsec
->sh_info
) != section
8097 || relsec
->sh_size
== 0)
8100 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
8104 symsec
= SECTION_HEADER (relsec
->sh_link
);
8105 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
8107 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
8111 if (rp
->r_offset
>= (bfd_vma
) (hdrptr
- section_begin
)
8112 && section
->sh_size
> (bfd_vma
) offset_size
8113 && rp
->r_offset
<= section
->sh_size
- offset_size
)
8114 loc
= section_begin
+ rp
->r_offset
;
8120 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
8122 if (ELF32_R_SYM (rp
->r_info
) != 0
8123 && ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
8125 warn (_("Skipping unexpected symbol type %u\n"),
8126 ELF32_ST_TYPE (sym
->st_info
));
8132 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
8134 if (ELF64_R_SYM (rp
->r_info
) != 0
8135 && ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
8137 warn (_("Skipping unexpected symbol type %u\n"),
8138 ELF64_ST_TYPE (sym
->st_info
));
8143 byte_put (loc
, rp
->r_addend
, offset_size
);
8150 cu_abbrev_offset_ptr
= hdrptr
;
8151 compunit
.cu_abbrev_offset
= byte_get (hdrptr
, offset_size
);
8152 hdrptr
+= offset_size
;
8154 compunit
.cu_pointer_size
= byte_get (hdrptr
, 1);
8158 cu_offset
= start
- section_begin
;
8159 start
+= compunit
.cu_length
+ initial_length_size
;
8161 printf (_(" Compilation Unit @ %lx:\n"), cu_offset
);
8162 printf (_(" Length: %ld\n"), compunit
.cu_length
);
8163 printf (_(" Version: %d\n"), compunit
.cu_version
);
8164 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
8165 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
8167 if (compunit
.cu_version
!= 2 && compunit
.cu_version
!= 3)
8169 warn (_("Only version 2 and 3 DWARF debug information is currently supported.\n"));
8175 /* Read in the abbrevs used by this compilation unit. */
8177 Elf_Internal_Shdr
*sec
;
8178 unsigned char *begin
;
8180 /* Locate the .debug_abbrev section and process it. */
8181 for (i
= 0, sec
= section_headers
;
8182 i
< elf_header
.e_shnum
;
8184 if (strcmp (SECTION_NAME (sec
), ".debug_abbrev") == 0)
8187 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
8189 warn (_("Unable to locate .debug_abbrev section!\n"));
8193 begin
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
8194 _("debug_abbrev section data"));
8198 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
8199 begin
+ sec
->sh_size
);
8205 while (tags
< start
)
8208 unsigned long abbrev_number
;
8209 abbrev_entry
*entry
;
8212 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
8215 /* A null DIE marks the end of a list of children. */
8216 if (abbrev_number
== 0)
8222 /* Scan through the abbreviation list until we reach the
8224 for (entry
= first_abbrev
;
8225 entry
&& entry
->entry
!= abbrev_number
;
8226 entry
= entry
->next
)
8231 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
8236 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
8238 (unsigned long) (tags
- section_begin
- bytes_read
),
8240 get_TAG_name (entry
->tag
));
8242 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
8243 tags
= read_and_display_attr (attr
->attribute
,
8246 compunit
.cu_pointer_size
,
8248 compunit
.cu_version
);
8250 if (entry
->children
)
8264 display_debug_aranges (Elf_Internal_Shdr
*section
,
8265 unsigned char *start
,
8266 FILE *file ATTRIBUTE_UNUSED
)
8268 unsigned char *end
= start
+ section
->sh_size
;
8270 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
8274 unsigned char *hdrptr
;
8275 DWARF2_Internal_ARange arange
;
8276 unsigned char *ranges
;
8277 unsigned long length
;
8278 unsigned long address
;
8281 int initial_length_size
;
8285 arange
.ar_length
= byte_get (hdrptr
, 4);
8288 if (arange
.ar_length
== 0xffffffff)
8290 arange
.ar_length
= byte_get (hdrptr
, 8);
8293 initial_length_size
= 12;
8298 initial_length_size
= 4;
8301 arange
.ar_version
= byte_get (hdrptr
, 2);
8304 arange
.ar_info_offset
= byte_get (hdrptr
, offset_size
);
8305 hdrptr
+= offset_size
;
8307 arange
.ar_pointer_size
= byte_get (hdrptr
, 1);
8310 arange
.ar_segment_size
= byte_get (hdrptr
, 1);
8313 if (arange
.ar_version
!= 2 && arange
.ar_version
!= 3)
8315 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
8319 printf (_(" Length: %ld\n"), arange
.ar_length
);
8320 printf (_(" Version: %d\n"), arange
.ar_version
);
8321 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
8322 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
8323 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
8325 printf (_("\n Address Length\n"));
8329 /* Must pad to an alignment boundary that is twice the pointer size. */
8330 excess
= (hdrptr
- start
) % (2 * arange
.ar_pointer_size
);
8332 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
8336 address
= byte_get (ranges
, arange
.ar_pointer_size
);
8338 ranges
+= arange
.ar_pointer_size
;
8340 length
= byte_get (ranges
, arange
.ar_pointer_size
);
8342 ranges
+= arange
.ar_pointer_size
;
8344 /* A pair of zeros marks the end of the list. */
8345 if (address
== 0 && length
== 0)
8348 printf (" %8.8lx %lu\n", address
, length
);
8351 start
+= arange
.ar_length
+ initial_length_size
;
8359 typedef struct Frame_Chunk
8361 struct Frame_Chunk
*next
;
8362 unsigned char *chunk_start
;
8364 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
8365 short int *col_type
;
8368 unsigned int code_factor
;
8370 unsigned long pc_begin
;
8371 unsigned long pc_range
;
8375 unsigned char fde_encoding
;
8376 unsigned char cfa_exp
;
8380 /* A marker for a col_type that means this column was never referenced
8381 in the frame info. */
8382 #define DW_CFA_unreferenced (-1)
8385 frame_need_space (Frame_Chunk
*fc
, int reg
)
8387 int prev
= fc
->ncols
;
8389 if (reg
< fc
->ncols
)
8392 fc
->ncols
= reg
+ 1;
8393 fc
->col_type
= xrealloc (fc
->col_type
, fc
->ncols
* sizeof (short int));
8394 fc
->col_offset
= xrealloc (fc
->col_offset
, fc
->ncols
* sizeof (int));
8396 while (prev
< fc
->ncols
)
8398 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
8399 fc
->col_offset
[prev
] = 0;
8405 frame_display_row (Frame_Chunk
*fc
, int *need_col_headers
, int *max_regs
)
8410 if (*max_regs
< fc
->ncols
)
8411 *max_regs
= fc
->ncols
;
8413 if (*need_col_headers
)
8415 *need_col_headers
= 0;
8417 printf (" LOC CFA ");
8419 for (r
= 0; r
< *max_regs
; r
++)
8420 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
8425 printf ("r%-4d", r
);
8431 printf ("%08lx ", fc
->pc_begin
);
8433 strcpy (tmp
, "exp");
8435 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
8436 printf ("%-8s ", tmp
);
8438 for (r
= 0; r
< fc
->ncols
; r
++)
8440 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
8442 switch (fc
->col_type
[r
])
8444 case DW_CFA_undefined
:
8447 case DW_CFA_same_value
:
8451 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
8453 case DW_CFA_register
:
8454 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
8456 case DW_CFA_expression
:
8457 strcpy (tmp
, "exp");
8460 strcpy (tmp
, "n/a");
8463 printf ("%-5s", tmp
);
8470 size_of_encoded_value (int encoding
)
8472 switch (encoding
& 0x7)
8475 case 0: return is_32bit_elf
? 4 : 8;
8483 get_encoded_value (unsigned char *data
, int encoding
)
8485 int size
= size_of_encoded_value (encoding
);
8486 if (encoding
& DW_EH_PE_signed
)
8487 return byte_get_signed (data
, size
);
8489 return byte_get (data
, size
);
8492 #define GET(N) byte_get (start, N); start += N
8493 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
8494 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
8497 display_debug_frames (Elf_Internal_Shdr
*section
,
8498 unsigned char *start
,
8499 FILE *file ATTRIBUTE_UNUSED
)
8501 unsigned char *end
= start
+ section
->sh_size
;
8502 unsigned char *section_start
= start
;
8503 Frame_Chunk
*chunks
= 0;
8504 Frame_Chunk
*remembered_state
= 0;
8506 int is_eh
= (strcmp (SECTION_NAME (section
), ".eh_frame") == 0);
8509 int addr_size
= is_32bit_elf
? 4 : 8;
8511 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
8515 unsigned char *saved_start
;
8516 unsigned char *block_end
;
8517 unsigned long length
;
8518 unsigned long cie_id
;
8521 int need_col_headers
= 1;
8522 unsigned char *augmentation_data
= NULL
;
8523 unsigned long augmentation_data_len
= 0;
8524 int encoded_ptr_size
= addr_size
;
8526 int initial_length_size
;
8528 saved_start
= start
;
8529 length
= byte_get (start
, 4); start
+= 4;
8533 printf ("\n%08lx ZERO terminator\n\n",
8534 (unsigned long)(saved_start
- section_start
));
8538 if (length
== 0xffffffff)
8540 length
= byte_get (start
, 8);
8543 initial_length_size
= 12;
8548 initial_length_size
= 4;
8551 block_end
= saved_start
+ length
+ initial_length_size
;
8552 cie_id
= byte_get (start
, offset_size
); start
+= offset_size
;
8554 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
8558 fc
= xmalloc (sizeof (Frame_Chunk
));
8559 memset (fc
, 0, sizeof (Frame_Chunk
));
8563 fc
->chunk_start
= saved_start
;
8565 fc
->col_type
= xmalloc (sizeof (short int));
8566 fc
->col_offset
= xmalloc (sizeof (int));
8567 frame_need_space (fc
, max_regs
-1);
8571 fc
->augmentation
= start
;
8572 start
= strchr (start
, '\0') + 1;
8574 if (fc
->augmentation
[0] == 'z')
8576 fc
->code_factor
= LEB ();
8577 fc
->data_factor
= SLEB ();
8578 fc
->ra
= byte_get (start
, 1); start
+= 1;
8579 augmentation_data_len
= LEB ();
8580 augmentation_data
= start
;
8581 start
+= augmentation_data_len
;
8583 else if (strcmp (fc
->augmentation
, "eh") == 0)
8586 fc
->code_factor
= LEB ();
8587 fc
->data_factor
= SLEB ();
8588 fc
->ra
= byte_get (start
, 1); start
+= 1;
8592 fc
->code_factor
= LEB ();
8593 fc
->data_factor
= SLEB ();
8594 fc
->ra
= byte_get (start
, 1); start
+= 1;
8598 if (do_debug_frames_interp
)
8599 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
8600 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
8601 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
8605 printf ("\n%08lx %08lx %08lx CIE\n",
8606 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
8607 printf (" Version: %d\n", version
);
8608 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
8609 printf (" Code alignment factor: %u\n", fc
->code_factor
);
8610 printf (" Data alignment factor: %d\n", fc
->data_factor
);
8611 printf (" Return address column: %d\n", fc
->ra
);
8613 if (augmentation_data_len
)
8616 printf (" Augmentation data: ");
8617 for (i
= 0; i
< augmentation_data_len
; ++i
)
8618 printf (" %02x", augmentation_data
[i
]);
8624 if (augmentation_data_len
)
8626 unsigned char *p
, *q
;
8627 p
= fc
->augmentation
+ 1;
8628 q
= augmentation_data
;
8635 q
+= 1 + size_of_encoded_value (*q
);
8637 fc
->fde_encoding
= *q
++;
8643 if (fc
->fde_encoding
)
8644 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
8647 frame_need_space (fc
, fc
->ra
);
8651 unsigned char *look_for
;
8652 static Frame_Chunk fde_fc
;
8655 memset (fc
, 0, sizeof (Frame_Chunk
));
8657 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
8659 for (cie
= chunks
; cie
; cie
= cie
->next
)
8660 if (cie
->chunk_start
== look_for
)
8665 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
8666 cie_id
, saved_start
);
8669 fc
->col_type
= xmalloc (sizeof (short int));
8670 fc
->col_offset
= xmalloc (sizeof (int));
8671 frame_need_space (fc
, max_regs
- 1);
8673 fc
->augmentation
= "";
8674 fc
->fde_encoding
= 0;
8678 fc
->ncols
= cie
->ncols
;
8679 fc
->col_type
= xmalloc (fc
->ncols
* sizeof (short int));
8680 fc
->col_offset
= xmalloc (fc
->ncols
* sizeof (int));
8681 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
8682 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
8683 fc
->augmentation
= cie
->augmentation
;
8684 fc
->code_factor
= cie
->code_factor
;
8685 fc
->data_factor
= cie
->data_factor
;
8686 fc
->cfa_reg
= cie
->cfa_reg
;
8687 fc
->cfa_offset
= cie
->cfa_offset
;
8689 frame_need_space (fc
, max_regs
-1);
8690 fc
->fde_encoding
= cie
->fde_encoding
;
8693 if (fc
->fde_encoding
)
8694 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
8696 fc
->pc_begin
= get_encoded_value (start
, fc
->fde_encoding
);
8697 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
)
8698 fc
->pc_begin
+= section
->sh_addr
+ (start
- section_start
);
8699 start
+= encoded_ptr_size
;
8700 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
8701 start
+= encoded_ptr_size
;
8703 if (cie
->augmentation
[0] == 'z')
8705 augmentation_data_len
= LEB ();
8706 augmentation_data
= start
;
8707 start
+= augmentation_data_len
;
8710 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
8711 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
8712 (unsigned long)(cie
->chunk_start
- section_start
),
8713 fc
->pc_begin
, fc
->pc_begin
+ fc
->pc_range
);
8714 if (! do_debug_frames_interp
&& augmentation_data_len
)
8717 printf (" Augmentation data: ");
8718 for (i
= 0; i
< augmentation_data_len
; ++i
)
8719 printf (" %02x", augmentation_data
[i
]);
8725 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8726 about to interpret instructions for the chunk. */
8727 /* ??? At present we need to do this always, since this sizes the
8728 fc->col_type and fc->col_offset arrays, which we write into always.
8729 We should probably split the interpreted and non-interpreted bits
8730 into two different routines, since there's so much that doesn't
8731 really overlap between them. */
8732 if (1 || do_debug_frames_interp
)
8734 /* Start by making a pass over the chunk, allocating storage
8735 and taking note of what registers are used. */
8736 unsigned char *tmp
= start
;
8738 while (start
< block_end
)
8741 unsigned long reg
, tmp
;
8748 /* Warning: if you add any more cases to this switch, be
8749 sure to add them to the corresponding switch below. */
8752 case DW_CFA_advance_loc
:
8756 frame_need_space (fc
, opa
);
8757 fc
->col_type
[opa
] = DW_CFA_undefined
;
8759 case DW_CFA_restore
:
8760 frame_need_space (fc
, opa
);
8761 fc
->col_type
[opa
] = DW_CFA_undefined
;
8763 case DW_CFA_set_loc
:
8764 start
+= encoded_ptr_size
;
8766 case DW_CFA_advance_loc1
:
8769 case DW_CFA_advance_loc2
:
8772 case DW_CFA_advance_loc4
:
8775 case DW_CFA_offset_extended
:
8776 reg
= LEB (); LEB ();
8777 frame_need_space (fc
, reg
);
8778 fc
->col_type
[reg
] = DW_CFA_undefined
;
8780 case DW_CFA_restore_extended
:
8782 frame_need_space (fc
, reg
);
8783 fc
->col_type
[reg
] = DW_CFA_undefined
;
8785 case DW_CFA_undefined
:
8787 frame_need_space (fc
, reg
);
8788 fc
->col_type
[reg
] = DW_CFA_undefined
;
8790 case DW_CFA_same_value
:
8792 frame_need_space (fc
, reg
);
8793 fc
->col_type
[reg
] = DW_CFA_undefined
;
8795 case DW_CFA_register
:
8796 reg
= LEB (); LEB ();
8797 frame_need_space (fc
, reg
);
8798 fc
->col_type
[reg
] = DW_CFA_undefined
;
8800 case DW_CFA_def_cfa
:
8803 case DW_CFA_def_cfa_register
:
8806 case DW_CFA_def_cfa_offset
:
8809 case DW_CFA_def_cfa_expression
:
8813 case DW_CFA_expression
:
8817 frame_need_space (fc
, reg
);
8818 fc
->col_type
[reg
] = DW_CFA_undefined
;
8820 case DW_CFA_offset_extended_sf
:
8821 reg
= LEB (); SLEB ();
8822 frame_need_space (fc
, reg
);
8823 fc
->col_type
[reg
] = DW_CFA_undefined
;
8825 case DW_CFA_def_cfa_sf
:
8828 case DW_CFA_def_cfa_offset_sf
:
8831 case DW_CFA_MIPS_advance_loc8
:
8834 case DW_CFA_GNU_args_size
:
8837 case DW_CFA_GNU_negative_offset_extended
:
8838 reg
= LEB (); LEB ();
8839 frame_need_space (fc
, reg
);
8840 fc
->col_type
[reg
] = DW_CFA_undefined
;
8849 /* Now we know what registers are used, make a second pass over
8850 the chunk, this time actually printing out the info. */
8852 while (start
< block_end
)
8855 unsigned long ul
, reg
, roffs
;
8864 /* Warning: if you add any more cases to this switch, be
8865 sure to add them to the corresponding switch above. */
8868 case DW_CFA_advance_loc
:
8869 if (do_debug_frames_interp
)
8870 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8872 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8873 opa
* fc
->code_factor
,
8874 fc
->pc_begin
+ opa
* fc
->code_factor
);
8875 fc
->pc_begin
+= opa
* fc
->code_factor
;
8880 if (! do_debug_frames_interp
)
8881 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8882 opa
, roffs
* fc
->data_factor
);
8883 fc
->col_type
[opa
] = DW_CFA_offset
;
8884 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
8887 case DW_CFA_restore
:
8888 if (! do_debug_frames_interp
)
8889 printf (" DW_CFA_restore: r%d\n", opa
);
8890 fc
->col_type
[opa
] = cie
->col_type
[opa
];
8891 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
8894 case DW_CFA_set_loc
:
8895 vma
= get_encoded_value (start
, fc
->fde_encoding
);
8896 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
)
8897 vma
+= section
->sh_addr
+ (start
- section_start
);
8898 start
+= encoded_ptr_size
;
8899 if (do_debug_frames_interp
)
8900 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8902 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
8906 case DW_CFA_advance_loc1
:
8907 ofs
= byte_get (start
, 1); start
+= 1;
8908 if (do_debug_frames_interp
)
8909 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8911 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8912 ofs
* fc
->code_factor
,
8913 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8914 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8917 case DW_CFA_advance_loc2
:
8918 ofs
= byte_get (start
, 2); start
+= 2;
8919 if (do_debug_frames_interp
)
8920 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8922 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8923 ofs
* fc
->code_factor
,
8924 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8925 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8928 case DW_CFA_advance_loc4
:
8929 ofs
= byte_get (start
, 4); start
+= 4;
8930 if (do_debug_frames_interp
)
8931 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8933 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8934 ofs
* fc
->code_factor
,
8935 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8936 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8939 case DW_CFA_offset_extended
:
8942 if (! do_debug_frames_interp
)
8943 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8944 reg
, roffs
* fc
->data_factor
);
8945 fc
->col_type
[reg
] = DW_CFA_offset
;
8946 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
8949 case DW_CFA_restore_extended
:
8951 if (! do_debug_frames_interp
)
8952 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
8953 fc
->col_type
[reg
] = cie
->col_type
[reg
];
8954 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
8957 case DW_CFA_undefined
:
8959 if (! do_debug_frames_interp
)
8960 printf (" DW_CFA_undefined: r%ld\n", reg
);
8961 fc
->col_type
[reg
] = DW_CFA_undefined
;
8962 fc
->col_offset
[reg
] = 0;
8965 case DW_CFA_same_value
:
8967 if (! do_debug_frames_interp
)
8968 printf (" DW_CFA_same_value: r%ld\n", reg
);
8969 fc
->col_type
[reg
] = DW_CFA_same_value
;
8970 fc
->col_offset
[reg
] = 0;
8973 case DW_CFA_register
:
8976 if (! do_debug_frames_interp
)
8977 printf (" DW_CFA_register: r%ld in r%ld\n", reg
, roffs
);
8978 fc
->col_type
[reg
] = DW_CFA_register
;
8979 fc
->col_offset
[reg
] = roffs
;
8982 case DW_CFA_remember_state
:
8983 if (! do_debug_frames_interp
)
8984 printf (" DW_CFA_remember_state\n");
8985 rs
= xmalloc (sizeof (Frame_Chunk
));
8986 rs
->ncols
= fc
->ncols
;
8987 rs
->col_type
= xmalloc (rs
->ncols
* sizeof (short int));
8988 rs
->col_offset
= xmalloc (rs
->ncols
* sizeof (int));
8989 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
8990 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
8991 rs
->next
= remembered_state
;
8992 remembered_state
= rs
;
8995 case DW_CFA_restore_state
:
8996 if (! do_debug_frames_interp
)
8997 printf (" DW_CFA_restore_state\n");
8998 rs
= remembered_state
;
8999 remembered_state
= rs
->next
;
9000 frame_need_space (fc
, rs
->ncols
-1);
9001 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
9002 memcpy (fc
->col_offset
, rs
->col_offset
, rs
->ncols
* sizeof (int));
9003 free (rs
->col_type
);
9004 free (rs
->col_offset
);
9008 case DW_CFA_def_cfa
:
9009 fc
->cfa_reg
= LEB ();
9010 fc
->cfa_offset
= LEB ();
9012 if (! do_debug_frames_interp
)
9013 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
9014 fc
->cfa_reg
, fc
->cfa_offset
);
9017 case DW_CFA_def_cfa_register
:
9018 fc
->cfa_reg
= LEB ();
9020 if (! do_debug_frames_interp
)
9021 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
9024 case DW_CFA_def_cfa_offset
:
9025 fc
->cfa_offset
= LEB ();
9026 if (! do_debug_frames_interp
)
9027 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
9031 if (! do_debug_frames_interp
)
9032 printf (" DW_CFA_nop\n");
9035 case DW_CFA_def_cfa_expression
:
9037 if (! do_debug_frames_interp
)
9039 printf (" DW_CFA_def_cfa_expression (");
9040 decode_location_expression (start
, addr_size
, ul
);
9047 case DW_CFA_expression
:
9050 if (! do_debug_frames_interp
)
9052 printf (" DW_CFA_expression: r%ld (", reg
);
9053 decode_location_expression (start
, addr_size
, ul
);
9056 fc
->col_type
[reg
] = DW_CFA_expression
;
9060 case DW_CFA_offset_extended_sf
:
9063 frame_need_space (fc
, reg
);
9064 if (! do_debug_frames_interp
)
9065 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
9066 reg
, l
* fc
->data_factor
);
9067 fc
->col_type
[reg
] = DW_CFA_offset
;
9068 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
9071 case DW_CFA_def_cfa_sf
:
9072 fc
->cfa_reg
= LEB ();
9073 fc
->cfa_offset
= SLEB ();
9075 if (! do_debug_frames_interp
)
9076 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
9077 fc
->cfa_reg
, fc
->cfa_offset
);
9080 case DW_CFA_def_cfa_offset_sf
:
9081 fc
->cfa_offset
= SLEB ();
9082 if (! do_debug_frames_interp
)
9083 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc
->cfa_offset
);
9086 case DW_CFA_MIPS_advance_loc8
:
9087 ofs
= byte_get (start
, 8); start
+= 8;
9088 if (do_debug_frames_interp
)
9089 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9091 printf (" DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
9092 ofs
* fc
->code_factor
,
9093 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9094 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9097 case DW_CFA_GNU_window_save
:
9098 if (! do_debug_frames_interp
)
9099 printf (" DW_CFA_GNU_window_save\n");
9102 case DW_CFA_GNU_args_size
:
9104 if (! do_debug_frames_interp
)
9105 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
9108 case DW_CFA_GNU_negative_offset_extended
:
9111 frame_need_space (fc
, reg
);
9112 if (! do_debug_frames_interp
)
9113 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
9114 reg
, l
* fc
->data_factor
);
9115 fc
->col_type
[reg
] = DW_CFA_offset
;
9116 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
9120 fprintf (stderr
, "unsupported or unknown DW_CFA_%d\n", op
);
9125 if (do_debug_frames_interp
)
9126 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9141 display_debug_not_supported (Elf_Internal_Shdr
*section
,
9142 unsigned char *start ATTRIBUTE_UNUSED
,
9143 FILE *file ATTRIBUTE_UNUSED
)
9145 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
9146 SECTION_NAME (section
));
9151 /* Pre-scan the .debug_info section to record the size of address.
9152 When dumping the .debug_line, we use that size information, assuming
9153 that all compilation units have the same address size. */
9155 prescan_debug_info (Elf_Internal_Shdr
*section ATTRIBUTE_UNUSED
,
9156 unsigned char *start
,
9157 FILE *file ATTRIBUTE_UNUSED
)
9159 unsigned long length
;
9161 /* Read the first 4 bytes. For a 32-bit DWARF section, this will
9162 be the length. For a 64-bit DWARF section, it'll be the escape
9163 code 0xffffffff followed by an 8 byte length. For the purposes
9164 of this prescan, we don't care about the actual length, but the
9165 presence of the escape bytes does affect the location of the byte
9166 which describes the address size. */
9167 length
= byte_get (start
, 4);
9169 if (length
== 0xffffffff)
9171 /* For 64-bit DWARF, the 1-byte address_size field is 22 bytes
9172 from the start of the section. This is computed as follows:
9174 unit_length: 12 bytes
9176 debug_abbrev_offset: 8 bytes
9177 -----------------------------
9180 debug_line_pointer_size
= byte_get (start
+ 22, 1);
9184 /* For 32-bit DWARF, the 1-byte address_size field is 10 bytes from
9185 the start of the section:
9186 unit_length: 4 bytes
9188 debug_abbrev_offset: 4 bytes
9189 -----------------------------
9192 debug_line_pointer_size
= byte_get (start
+ 10, 1);
9197 /* A structure containing the name of a debug section and a pointer
9198 to a function that can decode it. The third field is a prescan
9199 function to be run over the section before displaying any of the
9203 const char *const name
;
9204 int (*display
) (Elf_Internal_Shdr
*, unsigned char *, FILE *);
9205 int (*prescan
) (Elf_Internal_Shdr
*, unsigned char *, FILE *);
9209 { ".debug_abbrev", display_debug_abbrev
, NULL
},
9210 { ".debug_aranges", display_debug_aranges
, NULL
},
9211 { ".debug_frame", display_debug_frames
, NULL
},
9212 { ".debug_info", display_debug_info
, prescan_debug_info
},
9213 { ".debug_line", display_debug_lines
, NULL
},
9214 { ".debug_pubnames", display_debug_pubnames
, NULL
},
9215 { ".eh_frame", display_debug_frames
, NULL
},
9216 { ".debug_macinfo", display_debug_macinfo
, NULL
},
9217 { ".debug_str", display_debug_str
, NULL
},
9218 { ".debug_loc", display_debug_loc
, NULL
},
9219 { ".debug_pubtypes", display_debug_not_supported
, NULL
},
9220 { ".debug_ranges", display_debug_not_supported
, NULL
},
9221 { ".debug_static_func", display_debug_not_supported
, NULL
},
9222 { ".debug_static_vars", display_debug_not_supported
, NULL
},
9223 { ".debug_types", display_debug_not_supported
, NULL
},
9224 { ".debug_weaknames", display_debug_not_supported
, NULL
}
9228 display_debug_section (Elf_Internal_Shdr
*section
, FILE *file
)
9230 char *name
= SECTION_NAME (section
);
9231 bfd_size_type length
;
9232 unsigned char *start
;
9235 length
= section
->sh_size
;
9238 printf (_("\nSection '%s' has no debugging data.\n"), name
);
9242 start
= get_data (NULL
, file
, section
->sh_offset
, length
,
9243 _("debug section data"));
9247 /* See if we know how to display the contents of this section. */
9248 if (strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
9249 name
= ".debug_info";
9251 for (i
= NUM_ELEM (debug_displays
); i
--;)
9252 if (strcmp (debug_displays
[i
].name
, name
) == 0)
9254 debug_displays
[i
].display (section
, start
, file
);
9259 printf (_("Unrecognized debug section: %s\n"), name
);
9263 /* If we loaded in the abbrev section at some point,
9264 we must release it here. */
9271 process_section_contents (FILE *file
)
9273 Elf_Internal_Shdr
*section
;
9279 /* Pre-scan the debug sections to find some debug information not
9280 present in some of them. For the .debug_line, we must find out the
9281 size of address (specified in .debug_info and .debug_aranges). */
9282 for (i
= 0, section
= section_headers
;
9283 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
9286 char *name
= SECTION_NAME (section
);
9289 if (section
->sh_size
== 0)
9292 /* See if there is some pre-scan operation for this section. */
9293 for (j
= NUM_ELEM (debug_displays
); j
--;)
9294 if (strcmp (debug_displays
[j
].name
, name
) == 0)
9296 if (debug_displays
[j
].prescan
!= NULL
)
9298 bfd_size_type length
;
9299 unsigned char *start
;
9301 length
= section
->sh_size
;
9302 start
= get_data (NULL
, file
, section
->sh_offset
, length
,
9303 _("debug section data"));
9307 debug_displays
[j
].prescan (section
, start
, file
);
9315 for (i
= 0, section
= section_headers
;
9316 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
9319 #ifdef SUPPORT_DISASSEMBLY
9320 if (dump_sects
[i
] & DISASS_DUMP
)
9321 disassemble_section (section
, file
);
9323 if (dump_sects
[i
] & HEX_DUMP
)
9324 dump_section (section
, file
);
9326 if (dump_sects
[i
] & DEBUG_DUMP
)
9327 display_debug_section (section
, file
);
9330 if (i
< num_dump_sects
)
9331 warn (_("Some sections were not dumped because they do not exist!\n"));
9337 process_mips_fpe_exception (int mask
)
9342 if (mask
& OEX_FPU_INEX
)
9343 fputs ("INEX", stdout
), first
= 0;
9344 if (mask
& OEX_FPU_UFLO
)
9345 printf ("%sUFLO", first
? "" : "|"), first
= 0;
9346 if (mask
& OEX_FPU_OFLO
)
9347 printf ("%sOFLO", first
? "" : "|"), first
= 0;
9348 if (mask
& OEX_FPU_DIV0
)
9349 printf ("%sDIV0", first
? "" : "|"), first
= 0;
9350 if (mask
& OEX_FPU_INVAL
)
9351 printf ("%sINVAL", first
? "" : "|");
9354 fputs ("0", stdout
);
9358 process_mips_specific (FILE *file
)
9360 Elf_Internal_Dyn
*entry
;
9361 size_t liblist_offset
= 0;
9362 size_t liblistno
= 0;
9363 size_t conflictsno
= 0;
9364 size_t options_offset
= 0;
9365 size_t conflicts_offset
= 0;
9367 /* We have a lot of special sections. Thanks SGI! */
9368 if (dynamic_segment
== NULL
)
9369 /* No information available. */
9372 for (entry
= dynamic_segment
; entry
->d_tag
!= DT_NULL
; ++entry
)
9373 switch (entry
->d_tag
)
9375 case DT_MIPS_LIBLIST
:
9377 = offset_from_vma (file
, entry
->d_un
.d_val
,
9378 liblistno
* sizeof (Elf32_External_Lib
));
9380 case DT_MIPS_LIBLISTNO
:
9381 liblistno
= entry
->d_un
.d_val
;
9383 case DT_MIPS_OPTIONS
:
9384 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
9386 case DT_MIPS_CONFLICT
:
9388 = offset_from_vma (file
, entry
->d_un
.d_val
,
9389 conflictsno
* sizeof (Elf32_External_Conflict
));
9391 case DT_MIPS_CONFLICTNO
:
9392 conflictsno
= entry
->d_un
.d_val
;
9398 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
9400 Elf32_External_Lib
*elib
;
9403 elib
= get_data (NULL
, file
, liblist_offset
,
9404 liblistno
* sizeof (Elf32_External_Lib
),
9408 printf ("\nSection '.liblist' contains %lu entries:\n",
9409 (unsigned long) liblistno
);
9410 fputs (" Library Time Stamp Checksum Version Flags\n",
9413 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
9420 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9421 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9422 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9423 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9424 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9426 tmp
= gmtime (&time
);
9427 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
9428 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9429 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9431 printf ("%3lu: ", (unsigned long) cnt
);
9432 print_symbol (20, dynamic_strings
+ liblist
.l_name
);
9433 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
9436 if (liblist
.l_flags
== 0)
9447 { " EXACT_MATCH", LL_EXACT_MATCH
},
9448 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
9449 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
9450 { " EXPORTS", LL_EXPORTS
},
9451 { " DELAY_LOAD", LL_DELAY_LOAD
},
9452 { " DELTA", LL_DELTA
}
9454 int flags
= liblist
.l_flags
;
9458 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
9460 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
9462 fputs (l_flags_vals
[fcnt
].name
, stdout
);
9463 flags
^= l_flags_vals
[fcnt
].bit
;
9466 printf (" %#x", (unsigned int) flags
);
9476 if (options_offset
!= 0)
9478 Elf_External_Options
*eopt
;
9479 Elf_Internal_Shdr
*sect
= section_headers
;
9480 Elf_Internal_Options
*iopt
;
9481 Elf_Internal_Options
*option
;
9485 /* Find the section header so that we get the size. */
9486 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
9489 eopt
= get_data (NULL
, file
, options_offset
, sect
->sh_size
,
9493 iopt
= malloc ((sect
->sh_size
/ sizeof (eopt
)) * sizeof (*iopt
));
9496 error (_("Out of memory"));
9503 while (offset
< sect
->sh_size
)
9505 Elf_External_Options
*eoption
;
9507 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
9509 option
->kind
= BYTE_GET (eoption
->kind
);
9510 option
->size
= BYTE_GET (eoption
->size
);
9511 option
->section
= BYTE_GET (eoption
->section
);
9512 option
->info
= BYTE_GET (eoption
->info
);
9514 offset
+= option
->size
;
9520 printf (_("\nSection '%s' contains %d entries:\n"),
9521 SECTION_NAME (sect
), cnt
);
9529 switch (option
->kind
)
9532 /* This shouldn't happen. */
9533 printf (" NULL %d %lx", option
->section
, option
->info
);
9536 printf (" REGINFO ");
9537 if (elf_header
.e_machine
== EM_MIPS
)
9540 Elf32_External_RegInfo
*ereg
;
9541 Elf32_RegInfo reginfo
;
9543 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
9544 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9545 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9546 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9547 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9548 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9549 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9551 printf ("GPR %08lx GP 0x%lx\n",
9553 (unsigned long) reginfo
.ri_gp_value
);
9554 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9555 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9556 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9561 Elf64_External_RegInfo
*ereg
;
9562 Elf64_Internal_RegInfo reginfo
;
9564 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
9565 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9566 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9567 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9568 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9569 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9570 reginfo
.ri_gp_value
= BYTE_GET8 (ereg
->ri_gp_value
);
9572 printf ("GPR %08lx GP 0x",
9573 reginfo
.ri_gprmask
);
9574 printf_vma (reginfo
.ri_gp_value
);
9577 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9578 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9579 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9583 case ODK_EXCEPTIONS
:
9584 fputs (" EXCEPTIONS fpe_min(", stdout
);
9585 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
9586 fputs (") fpe_max(", stdout
);
9587 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
9588 fputs (")", stdout
);
9590 if (option
->info
& OEX_PAGE0
)
9591 fputs (" PAGE0", stdout
);
9592 if (option
->info
& OEX_SMM
)
9593 fputs (" SMM", stdout
);
9594 if (option
->info
& OEX_FPDBUG
)
9595 fputs (" FPDBUG", stdout
);
9596 if (option
->info
& OEX_DISMISS
)
9597 fputs (" DISMISS", stdout
);
9600 fputs (" PAD ", stdout
);
9601 if (option
->info
& OPAD_PREFIX
)
9602 fputs (" PREFIX", stdout
);
9603 if (option
->info
& OPAD_POSTFIX
)
9604 fputs (" POSTFIX", stdout
);
9605 if (option
->info
& OPAD_SYMBOL
)
9606 fputs (" SYMBOL", stdout
);
9609 fputs (" HWPATCH ", stdout
);
9610 if (option
->info
& OHW_R4KEOP
)
9611 fputs (" R4KEOP", stdout
);
9612 if (option
->info
& OHW_R8KPFETCH
)
9613 fputs (" R8KPFETCH", stdout
);
9614 if (option
->info
& OHW_R5KEOP
)
9615 fputs (" R5KEOP", stdout
);
9616 if (option
->info
& OHW_R5KCVTL
)
9617 fputs (" R5KCVTL", stdout
);
9620 fputs (" FILL ", stdout
);
9621 /* XXX Print content of info word? */
9624 fputs (" TAGS ", stdout
);
9625 /* XXX Print content of info word? */
9628 fputs (" HWAND ", stdout
);
9629 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9630 fputs (" R4KEOP_CHECKED", stdout
);
9631 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9632 fputs (" R4KEOP_CLEAN", stdout
);
9635 fputs (" HWOR ", stdout
);
9636 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9637 fputs (" R4KEOP_CHECKED", stdout
);
9638 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9639 fputs (" R4KEOP_CLEAN", stdout
);
9642 printf (" GP_GROUP %#06lx self-contained %#06lx",
9643 option
->info
& OGP_GROUP
,
9644 (option
->info
& OGP_SELF
) >> 16);
9647 printf (" IDENT %#06lx self-contained %#06lx",
9648 option
->info
& OGP_GROUP
,
9649 (option
->info
& OGP_SELF
) >> 16);
9652 /* This shouldn't happen. */
9653 printf (" %3d ??? %d %lx",
9654 option
->kind
, option
->section
, option
->info
);
9658 len
= sizeof (*eopt
);
9659 while (len
< option
->size
)
9660 if (((char *) option
)[len
] >= ' '
9661 && ((char *) option
)[len
] < 0x7f)
9662 printf ("%c", ((char *) option
)[len
++]);
9664 printf ("\\%03o", ((char *) option
)[len
++]);
9666 fputs ("\n", stdout
);
9674 if (conflicts_offset
!= 0 && conflictsno
!= 0)
9676 Elf32_Conflict
*iconf
;
9679 if (dynamic_symbols
== NULL
)
9681 error (_("conflict list found without a dynamic symbol table"));
9685 iconf
= malloc (conflictsno
* sizeof (*iconf
));
9688 error (_("Out of memory"));
9694 Elf32_External_Conflict
*econf32
;
9696 econf32
= get_data (NULL
, file
, conflicts_offset
,
9697 conflictsno
* sizeof (*econf32
), _("conflict"));
9701 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9702 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
9708 Elf64_External_Conflict
*econf64
;
9710 econf64
= get_data (NULL
, file
, conflicts_offset
,
9711 conflictsno
* sizeof (*econf64
), _("conflict"));
9715 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9716 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
9721 printf (_("\nSection '.conflict' contains %ld entries:\n"),
9722 (long) conflictsno
);
9723 puts (_(" Num: Index Value Name"));
9725 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9727 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
9729 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
9730 print_vma (psym
->st_value
, FULL_HEX
);
9732 print_symbol (25, dynamic_strings
+ psym
->st_name
);
9743 process_gnu_liblist (FILE *file
)
9745 Elf_Internal_Shdr
*section
, *string_sec
;
9746 Elf32_External_Lib
*elib
;
9754 for (i
= 0, section
= section_headers
;
9755 i
< elf_header
.e_shnum
;
9758 switch (section
->sh_type
)
9760 case SHT_GNU_LIBLIST
:
9761 elib
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
9766 string_sec
= SECTION_HEADER (section
->sh_link
);
9768 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
9769 string_sec
->sh_size
, _("liblist string table"));
9772 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
9778 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
9779 SECTION_NAME (section
),
9780 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
9782 puts (" Library Time Stamp Checksum Version Flags");
9784 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
9792 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9793 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9794 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9795 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9796 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9798 tmp
= gmtime (&time
);
9799 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
9800 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9801 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9803 printf ("%3lu: ", (unsigned long) cnt
);
9805 printf ("%-20s", strtab
+ liblist
.l_name
);
9807 printf ("%-20.20s", strtab
+ liblist
.l_name
);
9808 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
9809 liblist
.l_version
, liblist
.l_flags
);
9820 get_note_type (unsigned e_type
)
9822 static char buff
[64];
9826 case NT_PRSTATUS
: return _("NT_PRSTATUS (prstatus structure)");
9827 case NT_FPREGSET
: return _("NT_FPREGSET (floating point registers)");
9828 case NT_PRPSINFO
: return _("NT_PRPSINFO (prpsinfo structure)");
9829 case NT_TASKSTRUCT
: return _("NT_TASKSTRUCT (task structure)");
9830 case NT_PRXFPREG
: return _("NT_PRXFPREG (user_xfpregs structure)");
9831 case NT_PSTATUS
: return _("NT_PSTATUS (pstatus structure)");
9832 case NT_FPREGS
: return _("NT_FPREGS (floating point registers)");
9833 case NT_PSINFO
: return _("NT_PSINFO (psinfo structure)");
9834 case NT_LWPSTATUS
: return _("NT_LWPSTATUS (lwpstatus_t structure)");
9835 case NT_LWPSINFO
: return _("NT_LWPSINFO (lwpsinfo_t structure)");
9836 case NT_WIN32PSTATUS
: return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9838 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
9844 get_netbsd_elfcore_note_type (unsigned e_type
)
9846 static char buff
[64];
9848 if (e_type
== NT_NETBSDCORE_PROCINFO
)
9850 /* NetBSD core "procinfo" structure. */
9851 return _("NetBSD procinfo structure");
9854 /* As of Jan 2002 there are no other machine-independent notes
9855 defined for NetBSD core files. If the note type is less
9856 than the start of the machine-dependent note types, we don't
9859 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
9861 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
9865 switch (elf_header
.e_machine
)
9867 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
9868 and PT_GETFPREGS == mach+2. */
9873 case EM_SPARC32PLUS
:
9877 case NT_NETBSDCORE_FIRSTMACH
+0:
9878 return _("PT_GETREGS (reg structure)");
9879 case NT_NETBSDCORE_FIRSTMACH
+2:
9880 return _("PT_GETFPREGS (fpreg structure)");
9886 /* On all other arch's, PT_GETREGS == mach+1 and
9887 PT_GETFPREGS == mach+3. */
9891 case NT_NETBSDCORE_FIRSTMACH
+1:
9892 return _("PT_GETREGS (reg structure)");
9893 case NT_NETBSDCORE_FIRSTMACH
+3:
9894 return _("PT_GETFPREGS (fpreg structure)");
9900 sprintf (buff
, _("PT_FIRSTMACH+%d"), e_type
- NT_NETBSDCORE_FIRSTMACH
);
9904 /* Note that by the ELF standard, the name field is already null byte
9905 terminated, and namesz includes the terminating null byte.
9906 I.E. the value of namesz for the name "FSF" is 4.
9908 If the value of namesz is zero, there is no name present. */
9910 process_note (Elf_Internal_Note
*pnote
)
9914 if (pnote
->namesz
== 0)
9916 /* If there is no note name, then use the default set of
9917 note type strings. */
9918 nt
= get_note_type (pnote
->type
);
9920 else if (strncmp (pnote
->namedata
, "NetBSD-CORE", 11) == 0)
9922 /* NetBSD-specific core file notes. */
9923 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
9927 /* Don't recognize this note name; just use the default set of
9928 note type strings. */
9929 nt
= get_note_type (pnote
->type
);
9932 printf (" %s\t\t0x%08lx\t%s\n",
9933 pnote
->namesz
? pnote
->namedata
: "(NONE)",
9940 process_corefile_note_segment (FILE *file
, bfd_vma offset
, bfd_vma length
)
9942 Elf_External_Note
*pnotes
;
9943 Elf_External_Note
*external
;
9949 pnotes
= get_data (NULL
, file
, offset
, length
, _("notes"));
9955 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9956 (unsigned long) offset
, (unsigned long) length
);
9957 printf (_(" Owner\t\tData size\tDescription\n"));
9959 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
9961 Elf_External_Note
*next
;
9962 Elf_Internal_Note inote
;
9965 inote
.type
= BYTE_GET (external
->type
);
9966 inote
.namesz
= BYTE_GET (external
->namesz
);
9967 inote
.namedata
= external
->name
;
9968 inote
.descsz
= BYTE_GET (external
->descsz
);
9969 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
9970 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
9972 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
9974 if (((char *) next
) > (((char *) pnotes
) + length
))
9976 warn (_("corrupt note found at offset %x into core notes\n"),
9977 ((char *) external
) - ((char *) pnotes
));
9978 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
9979 inote
.type
, inote
.namesz
, inote
.descsz
);
9985 /* Verify that name is null terminated. It appears that at least
9986 one version of Linux (RedHat 6.0) generates corefiles that don't
9987 comply with the ELF spec by failing to include the null byte in
9989 if (inote
.namedata
[inote
.namesz
] != '\0')
9991 temp
= malloc (inote
.namesz
+ 1);
9995 error (_("Out of memory\n"));
10000 strncpy (temp
, inote
.namedata
, inote
.namesz
);
10001 temp
[inote
.namesz
] = 0;
10003 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
10004 inote
.namedata
= temp
;
10007 res
&= process_note (& inote
);
10022 process_corefile_note_segments (FILE *file
)
10024 Elf_Internal_Phdr
*segment
;
10028 if (! get_program_headers (file
))
10031 for (i
= 0, segment
= program_headers
;
10032 i
< elf_header
.e_phnum
;
10035 if (segment
->p_type
== PT_NOTE
)
10036 res
&= process_corefile_note_segment (file
,
10037 (bfd_vma
) segment
->p_offset
,
10038 (bfd_vma
) segment
->p_filesz
);
10045 process_corefile_contents (FILE *file
)
10047 /* If we have not been asked to display the notes then do nothing. */
10051 /* If file is not a core file then exit. */
10052 if (elf_header
.e_type
!= ET_CORE
)
10055 /* No program headers means no NOTE segment. */
10056 if (elf_header
.e_phnum
== 0)
10058 printf (_("No note segments present in the core file.\n"));
10062 return process_corefile_note_segments (file
);
10066 process_arch_specific (FILE *file
)
10071 switch (elf_header
.e_machine
)
10074 case EM_MIPS_RS3_LE
:
10075 return process_mips_specific (file
);
10084 get_file_header (FILE *file
)
10086 /* Read in the identity array. */
10087 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
10090 /* Determine how to read the rest of the header. */
10091 switch (elf_header
.e_ident
[EI_DATA
])
10093 default: /* fall through */
10094 case ELFDATANONE
: /* fall through */
10096 byte_get
= byte_get_little_endian
;
10097 byte_put
= byte_put_little_endian
;
10100 byte_get
= byte_get_big_endian
;
10101 byte_put
= byte_put_big_endian
;
10105 /* For now we only support 32 bit and 64 bit ELF files. */
10106 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
10108 /* Read in the rest of the header. */
10111 Elf32_External_Ehdr ehdr32
;
10113 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
10116 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
10117 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
10118 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
10119 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
10120 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
10121 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
10122 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
10123 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
10124 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
10125 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
10126 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
10127 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
10128 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
10132 Elf64_External_Ehdr ehdr64
;
10134 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10135 we will not be able to cope with the 64bit data found in
10136 64 ELF files. Detect this now and abort before we start
10137 overwritting things. */
10138 if (sizeof (bfd_vma
) < 8)
10140 error (_("This instance of readelf has been built without support for a\n\
10141 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10145 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
10148 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
10149 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
10150 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
10151 elf_header
.e_entry
= BYTE_GET8 (ehdr64
.e_entry
);
10152 elf_header
.e_phoff
= BYTE_GET8 (ehdr64
.e_phoff
);
10153 elf_header
.e_shoff
= BYTE_GET8 (ehdr64
.e_shoff
);
10154 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
10155 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
10156 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
10157 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
10158 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
10159 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
10160 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
10163 if (elf_header
.e_shoff
)
10165 /* There may be some extensions in the first section header. Don't
10166 bomb if we can't read it. */
10168 get_32bit_section_headers (file
, 1);
10170 get_64bit_section_headers (file
, 1);
10176 /* Process one ELF object file according to the command line options.
10177 This file may actually be stored in an archive. The file is
10178 positioned at the start of the ELF object. */
10181 process_object (char *file_name
, FILE *file
)
10185 if (! get_file_header (file
))
10187 error (_("%s: Failed to read file header\n"), file_name
);
10191 /* Initialise per file variables. */
10192 for (i
= NUM_ELEM (version_info
); i
--;)
10193 version_info
[i
] = 0;
10195 for (i
= NUM_ELEM (dynamic_info
); i
--;)
10196 dynamic_info
[i
] = 0;
10198 /* Process the file. */
10200 printf (_("\nFile: %s\n"), file_name
);
10202 if (! process_file_header ())
10205 if (! process_section_headers (file
))
10207 /* Without loaded section headers we
10208 cannot process lots of things. */
10209 do_unwind
= do_version
= do_dump
= do_arch
= 0;
10211 if (! do_using_dynamic
)
10212 do_syms
= do_reloc
= 0;
10215 if (process_program_headers (file
))
10216 process_dynamic_segment (file
);
10218 process_relocs (file
);
10220 process_unwind (file
);
10222 process_symbol_table (file
);
10224 process_syminfo (file
);
10226 process_version_sections (file
);
10228 process_section_contents (file
);
10230 process_corefile_contents (file
);
10232 process_gnu_liblist (file
);
10234 process_arch_specific (file
);
10236 if (program_headers
)
10238 free (program_headers
);
10239 program_headers
= NULL
;
10242 if (section_headers
)
10244 free (section_headers
);
10245 section_headers
= NULL
;
10250 free (string_table
);
10251 string_table
= NULL
;
10252 string_table_length
= 0;
10255 if (dynamic_strings
)
10257 free (dynamic_strings
);
10258 dynamic_strings
= NULL
;
10261 if (dynamic_symbols
)
10263 free (dynamic_symbols
);
10264 dynamic_symbols
= NULL
;
10265 num_dynamic_syms
= 0;
10268 if (dynamic_syminfo
)
10270 free (dynamic_syminfo
);
10271 dynamic_syminfo
= NULL
;
10277 /* Process an ELF archive. The file is positioned just after the
10281 process_archive (char *file_name
, FILE *file
)
10283 struct ar_hdr arhdr
;
10285 unsigned long size
;
10286 char *longnames
= NULL
;
10287 unsigned long longnames_size
= 0;
10288 size_t file_name_size
;
10293 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10294 if (got
!= sizeof arhdr
)
10299 error (_("%s: failed to read archive header\n"), file_name
);
10303 if (memcmp (arhdr
.ar_name
, "/ ", 16) == 0)
10305 /* This is the archive symbol table. Skip it.
10306 FIXME: We should have an option to dump it. */
10307 size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10308 if (fseek (file
, size
+ (size
& 1), SEEK_CUR
) != 0)
10310 error (_("%s: failed to skip archive symbol table\n"), file_name
);
10314 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10315 if (got
!= sizeof arhdr
)
10320 error (_("%s: failed to read archive header\n"), file_name
);
10325 if (memcmp (arhdr
.ar_name
, "// ", 16) == 0)
10327 /* This is the archive string table holding long member
10330 longnames_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10332 longnames
= malloc (longnames_size
);
10333 if (longnames
== NULL
)
10335 error (_("Out of memory\n"));
10339 if (fread (longnames
, longnames_size
, 1, file
) != 1)
10342 error(_("%s: failed to read string table\n"), file_name
);
10346 if ((longnames_size
& 1) != 0)
10349 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10350 if (got
!= sizeof arhdr
)
10357 error (_("%s: failed to read archive header\n"), file_name
);
10362 file_name_size
= strlen (file_name
);
10371 if (arhdr
.ar_name
[0] == '/')
10375 off
= strtoul (arhdr
.ar_name
+ 1, NULL
, 10);
10376 if (off
>= longnames_size
)
10378 error (_("%s: invalid archive string table offset %lu\n"), off
);
10383 name
= longnames
+ off
;
10384 nameend
= memchr (name
, '/', longnames_size
- off
);
10388 name
= arhdr
.ar_name
;
10389 nameend
= memchr (name
, '/', 16);
10392 if (nameend
== NULL
)
10394 error (_("%s: bad archive file name\n"));
10399 namealc
= malloc (file_name_size
+ (nameend
- name
) + 3);
10400 if (namealc
== NULL
)
10402 error (_("Out of memory\n"));
10407 memcpy (namealc
, file_name
, file_name_size
);
10408 namealc
[file_name_size
] = '(';
10409 memcpy (namealc
+ file_name_size
+ 1, name
, nameend
- name
);
10410 namealc
[file_name_size
+ 1 + (nameend
- name
)] = ')';
10411 namealc
[file_name_size
+ 2 + (nameend
- name
)] = '\0';
10413 archive_file_offset
= ftell (file
);
10414 archive_file_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10416 ret
|= process_object (namealc
, file
);
10421 (archive_file_offset
10422 + archive_file_size
10423 + (archive_file_size
& 1)),
10426 error (_("%s: failed to seek to next archive header\n"), file_name
);
10431 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10432 if (got
!= sizeof arhdr
)
10437 error (_("%s: failed to read archive header\n"), file_name
);
10443 if (longnames
!= 0)
10450 process_file (char *file_name
)
10453 struct stat statbuf
;
10454 char armag
[SARMAG
];
10457 if (stat (file_name
, &statbuf
) < 0)
10459 error (_("Cannot stat input file %s.\n"), file_name
);
10463 file
= fopen (file_name
, "rb");
10466 error (_("Input file %s not found.\n"), file_name
);
10470 if (fread (armag
, SARMAG
, 1, file
) != 1)
10472 error (_("%s: Failed to read file header\n"), file_name
);
10477 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
10478 ret
= process_archive (file_name
, file
);
10482 archive_file_size
= archive_file_offset
= 0;
10483 ret
= process_object (file_name
, file
);
10491 #ifdef SUPPORT_DISASSEMBLY
10492 /* Needed by the i386 disassembler. For extra credit, someone could
10493 fix this so that we insert symbolic addresses here, esp for GOT/PLT
10497 print_address (unsigned int addr
, FILE *outfile
)
10499 fprintf (outfile
,"0x%8.8x", addr
);
10502 /* Needed by the i386 disassembler. */
10504 db_task_printsym (unsigned int addr
)
10506 print_address (addr
, stderr
);
10511 main (int argc
, char **argv
)
10514 char *cmdline_dump_sects
= NULL
;
10515 unsigned num_cmdline_dump_sects
= 0;
10517 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
10518 setlocale (LC_MESSAGES
, "");
10520 #if defined (HAVE_SETLOCALE)
10521 setlocale (LC_CTYPE
, "");
10523 bindtextdomain (PACKAGE
, LOCALEDIR
);
10524 textdomain (PACKAGE
);
10526 parse_args (argc
, argv
);
10528 if (optind
< (argc
- 1))
10531 /* When processing more than one file remember the dump requests
10532 issued on command line to reset them after each file. */
10533 if (optind
+ 1 < argc
&& dump_sects
!= NULL
)
10535 cmdline_dump_sects
= malloc (num_dump_sects
);
10536 if (cmdline_dump_sects
== NULL
)
10537 error (_("Out of memory allocating dump request table."));
10540 memcpy (cmdline_dump_sects
, dump_sects
, num_dump_sects
);
10541 num_cmdline_dump_sects
= num_dump_sects
;
10546 while (optind
< argc
)
10548 err
|= process_file (argv
[optind
++]);
10550 /* Reset dump requests. */
10551 if (optind
< argc
&& dump_sects
!= NULL
)
10553 num_dump_sects
= num_cmdline_dump_sects
;
10554 if (num_cmdline_dump_sects
> 0)
10555 memcpy (dump_sects
, cmdline_dump_sects
, num_cmdline_dump_sects
);
10559 if (dump_sects
!= NULL
)
10561 if (cmdline_dump_sects
!= NULL
)
10562 free (cmdline_dump_sects
);