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 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
1920 default: strcat (buf
, ", unknown ISA"); break;
1926 if (e_flags
& EF_SPARC_32PLUS
)
1927 strcat (buf
, ", v8+");
1929 if (e_flags
& EF_SPARC_SUN_US1
)
1930 strcat (buf
, ", ultrasparcI");
1932 if (e_flags
& EF_SPARC_SUN_US3
)
1933 strcat (buf
, ", ultrasparcIII");
1935 if (e_flags
& EF_SPARC_HAL_R1
)
1936 strcat (buf
, ", halr1");
1938 if (e_flags
& EF_SPARC_LEDATA
)
1939 strcat (buf
, ", ledata");
1941 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
1942 strcat (buf
, ", tso");
1944 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
1945 strcat (buf
, ", pso");
1947 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
1948 strcat (buf
, ", rmo");
1952 switch (e_flags
& EF_PARISC_ARCH
)
1954 case EFA_PARISC_1_0
:
1955 strcpy (buf
, ", PA-RISC 1.0");
1957 case EFA_PARISC_1_1
:
1958 strcpy (buf
, ", PA-RISC 1.1");
1960 case EFA_PARISC_2_0
:
1961 strcpy (buf
, ", PA-RISC 2.0");
1966 if (e_flags
& EF_PARISC_TRAPNIL
)
1967 strcat (buf
, ", trapnil");
1968 if (e_flags
& EF_PARISC_EXT
)
1969 strcat (buf
, ", ext");
1970 if (e_flags
& EF_PARISC_LSB
)
1971 strcat (buf
, ", lsb");
1972 if (e_flags
& EF_PARISC_WIDE
)
1973 strcat (buf
, ", wide");
1974 if (e_flags
& EF_PARISC_NO_KABP
)
1975 strcat (buf
, ", no kabp");
1976 if (e_flags
& EF_PARISC_LAZYSWAP
)
1977 strcat (buf
, ", lazyswap");
1982 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
1983 strcat (buf
, ", new calling convention");
1985 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
1986 strcat (buf
, ", gnu calling convention");
1990 if ((e_flags
& EF_IA_64_ABI64
))
1991 strcat (buf
, ", 64-bit");
1993 strcat (buf
, ", 32-bit");
1994 if ((e_flags
& EF_IA_64_REDUCEDFP
))
1995 strcat (buf
, ", reduced fp model");
1996 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
1997 strcat (buf
, ", no function descriptors, constant gp");
1998 else if ((e_flags
& EF_IA_64_CONS_GP
))
1999 strcat (buf
, ", constant gp");
2000 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2001 strcat (buf
, ", absolute");
2005 if ((e_flags
& EF_VAX_NONPIC
))
2006 strcat (buf
, ", non-PIC");
2007 if ((e_flags
& EF_VAX_DFLOAT
))
2008 strcat (buf
, ", D-Float");
2009 if ((e_flags
& EF_VAX_GFLOAT
))
2010 strcat (buf
, ", G-Float");
2019 get_osabi_name (unsigned int osabi
)
2021 static char buff
[32];
2025 case ELFOSABI_NONE
: return "UNIX - System V";
2026 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2027 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2028 case ELFOSABI_LINUX
: return "UNIX - Linux";
2029 case ELFOSABI_HURD
: return "GNU/Hurd";
2030 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2031 case ELFOSABI_AIX
: return "UNIX - AIX";
2032 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2033 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2034 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2035 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2036 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2037 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2038 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2039 case ELFOSABI_AROS
: return "Amiga Research OS";
2040 case ELFOSABI_STANDALONE
: return _("Standalone App");
2041 case ELFOSABI_ARM
: return "ARM";
2043 sprintf (buff
, _("<unknown: %x>"), osabi
);
2049 get_mips_segment_type (unsigned long type
)
2053 case PT_MIPS_REGINFO
:
2055 case PT_MIPS_RTPROC
:
2057 case PT_MIPS_OPTIONS
:
2067 get_parisc_segment_type (unsigned long type
)
2071 case PT_HP_TLS
: return "HP_TLS";
2072 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2073 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2074 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2075 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2076 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2077 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2078 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2079 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2080 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2081 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2082 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2083 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2084 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2093 get_ia64_segment_type (unsigned long type
)
2097 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2098 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2099 case PT_HP_TLS
: return "HP_TLS";
2100 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2101 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2102 case PT_IA_64_HP_STACK
: return "HP_STACK";
2111 get_segment_type (unsigned long p_type
)
2113 static char buff
[32];
2117 case PT_NULL
: return "NULL";
2118 case PT_LOAD
: return "LOAD";
2119 case PT_DYNAMIC
: return "DYNAMIC";
2120 case PT_INTERP
: return "INTERP";
2121 case PT_NOTE
: return "NOTE";
2122 case PT_SHLIB
: return "SHLIB";
2123 case PT_PHDR
: return "PHDR";
2124 case PT_TLS
: return "TLS";
2126 case PT_GNU_EH_FRAME
:
2127 return "GNU_EH_FRAME";
2128 case PT_GNU_STACK
: return "STACK";
2131 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2135 switch (elf_header
.e_machine
)
2138 case EM_MIPS_RS3_LE
:
2139 result
= get_mips_segment_type (p_type
);
2142 result
= get_parisc_segment_type (p_type
);
2145 result
= get_ia64_segment_type (p_type
);
2155 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2157 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2161 switch (elf_header
.e_machine
)
2164 result
= get_parisc_segment_type (p_type
);
2167 result
= get_ia64_segment_type (p_type
);
2177 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2180 sprintf (buff
, _("<unknown>: %lx"), p_type
);
2187 get_mips_section_type_name (unsigned int sh_type
)
2191 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2192 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2193 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2194 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2195 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2196 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2197 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2198 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2199 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2200 case SHT_MIPS_RELD
: return "MIPS_RELD";
2201 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2202 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2203 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2204 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2205 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2206 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2207 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2208 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2209 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2210 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2211 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2212 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2213 case SHT_MIPS_LINE
: return "MIPS_LINE";
2214 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2215 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2216 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2217 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2218 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2219 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2220 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2221 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2222 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2223 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2224 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2225 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2226 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2227 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2228 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2229 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2237 get_parisc_section_type_name (unsigned int sh_type
)
2241 case SHT_PARISC_EXT
: return "PARISC_EXT";
2242 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2243 case SHT_PARISC_DOC
: return "PARISC_DOC";
2251 get_ia64_section_type_name (unsigned int sh_type
)
2253 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2254 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2255 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2259 case SHT_IA_64_EXT
: return "IA_64_EXT";
2260 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2261 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2269 get_section_type_name (unsigned int sh_type
)
2271 static char buff
[32];
2275 case SHT_NULL
: return "NULL";
2276 case SHT_PROGBITS
: return "PROGBITS";
2277 case SHT_SYMTAB
: return "SYMTAB";
2278 case SHT_STRTAB
: return "STRTAB";
2279 case SHT_RELA
: return "RELA";
2280 case SHT_HASH
: return "HASH";
2281 case SHT_DYNAMIC
: return "DYNAMIC";
2282 case SHT_NOTE
: return "NOTE";
2283 case SHT_NOBITS
: return "NOBITS";
2284 case SHT_REL
: return "REL";
2285 case SHT_SHLIB
: return "SHLIB";
2286 case SHT_DYNSYM
: return "DYNSYM";
2287 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2288 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2289 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2290 case SHT_GROUP
: return "GROUP";
2291 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2292 case SHT_GNU_verdef
: return "VERDEF";
2293 case SHT_GNU_verneed
: return "VERNEED";
2294 case SHT_GNU_versym
: return "VERSYM";
2295 case 0x6ffffff0: return "VERSYM";
2296 case 0x6ffffffc: return "VERDEF";
2297 case 0x7ffffffd: return "AUXILIARY";
2298 case 0x7fffffff: return "FILTER";
2299 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2302 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2306 switch (elf_header
.e_machine
)
2309 case EM_MIPS_RS3_LE
:
2310 result
= get_mips_section_type_name (sh_type
);
2313 result
= get_parisc_section_type_name (sh_type
);
2316 result
= get_ia64_section_type_name (sh_type
);
2326 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2328 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2329 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2330 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2331 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2333 sprintf (buff
, _("<unknown>: %x"), sh_type
);
2339 #define OPTION_DEBUG_DUMP 512
2341 struct option options
[] =
2343 {"all", no_argument
, 0, 'a'},
2344 {"file-header", no_argument
, 0, 'h'},
2345 {"program-headers", no_argument
, 0, 'l'},
2346 {"headers", no_argument
, 0, 'e'},
2347 {"histogram", no_argument
, 0, 'I'},
2348 {"segments", no_argument
, 0, 'l'},
2349 {"sections", no_argument
, 0, 'S'},
2350 {"section-headers", no_argument
, 0, 'S'},
2351 {"symbols", no_argument
, 0, 's'},
2352 {"syms", no_argument
, 0, 's'},
2353 {"relocs", no_argument
, 0, 'r'},
2354 {"notes", no_argument
, 0, 'n'},
2355 {"dynamic", no_argument
, 0, 'd'},
2356 {"arch-specific", no_argument
, 0, 'A'},
2357 {"version-info", no_argument
, 0, 'V'},
2358 {"use-dynamic", no_argument
, 0, 'D'},
2359 {"hex-dump", required_argument
, 0, 'x'},
2360 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2361 {"unwind", no_argument
, 0, 'u'},
2362 #ifdef SUPPORT_DISASSEMBLY
2363 {"instruction-dump", required_argument
, 0, 'i'},
2366 {"version", no_argument
, 0, 'v'},
2367 {"wide", no_argument
, 0, 'W'},
2368 {"help", no_argument
, 0, 'H'},
2369 {0, no_argument
, 0, 0}
2375 fprintf (stdout
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2376 fprintf (stdout
, _(" Display information about the contents of ELF format files\n"));
2377 fprintf (stdout
, _(" Options are:\n\
2378 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2379 -h --file-header Display the ELF file header\n\
2380 -l --program-headers Display the program headers\n\
2381 --segments An alias for --program-headers\n\
2382 -S --section-headers Display the sections' header\n\
2383 --sections An alias for --section-headers\n\
2384 -e --headers Equivalent to: -h -l -S\n\
2385 -s --syms Display the symbol table\n\
2386 --symbols An alias for --syms\n\
2387 -n --notes Display the core notes (if present)\n\
2388 -r --relocs Display the relocations (if present)\n\
2389 -u --unwind Display the unwind info (if present)\n\
2390 -d --dynamic Display the dynamic segment (if present)\n\
2391 -V --version-info Display the version sections (if present)\n\
2392 -A --arch-specific Display architecture specific information (if any).\n\
2393 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2394 -x --hex-dump=<number> Dump the contents of section <number>\n\
2395 -w[liaprmfFso] or\n\
2396 --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]\n\
2397 Display the contents of DWARF2 debug sections\n"));
2398 #ifdef SUPPORT_DISASSEMBLY
2399 fprintf (stdout
, _("\
2400 -i --instruction-dump=<number>\n\
2401 Disassemble the contents of section <number>\n"));
2403 fprintf (stdout
, _("\
2404 -I --histogram Display histogram of bucket list lengths\n\
2405 -W --wide Allow output width to exceed 80 characters\n\
2406 -H --help Display this information\n\
2407 -v --version Display the version number of readelf\n"));
2408 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2414 request_dump (unsigned int section
, int type
)
2416 if (section
>= num_dump_sects
)
2418 char *new_dump_sects
;
2420 new_dump_sects
= calloc (section
+ 1, 1);
2422 if (new_dump_sects
== NULL
)
2423 error (_("Out of memory allocating dump request table."));
2426 /* Copy current flag settings. */
2427 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2431 dump_sects
= new_dump_sects
;
2432 num_dump_sects
= section
+ 1;
2437 dump_sects
[section
] |= type
;
2443 parse_args (int argc
, char **argv
)
2450 while ((c
= getopt_long
2451 (argc
, argv
, "ersuahnldSDAIw::x:i:vVWH", options
, NULL
)) != EOF
)
2518 section
= strtoul (optarg
, & cp
, 0);
2519 if (! *cp
&& section
>= 0)
2521 request_dump (section
, HEX_DUMP
);
2531 unsigned int index
= 0;
2535 while (optarg
[index
])
2536 switch (optarg
[index
++])
2545 do_debug_abbrevs
= 1;
2555 do_debug_pubnames
= 1;
2560 do_debug_aranges
= 1;
2564 do_debug_frames_interp
= 1;
2566 do_debug_frames
= 1;
2571 do_debug_macinfo
= 1;
2585 warn (_("Unrecognized debug option '%s'\n"), optarg
);
2590 case OPTION_DEBUG_DUMP
:
2596 static const char *debug_dump_opt
[]
2597 = { "line", "info", "abbrev", "pubnames", "ranges",
2598 "macro", "frames", "frames-interp", "str", "loc", NULL
};
2607 for (index
= 0; debug_dump_opt
[index
]; index
++)
2609 size_t len
= strlen (debug_dump_opt
[index
]);
2611 if (strncmp (p
, debug_dump_opt
[index
], len
) == 0
2612 && (p
[len
] == ',' || p
[len
] == '\0'))
2621 do_debug_abbrevs
= 1;
2632 do_debug_pubnames
= 1;
2636 do_debug_aranges
= 1;
2641 do_debug_frames_interp
= 1;
2642 do_debug_frames
= 1;
2646 do_debug_macinfo
= 1;
2659 if (debug_dump_opt
[index
] == NULL
)
2661 warn (_("Unrecognized debug option '%s'\n"), p
);
2662 p
= strchr (p
, ',');
2672 #ifdef SUPPORT_DISASSEMBLY
2675 section
= strtoul (optarg
, & cp
, 0);
2676 if (! *cp
&& section
>= 0)
2678 request_dump (section
, DISASS_DUMP
);
2684 print_version (program_name
);
2694 /* xgettext:c-format */
2695 error (_("Invalid option '-%c'\n"), c
);
2702 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
2703 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2704 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
)
2708 warn (_("Nothing to do.\n"));
2714 get_elf_class (unsigned int elf_class
)
2716 static char buff
[32];
2720 case ELFCLASSNONE
: return _("none");
2721 case ELFCLASS32
: return "ELF32";
2722 case ELFCLASS64
: return "ELF64";
2724 sprintf (buff
, _("<unknown: %x>"), elf_class
);
2730 get_data_encoding (unsigned int encoding
)
2732 static char buff
[32];
2736 case ELFDATANONE
: return _("none");
2737 case ELFDATA2LSB
: return _("2's complement, little endian");
2738 case ELFDATA2MSB
: return _("2's complement, big endian");
2740 sprintf (buff
, _("<unknown: %x>"), encoding
);
2745 /* Decode the data held in 'elf_header'. */
2748 process_file_header (void)
2750 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2751 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
2752 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
2753 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
2756 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2764 printf (_("ELF Header:\n"));
2765 printf (_(" Magic: "));
2766 for (i
= 0; i
< EI_NIDENT
; i
++)
2767 printf ("%2.2x ", elf_header
.e_ident
[i
]);
2769 printf (_(" Class: %s\n"),
2770 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
2771 printf (_(" Data: %s\n"),
2772 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
2773 printf (_(" Version: %d %s\n"),
2774 elf_header
.e_ident
[EI_VERSION
],
2775 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
2777 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
2780 printf (_(" OS/ABI: %s\n"),
2781 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
2782 printf (_(" ABI Version: %d\n"),
2783 elf_header
.e_ident
[EI_ABIVERSION
]);
2784 printf (_(" Type: %s\n"),
2785 get_file_type (elf_header
.e_type
));
2786 printf (_(" Machine: %s\n"),
2787 get_machine_name (elf_header
.e_machine
));
2788 printf (_(" Version: 0x%lx\n"),
2789 (unsigned long) elf_header
.e_version
);
2791 printf (_(" Entry point address: "));
2792 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2793 printf (_("\n Start of program headers: "));
2794 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2795 printf (_(" (bytes into file)\n Start of section headers: "));
2796 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
2797 printf (_(" (bytes into file)\n"));
2799 printf (_(" Flags: 0x%lx%s\n"),
2800 (unsigned long) elf_header
.e_flags
,
2801 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
2802 printf (_(" Size of this header: %ld (bytes)\n"),
2803 (long) elf_header
.e_ehsize
);
2804 printf (_(" Size of program headers: %ld (bytes)\n"),
2805 (long) elf_header
.e_phentsize
);
2806 printf (_(" Number of program headers: %ld\n"),
2807 (long) elf_header
.e_phnum
);
2808 printf (_(" Size of section headers: %ld (bytes)\n"),
2809 (long) elf_header
.e_shentsize
);
2810 printf (_(" Number of section headers: %ld"),
2811 (long) elf_header
.e_shnum
);
2812 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
2813 printf (" (%ld)", (long) section_headers
[0].sh_size
);
2814 putc ('\n', stdout
);
2815 printf (_(" Section header string table index: %ld"),
2816 (long) elf_header
.e_shstrndx
);
2817 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
2818 printf (" (%ld)", (long) section_headers
[0].sh_link
);
2819 putc ('\n', stdout
);
2822 if (section_headers
!= NULL
)
2824 if (elf_header
.e_shnum
== 0)
2825 elf_header
.e_shnum
= section_headers
[0].sh_size
;
2826 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
2827 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
2828 free (section_headers
);
2829 section_headers
= NULL
;
2837 get_32bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
2839 Elf32_External_Phdr
*phdrs
;
2840 Elf32_External_Phdr
*external
;
2841 Elf_Internal_Phdr
*internal
;
2844 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
2845 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2846 _("program headers"));
2850 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2851 i
< elf_header
.e_phnum
;
2852 i
++, internal
++, external
++)
2854 internal
->p_type
= BYTE_GET (external
->p_type
);
2855 internal
->p_offset
= BYTE_GET (external
->p_offset
);
2856 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
2857 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
2858 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
2859 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
2860 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2861 internal
->p_align
= BYTE_GET (external
->p_align
);
2870 get_64bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
2872 Elf64_External_Phdr
*phdrs
;
2873 Elf64_External_Phdr
*external
;
2874 Elf_Internal_Phdr
*internal
;
2877 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
2878 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2879 _("program headers"));
2883 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2884 i
< elf_header
.e_phnum
;
2885 i
++, internal
++, external
++)
2887 internal
->p_type
= BYTE_GET (external
->p_type
);
2888 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2889 internal
->p_offset
= BYTE_GET8 (external
->p_offset
);
2890 internal
->p_vaddr
= BYTE_GET8 (external
->p_vaddr
);
2891 internal
->p_paddr
= BYTE_GET8 (external
->p_paddr
);
2892 internal
->p_filesz
= BYTE_GET8 (external
->p_filesz
);
2893 internal
->p_memsz
= BYTE_GET8 (external
->p_memsz
);
2894 internal
->p_align
= BYTE_GET8 (external
->p_align
);
2902 /* Returns 1 if the program headers were read into `program_headers'. */
2905 get_program_headers (FILE *file
)
2907 Elf_Internal_Phdr
*phdrs
;
2909 /* Check cache of prior read. */
2910 if (program_headers
!= NULL
)
2913 phdrs
= malloc (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
2917 error (_("Out of memory\n"));
2922 ? get_32bit_program_headers (file
, phdrs
)
2923 : get_64bit_program_headers (file
, phdrs
))
2925 program_headers
= phdrs
;
2933 /* Returns 1 if the program headers were loaded. */
2936 process_program_headers (FILE *file
)
2938 Elf_Internal_Phdr
*segment
;
2941 if (elf_header
.e_phnum
== 0)
2944 printf (_("\nThere are no program headers in this file.\n"));
2948 if (do_segments
&& !do_header
)
2950 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
2951 printf (_("Entry point "));
2952 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2953 printf (_("\nThere are %d program headers, starting at offset "),
2954 elf_header
.e_phnum
);
2955 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2959 if (! get_program_headers (file
))
2964 if (elf_header
.e_phnum
> 1)
2965 printf (_("\nProgram Headers:\n"));
2967 printf (_("\nProgram Headers:\n"));
2971 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2974 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2978 (_(" Type Offset VirtAddr PhysAddr\n"));
2980 (_(" FileSiz MemSiz Flags Align\n"));
2987 for (i
= 0, segment
= program_headers
;
2988 i
< elf_header
.e_phnum
;
2993 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
2997 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
2998 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
2999 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3000 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3001 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3003 (segment
->p_flags
& PF_R
? 'R' : ' '),
3004 (segment
->p_flags
& PF_W
? 'W' : ' '),
3005 (segment
->p_flags
& PF_X
? 'E' : ' '));
3006 printf ("%#lx", (unsigned long) segment
->p_align
);
3010 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3011 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3014 print_vma (segment
->p_offset
, FULL_HEX
);
3018 print_vma (segment
->p_vaddr
, FULL_HEX
);
3020 print_vma (segment
->p_paddr
, FULL_HEX
);
3023 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3024 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3027 print_vma (segment
->p_filesz
, FULL_HEX
);
3031 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3032 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3035 print_vma (segment
->p_offset
, FULL_HEX
);
3039 (segment
->p_flags
& PF_R
? 'R' : ' '),
3040 (segment
->p_flags
& PF_W
? 'W' : ' '),
3041 (segment
->p_flags
& PF_X
? 'E' : ' '));
3043 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3044 printf ("%#lx", (unsigned long) segment
->p_align
);
3047 print_vma (segment
->p_align
, PREFIX_HEX
);
3052 print_vma (segment
->p_offset
, FULL_HEX
);
3054 print_vma (segment
->p_vaddr
, FULL_HEX
);
3056 print_vma (segment
->p_paddr
, FULL_HEX
);
3058 print_vma (segment
->p_filesz
, FULL_HEX
);
3060 print_vma (segment
->p_memsz
, FULL_HEX
);
3062 (segment
->p_flags
& PF_R
? 'R' : ' '),
3063 (segment
->p_flags
& PF_W
? 'W' : ' '),
3064 (segment
->p_flags
& PF_X
? 'E' : ' '));
3065 print_vma (segment
->p_align
, HEX
);
3069 switch (segment
->p_type
)
3073 error (_("more than one dynamic segment\n"));
3075 dynamic_addr
= segment
->p_offset
;
3076 dynamic_size
= segment
->p_filesz
;
3080 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3082 error (_("Unable to find program interpreter name\n"));
3085 program_interpreter
[0] = 0;
3086 fscanf (file
, "%63s", program_interpreter
);
3089 printf (_("\n [Requesting program interpreter: %s]"),
3090 program_interpreter
);
3096 putc ('\n', stdout
);
3099 if (do_segments
&& section_headers
!= NULL
)
3101 printf (_("\n Section to Segment mapping:\n"));
3102 printf (_(" Segment Sections...\n"));
3104 assert (string_table
!= NULL
);
3106 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3109 Elf_Internal_Shdr
*section
;
3111 segment
= program_headers
+ i
;
3112 section
= section_headers
;
3114 printf (" %2.2d ", i
);
3116 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3118 if (section
->sh_size
> 0
3119 /* Compare allocated sections by VMA, unallocated
3120 sections by file offset. */
3121 && (section
->sh_flags
& SHF_ALLOC
3122 ? (section
->sh_addr
>= segment
->p_vaddr
3123 && section
->sh_addr
+ section
->sh_size
3124 <= segment
->p_vaddr
+ segment
->p_memsz
)
3125 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
3126 && (section
->sh_offset
+ section
->sh_size
3127 <= segment
->p_offset
+ segment
->p_filesz
))))
3128 printf ("%s ", SECTION_NAME (section
));
3139 /* Find the file offset corresponding to VMA by using the program headers. */
3142 offset_from_vma (FILE *file
, bfd_vma vma
, bfd_size_type size
)
3144 Elf_Internal_Phdr
*seg
;
3146 if (! get_program_headers (file
))
3148 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3152 for (seg
= program_headers
;
3153 seg
< program_headers
+ elf_header
.e_phnum
;
3156 if (seg
->p_type
!= PT_LOAD
)
3159 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3160 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3161 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3164 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3171 get_32bit_section_headers (FILE *file
, unsigned int num
)
3173 Elf32_External_Shdr
*shdrs
;
3174 Elf_Internal_Shdr
*internal
;
3177 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3178 elf_header
.e_shentsize
* num
, _("section headers"));
3182 section_headers
= malloc (num
* sizeof (Elf_Internal_Shdr
));
3184 if (section_headers
== NULL
)
3186 error (_("Out of memory\n"));
3190 for (i
= 0, internal
= section_headers
;
3194 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3195 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3196 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3197 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3198 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3199 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3200 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3201 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3202 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3203 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3212 get_64bit_section_headers (FILE *file
, unsigned int num
)
3214 Elf64_External_Shdr
*shdrs
;
3215 Elf_Internal_Shdr
*internal
;
3218 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3219 elf_header
.e_shentsize
* num
, _("section headers"));
3223 section_headers
= malloc (num
* sizeof (Elf_Internal_Shdr
));
3225 if (section_headers
== NULL
)
3227 error (_("Out of memory\n"));
3231 for (i
= 0, internal
= section_headers
;
3235 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3236 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3237 internal
->sh_flags
= BYTE_GET8 (shdrs
[i
].sh_flags
);
3238 internal
->sh_addr
= BYTE_GET8 (shdrs
[i
].sh_addr
);
3239 internal
->sh_size
= BYTE_GET8 (shdrs
[i
].sh_size
);
3240 internal
->sh_entsize
= BYTE_GET8 (shdrs
[i
].sh_entsize
);
3241 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3242 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3243 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3244 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3252 static Elf_Internal_Sym
*
3253 get_32bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3255 unsigned long number
;
3256 Elf32_External_Sym
*esyms
;
3257 Elf_External_Sym_Shndx
*shndx
;
3258 Elf_Internal_Sym
*isyms
;
3259 Elf_Internal_Sym
*psym
;
3262 esyms
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
3268 if (symtab_shndx_hdr
!= NULL
3269 && (symtab_shndx_hdr
->sh_link
3270 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3272 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3273 symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3281 number
= section
->sh_size
/ section
->sh_entsize
;
3282 isyms
= malloc (number
* sizeof (Elf_Internal_Sym
));
3286 error (_("Out of memory\n"));
3293 for (j
= 0, psym
= isyms
;
3297 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3298 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3299 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3300 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3301 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3303 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3304 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3305 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3315 static Elf_Internal_Sym
*
3316 get_64bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3318 unsigned long number
;
3319 Elf64_External_Sym
*esyms
;
3320 Elf_External_Sym_Shndx
*shndx
;
3321 Elf_Internal_Sym
*isyms
;
3322 Elf_Internal_Sym
*psym
;
3325 esyms
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
3331 if (symtab_shndx_hdr
!= NULL
3332 && (symtab_shndx_hdr
->sh_link
3333 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3335 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3336 symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3344 number
= section
->sh_size
/ section
->sh_entsize
;
3345 isyms
= malloc (number
* sizeof (Elf_Internal_Sym
));
3349 error (_("Out of memory\n"));
3356 for (j
= 0, psym
= isyms
;
3360 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3361 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3362 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3363 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3364 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3366 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3367 psym
->st_value
= BYTE_GET8 (esyms
[j
].st_value
);
3368 psym
->st_size
= BYTE_GET8 (esyms
[j
].st_size
);
3379 get_elf_section_flags (bfd_vma sh_flags
)
3381 static char buff
[32];
3389 flag
= sh_flags
& - sh_flags
;
3394 case SHF_WRITE
: strcat (buff
, "W"); break;
3395 case SHF_ALLOC
: strcat (buff
, "A"); break;
3396 case SHF_EXECINSTR
: strcat (buff
, "X"); break;
3397 case SHF_MERGE
: strcat (buff
, "M"); break;
3398 case SHF_STRINGS
: strcat (buff
, "S"); break;
3399 case SHF_INFO_LINK
: strcat (buff
, "I"); break;
3400 case SHF_LINK_ORDER
: strcat (buff
, "L"); break;
3401 case SHF_OS_NONCONFORMING
: strcat (buff
, "O"); break;
3402 case SHF_GROUP
: strcat (buff
, "G"); break;
3403 case SHF_TLS
: strcat (buff
, "T"); break;
3406 if (flag
& SHF_MASKOS
)
3409 sh_flags
&= ~ SHF_MASKOS
;
3411 else if (flag
& SHF_MASKPROC
)
3414 sh_flags
&= ~ SHF_MASKPROC
;
3426 process_section_headers (FILE *file
)
3428 Elf_Internal_Shdr
*section
;
3431 section_headers
= NULL
;
3433 if (elf_header
.e_shnum
== 0)
3436 printf (_("\nThere are no sections in this file.\n"));
3441 if (do_sections
&& !do_header
)
3442 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3443 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3447 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3450 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3453 /* Read in the string table, so that we have names to display. */
3454 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3456 if (section
->sh_size
!= 0)
3458 string_table
= get_data (NULL
, file
, section
->sh_offset
,
3459 section
->sh_size
, _("string table"));
3461 if (string_table
== NULL
)
3464 string_table_length
= section
->sh_size
;
3467 /* Scan the sections for the dynamic symbol table
3468 and dynamic string table and debug sections. */
3469 dynamic_symbols
= NULL
;
3470 dynamic_strings
= NULL
;
3471 dynamic_syminfo
= NULL
;
3472 symtab_shndx_hdr
= NULL
;
3474 for (i
= 0, section
= section_headers
;
3475 i
< elf_header
.e_shnum
;
3478 char *name
= SECTION_NAME (section
);
3480 if (section
->sh_type
== SHT_DYNSYM
)
3482 if (dynamic_symbols
!= NULL
)
3484 error (_("File contains multiple dynamic symbol tables\n"));
3488 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3489 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3491 else if (section
->sh_type
== SHT_STRTAB
3492 && strcmp (name
, ".dynstr") == 0)
3494 if (dynamic_strings
!= NULL
)
3496 error (_("File contains multiple dynamic string tables\n"));
3500 dynamic_strings
= get_data (NULL
, file
, section
->sh_offset
,
3501 section
->sh_size
, _("dynamic strings"));
3503 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
3505 if (symtab_shndx_hdr
!= NULL
)
3507 error (_("File contains multiple symtab shndx tables\n"));
3510 symtab_shndx_hdr
= section
;
3512 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
3513 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
3514 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
3516 && strncmp (name
, ".debug_", 7) == 0)
3521 || (do_debug_info
&& (strcmp (name
, "info") == 0))
3522 || (do_debug_abbrevs
&& (strcmp (name
, "abbrev") == 0))
3523 || (do_debug_lines
&& (strcmp (name
, "line") == 0))
3524 || (do_debug_pubnames
&& (strcmp (name
, "pubnames") == 0))
3525 || (do_debug_aranges
&& (strcmp (name
, "aranges") == 0))
3526 || (do_debug_frames
&& (strcmp (name
, "frame") == 0))
3527 || (do_debug_macinfo
&& (strcmp (name
, "macinfo") == 0))
3528 || (do_debug_str
&& (strcmp (name
, "str") == 0))
3529 || (do_debug_loc
&& (strcmp (name
, "loc") == 0))
3531 request_dump (i
, DEBUG_DUMP
);
3533 /* linkonce section to be combined with .debug_info at link time. */
3534 else if ((do_debugging
|| do_debug_info
)
3535 && strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
3536 request_dump (i
, DEBUG_DUMP
);
3537 else if (do_debug_frames
&& strcmp (name
, ".eh_frame") == 0)
3538 request_dump (i
, DEBUG_DUMP
);
3544 if (elf_header
.e_shnum
> 1)
3545 printf (_("\nSection Headers:\n"));
3547 printf (_("\nSection Header:\n"));
3551 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3554 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3557 printf (_(" [Nr] Name Type Address Offset\n"));
3558 printf (_(" Size EntSize Flags Link Info Align\n"));
3561 for (i
= 0, section
= section_headers
;
3562 i
< elf_header
.e_shnum
;
3565 printf (" [%2u] %-17.17s %-15.15s ",
3566 SECTION_HEADER_NUM (i
),
3567 SECTION_NAME (section
),
3568 get_section_type_name (section
->sh_type
));
3572 print_vma (section
->sh_addr
, LONG_HEX
);
3574 printf ( " %6.6lx %6.6lx %2.2lx",
3575 (unsigned long) section
->sh_offset
,
3576 (unsigned long) section
->sh_size
,
3577 (unsigned long) section
->sh_entsize
);
3579 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3581 printf ("%2ld %3lx %2ld\n",
3582 (unsigned long) section
->sh_link
,
3583 (unsigned long) section
->sh_info
,
3584 (unsigned long) section
->sh_addralign
);
3588 print_vma (section
->sh_addr
, LONG_HEX
);
3590 if ((long) section
->sh_offset
== section
->sh_offset
)
3591 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
3595 print_vma (section
->sh_offset
, LONG_HEX
);
3598 if ((unsigned long) section
->sh_size
== section
->sh_size
)
3599 printf (" %6.6lx", (unsigned long) section
->sh_size
);
3603 print_vma (section
->sh_size
, LONG_HEX
);
3606 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
3607 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
3611 print_vma (section
->sh_entsize
, LONG_HEX
);
3614 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3616 printf ("%2ld %3lx ",
3617 (unsigned long) section
->sh_link
,
3618 (unsigned long) section
->sh_info
);
3620 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
3621 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
3624 print_vma (section
->sh_addralign
, DEC
);
3631 print_vma (section
->sh_addr
, LONG_HEX
);
3632 if ((long) section
->sh_offset
== section
->sh_offset
)
3633 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
3637 print_vma (section
->sh_offset
, LONG_HEX
);
3640 print_vma (section
->sh_size
, LONG_HEX
);
3642 print_vma (section
->sh_entsize
, LONG_HEX
);
3644 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3646 printf (" %2ld %3lx %ld\n",
3647 (unsigned long) section
->sh_link
,
3648 (unsigned long) section
->sh_info
,
3649 (unsigned long) section
->sh_addralign
);
3653 printf (_("Key to Flags:\n\
3654 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3655 I (info), L (link order), G (group), x (unknown)\n\
3656 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3667 } dynamic_relocations
[] =
3669 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
3670 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
3671 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
3674 /* Process the reloc section. */
3676 process_relocs (FILE *file
)
3678 unsigned long rel_size
;
3679 unsigned long rel_offset
;
3685 if (do_using_dynamic
)
3689 int has_dynamic_reloc
;
3692 has_dynamic_reloc
= 0;
3694 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
3696 is_rela
= dynamic_relocations
[i
].rela
;
3697 name
= dynamic_relocations
[i
].name
;
3698 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
3699 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
3701 has_dynamic_reloc
|= rel_size
;
3703 if (is_rela
== UNKNOWN
)
3705 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
3706 switch (dynamic_info
[DT_PLTREL
])
3720 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
3721 name
, rel_offset
, rel_size
);
3723 dump_relocations (file
,
3724 offset_from_vma (file
, rel_offset
, rel_size
),
3726 dynamic_symbols
, num_dynamic_syms
,
3727 dynamic_strings
, is_rela
);
3731 if (! has_dynamic_reloc
)
3732 printf (_("\nThere are no dynamic relocations in this file.\n"));
3736 Elf_Internal_Shdr
*section
;
3740 for (i
= 0, section
= section_headers
;
3741 i
< elf_header
.e_shnum
;
3744 if ( section
->sh_type
!= SHT_RELA
3745 && section
->sh_type
!= SHT_REL
)
3748 rel_offset
= section
->sh_offset
;
3749 rel_size
= section
->sh_size
;
3753 Elf_Internal_Shdr
*strsec
;
3754 Elf_Internal_Sym
*symtab
;
3757 unsigned long nsyms
;
3759 printf (_("\nRelocation section "));
3761 if (string_table
== NULL
)
3762 printf ("%d", section
->sh_name
);
3764 printf (_("'%s'"), SECTION_NAME (section
));
3766 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3767 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
3772 if (section
->sh_link
)
3774 Elf_Internal_Shdr
*symsec
;
3776 symsec
= SECTION_HEADER (section
->sh_link
);
3777 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
3778 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
3783 strsec
= SECTION_HEADER (symsec
->sh_link
);
3785 strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
3786 strsec
->sh_size
, _("string table"));
3788 is_rela
= section
->sh_type
== SHT_RELA
;
3790 dump_relocations (file
, rel_offset
, rel_size
,
3791 symtab
, nsyms
, strtab
, is_rela
);
3803 printf (_("\nThere are no relocations in this file.\n"));
3809 #include "unwind-ia64.h"
3811 /* An absolute address consists of a section and an offset. If the
3812 section is NULL, the offset itself is the address, otherwise, the
3813 address equals to LOAD_ADDRESS(section) + offset. */
3817 unsigned short section
;
3823 struct unw_table_entry
3825 struct absaddr start
;
3827 struct absaddr info
;
3829 *table
; /* Unwind table. */
3830 unsigned long table_len
; /* Length of unwind table. */
3831 unsigned char *info
; /* Unwind info. */
3832 unsigned long info_size
; /* Size of unwind info. */
3833 bfd_vma info_addr
; /* starting address of unwind info. */
3834 bfd_vma seg_base
; /* Starting address of segment. */
3835 Elf_Internal_Sym
*symtab
; /* The symbol table. */
3836 unsigned long nsyms
; /* Number of symbols. */
3837 char *strtab
; /* The string table. */
3838 unsigned long strtab_size
; /* Size of string table. */
3842 find_symbol_for_address (struct unw_aux_info
*aux
,
3843 struct absaddr addr
,
3844 const char **symname
,
3847 bfd_vma dist
= 0x100000;
3848 Elf_Internal_Sym
*sym
, *best
= NULL
;
3851 for (i
= 0, sym
= aux
->symtab
; i
< aux
->nsyms
; ++i
, ++sym
)
3853 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
3854 && sym
->st_name
!= 0
3855 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
3856 && addr
.offset
>= sym
->st_value
3857 && addr
.offset
- sym
->st_value
< dist
)
3860 dist
= addr
.offset
- sym
->st_value
;
3867 *symname
= (best
->st_name
>= aux
->strtab_size
3868 ? "<corrupt>" : aux
->strtab
+ best
->st_name
);
3873 *offset
= addr
.offset
;
3877 dump_ia64_unwind (struct unw_aux_info
*aux
)
3880 struct unw_table_entry
*tp
;
3883 addr_size
= is_32bit_elf
? 4 : 8;
3885 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
3889 const unsigned char *dp
;
3890 const unsigned char *head
;
3891 const char *procname
;
3893 find_symbol_for_address (aux
, tp
->start
, &procname
, &offset
);
3895 fputs ("\n<", stdout
);
3899 fputs (procname
, stdout
);
3902 printf ("+%lx", (unsigned long) offset
);
3905 fputs (">: [", stdout
);
3906 print_vma (tp
->start
.offset
, PREFIX_HEX
);
3907 fputc ('-', stdout
);
3908 print_vma (tp
->end
.offset
, PREFIX_HEX
);
3909 printf ("], info at +0x%lx\n",
3910 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
3912 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
3913 stamp
= BYTE_GET8 ((unsigned char *) head
);
3915 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
3916 (unsigned) UNW_VER (stamp
),
3917 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
3918 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
3919 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
3920 (unsigned long) (addr_size
* UNW_LENGTH (stamp
)));
3922 if (UNW_VER (stamp
) != 1)
3924 printf ("\tUnknown version.\n");
3929 for (dp
= head
+ 8; dp
< head
+ 8 + addr_size
* UNW_LENGTH (stamp
);)
3930 dp
= unw_decode (dp
, in_body
, & in_body
);
3935 slurp_ia64_unwind_table (FILE *file
,
3936 struct unw_aux_info
*aux
,
3937 Elf_Internal_Shdr
*sec
)
3939 unsigned long size
, addr_size
, nrelas
, i
;
3940 Elf_Internal_Phdr
*seg
;
3941 struct unw_table_entry
*tep
;
3942 Elf_Internal_Shdr
*relsec
;
3943 Elf_Internal_Rela
*rela
, *rp
;
3944 unsigned char *table
, *tp
;
3945 Elf_Internal_Sym
*sym
;
3946 const char *relname
;
3948 addr_size
= is_32bit_elf
? 4 : 8;
3950 /* First, find the starting address of the segment that includes
3953 if (elf_header
.e_phnum
)
3955 if (! get_program_headers (file
))
3958 for (seg
= program_headers
;
3959 seg
< program_headers
+ elf_header
.e_phnum
;
3962 if (seg
->p_type
!= PT_LOAD
)
3965 if (sec
->sh_addr
>= seg
->p_vaddr
3966 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
3968 aux
->seg_base
= seg
->p_vaddr
;
3974 /* Second, build the unwind table from the contents of the unwind section: */
3975 size
= sec
->sh_size
;
3976 table
= get_data (NULL
, file
, sec
->sh_offset
, size
, _("unwind table"));
3980 tep
= aux
->table
= xmalloc (size
/ (3 * addr_size
) * sizeof (aux
->table
[0]));
3981 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * addr_size
, ++tep
)
3983 tep
->start
.section
= SHN_UNDEF
;
3984 tep
->end
.section
= SHN_UNDEF
;
3985 tep
->info
.section
= SHN_UNDEF
;
3988 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
3989 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
3990 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
3994 tep
->start
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 0);
3995 tep
->end
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 8);
3996 tep
->info
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 16);
3998 tep
->start
.offset
+= aux
->seg_base
;
3999 tep
->end
.offset
+= aux
->seg_base
;
4000 tep
->info
.offset
+= aux
->seg_base
;
4004 /* Third, apply any relocations to the unwind table: */
4006 for (relsec
= section_headers
;
4007 relsec
< section_headers
+ elf_header
.e_shnum
;
4010 if (relsec
->sh_type
!= SHT_RELA
4011 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4014 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
4018 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
4022 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
4023 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
4025 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
4027 warn (_("Skipping unexpected symbol type %u\n"),
4028 ELF32_ST_TYPE (sym
->st_info
));
4034 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
4035 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
4037 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
4039 warn (_("Skipping unexpected symbol type %u\n"),
4040 ELF64_ST_TYPE (sym
->st_info
));
4045 if (strncmp (relname
, "R_IA64_SEGREL", 13) != 0)
4047 warn (_("Skipping unexpected relocation type %s\n"), relname
);
4051 i
= rp
->r_offset
/ (3 * addr_size
);
4053 switch (rp
->r_offset
/addr_size
% 3)
4056 aux
->table
[i
].start
.section
= sym
->st_shndx
;
4057 aux
->table
[i
].start
.offset
+= rp
->r_addend
;
4060 aux
->table
[i
].end
.section
= sym
->st_shndx
;
4061 aux
->table
[i
].end
.offset
+= rp
->r_addend
;
4064 aux
->table
[i
].info
.section
= sym
->st_shndx
;
4065 aux
->table
[i
].info
.offset
+= rp
->r_addend
;
4075 aux
->table_len
= size
/ (3 * addr_size
);
4080 process_unwind (FILE *file
)
4082 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
4083 unsigned long i
, addr_size
, unwcount
= 0, unwstart
= 0;
4084 struct unw_aux_info aux
;
4089 if (elf_header
.e_machine
!= EM_IA_64
)
4091 printf (_("\nThere are no unwind sections in this file.\n"));
4095 memset (& aux
, 0, sizeof (aux
));
4097 addr_size
= is_32bit_elf
? 4 : 8;
4099 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
4101 if (sec
->sh_type
== SHT_SYMTAB
)
4103 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
4104 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
4106 strsec
= SECTION_HEADER (sec
->sh_link
);
4107 aux
.strtab_size
= strsec
->sh_size
;
4108 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4109 aux
.strtab_size
, _("string table"));
4111 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4116 printf (_("\nThere are no unwind sections in this file.\n"));
4118 while (unwcount
-- > 0)
4123 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
4124 i
< elf_header
.e_shnum
; ++i
, ++sec
)
4125 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4132 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
4134 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
,
4137 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
4138 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
4139 suffix
= SECTION_NAME (unwsec
) + len
;
4140 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4142 if (strncmp (SECTION_NAME (sec
),
4143 ELF_STRING_ia64_unwind_info_once
, len2
) == 0
4144 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
4149 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4150 .IA_64.unwind or BAR -> .IA_64.unwind_info */
4151 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
4152 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
4154 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
,
4156 suffix
= SECTION_NAME (unwsec
) + len
;
4157 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4159 if (strncmp (SECTION_NAME (sec
),
4160 ELF_STRING_ia64_unwind_info
, len2
) == 0
4161 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
4165 if (i
== elf_header
.e_shnum
)
4167 printf (_("\nCould not find unwind info section for "));
4169 if (string_table
== NULL
)
4170 printf ("%d", unwsec
->sh_name
);
4172 printf (_("'%s'"), SECTION_NAME (unwsec
));
4176 aux
.info_size
= sec
->sh_size
;
4177 aux
.info_addr
= sec
->sh_addr
;
4178 aux
.info
= get_data (NULL
, file
, sec
->sh_offset
, aux
.info_size
,
4181 printf (_("\nUnwind section "));
4183 if (string_table
== NULL
)
4184 printf ("%d", unwsec
->sh_name
);
4186 printf (_("'%s'"), SECTION_NAME (unwsec
));
4188 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4189 (unsigned long) unwsec
->sh_offset
,
4190 (unsigned long) (unwsec
->sh_size
/ (3 * addr_size
)));
4192 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
4194 if (aux
.table_len
> 0)
4195 dump_ia64_unwind (& aux
);
4198 free ((char *) aux
.table
);
4200 free ((char *) aux
.info
);
4209 free ((char *) aux
.strtab
);
4215 dynamic_segment_mips_val (Elf_Internal_Dyn
*entry
)
4217 switch (entry
->d_tag
)
4220 if (entry
->d_un
.d_val
== 0)
4224 static const char * opts
[] =
4226 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
4227 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
4228 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
4229 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
4234 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++cnt
)
4235 if (entry
->d_un
.d_val
& (1 << cnt
))
4237 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
4244 case DT_MIPS_IVERSION
:
4245 if (dynamic_strings
!= NULL
)
4246 printf ("Interface Version: %s\n",
4247 dynamic_strings
+ entry
->d_un
.d_val
);
4249 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4252 case DT_MIPS_TIME_STAMP
:
4257 time_t time
= entry
->d_un
.d_val
;
4258 tmp
= gmtime (&time
);
4259 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
4260 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
4261 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
4262 printf ("Time Stamp: %s\n", timebuf
);
4266 case DT_MIPS_RLD_VERSION
:
4267 case DT_MIPS_LOCAL_GOTNO
:
4268 case DT_MIPS_CONFLICTNO
:
4269 case DT_MIPS_LIBLISTNO
:
4270 case DT_MIPS_SYMTABNO
:
4271 case DT_MIPS_UNREFEXTNO
:
4272 case DT_MIPS_HIPAGENO
:
4273 case DT_MIPS_DELTA_CLASS_NO
:
4274 case DT_MIPS_DELTA_INSTANCE_NO
:
4275 case DT_MIPS_DELTA_RELOC_NO
:
4276 case DT_MIPS_DELTA_SYM_NO
:
4277 case DT_MIPS_DELTA_CLASSSYM_NO
:
4278 case DT_MIPS_COMPACT_SIZE
:
4279 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4283 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
4289 dynamic_segment_parisc_val (Elf_Internal_Dyn
*entry
)
4291 switch (entry
->d_tag
)
4293 case DT_HP_DLD_FLAGS
:
4302 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
4303 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
4304 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
4305 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
4306 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
4307 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
4308 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
4309 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
4310 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
4311 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
4312 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
4316 bfd_vma val
= entry
->d_un
.d_val
;
4318 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
4319 if (val
& flags
[cnt
].bit
)
4323 fputs (flags
[cnt
].str
, stdout
);
4325 val
^= flags
[cnt
].bit
;
4328 if (val
!= 0 || first
)
4332 print_vma (val
, HEX
);
4338 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4345 dynamic_segment_ia64_val (Elf_Internal_Dyn
*entry
)
4347 switch (entry
->d_tag
)
4349 case DT_IA_64_PLT_RESERVE
:
4350 /* First 3 slots reserved. */
4351 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4353 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
4357 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4364 get_32bit_dynamic_segment (FILE *file
)
4366 Elf32_External_Dyn
*edyn
;
4367 Elf_Internal_Dyn
*entry
;
4370 edyn
= get_data (NULL
, file
, dynamic_addr
, dynamic_size
,
4371 _("dynamic segment"));
4375 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4376 how large this .dynamic is now. We can do this even before the byte
4377 swapping since the DT_NULL tag is recognizable. */
4379 while (*(Elf32_Word
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
4382 dynamic_segment
= malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
4384 if (dynamic_segment
== NULL
)
4386 error (_("Out of memory\n"));
4391 for (i
= 0, entry
= dynamic_segment
;
4395 entry
->d_tag
= BYTE_GET (edyn
[i
].d_tag
);
4396 entry
->d_un
.d_val
= BYTE_GET (edyn
[i
].d_un
.d_val
);
4405 get_64bit_dynamic_segment (FILE *file
)
4407 Elf64_External_Dyn
*edyn
;
4408 Elf_Internal_Dyn
*entry
;
4411 edyn
= get_data (NULL
, file
, dynamic_addr
, dynamic_size
,
4412 _("dynamic segment"));
4416 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4417 how large this .dynamic is now. We can do this even before the byte
4418 swapping since the DT_NULL tag is recognizable. */
4420 while (*(bfd_vma
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
4423 dynamic_segment
= malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
4425 if (dynamic_segment
== NULL
)
4427 error (_("Out of memory\n"));
4432 for (i
= 0, entry
= dynamic_segment
;
4436 entry
->d_tag
= BYTE_GET8 (edyn
[i
].d_tag
);
4437 entry
->d_un
.d_val
= BYTE_GET8 (edyn
[i
].d_un
.d_val
);
4446 get_dynamic_flags (bfd_vma flags
)
4448 static char buff
[128];
4456 flag
= flags
& - flags
;
4464 case DF_ORIGIN
: strcpy (p
, "ORIGIN"); break;
4465 case DF_SYMBOLIC
: strcpy (p
, "SYMBOLIC"); break;
4466 case DF_TEXTREL
: strcpy (p
, "TEXTREL"); break;
4467 case DF_BIND_NOW
: strcpy (p
, "BIND_NOW"); break;
4468 case DF_STATIC_TLS
: strcpy (p
, "STATIC_TLS"); break;
4469 default: strcpy (p
, "unknown"); break;
4472 p
= strchr (p
, '\0');
4477 /* Parse and display the contents of the dynamic segment. */
4479 process_dynamic_segment (FILE *file
)
4481 Elf_Internal_Dyn
*entry
;
4484 if (dynamic_size
== 0)
4487 printf (_("\nThere is no dynamic segment in this file.\n"));
4494 if (! get_32bit_dynamic_segment (file
))
4497 else if (! get_64bit_dynamic_segment (file
))
4500 /* Find the appropriate symbol table. */
4501 if (dynamic_symbols
== NULL
)
4503 for (i
= 0, entry
= dynamic_segment
;
4507 Elf_Internal_Shdr section
;
4509 if (entry
->d_tag
!= DT_SYMTAB
)
4512 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
4514 /* Since we do not know how big the symbol table is,
4515 we default to reading in the entire file (!) and
4516 processing that. This is overkill, I know, but it
4518 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
4520 if (archive_file_offset
!= 0)
4521 section
.sh_size
= archive_file_size
- section
.sh_offset
;
4524 if (fseek (file
, 0, SEEK_END
))
4525 error (_("Unable to seek to end of file!"));
4527 section
.sh_size
= ftell (file
) - section
.sh_offset
;
4531 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
4533 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
4535 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
4536 if (num_dynamic_syms
< 1)
4538 error (_("Unable to determine the number of symbols to load\n"));
4542 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
4546 /* Similarly find a string table. */
4547 if (dynamic_strings
== NULL
)
4549 for (i
= 0, entry
= dynamic_segment
;
4553 unsigned long offset
;
4556 if (entry
->d_tag
!= DT_STRTAB
)
4559 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
4561 /* Since we do not know how big the string table is,
4562 we default to reading in the entire file (!) and
4563 processing that. This is overkill, I know, but it
4566 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
4568 if (archive_file_offset
!= 0)
4569 str_tab_len
= archive_file_size
- offset
;
4572 if (fseek (file
, 0, SEEK_END
))
4573 error (_("Unable to seek to end of file\n"));
4574 str_tab_len
= ftell (file
) - offset
;
4577 if (str_tab_len
< 1)
4580 (_("Unable to determine the length of the dynamic string table\n"));
4584 dynamic_strings
= get_data (NULL
, file
, offset
, str_tab_len
,
4585 _("dynamic string table"));
4590 /* And find the syminfo section if available. */
4591 if (dynamic_syminfo
== NULL
)
4593 unsigned long syminsz
= 0;
4595 for (i
= 0, entry
= dynamic_segment
;
4599 if (entry
->d_tag
== DT_SYMINENT
)
4601 /* Note: these braces are necessary to avoid a syntax
4602 error from the SunOS4 C compiler. */
4603 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
4605 else if (entry
->d_tag
== DT_SYMINSZ
)
4606 syminsz
= entry
->d_un
.d_val
;
4607 else if (entry
->d_tag
== DT_SYMINFO
)
4608 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
4612 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
4614 Elf_External_Syminfo
*extsyminfo
;
4615 Elf_Internal_Syminfo
*syminfo
;
4617 /* There is a syminfo section. Read the data. */
4618 extsyminfo
= get_data (NULL
, file
, dynamic_syminfo_offset
, syminsz
,
4619 _("symbol information"));
4623 dynamic_syminfo
= malloc (syminsz
);
4624 if (dynamic_syminfo
== NULL
)
4626 error (_("Out of memory\n"));
4630 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
4631 for (i
= 0, syminfo
= dynamic_syminfo
; i
< dynamic_syminfo_nent
;
4634 syminfo
->si_boundto
= BYTE_GET (extsyminfo
[i
].si_boundto
);
4635 syminfo
->si_flags
= BYTE_GET (extsyminfo
[i
].si_flags
);
4642 if (do_dynamic
&& dynamic_addr
)
4643 printf (_("\nDynamic segment at offset 0x%lx contains %ld entries:\n"),
4644 dynamic_addr
, (long) dynamic_size
);
4646 printf (_(" Tag Type Name/Value\n"));
4648 for (i
= 0, entry
= dynamic_segment
;
4657 print_vma (entry
->d_tag
, FULL_HEX
);
4658 dtype
= get_dynamic_type (entry
->d_tag
);
4659 printf (" (%s)%*s", dtype
,
4660 ((is_32bit_elf
? 27 : 19)
4661 - (int) strlen (dtype
)),
4665 switch (entry
->d_tag
)
4669 puts (get_dynamic_flags (entry
->d_un
.d_val
));
4679 switch (entry
->d_tag
)
4682 printf (_("Auxiliary library"));
4686 printf (_("Filter library"));
4690 printf (_("Configuration file"));
4694 printf (_("Dependency audit library"));
4698 printf (_("Audit library"));
4702 if (dynamic_strings
)
4703 printf (": [%s]\n", dynamic_strings
+ entry
->d_un
.d_val
);
4707 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4716 printf (_("Flags:"));
4718 if (entry
->d_un
.d_val
== 0)
4719 printf (_(" None\n"));
4722 unsigned long int val
= entry
->d_un
.d_val
;
4724 if (val
& DTF_1_PARINIT
)
4726 printf (" PARINIT");
4727 val
^= DTF_1_PARINIT
;
4729 if (val
& DTF_1_CONFEXP
)
4731 printf (" CONFEXP");
4732 val
^= DTF_1_CONFEXP
;
4735 printf (" %lx", val
);
4744 printf (_("Flags:"));
4746 if (entry
->d_un
.d_val
== 0)
4747 printf (_(" None\n"));
4750 unsigned long int val
= entry
->d_un
.d_val
;
4752 if (val
& DF_P1_LAZYLOAD
)
4754 printf (" LAZYLOAD");
4755 val
^= DF_P1_LAZYLOAD
;
4757 if (val
& DF_P1_GROUPPERM
)
4759 printf (" GROUPPERM");
4760 val
^= DF_P1_GROUPPERM
;
4763 printf (" %lx", val
);
4772 printf (_("Flags:"));
4773 if (entry
->d_un
.d_val
== 0)
4774 printf (_(" None\n"));
4777 unsigned long int val
= entry
->d_un
.d_val
;
4784 if (val
& DF_1_GLOBAL
)
4789 if (val
& DF_1_GROUP
)
4794 if (val
& DF_1_NODELETE
)
4796 printf (" NODELETE");
4797 val
^= DF_1_NODELETE
;
4799 if (val
& DF_1_LOADFLTR
)
4801 printf (" LOADFLTR");
4802 val
^= DF_1_LOADFLTR
;
4804 if (val
& DF_1_INITFIRST
)
4806 printf (" INITFIRST");
4807 val
^= DF_1_INITFIRST
;
4809 if (val
& DF_1_NOOPEN
)
4814 if (val
& DF_1_ORIGIN
)
4819 if (val
& DF_1_DIRECT
)
4824 if (val
& DF_1_TRANS
)
4829 if (val
& DF_1_INTERPOSE
)
4831 printf (" INTERPOSE");
4832 val
^= DF_1_INTERPOSE
;
4834 if (val
& DF_1_NODEFLIB
)
4836 printf (" NODEFLIB");
4837 val
^= DF_1_NODEFLIB
;
4839 if (val
& DF_1_NODUMP
)
4844 if (val
& DF_1_CONLFAT
)
4846 printf (" CONLFAT");
4847 val
^= DF_1_CONLFAT
;
4850 printf (" %lx", val
);
4857 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
4859 puts (get_dynamic_type (entry
->d_un
.d_val
));
4879 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
4885 if (dynamic_strings
== NULL
)
4888 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4892 switch (entry
->d_tag
)
4895 printf (_("Shared library: [%s]"), name
);
4897 if (strcmp (name
, program_interpreter
) == 0)
4898 printf (_(" program interpreter"));
4902 printf (_("Library soname: [%s]"), name
);
4906 printf (_("Library rpath: [%s]"), name
);
4910 printf (_("Library runpath: [%s]"), name
);
4914 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4919 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4932 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
4936 case DT_INIT_ARRAYSZ
:
4937 case DT_FINI_ARRAYSZ
:
4938 case DT_GNU_CONFLICTSZ
:
4939 case DT_GNU_LIBLISTSZ
:
4942 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
4943 printf (" (bytes)\n");
4953 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
4966 if (dynamic_strings
!= NULL
&& entry
->d_tag
== DT_USED
)
4970 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4974 printf (_("Not needed object: [%s]\n"), name
);
4979 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4985 /* The value of this entry is ignored. */
4990 case DT_GNU_PRELINKED
:
4994 time_t time
= entry
->d_un
.d_val
;
4996 tmp
= gmtime (&time
);
4997 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
4998 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
4999 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5005 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
5006 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
5011 switch (elf_header
.e_machine
)
5014 case EM_MIPS_RS3_LE
:
5015 dynamic_segment_mips_val (entry
);
5018 dynamic_segment_parisc_val (entry
);
5021 dynamic_segment_ia64_val (entry
);
5024 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5036 get_ver_flags (unsigned int flags
)
5038 static char buff
[32];
5045 if (flags
& VER_FLG_BASE
)
5046 strcat (buff
, "BASE ");
5048 if (flags
& VER_FLG_WEAK
)
5050 if (flags
& VER_FLG_BASE
)
5051 strcat (buff
, "| ");
5053 strcat (buff
, "WEAK ");
5056 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
5057 strcat (buff
, "| <unknown>");
5062 /* Display the contents of the version sections. */
5064 process_version_sections (FILE *file
)
5066 Elf_Internal_Shdr
*section
;
5073 for (i
= 0, section
= section_headers
;
5074 i
< elf_header
.e_shnum
;
5077 switch (section
->sh_type
)
5079 case SHT_GNU_verdef
:
5081 Elf_External_Verdef
*edefs
;
5088 (_("\nVersion definition section '%s' contains %ld entries:\n"),
5089 SECTION_NAME (section
), section
->sh_info
);
5091 printf (_(" Addr: 0x"));
5092 printf_vma (section
->sh_addr
);
5093 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5094 (unsigned long) section
->sh_offset
, section
->sh_link
,
5095 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5097 edefs
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
5098 _("version definition section"));
5102 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5105 Elf_External_Verdef
*edef
;
5106 Elf_Internal_Verdef ent
;
5107 Elf_External_Verdaux
*eaux
;
5108 Elf_Internal_Verdaux aux
;
5112 vstart
= ((char *) edefs
) + idx
;
5114 edef
= (Elf_External_Verdef
*) vstart
;
5116 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
5117 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
5118 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
5119 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
5120 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
5121 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
5122 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
5124 printf (_(" %#06x: Rev: %d Flags: %s"),
5125 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
5127 printf (_(" Index: %d Cnt: %d "),
5128 ent
.vd_ndx
, ent
.vd_cnt
);
5130 vstart
+= ent
.vd_aux
;
5132 eaux
= (Elf_External_Verdaux
*) vstart
;
5134 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5135 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
5137 if (dynamic_strings
)
5138 printf (_("Name: %s\n"), dynamic_strings
+ aux
.vda_name
);
5140 printf (_("Name index: %ld\n"), aux
.vda_name
);
5142 isum
= idx
+ ent
.vd_aux
;
5144 for (j
= 1; j
< ent
.vd_cnt
; j
++)
5146 isum
+= aux
.vda_next
;
5147 vstart
+= aux
.vda_next
;
5149 eaux
= (Elf_External_Verdaux
*) vstart
;
5151 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5152 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
5154 if (dynamic_strings
)
5155 printf (_(" %#06x: Parent %d: %s\n"),
5156 isum
, j
, dynamic_strings
+ aux
.vda_name
);
5158 printf (_(" %#06x: Parent %d, name index: %ld\n"),
5159 isum
, j
, aux
.vda_name
);
5169 case SHT_GNU_verneed
:
5171 Elf_External_Verneed
*eneed
;
5177 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
5178 SECTION_NAME (section
), section
->sh_info
);
5180 printf (_(" Addr: 0x"));
5181 printf_vma (section
->sh_addr
);
5182 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
5183 (unsigned long) section
->sh_offset
, section
->sh_link
,
5184 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5186 eneed
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
5187 _("version need section"));
5191 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5193 Elf_External_Verneed
*entry
;
5194 Elf_Internal_Verneed ent
;
5199 vstart
= ((char *) eneed
) + idx
;
5201 entry
= (Elf_External_Verneed
*) vstart
;
5203 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
5204 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
5205 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
5206 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
5207 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
5209 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
5211 if (dynamic_strings
)
5212 printf (_(" File: %s"), dynamic_strings
+ ent
.vn_file
);
5214 printf (_(" File: %lx"), ent
.vn_file
);
5216 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
5218 vstart
+= ent
.vn_aux
;
5220 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
5222 Elf_External_Vernaux
*eaux
;
5223 Elf_Internal_Vernaux aux
;
5225 eaux
= (Elf_External_Vernaux
*) vstart
;
5227 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
5228 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
5229 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
5230 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
5231 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
5233 if (dynamic_strings
)
5234 printf (_(" %#06x: Name: %s"),
5235 isum
, dynamic_strings
+ aux
.vna_name
);
5237 printf (_(" %#06x: Name index: %lx"),
5238 isum
, aux
.vna_name
);
5240 printf (_(" Flags: %s Version: %d\n"),
5241 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
5243 isum
+= aux
.vna_next
;
5244 vstart
+= aux
.vna_next
;
5254 case SHT_GNU_versym
:
5256 Elf_Internal_Shdr
*link_section
;
5259 unsigned char *edata
;
5260 unsigned short *data
;
5262 Elf_Internal_Sym
*symbols
;
5263 Elf_Internal_Shdr
*string_sec
;
5266 link_section
= SECTION_HEADER (section
->sh_link
);
5267 total
= section
->sh_size
/ section
->sh_entsize
;
5271 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
5273 string_sec
= SECTION_HEADER (link_section
->sh_link
);
5275 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
5276 string_sec
->sh_size
, _("version string table"));
5280 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
5281 SECTION_NAME (section
), total
);
5283 printf (_(" Addr: "));
5284 printf_vma (section
->sh_addr
);
5285 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5286 (unsigned long) section
->sh_offset
, section
->sh_link
,
5287 SECTION_NAME (link_section
));
5289 off
= offset_from_vma (file
,
5290 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
5291 total
* sizeof (short));
5292 edata
= get_data (NULL
, file
, off
, total
* sizeof (short),
5293 _("version symbol data"));
5300 data
= malloc (total
* sizeof (short));
5302 for (cnt
= total
; cnt
--;)
5303 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
5308 for (cnt
= 0; cnt
< total
; cnt
+= 4)
5311 int check_def
, check_need
;
5314 printf (" %03x:", cnt
);
5316 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
5317 switch (data
[cnt
+ j
])
5320 fputs (_(" 0 (*local*) "), stdout
);
5324 fputs (_(" 1 (*global*) "), stdout
);
5328 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
5329 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
5333 if (SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
5336 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
5343 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
5345 Elf_Internal_Verneed ivn
;
5346 unsigned long offset
;
5348 offset
= offset_from_vma
5349 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
5350 sizeof (Elf_External_Verneed
));
5354 Elf_Internal_Vernaux ivna
;
5355 Elf_External_Verneed evn
;
5356 Elf_External_Vernaux evna
;
5357 unsigned long a_off
;
5359 get_data (&evn
, file
, offset
, sizeof (evn
),
5362 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5363 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5365 a_off
= offset
+ ivn
.vn_aux
;
5369 get_data (&evna
, file
, a_off
, sizeof (evna
),
5370 _("version need aux (2)"));
5372 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5373 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5375 a_off
+= ivna
.vna_next
;
5377 while (ivna
.vna_other
!= data
[cnt
+ j
]
5378 && ivna
.vna_next
!= 0);
5380 if (ivna
.vna_other
== data
[cnt
+ j
])
5382 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5384 name
= strtab
+ ivna
.vna_name
;
5385 nn
+= printf ("(%s%-*s",
5387 12 - (int) strlen (name
),
5393 offset
+= ivn
.vn_next
;
5395 while (ivn
.vn_next
);
5398 if (check_def
&& data
[cnt
+ j
] != 0x8001
5399 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5401 Elf_Internal_Verdef ivd
;
5402 Elf_External_Verdef evd
;
5403 unsigned long offset
;
5405 offset
= offset_from_vma
5406 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
5411 get_data (&evd
, file
, offset
, sizeof (evd
),
5414 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5415 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5417 offset
+= ivd
.vd_next
;
5419 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
5420 && ivd
.vd_next
!= 0);
5422 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
5424 Elf_External_Verdaux evda
;
5425 Elf_Internal_Verdaux ivda
;
5427 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5429 get_data (&evda
, file
,
5430 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
5431 sizeof (evda
), _("version def aux"));
5433 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5435 name
= strtab
+ ivda
.vda_name
;
5436 nn
+= printf ("(%s%-*s",
5438 12 - (int) strlen (name
),
5444 printf ("%*c", 18 - nn
, ' ');
5462 printf (_("\nNo version information found in this file.\n"));
5468 get_symbol_binding (unsigned int binding
)
5470 static char buff
[32];
5474 case STB_LOCAL
: return "LOCAL";
5475 case STB_GLOBAL
: return "GLOBAL";
5476 case STB_WEAK
: return "WEAK";
5478 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
5479 sprintf (buff
, _("<processor specific>: %d"), binding
);
5480 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
5481 sprintf (buff
, _("<OS specific>: %d"), binding
);
5483 sprintf (buff
, _("<unknown>: %d"), binding
);
5489 get_symbol_type (unsigned int type
)
5491 static char buff
[32];
5495 case STT_NOTYPE
: return "NOTYPE";
5496 case STT_OBJECT
: return "OBJECT";
5497 case STT_FUNC
: return "FUNC";
5498 case STT_SECTION
: return "SECTION";
5499 case STT_FILE
: return "FILE";
5500 case STT_COMMON
: return "COMMON";
5501 case STT_TLS
: return "TLS";
5503 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
5505 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
5506 return "THUMB_FUNC";
5508 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
5511 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
5512 return "PARISC_MILLI";
5514 sprintf (buff
, _("<processor specific>: %d"), type
);
5516 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
5518 if (elf_header
.e_machine
== EM_PARISC
)
5520 if (type
== STT_HP_OPAQUE
)
5522 if (type
== STT_HP_STUB
)
5526 sprintf (buff
, _("<OS specific>: %d"), type
);
5529 sprintf (buff
, _("<unknown>: %d"), type
);
5535 get_symbol_visibility (unsigned int visibility
)
5539 case STV_DEFAULT
: return "DEFAULT";
5540 case STV_INTERNAL
: return "INTERNAL";
5541 case STV_HIDDEN
: return "HIDDEN";
5542 case STV_PROTECTED
: return "PROTECTED";
5548 get_symbol_index_type (unsigned int type
)
5550 static char buff
[32];
5554 case SHN_UNDEF
: return "UND";
5555 case SHN_ABS
: return "ABS";
5556 case SHN_COMMON
: return "COM";
5558 if (type
== SHN_IA_64_ANSI_COMMON
5559 && elf_header
.e_machine
== EM_IA_64
5560 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
5562 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
5563 sprintf (buff
, "PRC[0x%04x]", type
);
5564 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
5565 sprintf (buff
, "OS [0x%04x]", type
);
5566 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
5567 sprintf (buff
, "RSV[0x%04x]", type
);
5569 sprintf (buff
, "%3d", type
);
5577 get_dynamic_data (FILE *file
, unsigned int number
)
5579 unsigned char *e_data
;
5582 e_data
= malloc (number
* 4);
5586 error (_("Out of memory\n"));
5590 if (fread (e_data
, 4, number
, file
) != number
)
5592 error (_("Unable to read in dynamic data\n"));
5596 i_data
= malloc (number
* sizeof (*i_data
));
5600 error (_("Out of memory\n"));
5606 i_data
[number
] = byte_get (e_data
+ number
* 4, 4);
5613 /* Dump the symbol table. */
5615 process_symbol_table (FILE *file
)
5617 Elf_Internal_Shdr
*section
;
5618 unsigned char nb
[4];
5619 unsigned char nc
[4];
5622 int *buckets
= NULL
;
5625 if (! do_syms
&& !do_histogram
)
5628 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
5632 (archive_file_offset
5633 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
5634 sizeof nb
+ sizeof nc
)),
5637 error (_("Unable to seek to start of dynamic information"));
5641 if (fread (nb
, sizeof (nb
), 1, file
) != 1)
5643 error (_("Failed to read in number of buckets\n"));
5647 if (fread (nc
, sizeof (nc
), 1, file
) != 1)
5649 error (_("Failed to read in number of chains\n"));
5653 nbuckets
= byte_get (nb
, 4);
5654 nchains
= byte_get (nc
, 4);
5656 buckets
= get_dynamic_data (file
, nbuckets
);
5657 chains
= get_dynamic_data (file
, nchains
);
5659 if (buckets
== NULL
|| chains
== NULL
)
5664 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
5669 printf (_("\nSymbol table for image:\n"));
5671 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5673 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5675 for (hn
= 0; hn
< nbuckets
; hn
++)
5680 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
5682 Elf_Internal_Sym
*psym
;
5684 psym
= dynamic_symbols
+ si
;
5686 printf (" %3d %3d: ", si
, hn
);
5687 print_vma (psym
->st_value
, LONG_HEX
);
5689 print_vma (psym
->st_size
, DEC_5
);
5691 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5692 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5693 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5694 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
5695 print_symbol (25, dynamic_strings
+ psym
->st_name
);
5700 else if (do_syms
&& !do_using_dynamic
)
5704 for (i
= 0, section
= section_headers
;
5705 i
< elf_header
.e_shnum
;
5710 Elf_Internal_Sym
*symtab
;
5711 Elf_Internal_Sym
*psym
;
5714 if ( section
->sh_type
!= SHT_SYMTAB
5715 && section
->sh_type
!= SHT_DYNSYM
)
5718 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5719 SECTION_NAME (section
),
5720 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
5722 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5724 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5726 symtab
= GET_ELF_SYMBOLS (file
, section
);
5730 if (section
->sh_link
== elf_header
.e_shstrndx
)
5731 strtab
= string_table
;
5734 Elf_Internal_Shdr
*string_sec
;
5736 string_sec
= SECTION_HEADER (section
->sh_link
);
5738 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
5739 string_sec
->sh_size
, _("string table"));
5742 for (si
= 0, psym
= symtab
;
5743 si
< section
->sh_size
/ section
->sh_entsize
;
5746 printf ("%6d: ", si
);
5747 print_vma (psym
->st_value
, LONG_HEX
);
5749 print_vma (psym
->st_size
, DEC_5
);
5750 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5751 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5752 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5753 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
5754 print_symbol (25, strtab
+ psym
->st_name
);
5756 if (section
->sh_type
== SHT_DYNSYM
&&
5757 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
5759 unsigned char data
[2];
5760 unsigned short vers_data
;
5761 unsigned long offset
;
5765 offset
= offset_from_vma
5766 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
5767 sizeof data
+ si
* sizeof (vers_data
));
5769 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
5770 sizeof (data
), _("version data"));
5772 vers_data
= byte_get (data
, 2);
5774 is_nobits
= (SECTION_HEADER (psym
->st_shndx
)->sh_type
5777 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
5779 if ((vers_data
& 0x8000) || vers_data
> 1)
5781 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
5782 && (is_nobits
|| ! check_def
))
5784 Elf_External_Verneed evn
;
5785 Elf_Internal_Verneed ivn
;
5786 Elf_Internal_Vernaux ivna
;
5788 /* We must test both. */
5789 offset
= offset_from_vma
5790 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
5795 unsigned long vna_off
;
5797 get_data (&evn
, file
, offset
, sizeof (evn
),
5800 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5801 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5803 vna_off
= offset
+ ivn
.vn_aux
;
5807 Elf_External_Vernaux evna
;
5809 get_data (&evna
, file
, vna_off
,
5811 _("version need aux (3)"));
5813 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5814 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5815 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5817 vna_off
+= ivna
.vna_next
;
5819 while (ivna
.vna_other
!= vers_data
5820 && ivna
.vna_next
!= 0);
5822 if (ivna
.vna_other
== vers_data
)
5825 offset
+= ivn
.vn_next
;
5827 while (ivn
.vn_next
!= 0);
5829 if (ivna
.vna_other
== vers_data
)
5832 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
5835 else if (! is_nobits
)
5836 error (_("bad dynamic symbol"));
5843 if (vers_data
!= 0x8001
5844 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5846 Elf_Internal_Verdef ivd
;
5847 Elf_Internal_Verdaux ivda
;
5848 Elf_External_Verdaux evda
;
5849 unsigned long offset
;
5851 offset
= offset_from_vma
5853 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
5854 sizeof (Elf_External_Verdef
));
5858 Elf_External_Verdef evd
;
5860 get_data (&evd
, file
, offset
, sizeof (evd
),
5863 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5864 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5865 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5867 offset
+= ivd
.vd_next
;
5869 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
5870 && ivd
.vd_next
!= 0);
5872 offset
-= ivd
.vd_next
;
5873 offset
+= ivd
.vd_aux
;
5875 get_data (&evda
, file
, offset
, sizeof (evda
),
5876 _("version def aux"));
5878 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5880 if (psym
->st_name
!= ivda
.vda_name
)
5881 printf ((vers_data
& 0x8000)
5883 strtab
+ ivda
.vda_name
);
5893 if (strtab
!= string_table
)
5899 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5901 if (do_histogram
&& buckets
!= NULL
)
5908 int nzero_counts
= 0;
5911 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5913 printf (_(" Length Number %% of total Coverage\n"));
5915 lengths
= calloc (nbuckets
, sizeof (int));
5916 if (lengths
== NULL
)
5918 error (_("Out of memory"));
5921 for (hn
= 0; hn
< nbuckets
; ++hn
)
5926 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
5929 if (maxlength
< ++lengths
[hn
])
5934 counts
= calloc (maxlength
+ 1, sizeof (int));
5937 error (_("Out of memory"));
5941 for (hn
= 0; hn
< nbuckets
; ++hn
)
5942 ++counts
[lengths
[hn
]];
5946 printf (" 0 %-10d (%5.1f%%)\n",
5947 counts
[0], (counts
[0] * 100.0) / nbuckets
);
5948 for (si
= 1; si
<= maxlength
; ++si
)
5950 nzero_counts
+= counts
[si
] * si
;
5951 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5952 si
, counts
[si
], (counts
[si
] * 100.0) / nbuckets
,
5953 (nzero_counts
* 100.0) / nsyms
);
5961 if (buckets
!= NULL
)
5971 process_syminfo (FILE *file ATTRIBUTE_UNUSED
)
5975 if (dynamic_syminfo
== NULL
5977 /* No syminfo, this is ok. */
5980 /* There better should be a dynamic symbol section. */
5981 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
5985 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5986 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
5988 printf (_(" Num: Name BoundTo Flags\n"));
5989 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
5991 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
5993 printf ("%4d: ", i
);
5994 print_symbol (30, dynamic_strings
+ dynamic_symbols
[i
].st_name
);
5997 switch (dynamic_syminfo
[i
].si_boundto
)
5999 case SYMINFO_BT_SELF
:
6000 fputs ("SELF ", stdout
);
6002 case SYMINFO_BT_PARENT
:
6003 fputs ("PARENT ", stdout
);
6006 if (dynamic_syminfo
[i
].si_boundto
> 0
6007 && dynamic_syminfo
[i
].si_boundto
< dynamic_size
)
6012 [dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
6016 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
6020 if (flags
& SYMINFO_FLG_DIRECT
)
6022 if (flags
& SYMINFO_FLG_PASSTHRU
)
6023 printf (" PASSTHRU");
6024 if (flags
& SYMINFO_FLG_COPY
)
6026 if (flags
& SYMINFO_FLG_LAZYLOAD
)
6027 printf (" LAZYLOAD");
6035 #ifdef SUPPORT_DISASSEMBLY
6037 disassemble_section (Elf_Internal_Shdr
*section
, FILE *file
)
6039 printf (_("\nAssembly dump of section %s\n"),
6040 SECTION_NAME (section
));
6042 /* XXX -- to be done --- XXX */
6049 dump_section (Elf_Internal_Shdr
*section
, FILE *file
)
6051 bfd_size_type bytes
;
6053 unsigned char *data
;
6054 unsigned char *start
;
6056 bytes
= section
->sh_size
;
6060 printf (_("\nSection '%s' has no data to dump.\n"),
6061 SECTION_NAME (section
));
6065 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
6067 addr
= section
->sh_addr
;
6069 start
= get_data (NULL
, file
, section
->sh_offset
, bytes
, _("section data"));
6081 lbytes
= (bytes
> 16 ? 16 : bytes
);
6083 printf (" 0x%8.8lx ", (unsigned long) addr
);
6085 switch (elf_header
.e_ident
[EI_DATA
])
6089 for (j
= 15; j
>= 0; j
--)
6092 printf ("%2.2x", data
[j
]);
6102 for (j
= 0; j
< 16; j
++)
6105 printf ("%2.2x", data
[j
]);
6115 for (j
= 0; j
< lbytes
; j
++)
6118 if (k
>= ' ' && k
< 0x80)
6137 static unsigned long int
6138 read_leb128 (unsigned char *data
, int *length_return
, int sign
)
6140 unsigned long int result
= 0;
6141 unsigned int num_read
= 0;
6150 result
|= (byte
& 0x7f) << shift
;
6155 while (byte
& 0x80);
6157 if (length_return
!= NULL
)
6158 *length_return
= num_read
;
6160 if (sign
&& (shift
< 32) && (byte
& 0x40))
6161 result
|= -1 << shift
;
6166 typedef struct State_Machine_Registers
6168 unsigned long address
;
6171 unsigned int column
;
6175 /* This variable hold the number of the last entry seen
6176 in the File Table. */
6177 unsigned int last_file_entry
;
6180 static SMR state_machine_regs
;
6183 reset_state_machine (int is_stmt
)
6185 state_machine_regs
.address
= 0;
6186 state_machine_regs
.file
= 1;
6187 state_machine_regs
.line
= 1;
6188 state_machine_regs
.column
= 0;
6189 state_machine_regs
.is_stmt
= is_stmt
;
6190 state_machine_regs
.basic_block
= 0;
6191 state_machine_regs
.end_sequence
= 0;
6192 state_machine_regs
.last_file_entry
= 0;
6195 /* Handled an extend line op. Returns true if this is the end
6198 process_extended_line_op (unsigned char *data
, int is_stmt
, int pointer_size
)
6200 unsigned char op_code
;
6203 unsigned char *name
;
6206 len
= read_leb128 (data
, & bytes_read
, 0);
6211 warn (_("badly formed extended line op encountered!\n"));
6218 printf (_(" Extended opcode %d: "), op_code
);
6222 case DW_LNE_end_sequence
:
6223 printf (_("End of Sequence\n\n"));
6224 reset_state_machine (is_stmt
);
6227 case DW_LNE_set_address
:
6228 adr
= byte_get (data
, pointer_size
);
6229 printf (_("set Address to 0x%lx\n"), adr
);
6230 state_machine_regs
.address
= adr
;
6233 case DW_LNE_define_file
:
6234 printf (_(" define new File Table entry\n"));
6235 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6237 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
6239 data
+= strlen ((char *) data
) + 1;
6240 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6242 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6244 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6245 printf (_("%s\n\n"), name
);
6249 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
6256 /* Size of pointers in the .debug_line section. This information is not
6257 really present in that section. It's obtained before dumping the debug
6258 sections by doing some pre-scan of the .debug_info section. */
6259 static int debug_line_pointer_size
= 4;
6262 display_debug_lines (Elf_Internal_Shdr
*section
,
6263 unsigned char * start
,
6264 FILE *file ATTRIBUTE_UNUSED
)
6266 unsigned char *hdrptr
;
6267 DWARF2_Internal_LineInfo info
;
6268 unsigned char *standard_opcodes
;
6269 unsigned char *data
= start
;
6270 unsigned char *end
= start
+ section
->sh_size
;
6271 unsigned char *end_of_sequence
;
6274 int initial_length_size
;
6276 printf (_("\nDump of debug contents of section %s:\n\n"),
6277 SECTION_NAME (section
));
6283 /* Check the length of the block. */
6284 info
.li_length
= byte_get (hdrptr
, 4);
6287 if (info
.li_length
== 0xffffffff)
6289 /* This section is 64-bit DWARF 3. */
6290 info
.li_length
= byte_get (hdrptr
, 8);
6293 initial_length_size
= 12;
6298 initial_length_size
= 4;
6301 if (info
.li_length
+ initial_length_size
> section
->sh_size
)
6304 (_("The line info appears to be corrupt - the section is too small\n"));
6308 /* Check its version number. */
6309 info
.li_version
= byte_get (hdrptr
, 2);
6311 if (info
.li_version
!= 2 && info
.li_version
!= 3)
6313 warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
6317 info
.li_prologue_length
= byte_get (hdrptr
, offset_size
);
6318 hdrptr
+= offset_size
;
6319 info
.li_min_insn_length
= byte_get (hdrptr
, 1);
6321 info
.li_default_is_stmt
= byte_get (hdrptr
, 1);
6323 info
.li_line_base
= byte_get (hdrptr
, 1);
6325 info
.li_line_range
= byte_get (hdrptr
, 1);
6327 info
.li_opcode_base
= byte_get (hdrptr
, 1);
6330 /* Sign extend the line base field. */
6331 info
.li_line_base
<<= 24;
6332 info
.li_line_base
>>= 24;
6334 printf (_(" Length: %ld\n"), info
.li_length
);
6335 printf (_(" DWARF Version: %d\n"), info
.li_version
);
6336 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
6337 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
6338 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
6339 printf (_(" Line Base: %d\n"), info
.li_line_base
);
6340 printf (_(" Line Range: %d\n"), info
.li_line_range
);
6341 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
6343 end_of_sequence
= data
+ info
.li_length
+ initial_length_size
;
6345 reset_state_machine (info
.li_default_is_stmt
);
6347 /* Display the contents of the Opcodes table. */
6348 standard_opcodes
= hdrptr
;
6350 printf (_("\n Opcodes:\n"));
6352 for (i
= 1; i
< info
.li_opcode_base
; i
++)
6353 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
6355 /* Display the contents of the Directory table. */
6356 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
6359 printf (_("\n The Directory Table is empty.\n"));
6362 printf (_("\n The Directory Table:\n"));
6366 printf (_(" %s\n"), data
);
6368 data
+= strlen ((char *) data
) + 1;
6372 /* Skip the NUL at the end of the table. */
6375 /* Display the contents of the File Name table. */
6377 printf (_("\n The File Name Table is empty.\n"));
6380 printf (_("\n The File Name Table:\n"));
6381 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6385 unsigned char *name
;
6388 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
6391 data
+= strlen ((char *) data
) + 1;
6393 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6395 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6397 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6399 printf (_("%s\n"), name
);
6403 /* Skip the NUL at the end of the table. */
6406 /* Now display the statements. */
6407 printf (_("\n Line Number Statements:\n"));
6410 while (data
< end_of_sequence
)
6412 unsigned char op_code
;
6418 if (op_code
>= info
.li_opcode_base
)
6420 op_code
-= info
.li_opcode_base
;
6421 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
6422 state_machine_regs
.address
+= adv
;
6423 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6424 op_code
, adv
, state_machine_regs
.address
);
6425 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
6426 state_machine_regs
.line
+= adv
;
6427 printf (_(" and Line by %d to %d\n"),
6428 adv
, state_machine_regs
.line
);
6430 else switch (op_code
)
6432 case DW_LNS_extended_op
:
6433 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
6434 debug_line_pointer_size
);
6438 printf (_(" Copy\n"));
6441 case DW_LNS_advance_pc
:
6442 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
6444 state_machine_regs
.address
+= adv
;
6445 printf (_(" Advance PC by %d to %lx\n"), adv
,
6446 state_machine_regs
.address
);
6449 case DW_LNS_advance_line
:
6450 adv
= read_leb128 (data
, & bytes_read
, 1);
6452 state_machine_regs
.line
+= adv
;
6453 printf (_(" Advance Line by %d to %d\n"), adv
,
6454 state_machine_regs
.line
);
6457 case DW_LNS_set_file
:
6458 adv
= read_leb128 (data
, & bytes_read
, 0);
6460 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6462 state_machine_regs
.file
= adv
;
6465 case DW_LNS_set_column
:
6466 adv
= read_leb128 (data
, & bytes_read
, 0);
6468 printf (_(" Set column to %d\n"), adv
);
6469 state_machine_regs
.column
= adv
;
6472 case DW_LNS_negate_stmt
:
6473 adv
= state_machine_regs
.is_stmt
;
6475 printf (_(" Set is_stmt to %d\n"), adv
);
6476 state_machine_regs
.is_stmt
= adv
;
6479 case DW_LNS_set_basic_block
:
6480 printf (_(" Set basic block\n"));
6481 state_machine_regs
.basic_block
= 1;
6484 case DW_LNS_const_add_pc
:
6485 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
6486 * info
.li_min_insn_length
);
6487 state_machine_regs
.address
+= adv
;
6488 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
6489 state_machine_regs
.address
);
6492 case DW_LNS_fixed_advance_pc
:
6493 adv
= byte_get (data
, 2);
6495 state_machine_regs
.address
+= adv
;
6496 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6497 adv
, state_machine_regs
.address
);
6500 case DW_LNS_set_prologue_end
:
6501 printf (_(" Set prologue_end to true\n"));
6504 case DW_LNS_set_epilogue_begin
:
6505 printf (_(" Set epilogue_begin to true\n"));
6508 case DW_LNS_set_isa
:
6509 adv
= read_leb128 (data
, & bytes_read
, 0);
6511 printf (_(" Set ISA to %d\n"), adv
);
6515 printf (_(" Unknown opcode %d with operands: "), op_code
);
6518 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
6520 printf ("0x%lx%s", read_leb128 (data
, &bytes_read
, 0),
6521 i
== 1 ? "" : ", ");
6536 display_debug_pubnames (Elf_Internal_Shdr
*section
,
6537 unsigned char *start
,
6538 FILE *file ATTRIBUTE_UNUSED
)
6540 DWARF2_Internal_PubNames pubnames
;
6543 end
= start
+ section
->sh_size
;
6545 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6549 unsigned char *data
;
6550 unsigned long offset
;
6551 int offset_size
, initial_length_size
;
6555 pubnames
.pn_length
= byte_get (data
, 4);
6557 if (pubnames
.pn_length
== 0xffffffff)
6559 pubnames
.pn_length
= byte_get (data
, 8);
6562 initial_length_size
= 12;
6567 initial_length_size
= 4;
6570 pubnames
.pn_version
= byte_get (data
, 2);
6572 pubnames
.pn_offset
= byte_get (data
, offset_size
);
6573 data
+= offset_size
;
6574 pubnames
.pn_size
= byte_get (data
, offset_size
);
6575 data
+= offset_size
;
6577 start
+= pubnames
.pn_length
+ initial_length_size
;
6579 if (pubnames
.pn_version
!= 2 && pubnames
.pn_version
!= 3)
6581 static int warned
= 0;
6585 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
6592 printf (_(" Length: %ld\n"),
6593 pubnames
.pn_length
);
6594 printf (_(" Version: %d\n"),
6595 pubnames
.pn_version
);
6596 printf (_(" Offset into .debug_info section: %ld\n"),
6597 pubnames
.pn_offset
);
6598 printf (_(" Size of area in .debug_info section: %ld\n"),
6601 printf (_("\n Offset\tName\n"));
6605 offset
= byte_get (data
, offset_size
);
6609 data
+= offset_size
;
6610 printf (" %ld\t\t%s\n", offset
, data
);
6611 data
+= strlen ((char *) data
) + 1;
6614 while (offset
!= 0);
6622 get_TAG_name (unsigned long tag
)
6626 case DW_TAG_padding
: return "DW_TAG_padding";
6627 case DW_TAG_array_type
: return "DW_TAG_array_type";
6628 case DW_TAG_class_type
: return "DW_TAG_class_type";
6629 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
6630 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
6631 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
6632 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
6633 case DW_TAG_label
: return "DW_TAG_label";
6634 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
6635 case DW_TAG_member
: return "DW_TAG_member";
6636 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
6637 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
6638 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
6639 case DW_TAG_string_type
: return "DW_TAG_string_type";
6640 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
6641 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
6642 case DW_TAG_typedef
: return "DW_TAG_typedef";
6643 case DW_TAG_union_type
: return "DW_TAG_union_type";
6644 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
6645 case DW_TAG_variant
: return "DW_TAG_variant";
6646 case DW_TAG_common_block
: return "DW_TAG_common_block";
6647 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
6648 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
6649 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
6650 case DW_TAG_module
: return "DW_TAG_module";
6651 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
6652 case DW_TAG_set_type
: return "DW_TAG_set_type";
6653 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
6654 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
6655 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
6656 case DW_TAG_base_type
: return "DW_TAG_base_type";
6657 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
6658 case DW_TAG_const_type
: return "DW_TAG_const_type";
6659 case DW_TAG_constant
: return "DW_TAG_constant";
6660 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
6661 case DW_TAG_file_type
: return "DW_TAG_file_type";
6662 case DW_TAG_friend
: return "DW_TAG_friend";
6663 case DW_TAG_namelist
: return "DW_TAG_namelist";
6664 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
6665 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
6666 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
6667 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
6668 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
6669 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
6670 case DW_TAG_try_block
: return "DW_TAG_try_block";
6671 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
6672 case DW_TAG_variable
: return "DW_TAG_variable";
6673 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
6674 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
6675 case DW_TAG_format_label
: return "DW_TAG_format_label";
6676 case DW_TAG_function_template
: return "DW_TAG_function_template";
6677 case DW_TAG_class_template
: return "DW_TAG_class_template";
6678 /* DWARF 2.1 values. */
6679 case DW_TAG_dwarf_procedure
: return "DW_TAG_dwarf_procedure";
6680 case DW_TAG_restrict_type
: return "DW_TAG_restrict_type";
6681 case DW_TAG_interface_type
: return "DW_TAG_interface_type";
6682 case DW_TAG_namespace
: return "DW_TAG_namespace";
6683 case DW_TAG_imported_module
: return "DW_TAG_imported_module";
6684 case DW_TAG_unspecified_type
: return "DW_TAG_unspecified_type";
6685 case DW_TAG_partial_unit
: return "DW_TAG_partial_unit";
6686 case DW_TAG_imported_unit
: return "DW_TAG_imported_unit";
6688 case DW_TAG_upc_shared_type
: return "DW_TAG_upc_shared_type";
6689 case DW_TAG_upc_strict_type
: return "DW_TAG_upc_strict_type";
6690 case DW_TAG_upc_relaxed_type
: return "DW_TAG_upc_relaxed_type";
6693 static char buffer
[100];
6695 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
6702 get_AT_name (unsigned long attribute
)
6706 case DW_AT_sibling
: return "DW_AT_sibling";
6707 case DW_AT_location
: return "DW_AT_location";
6708 case DW_AT_name
: return "DW_AT_name";
6709 case DW_AT_ordering
: return "DW_AT_ordering";
6710 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
6711 case DW_AT_byte_size
: return "DW_AT_byte_size";
6712 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
6713 case DW_AT_bit_size
: return "DW_AT_bit_size";
6714 case DW_AT_element_list
: return "DW_AT_element_list";
6715 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
6716 case DW_AT_low_pc
: return "DW_AT_low_pc";
6717 case DW_AT_high_pc
: return "DW_AT_high_pc";
6718 case DW_AT_language
: return "DW_AT_language";
6719 case DW_AT_member
: return "DW_AT_member";
6720 case DW_AT_discr
: return "DW_AT_discr";
6721 case DW_AT_discr_value
: return "DW_AT_discr_value";
6722 case DW_AT_visibility
: return "DW_AT_visibility";
6723 case DW_AT_import
: return "DW_AT_import";
6724 case DW_AT_string_length
: return "DW_AT_string_length";
6725 case DW_AT_common_reference
: return "DW_AT_common_reference";
6726 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
6727 case DW_AT_const_value
: return "DW_AT_const_value";
6728 case DW_AT_containing_type
: return "DW_AT_containing_type";
6729 case DW_AT_default_value
: return "DW_AT_default_value";
6730 case DW_AT_inline
: return "DW_AT_inline";
6731 case DW_AT_is_optional
: return "DW_AT_is_optional";
6732 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
6733 case DW_AT_producer
: return "DW_AT_producer";
6734 case DW_AT_prototyped
: return "DW_AT_prototyped";
6735 case DW_AT_return_addr
: return "DW_AT_return_addr";
6736 case DW_AT_start_scope
: return "DW_AT_start_scope";
6737 case DW_AT_stride_size
: return "DW_AT_stride_size";
6738 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
6739 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
6740 case DW_AT_accessibility
: return "DW_AT_accessibility";
6741 case DW_AT_address_class
: return "DW_AT_address_class";
6742 case DW_AT_artificial
: return "DW_AT_artificial";
6743 case DW_AT_base_types
: return "DW_AT_base_types";
6744 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
6745 case DW_AT_count
: return "DW_AT_count";
6746 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
6747 case DW_AT_decl_column
: return "DW_AT_decl_column";
6748 case DW_AT_decl_file
: return "DW_AT_decl_file";
6749 case DW_AT_decl_line
: return "DW_AT_decl_line";
6750 case DW_AT_declaration
: return "DW_AT_declaration";
6751 case DW_AT_discr_list
: return "DW_AT_discr_list";
6752 case DW_AT_encoding
: return "DW_AT_encoding";
6753 case DW_AT_external
: return "DW_AT_external";
6754 case DW_AT_frame_base
: return "DW_AT_frame_base";
6755 case DW_AT_friend
: return "DW_AT_friend";
6756 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
6757 case DW_AT_macro_info
: return "DW_AT_macro_info";
6758 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
6759 case DW_AT_priority
: return "DW_AT_priority";
6760 case DW_AT_segment
: return "DW_AT_segment";
6761 case DW_AT_specification
: return "DW_AT_specification";
6762 case DW_AT_static_link
: return "DW_AT_static_link";
6763 case DW_AT_type
: return "DW_AT_type";
6764 case DW_AT_use_location
: return "DW_AT_use_location";
6765 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
6766 case DW_AT_virtuality
: return "DW_AT_virtuality";
6767 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
6768 /* DWARF 2.1 values. */
6769 case DW_AT_allocated
: return "DW_AT_allocated";
6770 case DW_AT_associated
: return "DW_AT_associated";
6771 case DW_AT_data_location
: return "DW_AT_data_location";
6772 case DW_AT_stride
: return "DW_AT_stride";
6773 case DW_AT_entry_pc
: return "DW_AT_entry_pc";
6774 case DW_AT_use_UTF8
: return "DW_AT_use_UTF8";
6775 case DW_AT_extension
: return "DW_AT_extension";
6776 case DW_AT_ranges
: return "DW_AT_ranges";
6777 case DW_AT_trampoline
: return "DW_AT_trampoline";
6778 case DW_AT_call_column
: return "DW_AT_call_column";
6779 case DW_AT_call_file
: return "DW_AT_call_file";
6780 case DW_AT_call_line
: return "DW_AT_call_line";
6781 /* SGI/MIPS extensions. */
6782 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
6783 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
6784 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
6785 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
6786 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
6787 case DW_AT_MIPS_software_pipeline_depth
:
6788 return "DW_AT_MIPS_software_pipeline_depth";
6789 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
6790 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
6791 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
6792 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
6793 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
6794 /* GNU extensions. */
6795 case DW_AT_sf_names
: return "DW_AT_sf_names";
6796 case DW_AT_src_info
: return "DW_AT_src_info";
6797 case DW_AT_mac_info
: return "DW_AT_mac_info";
6798 case DW_AT_src_coords
: return "DW_AT_src_coords";
6799 case DW_AT_body_begin
: return "DW_AT_body_begin";
6800 case DW_AT_body_end
: return "DW_AT_body_end";
6801 case DW_AT_GNU_vector
: return "DW_AT_GNU_vector";
6802 /* UPC extension. */
6803 case DW_AT_upc_threads_scaled
: return "DW_AT_upc_threads_scaled";
6806 static char buffer
[100];
6808 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
6815 get_FORM_name (unsigned long form
)
6819 case DW_FORM_addr
: return "DW_FORM_addr";
6820 case DW_FORM_block2
: return "DW_FORM_block2";
6821 case DW_FORM_block4
: return "DW_FORM_block4";
6822 case DW_FORM_data2
: return "DW_FORM_data2";
6823 case DW_FORM_data4
: return "DW_FORM_data4";
6824 case DW_FORM_data8
: return "DW_FORM_data8";
6825 case DW_FORM_string
: return "DW_FORM_string";
6826 case DW_FORM_block
: return "DW_FORM_block";
6827 case DW_FORM_block1
: return "DW_FORM_block1";
6828 case DW_FORM_data1
: return "DW_FORM_data1";
6829 case DW_FORM_flag
: return "DW_FORM_flag";
6830 case DW_FORM_sdata
: return "DW_FORM_sdata";
6831 case DW_FORM_strp
: return "DW_FORM_strp";
6832 case DW_FORM_udata
: return "DW_FORM_udata";
6833 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
6834 case DW_FORM_ref1
: return "DW_FORM_ref1";
6835 case DW_FORM_ref2
: return "DW_FORM_ref2";
6836 case DW_FORM_ref4
: return "DW_FORM_ref4";
6837 case DW_FORM_ref8
: return "DW_FORM_ref8";
6838 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
6839 case DW_FORM_indirect
: return "DW_FORM_indirect";
6842 static char buffer
[100];
6844 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
6850 /* FIXME: There are better and more effiecint ways to handle
6851 these structures. For now though, I just want something that
6852 is simple to implement. */
6853 typedef struct abbrev_attr
6855 unsigned long attribute
;
6857 struct abbrev_attr
*next
;
6861 typedef struct abbrev_entry
6863 unsigned long entry
;
6866 struct abbrev_attr
*first_attr
;
6867 struct abbrev_attr
*last_attr
;
6868 struct abbrev_entry
*next
;
6872 static abbrev_entry
*first_abbrev
= NULL
;
6873 static abbrev_entry
*last_abbrev
= NULL
;
6878 abbrev_entry
*abbrev
;
6880 for (abbrev
= first_abbrev
; abbrev
;)
6882 abbrev_entry
*next
= abbrev
->next
;
6885 for (attr
= abbrev
->first_attr
; attr
;)
6887 abbrev_attr
*next
= attr
->next
;
6897 last_abbrev
= first_abbrev
= NULL
;
6901 add_abbrev (unsigned long number
, unsigned long tag
, int children
)
6903 abbrev_entry
*entry
;
6905 entry
= malloc (sizeof (*entry
));
6911 entry
->entry
= number
;
6913 entry
->children
= children
;
6914 entry
->first_attr
= NULL
;
6915 entry
->last_attr
= NULL
;
6918 if (first_abbrev
== NULL
)
6919 first_abbrev
= entry
;
6921 last_abbrev
->next
= entry
;
6923 last_abbrev
= entry
;
6927 add_abbrev_attr (unsigned long attribute
, unsigned long form
)
6931 attr
= malloc (sizeof (*attr
));
6937 attr
->attribute
= attribute
;
6941 if (last_abbrev
->first_attr
== NULL
)
6942 last_abbrev
->first_attr
= attr
;
6944 last_abbrev
->last_attr
->next
= attr
;
6946 last_abbrev
->last_attr
= attr
;
6949 /* Processes the (partial) contents of a .debug_abbrev section.
6950 Returns NULL if the end of the section was encountered.
6951 Returns the address after the last byte read if the end of
6952 an abbreviation set was found. */
6954 static unsigned char *
6955 process_abbrev_section (unsigned char *start
, unsigned char *end
)
6957 if (first_abbrev
!= NULL
)
6963 unsigned long entry
;
6965 unsigned long attribute
;
6968 entry
= read_leb128 (start
, & bytes_read
, 0);
6969 start
+= bytes_read
;
6971 /* A single zero is supposed to end the section according
6972 to the standard. If there's more, then signal that to
6975 return start
== end
? NULL
: start
;
6977 tag
= read_leb128 (start
, & bytes_read
, 0);
6978 start
+= bytes_read
;
6980 children
= *start
++;
6982 add_abbrev (entry
, tag
, children
);
6988 attribute
= read_leb128 (start
, & bytes_read
, 0);
6989 start
+= bytes_read
;
6991 form
= read_leb128 (start
, & bytes_read
, 0);
6992 start
+= bytes_read
;
6995 add_abbrev_attr (attribute
, form
);
6997 while (attribute
!= 0);
7005 display_debug_macinfo (Elf_Internal_Shdr
*section
,
7006 unsigned char *start
,
7007 FILE *file ATTRIBUTE_UNUSED
)
7009 unsigned char *end
= start
+ section
->sh_size
;
7010 unsigned char *curr
= start
;
7011 unsigned int bytes_read
;
7012 enum dwarf_macinfo_record_type op
;
7014 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7018 unsigned int lineno
;
7026 case DW_MACINFO_start_file
:
7028 unsigned int filenum
;
7030 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7032 filenum
= read_leb128 (curr
, & bytes_read
, 0);
7035 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno
, filenum
);
7039 case DW_MACINFO_end_file
:
7040 printf (_(" DW_MACINFO_end_file\n"));
7043 case DW_MACINFO_define
:
7044 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7047 curr
+= strlen (string
) + 1;
7048 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno
, string
);
7051 case DW_MACINFO_undef
:
7052 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7055 curr
+= strlen (string
) + 1;
7056 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno
, string
);
7059 case DW_MACINFO_vendor_ext
:
7061 unsigned int constant
;
7063 constant
= read_leb128 (curr
, & bytes_read
, 0);
7066 curr
+= strlen (string
) + 1;
7067 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant
, string
);
7078 display_debug_abbrev (Elf_Internal_Shdr
*section
,
7079 unsigned char *start
,
7080 FILE *file ATTRIBUTE_UNUSED
)
7082 abbrev_entry
*entry
;
7083 unsigned char *end
= start
+ section
->sh_size
;
7085 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7089 start
= process_abbrev_section (start
, end
);
7091 if (first_abbrev
== NULL
)
7094 printf (_(" Number TAG\n"));
7096 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
7100 printf (_(" %ld %s [%s]\n"),
7102 get_TAG_name (entry
->tag
),
7103 entry
->children
? _("has children") : _("no children"));
7105 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
7107 printf (_(" %-18s %s\n"),
7108 get_AT_name (attr
->attribute
),
7109 get_FORM_name (attr
->form
));
7123 static unsigned char *
7124 display_block (unsigned char *data
, unsigned long length
)
7126 printf (_(" %lu byte block: "), length
);
7129 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
7135 decode_location_expression (unsigned char * data
,
7136 unsigned int pointer_size
,
7137 unsigned long length
)
7141 unsigned long uvalue
;
7142 unsigned char *end
= data
+ length
;
7151 printf ("DW_OP_addr: %lx",
7152 (unsigned long) byte_get (data
, pointer_size
));
7153 data
+= pointer_size
;
7156 printf ("DW_OP_deref");
7159 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
7162 printf ("DW_OP_const1s: %ld", (long) byte_get (data
++, 1));
7165 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
7169 printf ("DW_OP_const2s: %ld", (long) byte_get (data
, 2));
7173 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
7177 printf ("DW_OP_const4s: %ld", (long) byte_get (data
, 4));
7181 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
7182 (unsigned long) byte_get (data
+ 4, 4));
7186 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
7187 (long) byte_get (data
+ 4, 4));
7191 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
7195 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
7199 printf ("DW_OP_dup");
7202 printf ("DW_OP_drop");
7205 printf ("DW_OP_over");
7208 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
7211 printf ("DW_OP_swap");
7214 printf ("DW_OP_rot");
7217 printf ("DW_OP_xderef");
7220 printf ("DW_OP_abs");
7223 printf ("DW_OP_and");
7226 printf ("DW_OP_div");
7229 printf ("DW_OP_minus");
7232 printf ("DW_OP_mod");
7235 printf ("DW_OP_mul");
7238 printf ("DW_OP_neg");
7241 printf ("DW_OP_not");
7244 printf ("DW_OP_or");
7247 printf ("DW_OP_plus");
7249 case DW_OP_plus_uconst
:
7250 printf ("DW_OP_plus_uconst: %lu",
7251 read_leb128 (data
, &bytes_read
, 0));
7255 printf ("DW_OP_shl");
7258 printf ("DW_OP_shr");
7261 printf ("DW_OP_shra");
7264 printf ("DW_OP_xor");
7267 printf ("DW_OP_bra: %ld", (long) byte_get (data
, 2));
7271 printf ("DW_OP_eq");
7274 printf ("DW_OP_ge");
7277 printf ("DW_OP_gt");
7280 printf ("DW_OP_le");
7283 printf ("DW_OP_lt");
7286 printf ("DW_OP_ne");
7289 printf ("DW_OP_skip: %ld", (long) byte_get (data
, 2));
7325 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
7360 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
7395 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
7396 read_leb128 (data
, &bytes_read
, 1));
7401 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
7405 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
7409 uvalue
= read_leb128 (data
, &bytes_read
, 0);
7411 printf ("DW_OP_bregx: %lu %ld", uvalue
,
7412 read_leb128 (data
, &bytes_read
, 1));
7416 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
7419 case DW_OP_deref_size
:
7420 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
7422 case DW_OP_xderef_size
:
7423 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
7426 printf ("DW_OP_nop");
7429 /* DWARF 3 extensions. */
7430 case DW_OP_push_object_address
:
7431 printf ("DW_OP_push_object_address");
7434 printf ("DW_OP_call2: <%lx>", (long) byte_get (data
, 2));
7438 printf ("DW_OP_call4: <%lx>", (long) byte_get (data
, 4));
7441 case DW_OP_call_ref
:
7442 printf ("DW_OP_call_ref");
7445 /* GNU extensions. */
7446 case DW_OP_GNU_push_tls_address
:
7447 printf ("DW_OP_GNU_push_tls_address");
7451 if (op
>= DW_OP_lo_user
7452 && op
<= DW_OP_hi_user
)
7453 printf (_("(User defined location op)"));
7455 printf (_("(Unknown location op)"));
7456 /* No way to tell where the next op is, so just bail. */
7460 /* Separate the ops. */
7466 static const char *debug_loc_contents
;
7467 static bfd_vma debug_loc_size
;
7470 load_debug_loc (FILE *file
)
7472 Elf_Internal_Shdr
*sec
;
7475 /* If it is already loaded, do nothing. */
7476 if (debug_loc_contents
!= NULL
)
7479 /* Locate the .debug_loc section. */
7480 for (i
= 0, sec
= section_headers
;
7481 i
< elf_header
.e_shnum
;
7483 if (strcmp (SECTION_NAME (sec
), ".debug_loc") == 0)
7486 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
7489 debug_loc_size
= sec
->sh_size
;
7491 debug_loc_contents
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7492 _("debug_loc section data"));
7496 free_debug_loc (void)
7498 if (debug_loc_contents
== NULL
)
7501 free ((char *) debug_loc_contents
);
7502 debug_loc_contents
= NULL
;
7508 display_debug_loc (Elf_Internal_Shdr
*section
,
7509 unsigned char *start
,
7510 FILE *file ATTRIBUTE_UNUSED
)
7512 unsigned char *section_end
;
7513 unsigned long bytes
;
7514 unsigned char *section_begin
= start
;
7517 addr
= section
->sh_addr
;
7518 bytes
= section
->sh_size
;
7519 section_end
= start
+ bytes
;
7523 printf (_("\nThe .debug_loc section is empty.\n"));
7527 printf (_("Contents of the .debug_loc section:\n\n"));
7528 printf (_("\n Offset Begin End Expression\n"));
7530 while (start
< section_end
)
7532 unsigned long begin
;
7534 unsigned short length
;
7535 unsigned long offset
;
7537 offset
= start
- section_begin
;
7541 /* Normally, the lists in the debug_loc section are related to a
7542 given compilation unit, and thus, we would use the pointer size
7543 of that compilation unit. However, since we are displaying it
7544 seperately here, we either have to store pointer sizes of all
7545 compilation units, or assume they don't change. We assume,
7546 like the debug_line display, that it doesn't change. */
7547 begin
= byte_get (start
, debug_line_pointer_size
);
7548 start
+= debug_line_pointer_size
;
7549 end
= byte_get (start
, debug_line_pointer_size
);
7550 start
+= debug_line_pointer_size
;
7552 if (begin
== 0 && end
== 0)
7555 /* For now, skip any base address specifiers. */
7556 if (begin
== 0xffffffff)
7562 length
= byte_get (start
, 2);
7565 printf (" %8.8lx %8.8lx %8.8lx (", offset
, begin
, end
);
7566 decode_location_expression (start
, debug_line_pointer_size
, length
);
7576 static const char *debug_str_contents
;
7577 static bfd_vma debug_str_size
;
7580 load_debug_str (FILE *file
)
7582 Elf_Internal_Shdr
*sec
;
7585 /* If it is already loaded, do nothing. */
7586 if (debug_str_contents
!= NULL
)
7589 /* Locate the .debug_str section. */
7590 for (i
= 0, sec
= section_headers
;
7591 i
< elf_header
.e_shnum
;
7593 if (strcmp (SECTION_NAME (sec
), ".debug_str") == 0)
7596 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
7599 debug_str_size
= sec
->sh_size
;
7601 debug_str_contents
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7602 _("debug_str section data"));
7606 free_debug_str (void)
7608 if (debug_str_contents
== NULL
)
7611 free ((char *) debug_str_contents
);
7612 debug_str_contents
= NULL
;
7617 fetch_indirect_string (unsigned long offset
)
7619 if (debug_str_contents
== NULL
)
7620 return _("<no .debug_str section>");
7622 if (offset
> debug_str_size
)
7623 return _("<offset is too big>");
7625 return debug_str_contents
+ offset
;
7629 display_debug_str (Elf_Internal_Shdr
*section
,
7630 unsigned char *start
,
7631 FILE *file ATTRIBUTE_UNUSED
)
7633 unsigned long bytes
;
7636 addr
= section
->sh_addr
;
7637 bytes
= section
->sh_size
;
7641 printf (_("\nThe .debug_str section is empty.\n"));
7645 printf (_("Contents of the .debug_str section:\n\n"));
7653 lbytes
= (bytes
> 16 ? 16 : bytes
);
7655 printf (" 0x%8.8lx ", (unsigned long) addr
);
7657 for (j
= 0; j
< 16; j
++)
7660 printf ("%2.2x", start
[j
]);
7668 for (j
= 0; j
< lbytes
; j
++)
7671 if (k
>= ' ' && k
< 0x80)
7687 static unsigned char *
7688 read_and_display_attr_value (unsigned long attribute
,
7690 unsigned char *data
,
7691 unsigned long cu_offset
,
7692 unsigned long pointer_size
,
7693 unsigned long offset_size
,
7696 unsigned long uvalue
= 0;
7697 unsigned char *block_start
= NULL
;
7705 case DW_FORM_ref_addr
:
7706 if (dwarf_version
== 2)
7708 uvalue
= byte_get (data
, pointer_size
);
7709 data
+= pointer_size
;
7711 else if (dwarf_version
== 3)
7713 uvalue
= byte_get (data
, offset_size
);
7714 data
+= offset_size
;
7718 error (_("Internal error: DWARF version is not 2 or 3.\n"));
7723 uvalue
= byte_get (data
, pointer_size
);
7724 data
+= pointer_size
;
7728 uvalue
= byte_get (data
, offset_size
);
7729 data
+= offset_size
;
7735 uvalue
= byte_get (data
++, 1);
7740 uvalue
= byte_get (data
, 2);
7746 uvalue
= byte_get (data
, 4);
7751 uvalue
= read_leb128 (data
, & bytes_read
, 1);
7755 case DW_FORM_ref_udata
:
7757 uvalue
= read_leb128 (data
, & bytes_read
, 0);
7761 case DW_FORM_indirect
:
7762 form
= read_leb128 (data
, & bytes_read
, 0);
7764 printf (" %s", get_FORM_name (form
));
7765 return read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
7766 pointer_size
, offset_size
,
7772 case DW_FORM_ref_addr
:
7773 printf (" <#%lx>", uvalue
);
7779 case DW_FORM_ref_udata
:
7780 printf (" <%lx>", uvalue
+ cu_offset
);
7784 printf (" %#lx", uvalue
);
7792 printf (" %ld", uvalue
);
7797 uvalue
= byte_get (data
, 4);
7798 printf (" %lx", uvalue
);
7799 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
7803 case DW_FORM_string
:
7804 printf (" %s", data
);
7805 data
+= strlen ((char *) data
) + 1;
7809 uvalue
= read_leb128 (data
, & bytes_read
, 0);
7810 block_start
= data
+ bytes_read
;
7811 data
= display_block (block_start
, uvalue
);
7814 case DW_FORM_block1
:
7815 uvalue
= byte_get (data
, 1);
7816 block_start
= data
+ 1;
7817 data
= display_block (block_start
, uvalue
);
7820 case DW_FORM_block2
:
7821 uvalue
= byte_get (data
, 2);
7822 block_start
= data
+ 2;
7823 data
= display_block (block_start
, uvalue
);
7826 case DW_FORM_block4
:
7827 uvalue
= byte_get (data
, 4);
7828 block_start
= data
+ 4;
7829 data
= display_block (block_start
, uvalue
);
7833 printf (_(" (indirect string, offset: 0x%lx): %s"),
7834 uvalue
, fetch_indirect_string (uvalue
));
7837 case DW_FORM_indirect
:
7838 /* Handled above. */
7842 warn (_("Unrecognized form: %d\n"), form
);
7846 /* For some attributes we can display futher information. */
7855 case DW_INL_not_inlined
:
7856 printf (_("(not inlined)"));
7858 case DW_INL_inlined
:
7859 printf (_("(inlined)"));
7861 case DW_INL_declared_not_inlined
:
7862 printf (_("(declared as inline but ignored)"));
7864 case DW_INL_declared_inlined
:
7865 printf (_("(declared as inline and inlined)"));
7868 printf (_(" (Unknown inline attribute value: %lx)"), uvalue
);
7873 case DW_AT_language
:
7876 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
7877 case DW_LANG_C89
: printf ("(ANSI C)"); break;
7878 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
7879 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
7880 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
7881 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
7882 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
7883 case DW_LANG_Ada83
: printf ("(Ada)"); break;
7884 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
7885 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
7886 /* DWARF 2.1 values. */
7887 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
7888 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
7889 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
7890 /* MIPS extension. */
7891 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
7892 /* UPC extension. */
7893 case DW_LANG_Upc
: printf ("(Unified Parallel C)"); break;
7895 printf ("(Unknown: %lx)", uvalue
);
7900 case DW_AT_encoding
:
7903 case DW_ATE_void
: printf ("(void)"); break;
7904 case DW_ATE_address
: printf ("(machine address)"); break;
7905 case DW_ATE_boolean
: printf ("(boolean)"); break;
7906 case DW_ATE_complex_float
: printf ("(complex float)"); break;
7907 case DW_ATE_float
: printf ("(float)"); break;
7908 case DW_ATE_signed
: printf ("(signed)"); break;
7909 case DW_ATE_signed_char
: printf ("(signed char)"); break;
7910 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
7911 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
7912 /* DWARF 2.1 value. */
7913 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
7915 if (uvalue
>= DW_ATE_lo_user
7916 && uvalue
<= DW_ATE_hi_user
)
7917 printf ("(user defined type)");
7919 printf ("(unknown type)");
7924 case DW_AT_accessibility
:
7927 case DW_ACCESS_public
: printf ("(public)"); break;
7928 case DW_ACCESS_protected
: printf ("(protected)"); break;
7929 case DW_ACCESS_private
: printf ("(private)"); break;
7931 printf ("(unknown accessibility)");
7936 case DW_AT_visibility
:
7939 case DW_VIS_local
: printf ("(local)"); break;
7940 case DW_VIS_exported
: printf ("(exported)"); break;
7941 case DW_VIS_qualified
: printf ("(qualified)"); break;
7942 default: printf ("(unknown visibility)"); break;
7946 case DW_AT_virtuality
:
7949 case DW_VIRTUALITY_none
: printf ("(none)"); break;
7950 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
7951 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
7952 default: printf ("(unknown virtuality)"); break;
7956 case DW_AT_identifier_case
:
7959 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
7960 case DW_ID_up_case
: printf ("(up_case)"); break;
7961 case DW_ID_down_case
: printf ("(down_case)"); break;
7962 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
7963 default: printf ("(unknown case)"); break;
7967 case DW_AT_calling_convention
:
7970 case DW_CC_normal
: printf ("(normal)"); break;
7971 case DW_CC_program
: printf ("(program)"); break;
7972 case DW_CC_nocall
: printf ("(nocall)"); break;
7974 if (uvalue
>= DW_CC_lo_user
7975 && uvalue
<= DW_CC_hi_user
)
7976 printf ("(user defined)");
7978 printf ("(unknown convention)");
7982 case DW_AT_ordering
:
7985 case -1: printf ("(undefined)"); break;
7986 case 0: printf ("(row major)"); break;
7987 case 1: printf ("(column major)"); break;
7991 case DW_AT_frame_base
:
7992 case DW_AT_location
:
7993 case DW_AT_data_member_location
:
7994 case DW_AT_vtable_elem_location
:
7995 case DW_AT_allocated
:
7996 case DW_AT_associated
:
7997 case DW_AT_data_location
:
7999 case DW_AT_upper_bound
:
8000 case DW_AT_lower_bound
:
8004 decode_location_expression (block_start
, pointer_size
, uvalue
);
8007 else if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
8010 printf ("location list");
8022 static unsigned char *
8023 read_and_display_attr (unsigned long attribute
,
8025 unsigned char *data
,
8026 unsigned long cu_offset
,
8027 unsigned long pointer_size
,
8028 unsigned long offset_size
,
8031 printf (" %-18s:", get_AT_name (attribute
));
8032 data
= read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
8033 pointer_size
, offset_size
, dwarf_version
);
8039 display_debug_info (Elf_Internal_Shdr
*section
,
8040 unsigned char *start
,
8043 unsigned char *end
= start
+ section
->sh_size
;
8044 unsigned char *section_begin
= start
;
8046 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
8048 load_debug_str (file
);
8049 load_debug_loc (file
);
8053 DWARF2_Internal_CompUnit compunit
;
8054 Elf_Internal_Shdr
*relsec
;
8055 unsigned char *hdrptr
;
8056 unsigned char *cu_abbrev_offset_ptr
;
8057 unsigned char *tags
;
8060 unsigned long cu_offset
;
8062 int initial_length_size
;
8066 compunit
.cu_length
= byte_get (hdrptr
, 4);
8069 if (compunit
.cu_length
== 0xffffffff)
8071 compunit
.cu_length
= byte_get (hdrptr
, 8);
8074 initial_length_size
= 12;
8079 initial_length_size
= 4;
8082 compunit
.cu_version
= byte_get (hdrptr
, 2);
8085 /* Apply addends of RELA relocations. */
8086 for (relsec
= section_headers
;
8087 relsec
< section_headers
+ elf_header
.e_shnum
;
8090 unsigned long nrelas
;
8091 Elf_Internal_Rela
*rela
, *rp
;
8092 Elf_Internal_Shdr
*symsec
;
8093 Elf_Internal_Sym
*symtab
;
8094 Elf_Internal_Sym
*sym
;
8096 if (relsec
->sh_type
!= SHT_RELA
8097 || SECTION_HEADER (relsec
->sh_info
) != section
8098 || relsec
->sh_size
== 0)
8101 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
8105 symsec
= SECTION_HEADER (relsec
->sh_link
);
8106 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
8108 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
8112 if (rp
->r_offset
>= (bfd_vma
) (hdrptr
- section_begin
)
8113 && section
->sh_size
> (bfd_vma
) offset_size
8114 && rp
->r_offset
<= section
->sh_size
- offset_size
)
8115 loc
= section_begin
+ rp
->r_offset
;
8121 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
8123 if (ELF32_R_SYM (rp
->r_info
) != 0
8124 && ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
8126 warn (_("Skipping unexpected symbol type %u\n"),
8127 ELF32_ST_TYPE (sym
->st_info
));
8133 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
8135 if (ELF64_R_SYM (rp
->r_info
) != 0
8136 && ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
8138 warn (_("Skipping unexpected symbol type %u\n"),
8139 ELF64_ST_TYPE (sym
->st_info
));
8144 byte_put (loc
, rp
->r_addend
, offset_size
);
8151 cu_abbrev_offset_ptr
= hdrptr
;
8152 compunit
.cu_abbrev_offset
= byte_get (hdrptr
, offset_size
);
8153 hdrptr
+= offset_size
;
8155 compunit
.cu_pointer_size
= byte_get (hdrptr
, 1);
8159 cu_offset
= start
- section_begin
;
8160 start
+= compunit
.cu_length
+ initial_length_size
;
8162 printf (_(" Compilation Unit @ %lx:\n"), cu_offset
);
8163 printf (_(" Length: %ld\n"), compunit
.cu_length
);
8164 printf (_(" Version: %d\n"), compunit
.cu_version
);
8165 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
8166 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
8168 if (compunit
.cu_version
!= 2 && compunit
.cu_version
!= 3)
8170 warn (_("Only version 2 and 3 DWARF debug information is currently supported.\n"));
8176 /* Read in the abbrevs used by this compilation unit. */
8178 Elf_Internal_Shdr
*sec
;
8179 unsigned char *begin
;
8181 /* Locate the .debug_abbrev section and process it. */
8182 for (i
= 0, sec
= section_headers
;
8183 i
< elf_header
.e_shnum
;
8185 if (strcmp (SECTION_NAME (sec
), ".debug_abbrev") == 0)
8188 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
8190 warn (_("Unable to locate .debug_abbrev section!\n"));
8194 begin
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
8195 _("debug_abbrev section data"));
8199 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
8200 begin
+ sec
->sh_size
);
8206 while (tags
< start
)
8209 unsigned long abbrev_number
;
8210 abbrev_entry
*entry
;
8213 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
8216 /* A null DIE marks the end of a list of children. */
8217 if (abbrev_number
== 0)
8223 /* Scan through the abbreviation list until we reach the
8225 for (entry
= first_abbrev
;
8226 entry
&& entry
->entry
!= abbrev_number
;
8227 entry
= entry
->next
)
8232 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
8237 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
8239 (unsigned long) (tags
- section_begin
- bytes_read
),
8241 get_TAG_name (entry
->tag
));
8243 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
8244 tags
= read_and_display_attr (attr
->attribute
,
8247 compunit
.cu_pointer_size
,
8249 compunit
.cu_version
);
8251 if (entry
->children
)
8265 display_debug_aranges (Elf_Internal_Shdr
*section
,
8266 unsigned char *start
,
8267 FILE *file ATTRIBUTE_UNUSED
)
8269 unsigned char *end
= start
+ section
->sh_size
;
8271 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
8275 unsigned char *hdrptr
;
8276 DWARF2_Internal_ARange arange
;
8277 unsigned char *ranges
;
8278 unsigned long length
;
8279 unsigned long address
;
8282 int initial_length_size
;
8286 arange
.ar_length
= byte_get (hdrptr
, 4);
8289 if (arange
.ar_length
== 0xffffffff)
8291 arange
.ar_length
= byte_get (hdrptr
, 8);
8294 initial_length_size
= 12;
8299 initial_length_size
= 4;
8302 arange
.ar_version
= byte_get (hdrptr
, 2);
8305 arange
.ar_info_offset
= byte_get (hdrptr
, offset_size
);
8306 hdrptr
+= offset_size
;
8308 arange
.ar_pointer_size
= byte_get (hdrptr
, 1);
8311 arange
.ar_segment_size
= byte_get (hdrptr
, 1);
8314 if (arange
.ar_version
!= 2 && arange
.ar_version
!= 3)
8316 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
8320 printf (_(" Length: %ld\n"), arange
.ar_length
);
8321 printf (_(" Version: %d\n"), arange
.ar_version
);
8322 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
8323 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
8324 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
8326 printf (_("\n Address Length\n"));
8330 /* Must pad to an alignment boundary that is twice the pointer size. */
8331 excess
= (hdrptr
- start
) % (2 * arange
.ar_pointer_size
);
8333 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
8337 address
= byte_get (ranges
, arange
.ar_pointer_size
);
8339 ranges
+= arange
.ar_pointer_size
;
8341 length
= byte_get (ranges
, arange
.ar_pointer_size
);
8343 ranges
+= arange
.ar_pointer_size
;
8345 /* A pair of zeros marks the end of the list. */
8346 if (address
== 0 && length
== 0)
8349 printf (" %8.8lx %lu\n", address
, length
);
8352 start
+= arange
.ar_length
+ initial_length_size
;
8360 typedef struct Frame_Chunk
8362 struct Frame_Chunk
*next
;
8363 unsigned char *chunk_start
;
8365 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
8366 short int *col_type
;
8369 unsigned int code_factor
;
8371 unsigned long pc_begin
;
8372 unsigned long pc_range
;
8376 unsigned char fde_encoding
;
8377 unsigned char cfa_exp
;
8381 /* A marker for a col_type that means this column was never referenced
8382 in the frame info. */
8383 #define DW_CFA_unreferenced (-1)
8386 frame_need_space (Frame_Chunk
*fc
, int reg
)
8388 int prev
= fc
->ncols
;
8390 if (reg
< fc
->ncols
)
8393 fc
->ncols
= reg
+ 1;
8394 fc
->col_type
= xrealloc (fc
->col_type
, fc
->ncols
* sizeof (short int));
8395 fc
->col_offset
= xrealloc (fc
->col_offset
, fc
->ncols
* sizeof (int));
8397 while (prev
< fc
->ncols
)
8399 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
8400 fc
->col_offset
[prev
] = 0;
8406 frame_display_row (Frame_Chunk
*fc
, int *need_col_headers
, int *max_regs
)
8411 if (*max_regs
< fc
->ncols
)
8412 *max_regs
= fc
->ncols
;
8414 if (*need_col_headers
)
8416 *need_col_headers
= 0;
8418 printf (" LOC CFA ");
8420 for (r
= 0; r
< *max_regs
; r
++)
8421 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
8426 printf ("r%-4d", r
);
8432 printf ("%08lx ", fc
->pc_begin
);
8434 strcpy (tmp
, "exp");
8436 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
8437 printf ("%-8s ", tmp
);
8439 for (r
= 0; r
< fc
->ncols
; r
++)
8441 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
8443 switch (fc
->col_type
[r
])
8445 case DW_CFA_undefined
:
8448 case DW_CFA_same_value
:
8452 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
8454 case DW_CFA_register
:
8455 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
8457 case DW_CFA_expression
:
8458 strcpy (tmp
, "exp");
8461 strcpy (tmp
, "n/a");
8464 printf ("%-5s", tmp
);
8471 size_of_encoded_value (int encoding
)
8473 switch (encoding
& 0x7)
8476 case 0: return is_32bit_elf
? 4 : 8;
8484 get_encoded_value (unsigned char *data
, int encoding
)
8486 int size
= size_of_encoded_value (encoding
);
8487 if (encoding
& DW_EH_PE_signed
)
8488 return byte_get_signed (data
, size
);
8490 return byte_get (data
, size
);
8493 #define GET(N) byte_get (start, N); start += N
8494 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
8495 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
8498 display_debug_frames (Elf_Internal_Shdr
*section
,
8499 unsigned char *start
,
8500 FILE *file ATTRIBUTE_UNUSED
)
8502 unsigned char *end
= start
+ section
->sh_size
;
8503 unsigned char *section_start
= start
;
8504 Frame_Chunk
*chunks
= 0;
8505 Frame_Chunk
*remembered_state
= 0;
8507 int is_eh
= (strcmp (SECTION_NAME (section
), ".eh_frame") == 0);
8510 int addr_size
= is_32bit_elf
? 4 : 8;
8512 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
8516 unsigned char *saved_start
;
8517 unsigned char *block_end
;
8518 unsigned long length
;
8519 unsigned long cie_id
;
8522 int need_col_headers
= 1;
8523 unsigned char *augmentation_data
= NULL
;
8524 unsigned long augmentation_data_len
= 0;
8525 int encoded_ptr_size
= addr_size
;
8527 int initial_length_size
;
8529 saved_start
= start
;
8530 length
= byte_get (start
, 4); start
+= 4;
8534 printf ("\n%08lx ZERO terminator\n\n",
8535 (unsigned long)(saved_start
- section_start
));
8539 if (length
== 0xffffffff)
8541 length
= byte_get (start
, 8);
8544 initial_length_size
= 12;
8549 initial_length_size
= 4;
8552 block_end
= saved_start
+ length
+ initial_length_size
;
8553 cie_id
= byte_get (start
, offset_size
); start
+= offset_size
;
8555 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
8559 fc
= xmalloc (sizeof (Frame_Chunk
));
8560 memset (fc
, 0, sizeof (Frame_Chunk
));
8564 fc
->chunk_start
= saved_start
;
8566 fc
->col_type
= xmalloc (sizeof (short int));
8567 fc
->col_offset
= xmalloc (sizeof (int));
8568 frame_need_space (fc
, max_regs
-1);
8572 fc
->augmentation
= start
;
8573 start
= strchr (start
, '\0') + 1;
8575 if (fc
->augmentation
[0] == 'z')
8577 fc
->code_factor
= LEB ();
8578 fc
->data_factor
= SLEB ();
8579 fc
->ra
= byte_get (start
, 1); start
+= 1;
8580 augmentation_data_len
= LEB ();
8581 augmentation_data
= start
;
8582 start
+= augmentation_data_len
;
8584 else if (strcmp (fc
->augmentation
, "eh") == 0)
8587 fc
->code_factor
= LEB ();
8588 fc
->data_factor
= SLEB ();
8589 fc
->ra
= byte_get (start
, 1); start
+= 1;
8593 fc
->code_factor
= LEB ();
8594 fc
->data_factor
= SLEB ();
8595 fc
->ra
= byte_get (start
, 1); start
+= 1;
8599 if (do_debug_frames_interp
)
8600 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
8601 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
8602 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
8606 printf ("\n%08lx %08lx %08lx CIE\n",
8607 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
8608 printf (" Version: %d\n", version
);
8609 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
8610 printf (" Code alignment factor: %u\n", fc
->code_factor
);
8611 printf (" Data alignment factor: %d\n", fc
->data_factor
);
8612 printf (" Return address column: %d\n", fc
->ra
);
8614 if (augmentation_data_len
)
8617 printf (" Augmentation data: ");
8618 for (i
= 0; i
< augmentation_data_len
; ++i
)
8619 printf (" %02x", augmentation_data
[i
]);
8625 if (augmentation_data_len
)
8627 unsigned char *p
, *q
;
8628 p
= fc
->augmentation
+ 1;
8629 q
= augmentation_data
;
8636 q
+= 1 + size_of_encoded_value (*q
);
8638 fc
->fde_encoding
= *q
++;
8644 if (fc
->fde_encoding
)
8645 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
8648 frame_need_space (fc
, fc
->ra
);
8652 unsigned char *look_for
;
8653 static Frame_Chunk fde_fc
;
8656 memset (fc
, 0, sizeof (Frame_Chunk
));
8658 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
8660 for (cie
= chunks
; cie
; cie
= cie
->next
)
8661 if (cie
->chunk_start
== look_for
)
8666 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
8667 cie_id
, saved_start
);
8670 fc
->col_type
= xmalloc (sizeof (short int));
8671 fc
->col_offset
= xmalloc (sizeof (int));
8672 frame_need_space (fc
, max_regs
- 1);
8674 fc
->augmentation
= "";
8675 fc
->fde_encoding
= 0;
8679 fc
->ncols
= cie
->ncols
;
8680 fc
->col_type
= xmalloc (fc
->ncols
* sizeof (short int));
8681 fc
->col_offset
= xmalloc (fc
->ncols
* sizeof (int));
8682 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
8683 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
8684 fc
->augmentation
= cie
->augmentation
;
8685 fc
->code_factor
= cie
->code_factor
;
8686 fc
->data_factor
= cie
->data_factor
;
8687 fc
->cfa_reg
= cie
->cfa_reg
;
8688 fc
->cfa_offset
= cie
->cfa_offset
;
8690 frame_need_space (fc
, max_regs
-1);
8691 fc
->fde_encoding
= cie
->fde_encoding
;
8694 if (fc
->fde_encoding
)
8695 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
8697 fc
->pc_begin
= get_encoded_value (start
, fc
->fde_encoding
);
8698 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
)
8699 fc
->pc_begin
+= section
->sh_addr
+ (start
- section_start
);
8700 start
+= encoded_ptr_size
;
8701 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
8702 start
+= encoded_ptr_size
;
8704 if (cie
->augmentation
[0] == 'z')
8706 augmentation_data_len
= LEB ();
8707 augmentation_data
= start
;
8708 start
+= augmentation_data_len
;
8711 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
8712 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
8713 (unsigned long)(cie
->chunk_start
- section_start
),
8714 fc
->pc_begin
, fc
->pc_begin
+ fc
->pc_range
);
8715 if (! do_debug_frames_interp
&& augmentation_data_len
)
8718 printf (" Augmentation data: ");
8719 for (i
= 0; i
< augmentation_data_len
; ++i
)
8720 printf (" %02x", augmentation_data
[i
]);
8726 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8727 about to interpret instructions for the chunk. */
8728 /* ??? At present we need to do this always, since this sizes the
8729 fc->col_type and fc->col_offset arrays, which we write into always.
8730 We should probably split the interpreted and non-interpreted bits
8731 into two different routines, since there's so much that doesn't
8732 really overlap between them. */
8733 if (1 || do_debug_frames_interp
)
8735 /* Start by making a pass over the chunk, allocating storage
8736 and taking note of what registers are used. */
8737 unsigned char *tmp
= start
;
8739 while (start
< block_end
)
8742 unsigned long reg
, tmp
;
8749 /* Warning: if you add any more cases to this switch, be
8750 sure to add them to the corresponding switch below. */
8753 case DW_CFA_advance_loc
:
8757 frame_need_space (fc
, opa
);
8758 fc
->col_type
[opa
] = DW_CFA_undefined
;
8760 case DW_CFA_restore
:
8761 frame_need_space (fc
, opa
);
8762 fc
->col_type
[opa
] = DW_CFA_undefined
;
8764 case DW_CFA_set_loc
:
8765 start
+= encoded_ptr_size
;
8767 case DW_CFA_advance_loc1
:
8770 case DW_CFA_advance_loc2
:
8773 case DW_CFA_advance_loc4
:
8776 case DW_CFA_offset_extended
:
8777 reg
= LEB (); LEB ();
8778 frame_need_space (fc
, reg
);
8779 fc
->col_type
[reg
] = DW_CFA_undefined
;
8781 case DW_CFA_restore_extended
:
8783 frame_need_space (fc
, reg
);
8784 fc
->col_type
[reg
] = DW_CFA_undefined
;
8786 case DW_CFA_undefined
:
8788 frame_need_space (fc
, reg
);
8789 fc
->col_type
[reg
] = DW_CFA_undefined
;
8791 case DW_CFA_same_value
:
8793 frame_need_space (fc
, reg
);
8794 fc
->col_type
[reg
] = DW_CFA_undefined
;
8796 case DW_CFA_register
:
8797 reg
= LEB (); LEB ();
8798 frame_need_space (fc
, reg
);
8799 fc
->col_type
[reg
] = DW_CFA_undefined
;
8801 case DW_CFA_def_cfa
:
8804 case DW_CFA_def_cfa_register
:
8807 case DW_CFA_def_cfa_offset
:
8810 case DW_CFA_def_cfa_expression
:
8814 case DW_CFA_expression
:
8818 frame_need_space (fc
, reg
);
8819 fc
->col_type
[reg
] = DW_CFA_undefined
;
8821 case DW_CFA_offset_extended_sf
:
8822 reg
= LEB (); SLEB ();
8823 frame_need_space (fc
, reg
);
8824 fc
->col_type
[reg
] = DW_CFA_undefined
;
8826 case DW_CFA_def_cfa_sf
:
8829 case DW_CFA_def_cfa_offset_sf
:
8832 case DW_CFA_MIPS_advance_loc8
:
8835 case DW_CFA_GNU_args_size
:
8838 case DW_CFA_GNU_negative_offset_extended
:
8839 reg
= LEB (); LEB ();
8840 frame_need_space (fc
, reg
);
8841 fc
->col_type
[reg
] = DW_CFA_undefined
;
8850 /* Now we know what registers are used, make a second pass over
8851 the chunk, this time actually printing out the info. */
8853 while (start
< block_end
)
8856 unsigned long ul
, reg
, roffs
;
8865 /* Warning: if you add any more cases to this switch, be
8866 sure to add them to the corresponding switch above. */
8869 case DW_CFA_advance_loc
:
8870 if (do_debug_frames_interp
)
8871 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8873 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8874 opa
* fc
->code_factor
,
8875 fc
->pc_begin
+ opa
* fc
->code_factor
);
8876 fc
->pc_begin
+= opa
* fc
->code_factor
;
8881 if (! do_debug_frames_interp
)
8882 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8883 opa
, roffs
* fc
->data_factor
);
8884 fc
->col_type
[opa
] = DW_CFA_offset
;
8885 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
8888 case DW_CFA_restore
:
8889 if (! do_debug_frames_interp
)
8890 printf (" DW_CFA_restore: r%d\n", opa
);
8891 fc
->col_type
[opa
] = cie
->col_type
[opa
];
8892 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
8895 case DW_CFA_set_loc
:
8896 vma
= get_encoded_value (start
, fc
->fde_encoding
);
8897 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
)
8898 vma
+= section
->sh_addr
+ (start
- section_start
);
8899 start
+= encoded_ptr_size
;
8900 if (do_debug_frames_interp
)
8901 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8903 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
8907 case DW_CFA_advance_loc1
:
8908 ofs
= byte_get (start
, 1); start
+= 1;
8909 if (do_debug_frames_interp
)
8910 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8912 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8913 ofs
* fc
->code_factor
,
8914 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8915 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8918 case DW_CFA_advance_loc2
:
8919 ofs
= byte_get (start
, 2); start
+= 2;
8920 if (do_debug_frames_interp
)
8921 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8923 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8924 ofs
* fc
->code_factor
,
8925 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8926 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8929 case DW_CFA_advance_loc4
:
8930 ofs
= byte_get (start
, 4); start
+= 4;
8931 if (do_debug_frames_interp
)
8932 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8934 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8935 ofs
* fc
->code_factor
,
8936 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8937 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8940 case DW_CFA_offset_extended
:
8943 if (! do_debug_frames_interp
)
8944 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8945 reg
, roffs
* fc
->data_factor
);
8946 fc
->col_type
[reg
] = DW_CFA_offset
;
8947 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
8950 case DW_CFA_restore_extended
:
8952 if (! do_debug_frames_interp
)
8953 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
8954 fc
->col_type
[reg
] = cie
->col_type
[reg
];
8955 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
8958 case DW_CFA_undefined
:
8960 if (! do_debug_frames_interp
)
8961 printf (" DW_CFA_undefined: r%ld\n", reg
);
8962 fc
->col_type
[reg
] = DW_CFA_undefined
;
8963 fc
->col_offset
[reg
] = 0;
8966 case DW_CFA_same_value
:
8968 if (! do_debug_frames_interp
)
8969 printf (" DW_CFA_same_value: r%ld\n", reg
);
8970 fc
->col_type
[reg
] = DW_CFA_same_value
;
8971 fc
->col_offset
[reg
] = 0;
8974 case DW_CFA_register
:
8977 if (! do_debug_frames_interp
)
8978 printf (" DW_CFA_register: r%ld in r%ld\n", reg
, roffs
);
8979 fc
->col_type
[reg
] = DW_CFA_register
;
8980 fc
->col_offset
[reg
] = roffs
;
8983 case DW_CFA_remember_state
:
8984 if (! do_debug_frames_interp
)
8985 printf (" DW_CFA_remember_state\n");
8986 rs
= xmalloc (sizeof (Frame_Chunk
));
8987 rs
->ncols
= fc
->ncols
;
8988 rs
->col_type
= xmalloc (rs
->ncols
* sizeof (short int));
8989 rs
->col_offset
= xmalloc (rs
->ncols
* sizeof (int));
8990 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
8991 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
8992 rs
->next
= remembered_state
;
8993 remembered_state
= rs
;
8996 case DW_CFA_restore_state
:
8997 if (! do_debug_frames_interp
)
8998 printf (" DW_CFA_restore_state\n");
8999 rs
= remembered_state
;
9000 remembered_state
= rs
->next
;
9001 frame_need_space (fc
, rs
->ncols
-1);
9002 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
9003 memcpy (fc
->col_offset
, rs
->col_offset
, rs
->ncols
* sizeof (int));
9004 free (rs
->col_type
);
9005 free (rs
->col_offset
);
9009 case DW_CFA_def_cfa
:
9010 fc
->cfa_reg
= LEB ();
9011 fc
->cfa_offset
= LEB ();
9013 if (! do_debug_frames_interp
)
9014 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
9015 fc
->cfa_reg
, fc
->cfa_offset
);
9018 case DW_CFA_def_cfa_register
:
9019 fc
->cfa_reg
= LEB ();
9021 if (! do_debug_frames_interp
)
9022 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
9025 case DW_CFA_def_cfa_offset
:
9026 fc
->cfa_offset
= LEB ();
9027 if (! do_debug_frames_interp
)
9028 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
9032 if (! do_debug_frames_interp
)
9033 printf (" DW_CFA_nop\n");
9036 case DW_CFA_def_cfa_expression
:
9038 if (! do_debug_frames_interp
)
9040 printf (" DW_CFA_def_cfa_expression (");
9041 decode_location_expression (start
, addr_size
, ul
);
9048 case DW_CFA_expression
:
9051 if (! do_debug_frames_interp
)
9053 printf (" DW_CFA_expression: r%ld (", reg
);
9054 decode_location_expression (start
, addr_size
, ul
);
9057 fc
->col_type
[reg
] = DW_CFA_expression
;
9061 case DW_CFA_offset_extended_sf
:
9064 frame_need_space (fc
, reg
);
9065 if (! do_debug_frames_interp
)
9066 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
9067 reg
, l
* fc
->data_factor
);
9068 fc
->col_type
[reg
] = DW_CFA_offset
;
9069 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
9072 case DW_CFA_def_cfa_sf
:
9073 fc
->cfa_reg
= LEB ();
9074 fc
->cfa_offset
= SLEB ();
9076 if (! do_debug_frames_interp
)
9077 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
9078 fc
->cfa_reg
, fc
->cfa_offset
);
9081 case DW_CFA_def_cfa_offset_sf
:
9082 fc
->cfa_offset
= SLEB ();
9083 if (! do_debug_frames_interp
)
9084 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc
->cfa_offset
);
9087 case DW_CFA_MIPS_advance_loc8
:
9088 ofs
= byte_get (start
, 8); start
+= 8;
9089 if (do_debug_frames_interp
)
9090 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9092 printf (" DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
9093 ofs
* fc
->code_factor
,
9094 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9095 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9098 case DW_CFA_GNU_window_save
:
9099 if (! do_debug_frames_interp
)
9100 printf (" DW_CFA_GNU_window_save\n");
9103 case DW_CFA_GNU_args_size
:
9105 if (! do_debug_frames_interp
)
9106 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
9109 case DW_CFA_GNU_negative_offset_extended
:
9112 frame_need_space (fc
, reg
);
9113 if (! do_debug_frames_interp
)
9114 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
9115 reg
, l
* fc
->data_factor
);
9116 fc
->col_type
[reg
] = DW_CFA_offset
;
9117 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
9121 fprintf (stderr
, "unsupported or unknown DW_CFA_%d\n", op
);
9126 if (do_debug_frames_interp
)
9127 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9142 display_debug_not_supported (Elf_Internal_Shdr
*section
,
9143 unsigned char *start ATTRIBUTE_UNUSED
,
9144 FILE *file ATTRIBUTE_UNUSED
)
9146 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
9147 SECTION_NAME (section
));
9152 /* Pre-scan the .debug_info section to record the size of address.
9153 When dumping the .debug_line, we use that size information, assuming
9154 that all compilation units have the same address size. */
9156 prescan_debug_info (Elf_Internal_Shdr
*section ATTRIBUTE_UNUSED
,
9157 unsigned char *start
,
9158 FILE *file ATTRIBUTE_UNUSED
)
9160 unsigned long length
;
9162 /* Read the first 4 bytes. For a 32-bit DWARF section, this will
9163 be the length. For a 64-bit DWARF section, it'll be the escape
9164 code 0xffffffff followed by an 8 byte length. For the purposes
9165 of this prescan, we don't care about the actual length, but the
9166 presence of the escape bytes does affect the location of the byte
9167 which describes the address size. */
9168 length
= byte_get (start
, 4);
9170 if (length
== 0xffffffff)
9172 /* For 64-bit DWARF, the 1-byte address_size field is 22 bytes
9173 from the start of the section. This is computed as follows:
9175 unit_length: 12 bytes
9177 debug_abbrev_offset: 8 bytes
9178 -----------------------------
9181 debug_line_pointer_size
= byte_get (start
+ 22, 1);
9185 /* For 32-bit DWARF, the 1-byte address_size field is 10 bytes from
9186 the start of the section:
9187 unit_length: 4 bytes
9189 debug_abbrev_offset: 4 bytes
9190 -----------------------------
9193 debug_line_pointer_size
= byte_get (start
+ 10, 1);
9198 /* A structure containing the name of a debug section and a pointer
9199 to a function that can decode it. The third field is a prescan
9200 function to be run over the section before displaying any of the
9204 const char *const name
;
9205 int (*display
) (Elf_Internal_Shdr
*, unsigned char *, FILE *);
9206 int (*prescan
) (Elf_Internal_Shdr
*, unsigned char *, FILE *);
9210 { ".debug_abbrev", display_debug_abbrev
, NULL
},
9211 { ".debug_aranges", display_debug_aranges
, NULL
},
9212 { ".debug_frame", display_debug_frames
, NULL
},
9213 { ".debug_info", display_debug_info
, prescan_debug_info
},
9214 { ".debug_line", display_debug_lines
, NULL
},
9215 { ".debug_pubnames", display_debug_pubnames
, NULL
},
9216 { ".eh_frame", display_debug_frames
, NULL
},
9217 { ".debug_macinfo", display_debug_macinfo
, NULL
},
9218 { ".debug_str", display_debug_str
, NULL
},
9219 { ".debug_loc", display_debug_loc
, NULL
},
9220 { ".debug_pubtypes", display_debug_not_supported
, NULL
},
9221 { ".debug_ranges", display_debug_not_supported
, NULL
},
9222 { ".debug_static_func", display_debug_not_supported
, NULL
},
9223 { ".debug_static_vars", display_debug_not_supported
, NULL
},
9224 { ".debug_types", display_debug_not_supported
, NULL
},
9225 { ".debug_weaknames", display_debug_not_supported
, NULL
}
9229 display_debug_section (Elf_Internal_Shdr
*section
, FILE *file
)
9231 char *name
= SECTION_NAME (section
);
9232 bfd_size_type length
;
9233 unsigned char *start
;
9236 length
= section
->sh_size
;
9239 printf (_("\nSection '%s' has no debugging data.\n"), name
);
9243 start
= get_data (NULL
, file
, section
->sh_offset
, length
,
9244 _("debug section data"));
9248 /* See if we know how to display the contents of this section. */
9249 if (strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
9250 name
= ".debug_info";
9252 for (i
= NUM_ELEM (debug_displays
); i
--;)
9253 if (strcmp (debug_displays
[i
].name
, name
) == 0)
9255 debug_displays
[i
].display (section
, start
, file
);
9260 printf (_("Unrecognized debug section: %s\n"), name
);
9264 /* If we loaded in the abbrev section at some point,
9265 we must release it here. */
9272 process_section_contents (FILE *file
)
9274 Elf_Internal_Shdr
*section
;
9280 /* Pre-scan the debug sections to find some debug information not
9281 present in some of them. For the .debug_line, we must find out the
9282 size of address (specified in .debug_info and .debug_aranges). */
9283 for (i
= 0, section
= section_headers
;
9284 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
9287 char *name
= SECTION_NAME (section
);
9290 if (section
->sh_size
== 0)
9293 /* See if there is some pre-scan operation for this section. */
9294 for (j
= NUM_ELEM (debug_displays
); j
--;)
9295 if (strcmp (debug_displays
[j
].name
, name
) == 0)
9297 if (debug_displays
[j
].prescan
!= NULL
)
9299 bfd_size_type length
;
9300 unsigned char *start
;
9302 length
= section
->sh_size
;
9303 start
= get_data (NULL
, file
, section
->sh_offset
, length
,
9304 _("debug section data"));
9308 debug_displays
[j
].prescan (section
, start
, file
);
9316 for (i
= 0, section
= section_headers
;
9317 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
9320 #ifdef SUPPORT_DISASSEMBLY
9321 if (dump_sects
[i
] & DISASS_DUMP
)
9322 disassemble_section (section
, file
);
9324 if (dump_sects
[i
] & HEX_DUMP
)
9325 dump_section (section
, file
);
9327 if (dump_sects
[i
] & DEBUG_DUMP
)
9328 display_debug_section (section
, file
);
9331 if (i
< num_dump_sects
)
9332 warn (_("Some sections were not dumped because they do not exist!\n"));
9338 process_mips_fpe_exception (int mask
)
9343 if (mask
& OEX_FPU_INEX
)
9344 fputs ("INEX", stdout
), first
= 0;
9345 if (mask
& OEX_FPU_UFLO
)
9346 printf ("%sUFLO", first
? "" : "|"), first
= 0;
9347 if (mask
& OEX_FPU_OFLO
)
9348 printf ("%sOFLO", first
? "" : "|"), first
= 0;
9349 if (mask
& OEX_FPU_DIV0
)
9350 printf ("%sDIV0", first
? "" : "|"), first
= 0;
9351 if (mask
& OEX_FPU_INVAL
)
9352 printf ("%sINVAL", first
? "" : "|");
9355 fputs ("0", stdout
);
9359 process_mips_specific (FILE *file
)
9361 Elf_Internal_Dyn
*entry
;
9362 size_t liblist_offset
= 0;
9363 size_t liblistno
= 0;
9364 size_t conflictsno
= 0;
9365 size_t options_offset
= 0;
9366 size_t conflicts_offset
= 0;
9368 /* We have a lot of special sections. Thanks SGI! */
9369 if (dynamic_segment
== NULL
)
9370 /* No information available. */
9373 for (entry
= dynamic_segment
; entry
->d_tag
!= DT_NULL
; ++entry
)
9374 switch (entry
->d_tag
)
9376 case DT_MIPS_LIBLIST
:
9378 = offset_from_vma (file
, entry
->d_un
.d_val
,
9379 liblistno
* sizeof (Elf32_External_Lib
));
9381 case DT_MIPS_LIBLISTNO
:
9382 liblistno
= entry
->d_un
.d_val
;
9384 case DT_MIPS_OPTIONS
:
9385 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
9387 case DT_MIPS_CONFLICT
:
9389 = offset_from_vma (file
, entry
->d_un
.d_val
,
9390 conflictsno
* sizeof (Elf32_External_Conflict
));
9392 case DT_MIPS_CONFLICTNO
:
9393 conflictsno
= entry
->d_un
.d_val
;
9399 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
9401 Elf32_External_Lib
*elib
;
9404 elib
= get_data (NULL
, file
, liblist_offset
,
9405 liblistno
* sizeof (Elf32_External_Lib
),
9409 printf ("\nSection '.liblist' contains %lu entries:\n",
9410 (unsigned long) liblistno
);
9411 fputs (" Library Time Stamp Checksum Version Flags\n",
9414 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
9421 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9422 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9423 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9424 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9425 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9427 tmp
= gmtime (&time
);
9428 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
9429 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9430 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9432 printf ("%3lu: ", (unsigned long) cnt
);
9433 print_symbol (20, dynamic_strings
+ liblist
.l_name
);
9434 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
9437 if (liblist
.l_flags
== 0)
9448 { " EXACT_MATCH", LL_EXACT_MATCH
},
9449 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
9450 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
9451 { " EXPORTS", LL_EXPORTS
},
9452 { " DELAY_LOAD", LL_DELAY_LOAD
},
9453 { " DELTA", LL_DELTA
}
9455 int flags
= liblist
.l_flags
;
9459 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
9461 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
9463 fputs (l_flags_vals
[fcnt
].name
, stdout
);
9464 flags
^= l_flags_vals
[fcnt
].bit
;
9467 printf (" %#x", (unsigned int) flags
);
9477 if (options_offset
!= 0)
9479 Elf_External_Options
*eopt
;
9480 Elf_Internal_Shdr
*sect
= section_headers
;
9481 Elf_Internal_Options
*iopt
;
9482 Elf_Internal_Options
*option
;
9486 /* Find the section header so that we get the size. */
9487 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
9490 eopt
= get_data (NULL
, file
, options_offset
, sect
->sh_size
,
9494 iopt
= malloc ((sect
->sh_size
/ sizeof (eopt
)) * sizeof (*iopt
));
9497 error (_("Out of memory"));
9504 while (offset
< sect
->sh_size
)
9506 Elf_External_Options
*eoption
;
9508 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
9510 option
->kind
= BYTE_GET (eoption
->kind
);
9511 option
->size
= BYTE_GET (eoption
->size
);
9512 option
->section
= BYTE_GET (eoption
->section
);
9513 option
->info
= BYTE_GET (eoption
->info
);
9515 offset
+= option
->size
;
9521 printf (_("\nSection '%s' contains %d entries:\n"),
9522 SECTION_NAME (sect
), cnt
);
9530 switch (option
->kind
)
9533 /* This shouldn't happen. */
9534 printf (" NULL %d %lx", option
->section
, option
->info
);
9537 printf (" REGINFO ");
9538 if (elf_header
.e_machine
== EM_MIPS
)
9541 Elf32_External_RegInfo
*ereg
;
9542 Elf32_RegInfo reginfo
;
9544 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
9545 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9546 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9547 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9548 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9549 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9550 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9552 printf ("GPR %08lx GP 0x%lx\n",
9554 (unsigned long) reginfo
.ri_gp_value
);
9555 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9556 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9557 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9562 Elf64_External_RegInfo
*ereg
;
9563 Elf64_Internal_RegInfo reginfo
;
9565 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
9566 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9567 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9568 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9569 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9570 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9571 reginfo
.ri_gp_value
= BYTE_GET8 (ereg
->ri_gp_value
);
9573 printf ("GPR %08lx GP 0x",
9574 reginfo
.ri_gprmask
);
9575 printf_vma (reginfo
.ri_gp_value
);
9578 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9579 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9580 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9584 case ODK_EXCEPTIONS
:
9585 fputs (" EXCEPTIONS fpe_min(", stdout
);
9586 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
9587 fputs (") fpe_max(", stdout
);
9588 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
9589 fputs (")", stdout
);
9591 if (option
->info
& OEX_PAGE0
)
9592 fputs (" PAGE0", stdout
);
9593 if (option
->info
& OEX_SMM
)
9594 fputs (" SMM", stdout
);
9595 if (option
->info
& OEX_FPDBUG
)
9596 fputs (" FPDBUG", stdout
);
9597 if (option
->info
& OEX_DISMISS
)
9598 fputs (" DISMISS", stdout
);
9601 fputs (" PAD ", stdout
);
9602 if (option
->info
& OPAD_PREFIX
)
9603 fputs (" PREFIX", stdout
);
9604 if (option
->info
& OPAD_POSTFIX
)
9605 fputs (" POSTFIX", stdout
);
9606 if (option
->info
& OPAD_SYMBOL
)
9607 fputs (" SYMBOL", stdout
);
9610 fputs (" HWPATCH ", stdout
);
9611 if (option
->info
& OHW_R4KEOP
)
9612 fputs (" R4KEOP", stdout
);
9613 if (option
->info
& OHW_R8KPFETCH
)
9614 fputs (" R8KPFETCH", stdout
);
9615 if (option
->info
& OHW_R5KEOP
)
9616 fputs (" R5KEOP", stdout
);
9617 if (option
->info
& OHW_R5KCVTL
)
9618 fputs (" R5KCVTL", stdout
);
9621 fputs (" FILL ", stdout
);
9622 /* XXX Print content of info word? */
9625 fputs (" TAGS ", stdout
);
9626 /* XXX Print content of info word? */
9629 fputs (" HWAND ", stdout
);
9630 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9631 fputs (" R4KEOP_CHECKED", stdout
);
9632 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9633 fputs (" R4KEOP_CLEAN", stdout
);
9636 fputs (" HWOR ", stdout
);
9637 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9638 fputs (" R4KEOP_CHECKED", stdout
);
9639 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9640 fputs (" R4KEOP_CLEAN", stdout
);
9643 printf (" GP_GROUP %#06lx self-contained %#06lx",
9644 option
->info
& OGP_GROUP
,
9645 (option
->info
& OGP_SELF
) >> 16);
9648 printf (" IDENT %#06lx self-contained %#06lx",
9649 option
->info
& OGP_GROUP
,
9650 (option
->info
& OGP_SELF
) >> 16);
9653 /* This shouldn't happen. */
9654 printf (" %3d ??? %d %lx",
9655 option
->kind
, option
->section
, option
->info
);
9659 len
= sizeof (*eopt
);
9660 while (len
< option
->size
)
9661 if (((char *) option
)[len
] >= ' '
9662 && ((char *) option
)[len
] < 0x7f)
9663 printf ("%c", ((char *) option
)[len
++]);
9665 printf ("\\%03o", ((char *) option
)[len
++]);
9667 fputs ("\n", stdout
);
9675 if (conflicts_offset
!= 0 && conflictsno
!= 0)
9677 Elf32_Conflict
*iconf
;
9680 if (dynamic_symbols
== NULL
)
9682 error (_("conflict list found without a dynamic symbol table"));
9686 iconf
= malloc (conflictsno
* sizeof (*iconf
));
9689 error (_("Out of memory"));
9695 Elf32_External_Conflict
*econf32
;
9697 econf32
= get_data (NULL
, file
, conflicts_offset
,
9698 conflictsno
* sizeof (*econf32
), _("conflict"));
9702 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9703 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
9709 Elf64_External_Conflict
*econf64
;
9711 econf64
= get_data (NULL
, file
, conflicts_offset
,
9712 conflictsno
* sizeof (*econf64
), _("conflict"));
9716 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9717 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
9722 printf (_("\nSection '.conflict' contains %ld entries:\n"),
9723 (long) conflictsno
);
9724 puts (_(" Num: Index Value Name"));
9726 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9728 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
9730 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
9731 print_vma (psym
->st_value
, FULL_HEX
);
9733 print_symbol (25, dynamic_strings
+ psym
->st_name
);
9744 process_gnu_liblist (FILE *file
)
9746 Elf_Internal_Shdr
*section
, *string_sec
;
9747 Elf32_External_Lib
*elib
;
9755 for (i
= 0, section
= section_headers
;
9756 i
< elf_header
.e_shnum
;
9759 switch (section
->sh_type
)
9761 case SHT_GNU_LIBLIST
:
9762 elib
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
9767 string_sec
= SECTION_HEADER (section
->sh_link
);
9769 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
9770 string_sec
->sh_size
, _("liblist string table"));
9773 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
9779 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
9780 SECTION_NAME (section
),
9781 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
9783 puts (" Library Time Stamp Checksum Version Flags");
9785 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
9793 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9794 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9795 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9796 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9797 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9799 tmp
= gmtime (&time
);
9800 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
9801 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9802 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9804 printf ("%3lu: ", (unsigned long) cnt
);
9806 printf ("%-20s", strtab
+ liblist
.l_name
);
9808 printf ("%-20.20s", strtab
+ liblist
.l_name
);
9809 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
9810 liblist
.l_version
, liblist
.l_flags
);
9821 get_note_type (unsigned e_type
)
9823 static char buff
[64];
9827 case NT_PRSTATUS
: return _("NT_PRSTATUS (prstatus structure)");
9828 case NT_FPREGSET
: return _("NT_FPREGSET (floating point registers)");
9829 case NT_PRPSINFO
: return _("NT_PRPSINFO (prpsinfo structure)");
9830 case NT_TASKSTRUCT
: return _("NT_TASKSTRUCT (task structure)");
9831 case NT_PRXFPREG
: return _("NT_PRXFPREG (user_xfpregs structure)");
9832 case NT_PSTATUS
: return _("NT_PSTATUS (pstatus structure)");
9833 case NT_FPREGS
: return _("NT_FPREGS (floating point registers)");
9834 case NT_PSINFO
: return _("NT_PSINFO (psinfo structure)");
9835 case NT_LWPSTATUS
: return _("NT_LWPSTATUS (lwpstatus_t structure)");
9836 case NT_LWPSINFO
: return _("NT_LWPSINFO (lwpsinfo_t structure)");
9837 case NT_WIN32PSTATUS
: return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9839 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
9845 get_netbsd_elfcore_note_type (unsigned e_type
)
9847 static char buff
[64];
9849 if (e_type
== NT_NETBSDCORE_PROCINFO
)
9851 /* NetBSD core "procinfo" structure. */
9852 return _("NetBSD procinfo structure");
9855 /* As of Jan 2002 there are no other machine-independent notes
9856 defined for NetBSD core files. If the note type is less
9857 than the start of the machine-dependent note types, we don't
9860 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
9862 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
9866 switch (elf_header
.e_machine
)
9868 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
9869 and PT_GETFPREGS == mach+2. */
9874 case EM_SPARC32PLUS
:
9878 case NT_NETBSDCORE_FIRSTMACH
+0:
9879 return _("PT_GETREGS (reg structure)");
9880 case NT_NETBSDCORE_FIRSTMACH
+2:
9881 return _("PT_GETFPREGS (fpreg structure)");
9887 /* On all other arch's, PT_GETREGS == mach+1 and
9888 PT_GETFPREGS == mach+3. */
9892 case NT_NETBSDCORE_FIRSTMACH
+1:
9893 return _("PT_GETREGS (reg structure)");
9894 case NT_NETBSDCORE_FIRSTMACH
+3:
9895 return _("PT_GETFPREGS (fpreg structure)");
9901 sprintf (buff
, _("PT_FIRSTMACH+%d"), e_type
- NT_NETBSDCORE_FIRSTMACH
);
9905 /* Note that by the ELF standard, the name field is already null byte
9906 terminated, and namesz includes the terminating null byte.
9907 I.E. the value of namesz for the name "FSF" is 4.
9909 If the value of namesz is zero, there is no name present. */
9911 process_note (Elf_Internal_Note
*pnote
)
9915 if (pnote
->namesz
== 0)
9917 /* If there is no note name, then use the default set of
9918 note type strings. */
9919 nt
= get_note_type (pnote
->type
);
9921 else if (strncmp (pnote
->namedata
, "NetBSD-CORE", 11) == 0)
9923 /* NetBSD-specific core file notes. */
9924 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
9928 /* Don't recognize this note name; just use the default set of
9929 note type strings. */
9930 nt
= get_note_type (pnote
->type
);
9933 printf (" %s\t\t0x%08lx\t%s\n",
9934 pnote
->namesz
? pnote
->namedata
: "(NONE)",
9941 process_corefile_note_segment (FILE *file
, bfd_vma offset
, bfd_vma length
)
9943 Elf_External_Note
*pnotes
;
9944 Elf_External_Note
*external
;
9950 pnotes
= get_data (NULL
, file
, offset
, length
, _("notes"));
9956 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9957 (unsigned long) offset
, (unsigned long) length
);
9958 printf (_(" Owner\t\tData size\tDescription\n"));
9960 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
9962 Elf_External_Note
*next
;
9963 Elf_Internal_Note inote
;
9966 inote
.type
= BYTE_GET (external
->type
);
9967 inote
.namesz
= BYTE_GET (external
->namesz
);
9968 inote
.namedata
= external
->name
;
9969 inote
.descsz
= BYTE_GET (external
->descsz
);
9970 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
9971 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
9973 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
9975 if (((char *) next
) > (((char *) pnotes
) + length
))
9977 warn (_("corrupt note found at offset %x into core notes\n"),
9978 ((char *) external
) - ((char *) pnotes
));
9979 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
9980 inote
.type
, inote
.namesz
, inote
.descsz
);
9986 /* Verify that name is null terminated. It appears that at least
9987 one version of Linux (RedHat 6.0) generates corefiles that don't
9988 comply with the ELF spec by failing to include the null byte in
9990 if (inote
.namedata
[inote
.namesz
] != '\0')
9992 temp
= malloc (inote
.namesz
+ 1);
9996 error (_("Out of memory\n"));
10001 strncpy (temp
, inote
.namedata
, inote
.namesz
);
10002 temp
[inote
.namesz
] = 0;
10004 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
10005 inote
.namedata
= temp
;
10008 res
&= process_note (& inote
);
10023 process_corefile_note_segments (FILE *file
)
10025 Elf_Internal_Phdr
*segment
;
10029 if (! get_program_headers (file
))
10032 for (i
= 0, segment
= program_headers
;
10033 i
< elf_header
.e_phnum
;
10036 if (segment
->p_type
== PT_NOTE
)
10037 res
&= process_corefile_note_segment (file
,
10038 (bfd_vma
) segment
->p_offset
,
10039 (bfd_vma
) segment
->p_filesz
);
10046 process_corefile_contents (FILE *file
)
10048 /* If we have not been asked to display the notes then do nothing. */
10052 /* If file is not a core file then exit. */
10053 if (elf_header
.e_type
!= ET_CORE
)
10056 /* No program headers means no NOTE segment. */
10057 if (elf_header
.e_phnum
== 0)
10059 printf (_("No note segments present in the core file.\n"));
10063 return process_corefile_note_segments (file
);
10067 process_arch_specific (FILE *file
)
10072 switch (elf_header
.e_machine
)
10075 case EM_MIPS_RS3_LE
:
10076 return process_mips_specific (file
);
10085 get_file_header (FILE *file
)
10087 /* Read in the identity array. */
10088 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
10091 /* Determine how to read the rest of the header. */
10092 switch (elf_header
.e_ident
[EI_DATA
])
10094 default: /* fall through */
10095 case ELFDATANONE
: /* fall through */
10097 byte_get
= byte_get_little_endian
;
10098 byte_put
= byte_put_little_endian
;
10101 byte_get
= byte_get_big_endian
;
10102 byte_put
= byte_put_big_endian
;
10106 /* For now we only support 32 bit and 64 bit ELF files. */
10107 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
10109 /* Read in the rest of the header. */
10112 Elf32_External_Ehdr ehdr32
;
10114 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
10117 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
10118 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
10119 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
10120 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
10121 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
10122 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
10123 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
10124 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
10125 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
10126 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
10127 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
10128 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
10129 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
10133 Elf64_External_Ehdr ehdr64
;
10135 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10136 we will not be able to cope with the 64bit data found in
10137 64 ELF files. Detect this now and abort before we start
10138 overwritting things. */
10139 if (sizeof (bfd_vma
) < 8)
10141 error (_("This instance of readelf has been built without support for a\n\
10142 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10146 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
10149 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
10150 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
10151 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
10152 elf_header
.e_entry
= BYTE_GET8 (ehdr64
.e_entry
);
10153 elf_header
.e_phoff
= BYTE_GET8 (ehdr64
.e_phoff
);
10154 elf_header
.e_shoff
= BYTE_GET8 (ehdr64
.e_shoff
);
10155 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
10156 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
10157 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
10158 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
10159 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
10160 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
10161 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
10164 if (elf_header
.e_shoff
)
10166 /* There may be some extensions in the first section header. Don't
10167 bomb if we can't read it. */
10169 get_32bit_section_headers (file
, 1);
10171 get_64bit_section_headers (file
, 1);
10177 /* Process one ELF object file according to the command line options.
10178 This file may actually be stored in an archive. The file is
10179 positioned at the start of the ELF object. */
10182 process_object (char *file_name
, FILE *file
)
10186 if (! get_file_header (file
))
10188 error (_("%s: Failed to read file header\n"), file_name
);
10192 /* Initialise per file variables. */
10193 for (i
= NUM_ELEM (version_info
); i
--;)
10194 version_info
[i
] = 0;
10196 for (i
= NUM_ELEM (dynamic_info
); i
--;)
10197 dynamic_info
[i
] = 0;
10199 /* Process the file. */
10201 printf (_("\nFile: %s\n"), file_name
);
10203 if (! process_file_header ())
10206 if (! process_section_headers (file
))
10208 /* Without loaded section headers we
10209 cannot process lots of things. */
10210 do_unwind
= do_version
= do_dump
= do_arch
= 0;
10212 if (! do_using_dynamic
)
10213 do_syms
= do_reloc
= 0;
10216 if (process_program_headers (file
))
10217 process_dynamic_segment (file
);
10219 process_relocs (file
);
10221 process_unwind (file
);
10223 process_symbol_table (file
);
10225 process_syminfo (file
);
10227 process_version_sections (file
);
10229 process_section_contents (file
);
10231 process_corefile_contents (file
);
10233 process_gnu_liblist (file
);
10235 process_arch_specific (file
);
10237 if (program_headers
)
10239 free (program_headers
);
10240 program_headers
= NULL
;
10243 if (section_headers
)
10245 free (section_headers
);
10246 section_headers
= NULL
;
10251 free (string_table
);
10252 string_table
= NULL
;
10253 string_table_length
= 0;
10256 if (dynamic_strings
)
10258 free (dynamic_strings
);
10259 dynamic_strings
= NULL
;
10262 if (dynamic_symbols
)
10264 free (dynamic_symbols
);
10265 dynamic_symbols
= NULL
;
10266 num_dynamic_syms
= 0;
10269 if (dynamic_syminfo
)
10271 free (dynamic_syminfo
);
10272 dynamic_syminfo
= NULL
;
10278 /* Process an ELF archive. The file is positioned just after the
10282 process_archive (char *file_name
, FILE *file
)
10284 struct ar_hdr arhdr
;
10286 unsigned long size
;
10287 char *longnames
= NULL
;
10288 unsigned long longnames_size
= 0;
10289 size_t file_name_size
;
10294 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10295 if (got
!= sizeof arhdr
)
10300 error (_("%s: failed to read archive header\n"), file_name
);
10304 if (memcmp (arhdr
.ar_name
, "/ ", 16) == 0)
10306 /* This is the archive symbol table. Skip it.
10307 FIXME: We should have an option to dump it. */
10308 size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10309 if (fseek (file
, size
+ (size
& 1), SEEK_CUR
) != 0)
10311 error (_("%s: failed to skip archive symbol table\n"), file_name
);
10315 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10316 if (got
!= sizeof arhdr
)
10321 error (_("%s: failed to read archive header\n"), file_name
);
10326 if (memcmp (arhdr
.ar_name
, "// ", 16) == 0)
10328 /* This is the archive string table holding long member
10331 longnames_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10333 longnames
= malloc (longnames_size
);
10334 if (longnames
== NULL
)
10336 error (_("Out of memory\n"));
10340 if (fread (longnames
, longnames_size
, 1, file
) != 1)
10343 error(_("%s: failed to read string table\n"), file_name
);
10347 if ((longnames_size
& 1) != 0)
10350 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10351 if (got
!= sizeof arhdr
)
10358 error (_("%s: failed to read archive header\n"), file_name
);
10363 file_name_size
= strlen (file_name
);
10372 if (arhdr
.ar_name
[0] == '/')
10376 off
= strtoul (arhdr
.ar_name
+ 1, NULL
, 10);
10377 if (off
>= longnames_size
)
10379 error (_("%s: invalid archive string table offset %lu\n"), off
);
10384 name
= longnames
+ off
;
10385 nameend
= memchr (name
, '/', longnames_size
- off
);
10389 name
= arhdr
.ar_name
;
10390 nameend
= memchr (name
, '/', 16);
10393 if (nameend
== NULL
)
10395 error (_("%s: bad archive file name\n"));
10400 namealc
= malloc (file_name_size
+ (nameend
- name
) + 3);
10401 if (namealc
== NULL
)
10403 error (_("Out of memory\n"));
10408 memcpy (namealc
, file_name
, file_name_size
);
10409 namealc
[file_name_size
] = '(';
10410 memcpy (namealc
+ file_name_size
+ 1, name
, nameend
- name
);
10411 namealc
[file_name_size
+ 1 + (nameend
- name
)] = ')';
10412 namealc
[file_name_size
+ 2 + (nameend
- name
)] = '\0';
10414 archive_file_offset
= ftell (file
);
10415 archive_file_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10417 ret
|= process_object (namealc
, file
);
10422 (archive_file_offset
10423 + archive_file_size
10424 + (archive_file_size
& 1)),
10427 error (_("%s: failed to seek to next archive header\n"), file_name
);
10432 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10433 if (got
!= sizeof arhdr
)
10438 error (_("%s: failed to read archive header\n"), file_name
);
10444 if (longnames
!= 0)
10451 process_file (char *file_name
)
10454 struct stat statbuf
;
10455 char armag
[SARMAG
];
10458 if (stat (file_name
, &statbuf
) < 0)
10460 error (_("Cannot stat input file %s.\n"), file_name
);
10464 file
= fopen (file_name
, "rb");
10467 error (_("Input file %s not found.\n"), file_name
);
10471 if (fread (armag
, SARMAG
, 1, file
) != 1)
10473 error (_("%s: Failed to read file header\n"), file_name
);
10478 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
10479 ret
= process_archive (file_name
, file
);
10483 archive_file_size
= archive_file_offset
= 0;
10484 ret
= process_object (file_name
, file
);
10492 #ifdef SUPPORT_DISASSEMBLY
10493 /* Needed by the i386 disassembler. For extra credit, someone could
10494 fix this so that we insert symbolic addresses here, esp for GOT/PLT
10498 print_address (unsigned int addr
, FILE *outfile
)
10500 fprintf (outfile
,"0x%8.8x", addr
);
10503 /* Needed by the i386 disassembler. */
10505 db_task_printsym (unsigned int addr
)
10507 print_address (addr
, stderr
);
10512 main (int argc
, char **argv
)
10515 char *cmdline_dump_sects
= NULL
;
10516 unsigned num_cmdline_dump_sects
= 0;
10518 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
10519 setlocale (LC_MESSAGES
, "");
10521 #if defined (HAVE_SETLOCALE)
10522 setlocale (LC_CTYPE
, "");
10524 bindtextdomain (PACKAGE
, LOCALEDIR
);
10525 textdomain (PACKAGE
);
10527 parse_args (argc
, argv
);
10529 if (optind
< (argc
- 1))
10532 /* When processing more than one file remember the dump requests
10533 issued on command line to reset them after each file. */
10534 if (optind
+ 1 < argc
&& dump_sects
!= NULL
)
10536 cmdline_dump_sects
= malloc (num_dump_sects
);
10537 if (cmdline_dump_sects
== NULL
)
10538 error (_("Out of memory allocating dump request table."));
10541 memcpy (cmdline_dump_sects
, dump_sects
, num_dump_sects
);
10542 num_cmdline_dump_sects
= num_dump_sects
;
10547 while (optind
< argc
)
10549 err
|= process_file (argv
[optind
++]);
10551 /* Reset dump requests. */
10552 if (optind
< argc
&& dump_sects
!= NULL
)
10554 num_dump_sects
= num_cmdline_dump_sects
;
10555 if (num_cmdline_dump_sects
> 0)
10556 memcpy (dump_sects
, cmdline_dump_sects
, num_cmdline_dump_sects
);
10560 if (dump_sects
!= NULL
)
10562 if (cmdline_dump_sects
!= NULL
)
10563 free (cmdline_dump_sects
);