1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
3 Free Software Foundation, Inc.
5 Originally developed by Eric Youngdale <eric@andante.jic.com>
6 Modifications by Nick Clifton <nickc@redhat.com>
8 This file is part of GNU Binutils.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25 /* The difference between readelf and objdump:
27 Both programs are capable of displaying the contents of ELF format files,
28 so why does the binutils project have two file dumpers ?
30 The reason is that objdump sees an ELF file through a BFD filter of the
31 world; if BFD has a bug where, say, it disagrees about a machine constant
32 in e_flags, then the odds are good that it will remain internally
33 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
34 GAS sees it the BFD way. There was need for a tool to go find out what
35 the file actually says.
37 This is why the readelf program does not link against the BFD library - it
38 exists as an independent program to help verify the correct working of BFD.
40 There is also the case that readelf can provide more information about an
41 ELF file than is provided by objdump. In particular it can display DWARF
42 debugging information which (at the moment) objdump cannot. */
45 #include <sys/types.h>
51 /* Define BFD64 here, even if our default architecture is 32 bit ELF
52 as this will allow us to read in and parse 64bit and 32bit ELF files.
53 Only do this if we believe that the compiler can support a 64 bit
54 data type. For now we only rely on GCC being able to do this. */
60 #include "elf/common.h"
61 #include "elf/external.h"
62 #include "elf/internal.h"
63 #include "elf/dwarf2.h"
65 /* The following headers use the elf/reloc-macros.h file to
66 automatically generate relocation recognition functions
67 such as elf_mips_reloc_type() */
69 #define RELOC_MACROS_GEN_FUNC
71 #include "elf/alpha.h"
91 #include "elf/m68hc11.h"
92 #include "elf/mcore.h"
95 #include "elf/mn10200.h"
96 #include "elf/mn10300.h"
97 #include "elf/msp430.h"
101 #include "elf/ppc64.h"
102 #include "elf/s390.h"
104 #include "elf/sparc.h"
105 #include "elf/v850.h"
107 #include "elf/x86-64.h"
108 #include "elf/xstormy16.h"
110 #include "elf/iq2000.h"
111 #include "elf/xtensa.h"
117 #include "libiberty.h"
119 char *program_name
= "readelf";
120 long archive_file_offset
;
121 unsigned long archive_file_size
;
122 unsigned long dynamic_addr
;
123 bfd_size_type dynamic_size
;
124 unsigned int dynamic_nent
;
125 char *dynamic_strings
;
126 unsigned long dynamic_strings_length
;
128 unsigned long string_table_length
;
129 unsigned long num_dynamic_syms
;
130 Elf_Internal_Sym
*dynamic_symbols
;
131 Elf_Internal_Syminfo
*dynamic_syminfo
;
132 unsigned long dynamic_syminfo_offset
;
133 unsigned int dynamic_syminfo_nent
;
134 char program_interpreter
[64];
135 bfd_vma dynamic_info
[DT_JMPREL
+ 1];
136 bfd_vma version_info
[16];
137 Elf_Internal_Ehdr elf_header
;
138 Elf_Internal_Shdr
*section_headers
;
139 Elf_Internal_Phdr
*program_headers
;
140 Elf_Internal_Dyn
*dynamic_section
;
141 Elf_Internal_Shdr
*symtab_shndx_hdr
;
147 int do_section_groups
;
150 int do_using_dynamic
;
158 int do_debug_abbrevs
;
160 int do_debug_pubnames
;
161 int do_debug_aranges
;
164 int do_debug_frames_interp
;
165 int do_debug_macinfo
;
172 int need_base_address
;
173 bfd_vma eh_addr_size
;
177 struct group_list
*next
;
178 unsigned int section_index
;
183 struct group_list
*root
;
184 unsigned int group_index
;
187 struct group
*section_groups
;
190 struct group
**section_headers_groups
;
192 /* A dynamic array of flags indicating for which sections a hex dump
193 has been requested (via the -x switch) and/or a disassembly dump
194 (via the -i switch). */
195 char *cmdline_dump_sects
= NULL
;
196 unsigned num_cmdline_dump_sects
= 0;
198 /* A dynamic array of flags indicating for which sections a dump of
199 some kind has been requested. It is reset on a per-object file
200 basis and then initialised from the cmdline_dump_sects array and
201 the results of interpreting the -w switch. */
202 char *dump_sects
= NULL
;
203 unsigned int num_dump_sects
= 0;
205 #define HEX_DUMP (1 << 0)
206 #define DISASS_DUMP (1 << 1)
207 #define DEBUG_DUMP (1 << 2)
209 /* How to rpint a vma value. */
210 typedef enum print_mode
222 static bfd_vma (*byte_get
) (unsigned char *, int);
223 static void (*byte_put
) (unsigned char *, bfd_vma
, int);
227 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
228 ((X)->sh_name >= string_table_length \
229 ? "<corrupt>" : string_table + (X)->sh_name))
231 /* Given st_shndx I, map to section_headers index. */
232 #define SECTION_HEADER_INDEX(I) \
233 ((I) < SHN_LORESERVE \
235 : ((I) <= SHN_HIRESERVE \
237 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
239 /* Reverse of the above. */
240 #define SECTION_HEADER_NUM(N) \
241 ((N) < SHN_LORESERVE \
243 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
245 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
247 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
249 #define BYTE_GET(field) byte_get (field, sizeof (field))
251 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
253 #define GET_ELF_SYMBOLS(file, section) \
254 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
255 : get_64bit_elf_symbols (file, section))
257 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
258 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
259 already been called and verified that the string exists. */
260 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
262 /* This is just a bit of syntatic sugar. */
263 #define streq(a,b) (strcmp ((a), (b)) == 0)
264 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
267 error (const char *message
, ...)
271 va_start (args
, message
);
272 fprintf (stderr
, _("%s: Error: "), program_name
);
273 vfprintf (stderr
, message
, args
);
278 warn (const char *message
, ...)
282 va_start (args
, message
);
283 fprintf (stderr
, _("%s: Warning: "), program_name
);
284 vfprintf (stderr
, message
, args
);
289 get_data (void *var
, FILE *file
, long offset
, size_t size
, const char *reason
)
296 if (fseek (file
, archive_file_offset
+ offset
, SEEK_SET
))
298 error (_("Unable to seek to 0x%x for %s\n"),
299 archive_file_offset
+ offset
, reason
);
306 mvar
= malloc (size
);
310 error (_("Out of memory allocating 0x%x bytes for %s\n"),
316 if (fread (mvar
, size
, 1, file
) != 1)
318 error (_("Unable to read in 0x%x bytes of %s\n"), size
, reason
);
328 byte_get_little_endian (unsigned char *field
, int size
)
336 return ((unsigned int) (field
[0]))
337 | (((unsigned int) (field
[1])) << 8);
341 /* We want to extract data from an 8 byte wide field and
342 place it into a 4 byte wide field. Since this is a little
343 endian source we can just use the 4 byte extraction code. */
347 return ((unsigned long) (field
[0]))
348 | (((unsigned long) (field
[1])) << 8)
349 | (((unsigned long) (field
[2])) << 16)
350 | (((unsigned long) (field
[3])) << 24);
354 return ((bfd_vma
) (field
[0]))
355 | (((bfd_vma
) (field
[1])) << 8)
356 | (((bfd_vma
) (field
[2])) << 16)
357 | (((bfd_vma
) (field
[3])) << 24)
358 | (((bfd_vma
) (field
[4])) << 32)
359 | (((bfd_vma
) (field
[5])) << 40)
360 | (((bfd_vma
) (field
[6])) << 48)
361 | (((bfd_vma
) (field
[7])) << 56);
364 error (_("Unhandled data length: %d\n"), size
);
370 byte_get_signed (unsigned char *field
, int size
)
372 bfd_vma x
= byte_get (field
, size
);
377 return (x
^ 0x80) - 0x80;
379 return (x
^ 0x8000) - 0x8000;
381 return (x
^ 0x80000000) - 0x80000000;
390 byte_put_little_endian (unsigned char *field
, bfd_vma value
, int size
)
395 field
[7] = (((value
>> 24) >> 24) >> 8) & 0xff;
396 field
[6] = ((value
>> 24) >> 24) & 0xff;
397 field
[5] = ((value
>> 24) >> 16) & 0xff;
398 field
[4] = ((value
>> 24) >> 8) & 0xff;
401 field
[3] = (value
>> 24) & 0xff;
402 field
[2] = (value
>> 16) & 0xff;
405 field
[1] = (value
>> 8) & 0xff;
408 field
[0] = value
& 0xff;
412 error (_("Unhandled data length: %d\n"), size
);
417 #if defined BFD64 && !BFD_HOST_64BIT_LONG
419 print_dec_vma (bfd_vma vma
, int is_signed
)
425 if (is_signed
&& (bfd_signed_vma
) vma
< 0)
434 *bufp
++ = '0' + vma
% 10;
446 print_hex_vma (bfd_vma vma
)
454 char digit
= '0' + (vma
& 0x0f);
456 digit
+= 'a' - '0' - 10;
469 /* Print a VMA value. */
471 print_vma (bfd_vma vma
, print_mode mode
)
480 return printf ("0x%8.8lx", (unsigned long) vma
);
483 return printf ("%8.8lx", (unsigned long) vma
);
487 return printf ("%5ld", (long) vma
);
491 return printf ("0x%lx", (unsigned long) vma
);
494 return printf ("%lx", (unsigned long) vma
);
497 return printf ("%ld", (unsigned long) vma
);
500 return printf ("%lu", (unsigned long) vma
);
523 #if BFD_HOST_64BIT_LONG
524 return nc
+ printf ("%lx", vma
);
526 return nc
+ print_hex_vma (vma
);
530 #if BFD_HOST_64BIT_LONG
531 return printf ("%ld", vma
);
533 return print_dec_vma (vma
, 1);
537 #if BFD_HOST_64BIT_LONG
539 return printf ("%5ld", vma
);
541 return printf ("%#lx", vma
);
544 return printf ("%5ld", _bfd_int64_low (vma
));
546 return print_hex_vma (vma
);
550 #if BFD_HOST_64BIT_LONG
551 return printf ("%lu", vma
);
553 return print_dec_vma (vma
, 0);
561 /* Display a symbol on stdout. If do_wide is not true then
562 format the symbol to be at most WIDTH characters,
563 truncating as necessary. If WIDTH is negative then
564 format the string to be exactly - WIDTH characters,
565 truncating or padding as necessary. */
568 print_symbol (int width
, const char *symbol
)
571 printf ("%s", symbol
);
573 printf ("%-*.*s", width
, width
, symbol
);
575 printf ("%-.*s", width
, symbol
);
579 byte_get_big_endian (unsigned char *field
, int size
)
587 return ((unsigned int) (field
[1])) | (((int) (field
[0])) << 8);
591 /* Although we are extracing data from an 8 byte wide field,
592 we are returning only 4 bytes of data. */
597 return ((unsigned long) (field
[3]))
598 | (((unsigned long) (field
[2])) << 8)
599 | (((unsigned long) (field
[1])) << 16)
600 | (((unsigned long) (field
[0])) << 24);
604 return ((bfd_vma
) (field
[7]))
605 | (((bfd_vma
) (field
[6])) << 8)
606 | (((bfd_vma
) (field
[5])) << 16)
607 | (((bfd_vma
) (field
[4])) << 24)
608 | (((bfd_vma
) (field
[3])) << 32)
609 | (((bfd_vma
) (field
[2])) << 40)
610 | (((bfd_vma
) (field
[1])) << 48)
611 | (((bfd_vma
) (field
[0])) << 56);
615 error (_("Unhandled data length: %d\n"), size
);
621 byte_put_big_endian (unsigned char *field
, bfd_vma value
, int size
)
626 field
[7] = value
& 0xff;
627 field
[6] = (value
>> 8) & 0xff;
628 field
[5] = (value
>> 16) & 0xff;
629 field
[4] = (value
>> 24) & 0xff;
634 field
[3] = value
& 0xff;
635 field
[2] = (value
>> 8) & 0xff;
639 field
[1] = value
& 0xff;
643 field
[0] = value
& 0xff;
647 error (_("Unhandled data length: %d\n"), size
);
652 /* Return a pointer to section NAME, or NULL if no such section exists. */
654 static Elf_Internal_Shdr
*
655 find_section (const char *name
)
659 for (i
= 0; i
< elf_header
.e_shnum
; i
++)
660 if (streq (SECTION_NAME (section_headers
+ i
), name
))
661 return section_headers
+ i
;
666 /* Guess the relocation size commonly used by the specific machines. */
669 guess_is_rela (unsigned long e_machine
)
673 /* Targets that use REL relocations. */
688 /* Targets that use RELA relocations. */
703 case EM_CYGNUS_MN10200
:
705 case EM_CYGNUS_MN10300
:
752 warn (_("Don't know about relocations on this machine architecture\n"));
758 slurp_rela_relocs (FILE *file
,
759 unsigned long rel_offset
,
760 unsigned long rel_size
,
761 Elf_Internal_Rela
**relasp
,
762 unsigned long *nrelasp
)
764 Elf_Internal_Rela
*relas
;
765 unsigned long nrelas
;
770 Elf32_External_Rela
*erelas
;
772 erelas
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
776 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
778 relas
= malloc (nrelas
* sizeof (Elf_Internal_Rela
));
782 error (_("out of memory parsing relocs"));
786 for (i
= 0; i
< nrelas
; i
++)
788 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
789 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
790 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
797 Elf64_External_Rela
*erelas
;
799 erelas
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
803 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
805 relas
= malloc (nrelas
* sizeof (Elf_Internal_Rela
));
809 error (_("out of memory parsing relocs"));
813 for (i
= 0; i
< nrelas
; i
++)
815 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
816 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
817 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
828 slurp_rel_relocs (FILE *file
,
829 unsigned long rel_offset
,
830 unsigned long rel_size
,
831 Elf_Internal_Rela
**relsp
,
832 unsigned long *nrelsp
)
834 Elf_Internal_Rela
*rels
;
840 Elf32_External_Rel
*erels
;
842 erels
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
846 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
848 rels
= malloc (nrels
* sizeof (Elf_Internal_Rela
));
852 error (_("out of memory parsing relocs"));
856 for (i
= 0; i
< nrels
; i
++)
858 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
859 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
860 rels
[i
].r_addend
= 0;
867 Elf64_External_Rel
*erels
;
869 erels
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
873 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
875 rels
= malloc (nrels
* sizeof (Elf_Internal_Rela
));
879 error (_("out of memory parsing relocs"));
883 for (i
= 0; i
< nrels
; i
++)
885 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
886 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
887 rels
[i
].r_addend
= 0;
897 /* Display the contents of the relocation data found at the specified
901 dump_relocations (FILE *file
,
902 unsigned long rel_offset
,
903 unsigned long rel_size
,
904 Elf_Internal_Sym
*symtab
,
907 unsigned long strtablen
,
911 Elf_Internal_Rela
*rels
;
914 if (is_rela
== UNKNOWN
)
915 is_rela
= guess_is_rela (elf_header
.e_machine
);
919 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
924 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
933 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
935 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
940 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
942 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
950 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
952 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
957 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
959 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
963 for (i
= 0; i
< rel_size
; i
++)
966 const char *rtype2
= NULL
;
967 const char *rtype3
= NULL
;
970 bfd_vma symtab_index
;
975 offset
= rels
[i
].r_offset
;
976 info
= rels
[i
].r_info
;
980 type
= ELF32_R_TYPE (info
);
981 symtab_index
= ELF32_R_SYM (info
);
985 /* The #ifdef BFD64 below is to prevent a compile time warning.
986 We know that if we do not have a 64 bit data type that we
987 will never execute this code anyway. */
989 if (elf_header
.e_machine
== EM_MIPS
)
991 /* In little-endian objects, r_info isn't really a 64-bit
992 little-endian value: it has a 32-bit little-endian
993 symbol index followed by four individual byte fields.
994 Reorder INFO accordingly. */
995 if (elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
996 info
= (((info
& 0xffffffff) << 32)
997 | ((info
>> 56) & 0xff)
998 | ((info
>> 40) & 0xff00)
999 | ((info
>> 24) & 0xff0000)
1000 | ((info
>> 8) & 0xff000000));
1001 type
= ELF64_MIPS_R_TYPE (info
);
1002 type2
= ELF64_MIPS_R_TYPE2 (info
);
1003 type3
= ELF64_MIPS_R_TYPE3 (info
);
1005 else if (elf_header
.e_machine
== EM_SPARCV9
)
1006 type
= ELF64_R_TYPE_ID (info
);
1008 type
= ELF64_R_TYPE (info
);
1010 symtab_index
= ELF64_R_SYM (info
);
1016 #ifdef _bfd_int64_low
1017 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
1019 printf ("%8.8lx %8.8lx ", offset
, info
);
1024 #ifdef _bfd_int64_low
1026 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1027 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1028 _bfd_int64_high (offset
),
1029 _bfd_int64_low (offset
),
1030 _bfd_int64_high (info
),
1031 _bfd_int64_low (info
));
1034 ? "%16.16lx %16.16lx "
1035 : "%12.12lx %12.12lx ",
1040 switch (elf_header
.e_machine
)
1047 case EM_CYGNUS_M32R
:
1048 rtype
= elf_m32r_reloc_type (type
);
1053 rtype
= elf_i386_reloc_type (type
);
1058 rtype
= elf_m68hc11_reloc_type (type
);
1062 rtype
= elf_m68k_reloc_type (type
);
1066 rtype
= elf_i960_reloc_type (type
);
1071 rtype
= elf_avr_reloc_type (type
);
1074 case EM_OLD_SPARCV9
:
1075 case EM_SPARC32PLUS
:
1078 rtype
= elf_sparc_reloc_type (type
);
1082 case EM_CYGNUS_V850
:
1083 rtype
= v850_reloc_type (type
);
1087 case EM_CYGNUS_D10V
:
1088 rtype
= elf_d10v_reloc_type (type
);
1092 case EM_CYGNUS_D30V
:
1093 rtype
= elf_d30v_reloc_type (type
);
1097 rtype
= elf_dlx_reloc_type (type
);
1101 rtype
= elf_sh_reloc_type (type
);
1105 case EM_CYGNUS_MN10300
:
1106 rtype
= elf_mn10300_reloc_type (type
);
1110 case EM_CYGNUS_MN10200
:
1111 rtype
= elf_mn10200_reloc_type (type
);
1115 case EM_CYGNUS_FR30
:
1116 rtype
= elf_fr30_reloc_type (type
);
1120 rtype
= elf_frv_reloc_type (type
);
1124 rtype
= elf_mcore_reloc_type (type
);
1128 rtype
= elf_mmix_reloc_type (type
);
1133 rtype
= elf_msp430_reloc_type (type
);
1137 rtype
= elf_ppc_reloc_type (type
);
1141 rtype
= elf_ppc64_reloc_type (type
);
1145 case EM_MIPS_RS3_LE
:
1146 rtype
= elf_mips_reloc_type (type
);
1149 rtype2
= elf_mips_reloc_type (type2
);
1150 rtype3
= elf_mips_reloc_type (type3
);
1155 rtype
= elf_alpha_reloc_type (type
);
1159 rtype
= elf_arm_reloc_type (type
);
1163 rtype
= elf_arc_reloc_type (type
);
1167 rtype
= elf_hppa_reloc_type (type
);
1173 rtype
= elf_h8_reloc_type (type
);
1178 rtype
= elf_or32_reloc_type (type
);
1183 rtype
= elf_pj_reloc_type (type
);
1186 rtype
= elf_ia64_reloc_type (type
);
1190 rtype
= elf_cris_reloc_type (type
);
1194 rtype
= elf_i860_reloc_type (type
);
1198 rtype
= elf_x86_64_reloc_type (type
);
1202 rtype
= i370_reloc_type (type
);
1207 rtype
= elf_s390_reloc_type (type
);
1211 rtype
= elf_xstormy16_reloc_type (type
);
1215 rtype
= elf_crx_reloc_type (type
);
1219 rtype
= elf_vax_reloc_type (type
);
1224 rtype
= elf_ip2k_reloc_type (type
);
1228 rtype
= elf_iq2000_reloc_type (type
);
1233 rtype
= elf_xtensa_reloc_type (type
);
1238 #ifdef _bfd_int64_low
1239 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type
));
1241 printf (_("unrecognized: %-7lx"), type
);
1244 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1248 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1249 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1252 Elf_Internal_Sym
*psym
;
1254 psym
= symtab
+ symtab_index
;
1257 print_vma (psym
->st_value
, LONG_HEX
);
1258 printf (is_32bit_elf
? " " : " ");
1260 if (psym
->st_name
== 0)
1262 const char *sec_name
= "<null>";
1265 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1267 bfd_vma sec_index
= (bfd_vma
) -1;
1269 if (psym
->st_shndx
< SHN_LORESERVE
)
1270 sec_index
= psym
->st_shndx
;
1271 else if (psym
->st_shndx
> SHN_HIRESERVE
)
1272 sec_index
= psym
->st_shndx
- (SHN_HIRESERVE
+ 1
1275 if (sec_index
!= (bfd_vma
) -1)
1276 sec_name
= SECTION_NAME (section_headers
+ sec_index
);
1277 else if (psym
->st_shndx
== SHN_ABS
)
1279 else if (psym
->st_shndx
== SHN_COMMON
)
1280 sec_name
= "COMMON";
1281 else if (elf_header
.e_machine
== EM_IA_64
1282 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1283 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1284 sec_name
= "ANSI_COM";
1287 sprintf (name_buf
, "<section 0x%x>",
1288 (unsigned int) psym
->st_shndx
);
1289 sec_name
= name_buf
;
1292 print_symbol (22, sec_name
);
1294 else if (strtab
== NULL
)
1295 printf (_("<string table index: %3ld>"), psym
->st_name
);
1296 else if (psym
->st_name
> strtablen
)
1297 printf (_("<corrupt string table index: %3ld>"), psym
->st_name
);
1299 print_symbol (22, strtab
+ psym
->st_name
);
1302 printf (" + %lx", (unsigned long) rels
[i
].r_addend
);
1307 printf ("%*c", is_32bit_elf
?
1308 (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1309 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1312 if (elf_header
.e_machine
== EM_SPARCV9
1313 && streq (rtype
, "R_SPARC_OLO10"))
1314 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1318 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1320 printf (" Type2: ");
1323 #ifdef _bfd_int64_low
1324 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2
));
1326 printf (_("unrecognized: %-7lx"), type2
);
1329 printf ("%-17.17s", rtype2
);
1331 printf ("\n Type3: ");
1334 #ifdef _bfd_int64_low
1335 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3
));
1337 printf (_("unrecognized: %-7lx"), type3
);
1340 printf ("%-17.17s", rtype3
);
1352 get_mips_dynamic_type (unsigned long type
)
1356 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1357 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1358 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1359 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1360 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1361 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1362 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1363 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1364 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1365 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1366 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1367 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1368 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1369 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1370 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1371 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1372 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1373 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1374 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1375 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1376 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1377 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1378 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1379 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1380 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1381 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1382 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1383 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1384 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1385 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1386 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1387 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1388 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1389 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1390 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1391 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1392 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1393 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1394 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1395 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1396 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1397 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1398 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1405 get_sparc64_dynamic_type (unsigned long type
)
1409 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1416 get_ppc64_dynamic_type (unsigned long type
)
1420 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1421 case DT_PPC64_OPD
: return "PPC64_OPD";
1422 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1429 get_parisc_dynamic_type (unsigned long type
)
1433 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1434 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1435 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1436 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1437 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1438 case DT_HP_PREINIT
: return "HP_PREINIT";
1439 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1440 case DT_HP_NEEDED
: return "HP_NEEDED";
1441 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1442 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1443 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1444 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1445 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1452 get_ia64_dynamic_type (unsigned long type
)
1456 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1463 get_dynamic_type (unsigned long type
)
1465 static char buff
[32];
1469 case DT_NULL
: return "NULL";
1470 case DT_NEEDED
: return "NEEDED";
1471 case DT_PLTRELSZ
: return "PLTRELSZ";
1472 case DT_PLTGOT
: return "PLTGOT";
1473 case DT_HASH
: return "HASH";
1474 case DT_STRTAB
: return "STRTAB";
1475 case DT_SYMTAB
: return "SYMTAB";
1476 case DT_RELA
: return "RELA";
1477 case DT_RELASZ
: return "RELASZ";
1478 case DT_RELAENT
: return "RELAENT";
1479 case DT_STRSZ
: return "STRSZ";
1480 case DT_SYMENT
: return "SYMENT";
1481 case DT_INIT
: return "INIT";
1482 case DT_FINI
: return "FINI";
1483 case DT_SONAME
: return "SONAME";
1484 case DT_RPATH
: return "RPATH";
1485 case DT_SYMBOLIC
: return "SYMBOLIC";
1486 case DT_REL
: return "REL";
1487 case DT_RELSZ
: return "RELSZ";
1488 case DT_RELENT
: return "RELENT";
1489 case DT_PLTREL
: return "PLTREL";
1490 case DT_DEBUG
: return "DEBUG";
1491 case DT_TEXTREL
: return "TEXTREL";
1492 case DT_JMPREL
: return "JMPREL";
1493 case DT_BIND_NOW
: return "BIND_NOW";
1494 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1495 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1496 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1497 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1498 case DT_RUNPATH
: return "RUNPATH";
1499 case DT_FLAGS
: return "FLAGS";
1501 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1502 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1504 case DT_CHECKSUM
: return "CHECKSUM";
1505 case DT_PLTPADSZ
: return "PLTPADSZ";
1506 case DT_MOVEENT
: return "MOVEENT";
1507 case DT_MOVESZ
: return "MOVESZ";
1508 case DT_FEATURE
: return "FEATURE";
1509 case DT_POSFLAG_1
: return "POSFLAG_1";
1510 case DT_SYMINSZ
: return "SYMINSZ";
1511 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1513 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1514 case DT_CONFIG
: return "CONFIG";
1515 case DT_DEPAUDIT
: return "DEPAUDIT";
1516 case DT_AUDIT
: return "AUDIT";
1517 case DT_PLTPAD
: return "PLTPAD";
1518 case DT_MOVETAB
: return "MOVETAB";
1519 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1521 case DT_VERSYM
: return "VERSYM";
1523 case DT_RELACOUNT
: return "RELACOUNT";
1524 case DT_RELCOUNT
: return "RELCOUNT";
1525 case DT_FLAGS_1
: return "FLAGS_1";
1526 case DT_VERDEF
: return "VERDEF";
1527 case DT_VERDEFNUM
: return "VERDEFNUM";
1528 case DT_VERNEED
: return "VERNEED";
1529 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1531 case DT_AUXILIARY
: return "AUXILIARY";
1532 case DT_USED
: return "USED";
1533 case DT_FILTER
: return "FILTER";
1535 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1536 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1537 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1538 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1539 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1542 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1546 switch (elf_header
.e_machine
)
1549 case EM_MIPS_RS3_LE
:
1550 result
= get_mips_dynamic_type (type
);
1553 result
= get_sparc64_dynamic_type (type
);
1556 result
= get_ppc64_dynamic_type (type
);
1559 result
= get_ia64_dynamic_type (type
);
1569 sprintf (buff
, _("Processor Specific: %lx"), type
);
1571 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1575 switch (elf_header
.e_machine
)
1578 result
= get_parisc_dynamic_type (type
);
1588 sprintf (buff
, _("Operating System specific: %lx"), type
);
1591 sprintf (buff
, _("<unknown>: %lx"), type
);
1598 get_file_type (unsigned e_type
)
1600 static char buff
[32];
1604 case ET_NONE
: return _("NONE (None)");
1605 case ET_REL
: return _("REL (Relocatable file)");
1606 case ET_EXEC
: return _("EXEC (Executable file)");
1607 case ET_DYN
: return _("DYN (Shared object file)");
1608 case ET_CORE
: return _("CORE (Core file)");
1611 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1612 sprintf (buff
, _("Processor Specific: (%x)"), e_type
);
1613 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1614 sprintf (buff
, _("OS Specific: (%x)"), e_type
);
1616 sprintf (buff
, _("<unknown>: %x"), e_type
);
1622 get_machine_name (unsigned e_machine
)
1624 static char buff
[64]; /* XXX */
1628 case EM_NONE
: return _("None");
1629 case EM_M32
: return "WE32100";
1630 case EM_SPARC
: return "Sparc";
1631 case EM_386
: return "Intel 80386";
1632 case EM_68K
: return "MC68000";
1633 case EM_88K
: return "MC88000";
1634 case EM_486
: return "Intel 80486";
1635 case EM_860
: return "Intel 80860";
1636 case EM_MIPS
: return "MIPS R3000";
1637 case EM_S370
: return "IBM System/370";
1638 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1639 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1640 case EM_PARISC
: return "HPPA";
1641 case EM_PPC_OLD
: return "Power PC (old)";
1642 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1643 case EM_960
: return "Intel 90860";
1644 case EM_PPC
: return "PowerPC";
1645 case EM_PPC64
: return "PowerPC64";
1646 case EM_V800
: return "NEC V800";
1647 case EM_FR20
: return "Fujitsu FR20";
1648 case EM_RH32
: return "TRW RH32";
1649 case EM_MCORE
: return "MCORE";
1650 case EM_ARM
: return "ARM";
1651 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1652 case EM_SH
: return "Renesas / SuperH SH";
1653 case EM_SPARCV9
: return "Sparc v9";
1654 case EM_TRICORE
: return "Siemens Tricore";
1655 case EM_ARC
: return "ARC";
1656 case EM_H8_300
: return "Renesas H8/300";
1657 case EM_H8_300H
: return "Renesas H8/300H";
1658 case EM_H8S
: return "Renesas H8S";
1659 case EM_H8_500
: return "Renesas H8/500";
1660 case EM_IA_64
: return "Intel IA-64";
1661 case EM_MIPS_X
: return "Stanford MIPS-X";
1662 case EM_COLDFIRE
: return "Motorola Coldfire";
1663 case EM_68HC12
: return "Motorola M68HC12";
1664 case EM_ALPHA
: return "Alpha";
1665 case EM_CYGNUS_D10V
:
1666 case EM_D10V
: return "d10v";
1667 case EM_CYGNUS_D30V
:
1668 case EM_D30V
: return "d30v";
1669 case EM_CYGNUS_M32R
:
1670 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
1671 case EM_CYGNUS_V850
:
1672 case EM_V850
: return "NEC v850";
1673 case EM_CYGNUS_MN10300
:
1674 case EM_MN10300
: return "mn10300";
1675 case EM_CYGNUS_MN10200
:
1676 case EM_MN10200
: return "mn10200";
1677 case EM_CYGNUS_FR30
:
1678 case EM_FR30
: return "Fujitsu FR30";
1679 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1681 case EM_PJ
: return "picoJava";
1682 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1683 case EM_PCP
: return "Siemens PCP";
1684 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1685 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1686 case EM_STARCORE
: return "Motorola Star*Core processor";
1687 case EM_ME16
: return "Toyota ME16 processor";
1688 case EM_ST100
: return "STMicroelectronics ST100 processor";
1689 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1690 case EM_FX66
: return "Siemens FX66 microcontroller";
1691 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1692 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1693 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1694 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1695 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1696 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1697 case EM_SVX
: return "Silicon Graphics SVx";
1698 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1699 case EM_VAX
: return "Digital VAX";
1701 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1702 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1703 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1704 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1705 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1706 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1707 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1708 case EM_PRISM
: return "Vitesse Prism";
1709 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1711 case EM_S390
: return "IBM S/390";
1712 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1714 case EM_OR32
: return "OpenRISC";
1715 case EM_CRX
: return "National Semiconductor CRX microprocessor";
1716 case EM_DLX
: return "OpenDLX";
1718 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1719 case EM_IQ2000
: return "Vitesse IQ2000";
1721 case EM_XTENSA
: return "Tensilica Xtensa Processor";
1723 sprintf (buff
, _("<unknown>: %x"), e_machine
);
1729 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
1734 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1735 e_flags
&= ~ EF_ARM_EABIMASK
;
1737 /* Handle "generic" ARM flags. */
1738 if (e_flags
& EF_ARM_RELEXEC
)
1740 strcat (buf
, ", relocatable executable");
1741 e_flags
&= ~ EF_ARM_RELEXEC
;
1744 if (e_flags
& EF_ARM_HASENTRY
)
1746 strcat (buf
, ", has entry point");
1747 e_flags
&= ~ EF_ARM_HASENTRY
;
1750 /* Now handle EABI specific flags. */
1754 strcat (buf
, ", <unrecognized EABI>");
1759 case EF_ARM_EABI_VER1
:
1760 strcat (buf
, ", Version1 EABI");
1765 /* Process flags one bit at a time. */
1766 flag
= e_flags
& - e_flags
;
1771 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1772 strcat (buf
, ", sorted symbol tables");
1782 case EF_ARM_EABI_VER2
:
1783 strcat (buf
, ", Version2 EABI");
1788 /* Process flags one bit at a time. */
1789 flag
= e_flags
& - e_flags
;
1794 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1795 strcat (buf
, ", sorted symbol tables");
1798 case EF_ARM_DYNSYMSUSESEGIDX
:
1799 strcat (buf
, ", dynamic symbols use segment index");
1802 case EF_ARM_MAPSYMSFIRST
:
1803 strcat (buf
, ", mapping symbols precede others");
1813 case EF_ARM_EABI_VER3
:
1814 strcat (buf
, ", Version3 EABI");
1817 case EF_ARM_EABI_VER4
:
1818 strcat (buf
, ", Version4 EABI");
1823 /* Process flags one bit at a time. */
1824 flag
= e_flags
& - e_flags
;
1830 strcat (buf
, ", BE8");
1834 strcat (buf
, ", LE8");
1844 case EF_ARM_EABI_UNKNOWN
:
1845 strcat (buf
, ", GNU EABI");
1850 /* Process flags one bit at a time. */
1851 flag
= e_flags
& - e_flags
;
1856 case EF_ARM_INTERWORK
:
1857 strcat (buf
, ", interworking enabled");
1860 case EF_ARM_APCS_26
:
1861 strcat (buf
, ", uses APCS/26");
1864 case EF_ARM_APCS_FLOAT
:
1865 strcat (buf
, ", uses APCS/float");
1869 strcat (buf
, ", position independent");
1873 strcat (buf
, ", 8 bit structure alignment");
1876 case EF_ARM_NEW_ABI
:
1877 strcat (buf
, ", uses new ABI");
1880 case EF_ARM_OLD_ABI
:
1881 strcat (buf
, ", uses old ABI");
1884 case EF_ARM_SOFT_FLOAT
:
1885 strcat (buf
, ", software FP");
1888 case EF_ARM_VFP_FLOAT
:
1889 strcat (buf
, ", VFP");
1892 case EF_ARM_MAVERICK_FLOAT
:
1893 strcat (buf
, ", Maverick FP");
1904 strcat (buf
,", <unknown>");
1908 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
1910 static char buf
[1024];
1922 decode_ARM_machine_flags (e_flags
, buf
);
1926 switch (e_flags
& EF_FRV_CPU_MASK
)
1928 case EF_FRV_CPU_GENERIC
:
1932 strcat (buf
, ", fr???");
1935 case EF_FRV_CPU_FR300
:
1936 strcat (buf
, ", fr300");
1939 case EF_FRV_CPU_FR400
:
1940 strcat (buf
, ", fr400");
1942 case EF_FRV_CPU_FR405
:
1943 strcat (buf
, ", fr405");
1946 case EF_FRV_CPU_FR450
:
1947 strcat (buf
, ", fr450");
1950 case EF_FRV_CPU_FR500
:
1951 strcat (buf
, ", fr500");
1953 case EF_FRV_CPU_FR550
:
1954 strcat (buf
, ", fr550");
1957 case EF_FRV_CPU_SIMPLE
:
1958 strcat (buf
, ", simple");
1960 case EF_FRV_CPU_TOMCAT
:
1961 strcat (buf
, ", tomcat");
1967 if (e_flags
& EF_CPU32
)
1968 strcat (buf
, ", cpu32");
1969 if (e_flags
& EF_M68000
)
1970 strcat (buf
, ", m68000");
1974 if (e_flags
& EF_PPC_EMB
)
1975 strcat (buf
, ", emb");
1977 if (e_flags
& EF_PPC_RELOCATABLE
)
1978 strcat (buf
, ", relocatable");
1980 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
1981 strcat (buf
, ", relocatable-lib");
1985 case EM_CYGNUS_V850
:
1986 switch (e_flags
& EF_V850_ARCH
)
1989 strcat (buf
, ", v850e1");
1992 strcat (buf
, ", v850e");
1995 strcat (buf
, ", v850");
1998 strcat (buf
, ", unknown v850 architecture variant");
2004 case EM_CYGNUS_M32R
:
2005 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
2006 strcat (buf
, ", m32r");
2011 case EM_MIPS_RS3_LE
:
2012 if (e_flags
& EF_MIPS_NOREORDER
)
2013 strcat (buf
, ", noreorder");
2015 if (e_flags
& EF_MIPS_PIC
)
2016 strcat (buf
, ", pic");
2018 if (e_flags
& EF_MIPS_CPIC
)
2019 strcat (buf
, ", cpic");
2021 if (e_flags
& EF_MIPS_UCODE
)
2022 strcat (buf
, ", ugen_reserved");
2024 if (e_flags
& EF_MIPS_ABI2
)
2025 strcat (buf
, ", abi2");
2027 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
2028 strcat (buf
, ", odk first");
2030 if (e_flags
& EF_MIPS_32BITMODE
)
2031 strcat (buf
, ", 32bitmode");
2033 switch ((e_flags
& EF_MIPS_MACH
))
2035 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
2036 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
2037 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
2038 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
2039 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
2040 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
2041 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
2042 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
2043 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
2044 case E_MIPS_MACH_9000
: strcat (buf
, ", 9000"); break;
2046 /* We simply ignore the field in this case to avoid confusion:
2047 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2050 default: strcat (buf
, ", unknown CPU"); break;
2053 switch ((e_flags
& EF_MIPS_ABI
))
2055 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
2056 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
2057 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
2058 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
2060 /* We simply ignore the field in this case to avoid confusion:
2061 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2062 This means it is likely to be an o32 file, but not for
2065 default: strcat (buf
, ", unknown ABI"); break;
2068 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
2069 strcat (buf
, ", mdmx");
2071 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
2072 strcat (buf
, ", mips16");
2074 switch ((e_flags
& EF_MIPS_ARCH
))
2076 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
2077 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
2078 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
2079 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
2080 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
2081 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
2082 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
2083 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
2084 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
2085 default: strcat (buf
, ", unknown ISA"); break;
2091 switch ((e_flags
& EF_SH_MACH_MASK
))
2093 case EF_SH1
: strcat (buf
, ", sh1"); break;
2094 case EF_SH2
: strcat (buf
, ", sh2"); break;
2095 case EF_SH3
: strcat (buf
, ", sh3"); break;
2096 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
2097 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
2098 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
2099 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
2100 case EF_SH4
: strcat (buf
, ", sh4"); break;
2101 case EF_SH5
: strcat (buf
, ", sh5"); break;
2102 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
2103 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
2104 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
2105 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
2106 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
2107 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
2108 default: strcat (buf
, ", unknown ISA"); break;
2114 if (e_flags
& EF_SPARC_32PLUS
)
2115 strcat (buf
, ", v8+");
2117 if (e_flags
& EF_SPARC_SUN_US1
)
2118 strcat (buf
, ", ultrasparcI");
2120 if (e_flags
& EF_SPARC_SUN_US3
)
2121 strcat (buf
, ", ultrasparcIII");
2123 if (e_flags
& EF_SPARC_HAL_R1
)
2124 strcat (buf
, ", halr1");
2126 if (e_flags
& EF_SPARC_LEDATA
)
2127 strcat (buf
, ", ledata");
2129 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2130 strcat (buf
, ", tso");
2132 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2133 strcat (buf
, ", pso");
2135 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2136 strcat (buf
, ", rmo");
2140 switch (e_flags
& EF_PARISC_ARCH
)
2142 case EFA_PARISC_1_0
:
2143 strcpy (buf
, ", PA-RISC 1.0");
2145 case EFA_PARISC_1_1
:
2146 strcpy (buf
, ", PA-RISC 1.1");
2148 case EFA_PARISC_2_0
:
2149 strcpy (buf
, ", PA-RISC 2.0");
2154 if (e_flags
& EF_PARISC_TRAPNIL
)
2155 strcat (buf
, ", trapnil");
2156 if (e_flags
& EF_PARISC_EXT
)
2157 strcat (buf
, ", ext");
2158 if (e_flags
& EF_PARISC_LSB
)
2159 strcat (buf
, ", lsb");
2160 if (e_flags
& EF_PARISC_WIDE
)
2161 strcat (buf
, ", wide");
2162 if (e_flags
& EF_PARISC_NO_KABP
)
2163 strcat (buf
, ", no kabp");
2164 if (e_flags
& EF_PARISC_LAZYSWAP
)
2165 strcat (buf
, ", lazyswap");
2170 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2171 strcat (buf
, ", new calling convention");
2173 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2174 strcat (buf
, ", gnu calling convention");
2178 if ((e_flags
& EF_IA_64_ABI64
))
2179 strcat (buf
, ", 64-bit");
2181 strcat (buf
, ", 32-bit");
2182 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2183 strcat (buf
, ", reduced fp model");
2184 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2185 strcat (buf
, ", no function descriptors, constant gp");
2186 else if ((e_flags
& EF_IA_64_CONS_GP
))
2187 strcat (buf
, ", constant gp");
2188 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2189 strcat (buf
, ", absolute");
2193 if ((e_flags
& EF_VAX_NONPIC
))
2194 strcat (buf
, ", non-PIC");
2195 if ((e_flags
& EF_VAX_DFLOAT
))
2196 strcat (buf
, ", D-Float");
2197 if ((e_flags
& EF_VAX_GFLOAT
))
2198 strcat (buf
, ", G-Float");
2207 get_osabi_name (unsigned int osabi
)
2209 static char buff
[32];
2213 case ELFOSABI_NONE
: return "UNIX - System V";
2214 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2215 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2216 case ELFOSABI_LINUX
: return "UNIX - Linux";
2217 case ELFOSABI_HURD
: return "GNU/Hurd";
2218 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2219 case ELFOSABI_AIX
: return "UNIX - AIX";
2220 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2221 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2222 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2223 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2224 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2225 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2226 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2227 case ELFOSABI_AROS
: return "Amiga Research OS";
2228 case ELFOSABI_STANDALONE
: return _("Standalone App");
2229 case ELFOSABI_ARM
: return "ARM";
2231 sprintf (buff
, _("<unknown: %x>"), osabi
);
2237 get_mips_segment_type (unsigned long type
)
2241 case PT_MIPS_REGINFO
:
2243 case PT_MIPS_RTPROC
:
2245 case PT_MIPS_OPTIONS
:
2255 get_parisc_segment_type (unsigned long type
)
2259 case PT_HP_TLS
: return "HP_TLS";
2260 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2261 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2262 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2263 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2264 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2265 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2266 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2267 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2268 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2269 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2270 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2271 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2272 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2281 get_ia64_segment_type (unsigned long type
)
2285 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2286 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2287 case PT_HP_TLS
: return "HP_TLS";
2288 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2289 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2290 case PT_IA_64_HP_STACK
: return "HP_STACK";
2299 get_segment_type (unsigned long p_type
)
2301 static char buff
[32];
2305 case PT_NULL
: return "NULL";
2306 case PT_LOAD
: return "LOAD";
2307 case PT_DYNAMIC
: return "DYNAMIC";
2308 case PT_INTERP
: return "INTERP";
2309 case PT_NOTE
: return "NOTE";
2310 case PT_SHLIB
: return "SHLIB";
2311 case PT_PHDR
: return "PHDR";
2312 case PT_TLS
: return "TLS";
2314 case PT_GNU_EH_FRAME
:
2315 return "GNU_EH_FRAME";
2316 case PT_GNU_STACK
: return "GNU_STACK";
2317 case PT_GNU_RELRO
: return "GNU_RELRO";
2320 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2324 switch (elf_header
.e_machine
)
2327 case EM_MIPS_RS3_LE
:
2328 result
= get_mips_segment_type (p_type
);
2331 result
= get_parisc_segment_type (p_type
);
2334 result
= get_ia64_segment_type (p_type
);
2344 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2346 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2350 switch (elf_header
.e_machine
)
2353 result
= get_parisc_segment_type (p_type
);
2356 result
= get_ia64_segment_type (p_type
);
2366 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2369 sprintf (buff
, _("<unknown>: %lx"), p_type
);
2376 get_mips_section_type_name (unsigned int sh_type
)
2380 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2381 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2382 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2383 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2384 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2385 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2386 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2387 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2388 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2389 case SHT_MIPS_RELD
: return "MIPS_RELD";
2390 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2391 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2392 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2393 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2394 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2395 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2396 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2397 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2398 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2399 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2400 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2401 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2402 case SHT_MIPS_LINE
: return "MIPS_LINE";
2403 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2404 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2405 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2406 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2407 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2408 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2409 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2410 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2411 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2412 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2413 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2414 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2415 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2416 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2417 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2418 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2426 get_parisc_section_type_name (unsigned int sh_type
)
2430 case SHT_PARISC_EXT
: return "PARISC_EXT";
2431 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2432 case SHT_PARISC_DOC
: return "PARISC_DOC";
2440 get_ia64_section_type_name (unsigned int sh_type
)
2442 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2443 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2444 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2448 case SHT_IA_64_EXT
: return "IA_64_EXT";
2449 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2450 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2458 get_x86_64_section_type_name (unsigned int sh_type
)
2462 case SHT_X86_64_UNWIND
: return "X86_64_UNWIND";
2470 get_arm_section_type_name (unsigned int sh_type
)
2483 get_section_type_name (unsigned int sh_type
)
2485 static char buff
[32];
2489 case SHT_NULL
: return "NULL";
2490 case SHT_PROGBITS
: return "PROGBITS";
2491 case SHT_SYMTAB
: return "SYMTAB";
2492 case SHT_STRTAB
: return "STRTAB";
2493 case SHT_RELA
: return "RELA";
2494 case SHT_HASH
: return "HASH";
2495 case SHT_DYNAMIC
: return "DYNAMIC";
2496 case SHT_NOTE
: return "NOTE";
2497 case SHT_NOBITS
: return "NOBITS";
2498 case SHT_REL
: return "REL";
2499 case SHT_SHLIB
: return "SHLIB";
2500 case SHT_DYNSYM
: return "DYNSYM";
2501 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2502 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2503 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2504 case SHT_GROUP
: return "GROUP";
2505 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2506 case SHT_GNU_verdef
: return "VERDEF";
2507 case SHT_GNU_verneed
: return "VERNEED";
2508 case SHT_GNU_versym
: return "VERSYM";
2509 case 0x6ffffff0: return "VERSYM";
2510 case 0x6ffffffc: return "VERDEF";
2511 case 0x7ffffffd: return "AUXILIARY";
2512 case 0x7fffffff: return "FILTER";
2513 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2516 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2520 switch (elf_header
.e_machine
)
2523 case EM_MIPS_RS3_LE
:
2524 result
= get_mips_section_type_name (sh_type
);
2527 result
= get_parisc_section_type_name (sh_type
);
2530 result
= get_ia64_section_type_name (sh_type
);
2533 result
= get_x86_64_section_type_name (sh_type
);
2536 result
= get_arm_section_type_name (sh_type
);
2546 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2548 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2549 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2550 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2551 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2553 sprintf (buff
, _("<unknown>: %x"), sh_type
);
2559 #define OPTION_DEBUG_DUMP 512
2561 struct option options
[] =
2563 {"all", no_argument
, 0, 'a'},
2564 {"file-header", no_argument
, 0, 'h'},
2565 {"program-headers", no_argument
, 0, 'l'},
2566 {"headers", no_argument
, 0, 'e'},
2567 {"histogram", no_argument
, 0, 'I'},
2568 {"segments", no_argument
, 0, 'l'},
2569 {"sections", no_argument
, 0, 'S'},
2570 {"section-headers", no_argument
, 0, 'S'},
2571 {"section-groups", no_argument
, 0, 'g'},
2572 {"symbols", no_argument
, 0, 's'},
2573 {"syms", no_argument
, 0, 's'},
2574 {"relocs", no_argument
, 0, 'r'},
2575 {"notes", no_argument
, 0, 'n'},
2576 {"dynamic", no_argument
, 0, 'd'},
2577 {"arch-specific", no_argument
, 0, 'A'},
2578 {"version-info", no_argument
, 0, 'V'},
2579 {"use-dynamic", no_argument
, 0, 'D'},
2580 {"hex-dump", required_argument
, 0, 'x'},
2581 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2582 {"unwind", no_argument
, 0, 'u'},
2583 #ifdef SUPPORT_DISASSEMBLY
2584 {"instruction-dump", required_argument
, 0, 'i'},
2587 {"version", no_argument
, 0, 'v'},
2588 {"wide", no_argument
, 0, 'W'},
2589 {"help", no_argument
, 0, 'H'},
2590 {0, no_argument
, 0, 0}
2596 fprintf (stdout
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2597 fprintf (stdout
, _(" Display information about the contents of ELF format files\n"));
2598 fprintf (stdout
, _(" Options are:\n\
2599 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2600 -h --file-header Display the ELF file header\n\
2601 -l --program-headers Display the program headers\n\
2602 --segments An alias for --program-headers\n\
2603 -S --section-headers Display the sections' header\n\
2604 --sections An alias for --section-headers\n\
2605 -g --section-groups Display the section groups\n\
2606 -e --headers Equivalent to: -h -l -S\n\
2607 -s --syms Display the symbol table\n\
2608 --symbols An alias for --syms\n\
2609 -n --notes Display the core notes (if present)\n\
2610 -r --relocs Display the relocations (if present)\n\
2611 -u --unwind Display the unwind info (if present)\n\
2612 -d --dynamic Display the dynamic section (if present)\n\
2613 -V --version-info Display the version sections (if present)\n\
2614 -A --arch-specific Display architecture specific information (if any).\n\
2615 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2616 -x --hex-dump=<number> Dump the contents of section <number>\n\
2617 -w[liaprmfFsoR] or\n\
2618 --debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]\n\
2619 Display the contents of DWARF2 debug sections\n"));
2620 #ifdef SUPPORT_DISASSEMBLY
2621 fprintf (stdout
, _("\
2622 -i --instruction-dump=<number>\n\
2623 Disassemble the contents of section <number>\n"));
2625 fprintf (stdout
, _("\
2626 -I --histogram Display histogram of bucket list lengths\n\
2627 -W --wide Allow output width to exceed 80 characters\n\
2628 -H --help Display this information\n\
2629 -v --version Display the version number of readelf\n"));
2630 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2635 /* Record the fact that the user wants the contents of section number
2636 SECTION to be displayed using the method(s) encoded as flags bits
2637 in TYPE. Note, TYPE can be zero if we are creating the array for
2641 request_dump (unsigned int section
, int type
)
2643 if (section
>= num_dump_sects
)
2645 char *new_dump_sects
;
2647 new_dump_sects
= calloc (section
+ 1, 1);
2649 if (new_dump_sects
== NULL
)
2650 error (_("Out of memory allocating dump request table."));
2653 /* Copy current flag settings. */
2654 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2658 dump_sects
= new_dump_sects
;
2659 num_dump_sects
= section
+ 1;
2664 dump_sects
[section
] |= type
;
2670 parse_args (int argc
, char **argv
)
2677 while ((c
= getopt_long
2678 (argc
, argv
, "ersuahnldSDAIgw::x:i:vVWH", options
, NULL
)) != EOF
)
2699 do_section_groups
++;
2707 do_section_groups
++;
2749 section
= strtoul (optarg
, & cp
, 0);
2750 if (! *cp
&& section
>= 0)
2752 request_dump (section
, HEX_DUMP
);
2762 unsigned int index
= 0;
2766 while (optarg
[index
])
2767 switch (optarg
[index
++])
2776 do_debug_abbrevs
= 1;
2786 do_debug_pubnames
= 1;
2790 do_debug_aranges
= 1;
2794 do_debug_ranges
= 1;
2798 do_debug_frames_interp
= 1;
2800 do_debug_frames
= 1;
2805 do_debug_macinfo
= 1;
2819 warn (_("Unrecognized debug option '%s'\n"), optarg
);
2824 case OPTION_DEBUG_DUMP
:
2832 const char * option
;
2835 debug_dump_long_opts
;
2837 debug_dump_long_opts opts_table
[] =
2839 /* Please keep this table alpha- sorted. */
2840 { "Ranges", & do_debug_ranges
},
2841 { "abbrev", & do_debug_abbrevs
},
2842 { "aranges", & do_debug_aranges
},
2843 { "frames", & do_debug_frames
},
2844 { "frames-interp", & do_debug_frames_interp
},
2845 { "info", & do_debug_info
},
2846 { "line", & do_debug_lines
},
2847 { "loc", & do_debug_loc
},
2848 { "macro", & do_debug_macinfo
},
2849 { "pubnames", & do_debug_pubnames
},
2850 /* This entry is for compatability
2851 with earlier versions of readelf. */
2852 { "ranges", & do_debug_aranges
},
2853 { "str", & do_debug_str
},
2864 debug_dump_long_opts
* entry
;
2866 for (entry
= opts_table
; entry
->option
; entry
++)
2868 size_t len
= strlen (entry
->option
);
2870 if (strneq (p
, entry
->option
, len
)
2871 && (p
[len
] == ',' || p
[len
] == '\0'))
2873 * entry
->variable
= 1;
2875 /* The --debug-dump=frames-interp option also
2876 enables the --debug-dump=frames option. */
2877 if (do_debug_frames_interp
)
2878 do_debug_frames
= 1;
2885 if (entry
->option
== NULL
)
2887 warn (_("Unrecognized debug option '%s'\n"), p
);
2888 p
= strchr (p
, ',');
2898 #ifdef SUPPORT_DISASSEMBLY
2901 section
= strtoul (optarg
, & cp
, 0);
2902 if (! *cp
&& section
>= 0)
2904 request_dump (section
, DISASS_DUMP
);
2910 print_version (program_name
);
2920 /* xgettext:c-format */
2921 error (_("Invalid option '-%c'\n"), c
);
2928 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
2929 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2930 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
2931 && !do_section_groups
)
2935 warn (_("Nothing to do.\n"));
2941 get_elf_class (unsigned int elf_class
)
2943 static char buff
[32];
2947 case ELFCLASSNONE
: return _("none");
2948 case ELFCLASS32
: return "ELF32";
2949 case ELFCLASS64
: return "ELF64";
2951 sprintf (buff
, _("<unknown: %x>"), elf_class
);
2957 get_data_encoding (unsigned int encoding
)
2959 static char buff
[32];
2963 case ELFDATANONE
: return _("none");
2964 case ELFDATA2LSB
: return _("2's complement, little endian");
2965 case ELFDATA2MSB
: return _("2's complement, big endian");
2967 sprintf (buff
, _("<unknown: %x>"), encoding
);
2972 /* Decode the data held in 'elf_header'. */
2975 process_file_header (void)
2977 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2978 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
2979 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
2980 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
2983 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2991 printf (_("ELF Header:\n"));
2992 printf (_(" Magic: "));
2993 for (i
= 0; i
< EI_NIDENT
; i
++)
2994 printf ("%2.2x ", elf_header
.e_ident
[i
]);
2996 printf (_(" Class: %s\n"),
2997 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
2998 printf (_(" Data: %s\n"),
2999 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
3000 printf (_(" Version: %d %s\n"),
3001 elf_header
.e_ident
[EI_VERSION
],
3002 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
3004 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
3007 printf (_(" OS/ABI: %s\n"),
3008 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
3009 printf (_(" ABI Version: %d\n"),
3010 elf_header
.e_ident
[EI_ABIVERSION
]);
3011 printf (_(" Type: %s\n"),
3012 get_file_type (elf_header
.e_type
));
3013 printf (_(" Machine: %s\n"),
3014 get_machine_name (elf_header
.e_machine
));
3015 printf (_(" Version: 0x%lx\n"),
3016 (unsigned long) elf_header
.e_version
);
3018 printf (_(" Entry point address: "));
3019 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3020 printf (_("\n Start of program headers: "));
3021 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3022 printf (_(" (bytes into file)\n Start of section headers: "));
3023 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
3024 printf (_(" (bytes into file)\n"));
3026 printf (_(" Flags: 0x%lx%s\n"),
3027 (unsigned long) elf_header
.e_flags
,
3028 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
3029 printf (_(" Size of this header: %ld (bytes)\n"),
3030 (long) elf_header
.e_ehsize
);
3031 printf (_(" Size of program headers: %ld (bytes)\n"),
3032 (long) elf_header
.e_phentsize
);
3033 printf (_(" Number of program headers: %ld\n"),
3034 (long) elf_header
.e_phnum
);
3035 printf (_(" Size of section headers: %ld (bytes)\n"),
3036 (long) elf_header
.e_shentsize
);
3037 printf (_(" Number of section headers: %ld"),
3038 (long) elf_header
.e_shnum
);
3039 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
3040 printf (" (%ld)", (long) section_headers
[0].sh_size
);
3041 putc ('\n', stdout
);
3042 printf (_(" Section header string table index: %ld"),
3043 (long) elf_header
.e_shstrndx
);
3044 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
3045 printf (" (%ld)", (long) section_headers
[0].sh_link
);
3046 putc ('\n', stdout
);
3049 if (section_headers
!= NULL
)
3051 if (elf_header
.e_shnum
== 0)
3052 elf_header
.e_shnum
= section_headers
[0].sh_size
;
3053 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
3054 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
3055 free (section_headers
);
3056 section_headers
= NULL
;
3064 get_32bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3066 Elf32_External_Phdr
*phdrs
;
3067 Elf32_External_Phdr
*external
;
3068 Elf_Internal_Phdr
*internal
;
3071 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3072 elf_header
.e_phentsize
* elf_header
.e_phnum
,
3073 _("program headers"));
3077 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3078 i
< elf_header
.e_phnum
;
3079 i
++, internal
++, external
++)
3081 internal
->p_type
= BYTE_GET (external
->p_type
);
3082 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3083 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3084 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3085 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3086 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3087 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3088 internal
->p_align
= BYTE_GET (external
->p_align
);
3097 get_64bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3099 Elf64_External_Phdr
*phdrs
;
3100 Elf64_External_Phdr
*external
;
3101 Elf_Internal_Phdr
*internal
;
3104 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3105 elf_header
.e_phentsize
* elf_header
.e_phnum
,
3106 _("program headers"));
3110 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3111 i
< elf_header
.e_phnum
;
3112 i
++, internal
++, external
++)
3114 internal
->p_type
= BYTE_GET (external
->p_type
);
3115 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3116 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3117 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3118 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3119 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3120 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3121 internal
->p_align
= BYTE_GET (external
->p_align
);
3129 /* Returns 1 if the program headers were read into `program_headers'. */
3132 get_program_headers (FILE *file
)
3134 Elf_Internal_Phdr
*phdrs
;
3136 /* Check cache of prior read. */
3137 if (program_headers
!= NULL
)
3140 phdrs
= malloc (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
3144 error (_("Out of memory\n"));
3149 ? get_32bit_program_headers (file
, phdrs
)
3150 : get_64bit_program_headers (file
, phdrs
))
3152 program_headers
= phdrs
;
3160 /* Returns 1 if the program headers were loaded. */
3163 process_program_headers (FILE *file
)
3165 Elf_Internal_Phdr
*segment
;
3168 if (elf_header
.e_phnum
== 0)
3171 printf (_("\nThere are no program headers in this file.\n"));
3175 if (do_segments
&& !do_header
)
3177 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3178 printf (_("Entry point "));
3179 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3180 printf (_("\nThere are %d program headers, starting at offset "),
3181 elf_header
.e_phnum
);
3182 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3186 if (! get_program_headers (file
))
3191 if (elf_header
.e_phnum
> 1)
3192 printf (_("\nProgram Headers:\n"));
3194 printf (_("\nProgram Headers:\n"));
3198 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3201 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3205 (_(" Type Offset VirtAddr PhysAddr\n"));
3207 (_(" FileSiz MemSiz Flags Align\n"));
3214 for (i
= 0, segment
= program_headers
;
3215 i
< elf_header
.e_phnum
;
3220 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3224 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3225 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3226 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3227 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3228 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3230 (segment
->p_flags
& PF_R
? 'R' : ' '),
3231 (segment
->p_flags
& PF_W
? 'W' : ' '),
3232 (segment
->p_flags
& PF_X
? 'E' : ' '));
3233 printf ("%#lx", (unsigned long) segment
->p_align
);
3237 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3238 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3241 print_vma (segment
->p_offset
, FULL_HEX
);
3245 print_vma (segment
->p_vaddr
, FULL_HEX
);
3247 print_vma (segment
->p_paddr
, FULL_HEX
);
3250 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3251 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3254 print_vma (segment
->p_filesz
, FULL_HEX
);
3258 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3259 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3262 print_vma (segment
->p_offset
, FULL_HEX
);
3266 (segment
->p_flags
& PF_R
? 'R' : ' '),
3267 (segment
->p_flags
& PF_W
? 'W' : ' '),
3268 (segment
->p_flags
& PF_X
? 'E' : ' '));
3270 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3271 printf ("%#lx", (unsigned long) segment
->p_align
);
3274 print_vma (segment
->p_align
, PREFIX_HEX
);
3279 print_vma (segment
->p_offset
, FULL_HEX
);
3281 print_vma (segment
->p_vaddr
, FULL_HEX
);
3283 print_vma (segment
->p_paddr
, FULL_HEX
);
3285 print_vma (segment
->p_filesz
, FULL_HEX
);
3287 print_vma (segment
->p_memsz
, FULL_HEX
);
3289 (segment
->p_flags
& PF_R
? 'R' : ' '),
3290 (segment
->p_flags
& PF_W
? 'W' : ' '),
3291 (segment
->p_flags
& PF_X
? 'E' : ' '));
3292 print_vma (segment
->p_align
, HEX
);
3296 switch (segment
->p_type
)
3300 error (_("more than one dynamic segment\n"));
3302 /* Try to locate the .dynamic section. If there is
3303 a section header table, we can easily locate it. */
3304 if (section_headers
!= NULL
)
3306 Elf_Internal_Shdr
*sec
;
3308 sec
= find_section (".dynamic");
3309 if (sec
== NULL
|| sec
->sh_size
== 0)
3311 error (_("no .dynamic section in the dynamic segment"));
3315 dynamic_addr
= sec
->sh_offset
;
3316 dynamic_size
= sec
->sh_size
;
3318 if (dynamic_addr
< segment
->p_offset
3319 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
3320 warn (_("the .dynamic section is not contained within the dynamic segment"));
3321 else if (dynamic_addr
> segment
->p_offset
)
3322 warn (_("the .dynamic section is not the first section in the dynamic segment."));
3326 /* Otherwise, we can only assume that the .dynamic
3327 section is the first section in the DYNAMIC segment. */
3328 dynamic_addr
= segment
->p_offset
;
3329 dynamic_size
= segment
->p_filesz
;
3334 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3336 error (_("Unable to find program interpreter name\n"));
3339 program_interpreter
[0] = 0;
3340 fscanf (file
, "%63s", program_interpreter
);
3343 printf (_("\n [Requesting program interpreter: %s]"),
3344 program_interpreter
);
3350 putc ('\n', stdout
);
3353 if (do_segments
&& section_headers
!= NULL
)
3355 printf (_("\n Section to Segment mapping:\n"));
3356 printf (_(" Segment Sections...\n"));
3358 assert (string_table
!= NULL
);
3360 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3363 Elf_Internal_Shdr
*section
;
3365 segment
= program_headers
+ i
;
3366 section
= section_headers
;
3368 printf (" %2.2d ", i
);
3370 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3372 if (section
->sh_size
> 0
3373 /* Compare allocated sections by VMA, unallocated
3374 sections by file offset. */
3375 && (section
->sh_flags
& SHF_ALLOC
3376 ? (section
->sh_addr
>= segment
->p_vaddr
3377 && section
->sh_addr
+ section
->sh_size
3378 <= segment
->p_vaddr
+ segment
->p_memsz
)
3379 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
3380 && (section
->sh_offset
+ section
->sh_size
3381 <= segment
->p_offset
+ segment
->p_filesz
)))
3382 /* .tbss is special. It doesn't contribute memory space
3383 to normal segments. */
3384 && (!((section
->sh_flags
& SHF_TLS
) != 0
3385 && section
->sh_type
== SHT_NOBITS
)
3386 || segment
->p_type
== PT_TLS
))
3387 printf ("%s ", SECTION_NAME (section
));
3398 /* Find the file offset corresponding to VMA by using the program headers. */
3401 offset_from_vma (FILE *file
, bfd_vma vma
, bfd_size_type size
)
3403 Elf_Internal_Phdr
*seg
;
3405 if (! get_program_headers (file
))
3407 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3411 for (seg
= program_headers
;
3412 seg
< program_headers
+ elf_header
.e_phnum
;
3415 if (seg
->p_type
!= PT_LOAD
)
3418 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3419 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3420 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3423 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3430 get_32bit_section_headers (FILE *file
, unsigned int num
)
3432 Elf32_External_Shdr
*shdrs
;
3433 Elf_Internal_Shdr
*internal
;
3436 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3437 elf_header
.e_shentsize
* num
, _("section headers"));
3441 section_headers
= malloc (num
* sizeof (Elf_Internal_Shdr
));
3443 if (section_headers
== NULL
)
3445 error (_("Out of memory\n"));
3449 for (i
= 0, internal
= section_headers
;
3453 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3454 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3455 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3456 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3457 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3458 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3459 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3460 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3461 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3462 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3471 get_64bit_section_headers (FILE *file
, unsigned int num
)
3473 Elf64_External_Shdr
*shdrs
;
3474 Elf_Internal_Shdr
*internal
;
3477 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3478 elf_header
.e_shentsize
* num
, _("section headers"));
3482 section_headers
= malloc (num
* sizeof (Elf_Internal_Shdr
));
3484 if (section_headers
== NULL
)
3486 error (_("Out of memory\n"));
3490 for (i
= 0, internal
= section_headers
;
3494 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3495 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3496 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3497 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3498 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3499 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3500 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3501 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3502 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3503 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3511 static Elf_Internal_Sym
*
3512 get_32bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3514 unsigned long number
;
3515 Elf32_External_Sym
*esyms
;
3516 Elf_External_Sym_Shndx
*shndx
;
3517 Elf_Internal_Sym
*isyms
;
3518 Elf_Internal_Sym
*psym
;
3521 esyms
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
3527 if (symtab_shndx_hdr
!= NULL
3528 && (symtab_shndx_hdr
->sh_link
3529 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3531 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3532 symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3540 number
= section
->sh_size
/ section
->sh_entsize
;
3541 isyms
= malloc (number
* sizeof (Elf_Internal_Sym
));
3545 error (_("Out of memory\n"));
3552 for (j
= 0, psym
= isyms
;
3556 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3557 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3558 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3559 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3560 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3562 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3563 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3564 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3574 static Elf_Internal_Sym
*
3575 get_64bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3577 unsigned long number
;
3578 Elf64_External_Sym
*esyms
;
3579 Elf_External_Sym_Shndx
*shndx
;
3580 Elf_Internal_Sym
*isyms
;
3581 Elf_Internal_Sym
*psym
;
3584 esyms
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
3590 if (symtab_shndx_hdr
!= NULL
3591 && (symtab_shndx_hdr
->sh_link
3592 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3594 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3595 symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3603 number
= section
->sh_size
/ section
->sh_entsize
;
3604 isyms
= malloc (number
* sizeof (Elf_Internal_Sym
));
3608 error (_("Out of memory\n"));
3615 for (j
= 0, psym
= isyms
;
3619 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3620 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3621 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3622 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3623 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3625 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3626 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3627 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3638 get_elf_section_flags (bfd_vma sh_flags
)
3640 static char buff
[32];
3648 flag
= sh_flags
& - sh_flags
;
3653 case SHF_WRITE
: strcat (buff
, "W"); break;
3654 case SHF_ALLOC
: strcat (buff
, "A"); break;
3655 case SHF_EXECINSTR
: strcat (buff
, "X"); break;
3656 case SHF_MERGE
: strcat (buff
, "M"); break;
3657 case SHF_STRINGS
: strcat (buff
, "S"); break;
3658 case SHF_INFO_LINK
: strcat (buff
, "I"); break;
3659 case SHF_LINK_ORDER
: strcat (buff
, "L"); break;
3660 case SHF_OS_NONCONFORMING
: strcat (buff
, "O"); break;
3661 case SHF_GROUP
: strcat (buff
, "G"); break;
3662 case SHF_TLS
: strcat (buff
, "T"); break;
3665 if (flag
& SHF_MASKOS
)
3668 sh_flags
&= ~ SHF_MASKOS
;
3670 else if (flag
& SHF_MASKPROC
)
3673 sh_flags
&= ~ SHF_MASKPROC
;
3685 process_section_headers (FILE *file
)
3687 Elf_Internal_Shdr
*section
;
3690 section_headers
= NULL
;
3692 if (elf_header
.e_shnum
== 0)
3695 printf (_("\nThere are no sections in this file.\n"));
3700 if (do_sections
&& !do_header
)
3701 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3702 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3706 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3709 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3712 /* Read in the string table, so that we have names to display. */
3713 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3715 if (section
->sh_size
!= 0)
3717 string_table
= get_data (NULL
, file
, section
->sh_offset
,
3718 section
->sh_size
, _("string table"));
3720 if (string_table
== NULL
)
3723 string_table_length
= section
->sh_size
;
3726 /* Scan the sections for the dynamic symbol table
3727 and dynamic string table and debug sections. */
3728 dynamic_symbols
= NULL
;
3729 dynamic_strings
= NULL
;
3730 dynamic_syminfo
= NULL
;
3731 symtab_shndx_hdr
= NULL
;
3733 eh_addr_size
= is_32bit_elf
? 4 : 8;
3734 switch (elf_header
.e_machine
)
3737 case EM_MIPS_RS3_LE
:
3738 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
3739 FDE addresses. However, the ABI also has a semi-official ILP32
3740 variant for which the normal FDE address size rules apply.
3742 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
3743 section, where XX is the size of longs in bits. Unfortunately,
3744 earlier compilers provided no way of distinguishing ILP32 objects
3745 from LP64 objects, so if there's any doubt, we should assume that
3746 the official LP64 form is being used. */
3747 if ((elf_header
.e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
3748 && find_section (".gcc_compiled_long32") == NULL
)
3753 for (i
= 0, section
= section_headers
;
3754 i
< elf_header
.e_shnum
;
3757 char *name
= SECTION_NAME (section
);
3759 if (section
->sh_type
== SHT_DYNSYM
)
3761 if (dynamic_symbols
!= NULL
)
3763 error (_("File contains multiple dynamic symbol tables\n"));
3767 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3768 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3770 else if (section
->sh_type
== SHT_STRTAB
3771 && streq (name
, ".dynstr"))
3773 if (dynamic_strings
!= NULL
)
3775 error (_("File contains multiple dynamic string tables\n"));
3779 dynamic_strings
= get_data (NULL
, file
, section
->sh_offset
,
3780 section
->sh_size
, _("dynamic strings"));
3781 dynamic_strings_length
= section
->sh_size
;
3783 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
3785 if (symtab_shndx_hdr
!= NULL
)
3787 error (_("File contains multiple symtab shndx tables\n"));
3790 symtab_shndx_hdr
= section
;
3792 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
3793 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
3794 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
3795 || do_debug_loc
|| do_debug_ranges
)
3796 && strneq (name
, ".debug_", 7))
3801 || (do_debug_info
&& streq (name
, "info"))
3802 || (do_debug_abbrevs
&& streq (name
, "abbrev"))
3803 || (do_debug_lines
&& streq (name
, "line"))
3804 || (do_debug_pubnames
&& streq (name
, "pubnames"))
3805 || (do_debug_aranges
&& streq (name
, "aranges"))
3806 || (do_debug_ranges
&& streq (name
, "ranges"))
3807 || (do_debug_frames
&& streq (name
, "frame"))
3808 || (do_debug_macinfo
&& streq (name
, "macinfo"))
3809 || (do_debug_str
&& streq (name
, "str"))
3810 || (do_debug_loc
&& streq (name
, "loc"))
3812 request_dump (i
, DEBUG_DUMP
);
3814 /* linkonce section to be combined with .debug_info at link time. */
3815 else if ((do_debugging
|| do_debug_info
)
3816 && strneq (name
, ".gnu.linkonce.wi.", 17))
3817 request_dump (i
, DEBUG_DUMP
);
3818 else if (do_debug_frames
&& streq (name
, ".eh_frame"))
3819 request_dump (i
, DEBUG_DUMP
);
3825 if (elf_header
.e_shnum
> 1)
3826 printf (_("\nSection Headers:\n"));
3828 printf (_("\nSection Header:\n"));
3832 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3835 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3838 printf (_(" [Nr] Name Type Address Offset\n"));
3839 printf (_(" Size EntSize Flags Link Info Align\n"));
3842 for (i
= 0, section
= section_headers
;
3843 i
< elf_header
.e_shnum
;
3846 printf (" [%2u] %-17.17s %-15.15s ",
3847 SECTION_HEADER_NUM (i
),
3848 SECTION_NAME (section
),
3849 get_section_type_name (section
->sh_type
));
3853 print_vma (section
->sh_addr
, LONG_HEX
);
3855 printf ( " %6.6lx %6.6lx %2.2lx",
3856 (unsigned long) section
->sh_offset
,
3857 (unsigned long) section
->sh_size
,
3858 (unsigned long) section
->sh_entsize
);
3860 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3862 printf ("%2ld %3lu %2ld\n",
3863 (unsigned long) section
->sh_link
,
3864 (unsigned long) section
->sh_info
,
3865 (unsigned long) section
->sh_addralign
);
3869 print_vma (section
->sh_addr
, LONG_HEX
);
3871 if ((long) section
->sh_offset
== section
->sh_offset
)
3872 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
3876 print_vma (section
->sh_offset
, LONG_HEX
);
3879 if ((unsigned long) section
->sh_size
== section
->sh_size
)
3880 printf (" %6.6lx", (unsigned long) section
->sh_size
);
3884 print_vma (section
->sh_size
, LONG_HEX
);
3887 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
3888 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
3892 print_vma (section
->sh_entsize
, LONG_HEX
);
3895 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3897 printf ("%2ld %3lu ",
3898 (unsigned long) section
->sh_link
,
3899 (unsigned long) section
->sh_info
);
3901 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
3902 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
3905 print_vma (section
->sh_addralign
, DEC
);
3912 print_vma (section
->sh_addr
, LONG_HEX
);
3913 if ((long) section
->sh_offset
== section
->sh_offset
)
3914 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
3918 print_vma (section
->sh_offset
, LONG_HEX
);
3921 print_vma (section
->sh_size
, LONG_HEX
);
3923 print_vma (section
->sh_entsize
, LONG_HEX
);
3925 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3927 printf (" %2ld %3lu %ld\n",
3928 (unsigned long) section
->sh_link
,
3929 (unsigned long) section
->sh_info
,
3930 (unsigned long) section
->sh_addralign
);
3934 printf (_("Key to Flags:\n\
3935 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3936 I (info), L (link order), G (group), x (unknown)\n\
3937 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3943 get_group_flags (unsigned int flags
)
3945 static char buff
[32];
3952 sprintf (buff
, _("[<unknown>: 0x%x]"), flags
);
3959 process_section_groups (FILE *file
)
3961 Elf_Internal_Shdr
*section
;
3963 struct group
*group
;
3964 Elf_Internal_Shdr
*symtab_sec
, *strtab_sec
;
3965 Elf_Internal_Sym
*symtab
;
3968 /* Don't process section groups unless needed. */
3969 if (!do_unwind
&& !do_section_groups
)
3972 if (elf_header
.e_shnum
== 0)
3974 if (do_section_groups
)
3975 printf (_("\nThere are no sections in this file.\n"));
3980 if (section_headers
== NULL
)
3982 error (_("Section headers are not available!\n"));
3986 section_headers_groups
= calloc (elf_header
.e_shnum
,
3987 sizeof (struct group
*));
3989 if (section_headers_groups
== NULL
)
3991 error (_("Out of memory\n"));
3995 /* Scan the sections for the group section. */
3997 for (i
= 0, section
= section_headers
;
3998 i
< elf_header
.e_shnum
;
4000 if (section
->sh_type
== SHT_GROUP
)
4003 if (group_count
== 0)
4005 if (do_section_groups
)
4006 printf (_("\nThere are no section groups in this file.\n"));
4011 section_groups
= calloc (group_count
, sizeof (struct group
));
4013 if (section_groups
== NULL
)
4015 error (_("Out of memory\n"));
4023 for (i
= 0, section
= section_headers
, group
= section_groups
;
4024 i
< elf_header
.e_shnum
;
4027 if (section
->sh_type
== SHT_GROUP
)
4029 char *name
= SECTION_NAME (section
);
4031 unsigned char *start
, *indices
;
4032 unsigned int entry
, j
, size
;
4033 Elf_Internal_Shdr
*sec
;
4034 Elf_Internal_Sym
*sym
;
4036 /* Get the symbol table. */
4037 sec
= SECTION_HEADER (section
->sh_link
);
4038 if (sec
->sh_type
!= SHT_SYMTAB
)
4040 error (_("Bad sh_link in group section `%s'\n"), name
);
4044 if (symtab_sec
!= sec
)
4049 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
);
4052 sym
= symtab
+ section
->sh_info
;
4054 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4056 bfd_vma sec_index
= SECTION_HEADER_INDEX (sym
->st_shndx
);
4059 error (_("Bad sh_info in group section `%s'\n"), name
);
4063 group_name
= SECTION_NAME (section_headers
+ sec_index
);
4068 /* Get the string table. */
4069 sec
= SECTION_HEADER (symtab_sec
->sh_link
);
4070 if (strtab_sec
!= sec
)
4075 strtab
= get_data (NULL
, file
, strtab_sec
->sh_offset
,
4076 strtab_sec
->sh_size
,
4079 group_name
= strtab
+ sym
->st_name
;
4082 start
= get_data (NULL
, file
, section
->sh_offset
,
4083 section
->sh_size
, _("section data"));
4086 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
4087 entry
= byte_get (indices
, 4);
4090 if (do_section_groups
)
4092 printf ("\n%s group section `%s' [%s] contains %u sections:\n",
4093 get_group_flags (entry
), name
, group_name
, size
);
4095 printf (_(" [Index] Name\n"));
4098 group
->group_index
= i
;
4100 for (j
= 0; j
< size
; j
++)
4102 struct group_list
*g
;
4104 entry
= byte_get (indices
, 4);
4107 if (section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4112 error (_("section [%5u] already in group section [%5u]\n"),
4114 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4119 /* Intel C/C++ compiler may put section 0 in a
4120 section group. We just warn it the first time
4121 and ignore it afterwards. */
4122 static int warned
= 0;
4125 error (_("section 0 in group section [%5u]\n"),
4126 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4132 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4135 if (do_section_groups
)
4137 sec
= SECTION_HEADER (entry
);
4138 printf (" [%5u] %s\n",
4139 entry
, SECTION_NAME (sec
));
4142 g
= xmalloc (sizeof (struct group_list
));
4143 g
->section_index
= entry
;
4144 g
->next
= group
->root
;
4168 } dynamic_relocations
[] =
4170 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
4171 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
4172 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
4175 /* Process the reloc section. */
4178 process_relocs (FILE *file
)
4180 unsigned long rel_size
;
4181 unsigned long rel_offset
;
4187 if (do_using_dynamic
)
4191 int has_dynamic_reloc
;
4194 has_dynamic_reloc
= 0;
4196 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
4198 is_rela
= dynamic_relocations
[i
].rela
;
4199 name
= dynamic_relocations
[i
].name
;
4200 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
4201 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
4203 has_dynamic_reloc
|= rel_size
;
4205 if (is_rela
== UNKNOWN
)
4207 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
4208 switch (dynamic_info
[DT_PLTREL
])
4222 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4223 name
, rel_offset
, rel_size
);
4225 dump_relocations (file
,
4226 offset_from_vma (file
, rel_offset
, rel_size
),
4228 dynamic_symbols
, num_dynamic_syms
,
4229 dynamic_strings
, dynamic_strings_length
, is_rela
);
4233 if (! has_dynamic_reloc
)
4234 printf (_("\nThere are no dynamic relocations in this file.\n"));
4238 Elf_Internal_Shdr
*section
;
4242 for (i
= 0, section
= section_headers
;
4243 i
< elf_header
.e_shnum
;
4246 if ( section
->sh_type
!= SHT_RELA
4247 && section
->sh_type
!= SHT_REL
)
4250 rel_offset
= section
->sh_offset
;
4251 rel_size
= section
->sh_size
;
4255 Elf_Internal_Shdr
*strsec
;
4258 printf (_("\nRelocation section "));
4260 if (string_table
== NULL
)
4261 printf ("%d", section
->sh_name
);
4263 printf (_("'%s'"), SECTION_NAME (section
));
4265 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4266 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4268 is_rela
= section
->sh_type
== SHT_RELA
;
4270 if (section
->sh_link
)
4272 Elf_Internal_Shdr
*symsec
;
4273 Elf_Internal_Sym
*symtab
;
4274 unsigned long nsyms
;
4275 unsigned long strtablen
;
4276 char *strtab
= NULL
;
4278 symsec
= SECTION_HEADER (section
->sh_link
);
4279 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4280 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4285 strsec
= SECTION_HEADER (symsec
->sh_link
);
4287 strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4288 strsec
->sh_size
, _("string table"));
4289 strtablen
= strtab
== NULL
? 0 : strsec
->sh_size
;
4291 dump_relocations (file
, rel_offset
, rel_size
,
4292 symtab
, nsyms
, strtab
, strtablen
, is_rela
);
4298 dump_relocations (file
, rel_offset
, rel_size
,
4299 NULL
, 0, NULL
, 0, is_rela
);
4306 printf (_("\nThere are no relocations in this file.\n"));
4312 /* Process the unwind section. */
4314 #include "unwind-ia64.h"
4316 /* An absolute address consists of a section and an offset. If the
4317 section is NULL, the offset itself is the address, otherwise, the
4318 address equals to LOAD_ADDRESS(section) + offset. */
4322 unsigned short section
;
4326 struct ia64_unw_aux_info
4328 struct ia64_unw_table_entry
4330 struct absaddr start
;
4332 struct absaddr info
;
4334 *table
; /* Unwind table. */
4335 unsigned long table_len
; /* Length of unwind table. */
4336 unsigned char *info
; /* Unwind info. */
4337 unsigned long info_size
; /* Size of unwind info. */
4338 bfd_vma info_addr
; /* starting address of unwind info. */
4339 bfd_vma seg_base
; /* Starting address of segment. */
4340 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4341 unsigned long nsyms
; /* Number of symbols. */
4342 char *strtab
; /* The string table. */
4343 unsigned long strtab_size
; /* Size of string table. */
4347 find_symbol_for_address (Elf_Internal_Sym
*symtab
,
4348 unsigned long nsyms
,
4350 unsigned long strtab_size
,
4351 struct absaddr addr
,
4352 const char **symname
,
4355 bfd_vma dist
= 0x100000;
4356 Elf_Internal_Sym
*sym
, *best
= NULL
;
4359 for (i
= 0, sym
= symtab
; i
< nsyms
; ++i
, ++sym
)
4361 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
4362 && sym
->st_name
!= 0
4363 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
4364 && addr
.offset
>= sym
->st_value
4365 && addr
.offset
- sym
->st_value
< dist
)
4368 dist
= addr
.offset
- sym
->st_value
;
4375 *symname
= (best
->st_name
>= strtab_size
4376 ? "<corrupt>" : strtab
+ best
->st_name
);
4381 *offset
= addr
.offset
;
4385 dump_ia64_unwind (struct ia64_unw_aux_info
*aux
)
4387 struct ia64_unw_table_entry
*tp
;
4390 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4394 const unsigned char *dp
;
4395 const unsigned char *head
;
4396 const char *procname
;
4398 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
4399 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
4401 fputs ("\n<", stdout
);
4405 fputs (procname
, stdout
);
4408 printf ("+%lx", (unsigned long) offset
);
4411 fputs (">: [", stdout
);
4412 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4413 fputc ('-', stdout
);
4414 print_vma (tp
->end
.offset
, PREFIX_HEX
);
4415 printf ("], info at +0x%lx\n",
4416 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
4418 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
4419 stamp
= BYTE_GET ((unsigned char *) head
);
4421 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4422 (unsigned) UNW_VER (stamp
),
4423 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
4424 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
4425 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
4426 (unsigned long) (eh_addr_size
* UNW_LENGTH (stamp
)));
4428 if (UNW_VER (stamp
) != 1)
4430 printf ("\tUnknown version.\n");
4435 for (dp
= head
+ 8; dp
< head
+ 8 + eh_addr_size
* UNW_LENGTH (stamp
);)
4436 dp
= unw_decode (dp
, in_body
, & in_body
);
4441 slurp_ia64_unwind_table (FILE *file
,
4442 struct ia64_unw_aux_info
*aux
,
4443 Elf_Internal_Shdr
*sec
)
4445 unsigned long size
, nrelas
, i
;
4446 Elf_Internal_Phdr
*seg
;
4447 struct ia64_unw_table_entry
*tep
;
4448 Elf_Internal_Shdr
*relsec
;
4449 Elf_Internal_Rela
*rela
, *rp
;
4450 unsigned char *table
, *tp
;
4451 Elf_Internal_Sym
*sym
;
4452 const char *relname
;
4454 /* First, find the starting address of the segment that includes
4457 if (elf_header
.e_phnum
)
4459 if (! get_program_headers (file
))
4462 for (seg
= program_headers
;
4463 seg
< program_headers
+ elf_header
.e_phnum
;
4466 if (seg
->p_type
!= PT_LOAD
)
4469 if (sec
->sh_addr
>= seg
->p_vaddr
4470 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
4472 aux
->seg_base
= seg
->p_vaddr
;
4478 /* Second, build the unwind table from the contents of the unwind section: */
4479 size
= sec
->sh_size
;
4480 table
= get_data (NULL
, file
, sec
->sh_offset
, size
, _("unwind table"));
4484 aux
->table
= xmalloc (size
/ (3 * eh_addr_size
) * sizeof (aux
->table
[0]));
4486 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * eh_addr_size
, ++tep
)
4488 tep
->start
.section
= SHN_UNDEF
;
4489 tep
->end
.section
= SHN_UNDEF
;
4490 tep
->info
.section
= SHN_UNDEF
;
4493 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
4494 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
4495 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
4499 tep
->start
.offset
= BYTE_GET ((unsigned char *) tp
+ 0);
4500 tep
->end
.offset
= BYTE_GET ((unsigned char *) tp
+ 8);
4501 tep
->info
.offset
= BYTE_GET ((unsigned char *) tp
+ 16);
4503 tep
->start
.offset
+= aux
->seg_base
;
4504 tep
->end
.offset
+= aux
->seg_base
;
4505 tep
->info
.offset
+= aux
->seg_base
;
4509 /* Third, apply any relocations to the unwind table: */
4511 for (relsec
= section_headers
;
4512 relsec
< section_headers
+ elf_header
.e_shnum
;
4515 if (relsec
->sh_type
!= SHT_RELA
4516 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4519 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
4523 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
4527 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
4528 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
4532 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
4533 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
4536 if (! strneq (relname
, "R_IA64_SEGREL", 13))
4538 warn (_("Skipping unexpected relocation type %s\n"), relname
);
4542 i
= rp
->r_offset
/ (3 * eh_addr_size
);
4544 switch (rp
->r_offset
/eh_addr_size
% 3)
4547 aux
->table
[i
].start
.section
= sym
->st_shndx
;
4548 aux
->table
[i
].start
.offset
+= rp
->r_addend
+ sym
->st_value
;
4551 aux
->table
[i
].end
.section
= sym
->st_shndx
;
4552 aux
->table
[i
].end
.offset
+= rp
->r_addend
+ sym
->st_value
;
4555 aux
->table
[i
].info
.section
= sym
->st_shndx
;
4556 aux
->table
[i
].info
.offset
+= rp
->r_addend
+ sym
->st_value
;
4566 aux
->table_len
= size
/ (3 * eh_addr_size
);
4571 ia64_process_unwind (FILE *file
)
4573 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
4574 unsigned long i
, unwcount
= 0, unwstart
= 0;
4575 struct ia64_unw_aux_info aux
;
4577 memset (& aux
, 0, sizeof (aux
));
4579 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
4581 if (sec
->sh_type
== SHT_SYMTAB
)
4583 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
4584 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
4586 strsec
= SECTION_HEADER (sec
->sh_link
);
4587 aux
.strtab_size
= strsec
->sh_size
;
4588 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4589 aux
.strtab_size
, _("string table"));
4591 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4596 printf (_("\nThere are no unwind sections in this file.\n"));
4598 while (unwcount
-- > 0)
4603 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
4604 i
< elf_header
.e_shnum
; ++i
, ++sec
)
4605 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4612 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
4614 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
4616 /* We need to find which section group it is in. */
4617 struct group_list
*g
= section_headers_groups
[i
]->root
;
4619 for (; g
!= NULL
; g
= g
->next
)
4621 sec
= SECTION_HEADER (g
->section_index
);
4623 if (streq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
))
4628 i
= elf_header
.e_shnum
;
4630 else if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
, len
))
4632 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
4633 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
4634 suffix
= SECTION_NAME (unwsec
) + len
;
4635 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4637 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info_once
, len2
)
4638 && streq (SECTION_NAME (sec
) + len2
, suffix
))
4643 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4644 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
4645 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
4646 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
4648 if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
, len
))
4649 suffix
= SECTION_NAME (unwsec
) + len
;
4650 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4652 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
, len2
)
4653 && streq (SECTION_NAME (sec
) + len2
, suffix
))
4657 if (i
== elf_header
.e_shnum
)
4659 printf (_("\nCould not find unwind info section for "));
4661 if (string_table
== NULL
)
4662 printf ("%d", unwsec
->sh_name
);
4664 printf (_("'%s'"), SECTION_NAME (unwsec
));
4668 aux
.info_size
= sec
->sh_size
;
4669 aux
.info_addr
= sec
->sh_addr
;
4670 aux
.info
= get_data (NULL
, file
, sec
->sh_offset
, aux
.info_size
,
4673 printf (_("\nUnwind section "));
4675 if (string_table
== NULL
)
4676 printf ("%d", unwsec
->sh_name
);
4678 printf (_("'%s'"), SECTION_NAME (unwsec
));
4680 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4681 (unsigned long) unwsec
->sh_offset
,
4682 (unsigned long) (unwsec
->sh_size
/ (3 * eh_addr_size
)));
4684 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
4686 if (aux
.table_len
> 0)
4687 dump_ia64_unwind (& aux
);
4690 free ((char *) aux
.table
);
4692 free ((char *) aux
.info
);
4701 free ((char *) aux
.strtab
);
4706 struct hppa_unw_aux_info
4708 struct hppa_unw_table_entry
4710 struct absaddr start
;
4712 unsigned int Cannot_unwind
:1; /* 0 */
4713 unsigned int Millicode
:1; /* 1 */
4714 unsigned int Millicode_save_sr0
:1; /* 2 */
4715 unsigned int Region_description
:2; /* 3..4 */
4716 unsigned int reserved1
:1; /* 5 */
4717 unsigned int Entry_SR
:1; /* 6 */
4718 unsigned int Entry_FR
:4; /* number saved */ /* 7..10 */
4719 unsigned int Entry_GR
:5; /* number saved */ /* 11..15 */
4720 unsigned int Args_stored
:1; /* 16 */
4721 unsigned int Variable_Frame
:1; /* 17 */
4722 unsigned int Separate_Package_Body
:1; /* 18 */
4723 unsigned int Frame_Extension_Millicode
:1; /* 19 */
4724 unsigned int Stack_Overflow_Check
:1; /* 20 */
4725 unsigned int Two_Instruction_SP_Increment
:1; /* 21 */
4726 unsigned int Ada_Region
:1; /* 22 */
4727 unsigned int cxx_info
:1; /* 23 */
4728 unsigned int cxx_try_catch
:1; /* 24 */
4729 unsigned int sched_entry_seq
:1; /* 25 */
4730 unsigned int reserved2
:1; /* 26 */
4731 unsigned int Save_SP
:1; /* 27 */
4732 unsigned int Save_RP
:1; /* 28 */
4733 unsigned int Save_MRP_in_frame
:1; /* 29 */
4734 unsigned int extn_ptr_defined
:1; /* 30 */
4735 unsigned int Cleanup_defined
:1; /* 31 */
4737 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
4738 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
4739 unsigned int Large_frame
:1; /* 2 */
4740 unsigned int Pseudo_SP_Set
:1; /* 3 */
4741 unsigned int reserved4
:1; /* 4 */
4742 unsigned int Total_frame_size
:27; /* 5..31 */
4744 *table
; /* Unwind table. */
4745 unsigned long table_len
; /* Length of unwind table. */
4746 bfd_vma seg_base
; /* Starting address of segment. */
4747 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4748 unsigned long nsyms
; /* Number of symbols. */
4749 char *strtab
; /* The string table. */
4750 unsigned long strtab_size
; /* Size of string table. */
4754 dump_hppa_unwind (struct hppa_unw_aux_info
*aux
)
4756 struct hppa_unw_table_entry
*tp
;
4758 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4761 const char *procname
;
4763 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
4764 aux
->strtab_size
, tp
->start
, &procname
,
4767 fputs ("\n<", stdout
);
4771 fputs (procname
, stdout
);
4774 printf ("+%lx", (unsigned long) offset
);
4777 fputs (">: [", stdout
);
4778 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4779 fputc ('-', stdout
);
4780 print_vma (tp
->end
.offset
, PREFIX_HEX
);
4783 #define PF(_m) if (tp->_m) printf (#_m " ");
4784 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
4787 PF(Millicode_save_sr0
);
4788 /* PV(Region_description); */
4794 PF(Separate_Package_Body
);
4795 PF(Frame_Extension_Millicode
);
4796 PF(Stack_Overflow_Check
);
4797 PF(Two_Instruction_SP_Increment
);
4801 PF(sched_entry_seq
);
4804 PF(Save_MRP_in_frame
);
4805 PF(extn_ptr_defined
);
4806 PF(Cleanup_defined
);
4807 PF(MPE_XL_interrupt_marker
);
4808 PF(HP_UX_interrupt_marker
);
4811 PV(Total_frame_size
);
4820 slurp_hppa_unwind_table (FILE *file
,
4821 struct hppa_unw_aux_info
*aux
,
4822 Elf_Internal_Shdr
*sec
)
4824 unsigned long size
, unw_ent_size
, nrelas
, i
;
4825 Elf_Internal_Phdr
*seg
;
4826 struct hppa_unw_table_entry
*tep
;
4827 Elf_Internal_Shdr
*relsec
;
4828 Elf_Internal_Rela
*rela
, *rp
;
4829 unsigned char *table
, *tp
;
4830 Elf_Internal_Sym
*sym
;
4831 const char *relname
;
4833 /* First, find the starting address of the segment that includes
4836 if (elf_header
.e_phnum
)
4838 if (! get_program_headers (file
))
4841 for (seg
= program_headers
;
4842 seg
< program_headers
+ elf_header
.e_phnum
;
4845 if (seg
->p_type
!= PT_LOAD
)
4848 if (sec
->sh_addr
>= seg
->p_vaddr
4849 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
4851 aux
->seg_base
= seg
->p_vaddr
;
4857 /* Second, build the unwind table from the contents of the unwind
4859 size
= sec
->sh_size
;
4860 table
= get_data (NULL
, file
, sec
->sh_offset
, size
, _("unwind table"));
4864 unw_ent_size
= 2 * eh_addr_size
+ 8;
4866 tep
= aux
->table
= xmalloc (size
/ unw_ent_size
* sizeof (aux
->table
[0]));
4868 for (tp
= table
; tp
< table
+ size
; tp
+= (2 * eh_addr_size
+ 8), ++tep
)
4870 unsigned int tmp1
, tmp2
;
4872 tep
->start
.section
= SHN_UNDEF
;
4873 tep
->end
.section
= SHN_UNDEF
;
4877 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
4878 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
4879 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
4880 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
4884 tep
->start
.offset
= BYTE_GET ((unsigned char *) tp
+ 0);
4885 tep
->end
.offset
= BYTE_GET ((unsigned char *) tp
+ 8);
4886 tmp1
= byte_get ((unsigned char *) tp
+ 16, 4);
4887 tmp2
= byte_get ((unsigned char *) tp
+ 20, 4);
4890 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
4891 tep
->Millicode
= (tmp1
>> 30) & 0x1;
4892 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
4893 tep
->Region_description
= (tmp1
>> 27) & 0x3;
4894 tep
->reserved1
= (tmp1
>> 26) & 0x1;
4895 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
4896 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
4897 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
4898 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
4899 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
4900 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
4901 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
4902 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
4903 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
4904 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
4905 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
4906 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
4907 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
4908 tep
->reserved2
= (tmp1
>> 5) & 0x1;
4909 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
4910 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
4911 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
4912 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
4913 tep
->Cleanup_defined
= tmp1
& 0x1;
4915 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
4916 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
4917 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
4918 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
4919 tep
->reserved4
= (tmp2
>> 27) & 0x1;
4920 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
4922 tep
->start
.offset
+= aux
->seg_base
;
4923 tep
->end
.offset
+= aux
->seg_base
;
4927 /* Third, apply any relocations to the unwind table. */
4929 for (relsec
= section_headers
;
4930 relsec
< section_headers
+ elf_header
.e_shnum
;
4933 if (relsec
->sh_type
!= SHT_RELA
4934 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4937 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
4941 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
4945 relname
= elf_hppa_reloc_type (ELF32_R_TYPE (rp
->r_info
));
4946 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
4950 relname
= elf_hppa_reloc_type (ELF64_R_TYPE (rp
->r_info
));
4951 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
4954 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
4955 if (strncmp (relname
, "R_PARISC_SEGREL", 15) != 0)
4957 warn (_("Skipping unexpected relocation type %s\n"), relname
);
4961 i
= rp
->r_offset
/ unw_ent_size
;
4963 switch ((rp
->r_offset
% unw_ent_size
) / eh_addr_size
)
4966 aux
->table
[i
].start
.section
= sym
->st_shndx
;
4967 aux
->table
[i
].start
.offset
+= sym
->st_value
+ rp
->r_addend
;
4970 aux
->table
[i
].end
.section
= sym
->st_shndx
;
4971 aux
->table
[i
].end
.offset
+= sym
->st_value
+ rp
->r_addend
;
4981 aux
->table_len
= size
/ unw_ent_size
;
4987 hppa_process_unwind (FILE *file
)
4989 struct hppa_unw_aux_info aux
;
4990 Elf_Internal_Shdr
*unwsec
= NULL
;
4991 Elf_Internal_Shdr
*strsec
;
4992 Elf_Internal_Shdr
*sec
;
4995 memset (& aux
, 0, sizeof (aux
));
4997 assert (string_table
!= NULL
);
4999 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5001 if (sec
->sh_type
== SHT_SYMTAB
)
5003 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5004 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5006 strsec
= SECTION_HEADER (sec
->sh_link
);
5007 aux
.strtab_size
= strsec
->sh_size
;
5008 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
5009 aux
.strtab_size
, _("string table"));
5011 else if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5016 printf (_("\nThere are no unwind sections in this file.\n"));
5018 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5020 if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5022 printf (_("\nUnwind section "));
5023 printf (_("'%s'"), SECTION_NAME (sec
));
5025 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5026 (unsigned long) sec
->sh_offset
,
5027 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
+ 8)));
5029 slurp_hppa_unwind_table (file
, &aux
, sec
);
5030 if (aux
.table_len
> 0)
5031 dump_hppa_unwind (&aux
);
5034 free ((char *) aux
.table
);
5042 free ((char *) aux
.strtab
);
5048 process_unwind (FILE *file
)
5050 struct unwind_handler
{
5052 int (*handler
)(FILE *file
);
5054 { EM_IA_64
, ia64_process_unwind
},
5055 { EM_PARISC
, hppa_process_unwind
},
5063 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
5064 if (elf_header
.e_machine
== handlers
[i
].machtype
)
5065 return handlers
[i
].handler (file
);
5067 printf (_("\nThere are no unwind sections in this file.\n"));
5072 dynamic_section_mips_val (Elf_Internal_Dyn
*entry
)
5074 switch (entry
->d_tag
)
5077 if (entry
->d_un
.d_val
== 0)
5081 static const char * opts
[] =
5083 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5084 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5085 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5086 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5091 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++cnt
)
5092 if (entry
->d_un
.d_val
& (1 << cnt
))
5094 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
5101 case DT_MIPS_IVERSION
:
5102 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5103 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5105 printf ("<corrupt: %ld>\n", (long) entry
->d_un
.d_ptr
);
5108 case DT_MIPS_TIME_STAMP
:
5113 time_t time
= entry
->d_un
.d_val
;
5114 tmp
= gmtime (&time
);
5115 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
5116 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5117 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5118 printf ("Time Stamp: %s\n", timebuf
);
5122 case DT_MIPS_RLD_VERSION
:
5123 case DT_MIPS_LOCAL_GOTNO
:
5124 case DT_MIPS_CONFLICTNO
:
5125 case DT_MIPS_LIBLISTNO
:
5126 case DT_MIPS_SYMTABNO
:
5127 case DT_MIPS_UNREFEXTNO
:
5128 case DT_MIPS_HIPAGENO
:
5129 case DT_MIPS_DELTA_CLASS_NO
:
5130 case DT_MIPS_DELTA_INSTANCE_NO
:
5131 case DT_MIPS_DELTA_RELOC_NO
:
5132 case DT_MIPS_DELTA_SYM_NO
:
5133 case DT_MIPS_DELTA_CLASSSYM_NO
:
5134 case DT_MIPS_COMPACT_SIZE
:
5135 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
5139 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
5145 dynamic_section_parisc_val (Elf_Internal_Dyn
*entry
)
5147 switch (entry
->d_tag
)
5149 case DT_HP_DLD_FLAGS
:
5158 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
5159 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
5160 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
5161 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
5162 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
5163 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
5164 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
5165 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
5166 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
5167 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
5168 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
5172 bfd_vma val
= entry
->d_un
.d_val
;
5174 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
5175 if (val
& flags
[cnt
].bit
)
5179 fputs (flags
[cnt
].str
, stdout
);
5181 val
^= flags
[cnt
].bit
;
5184 if (val
!= 0 || first
)
5188 print_vma (val
, HEX
);
5194 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5201 dynamic_section_ia64_val (Elf_Internal_Dyn
*entry
)
5203 switch (entry
->d_tag
)
5205 case DT_IA_64_PLT_RESERVE
:
5206 /* First 3 slots reserved. */
5207 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5209 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
5213 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5220 get_32bit_dynamic_section (FILE *file
)
5222 Elf32_External_Dyn
*edyn
, *ext
;
5223 Elf_Internal_Dyn
*entry
;
5225 edyn
= get_data (NULL
, file
, dynamic_addr
, dynamic_size
,
5226 _("dynamic section"));
5230 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5231 might not have the luxury of section headers. Look for the DT_NULL
5232 terminator to determine the number of entries. */
5233 for (ext
= edyn
, dynamic_nent
= 0;
5234 (char *) ext
< (char *) edyn
+ dynamic_size
;
5238 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5242 dynamic_section
= malloc (dynamic_nent
* sizeof (*entry
));
5243 if (dynamic_section
== NULL
)
5245 error (_("Out of memory\n"));
5250 for (ext
= edyn
, entry
= dynamic_section
;
5251 entry
< dynamic_section
+ dynamic_nent
;
5254 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5255 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5264 get_64bit_dynamic_section (FILE *file
)
5266 Elf64_External_Dyn
*edyn
, *ext
;
5267 Elf_Internal_Dyn
*entry
;
5269 edyn
= get_data (NULL
, file
, dynamic_addr
, dynamic_size
,
5270 _("dynamic section"));
5274 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5275 might not have the luxury of section headers. Look for the DT_NULL
5276 terminator to determine the number of entries. */
5277 for (ext
= edyn
, dynamic_nent
= 0;
5278 (char *) ext
< (char *) edyn
+ dynamic_size
;
5282 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5286 dynamic_section
= malloc (dynamic_nent
* sizeof (*entry
));
5287 if (dynamic_section
== NULL
)
5289 error (_("Out of memory\n"));
5294 for (ext
= edyn
, entry
= dynamic_section
;
5295 entry
< dynamic_section
+ dynamic_nent
;
5298 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5299 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5308 get_dynamic_flags (bfd_vma flags
)
5310 static char buff
[128];
5318 flag
= flags
& - flags
;
5326 case DF_ORIGIN
: strcpy (p
, "ORIGIN"); break;
5327 case DF_SYMBOLIC
: strcpy (p
, "SYMBOLIC"); break;
5328 case DF_TEXTREL
: strcpy (p
, "TEXTREL"); break;
5329 case DF_BIND_NOW
: strcpy (p
, "BIND_NOW"); break;
5330 case DF_STATIC_TLS
: strcpy (p
, "STATIC_TLS"); break;
5331 default: strcpy (p
, "unknown"); break;
5334 p
= strchr (p
, '\0');
5339 /* Parse and display the contents of the dynamic section. */
5342 process_dynamic_section (FILE *file
)
5344 Elf_Internal_Dyn
*entry
;
5346 if (dynamic_size
== 0)
5349 printf (_("\nThere is no dynamic section in this file.\n"));
5356 if (! get_32bit_dynamic_section (file
))
5359 else if (! get_64bit_dynamic_section (file
))
5362 /* Find the appropriate symbol table. */
5363 if (dynamic_symbols
== NULL
)
5365 for (entry
= dynamic_section
;
5366 entry
< dynamic_section
+ dynamic_nent
;
5369 Elf_Internal_Shdr section
;
5371 if (entry
->d_tag
!= DT_SYMTAB
)
5374 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
5376 /* Since we do not know how big the symbol table is,
5377 we default to reading in the entire file (!) and
5378 processing that. This is overkill, I know, but it
5380 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5382 if (archive_file_offset
!= 0)
5383 section
.sh_size
= archive_file_size
- section
.sh_offset
;
5386 if (fseek (file
, 0, SEEK_END
))
5387 error (_("Unable to seek to end of file!"));
5389 section
.sh_size
= ftell (file
) - section
.sh_offset
;
5393 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
5395 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
5397 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
5398 if (num_dynamic_syms
< 1)
5400 error (_("Unable to determine the number of symbols to load\n"));
5404 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
5408 /* Similarly find a string table. */
5409 if (dynamic_strings
== NULL
)
5411 for (entry
= dynamic_section
;
5412 entry
< dynamic_section
+ dynamic_nent
;
5415 unsigned long offset
;
5418 if (entry
->d_tag
!= DT_STRTAB
)
5421 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
5423 /* Since we do not know how big the string table is,
5424 we default to reading in the entire file (!) and
5425 processing that. This is overkill, I know, but it
5428 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5430 if (archive_file_offset
!= 0)
5431 str_tab_len
= archive_file_size
- offset
;
5434 if (fseek (file
, 0, SEEK_END
))
5435 error (_("Unable to seek to end of file\n"));
5436 str_tab_len
= ftell (file
) - offset
;
5439 if (str_tab_len
< 1)
5442 (_("Unable to determine the length of the dynamic string table\n"));
5446 dynamic_strings
= get_data (NULL
, file
, offset
, str_tab_len
,
5447 _("dynamic string table"));
5448 dynamic_strings_length
= str_tab_len
;
5453 /* And find the syminfo section if available. */
5454 if (dynamic_syminfo
== NULL
)
5456 unsigned long syminsz
= 0;
5458 for (entry
= dynamic_section
;
5459 entry
< dynamic_section
+ dynamic_nent
;
5462 if (entry
->d_tag
== DT_SYMINENT
)
5464 /* Note: these braces are necessary to avoid a syntax
5465 error from the SunOS4 C compiler. */
5466 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
5468 else if (entry
->d_tag
== DT_SYMINSZ
)
5469 syminsz
= entry
->d_un
.d_val
;
5470 else if (entry
->d_tag
== DT_SYMINFO
)
5471 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
5475 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
5477 Elf_External_Syminfo
*extsyminfo
, *extsym
;
5478 Elf_Internal_Syminfo
*syminfo
;
5480 /* There is a syminfo section. Read the data. */
5481 extsyminfo
= get_data (NULL
, file
, dynamic_syminfo_offset
, syminsz
,
5482 _("symbol information"));
5486 dynamic_syminfo
= malloc (syminsz
);
5487 if (dynamic_syminfo
== NULL
)
5489 error (_("Out of memory\n"));
5493 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
5494 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
5495 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
5496 ++syminfo
, ++extsym
)
5498 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
5499 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
5506 if (do_dynamic
&& dynamic_addr
)
5507 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
5508 dynamic_addr
, dynamic_nent
);
5510 printf (_(" Tag Type Name/Value\n"));
5512 for (entry
= dynamic_section
;
5513 entry
< dynamic_section
+ dynamic_nent
;
5521 print_vma (entry
->d_tag
, FULL_HEX
);
5522 dtype
= get_dynamic_type (entry
->d_tag
);
5523 printf (" (%s)%*s", dtype
,
5524 ((is_32bit_elf
? 27 : 19)
5525 - (int) strlen (dtype
)),
5529 switch (entry
->d_tag
)
5533 puts (get_dynamic_flags (entry
->d_un
.d_val
));
5543 switch (entry
->d_tag
)
5546 printf (_("Auxiliary library"));
5550 printf (_("Filter library"));
5554 printf (_("Configuration file"));
5558 printf (_("Dependency audit library"));
5562 printf (_("Audit library"));
5566 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5567 printf (": [%s]\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5571 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5580 printf (_("Flags:"));
5582 if (entry
->d_un
.d_val
== 0)
5583 printf (_(" None\n"));
5586 unsigned long int val
= entry
->d_un
.d_val
;
5588 if (val
& DTF_1_PARINIT
)
5590 printf (" PARINIT");
5591 val
^= DTF_1_PARINIT
;
5593 if (val
& DTF_1_CONFEXP
)
5595 printf (" CONFEXP");
5596 val
^= DTF_1_CONFEXP
;
5599 printf (" %lx", val
);
5608 printf (_("Flags:"));
5610 if (entry
->d_un
.d_val
== 0)
5611 printf (_(" None\n"));
5614 unsigned long int val
= entry
->d_un
.d_val
;
5616 if (val
& DF_P1_LAZYLOAD
)
5618 printf (" LAZYLOAD");
5619 val
^= DF_P1_LAZYLOAD
;
5621 if (val
& DF_P1_GROUPPERM
)
5623 printf (" GROUPPERM");
5624 val
^= DF_P1_GROUPPERM
;
5627 printf (" %lx", val
);
5636 printf (_("Flags:"));
5637 if (entry
->d_un
.d_val
== 0)
5638 printf (_(" None\n"));
5641 unsigned long int val
= entry
->d_un
.d_val
;
5648 if (val
& DF_1_GLOBAL
)
5653 if (val
& DF_1_GROUP
)
5658 if (val
& DF_1_NODELETE
)
5660 printf (" NODELETE");
5661 val
^= DF_1_NODELETE
;
5663 if (val
& DF_1_LOADFLTR
)
5665 printf (" LOADFLTR");
5666 val
^= DF_1_LOADFLTR
;
5668 if (val
& DF_1_INITFIRST
)
5670 printf (" INITFIRST");
5671 val
^= DF_1_INITFIRST
;
5673 if (val
& DF_1_NOOPEN
)
5678 if (val
& DF_1_ORIGIN
)
5683 if (val
& DF_1_DIRECT
)
5688 if (val
& DF_1_TRANS
)
5693 if (val
& DF_1_INTERPOSE
)
5695 printf (" INTERPOSE");
5696 val
^= DF_1_INTERPOSE
;
5698 if (val
& DF_1_NODEFLIB
)
5700 printf (" NODEFLIB");
5701 val
^= DF_1_NODEFLIB
;
5703 if (val
& DF_1_NODUMP
)
5708 if (val
& DF_1_CONLFAT
)
5710 printf (" CONLFAT");
5711 val
^= DF_1_CONLFAT
;
5714 printf (" %lx", val
);
5721 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5723 puts (get_dynamic_type (entry
->d_un
.d_val
));
5743 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5749 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5750 name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
5756 switch (entry
->d_tag
)
5759 printf (_("Shared library: [%s]"), name
);
5761 if (streq (name
, program_interpreter
))
5762 printf (_(" program interpreter"));
5766 printf (_("Library soname: [%s]"), name
);
5770 printf (_("Library rpath: [%s]"), name
);
5774 printf (_("Library runpath: [%s]"), name
);
5778 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5783 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5796 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5800 case DT_INIT_ARRAYSZ
:
5801 case DT_FINI_ARRAYSZ
:
5802 case DT_GNU_CONFLICTSZ
:
5803 case DT_GNU_LIBLISTSZ
:
5806 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
5807 printf (" (bytes)\n");
5817 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
5830 if (entry
->d_tag
== DT_USED
5831 && VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5833 char *name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
5837 printf (_("Not needed object: [%s]\n"), name
);
5842 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5848 /* The value of this entry is ignored. */
5853 case DT_GNU_PRELINKED
:
5857 time_t time
= entry
->d_un
.d_val
;
5859 tmp
= gmtime (&time
);
5860 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
5861 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5862 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5868 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
5869 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
5874 switch (elf_header
.e_machine
)
5877 case EM_MIPS_RS3_LE
:
5878 dynamic_section_mips_val (entry
);
5881 dynamic_section_parisc_val (entry
);
5884 dynamic_section_ia64_val (entry
);
5887 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5899 get_ver_flags (unsigned int flags
)
5901 static char buff
[32];
5908 if (flags
& VER_FLG_BASE
)
5909 strcat (buff
, "BASE ");
5911 if (flags
& VER_FLG_WEAK
)
5913 if (flags
& VER_FLG_BASE
)
5914 strcat (buff
, "| ");
5916 strcat (buff
, "WEAK ");
5919 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
5920 strcat (buff
, "| <unknown>");
5925 /* Display the contents of the version sections. */
5927 process_version_sections (FILE *file
)
5929 Elf_Internal_Shdr
*section
;
5936 for (i
= 0, section
= section_headers
;
5937 i
< elf_header
.e_shnum
;
5940 switch (section
->sh_type
)
5942 case SHT_GNU_verdef
:
5944 Elf_External_Verdef
*edefs
;
5951 (_("\nVersion definition section '%s' contains %ld entries:\n"),
5952 SECTION_NAME (section
), section
->sh_info
);
5954 printf (_(" Addr: 0x"));
5955 printf_vma (section
->sh_addr
);
5956 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5957 (unsigned long) section
->sh_offset
, section
->sh_link
,
5958 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5960 edefs
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
5961 _("version definition section"));
5965 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5968 Elf_External_Verdef
*edef
;
5969 Elf_Internal_Verdef ent
;
5970 Elf_External_Verdaux
*eaux
;
5971 Elf_Internal_Verdaux aux
;
5975 vstart
= ((char *) edefs
) + idx
;
5977 edef
= (Elf_External_Verdef
*) vstart
;
5979 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
5980 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
5981 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
5982 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
5983 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
5984 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
5985 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
5987 printf (_(" %#06x: Rev: %d Flags: %s"),
5988 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
5990 printf (_(" Index: %d Cnt: %d "),
5991 ent
.vd_ndx
, ent
.vd_cnt
);
5993 vstart
+= ent
.vd_aux
;
5995 eaux
= (Elf_External_Verdaux
*) vstart
;
5997 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5998 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6000 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6001 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux
.vda_name
));
6003 printf (_("Name index: %ld\n"), aux
.vda_name
);
6005 isum
= idx
+ ent
.vd_aux
;
6007 for (j
= 1; j
< ent
.vd_cnt
; j
++)
6009 isum
+= aux
.vda_next
;
6010 vstart
+= aux
.vda_next
;
6012 eaux
= (Elf_External_Verdaux
*) vstart
;
6014 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6015 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6017 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6018 printf (_(" %#06x: Parent %d: %s\n"),
6019 isum
, j
, GET_DYNAMIC_NAME (aux
.vda_name
));
6021 printf (_(" %#06x: Parent %d, name index: %ld\n"),
6022 isum
, j
, aux
.vda_name
);
6032 case SHT_GNU_verneed
:
6034 Elf_External_Verneed
*eneed
;
6040 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
6041 SECTION_NAME (section
), section
->sh_info
);
6043 printf (_(" Addr: 0x"));
6044 printf_vma (section
->sh_addr
);
6045 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
6046 (unsigned long) section
->sh_offset
, section
->sh_link
,
6047 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
6049 eneed
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
6050 _("version need section"));
6054 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6056 Elf_External_Verneed
*entry
;
6057 Elf_Internal_Verneed ent
;
6062 vstart
= ((char *) eneed
) + idx
;
6064 entry
= (Elf_External_Verneed
*) vstart
;
6066 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
6067 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
6068 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
6069 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
6070 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
6072 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
6074 if (VALID_DYNAMIC_NAME (ent
.vn_file
))
6075 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent
.vn_file
));
6077 printf (_(" File: %lx"), ent
.vn_file
);
6079 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
6081 vstart
+= ent
.vn_aux
;
6083 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
6085 Elf_External_Vernaux
*eaux
;
6086 Elf_Internal_Vernaux aux
;
6088 eaux
= (Elf_External_Vernaux
*) vstart
;
6090 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
6091 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
6092 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
6093 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
6094 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
6096 if (VALID_DYNAMIC_NAME (aux
.vna_name
))
6097 printf (_(" %#06x: Name: %s"),
6098 isum
, GET_DYNAMIC_NAME (aux
.vna_name
));
6100 printf (_(" %#06x: Name index: %lx"),
6101 isum
, aux
.vna_name
);
6103 printf (_(" Flags: %s Version: %d\n"),
6104 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
6106 isum
+= aux
.vna_next
;
6107 vstart
+= aux
.vna_next
;
6117 case SHT_GNU_versym
:
6119 Elf_Internal_Shdr
*link_section
;
6122 unsigned char *edata
;
6123 unsigned short *data
;
6125 Elf_Internal_Sym
*symbols
;
6126 Elf_Internal_Shdr
*string_sec
;
6129 link_section
= SECTION_HEADER (section
->sh_link
);
6130 total
= section
->sh_size
/ section
->sh_entsize
;
6134 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
6136 string_sec
= SECTION_HEADER (link_section
->sh_link
);
6138 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
6139 string_sec
->sh_size
, _("version string table"));
6143 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6144 SECTION_NAME (section
), total
);
6146 printf (_(" Addr: "));
6147 printf_vma (section
->sh_addr
);
6148 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6149 (unsigned long) section
->sh_offset
, section
->sh_link
,
6150 SECTION_NAME (link_section
));
6152 off
= offset_from_vma (file
,
6153 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6154 total
* sizeof (short));
6155 edata
= get_data (NULL
, file
, off
, total
* sizeof (short),
6156 _("version symbol data"));
6163 data
= malloc (total
* sizeof (short));
6165 for (cnt
= total
; cnt
--;)
6166 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
6171 for (cnt
= 0; cnt
< total
; cnt
+= 4)
6174 int check_def
, check_need
;
6177 printf (" %03x:", cnt
);
6179 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
6180 switch (data
[cnt
+ j
])
6183 fputs (_(" 0 (*local*) "), stdout
);
6187 fputs (_(" 1 (*global*) "), stdout
);
6191 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
6192 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
6196 if (SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
6199 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
6206 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
6208 Elf_Internal_Verneed ivn
;
6209 unsigned long offset
;
6211 offset
= offset_from_vma
6212 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6213 sizeof (Elf_External_Verneed
));
6217 Elf_Internal_Vernaux ivna
;
6218 Elf_External_Verneed evn
;
6219 Elf_External_Vernaux evna
;
6220 unsigned long a_off
;
6222 get_data (&evn
, file
, offset
, sizeof (evn
),
6225 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6226 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6228 a_off
= offset
+ ivn
.vn_aux
;
6232 get_data (&evna
, file
, a_off
, sizeof (evna
),
6233 _("version need aux (2)"));
6235 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6236 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6238 a_off
+= ivna
.vna_next
;
6240 while (ivna
.vna_other
!= data
[cnt
+ j
]
6241 && ivna
.vna_next
!= 0);
6243 if (ivna
.vna_other
== data
[cnt
+ j
])
6245 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6247 name
= strtab
+ ivna
.vna_name
;
6248 nn
+= printf ("(%s%-*s",
6250 12 - (int) strlen (name
),
6256 offset
+= ivn
.vn_next
;
6258 while (ivn
.vn_next
);
6261 if (check_def
&& data
[cnt
+ j
] != 0x8001
6262 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6264 Elf_Internal_Verdef ivd
;
6265 Elf_External_Verdef evd
;
6266 unsigned long offset
;
6268 offset
= offset_from_vma
6269 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6274 get_data (&evd
, file
, offset
, sizeof (evd
),
6277 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6278 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6280 offset
+= ivd
.vd_next
;
6282 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
6283 && ivd
.vd_next
!= 0);
6285 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
6287 Elf_External_Verdaux evda
;
6288 Elf_Internal_Verdaux ivda
;
6290 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6292 get_data (&evda
, file
,
6293 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
6294 sizeof (evda
), _("version def aux"));
6296 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6298 name
= strtab
+ ivda
.vda_name
;
6299 nn
+= printf ("(%s%-*s",
6301 12 - (int) strlen (name
),
6307 printf ("%*c", 18 - nn
, ' ');
6325 printf (_("\nNo version information found in this file.\n"));
6331 get_symbol_binding (unsigned int binding
)
6333 static char buff
[32];
6337 case STB_LOCAL
: return "LOCAL";
6338 case STB_GLOBAL
: return "GLOBAL";
6339 case STB_WEAK
: return "WEAK";
6341 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
6342 sprintf (buff
, _("<processor specific>: %d"), binding
);
6343 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
6344 sprintf (buff
, _("<OS specific>: %d"), binding
);
6346 sprintf (buff
, _("<unknown>: %d"), binding
);
6352 get_symbol_type (unsigned int type
)
6354 static char buff
[32];
6358 case STT_NOTYPE
: return "NOTYPE";
6359 case STT_OBJECT
: return "OBJECT";
6360 case STT_FUNC
: return "FUNC";
6361 case STT_SECTION
: return "SECTION";
6362 case STT_FILE
: return "FILE";
6363 case STT_COMMON
: return "COMMON";
6364 case STT_TLS
: return "TLS";
6366 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
6368 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
6369 return "THUMB_FUNC";
6371 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
6374 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
6375 return "PARISC_MILLI";
6377 sprintf (buff
, _("<processor specific>: %d"), type
);
6379 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
6381 if (elf_header
.e_machine
== EM_PARISC
)
6383 if (type
== STT_HP_OPAQUE
)
6385 if (type
== STT_HP_STUB
)
6389 sprintf (buff
, _("<OS specific>: %d"), type
);
6392 sprintf (buff
, _("<unknown>: %d"), type
);
6398 get_symbol_visibility (unsigned int visibility
)
6402 case STV_DEFAULT
: return "DEFAULT";
6403 case STV_INTERNAL
: return "INTERNAL";
6404 case STV_HIDDEN
: return "HIDDEN";
6405 case STV_PROTECTED
: return "PROTECTED";
6411 get_symbol_index_type (unsigned int type
)
6413 static char buff
[32];
6417 case SHN_UNDEF
: return "UND";
6418 case SHN_ABS
: return "ABS";
6419 case SHN_COMMON
: return "COM";
6421 if (type
== SHN_IA_64_ANSI_COMMON
6422 && elf_header
.e_machine
== EM_IA_64
6423 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
6425 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
6426 sprintf (buff
, "PRC[0x%04x]", type
);
6427 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
6428 sprintf (buff
, "OS [0x%04x]", type
);
6429 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
6430 sprintf (buff
, "RSV[0x%04x]", type
);
6432 sprintf (buff
, "%3d", type
);
6440 get_dynamic_data (FILE *file
, unsigned int number
, unsigned int ent_size
)
6442 unsigned char *e_data
;
6445 e_data
= malloc (number
* ent_size
);
6449 error (_("Out of memory\n"));
6453 if (fread (e_data
, ent_size
, number
, file
) != number
)
6455 error (_("Unable to read in dynamic data\n"));
6459 i_data
= malloc (number
* sizeof (*i_data
));
6463 error (_("Out of memory\n"));
6469 i_data
[number
] = byte_get (e_data
+ number
* ent_size
, ent_size
);
6476 /* Dump the symbol table. */
6478 process_symbol_table (FILE *file
)
6480 Elf_Internal_Shdr
*section
;
6481 bfd_vma nbuckets
= 0;
6482 bfd_vma nchains
= 0;
6483 bfd_vma
*buckets
= NULL
;
6484 bfd_vma
*chains
= NULL
;
6486 if (! do_syms
&& !do_histogram
)
6489 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
6492 unsigned char nb
[8];
6493 unsigned char nc
[8];
6494 int hash_ent_size
= 4;
6496 if ((elf_header
.e_machine
== EM_ALPHA
6497 || elf_header
.e_machine
== EM_S390
6498 || elf_header
.e_machine
== EM_S390_OLD
)
6499 && elf_header
.e_ident
[EI_CLASS
] == ELFCLASS64
)
6503 (archive_file_offset
6504 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
6505 sizeof nb
+ sizeof nc
)),
6508 error (_("Unable to seek to start of dynamic information"));
6512 if (fread (nb
, hash_ent_size
, 1, file
) != 1)
6514 error (_("Failed to read in number of buckets\n"));
6518 if (fread (nc
, hash_ent_size
, 1, file
) != 1)
6520 error (_("Failed to read in number of chains\n"));
6524 nbuckets
= byte_get (nb
, hash_ent_size
);
6525 nchains
= byte_get (nc
, hash_ent_size
);
6527 buckets
= get_dynamic_data (file
, nbuckets
, hash_ent_size
);
6528 chains
= get_dynamic_data (file
, nchains
, hash_ent_size
);
6530 if (buckets
== NULL
|| chains
== NULL
)
6535 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
6540 printf (_("\nSymbol table for image:\n"));
6542 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6544 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6546 for (hn
= 0; hn
< nbuckets
; hn
++)
6551 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
6553 Elf_Internal_Sym
*psym
;
6556 psym
= dynamic_symbols
+ si
;
6558 n
= print_vma (si
, DEC_5
);
6560 fputs (" " + n
, stdout
);
6561 printf (" %3lu: ", hn
);
6562 print_vma (psym
->st_value
, LONG_HEX
);
6564 print_vma (psym
->st_size
, DEC_5
);
6566 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6567 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
6568 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6569 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
6570 if (VALID_DYNAMIC_NAME (psym
->st_name
))
6571 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
6573 printf (" <corrupt: %14ld>", psym
->st_name
);
6578 else if (do_syms
&& !do_using_dynamic
)
6582 for (i
= 0, section
= section_headers
;
6583 i
< elf_header
.e_shnum
;
6588 Elf_Internal_Sym
*symtab
;
6589 Elf_Internal_Sym
*psym
;
6592 if ( section
->sh_type
!= SHT_SYMTAB
6593 && section
->sh_type
!= SHT_DYNSYM
)
6596 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
6597 SECTION_NAME (section
),
6598 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
6600 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6602 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6604 symtab
= GET_ELF_SYMBOLS (file
, section
);
6608 if (section
->sh_link
== elf_header
.e_shstrndx
)
6609 strtab
= string_table
;
6612 Elf_Internal_Shdr
*string_sec
;
6614 string_sec
= SECTION_HEADER (section
->sh_link
);
6616 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
6617 string_sec
->sh_size
, _("string table"));
6620 for (si
= 0, psym
= symtab
;
6621 si
< section
->sh_size
/ section
->sh_entsize
;
6624 printf ("%6d: ", si
);
6625 print_vma (psym
->st_value
, LONG_HEX
);
6627 print_vma (psym
->st_size
, DEC_5
);
6628 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6629 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
6630 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6631 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
6632 print_symbol (25, strtab
+ psym
->st_name
);
6634 if (section
->sh_type
== SHT_DYNSYM
&&
6635 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
6637 unsigned char data
[2];
6638 unsigned short vers_data
;
6639 unsigned long offset
;
6643 offset
= offset_from_vma
6644 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6645 sizeof data
+ si
* sizeof (vers_data
));
6647 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
6648 sizeof (data
), _("version data"));
6650 vers_data
= byte_get (data
, 2);
6652 is_nobits
= (SECTION_HEADER (psym
->st_shndx
)->sh_type
6655 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
6657 if ((vers_data
& 0x8000) || vers_data
> 1)
6659 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
6660 && (is_nobits
|| ! check_def
))
6662 Elf_External_Verneed evn
;
6663 Elf_Internal_Verneed ivn
;
6664 Elf_Internal_Vernaux ivna
;
6666 /* We must test both. */
6667 offset
= offset_from_vma
6668 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6673 unsigned long vna_off
;
6675 get_data (&evn
, file
, offset
, sizeof (evn
),
6678 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6679 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6681 vna_off
= offset
+ ivn
.vn_aux
;
6685 Elf_External_Vernaux evna
;
6687 get_data (&evna
, file
, vna_off
,
6689 _("version need aux (3)"));
6691 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6692 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6693 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6695 vna_off
+= ivna
.vna_next
;
6697 while (ivna
.vna_other
!= vers_data
6698 && ivna
.vna_next
!= 0);
6700 if (ivna
.vna_other
== vers_data
)
6703 offset
+= ivn
.vn_next
;
6705 while (ivn
.vn_next
!= 0);
6707 if (ivna
.vna_other
== vers_data
)
6710 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
6713 else if (! is_nobits
)
6714 error (_("bad dynamic symbol"));
6721 if (vers_data
!= 0x8001
6722 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6724 Elf_Internal_Verdef ivd
;
6725 Elf_Internal_Verdaux ivda
;
6726 Elf_External_Verdaux evda
;
6727 unsigned long offset
;
6729 offset
= offset_from_vma
6731 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6732 sizeof (Elf_External_Verdef
));
6736 Elf_External_Verdef evd
;
6738 get_data (&evd
, file
, offset
, sizeof (evd
),
6741 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6742 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6743 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6745 offset
+= ivd
.vd_next
;
6747 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
6748 && ivd
.vd_next
!= 0);
6750 offset
-= ivd
.vd_next
;
6751 offset
+= ivd
.vd_aux
;
6753 get_data (&evda
, file
, offset
, sizeof (evda
),
6754 _("version def aux"));
6756 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6758 if (psym
->st_name
!= ivda
.vda_name
)
6759 printf ((vers_data
& 0x8000)
6761 strtab
+ ivda
.vda_name
);
6771 if (strtab
!= string_table
)
6777 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
6779 if (do_histogram
&& buckets
!= NULL
)
6781 unsigned long *lengths
;
6782 unsigned long *counts
;
6785 unsigned long maxlength
= 0;
6786 unsigned long nzero_counts
= 0;
6787 unsigned long nsyms
= 0;
6789 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
6790 (unsigned long) nbuckets
);
6791 printf (_(" Length Number %% of total Coverage\n"));
6793 lengths
= calloc (nbuckets
, sizeof (*lengths
));
6794 if (lengths
== NULL
)
6796 error (_("Out of memory"));
6799 for (hn
= 0; hn
< nbuckets
; ++hn
)
6801 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
6804 if (maxlength
< ++lengths
[hn
])
6809 counts
= calloc (maxlength
+ 1, sizeof (*counts
));
6812 error (_("Out of memory"));
6816 for (hn
= 0; hn
< nbuckets
; ++hn
)
6817 ++counts
[lengths
[hn
]];
6822 printf (" 0 %-10lu (%5.1f%%)\n",
6823 counts
[0], (counts
[0] * 100.0) / nbuckets
);
6824 for (i
= 1; i
<= maxlength
; ++i
)
6826 nzero_counts
+= counts
[i
] * i
;
6827 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
6828 i
, counts
[i
], (counts
[i
] * 100.0) / nbuckets
,
6829 (nzero_counts
* 100.0) / nsyms
);
6837 if (buckets
!= NULL
)
6847 process_syminfo (FILE *file ATTRIBUTE_UNUSED
)
6851 if (dynamic_syminfo
== NULL
6853 /* No syminfo, this is ok. */
6856 /* There better should be a dynamic symbol section. */
6857 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
6861 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
6862 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
6864 printf (_(" Num: Name BoundTo Flags\n"));
6865 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
6867 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
6869 printf ("%4d: ", i
);
6870 if (VALID_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
))
6871 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
));
6873 printf ("<corrupt: %19ld>", dynamic_symbols
[i
].st_name
);
6876 switch (dynamic_syminfo
[i
].si_boundto
)
6878 case SYMINFO_BT_SELF
:
6879 fputs ("SELF ", stdout
);
6881 case SYMINFO_BT_PARENT
:
6882 fputs ("PARENT ", stdout
);
6885 if (dynamic_syminfo
[i
].si_boundto
> 0
6886 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
6887 && VALID_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
6889 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
6893 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
6897 if (flags
& SYMINFO_FLG_DIRECT
)
6899 if (flags
& SYMINFO_FLG_PASSTHRU
)
6900 printf (" PASSTHRU");
6901 if (flags
& SYMINFO_FLG_COPY
)
6903 if (flags
& SYMINFO_FLG_LAZYLOAD
)
6904 printf (" LAZYLOAD");
6912 #ifdef SUPPORT_DISASSEMBLY
6914 disassemble_section (Elf_Internal_Shdr
*section
, FILE *file
)
6916 printf (_("\nAssembly dump of section %s\n"),
6917 SECTION_NAME (section
));
6919 /* XXX -- to be done --- XXX */
6926 dump_section (Elf_Internal_Shdr
*section
, FILE *file
)
6928 bfd_size_type bytes
;
6930 unsigned char *data
;
6931 unsigned char *start
;
6933 bytes
= section
->sh_size
;
6935 if (bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
6937 printf (_("\nSection '%s' has no data to dump.\n"),
6938 SECTION_NAME (section
));
6942 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
6944 addr
= section
->sh_addr
;
6946 start
= get_data (NULL
, file
, section
->sh_offset
, bytes
, _("section data"));
6958 lbytes
= (bytes
> 16 ? 16 : bytes
);
6960 printf (" 0x%8.8lx ", (unsigned long) addr
);
6962 switch (elf_header
.e_ident
[EI_DATA
])
6966 for (j
= 15; j
>= 0; j
--)
6969 printf ("%2.2x", data
[j
]);
6979 for (j
= 0; j
< 16; j
++)
6982 printf ("%2.2x", data
[j
]);
6992 for (j
= 0; j
< lbytes
; j
++)
6995 if (k
>= ' ' && k
< 0x7f)
7014 static unsigned long int
7015 read_leb128 (unsigned char *data
, unsigned int *length_return
, int sign
)
7017 unsigned long int result
= 0;
7018 unsigned int num_read
= 0;
7019 unsigned int shift
= 0;
7027 result
|= ((unsigned long int) (byte
& 0x7f)) << shift
;
7032 while (byte
& 0x80);
7034 if (length_return
!= NULL
)
7035 *length_return
= num_read
;
7037 if (sign
&& (shift
< 8 * sizeof (result
)) && (byte
& 0x40))
7038 result
|= -1L << shift
;
7043 typedef struct State_Machine_Registers
7045 unsigned long address
;
7048 unsigned int column
;
7052 /* This variable hold the number of the last entry seen
7053 in the File Table. */
7054 unsigned int last_file_entry
;
7057 static SMR state_machine_regs
;
7060 reset_state_machine (int is_stmt
)
7062 state_machine_regs
.address
= 0;
7063 state_machine_regs
.file
= 1;
7064 state_machine_regs
.line
= 1;
7065 state_machine_regs
.column
= 0;
7066 state_machine_regs
.is_stmt
= is_stmt
;
7067 state_machine_regs
.basic_block
= 0;
7068 state_machine_regs
.end_sequence
= 0;
7069 state_machine_regs
.last_file_entry
= 0;
7072 /* Handled an extend line op. Returns true if this is the end
7076 process_extended_line_op (unsigned char *data
, int is_stmt
, int pointer_size
)
7078 unsigned char op_code
;
7079 unsigned int bytes_read
;
7081 unsigned char *name
;
7084 len
= read_leb128 (data
, & bytes_read
, 0);
7089 warn (_("badly formed extended line op encountered!\n"));
7096 printf (_(" Extended opcode %d: "), op_code
);
7100 case DW_LNE_end_sequence
:
7101 printf (_("End of Sequence\n\n"));
7102 reset_state_machine (is_stmt
);
7105 case DW_LNE_set_address
:
7106 adr
= byte_get (data
, pointer_size
);
7107 printf (_("set Address to 0x%lx\n"), adr
);
7108 state_machine_regs
.address
= adr
;
7111 case DW_LNE_define_file
:
7112 printf (_(" define new File Table entry\n"));
7113 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
7115 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
7117 data
+= strlen ((char *) data
) + 1;
7118 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
7120 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
7122 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
7123 printf (_("%s\n\n"), name
);
7127 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
7134 static const char *debug_str_contents
;
7135 static bfd_vma debug_str_size
;
7138 load_debug_str (FILE *file
)
7140 Elf_Internal_Shdr
*sec
;
7142 /* If it is already loaded, do nothing. */
7143 if (debug_str_contents
!= NULL
)
7146 /* Locate the .debug_str section. */
7147 sec
= find_section (".debug_str");
7151 debug_str_size
= sec
->sh_size
;
7153 debug_str_contents
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7154 _("debug_str section data"));
7158 free_debug_str (void)
7160 if (debug_str_contents
== NULL
)
7163 free ((char *) debug_str_contents
);
7164 debug_str_contents
= NULL
;
7169 fetch_indirect_string (unsigned long offset
)
7171 if (debug_str_contents
== NULL
)
7172 return _("<no .debug_str section>");
7174 if (offset
> debug_str_size
)
7175 return _("<offset is too big>");
7177 return debug_str_contents
+ offset
;
7180 static const char *debug_loc_contents
;
7181 static bfd_vma debug_loc_size
;
7184 load_debug_loc (FILE *file
)
7186 Elf_Internal_Shdr
*sec
;
7188 /* If it is already loaded, do nothing. */
7189 if (debug_loc_contents
!= NULL
)
7192 /* Locate the .debug_loc section. */
7193 sec
= find_section (".debug_loc");
7197 debug_loc_size
= sec
->sh_size
;
7199 debug_loc_contents
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7200 _("debug_loc section data"));
7204 free_debug_loc (void)
7206 if (debug_loc_contents
== NULL
)
7209 free ((char *) debug_loc_contents
);
7210 debug_loc_contents
= NULL
;
7214 static const char * debug_range_contents
;
7215 static unsigned long debug_range_size
;
7218 load_debug_range (FILE *file
)
7220 Elf_Internal_Shdr
*sec
;
7222 /* If it is already loaded, do nothing. */
7223 if (debug_range_contents
!= NULL
)
7226 /* Locate the .debug_str section. */
7227 sec
= find_section (".debug_ranges");
7231 debug_range_size
= sec
->sh_size
;
7233 debug_range_contents
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7234 _("debug_range section data"));
7238 free_debug_range (void)
7240 if (debug_range_contents
== NULL
)
7243 free ((char *) debug_range_contents
);
7244 debug_range_contents
= NULL
;
7245 debug_range_size
= 0;
7248 /* Apply addends of RELA relocations. */
7251 debug_apply_rela_addends (FILE *file
,
7252 Elf_Internal_Shdr
*section
,
7254 unsigned char *sec_data
,
7255 unsigned char *start
,
7258 Elf_Internal_Shdr
*relsec
;
7260 if (end
- start
< reloc_size
)
7263 for (relsec
= section_headers
;
7264 relsec
< section_headers
+ elf_header
.e_shnum
;
7267 unsigned long nrelas
;
7268 Elf_Internal_Rela
*rela
, *rp
;
7269 Elf_Internal_Shdr
*symsec
;
7270 Elf_Internal_Sym
*symtab
;
7271 Elf_Internal_Sym
*sym
;
7273 if (relsec
->sh_type
!= SHT_RELA
7274 || SECTION_HEADER (relsec
->sh_info
) != section
7275 || relsec
->sh_size
== 0)
7278 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
7282 symsec
= SECTION_HEADER (relsec
->sh_link
);
7283 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
7285 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
7289 if (rp
->r_offset
>= (bfd_vma
) (start
- sec_data
)
7290 && rp
->r_offset
< (bfd_vma
) (end
- sec_data
) - reloc_size
)
7291 loc
= sec_data
+ rp
->r_offset
;
7297 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
7299 if (ELF32_R_SYM (rp
->r_info
) != 0
7300 && ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
7301 /* Relocations against object symbols can happen,
7302 eg when referencing a global array. For an
7303 example of this see the _clz.o binary in libgcc.a. */
7304 && ELF32_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
7306 warn (_("%s: skipping unexpected symbol type %s in relocation in section .rela%s\n"),
7307 get_symbol_type (ELF32_ST_TYPE (sym
->st_info
)),
7308 SECTION_NAME (section
));
7314 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
7316 if (ELF64_R_SYM (rp
->r_info
) != 0
7317 && ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
7318 && ELF64_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
7320 warn (_("skipping unexpected symbol type %s in relocation in section .rela.%s\n"),
7321 get_symbol_type (ELF64_ST_TYPE (sym
->st_info
)),
7322 SECTION_NAME (section
));
7327 byte_put (loc
, rp
->r_addend
, reloc_size
);
7337 /* FIXME: There are better and more efficient ways to handle
7338 these structures. For now though, I just want something that
7339 is simple to implement. */
7340 typedef struct abbrev_attr
7342 unsigned long attribute
;
7344 struct abbrev_attr
*next
;
7348 typedef struct abbrev_entry
7350 unsigned long entry
;
7353 struct abbrev_attr
*first_attr
;
7354 struct abbrev_attr
*last_attr
;
7355 struct abbrev_entry
*next
;
7359 static abbrev_entry
*first_abbrev
= NULL
;
7360 static abbrev_entry
*last_abbrev
= NULL
;
7365 abbrev_entry
*abbrev
;
7367 for (abbrev
= first_abbrev
; abbrev
;)
7369 abbrev_entry
*next
= abbrev
->next
;
7372 for (attr
= abbrev
->first_attr
; attr
;)
7374 abbrev_attr
*next
= attr
->next
;
7384 last_abbrev
= first_abbrev
= NULL
;
7388 add_abbrev (unsigned long number
, unsigned long tag
, int children
)
7390 abbrev_entry
*entry
;
7392 entry
= malloc (sizeof (*entry
));
7398 entry
->entry
= number
;
7400 entry
->children
= children
;
7401 entry
->first_attr
= NULL
;
7402 entry
->last_attr
= NULL
;
7405 if (first_abbrev
== NULL
)
7406 first_abbrev
= entry
;
7408 last_abbrev
->next
= entry
;
7410 last_abbrev
= entry
;
7414 add_abbrev_attr (unsigned long attribute
, unsigned long form
)
7418 attr
= malloc (sizeof (*attr
));
7424 attr
->attribute
= attribute
;
7428 if (last_abbrev
->first_attr
== NULL
)
7429 last_abbrev
->first_attr
= attr
;
7431 last_abbrev
->last_attr
->next
= attr
;
7433 last_abbrev
->last_attr
= attr
;
7436 /* Processes the (partial) contents of a .debug_abbrev section.
7437 Returns NULL if the end of the section was encountered.
7438 Returns the address after the last byte read if the end of
7439 an abbreviation set was found. */
7441 static unsigned char *
7442 process_abbrev_section (unsigned char *start
, unsigned char *end
)
7444 if (first_abbrev
!= NULL
)
7449 unsigned int bytes_read
;
7450 unsigned long entry
;
7452 unsigned long attribute
;
7455 entry
= read_leb128 (start
, & bytes_read
, 0);
7456 start
+= bytes_read
;
7458 /* A single zero is supposed to end the section according
7459 to the standard. If there's more, then signal that to
7462 return start
== end
? NULL
: start
;
7464 tag
= read_leb128 (start
, & bytes_read
, 0);
7465 start
+= bytes_read
;
7467 children
= *start
++;
7469 add_abbrev (entry
, tag
, children
);
7475 attribute
= read_leb128 (start
, & bytes_read
, 0);
7476 start
+= bytes_read
;
7478 form
= read_leb128 (start
, & bytes_read
, 0);
7479 start
+= bytes_read
;
7482 add_abbrev_attr (attribute
, form
);
7484 while (attribute
!= 0);
7491 get_TAG_name (unsigned long tag
)
7495 case DW_TAG_padding
: return "DW_TAG_padding";
7496 case DW_TAG_array_type
: return "DW_TAG_array_type";
7497 case DW_TAG_class_type
: return "DW_TAG_class_type";
7498 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
7499 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
7500 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
7501 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
7502 case DW_TAG_label
: return "DW_TAG_label";
7503 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
7504 case DW_TAG_member
: return "DW_TAG_member";
7505 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
7506 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
7507 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
7508 case DW_TAG_string_type
: return "DW_TAG_string_type";
7509 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
7510 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
7511 case DW_TAG_typedef
: return "DW_TAG_typedef";
7512 case DW_TAG_union_type
: return "DW_TAG_union_type";
7513 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
7514 case DW_TAG_variant
: return "DW_TAG_variant";
7515 case DW_TAG_common_block
: return "DW_TAG_common_block";
7516 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
7517 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
7518 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
7519 case DW_TAG_module
: return "DW_TAG_module";
7520 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
7521 case DW_TAG_set_type
: return "DW_TAG_set_type";
7522 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
7523 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
7524 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
7525 case DW_TAG_base_type
: return "DW_TAG_base_type";
7526 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
7527 case DW_TAG_const_type
: return "DW_TAG_const_type";
7528 case DW_TAG_constant
: return "DW_TAG_constant";
7529 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
7530 case DW_TAG_file_type
: return "DW_TAG_file_type";
7531 case DW_TAG_friend
: return "DW_TAG_friend";
7532 case DW_TAG_namelist
: return "DW_TAG_namelist";
7533 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
7534 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
7535 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
7536 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
7537 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
7538 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
7539 case DW_TAG_try_block
: return "DW_TAG_try_block";
7540 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
7541 case DW_TAG_variable
: return "DW_TAG_variable";
7542 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
7543 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
7544 case DW_TAG_format_label
: return "DW_TAG_format_label";
7545 case DW_TAG_function_template
: return "DW_TAG_function_template";
7546 case DW_TAG_class_template
: return "DW_TAG_class_template";
7547 /* DWARF 2.1 values. */
7548 case DW_TAG_dwarf_procedure
: return "DW_TAG_dwarf_procedure";
7549 case DW_TAG_restrict_type
: return "DW_TAG_restrict_type";
7550 case DW_TAG_interface_type
: return "DW_TAG_interface_type";
7551 case DW_TAG_namespace
: return "DW_TAG_namespace";
7552 case DW_TAG_imported_module
: return "DW_TAG_imported_module";
7553 case DW_TAG_unspecified_type
: return "DW_TAG_unspecified_type";
7554 case DW_TAG_partial_unit
: return "DW_TAG_partial_unit";
7555 case DW_TAG_imported_unit
: return "DW_TAG_imported_unit";
7557 case DW_TAG_upc_shared_type
: return "DW_TAG_upc_shared_type";
7558 case DW_TAG_upc_strict_type
: return "DW_TAG_upc_strict_type";
7559 case DW_TAG_upc_relaxed_type
: return "DW_TAG_upc_relaxed_type";
7562 static char buffer
[100];
7564 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
7571 get_FORM_name (unsigned long form
)
7575 case DW_FORM_addr
: return "DW_FORM_addr";
7576 case DW_FORM_block2
: return "DW_FORM_block2";
7577 case DW_FORM_block4
: return "DW_FORM_block4";
7578 case DW_FORM_data2
: return "DW_FORM_data2";
7579 case DW_FORM_data4
: return "DW_FORM_data4";
7580 case DW_FORM_data8
: return "DW_FORM_data8";
7581 case DW_FORM_string
: return "DW_FORM_string";
7582 case DW_FORM_block
: return "DW_FORM_block";
7583 case DW_FORM_block1
: return "DW_FORM_block1";
7584 case DW_FORM_data1
: return "DW_FORM_data1";
7585 case DW_FORM_flag
: return "DW_FORM_flag";
7586 case DW_FORM_sdata
: return "DW_FORM_sdata";
7587 case DW_FORM_strp
: return "DW_FORM_strp";
7588 case DW_FORM_udata
: return "DW_FORM_udata";
7589 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
7590 case DW_FORM_ref1
: return "DW_FORM_ref1";
7591 case DW_FORM_ref2
: return "DW_FORM_ref2";
7592 case DW_FORM_ref4
: return "DW_FORM_ref4";
7593 case DW_FORM_ref8
: return "DW_FORM_ref8";
7594 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
7595 case DW_FORM_indirect
: return "DW_FORM_indirect";
7598 static char buffer
[100];
7600 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
7606 static unsigned char *
7607 display_block (unsigned char *data
, unsigned long length
)
7609 printf (_(" %lu byte block: "), length
);
7612 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
7618 decode_location_expression (unsigned char * data
,
7619 unsigned int pointer_size
,
7620 unsigned long length
,
7621 unsigned long cu_offset
)
7624 unsigned int bytes_read
;
7625 unsigned long uvalue
;
7626 unsigned char *end
= data
+ length
;
7627 int need_frame_base
= 0;
7636 printf ("DW_OP_addr: %lx",
7637 (unsigned long) byte_get (data
, pointer_size
));
7638 data
+= pointer_size
;
7641 printf ("DW_OP_deref");
7644 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
7647 printf ("DW_OP_const1s: %ld", (long) byte_get_signed (data
++, 1));
7650 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
7654 printf ("DW_OP_const2s: %ld", (long) byte_get_signed (data
, 2));
7658 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
7662 printf ("DW_OP_const4s: %ld", (long) byte_get_signed (data
, 4));
7666 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
7667 (unsigned long) byte_get (data
+ 4, 4));
7671 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
7672 (long) byte_get (data
+ 4, 4));
7676 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
7680 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
7684 printf ("DW_OP_dup");
7687 printf ("DW_OP_drop");
7690 printf ("DW_OP_over");
7693 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
7696 printf ("DW_OP_swap");
7699 printf ("DW_OP_rot");
7702 printf ("DW_OP_xderef");
7705 printf ("DW_OP_abs");
7708 printf ("DW_OP_and");
7711 printf ("DW_OP_div");
7714 printf ("DW_OP_minus");
7717 printf ("DW_OP_mod");
7720 printf ("DW_OP_mul");
7723 printf ("DW_OP_neg");
7726 printf ("DW_OP_not");
7729 printf ("DW_OP_or");
7732 printf ("DW_OP_plus");
7734 case DW_OP_plus_uconst
:
7735 printf ("DW_OP_plus_uconst: %lu",
7736 read_leb128 (data
, &bytes_read
, 0));
7740 printf ("DW_OP_shl");
7743 printf ("DW_OP_shr");
7746 printf ("DW_OP_shra");
7749 printf ("DW_OP_xor");
7752 printf ("DW_OP_bra: %ld", (long) byte_get_signed (data
, 2));
7756 printf ("DW_OP_eq");
7759 printf ("DW_OP_ge");
7762 printf ("DW_OP_gt");
7765 printf ("DW_OP_le");
7768 printf ("DW_OP_lt");
7771 printf ("DW_OP_ne");
7774 printf ("DW_OP_skip: %ld", (long) byte_get_signed (data
, 2));
7810 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
7845 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
7880 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
7881 read_leb128 (data
, &bytes_read
, 1));
7886 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
7890 need_frame_base
= 1;
7891 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
7895 uvalue
= read_leb128 (data
, &bytes_read
, 0);
7897 printf ("DW_OP_bregx: %lu %ld", uvalue
,
7898 read_leb128 (data
, &bytes_read
, 1));
7902 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
7905 case DW_OP_deref_size
:
7906 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
7908 case DW_OP_xderef_size
:
7909 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
7912 printf ("DW_OP_nop");
7915 /* DWARF 3 extensions. */
7916 case DW_OP_push_object_address
:
7917 printf ("DW_OP_push_object_address");
7920 /* XXX: Strictly speaking for 64-bit DWARF3 files
7921 this ought to be an 8-byte wide computation. */
7922 printf ("DW_OP_call2: <%lx>", (long) byte_get (data
, 2) + cu_offset
);
7926 /* XXX: Strictly speaking for 64-bit DWARF3 files
7927 this ought to be an 8-byte wide computation. */
7928 printf ("DW_OP_call4: <%lx>", (long) byte_get (data
, 4) + cu_offset
);
7931 case DW_OP_call_ref
:
7932 printf ("DW_OP_call_ref");
7935 /* GNU extensions. */
7936 case DW_OP_GNU_push_tls_address
:
7937 printf ("DW_OP_GNU_push_tls_address");
7941 if (op
>= DW_OP_lo_user
7942 && op
<= DW_OP_hi_user
)
7943 printf (_("(User defined location op)"));
7945 printf (_("(Unknown location op)"));
7946 /* No way to tell where the next op is, so just bail. */
7947 return need_frame_base
;
7950 /* Separate the ops. */
7955 return need_frame_base
;
7958 /* This structure records the information that
7959 we extract from the.debug_info section. */
7962 unsigned int pointer_size
;
7963 unsigned long cu_offset
;
7964 unsigned long base_address
;
7965 /* This is an array of offsets to the location list table. */
7966 unsigned long *loc_offsets
;
7967 int *have_frame_base
;
7968 unsigned int num_loc_offsets
;
7969 unsigned int max_loc_offsets
;
7970 unsigned long *range_lists
;
7971 unsigned int num_range_lists
;
7972 unsigned int max_range_lists
;
7976 static debug_info
* debug_information
= NULL
;
7977 static unsigned int num_debug_info_entries
= 0;
7978 static unsigned int last_pointer_size
= 0;
7979 static int warned_about_missing_comp_units
= FALSE
;
7981 static unsigned char *
7982 read_and_display_attr_value (unsigned long attribute
,
7984 unsigned char *data
,
7985 unsigned long cu_offset
,
7986 unsigned long pointer_size
,
7987 unsigned long offset_size
,
7989 debug_info
*debug_info_p
,
7992 unsigned long uvalue
= 0;
7993 unsigned char *block_start
= NULL
;
7994 unsigned int bytes_read
;
8001 case DW_FORM_ref_addr
:
8002 if (dwarf_version
== 2)
8004 uvalue
= byte_get (data
, pointer_size
);
8005 data
+= pointer_size
;
8007 else if (dwarf_version
== 3)
8009 uvalue
= byte_get (data
, offset_size
);
8010 data
+= offset_size
;
8014 error (_("Internal error: DWARF version is not 2 or 3.\n"));
8019 uvalue
= byte_get (data
, pointer_size
);
8020 data
+= pointer_size
;
8024 uvalue
= byte_get (data
, offset_size
);
8025 data
+= offset_size
;
8031 uvalue
= byte_get (data
++, 1);
8036 uvalue
= byte_get (data
, 2);
8042 uvalue
= byte_get (data
, 4);
8047 uvalue
= read_leb128 (data
, & bytes_read
, 1);
8051 case DW_FORM_ref_udata
:
8053 uvalue
= read_leb128 (data
, & bytes_read
, 0);
8057 case DW_FORM_indirect
:
8058 form
= read_leb128 (data
, & bytes_read
, 0);
8061 printf (" %s", get_FORM_name (form
));
8062 return read_and_display_attr_value (attribute
, form
, data
,
8063 cu_offset
, pointer_size
,
8064 offset_size
, dwarf_version
,
8065 debug_info_p
, do_loc
);
8070 case DW_FORM_ref_addr
:
8072 printf (" <#%lx>", uvalue
);
8078 case DW_FORM_ref_udata
:
8080 printf (" <%lx>", uvalue
+ cu_offset
);
8086 printf (" %#lx", uvalue
);
8095 printf (" %ld", uvalue
);
8102 uvalue
= byte_get (data
, 4);
8103 printf (" %lx", uvalue
);
8104 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
8106 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
8107 && num_debug_info_entries
== 0)
8109 if (sizeof (uvalue
) == 8)
8110 uvalue
= byte_get (data
, 8);
8112 error (_("DW_FORM_data8 is unsupported when sizeof (unsigned long) != 8\n"));
8117 case DW_FORM_string
:
8119 printf (" %s", data
);
8120 data
+= strlen ((char *) data
) + 1;
8124 uvalue
= read_leb128 (data
, & bytes_read
, 0);
8125 block_start
= data
+ bytes_read
;
8127 data
= block_start
+ uvalue
;
8129 data
= display_block (block_start
, uvalue
);
8132 case DW_FORM_block1
:
8133 uvalue
= byte_get (data
, 1);
8134 block_start
= data
+ 1;
8136 data
= block_start
+ uvalue
;
8138 data
= display_block (block_start
, uvalue
);
8141 case DW_FORM_block2
:
8142 uvalue
= byte_get (data
, 2);
8143 block_start
= data
+ 2;
8145 data
= block_start
+ uvalue
;
8147 data
= display_block (block_start
, uvalue
);
8150 case DW_FORM_block4
:
8151 uvalue
= byte_get (data
, 4);
8152 block_start
= data
+ 4;
8154 data
= block_start
+ uvalue
;
8156 data
= display_block (block_start
, uvalue
);
8161 printf (_(" (indirect string, offset: 0x%lx): %s"),
8162 uvalue
, fetch_indirect_string (uvalue
));
8165 case DW_FORM_indirect
:
8166 /* Handled above. */
8170 warn (_("Unrecognized form: %d\n"), form
);
8174 /* For some attributes we can display further information. */
8175 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
8176 && num_debug_info_entries
== 0)
8180 case DW_AT_frame_base
:
8181 have_frame_base
= 1;
8182 case DW_AT_location
:
8183 case DW_AT_data_member_location
:
8184 case DW_AT_vtable_elem_location
:
8185 case DW_AT_allocated
:
8186 case DW_AT_associated
:
8187 case DW_AT_data_location
:
8189 case DW_AT_upper_bound
:
8190 case DW_AT_lower_bound
:
8191 if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
8193 /* Process location list. */
8194 unsigned int max
= debug_info_p
->max_loc_offsets
;
8195 unsigned int num
= debug_info_p
->num_loc_offsets
;
8197 if (max
== 0 || num
>= max
)
8200 debug_info_p
->loc_offsets
8201 = xrealloc (debug_info_p
->loc_offsets
,
8202 max
* sizeof (*debug_info_p
->loc_offsets
));
8203 debug_info_p
->have_frame_base
8204 = xrealloc (debug_info_p
->have_frame_base
,
8205 max
* sizeof (*debug_info_p
->have_frame_base
));
8206 debug_info_p
->max_loc_offsets
= max
;
8208 debug_info_p
->loc_offsets
[num
] = uvalue
;
8209 debug_info_p
->have_frame_base
[num
] = have_frame_base
;
8210 debug_info_p
->num_loc_offsets
++;
8215 if (need_base_address
)
8216 debug_info_p
->base_address
= uvalue
;
8220 if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
8222 /* Process range list. */
8223 unsigned int max
= debug_info_p
->max_range_lists
;
8224 unsigned int num
= debug_info_p
->num_range_lists
;
8226 if (max
== 0 || num
>= max
)
8229 debug_info_p
->range_lists
8230 = xrealloc (debug_info_p
->range_lists
,
8231 max
* sizeof (*debug_info_p
->range_lists
));
8232 debug_info_p
->max_range_lists
= max
;
8234 debug_info_p
->range_lists
[num
] = uvalue
;
8235 debug_info_p
->num_range_lists
++;
8254 case DW_INL_not_inlined
:
8255 printf (_("(not inlined)"));
8257 case DW_INL_inlined
:
8258 printf (_("(inlined)"));
8260 case DW_INL_declared_not_inlined
:
8261 printf (_("(declared as inline but ignored)"));
8263 case DW_INL_declared_inlined
:
8264 printf (_("(declared as inline and inlined)"));
8267 printf (_(" (Unknown inline attribute value: %lx)"), uvalue
);
8272 case DW_AT_language
:
8275 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
8276 case DW_LANG_C89
: printf ("(ANSI C)"); break;
8277 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
8278 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
8279 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
8280 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
8281 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
8282 case DW_LANG_Ada83
: printf ("(Ada)"); break;
8283 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
8284 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
8285 /* DWARF 2.1 values. */
8286 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
8287 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
8288 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
8289 /* MIPS extension. */
8290 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
8291 /* UPC extension. */
8292 case DW_LANG_Upc
: printf ("(Unified Parallel C)"); break;
8294 printf ("(Unknown: %lx)", uvalue
);
8299 case DW_AT_encoding
:
8302 case DW_ATE_void
: printf ("(void)"); break;
8303 case DW_ATE_address
: printf ("(machine address)"); break;
8304 case DW_ATE_boolean
: printf ("(boolean)"); break;
8305 case DW_ATE_complex_float
: printf ("(complex float)"); break;
8306 case DW_ATE_float
: printf ("(float)"); break;
8307 case DW_ATE_signed
: printf ("(signed)"); break;
8308 case DW_ATE_signed_char
: printf ("(signed char)"); break;
8309 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
8310 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
8311 /* DWARF 2.1 value. */
8312 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
8314 if (uvalue
>= DW_ATE_lo_user
8315 && uvalue
<= DW_ATE_hi_user
)
8316 printf ("(user defined type)");
8318 printf ("(unknown type)");
8323 case DW_AT_accessibility
:
8326 case DW_ACCESS_public
: printf ("(public)"); break;
8327 case DW_ACCESS_protected
: printf ("(protected)"); break;
8328 case DW_ACCESS_private
: printf ("(private)"); break;
8330 printf ("(unknown accessibility)");
8335 case DW_AT_visibility
:
8338 case DW_VIS_local
: printf ("(local)"); break;
8339 case DW_VIS_exported
: printf ("(exported)"); break;
8340 case DW_VIS_qualified
: printf ("(qualified)"); break;
8341 default: printf ("(unknown visibility)"); break;
8345 case DW_AT_virtuality
:
8348 case DW_VIRTUALITY_none
: printf ("(none)"); break;
8349 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
8350 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
8351 default: printf ("(unknown virtuality)"); break;
8355 case DW_AT_identifier_case
:
8358 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
8359 case DW_ID_up_case
: printf ("(up_case)"); break;
8360 case DW_ID_down_case
: printf ("(down_case)"); break;
8361 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
8362 default: printf ("(unknown case)"); break;
8366 case DW_AT_calling_convention
:
8369 case DW_CC_normal
: printf ("(normal)"); break;
8370 case DW_CC_program
: printf ("(program)"); break;
8371 case DW_CC_nocall
: printf ("(nocall)"); break;
8373 if (uvalue
>= DW_CC_lo_user
8374 && uvalue
<= DW_CC_hi_user
)
8375 printf ("(user defined)");
8377 printf ("(unknown convention)");
8381 case DW_AT_ordering
:
8384 case -1: printf ("(undefined)"); break;
8385 case 0: printf ("(row major)"); break;
8386 case 1: printf ("(column major)"); break;
8390 case DW_AT_frame_base
:
8391 have_frame_base
= 1;
8392 case DW_AT_location
:
8393 case DW_AT_data_member_location
:
8394 case DW_AT_vtable_elem_location
:
8395 case DW_AT_allocated
:
8396 case DW_AT_associated
:
8397 case DW_AT_data_location
:
8399 case DW_AT_upper_bound
:
8400 case DW_AT_lower_bound
:
8403 int need_frame_base
;
8406 need_frame_base
= decode_location_expression (block_start
,
8411 if (need_frame_base
&& !have_frame_base
)
8412 printf (_(" [without DW_AT_frame_base]"));
8414 else if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
8415 printf (_("(location list)"));
8427 get_AT_name (unsigned long attribute
)
8431 case DW_AT_sibling
: return "DW_AT_sibling";
8432 case DW_AT_location
: return "DW_AT_location";
8433 case DW_AT_name
: return "DW_AT_name";
8434 case DW_AT_ordering
: return "DW_AT_ordering";
8435 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
8436 case DW_AT_byte_size
: return "DW_AT_byte_size";
8437 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
8438 case DW_AT_bit_size
: return "DW_AT_bit_size";
8439 case DW_AT_element_list
: return "DW_AT_element_list";
8440 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
8441 case DW_AT_low_pc
: return "DW_AT_low_pc";
8442 case DW_AT_high_pc
: return "DW_AT_high_pc";
8443 case DW_AT_language
: return "DW_AT_language";
8444 case DW_AT_member
: return "DW_AT_member";
8445 case DW_AT_discr
: return "DW_AT_discr";
8446 case DW_AT_discr_value
: return "DW_AT_discr_value";
8447 case DW_AT_visibility
: return "DW_AT_visibility";
8448 case DW_AT_import
: return "DW_AT_import";
8449 case DW_AT_string_length
: return "DW_AT_string_length";
8450 case DW_AT_common_reference
: return "DW_AT_common_reference";
8451 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
8452 case DW_AT_const_value
: return "DW_AT_const_value";
8453 case DW_AT_containing_type
: return "DW_AT_containing_type";
8454 case DW_AT_default_value
: return "DW_AT_default_value";
8455 case DW_AT_inline
: return "DW_AT_inline";
8456 case DW_AT_is_optional
: return "DW_AT_is_optional";
8457 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
8458 case DW_AT_producer
: return "DW_AT_producer";
8459 case DW_AT_prototyped
: return "DW_AT_prototyped";
8460 case DW_AT_return_addr
: return "DW_AT_return_addr";
8461 case DW_AT_start_scope
: return "DW_AT_start_scope";
8462 case DW_AT_stride_size
: return "DW_AT_stride_size";
8463 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
8464 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
8465 case DW_AT_accessibility
: return "DW_AT_accessibility";
8466 case DW_AT_address_class
: return "DW_AT_address_class";
8467 case DW_AT_artificial
: return "DW_AT_artificial";
8468 case DW_AT_base_types
: return "DW_AT_base_types";
8469 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
8470 case DW_AT_count
: return "DW_AT_count";
8471 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
8472 case DW_AT_decl_column
: return "DW_AT_decl_column";
8473 case DW_AT_decl_file
: return "DW_AT_decl_file";
8474 case DW_AT_decl_line
: return "DW_AT_decl_line";
8475 case DW_AT_declaration
: return "DW_AT_declaration";
8476 case DW_AT_discr_list
: return "DW_AT_discr_list";
8477 case DW_AT_encoding
: return "DW_AT_encoding";
8478 case DW_AT_external
: return "DW_AT_external";
8479 case DW_AT_frame_base
: return "DW_AT_frame_base";
8480 case DW_AT_friend
: return "DW_AT_friend";
8481 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
8482 case DW_AT_macro_info
: return "DW_AT_macro_info";
8483 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
8484 case DW_AT_priority
: return "DW_AT_priority";
8485 case DW_AT_segment
: return "DW_AT_segment";
8486 case DW_AT_specification
: return "DW_AT_specification";
8487 case DW_AT_static_link
: return "DW_AT_static_link";
8488 case DW_AT_type
: return "DW_AT_type";
8489 case DW_AT_use_location
: return "DW_AT_use_location";
8490 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
8491 case DW_AT_virtuality
: return "DW_AT_virtuality";
8492 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
8493 /* DWARF 2.1 values. */
8494 case DW_AT_allocated
: return "DW_AT_allocated";
8495 case DW_AT_associated
: return "DW_AT_associated";
8496 case DW_AT_data_location
: return "DW_AT_data_location";
8497 case DW_AT_stride
: return "DW_AT_stride";
8498 case DW_AT_entry_pc
: return "DW_AT_entry_pc";
8499 case DW_AT_use_UTF8
: return "DW_AT_use_UTF8";
8500 case DW_AT_extension
: return "DW_AT_extension";
8501 case DW_AT_ranges
: return "DW_AT_ranges";
8502 case DW_AT_trampoline
: return "DW_AT_trampoline";
8503 case DW_AT_call_column
: return "DW_AT_call_column";
8504 case DW_AT_call_file
: return "DW_AT_call_file";
8505 case DW_AT_call_line
: return "DW_AT_call_line";
8506 /* SGI/MIPS extensions. */
8507 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
8508 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
8509 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
8510 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
8511 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
8512 case DW_AT_MIPS_software_pipeline_depth
:
8513 return "DW_AT_MIPS_software_pipeline_depth";
8514 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
8515 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
8516 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
8517 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
8518 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
8519 /* GNU extensions. */
8520 case DW_AT_sf_names
: return "DW_AT_sf_names";
8521 case DW_AT_src_info
: return "DW_AT_src_info";
8522 case DW_AT_mac_info
: return "DW_AT_mac_info";
8523 case DW_AT_src_coords
: return "DW_AT_src_coords";
8524 case DW_AT_body_begin
: return "DW_AT_body_begin";
8525 case DW_AT_body_end
: return "DW_AT_body_end";
8526 case DW_AT_GNU_vector
: return "DW_AT_GNU_vector";
8527 /* UPC extension. */
8528 case DW_AT_upc_threads_scaled
: return "DW_AT_upc_threads_scaled";
8531 static char buffer
[100];
8533 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
8539 static unsigned char *
8540 read_and_display_attr (unsigned long attribute
,
8542 unsigned char *data
,
8543 unsigned long cu_offset
,
8544 unsigned long pointer_size
,
8545 unsigned long offset_size
,
8547 debug_info
*debug_info_p
,
8551 printf (" %-18s:", get_AT_name (attribute
));
8552 data
= read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
8553 pointer_size
, offset_size
,
8554 dwarf_version
, debug_info_p
,
8562 /* Process the contents of a .debug_info section. If do_loc is non-zero
8563 then we are scanning for location lists and we do not want to display
8564 anything to the user. */
8567 process_debug_info (Elf_Internal_Shdr
*section
, unsigned char *start
,
8568 FILE *file
, int do_loc
)
8570 unsigned char *end
= start
+ section
->sh_size
;
8571 unsigned char *section_begin
;
8573 unsigned int num_units
= 0;
8575 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
8576 && num_debug_info_entries
== 0)
8578 unsigned long length
;
8580 /* First scan the section to get the number of comp units. */
8581 for (section_begin
= start
, num_units
= 0; section_begin
< end
;
8584 /* Read the first 4 bytes. For a 32-bit DWARF section, this
8585 will be the length. For a 64-bit DWARF section, it'll be
8586 the escape code 0xffffffff followed by an 8 byte length. */
8587 length
= byte_get (section_begin
, 4);
8589 if (length
== 0xffffffff)
8591 length
= byte_get (section_begin
+ 4, 8);
8592 section_begin
+= length
+ 12;
8595 section_begin
+= length
+ 4;
8600 error (_("No comp units in .debug_info section ?"));
8604 /* Then allocate an array to hold the information. */
8605 debug_information
= malloc (num_units
*
8606 sizeof (* debug_information
));
8607 if (debug_information
== NULL
)
8609 error (_("Not enough memory for a debug info array of %u entries"),
8617 printf (_("The section %s contains:\n\n"),
8618 SECTION_NAME (section
));
8620 load_debug_str (file
);
8621 load_debug_loc (file
);
8622 load_debug_range (file
);
8625 for (section_begin
= start
, unit
= 0; start
< end
; unit
++)
8627 DWARF2_Internal_CompUnit compunit
;
8628 unsigned char *hdrptr
;
8629 unsigned char *cu_abbrev_offset_ptr
;
8630 unsigned char *tags
;
8632 unsigned long cu_offset
;
8634 int initial_length_size
;
8638 compunit
.cu_length
= byte_get (hdrptr
, 4);
8641 if (compunit
.cu_length
== 0xffffffff)
8643 compunit
.cu_length
= byte_get (hdrptr
, 8);
8646 initial_length_size
= 12;
8651 initial_length_size
= 4;
8654 compunit
.cu_version
= byte_get (hdrptr
, 2);
8657 cu_offset
= start
- section_begin
;
8658 start
+= compunit
.cu_length
+ initial_length_size
;
8660 if (elf_header
.e_type
== ET_REL
8661 && !debug_apply_rela_addends (file
, section
, offset_size
,
8662 section_begin
, hdrptr
, start
))
8665 cu_abbrev_offset_ptr
= hdrptr
;
8666 compunit
.cu_abbrev_offset
= byte_get (hdrptr
, offset_size
);
8667 hdrptr
+= offset_size
;
8669 compunit
.cu_pointer_size
= byte_get (hdrptr
, 1);
8671 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
8672 && num_debug_info_entries
== 0)
8674 debug_information
[unit
].cu_offset
= cu_offset
;
8675 debug_information
[unit
].pointer_size
8676 = compunit
.cu_pointer_size
;
8677 debug_information
[unit
].base_address
= 0;
8678 debug_information
[unit
].loc_offsets
= NULL
;
8679 debug_information
[unit
].have_frame_base
= NULL
;
8680 debug_information
[unit
].max_loc_offsets
= 0;
8681 debug_information
[unit
].num_loc_offsets
= 0;
8682 debug_information
[unit
].range_lists
= NULL
;
8683 debug_information
[unit
].max_range_lists
= 0;
8684 debug_information
[unit
].num_range_lists
= 0;
8691 printf (_(" Compilation Unit @ %lx:\n"), cu_offset
);
8692 printf (_(" Length: %ld\n"), compunit
.cu_length
);
8693 printf (_(" Version: %d\n"), compunit
.cu_version
);
8694 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
8695 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
8698 if (compunit
.cu_version
!= 2 && compunit
.cu_version
!= 3)
8700 warn (_("Only version 2 and 3 DWARF debug information is currently supported.\n"));
8706 /* Read in the abbrevs used by this compilation unit. */
8708 Elf_Internal_Shdr
*sec
;
8709 unsigned char *begin
;
8711 /* Locate the .debug_abbrev section and process it. */
8712 sec
= find_section (".debug_abbrev");
8715 warn (_("Unable to locate .debug_abbrev section!\n"));
8719 begin
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
8720 _("debug_abbrev section data"));
8724 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
8725 begin
+ sec
->sh_size
);
8731 while (tags
< start
)
8733 unsigned int bytes_read
;
8734 unsigned long abbrev_number
;
8735 abbrev_entry
*entry
;
8738 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
8741 /* A null DIE marks the end of a list of children. */
8742 if (abbrev_number
== 0)
8748 /* Scan through the abbreviation list until we reach the
8750 for (entry
= first_abbrev
;
8751 entry
&& entry
->entry
!= abbrev_number
;
8752 entry
= entry
->next
)
8757 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
8763 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
8765 (unsigned long) (tags
- section_begin
8768 get_TAG_name (entry
->tag
));
8773 need_base_address
= 0;
8775 case DW_TAG_compile_unit
:
8776 need_base_address
= 1;
8778 case DW_TAG_entry_point
:
8779 case DW_TAG_inlined_subroutine
:
8780 case DW_TAG_subprogram
:
8781 need_base_address
= 0;
8782 /* Assuming that there is no DW_AT_frame_base. */
8783 have_frame_base
= 0;
8787 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
8788 tags
= read_and_display_attr (attr
->attribute
,
8791 compunit
.cu_pointer_size
,
8793 compunit
.cu_version
,
8794 &debug_information
[unit
],
8797 if (entry
->children
)
8802 /* Set num_debug_info_entries here so that it can be used to check if
8803 we need to proecess .debug_loc and .debug_ranges sections. */
8804 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
8805 && num_debug_info_entries
== 0)
8806 num_debug_info_entries
= num_units
;
8810 free_debug_range ();
8820 /* Retrieve the pointer size associated with the given compilation unit.
8821 Optionally the offset of this unit into the .debug_info section is
8822 also retutned. If there is no .debug_info section then an error
8823 message is issued and 0 is returned. If the requested comp unit has
8824 not been defined in the .debug_info section then a warning message
8825 is issued and the last know pointer size is returned. This message
8826 is only issued once per section dumped per file dumped. */
8829 get_pointer_size_and_offset_of_comp_unit (unsigned int comp_unit
,
8830 const char * section_name
,
8831 unsigned long * offset_return
)
8833 unsigned long offset
= 0;
8835 if (num_debug_info_entries
== 0)
8836 error (_("%s section needs a populated .debug_info section\n"),
8839 else if (comp_unit
>= num_debug_info_entries
)
8841 if (!warned_about_missing_comp_units
)
8843 warn (_("%s section has more comp units than .debug_info section\n"),
8845 warn (_("assuming that the pointer size is %d, from the last comp unit in .debug_info\n\n"),
8847 warned_about_missing_comp_units
= TRUE
;
8852 last_pointer_size
= debug_information
[comp_unit
].pointer_size
;
8853 offset
= debug_information
[comp_unit
].cu_offset
;
8856 if (offset_return
!= NULL
)
8857 * offset_return
= offset
;
8859 return last_pointer_size
;
8862 /* Locate and scan the .debug_info section in the file and record the pointer
8863 sizes and offsets for the compilation units in it. Usually an executable
8864 will have just one pointer size, but this is not guaranteed, and so we try
8865 not to make any assumptions. Returns zero upon failure, or the number of
8866 compilation units upon success. */
8869 get_debug_info (FILE * file
)
8871 Elf_Internal_Shdr
* section
;
8872 unsigned char * start
;
8875 /* Reset the last pointer size so that we can issue correct error
8876 messages if we are displaying the contents of more than one section. */
8877 last_pointer_size
= 0;
8878 warned_about_missing_comp_units
= FALSE
;
8880 /* If we already have the information there is nothing else to do. */
8881 if (num_debug_info_entries
> 0)
8882 return num_debug_info_entries
;
8884 section
= find_section (".debug_info");
8885 if (section
== NULL
)
8888 start
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
8889 _("extracting information from .debug_info section"));
8893 ret
= process_debug_info (section
, start
, file
, 1);
8896 return ret
? num_debug_info_entries
: 0;
8900 display_debug_lines (Elf_Internal_Shdr
*section
,
8901 unsigned char *start
, FILE *file
)
8903 unsigned char *data
= start
;
8904 unsigned char *end
= start
+ section
->sh_size
;
8905 unsigned int comp_unit
= 0;
8907 printf (_("\nDump of debug contents of section %s:\n\n"),
8908 SECTION_NAME (section
));
8910 get_debug_info (file
);
8914 DWARF2_Internal_LineInfo info
;
8915 unsigned char *standard_opcodes
;
8916 unsigned char *end_of_sequence
;
8917 unsigned char *hdrptr
;
8918 unsigned int pointer_size
;
8919 int initial_length_size
;
8925 /* Check the length of the block. */
8926 info
.li_length
= byte_get (hdrptr
, 4);
8929 if (info
.li_length
== 0xffffffff)
8931 /* This section is 64-bit DWARF 3. */
8932 info
.li_length
= byte_get (hdrptr
, 8);
8935 initial_length_size
= 12;
8940 initial_length_size
= 4;
8943 if (info
.li_length
+ initial_length_size
> section
->sh_size
)
8946 (_("The line info appears to be corrupt - the section is too small\n"));
8950 /* Check its version number. */
8951 info
.li_version
= byte_get (hdrptr
, 2);
8953 if (info
.li_version
!= 2 && info
.li_version
!= 3)
8955 warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
8959 info
.li_prologue_length
= byte_get (hdrptr
, offset_size
);
8960 hdrptr
+= offset_size
;
8961 info
.li_min_insn_length
= byte_get (hdrptr
, 1);
8963 info
.li_default_is_stmt
= byte_get (hdrptr
, 1);
8965 info
.li_line_base
= byte_get (hdrptr
, 1);
8967 info
.li_line_range
= byte_get (hdrptr
, 1);
8969 info
.li_opcode_base
= byte_get (hdrptr
, 1);
8972 /* Sign extend the line base field. */
8973 info
.li_line_base
<<= 24;
8974 info
.li_line_base
>>= 24;
8976 /* Get the pointer size from the comp unit associated
8977 with this block of line number information. */
8978 pointer_size
= get_pointer_size_and_offset_of_comp_unit
8979 (comp_unit
, ".debug_lines", NULL
);
8982 printf (_(" Length: %ld\n"), info
.li_length
);
8983 printf (_(" DWARF Version: %d\n"), info
.li_version
);
8984 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
8985 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
8986 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
8987 printf (_(" Line Base: %d\n"), info
.li_line_base
);
8988 printf (_(" Line Range: %d\n"), info
.li_line_range
);
8989 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
8990 printf (_(" (Pointer size: %u)\n"), pointer_size
);
8992 end_of_sequence
= data
+ info
.li_length
+ initial_length_size
;
8994 reset_state_machine (info
.li_default_is_stmt
);
8996 /* Display the contents of the Opcodes table. */
8997 standard_opcodes
= hdrptr
;
8999 printf (_("\n Opcodes:\n"));
9001 for (i
= 1; i
< info
.li_opcode_base
; i
++)
9002 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
9004 /* Display the contents of the Directory table. */
9005 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
9008 printf (_("\n The Directory Table is empty.\n"));
9011 printf (_("\n The Directory Table:\n"));
9015 printf (_(" %s\n"), data
);
9017 data
+= strlen ((char *) data
) + 1;
9021 /* Skip the NUL at the end of the table. */
9024 /* Display the contents of the File Name table. */
9026 printf (_("\n The File Name Table is empty.\n"));
9029 printf (_("\n The File Name Table:\n"));
9030 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
9034 unsigned char *name
;
9035 unsigned int bytes_read
;
9037 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
9040 data
+= strlen ((char *) data
) + 1;
9042 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
9044 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
9046 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
9048 printf (_("%s\n"), name
);
9052 /* Skip the NUL at the end of the table. */
9055 /* Now display the statements. */
9056 printf (_("\n Line Number Statements:\n"));
9058 while (data
< end_of_sequence
)
9060 unsigned char op_code
;
9062 unsigned int bytes_read
;
9066 if (op_code
>= info
.li_opcode_base
)
9068 op_code
-= info
.li_opcode_base
;
9069 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
9070 state_machine_regs
.address
+= adv
;
9071 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
9072 op_code
, adv
, state_machine_regs
.address
);
9073 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
9074 state_machine_regs
.line
+= adv
;
9075 printf (_(" and Line by %d to %d\n"),
9076 adv
, state_machine_regs
.line
);
9078 else switch (op_code
)
9080 case DW_LNS_extended_op
:
9081 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
9086 printf (_(" Copy\n"));
9089 case DW_LNS_advance_pc
:
9090 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
9092 state_machine_regs
.address
+= adv
;
9093 printf (_(" Advance PC by %d to %lx\n"), adv
,
9094 state_machine_regs
.address
);
9097 case DW_LNS_advance_line
:
9098 adv
= read_leb128 (data
, & bytes_read
, 1);
9100 state_machine_regs
.line
+= adv
;
9101 printf (_(" Advance Line by %d to %d\n"), adv
,
9102 state_machine_regs
.line
);
9105 case DW_LNS_set_file
:
9106 adv
= read_leb128 (data
, & bytes_read
, 0);
9108 printf (_(" Set File Name to entry %d in the File Name Table\n"),
9110 state_machine_regs
.file
= adv
;
9113 case DW_LNS_set_column
:
9114 adv
= read_leb128 (data
, & bytes_read
, 0);
9116 printf (_(" Set column to %d\n"), adv
);
9117 state_machine_regs
.column
= adv
;
9120 case DW_LNS_negate_stmt
:
9121 adv
= state_machine_regs
.is_stmt
;
9123 printf (_(" Set is_stmt to %d\n"), adv
);
9124 state_machine_regs
.is_stmt
= adv
;
9127 case DW_LNS_set_basic_block
:
9128 printf (_(" Set basic block\n"));
9129 state_machine_regs
.basic_block
= 1;
9132 case DW_LNS_const_add_pc
:
9133 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
9134 * info
.li_min_insn_length
);
9135 state_machine_regs
.address
+= adv
;
9136 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
9137 state_machine_regs
.address
);
9140 case DW_LNS_fixed_advance_pc
:
9141 adv
= byte_get (data
, 2);
9143 state_machine_regs
.address
+= adv
;
9144 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
9145 adv
, state_machine_regs
.address
);
9148 case DW_LNS_set_prologue_end
:
9149 printf (_(" Set prologue_end to true\n"));
9152 case DW_LNS_set_epilogue_begin
:
9153 printf (_(" Set epilogue_begin to true\n"));
9156 case DW_LNS_set_isa
:
9157 adv
= read_leb128 (data
, & bytes_read
, 0);
9159 printf (_(" Set ISA to %d\n"), adv
);
9163 printf (_(" Unknown opcode %d with operands: "), op_code
);
9165 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
9167 printf ("0x%lx%s", read_leb128 (data
, &bytes_read
, 0),
9168 i
== 1 ? "" : ", ");
9182 display_debug_pubnames (Elf_Internal_Shdr
*section
,
9183 unsigned char *start
,
9184 FILE *file ATTRIBUTE_UNUSED
)
9186 DWARF2_Internal_PubNames pubnames
;
9189 end
= start
+ section
->sh_size
;
9191 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
9195 unsigned char *data
;
9196 unsigned long offset
;
9197 int offset_size
, initial_length_size
;
9201 pubnames
.pn_length
= byte_get (data
, 4);
9203 if (pubnames
.pn_length
== 0xffffffff)
9205 pubnames
.pn_length
= byte_get (data
, 8);
9208 initial_length_size
= 12;
9213 initial_length_size
= 4;
9216 pubnames
.pn_version
= byte_get (data
, 2);
9218 pubnames
.pn_offset
= byte_get (data
, offset_size
);
9219 data
+= offset_size
;
9220 pubnames
.pn_size
= byte_get (data
, offset_size
);
9221 data
+= offset_size
;
9223 start
+= pubnames
.pn_length
+ initial_length_size
;
9225 if (pubnames
.pn_version
!= 2 && pubnames
.pn_version
!= 3)
9227 static int warned
= 0;
9231 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
9238 printf (_(" Length: %ld\n"),
9239 pubnames
.pn_length
);
9240 printf (_(" Version: %d\n"),
9241 pubnames
.pn_version
);
9242 printf (_(" Offset into .debug_info section: %ld\n"),
9243 pubnames
.pn_offset
);
9244 printf (_(" Size of area in .debug_info section: %ld\n"),
9247 printf (_("\n Offset\tName\n"));
9251 offset
= byte_get (data
, offset_size
);
9255 data
+= offset_size
;
9256 printf (" %-6ld\t\t%s\n", offset
, data
);
9257 data
+= strlen ((char *) data
) + 1;
9260 while (offset
!= 0);
9268 display_debug_macinfo (Elf_Internal_Shdr
*section
,
9269 unsigned char *start
,
9270 FILE *file ATTRIBUTE_UNUSED
)
9272 unsigned char *end
= start
+ section
->sh_size
;
9273 unsigned char *curr
= start
;
9274 unsigned int bytes_read
;
9275 enum dwarf_macinfo_record_type op
;
9277 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
9281 unsigned int lineno
;
9289 case DW_MACINFO_start_file
:
9291 unsigned int filenum
;
9293 lineno
= read_leb128 (curr
, & bytes_read
, 0);
9295 filenum
= read_leb128 (curr
, & bytes_read
, 0);
9298 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
9303 case DW_MACINFO_end_file
:
9304 printf (_(" DW_MACINFO_end_file\n"));
9307 case DW_MACINFO_define
:
9308 lineno
= read_leb128 (curr
, & bytes_read
, 0);
9310 string
= (char *) curr
;
9311 curr
+= strlen (string
) + 1;
9312 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
9316 case DW_MACINFO_undef
:
9317 lineno
= read_leb128 (curr
, & bytes_read
, 0);
9319 string
= (char *) curr
;
9320 curr
+= strlen (string
) + 1;
9321 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
9325 case DW_MACINFO_vendor_ext
:
9327 unsigned int constant
;
9329 constant
= read_leb128 (curr
, & bytes_read
, 0);
9331 string
= (char *) curr
;
9332 curr
+= strlen (string
) + 1;
9333 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
9345 display_debug_abbrev (Elf_Internal_Shdr
*section
,
9346 unsigned char *start
,
9347 FILE *file ATTRIBUTE_UNUSED
)
9349 abbrev_entry
*entry
;
9350 unsigned char *end
= start
+ section
->sh_size
;
9352 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
9356 start
= process_abbrev_section (start
, end
);
9358 if (first_abbrev
== NULL
)
9361 printf (_(" Number TAG\n"));
9363 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
9367 printf (_(" %ld %s [%s]\n"),
9369 get_TAG_name (entry
->tag
),
9370 entry
->children
? _("has children") : _("no children"));
9372 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
9373 printf (_(" %-18s %s\n"),
9374 get_AT_name (attr
->attribute
),
9375 get_FORM_name (attr
->form
));
9388 display_debug_loc (Elf_Internal_Shdr
*section
,
9389 unsigned char *start
, FILE *file
)
9391 unsigned char *section_end
;
9392 unsigned long bytes
;
9393 unsigned char *section_begin
= start
;
9394 unsigned int num_loc_list
= 0;
9395 unsigned long last_offset
= 0;
9396 unsigned int first
= 0;
9399 int seen_first_offset
= 0;
9400 int use_debug_info
= 1;
9401 unsigned char *next
;
9403 bytes
= section
->sh_size
;
9404 section_end
= start
+ bytes
;
9408 printf (_("\nThe .debug_loc section is empty.\n"));
9412 get_debug_info (file
);
9414 /* Check the order of location list in .debug_info section. If
9415 offsets of location lists are in the ascending order, we can
9416 use `debug_information' directly. */
9417 for (i
= 0; i
< num_debug_info_entries
; i
++)
9421 num
= debug_information
[i
].num_loc_offsets
;
9422 num_loc_list
+= num
;
9424 /* Check if we can use `debug_information' directly. */
9425 if (use_debug_info
&& num
!= 0)
9427 if (!seen_first_offset
)
9429 /* This is the first location list. */
9430 last_offset
= debug_information
[i
].loc_offsets
[0];
9432 seen_first_offset
= 1;
9438 for (; j
< num
; j
++)
9441 debug_information
[i
].loc_offsets
[j
])
9446 last_offset
= debug_information
[i
].loc_offsets
[j
];
9451 if (!use_debug_info
)
9452 /* FIXME: Should we handle this case? */
9453 error (_("Location lists in .debug_info section aren't in ascending order!\n"));
9455 if (!seen_first_offset
)
9456 error (_("No location lists in .debug_info section!\n"));
9458 if (debug_information
[first
].loc_offsets
[0] != 0)
9459 warn (_("Location lists in .debug_loc section start at 0x%lx\n"),
9460 debug_information
[first
].loc_offsets
[0]);
9462 printf (_("Contents of the .debug_loc section:\n\n"));
9463 printf (_(" Offset Begin End Expression\n"));
9465 seen_first_offset
= 0;
9466 for (i
= first
; i
< num_debug_info_entries
; i
++)
9468 unsigned long begin
;
9470 unsigned short length
;
9471 unsigned long offset
;
9472 unsigned int pointer_size
;
9473 unsigned long cu_offset
;
9474 unsigned long base_address
;
9475 int need_frame_base
;
9478 pointer_size
= debug_information
[i
].pointer_size
;
9479 cu_offset
= debug_information
[i
].cu_offset
;
9481 for (j
= 0; j
< debug_information
[i
].num_loc_offsets
; j
++)
9483 has_frame_base
= debug_information
[i
].have_frame_base
[j
];
9484 offset
= debug_information
[i
].loc_offsets
[j
];
9485 next
= section_begin
+ offset
;
9486 base_address
= debug_information
[i
].base_address
;
9488 if (!seen_first_offset
)
9489 seen_first_offset
= 1;
9493 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"),
9494 start
- section_begin
, next
- section_begin
);
9495 else if (start
> next
)
9496 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"),
9497 start
- section_begin
, next
- section_begin
);
9503 begin
= byte_get (start
, pointer_size
);
9504 start
+= pointer_size
;
9505 end
= byte_get (start
, pointer_size
);
9506 start
+= pointer_size
;
9508 if (begin
== 0 && end
== 0)
9510 printf (_(" %8.8lx <End of list>\n"), offset
);
9514 /* Check base address specifiers. */
9515 if (begin
== -1UL && end
!= -1UL)
9518 printf (" %8.8lx %8.8lx %8.8lx (base address)\n",
9519 offset
, begin
, end
);
9523 length
= byte_get (start
, 2);
9526 printf (" %8.8lx %8.8lx %8.8lx (",
9527 offset
, begin
+ base_address
, end
+ base_address
);
9528 need_frame_base
= decode_location_expression (start
,
9534 if (need_frame_base
&& !has_frame_base
)
9535 printf (_(" [without DW_AT_frame_base]"));
9538 fputs (_(" (start == end)"), stdout
);
9539 else if (begin
> end
)
9540 fputs (_(" (start > end)"), stdout
);
9552 display_debug_str (Elf_Internal_Shdr
*section
,
9553 unsigned char *start
,
9554 FILE *file ATTRIBUTE_UNUSED
)
9556 unsigned long bytes
;
9559 addr
= section
->sh_addr
;
9560 bytes
= section
->sh_size
;
9564 printf (_("\nThe .debug_str section is empty.\n"));
9568 printf (_("Contents of the .debug_str section:\n\n"));
9576 lbytes
= (bytes
> 16 ? 16 : bytes
);
9578 printf (" 0x%8.8lx ", (unsigned long) addr
);
9580 for (j
= 0; j
< 16; j
++)
9583 printf ("%2.2x", start
[j
]);
9591 for (j
= 0; j
< lbytes
; j
++)
9594 if (k
>= ' ' && k
< 0x80)
9614 display_debug_info (Elf_Internal_Shdr
* section
,
9615 unsigned char * start
, FILE * file
)
9617 return process_debug_info (section
, start
, file
, 0);
9622 display_debug_aranges (Elf_Internal_Shdr
*section
,
9623 unsigned char *start
,
9624 FILE *file ATTRIBUTE_UNUSED
)
9626 unsigned char *end
= start
+ section
->sh_size
;
9628 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
9632 unsigned char *hdrptr
;
9633 DWARF2_Internal_ARange arange
;
9634 unsigned char *ranges
;
9635 unsigned long length
;
9636 unsigned long address
;
9639 int initial_length_size
;
9643 arange
.ar_length
= byte_get (hdrptr
, 4);
9646 if (arange
.ar_length
== 0xffffffff)
9648 arange
.ar_length
= byte_get (hdrptr
, 8);
9651 initial_length_size
= 12;
9656 initial_length_size
= 4;
9659 arange
.ar_version
= byte_get (hdrptr
, 2);
9662 arange
.ar_info_offset
= byte_get (hdrptr
, offset_size
);
9663 hdrptr
+= offset_size
;
9665 arange
.ar_pointer_size
= byte_get (hdrptr
, 1);
9668 arange
.ar_segment_size
= byte_get (hdrptr
, 1);
9671 if (arange
.ar_version
!= 2 && arange
.ar_version
!= 3)
9673 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
9677 printf (_(" Length: %ld\n"), arange
.ar_length
);
9678 printf (_(" Version: %d\n"), arange
.ar_version
);
9679 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
9680 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
9681 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
9683 printf (_("\n Address Length\n"));
9687 /* Must pad to an alignment boundary that is twice the pointer size. */
9688 excess
= (hdrptr
- start
) % (2 * arange
.ar_pointer_size
);
9690 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
9694 address
= byte_get (ranges
, arange
.ar_pointer_size
);
9696 ranges
+= arange
.ar_pointer_size
;
9698 length
= byte_get (ranges
, arange
.ar_pointer_size
);
9700 ranges
+= arange
.ar_pointer_size
;
9702 /* A pair of zeros marks the end of the list. */
9703 if (address
== 0 && length
== 0)
9706 printf (" %8.8lx %lu\n", address
, length
);
9709 start
+= arange
.ar_length
+ initial_length_size
;
9718 display_debug_ranges (Elf_Internal_Shdr
*section
,
9719 unsigned char *start
,
9720 FILE *file ATTRIBUTE_UNUSED
)
9722 unsigned char *section_end
;
9723 unsigned long bytes
;
9724 unsigned char *section_begin
= start
;
9725 unsigned int num_range_list
= 0;
9726 unsigned long last_offset
= 0;
9727 unsigned int first
= 0;
9730 int seen_first_offset
= 0;
9731 int use_debug_info
= 1;
9732 unsigned char *next
;
9734 bytes
= section
->sh_size
;
9735 section_end
= start
+ bytes
;
9739 printf (_("\nThe .debug_ranges section is empty.\n"));
9743 get_debug_info (file
);
9745 /* Check the order of range list in .debug_info section. If
9746 offsets of range lists are in the ascending order, we can
9747 use `debug_information' directly. */
9748 for (i
= 0; i
< num_debug_info_entries
; i
++)
9752 num
= debug_information
[i
].num_range_lists
;
9753 num_range_list
+= num
;
9755 /* Check if we can use `debug_information' directly. */
9756 if (use_debug_info
&& num
!= 0)
9758 if (!seen_first_offset
)
9760 /* This is the first range list. */
9761 last_offset
= debug_information
[i
].range_lists
[0];
9763 seen_first_offset
= 1;
9769 for (; j
< num
; j
++)
9772 debug_information
[i
].range_lists
[j
])
9777 last_offset
= debug_information
[i
].range_lists
[j
];
9782 if (!use_debug_info
)
9783 /* FIXME: Should we handle this case? */
9784 error (_("Range lists in .debug_info section aren't in ascending order!\n"));
9786 if (!seen_first_offset
)
9787 error (_("No range lists in .debug_info section!\n"));
9789 if (debug_information
[first
].range_lists
[0] != 0)
9790 warn (_("Range lists in .debug_ranges section start at 0x%lx\n"),
9791 debug_information
[first
].range_lists
[0]);
9793 printf (_("Contents of the .debug_ranges section:\n\n"));
9794 printf (_(" Offset Begin End\n"));
9796 seen_first_offset
= 0;
9797 for (i
= first
; i
< num_debug_info_entries
; i
++)
9799 unsigned long begin
;
9801 unsigned long offset
;
9802 unsigned int pointer_size
;
9803 unsigned long base_address
;
9805 pointer_size
= debug_information
[i
].pointer_size
;
9807 for (j
= 0; j
< debug_information
[i
].num_range_lists
; j
++)
9809 offset
= debug_information
[i
].range_lists
[j
];
9810 next
= section_begin
+ offset
;
9811 base_address
= debug_information
[i
].base_address
;
9813 if (!seen_first_offset
)
9814 seen_first_offset
= 1;
9818 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_ranges section.\n"),
9819 start
- section_begin
, next
- section_begin
);
9820 else if (start
> next
)
9821 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_ranges section.\n"),
9822 start
- section_begin
, next
- section_begin
);
9828 begin
= byte_get (start
, pointer_size
);
9829 start
+= pointer_size
;
9830 end
= byte_get (start
, pointer_size
);
9831 start
+= pointer_size
;
9833 if (begin
== 0 && end
== 0)
9836 /* Check base address specifiers. */
9837 if (begin
== -1UL && end
!= -1UL)
9840 printf (" %8.8lx %8.8lx %8.8lx (base address)\n",
9841 offset
, begin
, end
);
9845 printf (" %8.8lx %8.8lx %8.8lx",
9846 offset
, begin
+ base_address
, end
+ base_address
);
9849 fputs (_(" (start == end)"), stdout
);
9850 else if (begin
> end
)
9851 fputs (_(" (start > end)"), stdout
);
9855 fputs (_(" <End of list>\n"), stdout
);
9862 typedef struct Frame_Chunk
9864 struct Frame_Chunk
*next
;
9865 unsigned char *chunk_start
;
9867 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
9868 short int *col_type
;
9871 unsigned int code_factor
;
9873 unsigned long pc_begin
;
9874 unsigned long pc_range
;
9878 unsigned char fde_encoding
;
9879 unsigned char cfa_exp
;
9883 /* A marker for a col_type that means this column was never referenced
9884 in the frame info. */
9885 #define DW_CFA_unreferenced (-1)
9888 frame_need_space (Frame_Chunk
*fc
, int reg
)
9890 int prev
= fc
->ncols
;
9892 if (reg
< fc
->ncols
)
9895 fc
->ncols
= reg
+ 1;
9896 fc
->col_type
= xrealloc (fc
->col_type
, fc
->ncols
* sizeof (short int));
9897 fc
->col_offset
= xrealloc (fc
->col_offset
, fc
->ncols
* sizeof (int));
9899 while (prev
< fc
->ncols
)
9901 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
9902 fc
->col_offset
[prev
] = 0;
9908 frame_display_row (Frame_Chunk
*fc
, int *need_col_headers
, int *max_regs
)
9913 if (*max_regs
< fc
->ncols
)
9914 *max_regs
= fc
->ncols
;
9916 if (*need_col_headers
)
9918 *need_col_headers
= 0;
9920 printf (" LOC CFA ");
9922 for (r
= 0; r
< *max_regs
; r
++)
9923 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
9928 printf ("r%-4d", r
);
9934 printf ("%08lx ", fc
->pc_begin
);
9936 strcpy (tmp
, "exp");
9938 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
9939 printf ("%-8s ", tmp
);
9941 for (r
= 0; r
< fc
->ncols
; r
++)
9943 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
9945 switch (fc
->col_type
[r
])
9947 case DW_CFA_undefined
:
9950 case DW_CFA_same_value
:
9954 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
9956 case DW_CFA_register
:
9957 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
9959 case DW_CFA_expression
:
9960 strcpy (tmp
, "exp");
9963 strcpy (tmp
, "n/a");
9966 printf ("%-5s", tmp
);
9973 size_of_encoded_value (int encoding
)
9975 switch (encoding
& 0x7)
9978 case 0: return eh_addr_size
;
9986 get_encoded_value (unsigned char *data
, int encoding
)
9988 int size
= size_of_encoded_value (encoding
);
9989 if (encoding
& DW_EH_PE_signed
)
9990 return byte_get_signed (data
, size
);
9992 return byte_get (data
, size
);
9995 #define GET(N) byte_get (start, N); start += N
9996 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
9997 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
10000 display_debug_frames (Elf_Internal_Shdr
*section
,
10001 unsigned char *start
,
10002 FILE *file ATTRIBUTE_UNUSED
)
10004 unsigned char *end
= start
+ section
->sh_size
;
10005 unsigned char *section_start
= start
;
10006 Frame_Chunk
*chunks
= 0;
10007 Frame_Chunk
*remembered_state
= 0;
10009 int is_eh
= streq (SECTION_NAME (section
), ".eh_frame");
10010 unsigned int length_return
;
10013 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
10015 while (start
< end
)
10017 unsigned char *saved_start
;
10018 unsigned char *block_end
;
10019 unsigned long length
;
10020 unsigned long cie_id
;
10023 int need_col_headers
= 1;
10024 unsigned char *augmentation_data
= NULL
;
10025 unsigned long augmentation_data_len
= 0;
10026 int encoded_ptr_size
= eh_addr_size
;
10028 int initial_length_size
;
10030 saved_start
= start
;
10031 length
= byte_get (start
, 4); start
+= 4;
10035 printf ("\n%08lx ZERO terminator\n\n",
10036 (unsigned long)(saved_start
- section_start
));
10040 if (length
== 0xffffffff)
10042 length
= byte_get (start
, 8);
10045 initial_length_size
= 12;
10050 initial_length_size
= 4;
10053 block_end
= saved_start
+ length
+ initial_length_size
;
10054 cie_id
= byte_get (start
, offset_size
); start
+= offset_size
;
10056 if (elf_header
.e_type
== ET_REL
10057 && !debug_apply_rela_addends (file
, section
, offset_size
,
10058 section_start
, start
, block_end
))
10061 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
10065 fc
= xmalloc (sizeof (Frame_Chunk
));
10066 memset (fc
, 0, sizeof (Frame_Chunk
));
10070 fc
->chunk_start
= saved_start
;
10072 fc
->col_type
= xmalloc (sizeof (short int));
10073 fc
->col_offset
= xmalloc (sizeof (int));
10074 frame_need_space (fc
, max_regs
-1);
10076 version
= *start
++;
10078 fc
->augmentation
= (char *) start
;
10079 start
= (unsigned char *) strchr ((char *) start
, '\0') + 1;
10081 if (fc
->augmentation
[0] == 'z')
10083 fc
->code_factor
= LEB ();
10084 fc
->data_factor
= SLEB ();
10093 augmentation_data_len
= LEB ();
10094 augmentation_data
= start
;
10095 start
+= augmentation_data_len
;
10097 else if (streq (fc
->augmentation
, "eh"))
10099 start
+= eh_addr_size
;
10100 fc
->code_factor
= LEB ();
10101 fc
->data_factor
= SLEB ();
10113 fc
->code_factor
= LEB ();
10114 fc
->data_factor
= SLEB ();
10126 if (do_debug_frames_interp
)
10127 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
10128 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
10129 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
10133 printf ("\n%08lx %08lx %08lx CIE\n",
10134 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
10135 printf (" Version: %d\n", version
);
10136 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
10137 printf (" Code alignment factor: %u\n", fc
->code_factor
);
10138 printf (" Data alignment factor: %d\n", fc
->data_factor
);
10139 printf (" Return address column: %d\n", fc
->ra
);
10141 if (augmentation_data_len
)
10144 printf (" Augmentation data: ");
10145 for (i
= 0; i
< augmentation_data_len
; ++i
)
10146 printf (" %02x", augmentation_data
[i
]);
10152 if (augmentation_data_len
)
10154 unsigned char *p
, *q
;
10155 p
= (unsigned char *) fc
->augmentation
+ 1;
10156 q
= augmentation_data
;
10162 else if (*p
== 'P')
10163 q
+= 1 + size_of_encoded_value (*q
);
10164 else if (*p
== 'R')
10165 fc
->fde_encoding
= *q
++;
10171 if (fc
->fde_encoding
)
10172 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
10175 frame_need_space (fc
, fc
->ra
);
10179 unsigned char *look_for
;
10180 static Frame_Chunk fde_fc
;
10183 memset (fc
, 0, sizeof (Frame_Chunk
));
10185 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
10187 for (cie
= chunks
; cie
; cie
= cie
->next
)
10188 if (cie
->chunk_start
== look_for
)
10193 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
10194 cie_id
, saved_start
);
10197 fc
->col_type
= xmalloc (sizeof (short int));
10198 fc
->col_offset
= xmalloc (sizeof (int));
10199 frame_need_space (fc
, max_regs
- 1);
10201 fc
->augmentation
= "";
10202 fc
->fde_encoding
= 0;
10206 fc
->ncols
= cie
->ncols
;
10207 fc
->col_type
= xmalloc (fc
->ncols
* sizeof (short int));
10208 fc
->col_offset
= xmalloc (fc
->ncols
* sizeof (int));
10209 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
10210 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
10211 fc
->augmentation
= cie
->augmentation
;
10212 fc
->code_factor
= cie
->code_factor
;
10213 fc
->data_factor
= cie
->data_factor
;
10214 fc
->cfa_reg
= cie
->cfa_reg
;
10215 fc
->cfa_offset
= cie
->cfa_offset
;
10217 frame_need_space (fc
, max_regs
-1);
10218 fc
->fde_encoding
= cie
->fde_encoding
;
10221 if (fc
->fde_encoding
)
10222 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
10224 fc
->pc_begin
= get_encoded_value (start
, fc
->fde_encoding
);
10225 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
10226 /* Don't adjust for ET_REL since there's invariably a pcrel
10227 reloc here, which we haven't applied. */
10228 && elf_header
.e_type
!= ET_REL
)
10229 fc
->pc_begin
+= section
->sh_addr
+ (start
- section_start
);
10230 start
+= encoded_ptr_size
;
10231 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
10232 start
+= encoded_ptr_size
;
10234 if (cie
->augmentation
[0] == 'z')
10236 augmentation_data_len
= LEB ();
10237 augmentation_data
= start
;
10238 start
+= augmentation_data_len
;
10241 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
10242 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
10243 (unsigned long)(cie
->chunk_start
- section_start
),
10244 fc
->pc_begin
, fc
->pc_begin
+ fc
->pc_range
);
10245 if (! do_debug_frames_interp
&& augmentation_data_len
)
10249 printf (" Augmentation data: ");
10250 for (i
= 0; i
< augmentation_data_len
; ++i
)
10251 printf (" %02x", augmentation_data
[i
]);
10257 /* At this point, fc is the current chunk, cie (if any) is set, and
10258 we're about to interpret instructions for the chunk. */
10259 /* ??? At present we need to do this always, since this sizes the
10260 fc->col_type and fc->col_offset arrays, which we write into always.
10261 We should probably split the interpreted and non-interpreted bits
10262 into two different routines, since there's so much that doesn't
10263 really overlap between them. */
10264 if (1 || do_debug_frames_interp
)
10266 /* Start by making a pass over the chunk, allocating storage
10267 and taking note of what registers are used. */
10268 unsigned char *tmp
= start
;
10270 while (start
< block_end
)
10273 unsigned long reg
, tmp
;
10280 /* Warning: if you add any more cases to this switch, be
10281 sure to add them to the corresponding switch below. */
10284 case DW_CFA_advance_loc
:
10286 case DW_CFA_offset
:
10288 frame_need_space (fc
, opa
);
10289 fc
->col_type
[opa
] = DW_CFA_undefined
;
10291 case DW_CFA_restore
:
10292 frame_need_space (fc
, opa
);
10293 fc
->col_type
[opa
] = DW_CFA_undefined
;
10295 case DW_CFA_set_loc
:
10296 start
+= encoded_ptr_size
;
10298 case DW_CFA_advance_loc1
:
10301 case DW_CFA_advance_loc2
:
10304 case DW_CFA_advance_loc4
:
10307 case DW_CFA_offset_extended
:
10308 reg
= LEB (); LEB ();
10309 frame_need_space (fc
, reg
);
10310 fc
->col_type
[reg
] = DW_CFA_undefined
;
10312 case DW_CFA_restore_extended
:
10314 frame_need_space (fc
, reg
);
10315 fc
->col_type
[reg
] = DW_CFA_undefined
;
10317 case DW_CFA_undefined
:
10319 frame_need_space (fc
, reg
);
10320 fc
->col_type
[reg
] = DW_CFA_undefined
;
10322 case DW_CFA_same_value
:
10324 frame_need_space (fc
, reg
);
10325 fc
->col_type
[reg
] = DW_CFA_undefined
;
10327 case DW_CFA_register
:
10328 reg
= LEB (); LEB ();
10329 frame_need_space (fc
, reg
);
10330 fc
->col_type
[reg
] = DW_CFA_undefined
;
10332 case DW_CFA_def_cfa
:
10335 case DW_CFA_def_cfa_register
:
10338 case DW_CFA_def_cfa_offset
:
10341 case DW_CFA_def_cfa_expression
:
10345 case DW_CFA_expression
:
10349 frame_need_space (fc
, reg
);
10350 fc
->col_type
[reg
] = DW_CFA_undefined
;
10352 case DW_CFA_offset_extended_sf
:
10353 reg
= LEB (); SLEB ();
10354 frame_need_space (fc
, reg
);
10355 fc
->col_type
[reg
] = DW_CFA_undefined
;
10357 case DW_CFA_def_cfa_sf
:
10360 case DW_CFA_def_cfa_offset_sf
:
10363 case DW_CFA_MIPS_advance_loc8
:
10366 case DW_CFA_GNU_args_size
:
10369 case DW_CFA_GNU_negative_offset_extended
:
10370 reg
= LEB (); LEB ();
10371 frame_need_space (fc
, reg
);
10372 fc
->col_type
[reg
] = DW_CFA_undefined
;
10381 /* Now we know what registers are used, make a second pass over
10382 the chunk, this time actually printing out the info. */
10384 while (start
< block_end
)
10387 unsigned long ul
, reg
, roffs
;
10396 /* Warning: if you add any more cases to this switch, be
10397 sure to add them to the corresponding switch above. */
10400 case DW_CFA_advance_loc
:
10401 if (do_debug_frames_interp
)
10402 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10404 printf (" DW_CFA_advance_loc: %d to %08lx\n",
10405 opa
* fc
->code_factor
,
10406 fc
->pc_begin
+ opa
* fc
->code_factor
);
10407 fc
->pc_begin
+= opa
* fc
->code_factor
;
10410 case DW_CFA_offset
:
10412 if (! do_debug_frames_interp
)
10413 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
10414 opa
, roffs
* fc
->data_factor
);
10415 fc
->col_type
[opa
] = DW_CFA_offset
;
10416 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
10419 case DW_CFA_restore
:
10420 if (! do_debug_frames_interp
)
10421 printf (" DW_CFA_restore: r%d\n", opa
);
10422 fc
->col_type
[opa
] = cie
->col_type
[opa
];
10423 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
10426 case DW_CFA_set_loc
:
10427 vma
= get_encoded_value (start
, fc
->fde_encoding
);
10428 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
10429 && elf_header
.e_type
!= ET_REL
)
10430 vma
+= section
->sh_addr
+ (start
- section_start
);
10431 start
+= encoded_ptr_size
;
10432 if (do_debug_frames_interp
)
10433 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10435 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
10436 fc
->pc_begin
= vma
;
10439 case DW_CFA_advance_loc1
:
10440 ofs
= byte_get (start
, 1); start
+= 1;
10441 if (do_debug_frames_interp
)
10442 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10444 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
10445 ofs
* fc
->code_factor
,
10446 fc
->pc_begin
+ ofs
* fc
->code_factor
);
10447 fc
->pc_begin
+= ofs
* fc
->code_factor
;
10450 case DW_CFA_advance_loc2
:
10451 ofs
= byte_get (start
, 2); start
+= 2;
10452 if (do_debug_frames_interp
)
10453 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10455 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
10456 ofs
* fc
->code_factor
,
10457 fc
->pc_begin
+ ofs
* fc
->code_factor
);
10458 fc
->pc_begin
+= ofs
* fc
->code_factor
;
10461 case DW_CFA_advance_loc4
:
10462 ofs
= byte_get (start
, 4); start
+= 4;
10463 if (do_debug_frames_interp
)
10464 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10466 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
10467 ofs
* fc
->code_factor
,
10468 fc
->pc_begin
+ ofs
* fc
->code_factor
);
10469 fc
->pc_begin
+= ofs
* fc
->code_factor
;
10472 case DW_CFA_offset_extended
:
10475 if (! do_debug_frames_interp
)
10476 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
10477 reg
, roffs
* fc
->data_factor
);
10478 fc
->col_type
[reg
] = DW_CFA_offset
;
10479 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
10482 case DW_CFA_restore_extended
:
10484 if (! do_debug_frames_interp
)
10485 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
10486 fc
->col_type
[reg
] = cie
->col_type
[reg
];
10487 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
10490 case DW_CFA_undefined
:
10492 if (! do_debug_frames_interp
)
10493 printf (" DW_CFA_undefined: r%ld\n", reg
);
10494 fc
->col_type
[reg
] = DW_CFA_undefined
;
10495 fc
->col_offset
[reg
] = 0;
10498 case DW_CFA_same_value
:
10500 if (! do_debug_frames_interp
)
10501 printf (" DW_CFA_same_value: r%ld\n", reg
);
10502 fc
->col_type
[reg
] = DW_CFA_same_value
;
10503 fc
->col_offset
[reg
] = 0;
10506 case DW_CFA_register
:
10509 if (! do_debug_frames_interp
)
10510 printf (" DW_CFA_register: r%ld in r%ld\n", reg
, roffs
);
10511 fc
->col_type
[reg
] = DW_CFA_register
;
10512 fc
->col_offset
[reg
] = roffs
;
10515 case DW_CFA_remember_state
:
10516 if (! do_debug_frames_interp
)
10517 printf (" DW_CFA_remember_state\n");
10518 rs
= xmalloc (sizeof (Frame_Chunk
));
10519 rs
->ncols
= fc
->ncols
;
10520 rs
->col_type
= xmalloc (rs
->ncols
* sizeof (short int));
10521 rs
->col_offset
= xmalloc (rs
->ncols
* sizeof (int));
10522 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
10523 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
10524 rs
->next
= remembered_state
;
10525 remembered_state
= rs
;
10528 case DW_CFA_restore_state
:
10529 if (! do_debug_frames_interp
)
10530 printf (" DW_CFA_restore_state\n");
10531 rs
= remembered_state
;
10534 remembered_state
= rs
->next
;
10535 frame_need_space (fc
, rs
->ncols
-1);
10536 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
10537 memcpy (fc
->col_offset
, rs
->col_offset
,
10538 rs
->ncols
* sizeof (int));
10539 free (rs
->col_type
);
10540 free (rs
->col_offset
);
10543 else if (do_debug_frames_interp
)
10544 printf ("Mismatched DW_CFA_restore_state\n");
10547 case DW_CFA_def_cfa
:
10548 fc
->cfa_reg
= LEB ();
10549 fc
->cfa_offset
= LEB ();
10551 if (! do_debug_frames_interp
)
10552 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
10553 fc
->cfa_reg
, fc
->cfa_offset
);
10556 case DW_CFA_def_cfa_register
:
10557 fc
->cfa_reg
= LEB ();
10559 if (! do_debug_frames_interp
)
10560 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
10563 case DW_CFA_def_cfa_offset
:
10564 fc
->cfa_offset
= LEB ();
10565 if (! do_debug_frames_interp
)
10566 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
10570 if (! do_debug_frames_interp
)
10571 printf (" DW_CFA_nop\n");
10574 case DW_CFA_def_cfa_expression
:
10576 if (! do_debug_frames_interp
)
10578 printf (" DW_CFA_def_cfa_expression (");
10579 decode_location_expression (start
, eh_addr_size
, ul
, 0);
10586 case DW_CFA_expression
:
10589 if (! do_debug_frames_interp
)
10591 printf (" DW_CFA_expression: r%ld (", reg
);
10592 decode_location_expression (start
, eh_addr_size
, ul
, 0);
10595 fc
->col_type
[reg
] = DW_CFA_expression
;
10599 case DW_CFA_offset_extended_sf
:
10602 frame_need_space (fc
, reg
);
10603 if (! do_debug_frames_interp
)
10604 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
10605 reg
, l
* fc
->data_factor
);
10606 fc
->col_type
[reg
] = DW_CFA_offset
;
10607 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
10610 case DW_CFA_def_cfa_sf
:
10611 fc
->cfa_reg
= LEB ();
10612 fc
->cfa_offset
= SLEB ();
10614 if (! do_debug_frames_interp
)
10615 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
10616 fc
->cfa_reg
, fc
->cfa_offset
);
10619 case DW_CFA_def_cfa_offset_sf
:
10620 fc
->cfa_offset
= SLEB ();
10621 if (! do_debug_frames_interp
)
10622 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc
->cfa_offset
);
10625 case DW_CFA_MIPS_advance_loc8
:
10626 ofs
= byte_get (start
, 8); start
+= 8;
10627 if (do_debug_frames_interp
)
10628 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10630 printf (" DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
10631 ofs
* fc
->code_factor
,
10632 fc
->pc_begin
+ ofs
* fc
->code_factor
);
10633 fc
->pc_begin
+= ofs
* fc
->code_factor
;
10636 case DW_CFA_GNU_window_save
:
10637 if (! do_debug_frames_interp
)
10638 printf (" DW_CFA_GNU_window_save\n");
10641 case DW_CFA_GNU_args_size
:
10643 if (! do_debug_frames_interp
)
10644 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
10647 case DW_CFA_GNU_negative_offset_extended
:
10650 frame_need_space (fc
, reg
);
10651 if (! do_debug_frames_interp
)
10652 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
10653 reg
, l
* fc
->data_factor
);
10654 fc
->col_type
[reg
] = DW_CFA_offset
;
10655 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
10659 warn (_("unsupported or unknown DW_CFA_%d\n"), op
);
10664 if (do_debug_frames_interp
)
10665 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10680 display_debug_not_supported (Elf_Internal_Shdr
*section
,
10681 unsigned char *start ATTRIBUTE_UNUSED
,
10682 FILE *file ATTRIBUTE_UNUSED
)
10684 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
10685 SECTION_NAME (section
));
10690 /* A structure containing the name of a debug section
10691 and a pointer to a function that can decode it. */
10694 const char *const name
;
10695 int (*display
) (Elf_Internal_Shdr
*, unsigned char *, FILE *);
10699 { ".debug_abbrev", display_debug_abbrev
},
10700 { ".debug_aranges", display_debug_aranges
},
10701 { ".debug_frame", display_debug_frames
},
10702 { ".debug_info", display_debug_info
},
10703 { ".debug_line", display_debug_lines
},
10704 { ".debug_pubnames", display_debug_pubnames
},
10705 { ".eh_frame", display_debug_frames
},
10706 { ".debug_macinfo", display_debug_macinfo
},
10707 { ".debug_str", display_debug_str
},
10708 { ".debug_loc", display_debug_loc
},
10709 { ".debug_pubtypes", display_debug_pubnames
},
10710 { ".debug_ranges", display_debug_ranges
},
10711 { ".debug_static_func", display_debug_not_supported
},
10712 { ".debug_static_vars", display_debug_not_supported
},
10713 { ".debug_types", display_debug_not_supported
},
10714 { ".debug_weaknames", display_debug_not_supported
}
10718 display_debug_section (Elf_Internal_Shdr
*section
, FILE *file
)
10720 char *name
= SECTION_NAME (section
);
10721 bfd_size_type length
;
10725 length
= section
->sh_size
;
10728 printf (_("\nSection '%s' has no debugging data.\n"), name
);
10732 if (strneq (name
, ".gnu.linkonce.wi.", 17))
10733 name
= ".debug_info";
10735 /* See if we know how to display the contents of this section. */
10736 for (i
= NUM_ELEM (debug_displays
); i
--;)
10737 if (streq (debug_displays
[i
].name
, name
))
10739 unsigned char *start
;
10741 start
= get_data (NULL
, file
, section
->sh_offset
, length
,
10742 _("debug section data"));
10749 result
&= debug_displays
[i
].display (section
, start
, file
);
10752 /* If we loaded in the abbrev section
10753 at some point, we must release it here. */
10761 printf (_("Unrecognized debug section: %s\n"), name
);
10769 process_section_contents (FILE *file
)
10771 Elf_Internal_Shdr
*section
;
10777 for (i
= 0, section
= section_headers
;
10778 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
10781 #ifdef SUPPORT_DISASSEMBLY
10782 if (dump_sects
[i
] & DISASS_DUMP
)
10783 disassemble_section (section
, file
);
10785 if (dump_sects
[i
] & HEX_DUMP
)
10786 dump_section (section
, file
);
10788 if (dump_sects
[i
] & DEBUG_DUMP
)
10789 display_debug_section (section
, file
);
10792 /* Check to see if the user requested a
10793 dump of a section that does not exist. */
10794 while (i
++ < num_dump_sects
)
10796 warn (_("Section %d was not dumped because it does not exist!\n"), i
);
10800 process_mips_fpe_exception (int mask
)
10805 if (mask
& OEX_FPU_INEX
)
10806 fputs ("INEX", stdout
), first
= 0;
10807 if (mask
& OEX_FPU_UFLO
)
10808 printf ("%sUFLO", first
? "" : "|"), first
= 0;
10809 if (mask
& OEX_FPU_OFLO
)
10810 printf ("%sOFLO", first
? "" : "|"), first
= 0;
10811 if (mask
& OEX_FPU_DIV0
)
10812 printf ("%sDIV0", first
? "" : "|"), first
= 0;
10813 if (mask
& OEX_FPU_INVAL
)
10814 printf ("%sINVAL", first
? "" : "|");
10817 fputs ("0", stdout
);
10821 process_mips_specific (FILE *file
)
10823 Elf_Internal_Dyn
*entry
;
10824 size_t liblist_offset
= 0;
10825 size_t liblistno
= 0;
10826 size_t conflictsno
= 0;
10827 size_t options_offset
= 0;
10828 size_t conflicts_offset
= 0;
10830 /* We have a lot of special sections. Thanks SGI! */
10831 if (dynamic_section
== NULL
)
10832 /* No information available. */
10835 for (entry
= dynamic_section
; entry
->d_tag
!= DT_NULL
; ++entry
)
10836 switch (entry
->d_tag
)
10838 case DT_MIPS_LIBLIST
:
10840 = offset_from_vma (file
, entry
->d_un
.d_val
,
10841 liblistno
* sizeof (Elf32_External_Lib
));
10843 case DT_MIPS_LIBLISTNO
:
10844 liblistno
= entry
->d_un
.d_val
;
10846 case DT_MIPS_OPTIONS
:
10847 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
10849 case DT_MIPS_CONFLICT
:
10851 = offset_from_vma (file
, entry
->d_un
.d_val
,
10852 conflictsno
* sizeof (Elf32_External_Conflict
));
10854 case DT_MIPS_CONFLICTNO
:
10855 conflictsno
= entry
->d_un
.d_val
;
10861 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
10863 Elf32_External_Lib
*elib
;
10866 elib
= get_data (NULL
, file
, liblist_offset
,
10867 liblistno
* sizeof (Elf32_External_Lib
),
10871 printf ("\nSection '.liblist' contains %lu entries:\n",
10872 (unsigned long) liblistno
);
10873 fputs (" Library Time Stamp Checksum Version Flags\n",
10876 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
10883 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
10884 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
10885 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
10886 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
10887 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
10889 tmp
= gmtime (&time
);
10890 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
10891 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
10892 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
10894 printf ("%3lu: ", (unsigned long) cnt
);
10895 if (VALID_DYNAMIC_NAME (liblist
.l_name
))
10896 print_symbol (20, GET_DYNAMIC_NAME (liblist
.l_name
));
10898 printf ("<corrupt: %9ld>", liblist
.l_name
);
10899 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
10900 liblist
.l_version
);
10902 if (liblist
.l_flags
== 0)
10906 static const struct
10913 { " EXACT_MATCH", LL_EXACT_MATCH
},
10914 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
10915 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
10916 { " EXPORTS", LL_EXPORTS
},
10917 { " DELAY_LOAD", LL_DELAY_LOAD
},
10918 { " DELTA", LL_DELTA
}
10920 int flags
= liblist
.l_flags
;
10924 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
10926 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
10928 fputs (l_flags_vals
[fcnt
].name
, stdout
);
10929 flags
^= l_flags_vals
[fcnt
].bit
;
10932 printf (" %#x", (unsigned int) flags
);
10942 if (options_offset
!= 0)
10944 Elf_External_Options
*eopt
;
10945 Elf_Internal_Shdr
*sect
= section_headers
;
10946 Elf_Internal_Options
*iopt
;
10947 Elf_Internal_Options
*option
;
10951 /* Find the section header so that we get the size. */
10952 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
10955 eopt
= get_data (NULL
, file
, options_offset
, sect
->sh_size
,
10959 iopt
= malloc ((sect
->sh_size
/ sizeof (eopt
)) * sizeof (*iopt
));
10962 error (_("Out of memory"));
10969 while (offset
< sect
->sh_size
)
10971 Elf_External_Options
*eoption
;
10973 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
10975 option
->kind
= BYTE_GET (eoption
->kind
);
10976 option
->size
= BYTE_GET (eoption
->size
);
10977 option
->section
= BYTE_GET (eoption
->section
);
10978 option
->info
= BYTE_GET (eoption
->info
);
10980 offset
+= option
->size
;
10986 printf (_("\nSection '%s' contains %d entries:\n"),
10987 SECTION_NAME (sect
), cnt
);
10995 switch (option
->kind
)
10998 /* This shouldn't happen. */
10999 printf (" NULL %d %lx", option
->section
, option
->info
);
11002 printf (" REGINFO ");
11003 if (elf_header
.e_machine
== EM_MIPS
)
11006 Elf32_External_RegInfo
*ereg
;
11007 Elf32_RegInfo reginfo
;
11009 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
11010 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
11011 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
11012 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
11013 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
11014 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
11015 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
11017 printf ("GPR %08lx GP 0x%lx\n",
11018 reginfo
.ri_gprmask
,
11019 (unsigned long) reginfo
.ri_gp_value
);
11020 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11021 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
11022 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
11027 Elf64_External_RegInfo
*ereg
;
11028 Elf64_Internal_RegInfo reginfo
;
11030 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
11031 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
11032 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
11033 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
11034 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
11035 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
11036 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
11038 printf ("GPR %08lx GP 0x",
11039 reginfo
.ri_gprmask
);
11040 printf_vma (reginfo
.ri_gp_value
);
11043 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11044 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
11045 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
11049 case ODK_EXCEPTIONS
:
11050 fputs (" EXCEPTIONS fpe_min(", stdout
);
11051 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
11052 fputs (") fpe_max(", stdout
);
11053 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
11054 fputs (")", stdout
);
11056 if (option
->info
& OEX_PAGE0
)
11057 fputs (" PAGE0", stdout
);
11058 if (option
->info
& OEX_SMM
)
11059 fputs (" SMM", stdout
);
11060 if (option
->info
& OEX_FPDBUG
)
11061 fputs (" FPDBUG", stdout
);
11062 if (option
->info
& OEX_DISMISS
)
11063 fputs (" DISMISS", stdout
);
11066 fputs (" PAD ", stdout
);
11067 if (option
->info
& OPAD_PREFIX
)
11068 fputs (" PREFIX", stdout
);
11069 if (option
->info
& OPAD_POSTFIX
)
11070 fputs (" POSTFIX", stdout
);
11071 if (option
->info
& OPAD_SYMBOL
)
11072 fputs (" SYMBOL", stdout
);
11075 fputs (" HWPATCH ", stdout
);
11076 if (option
->info
& OHW_R4KEOP
)
11077 fputs (" R4KEOP", stdout
);
11078 if (option
->info
& OHW_R8KPFETCH
)
11079 fputs (" R8KPFETCH", stdout
);
11080 if (option
->info
& OHW_R5KEOP
)
11081 fputs (" R5KEOP", stdout
);
11082 if (option
->info
& OHW_R5KCVTL
)
11083 fputs (" R5KCVTL", stdout
);
11086 fputs (" FILL ", stdout
);
11087 /* XXX Print content of info word? */
11090 fputs (" TAGS ", stdout
);
11091 /* XXX Print content of info word? */
11094 fputs (" HWAND ", stdout
);
11095 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
11096 fputs (" R4KEOP_CHECKED", stdout
);
11097 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
11098 fputs (" R4KEOP_CLEAN", stdout
);
11101 fputs (" HWOR ", stdout
);
11102 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
11103 fputs (" R4KEOP_CHECKED", stdout
);
11104 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
11105 fputs (" R4KEOP_CLEAN", stdout
);
11108 printf (" GP_GROUP %#06lx self-contained %#06lx",
11109 option
->info
& OGP_GROUP
,
11110 (option
->info
& OGP_SELF
) >> 16);
11113 printf (" IDENT %#06lx self-contained %#06lx",
11114 option
->info
& OGP_GROUP
,
11115 (option
->info
& OGP_SELF
) >> 16);
11118 /* This shouldn't happen. */
11119 printf (" %3d ??? %d %lx",
11120 option
->kind
, option
->section
, option
->info
);
11124 len
= sizeof (*eopt
);
11125 while (len
< option
->size
)
11126 if (((char *) option
)[len
] >= ' '
11127 && ((char *) option
)[len
] < 0x7f)
11128 printf ("%c", ((char *) option
)[len
++]);
11130 printf ("\\%03o", ((char *) option
)[len
++]);
11132 fputs ("\n", stdout
);
11140 if (conflicts_offset
!= 0 && conflictsno
!= 0)
11142 Elf32_Conflict
*iconf
;
11145 if (dynamic_symbols
== NULL
)
11147 error (_("conflict list found without a dynamic symbol table"));
11151 iconf
= malloc (conflictsno
* sizeof (*iconf
));
11154 error (_("Out of memory"));
11160 Elf32_External_Conflict
*econf32
;
11162 econf32
= get_data (NULL
, file
, conflicts_offset
,
11163 conflictsno
* sizeof (*econf32
), _("conflict"));
11167 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
11168 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
11174 Elf64_External_Conflict
*econf64
;
11176 econf64
= get_data (NULL
, file
, conflicts_offset
,
11177 conflictsno
* sizeof (*econf64
), _("conflict"));
11181 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
11182 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
11187 printf (_("\nSection '.conflict' contains %lu entries:\n"),
11188 (unsigned long) conflictsno
);
11189 puts (_(" Num: Index Value Name"));
11191 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
11193 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
11195 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
11196 print_vma (psym
->st_value
, FULL_HEX
);
11198 if (VALID_DYNAMIC_NAME (psym
->st_name
))
11199 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
11201 printf ("<corrupt: %14ld>", psym
->st_name
);
11212 process_gnu_liblist (FILE *file
)
11214 Elf_Internal_Shdr
*section
, *string_sec
;
11215 Elf32_External_Lib
*elib
;
11223 for (i
= 0, section
= section_headers
;
11224 i
< elf_header
.e_shnum
;
11227 switch (section
->sh_type
)
11229 case SHT_GNU_LIBLIST
:
11230 elib
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
11235 string_sec
= SECTION_HEADER (section
->sh_link
);
11237 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
11238 string_sec
->sh_size
, _("liblist string table"));
11241 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
11247 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
11248 SECTION_NAME (section
),
11249 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
11251 puts (" Library Time Stamp Checksum Version Flags");
11253 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
11261 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
11262 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
11263 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
11264 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
11265 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
11267 tmp
= gmtime (&time
);
11268 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
11269 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
11270 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
11272 printf ("%3lu: ", (unsigned long) cnt
);
11274 printf ("%-20s", strtab
+ liblist
.l_name
);
11276 printf ("%-20.20s", strtab
+ liblist
.l_name
);
11277 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
11278 liblist
.l_version
, liblist
.l_flags
);
11288 static const char *
11289 get_note_type (unsigned e_type
)
11291 static char buff
[64];
11293 if (elf_header
.e_type
== ET_CORE
)
11297 return _("NT_AUXV (auxiliary vector)");
11299 return _("NT_PRSTATUS (prstatus structure)");
11301 return _("NT_FPREGSET (floating point registers)");
11303 return _("NT_PRPSINFO (prpsinfo structure)");
11304 case NT_TASKSTRUCT
:
11305 return _("NT_TASKSTRUCT (task structure)");
11307 return _("NT_PRXFPREG (user_xfpregs structure)");
11309 return _("NT_PSTATUS (pstatus structure)");
11311 return _("NT_FPREGS (floating point registers)");
11313 return _("NT_PSINFO (psinfo structure)");
11315 return _("NT_LWPSTATUS (lwpstatus_t structure)");
11317 return _("NT_LWPSINFO (lwpsinfo_t structure)");
11318 case NT_WIN32PSTATUS
:
11319 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
11327 return _("NT_VERSION (version)");
11329 return _("NT_ARCH (architecture)");
11334 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
11338 static const char *
11339 get_netbsd_elfcore_note_type (unsigned e_type
)
11341 static char buff
[64];
11343 if (e_type
== NT_NETBSDCORE_PROCINFO
)
11345 /* NetBSD core "procinfo" structure. */
11346 return _("NetBSD procinfo structure");
11349 /* As of Jan 2002 there are no other machine-independent notes
11350 defined for NetBSD core files. If the note type is less
11351 than the start of the machine-dependent note types, we don't
11354 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
11356 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
11360 switch (elf_header
.e_machine
)
11362 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
11363 and PT_GETFPREGS == mach+2. */
11368 case EM_SPARC32PLUS
:
11372 case NT_NETBSDCORE_FIRSTMACH
+0:
11373 return _("PT_GETREGS (reg structure)");
11374 case NT_NETBSDCORE_FIRSTMACH
+2:
11375 return _("PT_GETFPREGS (fpreg structure)");
11381 /* On all other arch's, PT_GETREGS == mach+1 and
11382 PT_GETFPREGS == mach+3. */
11386 case NT_NETBSDCORE_FIRSTMACH
+1:
11387 return _("PT_GETREGS (reg structure)");
11388 case NT_NETBSDCORE_FIRSTMACH
+3:
11389 return _("PT_GETFPREGS (fpreg structure)");
11395 sprintf (buff
, _("PT_FIRSTMACH+%d"), e_type
- NT_NETBSDCORE_FIRSTMACH
);
11399 /* Note that by the ELF standard, the name field is already null byte
11400 terminated, and namesz includes the terminating null byte.
11401 I.E. the value of namesz for the name "FSF" is 4.
11403 If the value of namesz is zero, there is no name present. */
11405 process_note (Elf_Internal_Note
*pnote
)
11409 if (pnote
->namesz
== 0)
11410 /* If there is no note name, then use the default set of
11411 note type strings. */
11412 nt
= get_note_type (pnote
->type
);
11414 else if (strneq (pnote
->namedata
, "NetBSD-CORE", 11))
11415 /* NetBSD-specific core file notes. */
11416 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
11419 /* Don't recognize this note name; just use the default set of
11420 note type strings. */
11421 nt
= get_note_type (pnote
->type
);
11423 printf (" %s\t\t0x%08lx\t%s\n",
11424 pnote
->namesz
? pnote
->namedata
: "(NONE)",
11425 pnote
->descsz
, nt
);
11431 process_corefile_note_segment (FILE *file
, bfd_vma offset
, bfd_vma length
)
11433 Elf_External_Note
*pnotes
;
11434 Elf_External_Note
*external
;
11440 pnotes
= get_data (NULL
, file
, offset
, length
, _("notes"));
11446 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
11447 (unsigned long) offset
, (unsigned long) length
);
11448 printf (_(" Owner\t\tData size\tDescription\n"));
11450 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
11452 Elf_External_Note
*next
;
11453 Elf_Internal_Note inote
;
11456 inote
.type
= BYTE_GET (external
->type
);
11457 inote
.namesz
= BYTE_GET (external
->namesz
);
11458 inote
.namedata
= external
->name
;
11459 inote
.descsz
= BYTE_GET (external
->descsz
);
11460 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
11461 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
11463 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
11465 if (((char *) next
) > (((char *) pnotes
) + length
))
11467 warn (_("corrupt note found at offset %x into core notes\n"),
11468 ((char *) external
) - ((char *) pnotes
));
11469 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
11470 inote
.type
, inote
.namesz
, inote
.descsz
);
11476 /* Verify that name is null terminated. It appears that at least
11477 one version of Linux (RedHat 6.0) generates corefiles that don't
11478 comply with the ELF spec by failing to include the null byte in
11480 if (inote
.namedata
[inote
.namesz
] != '\0')
11482 temp
= malloc (inote
.namesz
+ 1);
11486 error (_("Out of memory\n"));
11491 strncpy (temp
, inote
.namedata
, inote
.namesz
);
11492 temp
[inote
.namesz
] = 0;
11494 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
11495 inote
.namedata
= temp
;
11498 res
&= process_note (& inote
);
11513 process_corefile_note_segments (FILE *file
)
11515 Elf_Internal_Phdr
*segment
;
11519 if (! get_program_headers (file
))
11522 for (i
= 0, segment
= program_headers
;
11523 i
< elf_header
.e_phnum
;
11526 if (segment
->p_type
== PT_NOTE
)
11527 res
&= process_corefile_note_segment (file
,
11528 (bfd_vma
) segment
->p_offset
,
11529 (bfd_vma
) segment
->p_filesz
);
11536 process_note_sections (FILE *file
)
11538 Elf_Internal_Shdr
*section
;
11542 for (i
= 0, section
= section_headers
;
11543 i
< elf_header
.e_shnum
;
11545 if (section
->sh_type
== SHT_NOTE
)
11546 res
&= process_corefile_note_segment (file
,
11547 (bfd_vma
) section
->sh_offset
,
11548 (bfd_vma
) section
->sh_size
);
11554 process_notes (FILE *file
)
11556 /* If we have not been asked to display the notes then do nothing. */
11560 if (elf_header
.e_type
!= ET_CORE
)
11561 return process_note_sections (file
);
11563 /* No program headers means no NOTE segment. */
11564 if (elf_header
.e_phnum
> 0)
11565 return process_corefile_note_segments (file
);
11567 printf (_("No note segments present in the core file.\n"));
11572 process_arch_specific (FILE *file
)
11577 switch (elf_header
.e_machine
)
11580 case EM_MIPS_RS3_LE
:
11581 return process_mips_specific (file
);
11590 get_file_header (FILE *file
)
11592 /* Read in the identity array. */
11593 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
11596 /* Determine how to read the rest of the header. */
11597 switch (elf_header
.e_ident
[EI_DATA
])
11599 default: /* fall through */
11600 case ELFDATANONE
: /* fall through */
11602 byte_get
= byte_get_little_endian
;
11603 byte_put
= byte_put_little_endian
;
11606 byte_get
= byte_get_big_endian
;
11607 byte_put
= byte_put_big_endian
;
11611 /* For now we only support 32 bit and 64 bit ELF files. */
11612 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
11614 /* Read in the rest of the header. */
11617 Elf32_External_Ehdr ehdr32
;
11619 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
11622 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
11623 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
11624 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
11625 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
11626 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
11627 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
11628 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
11629 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
11630 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
11631 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
11632 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
11633 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
11634 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
11638 Elf64_External_Ehdr ehdr64
;
11640 /* If we have been compiled with sizeof (bfd_vma) == 4, then
11641 we will not be able to cope with the 64bit data found in
11642 64 ELF files. Detect this now and abort before we start
11643 overwriting things. */
11644 if (sizeof (bfd_vma
) < 8)
11646 error (_("This instance of readelf has been built without support for a\n\
11647 64 bit data type and so it cannot read 64 bit ELF files.\n"));
11651 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
11654 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
11655 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
11656 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
11657 elf_header
.e_entry
= BYTE_GET (ehdr64
.e_entry
);
11658 elf_header
.e_phoff
= BYTE_GET (ehdr64
.e_phoff
);
11659 elf_header
.e_shoff
= BYTE_GET (ehdr64
.e_shoff
);
11660 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
11661 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
11662 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
11663 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
11664 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
11665 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
11666 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
11669 if (elf_header
.e_shoff
)
11671 /* There may be some extensions in the first section header. Don't
11672 bomb if we can't read it. */
11674 get_32bit_section_headers (file
, 1);
11676 get_64bit_section_headers (file
, 1);
11682 /* Process one ELF object file according to the command line options.
11683 This file may actually be stored in an archive. The file is
11684 positioned at the start of the ELF object. */
11687 process_object (char *file_name
, FILE *file
)
11691 if (! get_file_header (file
))
11693 error (_("%s: Failed to read file header\n"), file_name
);
11697 /* Initialise per file variables. */
11698 for (i
= NUM_ELEM (version_info
); i
--;)
11699 version_info
[i
] = 0;
11701 for (i
= NUM_ELEM (dynamic_info
); i
--;)
11702 dynamic_info
[i
] = 0;
11704 /* Process the file. */
11706 printf (_("\nFile: %s\n"), file_name
);
11708 /* Initialise the dump_sects array from the cmdline_dump_sects array.
11709 Note we do this even if cmdline_dump_sects is empty because we
11710 must make sure that the dump_sets array is zeroed out before each
11711 object file is processed. */
11712 if (num_dump_sects
> num_cmdline_dump_sects
)
11713 memset (dump_sects
, 0, num_dump_sects
);
11715 if (num_cmdline_dump_sects
> 0)
11717 if (num_dump_sects
== 0)
11718 /* A sneaky way of allocating the dump_sects array. */
11719 request_dump (num_cmdline_dump_sects
, 0);
11721 assert (num_dump_sects
>= num_cmdline_dump_sects
);
11722 memcpy (dump_sects
, cmdline_dump_sects
, num_cmdline_dump_sects
);
11725 if (! process_file_header ())
11728 if (! process_section_headers (file
))
11730 /* Without loaded section headers we cannot process lots of
11732 do_unwind
= do_version
= do_dump
= do_arch
= 0;
11734 if (! do_using_dynamic
)
11735 do_syms
= do_reloc
= 0;
11738 if (! process_section_groups (file
))
11740 /* Without loaded section groups we cannot process unwind. */
11744 if (process_program_headers (file
))
11745 process_dynamic_section (file
);
11747 process_relocs (file
);
11749 process_unwind (file
);
11751 process_symbol_table (file
);
11753 process_syminfo (file
);
11755 process_version_sections (file
);
11757 process_section_contents (file
);
11759 process_notes (file
);
11761 process_gnu_liblist (file
);
11763 process_arch_specific (file
);
11765 if (program_headers
)
11767 free (program_headers
);
11768 program_headers
= NULL
;
11771 if (section_headers
)
11773 free (section_headers
);
11774 section_headers
= NULL
;
11779 free (string_table
);
11780 string_table
= NULL
;
11781 string_table_length
= 0;
11784 if (dynamic_strings
)
11786 free (dynamic_strings
);
11787 dynamic_strings
= NULL
;
11788 dynamic_strings_length
= 0;
11791 if (dynamic_symbols
)
11793 free (dynamic_symbols
);
11794 dynamic_symbols
= NULL
;
11795 num_dynamic_syms
= 0;
11798 if (dynamic_syminfo
)
11800 free (dynamic_syminfo
);
11801 dynamic_syminfo
= NULL
;
11804 if (section_headers_groups
)
11806 free (section_headers_groups
);
11807 section_headers_groups
= NULL
;
11810 if (section_groups
)
11812 struct group_list
*g
, *next
;
11814 for (i
= 0; i
< group_count
; i
++)
11816 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
11823 free (section_groups
);
11824 section_groups
= NULL
;
11827 if (debug_information
)
11829 for (i
= 0; i
< num_debug_info_entries
; i
++)
11831 if (!debug_information
[i
].max_loc_offsets
)
11833 free (debug_information
[i
].loc_offsets
);
11834 free (debug_information
[i
].have_frame_base
);
11836 if (!debug_information
[i
].max_range_lists
)
11837 free (debug_information
[i
].range_lists
);
11839 free (debug_information
);
11840 debug_information
= NULL
;
11841 num_debug_info_entries
= 0;
11847 /* Process an ELF archive. The file is positioned just after the
11851 process_archive (char *file_name
, FILE *file
)
11853 struct ar_hdr arhdr
;
11855 unsigned long size
;
11856 char *longnames
= NULL
;
11857 unsigned long longnames_size
= 0;
11858 size_t file_name_size
;
11863 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
11864 if (got
!= sizeof arhdr
)
11869 error (_("%s: failed to read archive header\n"), file_name
);
11873 if (memcmp (arhdr
.ar_name
, "/ ", 16) == 0)
11875 /* This is the archive symbol table. Skip it.
11876 FIXME: We should have an option to dump it. */
11877 size
= strtoul (arhdr
.ar_size
, NULL
, 10);
11878 if (fseek (file
, size
+ (size
& 1), SEEK_CUR
) != 0)
11880 error (_("%s: failed to skip archive symbol table\n"), file_name
);
11884 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
11885 if (got
!= sizeof arhdr
)
11890 error (_("%s: failed to read archive header\n"), file_name
);
11895 if (memcmp (arhdr
.ar_name
, "// ", 16) == 0)
11897 /* This is the archive string table holding long member
11900 longnames_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
11902 longnames
= malloc (longnames_size
);
11903 if (longnames
== NULL
)
11905 error (_("Out of memory\n"));
11909 if (fread (longnames
, longnames_size
, 1, file
) != 1)
11912 error (_("%s: failed to read string table\n"), file_name
);
11916 if ((longnames_size
& 1) != 0)
11919 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
11920 if (got
!= sizeof arhdr
)
11927 error (_("%s: failed to read archive header\n"), file_name
);
11932 file_name_size
= strlen (file_name
);
11941 if (arhdr
.ar_name
[0] == '/')
11945 off
= strtoul (arhdr
.ar_name
+ 1, NULL
, 10);
11946 if (off
>= longnames_size
)
11948 error (_("%s: invalid archive string table offset %lu\n"), off
);
11953 name
= longnames
+ off
;
11954 nameend
= memchr (name
, '/', longnames_size
- off
);
11958 name
= arhdr
.ar_name
;
11959 nameend
= memchr (name
, '/', 16);
11962 if (nameend
== NULL
)
11964 error (_("%s: bad archive file name\n"));
11969 namealc
= malloc (file_name_size
+ (nameend
- name
) + 3);
11970 if (namealc
== NULL
)
11972 error (_("Out of memory\n"));
11977 memcpy (namealc
, file_name
, file_name_size
);
11978 namealc
[file_name_size
] = '(';
11979 memcpy (namealc
+ file_name_size
+ 1, name
, nameend
- name
);
11980 namealc
[file_name_size
+ 1 + (nameend
- name
)] = ')';
11981 namealc
[file_name_size
+ 2 + (nameend
- name
)] = '\0';
11983 archive_file_offset
= ftell (file
);
11984 archive_file_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
11986 ret
|= process_object (namealc
, file
);
11991 (archive_file_offset
11992 + archive_file_size
11993 + (archive_file_size
& 1)),
11996 error (_("%s: failed to seek to next archive header\n"), file_name
);
12001 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
12002 if (got
!= sizeof arhdr
)
12007 error (_("%s: failed to read archive header\n"), file_name
);
12013 if (longnames
!= 0)
12020 process_file (char *file_name
)
12023 struct stat statbuf
;
12024 char armag
[SARMAG
];
12027 if (stat (file_name
, &statbuf
) < 0)
12029 if (errno
== ENOENT
)
12030 error (_("'%s': No such file\n"), file_name
);
12032 error (_("Could not locate '%s'. System error message: %s\n"),
12033 file_name
, strerror (errno
));
12037 if (! S_ISREG (statbuf
.st_mode
))
12039 error (_("'%s' is not an ordinary file\n"), file_name
);
12043 file
= fopen (file_name
, "rb");
12046 error (_("Input file '%s' is not readable.\n"), file_name
);
12050 if (fread (armag
, SARMAG
, 1, file
) != 1)
12052 error (_("%s: Failed to read file header\n"), file_name
);
12057 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
12058 ret
= process_archive (file_name
, file
);
12062 archive_file_size
= archive_file_offset
= 0;
12063 ret
= process_object (file_name
, file
);
12071 #ifdef SUPPORT_DISASSEMBLY
12072 /* Needed by the i386 disassembler. For extra credit, someone could
12073 fix this so that we insert symbolic addresses here, esp for GOT/PLT
12077 print_address (unsigned int addr
, FILE *outfile
)
12079 fprintf (outfile
,"0x%8.8x", addr
);
12082 /* Needed by the i386 disassembler. */
12084 db_task_printsym (unsigned int addr
)
12086 print_address (addr
, stderr
);
12091 main (int argc
, char **argv
)
12095 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
12096 setlocale (LC_MESSAGES
, "");
12098 #if defined (HAVE_SETLOCALE)
12099 setlocale (LC_CTYPE
, "");
12101 bindtextdomain (PACKAGE
, LOCALEDIR
);
12102 textdomain (PACKAGE
);
12104 parse_args (argc
, argv
);
12106 if (num_dump_sects
> 0)
12108 /* Make a copy of the dump_sects array. */
12109 cmdline_dump_sects
= malloc (num_dump_sects
);
12110 if (cmdline_dump_sects
== NULL
)
12111 error (_("Out of memory allocating dump request table."));
12114 memcpy (cmdline_dump_sects
, dump_sects
, num_dump_sects
);
12115 num_cmdline_dump_sects
= num_dump_sects
;
12119 if (optind
< (argc
- 1))
12123 while (optind
< argc
)
12124 err
|= process_file (argv
[optind
++]);
12126 if (dump_sects
!= NULL
)
12128 if (cmdline_dump_sects
!= NULL
)
12129 free (cmdline_dump_sects
);