1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004
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
;
127 unsigned long string_table_length
;
128 unsigned long num_dynamic_syms
;
129 Elf_Internal_Sym
*dynamic_symbols
;
130 Elf_Internal_Syminfo
*dynamic_syminfo
;
131 unsigned long dynamic_syminfo_offset
;
132 unsigned int dynamic_syminfo_nent
;
133 char program_interpreter
[64];
134 bfd_vma dynamic_info
[DT_JMPREL
+ 1];
135 bfd_vma version_info
[16];
136 Elf_Internal_Ehdr elf_header
;
137 Elf_Internal_Shdr
*section_headers
;
138 Elf_Internal_Phdr
*program_headers
;
139 Elf_Internal_Dyn
*dynamic_section
;
140 Elf_Internal_Shdr
*symtab_shndx_hdr
;
146 int do_section_groups
;
149 int do_using_dynamic
;
157 int do_debug_abbrevs
;
159 int do_debug_pubnames
;
160 int do_debug_aranges
;
162 int do_debug_frames_interp
;
163 int do_debug_macinfo
;
172 struct group_list
*next
;
173 unsigned int section_index
;
178 struct group_list
*root
;
179 unsigned int group_index
;
182 struct group
*section_groups
;
183 size_t group_count
= 0;
185 struct group
**section_headers_groups
;
187 /* A dynamic array of flags indicating which sections require dumping. */
188 char *dump_sects
= NULL
;
189 unsigned int num_dump_sects
= 0;
191 #define HEX_DUMP (1 << 0)
192 #define DISASS_DUMP (1 << 1)
193 #define DEBUG_DUMP (1 << 2)
195 /* How to rpint a vma value. */
196 typedef enum print_mode
208 static bfd_vma (*byte_get
) (unsigned char *, int);
209 static void (*byte_put
) (unsigned char *, bfd_vma
, int);
213 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
214 ((X)->sh_name >= string_table_length \
215 ? "<corrupt>" : string_table + (X)->sh_name))
217 /* Given st_shndx I, map to section_headers index. */
218 #define SECTION_HEADER_INDEX(I) \
219 ((I) < SHN_LORESERVE \
221 : ((I) <= SHN_HIRESERVE \
223 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
225 /* Reverse of the above. */
226 #define SECTION_HEADER_NUM(N) \
227 ((N) < SHN_LORESERVE \
229 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
231 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
233 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
235 #define BYTE_GET(field) byte_get (field, sizeof (field))
237 /* If we can support a 64 bit data type then BFD64 should be defined
238 and sizeof (bfd_vma) == 8. In this case when translating from an
239 external 8 byte field to an internal field, we can assume that the
240 internal field is also 8 bytes wide and so we can extract all the data.
241 If, however, BFD64 is not defined, then we must assume that the
242 internal data structure only has 4 byte wide fields that are the
243 equivalent of the 8 byte wide external counterparts, and so we must
244 truncate the data. */
246 #define BYTE_GET8(field) byte_get (field, -8)
248 #define BYTE_GET8(field) byte_get (field, 8)
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))
259 error (const char *message
, ...)
263 va_start (args
, message
);
264 fprintf (stderr
, _("%s: Error: "), program_name
);
265 vfprintf (stderr
, message
, args
);
270 warn (const char *message
, ...)
274 va_start (args
, message
);
275 fprintf (stderr
, _("%s: Warning: "), program_name
);
276 vfprintf (stderr
, message
, args
);
281 get_data (void *var
, FILE *file
, long offset
, size_t size
, const char *reason
)
288 if (fseek (file
, archive_file_offset
+ offset
, SEEK_SET
))
290 error (_("Unable to seek to 0x%x for %s\n"),
291 archive_file_offset
+ offset
, reason
);
298 mvar
= malloc (size
);
302 error (_("Out of memory allocating 0x%x bytes for %s\n"),
308 if (fread (mvar
, size
, 1, file
) != 1)
310 error (_("Unable to read in 0x%x bytes of %s\n"), size
, reason
);
320 byte_get_little_endian (unsigned char *field
, int size
)
328 return ((unsigned int) (field
[0]))
329 | (((unsigned int) (field
[1])) << 8);
333 /* We want to extract data from an 8 byte wide field and
334 place it into a 4 byte wide field. Since this is a little
335 endian source we can just use the 4 byte extraction code. */
339 return ((unsigned long) (field
[0]))
340 | (((unsigned long) (field
[1])) << 8)
341 | (((unsigned long) (field
[2])) << 16)
342 | (((unsigned long) (field
[3])) << 24);
347 /* This is a special case, generated by the BYTE_GET8 macro.
348 It means that we are loading an 8 byte value from a field
349 in an external structure into an 8 byte value in a field
350 in an internal structure. */
351 return ((bfd_vma
) (field
[0]))
352 | (((bfd_vma
) (field
[1])) << 8)
353 | (((bfd_vma
) (field
[2])) << 16)
354 | (((bfd_vma
) (field
[3])) << 24)
355 | (((bfd_vma
) (field
[4])) << 32)
356 | (((bfd_vma
) (field
[5])) << 40)
357 | (((bfd_vma
) (field
[6])) << 48)
358 | (((bfd_vma
) (field
[7])) << 56);
361 error (_("Unhandled data length: %d\n"), size
);
367 byte_get_signed (unsigned char *field
, int size
)
369 bfd_vma x
= byte_get (field
, size
);
374 return (x
^ 0x80) - 0x80;
376 return (x
^ 0x8000) - 0x8000;
378 return (x
^ 0x80000000) - 0x80000000;
388 byte_put_little_endian (unsigned char *field
, bfd_vma value
, int size
)
393 field
[7] = (((value
>> 24) >> 24) >> 8) & 0xff;
394 field
[6] = ((value
>> 24) >> 24) & 0xff;
395 field
[5] = ((value
>> 24) >> 16) & 0xff;
396 field
[4] = ((value
>> 24) >> 8) & 0xff;
399 field
[3] = (value
>> 24) & 0xff;
400 field
[2] = (value
>> 16) & 0xff;
403 field
[1] = (value
>> 8) & 0xff;
406 field
[0] = value
& 0xff;
410 error (_("Unhandled data length: %d\n"), size
);
415 /* Print a VMA value. */
417 print_vma (bfd_vma vma
, print_mode mode
)
429 printf ("%8.8lx", (unsigned long) vma
);
435 printf ("%5ld", (long) vma
);
443 printf ("%lx", (unsigned long) vma
);
447 printf ("%ld", (unsigned long) vma
);
451 printf ("%lu", (unsigned long) vma
);
473 #if BFD_HOST_64BIT_LONG
476 if (_bfd_int64_high (vma
))
477 printf ("%lx%8.8lx", _bfd_int64_high (vma
), _bfd_int64_low (vma
));
479 printf ("%lx", _bfd_int64_low (vma
));
484 #if BFD_HOST_64BIT_LONG
487 if (_bfd_int64_high (vma
))
489 printf ("++%ld", _bfd_int64_low (vma
));
491 printf ("%ld", _bfd_int64_low (vma
));
496 #if BFD_HOST_64BIT_LONG
498 printf ("%5ld", vma
);
500 printf ("%#lx", vma
);
502 if (_bfd_int64_high (vma
))
504 printf ("++%ld", _bfd_int64_low (vma
));
505 else if (vma
<= 99999)
506 printf ("%5ld", _bfd_int64_low (vma
));
508 printf ("%#lx", _bfd_int64_low (vma
));
513 #if BFD_HOST_64BIT_LONG
516 if (_bfd_int64_high (vma
))
518 printf ("++%lu", _bfd_int64_low (vma
));
520 printf ("%lu", _bfd_int64_low (vma
));
528 /* Display a symbol on stdout. If do_wide is not true then
529 format the symbol to be at most WIDTH characters,
530 truncating as necessary. If WIDTH is negative then
531 format the string to be exactly - WIDTH characters,
532 truncating or padding as necessary. */
535 print_symbol (int width
, const char *symbol
)
538 printf ("%s", symbol
);
540 printf ("%-*.*s", width
, width
, symbol
);
542 printf ("%-.*s", width
, symbol
);
546 byte_get_big_endian (unsigned char *field
, int size
)
554 return ((unsigned int) (field
[1])) | (((int) (field
[0])) << 8);
557 return ((unsigned long) (field
[3]))
558 | (((unsigned long) (field
[2])) << 8)
559 | (((unsigned long) (field
[1])) << 16)
560 | (((unsigned long) (field
[0])) << 24);
564 /* Although we are extracing data from an 8 byte wide field, we
565 are returning only 4 bytes of data. */
566 return ((unsigned long) (field
[7]))
567 | (((unsigned long) (field
[6])) << 8)
568 | (((unsigned long) (field
[5])) << 16)
569 | (((unsigned long) (field
[4])) << 24);
573 /* This is a special case, generated by the BYTE_GET8 macro.
574 It means that we are loading an 8 byte value from a field
575 in an external structure into an 8 byte value in a field
576 in an internal structure. */
577 return ((bfd_vma
) (field
[7]))
578 | (((bfd_vma
) (field
[6])) << 8)
579 | (((bfd_vma
) (field
[5])) << 16)
580 | (((bfd_vma
) (field
[4])) << 24)
581 | (((bfd_vma
) (field
[3])) << 32)
582 | (((bfd_vma
) (field
[2])) << 40)
583 | (((bfd_vma
) (field
[1])) << 48)
584 | (((bfd_vma
) (field
[0])) << 56);
588 error (_("Unhandled data length: %d\n"), size
);
594 byte_put_big_endian (unsigned char *field
, bfd_vma value
, int size
)
599 field
[7] = value
& 0xff;
600 field
[6] = (value
>> 8) & 0xff;
601 field
[5] = (value
>> 16) & 0xff;
602 field
[4] = (value
>> 24) & 0xff;
607 field
[3] = value
& 0xff;
608 field
[2] = (value
>> 8) & 0xff;
612 field
[1] = value
& 0xff;
616 field
[0] = value
& 0xff;
620 error (_("Unhandled data length: %d\n"), size
);
625 /* Guess the relocation size commonly used by the specific machines. */
628 guess_is_rela (unsigned long e_machine
)
632 /* Targets that use REL relocations. */
647 /* Targets that use RELA relocations. */
662 case EM_CYGNUS_MN10200
:
664 case EM_CYGNUS_MN10300
:
711 warn (_("Don't know about relocations on this machine architecture\n"));
717 slurp_rela_relocs (FILE *file
,
718 unsigned long rel_offset
,
719 unsigned long rel_size
,
720 Elf_Internal_Rela
**relasp
,
721 unsigned long *nrelasp
)
723 Elf_Internal_Rela
*relas
;
724 unsigned long nrelas
;
729 Elf32_External_Rela
*erelas
;
731 erelas
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
735 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
737 relas
= malloc (nrelas
* sizeof (Elf_Internal_Rela
));
741 error(_("out of memory parsing relocs"));
745 for (i
= 0; i
< nrelas
; i
++)
747 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
748 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
749 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
756 Elf64_External_Rela
*erelas
;
758 erelas
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
762 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
764 relas
= malloc (nrelas
* sizeof (Elf_Internal_Rela
));
768 error(_("out of memory parsing relocs"));
772 for (i
= 0; i
< nrelas
; i
++)
774 relas
[i
].r_offset
= BYTE_GET8 (erelas
[i
].r_offset
);
775 relas
[i
].r_info
= BYTE_GET8 (erelas
[i
].r_info
);
776 relas
[i
].r_addend
= BYTE_GET8 (erelas
[i
].r_addend
);
787 slurp_rel_relocs (FILE *file
,
788 unsigned long rel_offset
,
789 unsigned long rel_size
,
790 Elf_Internal_Rela
**relsp
,
791 unsigned long *nrelsp
)
793 Elf_Internal_Rela
*rels
;
799 Elf32_External_Rel
*erels
;
801 erels
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
805 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
807 rels
= malloc (nrels
* sizeof (Elf_Internal_Rela
));
811 error(_("out of memory parsing relocs"));
815 for (i
= 0; i
< nrels
; i
++)
817 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
818 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
819 rels
[i
].r_addend
= 0;
826 Elf64_External_Rel
*erels
;
828 erels
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
832 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
834 rels
= malloc (nrels
* sizeof (Elf_Internal_Rela
));
838 error(_("out of memory parsing relocs"));
842 for (i
= 0; i
< nrels
; i
++)
844 rels
[i
].r_offset
= BYTE_GET8 (erels
[i
].r_offset
);
845 rels
[i
].r_info
= BYTE_GET8 (erels
[i
].r_info
);
846 rels
[i
].r_addend
= 0;
856 /* Display the contents of the relocation data found at the specified
860 dump_relocations (FILE *file
,
861 unsigned long rel_offset
,
862 unsigned long rel_size
,
863 Elf_Internal_Sym
*symtab
,
869 Elf_Internal_Rela
*rels
;
872 if (is_rela
== UNKNOWN
)
873 is_rela
= guess_is_rela (elf_header
.e_machine
);
877 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
882 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
891 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
893 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
898 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
900 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
908 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
910 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
915 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
917 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
921 for (i
= 0; i
< rel_size
; i
++)
924 const char *rtype2
= NULL
;
925 const char *rtype3
= NULL
;
928 bfd_vma symtab_index
;
933 offset
= rels
[i
].r_offset
;
934 info
= rels
[i
].r_info
;
938 type
= ELF32_R_TYPE (info
);
939 symtab_index
= ELF32_R_SYM (info
);
943 /* The #ifdef BFD64 below is to prevent a compile time warning.
944 We know that if we do not have a 64 bit data type that we
945 will never execute this code anyway. */
947 if (elf_header
.e_machine
== EM_MIPS
)
949 /* In little-endian objects, r_info isn't really a 64-bit
950 little-endian value: it has a 32-bit little-endian
951 symbol index followed by four individual byte fields.
952 Reorder INFO accordingly. */
953 if (elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
954 info
= (((info
& 0xffffffff) << 32)
955 | ((info
>> 56) & 0xff)
956 | ((info
>> 40) & 0xff00)
957 | ((info
>> 24) & 0xff0000)
958 | ((info
>> 8) & 0xff000000));
959 type
= ELF64_MIPS_R_TYPE (info
);
960 type2
= ELF64_MIPS_R_TYPE2 (info
);
961 type3
= ELF64_MIPS_R_TYPE3 (info
);
963 else if (elf_header
.e_machine
== EM_SPARCV9
)
964 type
= ELF64_R_TYPE_ID (info
);
966 type
= ELF64_R_TYPE (info
);
968 symtab_index
= ELF64_R_SYM (info
);
974 #ifdef _bfd_int64_low
975 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
977 printf ("%8.8lx %8.8lx ", offset
, info
);
982 #ifdef _bfd_int64_low
984 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
985 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
986 _bfd_int64_high (offset
),
987 _bfd_int64_low (offset
),
988 _bfd_int64_high (info
),
989 _bfd_int64_low (info
));
992 ? "%16.16lx %16.16lx "
993 : "%12.12lx %12.12lx ",
998 switch (elf_header
.e_machine
)
1005 case EM_CYGNUS_M32R
:
1006 rtype
= elf_m32r_reloc_type (type
);
1011 rtype
= elf_i386_reloc_type (type
);
1016 rtype
= elf_m68hc11_reloc_type (type
);
1020 rtype
= elf_m68k_reloc_type (type
);
1024 rtype
= elf_i960_reloc_type (type
);
1029 rtype
= elf_avr_reloc_type (type
);
1032 case EM_OLD_SPARCV9
:
1033 case EM_SPARC32PLUS
:
1036 rtype
= elf_sparc_reloc_type (type
);
1040 case EM_CYGNUS_V850
:
1041 rtype
= v850_reloc_type (type
);
1045 case EM_CYGNUS_D10V
:
1046 rtype
= elf_d10v_reloc_type (type
);
1050 case EM_CYGNUS_D30V
:
1051 rtype
= elf_d30v_reloc_type (type
);
1055 rtype
= elf_dlx_reloc_type (type
);
1059 rtype
= elf_sh_reloc_type (type
);
1063 case EM_CYGNUS_MN10300
:
1064 rtype
= elf_mn10300_reloc_type (type
);
1068 case EM_CYGNUS_MN10200
:
1069 rtype
= elf_mn10200_reloc_type (type
);
1073 case EM_CYGNUS_FR30
:
1074 rtype
= elf_fr30_reloc_type (type
);
1078 rtype
= elf_frv_reloc_type (type
);
1082 rtype
= elf_mcore_reloc_type (type
);
1086 rtype
= elf_mmix_reloc_type (type
);
1091 rtype
= elf_msp430_reloc_type (type
);
1095 rtype
= elf_ppc_reloc_type (type
);
1099 rtype
= elf_ppc64_reloc_type (type
);
1103 case EM_MIPS_RS3_LE
:
1104 rtype
= elf_mips_reloc_type (type
);
1107 rtype2
= elf_mips_reloc_type (type2
);
1108 rtype3
= elf_mips_reloc_type (type3
);
1113 rtype
= elf_alpha_reloc_type (type
);
1117 rtype
= elf_arm_reloc_type (type
);
1121 rtype
= elf_arc_reloc_type (type
);
1125 rtype
= elf_hppa_reloc_type (type
);
1131 rtype
= elf_h8_reloc_type (type
);
1136 rtype
= elf_or32_reloc_type (type
);
1141 rtype
= elf_pj_reloc_type (type
);
1144 rtype
= elf_ia64_reloc_type (type
);
1148 rtype
= elf_cris_reloc_type (type
);
1152 rtype
= elf_i860_reloc_type (type
);
1156 rtype
= elf_x86_64_reloc_type (type
);
1160 rtype
= i370_reloc_type (type
);
1165 rtype
= elf_s390_reloc_type (type
);
1169 rtype
= elf_xstormy16_reloc_type (type
);
1173 rtype
= elf_crx_reloc_type (type
);
1177 rtype
= elf_vax_reloc_type (type
);
1182 rtype
= elf_ip2k_reloc_type (type
);
1186 rtype
= elf_iq2000_reloc_type (type
);
1191 rtype
= elf_xtensa_reloc_type (type
);
1196 #ifdef _bfd_int64_low
1197 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type
));
1199 printf (_("unrecognized: %-7lx"), type
);
1202 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1206 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1207 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1210 Elf_Internal_Sym
*psym
;
1212 psym
= symtab
+ symtab_index
;
1215 print_vma (psym
->st_value
, LONG_HEX
);
1216 printf (is_32bit_elf
? " " : " ");
1218 if (psym
->st_name
== 0)
1220 const char *sec_name
= "<null>";
1223 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1225 bfd_vma sec_index
= (bfd_vma
) -1;
1227 if (psym
->st_shndx
< SHN_LORESERVE
)
1228 sec_index
= psym
->st_shndx
;
1229 else if (psym
->st_shndx
> SHN_HIRESERVE
)
1230 sec_index
= psym
->st_shndx
- (SHN_HIRESERVE
+ 1
1233 if (sec_index
!= (bfd_vma
) -1)
1234 sec_name
= SECTION_NAME (section_headers
+ sec_index
);
1235 else if (psym
->st_shndx
== SHN_ABS
)
1237 else if (psym
->st_shndx
== SHN_COMMON
)
1238 sec_name
= "COMMON";
1239 else if (elf_header
.e_machine
== EM_IA_64
1240 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1241 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1242 sec_name
= "ANSI_COM";
1245 sprintf (name_buf
, "<section 0x%x>",
1246 (unsigned int) psym
->st_shndx
);
1247 sec_name
= name_buf
;
1250 print_symbol (22, sec_name
);
1252 else if (strtab
== NULL
)
1253 printf (_("<string table index %3ld>"), psym
->st_name
);
1255 print_symbol (22, strtab
+ psym
->st_name
);
1258 printf (" + %lx", (unsigned long) rels
[i
].r_addend
);
1263 printf ("%*c", is_32bit_elf
? (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1264 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1267 if (elf_header
.e_machine
== EM_SPARCV9
1268 && !strcmp (rtype
, "R_SPARC_OLO10"))
1269 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1273 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1275 printf (" Type2: ");
1278 #ifdef _bfd_int64_low
1279 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2
));
1281 printf (_("unrecognized: %-7lx"), type2
);
1284 printf ("%-17.17s", rtype2
);
1286 printf("\n Type3: ");
1289 #ifdef _bfd_int64_low
1290 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3
));
1292 printf (_("unrecognized: %-7lx"), type3
);
1295 printf ("%-17.17s", rtype3
);
1307 get_mips_dynamic_type (unsigned long type
)
1311 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1312 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1313 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1314 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1315 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1316 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1317 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1318 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1319 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1320 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1321 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1322 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1323 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1324 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1325 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1326 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1327 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1328 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1329 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1330 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1331 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1332 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1333 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1334 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1335 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1336 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1337 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1338 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1339 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1340 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1341 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1342 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1343 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1344 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1345 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1346 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1347 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1348 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1349 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1350 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1351 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1352 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1353 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1360 get_sparc64_dynamic_type (unsigned long type
)
1364 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1371 get_ppc64_dynamic_type (unsigned long type
)
1375 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1376 case DT_PPC64_OPD
: return "PPC64_OPD";
1377 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1384 get_parisc_dynamic_type (unsigned long type
)
1388 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1389 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1390 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1391 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1392 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1393 case DT_HP_PREINIT
: return "HP_PREINIT";
1394 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1395 case DT_HP_NEEDED
: return "HP_NEEDED";
1396 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1397 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1398 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1399 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1400 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1407 get_ia64_dynamic_type (unsigned long type
)
1411 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1418 get_dynamic_type (unsigned long type
)
1420 static char buff
[32];
1424 case DT_NULL
: return "NULL";
1425 case DT_NEEDED
: return "NEEDED";
1426 case DT_PLTRELSZ
: return "PLTRELSZ";
1427 case DT_PLTGOT
: return "PLTGOT";
1428 case DT_HASH
: return "HASH";
1429 case DT_STRTAB
: return "STRTAB";
1430 case DT_SYMTAB
: return "SYMTAB";
1431 case DT_RELA
: return "RELA";
1432 case DT_RELASZ
: return "RELASZ";
1433 case DT_RELAENT
: return "RELAENT";
1434 case DT_STRSZ
: return "STRSZ";
1435 case DT_SYMENT
: return "SYMENT";
1436 case DT_INIT
: return "INIT";
1437 case DT_FINI
: return "FINI";
1438 case DT_SONAME
: return "SONAME";
1439 case DT_RPATH
: return "RPATH";
1440 case DT_SYMBOLIC
: return "SYMBOLIC";
1441 case DT_REL
: return "REL";
1442 case DT_RELSZ
: return "RELSZ";
1443 case DT_RELENT
: return "RELENT";
1444 case DT_PLTREL
: return "PLTREL";
1445 case DT_DEBUG
: return "DEBUG";
1446 case DT_TEXTREL
: return "TEXTREL";
1447 case DT_JMPREL
: return "JMPREL";
1448 case DT_BIND_NOW
: return "BIND_NOW";
1449 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1450 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1451 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1452 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1453 case DT_RUNPATH
: return "RUNPATH";
1454 case DT_FLAGS
: return "FLAGS";
1456 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1457 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1459 case DT_CHECKSUM
: return "CHECKSUM";
1460 case DT_PLTPADSZ
: return "PLTPADSZ";
1461 case DT_MOVEENT
: return "MOVEENT";
1462 case DT_MOVESZ
: return "MOVESZ";
1463 case DT_FEATURE
: return "FEATURE";
1464 case DT_POSFLAG_1
: return "POSFLAG_1";
1465 case DT_SYMINSZ
: return "SYMINSZ";
1466 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1468 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1469 case DT_CONFIG
: return "CONFIG";
1470 case DT_DEPAUDIT
: return "DEPAUDIT";
1471 case DT_AUDIT
: return "AUDIT";
1472 case DT_PLTPAD
: return "PLTPAD";
1473 case DT_MOVETAB
: return "MOVETAB";
1474 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1476 case DT_VERSYM
: return "VERSYM";
1478 case DT_RELACOUNT
: return "RELACOUNT";
1479 case DT_RELCOUNT
: return "RELCOUNT";
1480 case DT_FLAGS_1
: return "FLAGS_1";
1481 case DT_VERDEF
: return "VERDEF";
1482 case DT_VERDEFNUM
: return "VERDEFNUM";
1483 case DT_VERNEED
: return "VERNEED";
1484 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1486 case DT_AUXILIARY
: return "AUXILIARY";
1487 case DT_USED
: return "USED";
1488 case DT_FILTER
: return "FILTER";
1490 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1491 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1492 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1493 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1494 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1497 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1501 switch (elf_header
.e_machine
)
1504 case EM_MIPS_RS3_LE
:
1505 result
= get_mips_dynamic_type (type
);
1508 result
= get_sparc64_dynamic_type (type
);
1511 result
= get_ppc64_dynamic_type (type
);
1514 result
= get_ia64_dynamic_type (type
);
1524 sprintf (buff
, _("Processor Specific: %lx"), type
);
1526 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1530 switch (elf_header
.e_machine
)
1533 result
= get_parisc_dynamic_type (type
);
1543 sprintf (buff
, _("Operating System specific: %lx"), type
);
1546 sprintf (buff
, _("<unknown>: %lx"), type
);
1553 get_file_type (unsigned e_type
)
1555 static char buff
[32];
1559 case ET_NONE
: return _("NONE (None)");
1560 case ET_REL
: return _("REL (Relocatable file)");
1561 case ET_EXEC
: return _("EXEC (Executable file)");
1562 case ET_DYN
: return _("DYN (Shared object file)");
1563 case ET_CORE
: return _("CORE (Core file)");
1566 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1567 sprintf (buff
, _("Processor Specific: (%x)"), e_type
);
1568 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1569 sprintf (buff
, _("OS Specific: (%x)"), e_type
);
1571 sprintf (buff
, _("<unknown>: %x"), e_type
);
1577 get_machine_name (unsigned e_machine
)
1579 static char buff
[64]; /* XXX */
1583 case EM_NONE
: return _("None");
1584 case EM_M32
: return "WE32100";
1585 case EM_SPARC
: return "Sparc";
1586 case EM_386
: return "Intel 80386";
1587 case EM_68K
: return "MC68000";
1588 case EM_88K
: return "MC88000";
1589 case EM_486
: return "Intel 80486";
1590 case EM_860
: return "Intel 80860";
1591 case EM_MIPS
: return "MIPS R3000";
1592 case EM_S370
: return "IBM System/370";
1593 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1594 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1595 case EM_PARISC
: return "HPPA";
1596 case EM_PPC_OLD
: return "Power PC (old)";
1597 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1598 case EM_960
: return "Intel 90860";
1599 case EM_PPC
: return "PowerPC";
1600 case EM_PPC64
: return "PowerPC64";
1601 case EM_V800
: return "NEC V800";
1602 case EM_FR20
: return "Fujitsu FR20";
1603 case EM_RH32
: return "TRW RH32";
1604 case EM_MCORE
: return "MCORE";
1605 case EM_ARM
: return "ARM";
1606 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1607 case EM_SH
: return "Renesas / SuperH SH";
1608 case EM_SPARCV9
: return "Sparc v9";
1609 case EM_TRICORE
: return "Siemens Tricore";
1610 case EM_ARC
: return "ARC";
1611 case EM_H8_300
: return "Renesas H8/300";
1612 case EM_H8_300H
: return "Renesas H8/300H";
1613 case EM_H8S
: return "Renesas H8S";
1614 case EM_H8_500
: return "Renesas H8/500";
1615 case EM_IA_64
: return "Intel IA-64";
1616 case EM_MIPS_X
: return "Stanford MIPS-X";
1617 case EM_COLDFIRE
: return "Motorola Coldfire";
1618 case EM_68HC12
: return "Motorola M68HC12";
1619 case EM_ALPHA
: return "Alpha";
1620 case EM_CYGNUS_D10V
:
1621 case EM_D10V
: return "d10v";
1622 case EM_CYGNUS_D30V
:
1623 case EM_D30V
: return "d30v";
1624 case EM_CYGNUS_M32R
:
1625 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
1626 case EM_CYGNUS_V850
:
1627 case EM_V850
: return "NEC v850";
1628 case EM_CYGNUS_MN10300
:
1629 case EM_MN10300
: return "mn10300";
1630 case EM_CYGNUS_MN10200
:
1631 case EM_MN10200
: return "mn10200";
1632 case EM_CYGNUS_FR30
:
1633 case EM_FR30
: return "Fujitsu FR30";
1634 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1636 case EM_PJ
: return "picoJava";
1637 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1638 case EM_PCP
: return "Siemens PCP";
1639 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1640 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1641 case EM_STARCORE
: return "Motorola Star*Core processor";
1642 case EM_ME16
: return "Toyota ME16 processor";
1643 case EM_ST100
: return "STMicroelectronics ST100 processor";
1644 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1645 case EM_FX66
: return "Siemens FX66 microcontroller";
1646 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1647 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1648 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1649 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1650 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1651 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1652 case EM_SVX
: return "Silicon Graphics SVx";
1653 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1654 case EM_VAX
: return "Digital VAX";
1656 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1657 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1658 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1659 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1660 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1661 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1662 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1663 case EM_PRISM
: return "Vitesse Prism";
1664 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1666 case EM_S390
: return "IBM S/390";
1667 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1669 case EM_OR32
: return "OpenRISC";
1670 case EM_CRX
: return "National Semiconductor CRX microprocessor";
1671 case EM_DLX
: return "OpenDLX";
1673 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1674 case EM_IQ2000
: return "Vitesse IQ2000";
1676 case EM_XTENSA
: return "Tensilica Xtensa Processor";
1678 sprintf (buff
, _("<unknown>: %x"), e_machine
);
1684 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
1689 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1690 e_flags
&= ~ EF_ARM_EABIMASK
;
1692 /* Handle "generic" ARM flags. */
1693 if (e_flags
& EF_ARM_RELEXEC
)
1695 strcat (buf
, ", relocatable executable");
1696 e_flags
&= ~ EF_ARM_RELEXEC
;
1699 if (e_flags
& EF_ARM_HASENTRY
)
1701 strcat (buf
, ", has entry point");
1702 e_flags
&= ~ EF_ARM_HASENTRY
;
1705 /* Now handle EABI specific flags. */
1709 strcat (buf
, ", <unrecognized EABI>");
1714 case EF_ARM_EABI_VER1
:
1715 strcat (buf
, ", Version1 EABI");
1720 /* Process flags one bit at a time. */
1721 flag
= e_flags
& - e_flags
;
1726 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1727 strcat (buf
, ", sorted symbol tables");
1737 case EF_ARM_EABI_VER2
:
1738 strcat (buf
, ", Version2 EABI");
1743 /* Process flags one bit at a time. */
1744 flag
= e_flags
& - e_flags
;
1749 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1750 strcat (buf
, ", sorted symbol tables");
1753 case EF_ARM_DYNSYMSUSESEGIDX
:
1754 strcat (buf
, ", dynamic symbols use segment index");
1757 case EF_ARM_MAPSYMSFIRST
:
1758 strcat (buf
, ", mapping symbols precede others");
1768 case EF_ARM_EABI_VER3
:
1769 strcat (buf
, ", Version3 EABI");
1774 /* Process flags one bit at a time. */
1775 flag
= e_flags
& - e_flags
;
1781 strcat (buf
, ", BE8");
1785 strcat (buf
, ", LE8");
1795 case EF_ARM_EABI_UNKNOWN
:
1796 strcat (buf
, ", GNU EABI");
1801 /* Process flags one bit at a time. */
1802 flag
= e_flags
& - e_flags
;
1807 case EF_ARM_INTERWORK
:
1808 strcat (buf
, ", interworking enabled");
1811 case EF_ARM_APCS_26
:
1812 strcat (buf
, ", uses APCS/26");
1815 case EF_ARM_APCS_FLOAT
:
1816 strcat (buf
, ", uses APCS/float");
1820 strcat (buf
, ", position independent");
1824 strcat (buf
, ", 8 bit structure alignment");
1827 case EF_ARM_NEW_ABI
:
1828 strcat (buf
, ", uses new ABI");
1831 case EF_ARM_OLD_ABI
:
1832 strcat (buf
, ", uses old ABI");
1835 case EF_ARM_SOFT_FLOAT
:
1836 strcat (buf
, ", software FP");
1839 case EF_ARM_VFP_FLOAT
:
1840 strcat (buf
, ", VFP");
1843 case EF_ARM_MAVERICK_FLOAT
:
1844 strcat (buf
, ", Maverick FP");
1855 strcat (buf
,", <unknown>");
1859 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
1861 static char buf
[1024];
1873 decode_ARM_machine_flags (e_flags
, buf
);
1877 switch (e_flags
& EF_FRV_CPU_MASK
)
1879 case EF_FRV_CPU_GENERIC
:
1883 strcat (buf
, ", fr???");
1886 case EF_FRV_CPU_FR300
:
1887 strcat (buf
, ", fr300");
1890 case EF_FRV_CPU_FR400
:
1891 strcat (buf
, ", fr400");
1893 case EF_FRV_CPU_FR405
:
1894 strcat (buf
, ", fr405");
1897 case EF_FRV_CPU_FR450
:
1898 strcat (buf
, ", fr450");
1901 case EF_FRV_CPU_FR500
:
1902 strcat (buf
, ", fr500");
1904 case EF_FRV_CPU_FR550
:
1905 strcat (buf
, ", fr550");
1908 case EF_FRV_CPU_SIMPLE
:
1909 strcat (buf
, ", simple");
1911 case EF_FRV_CPU_TOMCAT
:
1912 strcat (buf
, ", tomcat");
1917 if (e_flags
& EF_CPU32
)
1918 strcat (buf
, ", cpu32");
1919 if (e_flags
& EF_M68000
)
1920 strcat (buf
, ", m68000");
1924 if (e_flags
& EF_PPC_EMB
)
1925 strcat (buf
, ", emb");
1927 if (e_flags
& EF_PPC_RELOCATABLE
)
1928 strcat (buf
, ", relocatable");
1930 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
1931 strcat (buf
, ", relocatable-lib");
1935 case EM_CYGNUS_V850
:
1936 switch (e_flags
& EF_V850_ARCH
)
1939 strcat (buf
, ", v850e1");
1942 strcat (buf
, ", v850e");
1945 strcat (buf
, ", v850");
1948 strcat (buf
, ", unknown v850 architecture variant");
1954 case EM_CYGNUS_M32R
:
1955 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
1956 strcat (buf
, ", m32r");
1961 case EM_MIPS_RS3_LE
:
1962 if (e_flags
& EF_MIPS_NOREORDER
)
1963 strcat (buf
, ", noreorder");
1965 if (e_flags
& EF_MIPS_PIC
)
1966 strcat (buf
, ", pic");
1968 if (e_flags
& EF_MIPS_CPIC
)
1969 strcat (buf
, ", cpic");
1971 if (e_flags
& EF_MIPS_UCODE
)
1972 strcat (buf
, ", ugen_reserved");
1974 if (e_flags
& EF_MIPS_ABI2
)
1975 strcat (buf
, ", abi2");
1977 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
1978 strcat (buf
, ", odk first");
1980 if (e_flags
& EF_MIPS_32BITMODE
)
1981 strcat (buf
, ", 32bitmode");
1983 switch ((e_flags
& EF_MIPS_MACH
))
1985 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
1986 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
1987 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
1988 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
1989 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
1990 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
1991 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
1992 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
1993 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
1995 /* We simply ignore the field in this case to avoid confusion:
1996 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
1999 default: strcat (buf
, ", unknown CPU"); break;
2002 switch ((e_flags
& EF_MIPS_ABI
))
2004 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
2005 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
2006 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
2007 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
2009 /* We simply ignore the field in this case to avoid confusion:
2010 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2011 This means it is likely to be an o32 file, but not for
2014 default: strcat (buf
, ", unknown ABI"); break;
2017 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
2018 strcat (buf
, ", mdmx");
2020 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
2021 strcat (buf
, ", mips16");
2023 switch ((e_flags
& EF_MIPS_ARCH
))
2025 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
2026 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
2027 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
2028 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
2029 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
2030 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
2031 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
2032 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
2033 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
2034 default: strcat (buf
, ", unknown ISA"); break;
2040 switch ((e_flags
& EF_SH_MACH_MASK
))
2042 case EF_SH1
: strcat (buf
, ", sh1"); break;
2043 case EF_SH2
: strcat (buf
, ", sh2"); break;
2044 case EF_SH3
: strcat (buf
, ", sh3"); break;
2045 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
2046 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
2047 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
2048 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
2049 case EF_SH4
: strcat (buf
, ", sh4"); break;
2050 case EF_SH5
: strcat (buf
, ", sh5"); break;
2051 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
2052 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
2053 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
2054 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
2055 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
2056 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
2057 default: strcat (buf
, ", unknown ISA"); break;
2063 if (e_flags
& EF_SPARC_32PLUS
)
2064 strcat (buf
, ", v8+");
2066 if (e_flags
& EF_SPARC_SUN_US1
)
2067 strcat (buf
, ", ultrasparcI");
2069 if (e_flags
& EF_SPARC_SUN_US3
)
2070 strcat (buf
, ", ultrasparcIII");
2072 if (e_flags
& EF_SPARC_HAL_R1
)
2073 strcat (buf
, ", halr1");
2075 if (e_flags
& EF_SPARC_LEDATA
)
2076 strcat (buf
, ", ledata");
2078 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2079 strcat (buf
, ", tso");
2081 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2082 strcat (buf
, ", pso");
2084 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2085 strcat (buf
, ", rmo");
2089 switch (e_flags
& EF_PARISC_ARCH
)
2091 case EFA_PARISC_1_0
:
2092 strcpy (buf
, ", PA-RISC 1.0");
2094 case EFA_PARISC_1_1
:
2095 strcpy (buf
, ", PA-RISC 1.1");
2097 case EFA_PARISC_2_0
:
2098 strcpy (buf
, ", PA-RISC 2.0");
2103 if (e_flags
& EF_PARISC_TRAPNIL
)
2104 strcat (buf
, ", trapnil");
2105 if (e_flags
& EF_PARISC_EXT
)
2106 strcat (buf
, ", ext");
2107 if (e_flags
& EF_PARISC_LSB
)
2108 strcat (buf
, ", lsb");
2109 if (e_flags
& EF_PARISC_WIDE
)
2110 strcat (buf
, ", wide");
2111 if (e_flags
& EF_PARISC_NO_KABP
)
2112 strcat (buf
, ", no kabp");
2113 if (e_flags
& EF_PARISC_LAZYSWAP
)
2114 strcat (buf
, ", lazyswap");
2119 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2120 strcat (buf
, ", new calling convention");
2122 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2123 strcat (buf
, ", gnu calling convention");
2127 if ((e_flags
& EF_IA_64_ABI64
))
2128 strcat (buf
, ", 64-bit");
2130 strcat (buf
, ", 32-bit");
2131 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2132 strcat (buf
, ", reduced fp model");
2133 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2134 strcat (buf
, ", no function descriptors, constant gp");
2135 else if ((e_flags
& EF_IA_64_CONS_GP
))
2136 strcat (buf
, ", constant gp");
2137 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2138 strcat (buf
, ", absolute");
2142 if ((e_flags
& EF_VAX_NONPIC
))
2143 strcat (buf
, ", non-PIC");
2144 if ((e_flags
& EF_VAX_DFLOAT
))
2145 strcat (buf
, ", D-Float");
2146 if ((e_flags
& EF_VAX_GFLOAT
))
2147 strcat (buf
, ", G-Float");
2156 get_osabi_name (unsigned int osabi
)
2158 static char buff
[32];
2162 case ELFOSABI_NONE
: return "UNIX - System V";
2163 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2164 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2165 case ELFOSABI_LINUX
: return "UNIX - Linux";
2166 case ELFOSABI_HURD
: return "GNU/Hurd";
2167 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2168 case ELFOSABI_AIX
: return "UNIX - AIX";
2169 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2170 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2171 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2172 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2173 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2174 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2175 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2176 case ELFOSABI_AROS
: return "Amiga Research OS";
2177 case ELFOSABI_STANDALONE
: return _("Standalone App");
2178 case ELFOSABI_ARM
: return "ARM";
2180 sprintf (buff
, _("<unknown: %x>"), osabi
);
2186 get_mips_segment_type (unsigned long type
)
2190 case PT_MIPS_REGINFO
:
2192 case PT_MIPS_RTPROC
:
2194 case PT_MIPS_OPTIONS
:
2204 get_parisc_segment_type (unsigned long type
)
2208 case PT_HP_TLS
: return "HP_TLS";
2209 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2210 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2211 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2212 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2213 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2214 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2215 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2216 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2217 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2218 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2219 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2220 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2221 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2230 get_ia64_segment_type (unsigned long type
)
2234 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2235 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2236 case PT_HP_TLS
: return "HP_TLS";
2237 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2238 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2239 case PT_IA_64_HP_STACK
: return "HP_STACK";
2248 get_segment_type (unsigned long p_type
)
2250 static char buff
[32];
2254 case PT_NULL
: return "NULL";
2255 case PT_LOAD
: return "LOAD";
2256 case PT_DYNAMIC
: return "DYNAMIC";
2257 case PT_INTERP
: return "INTERP";
2258 case PT_NOTE
: return "NOTE";
2259 case PT_SHLIB
: return "SHLIB";
2260 case PT_PHDR
: return "PHDR";
2261 case PT_TLS
: return "TLS";
2263 case PT_GNU_EH_FRAME
:
2264 return "GNU_EH_FRAME";
2265 case PT_GNU_STACK
: return "GNU_STACK";
2266 case PT_GNU_RELRO
: return "GNU_RELRO";
2269 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2273 switch (elf_header
.e_machine
)
2276 case EM_MIPS_RS3_LE
:
2277 result
= get_mips_segment_type (p_type
);
2280 result
= get_parisc_segment_type (p_type
);
2283 result
= get_ia64_segment_type (p_type
);
2293 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2295 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2299 switch (elf_header
.e_machine
)
2302 result
= get_parisc_segment_type (p_type
);
2305 result
= get_ia64_segment_type (p_type
);
2315 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2318 sprintf (buff
, _("<unknown>: %lx"), p_type
);
2325 get_mips_section_type_name (unsigned int sh_type
)
2329 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2330 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2331 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2332 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2333 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2334 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2335 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2336 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2337 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2338 case SHT_MIPS_RELD
: return "MIPS_RELD";
2339 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2340 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2341 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2342 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2343 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2344 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2345 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2346 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2347 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2348 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2349 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2350 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2351 case SHT_MIPS_LINE
: return "MIPS_LINE";
2352 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2353 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2354 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2355 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2356 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2357 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2358 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2359 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2360 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2361 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2362 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2363 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2364 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2365 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2366 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2367 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2375 get_parisc_section_type_name (unsigned int sh_type
)
2379 case SHT_PARISC_EXT
: return "PARISC_EXT";
2380 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2381 case SHT_PARISC_DOC
: return "PARISC_DOC";
2389 get_ia64_section_type_name (unsigned int sh_type
)
2391 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2392 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2393 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2397 case SHT_IA_64_EXT
: return "IA_64_EXT";
2398 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2399 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2407 get_arm_section_type_name (unsigned int sh_type
)
2420 get_section_type_name (unsigned int sh_type
)
2422 static char buff
[32];
2426 case SHT_NULL
: return "NULL";
2427 case SHT_PROGBITS
: return "PROGBITS";
2428 case SHT_SYMTAB
: return "SYMTAB";
2429 case SHT_STRTAB
: return "STRTAB";
2430 case SHT_RELA
: return "RELA";
2431 case SHT_HASH
: return "HASH";
2432 case SHT_DYNAMIC
: return "DYNAMIC";
2433 case SHT_NOTE
: return "NOTE";
2434 case SHT_NOBITS
: return "NOBITS";
2435 case SHT_REL
: return "REL";
2436 case SHT_SHLIB
: return "SHLIB";
2437 case SHT_DYNSYM
: return "DYNSYM";
2438 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2439 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2440 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2441 case SHT_GROUP
: return "GROUP";
2442 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2443 case SHT_GNU_verdef
: return "VERDEF";
2444 case SHT_GNU_verneed
: return "VERNEED";
2445 case SHT_GNU_versym
: return "VERSYM";
2446 case 0x6ffffff0: return "VERSYM";
2447 case 0x6ffffffc: return "VERDEF";
2448 case 0x7ffffffd: return "AUXILIARY";
2449 case 0x7fffffff: return "FILTER";
2450 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2453 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2457 switch (elf_header
.e_machine
)
2460 case EM_MIPS_RS3_LE
:
2461 result
= get_mips_section_type_name (sh_type
);
2464 result
= get_parisc_section_type_name (sh_type
);
2467 result
= get_ia64_section_type_name (sh_type
);
2470 result
= get_arm_section_type_name (sh_type
);
2480 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2482 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2483 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2484 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2485 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2487 sprintf (buff
, _("<unknown>: %x"), sh_type
);
2493 #define OPTION_DEBUG_DUMP 512
2495 struct option options
[] =
2497 {"all", no_argument
, 0, 'a'},
2498 {"file-header", no_argument
, 0, 'h'},
2499 {"program-headers", no_argument
, 0, 'l'},
2500 {"headers", no_argument
, 0, 'e'},
2501 {"histogram", no_argument
, 0, 'I'},
2502 {"segments", no_argument
, 0, 'l'},
2503 {"sections", no_argument
, 0, 'S'},
2504 {"section-headers", no_argument
, 0, 'S'},
2505 {"section-groups", no_argument
, 0, 'g'},
2506 {"symbols", no_argument
, 0, 's'},
2507 {"syms", no_argument
, 0, 's'},
2508 {"relocs", no_argument
, 0, 'r'},
2509 {"notes", no_argument
, 0, 'n'},
2510 {"dynamic", no_argument
, 0, 'd'},
2511 {"arch-specific", no_argument
, 0, 'A'},
2512 {"version-info", no_argument
, 0, 'V'},
2513 {"use-dynamic", no_argument
, 0, 'D'},
2514 {"hex-dump", required_argument
, 0, 'x'},
2515 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2516 {"unwind", no_argument
, 0, 'u'},
2517 #ifdef SUPPORT_DISASSEMBLY
2518 {"instruction-dump", required_argument
, 0, 'i'},
2521 {"version", no_argument
, 0, 'v'},
2522 {"wide", no_argument
, 0, 'W'},
2523 {"help", no_argument
, 0, 'H'},
2524 {0, no_argument
, 0, 0}
2530 fprintf (stdout
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2531 fprintf (stdout
, _(" Display information about the contents of ELF format files\n"));
2532 fprintf (stdout
, _(" Options are:\n\
2533 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2534 -h --file-header Display the ELF file header\n\
2535 -l --program-headers Display the program headers\n\
2536 --segments An alias for --program-headers\n\
2537 -S --section-headers Display the sections' header\n\
2538 --sections An alias for --section-headers\n\
2539 -g --section-groups Display the section groups\n\
2540 -e --headers Equivalent to: -h -l -S\n\
2541 -s --syms Display the symbol table\n\
2542 --symbols An alias for --syms\n\
2543 -n --notes Display the core notes (if present)\n\
2544 -r --relocs Display the relocations (if present)\n\
2545 -u --unwind Display the unwind info (if present)\n\
2546 -d --dynamic Display the dynamic section (if present)\n\
2547 -V --version-info Display the version sections (if present)\n\
2548 -A --arch-specific Display architecture specific information (if any).\n\
2549 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2550 -x --hex-dump=<number> Dump the contents of section <number>\n\
2551 -w[liaprmfFso] or\n\
2552 --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]\n\
2553 Display the contents of DWARF2 debug sections\n"));
2554 #ifdef SUPPORT_DISASSEMBLY
2555 fprintf (stdout
, _("\
2556 -i --instruction-dump=<number>\n\
2557 Disassemble the contents of section <number>\n"));
2559 fprintf (stdout
, _("\
2560 -I --histogram Display histogram of bucket list lengths\n\
2561 -W --wide Allow output width to exceed 80 characters\n\
2562 -H --help Display this information\n\
2563 -v --version Display the version number of readelf\n"));
2564 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2570 request_dump (unsigned int section
, int type
)
2572 if (section
>= num_dump_sects
)
2574 char *new_dump_sects
;
2576 new_dump_sects
= calloc (section
+ 1, 1);
2578 if (new_dump_sects
== NULL
)
2579 error (_("Out of memory allocating dump request table."));
2582 /* Copy current flag settings. */
2583 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2587 dump_sects
= new_dump_sects
;
2588 num_dump_sects
= section
+ 1;
2593 dump_sects
[section
] |= type
;
2599 parse_args (int argc
, char **argv
)
2606 while ((c
= getopt_long
2607 (argc
, argv
, "ersuahnldSDAIgw::x:i:vVWH", options
, NULL
)) != EOF
)
2628 do_section_groups
++;
2636 do_section_groups
++;
2678 section
= strtoul (optarg
, & cp
, 0);
2679 if (! *cp
&& section
>= 0)
2681 request_dump (section
, HEX_DUMP
);
2691 unsigned int index
= 0;
2695 while (optarg
[index
])
2696 switch (optarg
[index
++])
2705 do_debug_abbrevs
= 1;
2715 do_debug_pubnames
= 1;
2720 do_debug_aranges
= 1;
2724 do_debug_frames_interp
= 1;
2726 do_debug_frames
= 1;
2731 do_debug_macinfo
= 1;
2745 warn (_("Unrecognized debug option '%s'\n"), optarg
);
2750 case OPTION_DEBUG_DUMP
:
2756 static const char *debug_dump_opt
[]
2757 = { "line", "info", "abbrev", "pubnames", "ranges",
2758 "macro", "frames", "frames-interp", "str", "loc", NULL
};
2767 for (index
= 0; debug_dump_opt
[index
]; index
++)
2769 size_t len
= strlen (debug_dump_opt
[index
]);
2771 if (strncmp (p
, debug_dump_opt
[index
], len
) == 0
2772 && (p
[len
] == ',' || p
[len
] == '\0'))
2781 do_debug_abbrevs
= 1;
2792 do_debug_pubnames
= 1;
2796 do_debug_aranges
= 1;
2801 do_debug_frames_interp
= 1;
2802 do_debug_frames
= 1;
2806 do_debug_macinfo
= 1;
2819 if (debug_dump_opt
[index
] == NULL
)
2821 warn (_("Unrecognized debug option '%s'\n"), p
);
2822 p
= strchr (p
, ',');
2832 #ifdef SUPPORT_DISASSEMBLY
2835 section
= strtoul (optarg
, & cp
, 0);
2836 if (! *cp
&& section
>= 0)
2838 request_dump (section
, DISASS_DUMP
);
2844 print_version (program_name
);
2854 /* xgettext:c-format */
2855 error (_("Invalid option '-%c'\n"), c
);
2862 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
2863 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2864 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
2865 && !do_section_groups
)
2869 warn (_("Nothing to do.\n"));
2875 get_elf_class (unsigned int elf_class
)
2877 static char buff
[32];
2881 case ELFCLASSNONE
: return _("none");
2882 case ELFCLASS32
: return "ELF32";
2883 case ELFCLASS64
: return "ELF64";
2885 sprintf (buff
, _("<unknown: %x>"), elf_class
);
2891 get_data_encoding (unsigned int encoding
)
2893 static char buff
[32];
2897 case ELFDATANONE
: return _("none");
2898 case ELFDATA2LSB
: return _("2's complement, little endian");
2899 case ELFDATA2MSB
: return _("2's complement, big endian");
2901 sprintf (buff
, _("<unknown: %x>"), encoding
);
2906 /* Decode the data held in 'elf_header'. */
2909 process_file_header (void)
2911 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2912 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
2913 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
2914 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
2917 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2925 printf (_("ELF Header:\n"));
2926 printf (_(" Magic: "));
2927 for (i
= 0; i
< EI_NIDENT
; i
++)
2928 printf ("%2.2x ", elf_header
.e_ident
[i
]);
2930 printf (_(" Class: %s\n"),
2931 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
2932 printf (_(" Data: %s\n"),
2933 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
2934 printf (_(" Version: %d %s\n"),
2935 elf_header
.e_ident
[EI_VERSION
],
2936 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
2938 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
2941 printf (_(" OS/ABI: %s\n"),
2942 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
2943 printf (_(" ABI Version: %d\n"),
2944 elf_header
.e_ident
[EI_ABIVERSION
]);
2945 printf (_(" Type: %s\n"),
2946 get_file_type (elf_header
.e_type
));
2947 printf (_(" Machine: %s\n"),
2948 get_machine_name (elf_header
.e_machine
));
2949 printf (_(" Version: 0x%lx\n"),
2950 (unsigned long) elf_header
.e_version
);
2952 printf (_(" Entry point address: "));
2953 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2954 printf (_("\n Start of program headers: "));
2955 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2956 printf (_(" (bytes into file)\n Start of section headers: "));
2957 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
2958 printf (_(" (bytes into file)\n"));
2960 printf (_(" Flags: 0x%lx%s\n"),
2961 (unsigned long) elf_header
.e_flags
,
2962 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
2963 printf (_(" Size of this header: %ld (bytes)\n"),
2964 (long) elf_header
.e_ehsize
);
2965 printf (_(" Size of program headers: %ld (bytes)\n"),
2966 (long) elf_header
.e_phentsize
);
2967 printf (_(" Number of program headers: %ld\n"),
2968 (long) elf_header
.e_phnum
);
2969 printf (_(" Size of section headers: %ld (bytes)\n"),
2970 (long) elf_header
.e_shentsize
);
2971 printf (_(" Number of section headers: %ld"),
2972 (long) elf_header
.e_shnum
);
2973 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
2974 printf (" (%ld)", (long) section_headers
[0].sh_size
);
2975 putc ('\n', stdout
);
2976 printf (_(" Section header string table index: %ld"),
2977 (long) elf_header
.e_shstrndx
);
2978 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
2979 printf (" (%ld)", (long) section_headers
[0].sh_link
);
2980 putc ('\n', stdout
);
2983 if (section_headers
!= NULL
)
2985 if (elf_header
.e_shnum
== 0)
2986 elf_header
.e_shnum
= section_headers
[0].sh_size
;
2987 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
2988 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
2989 free (section_headers
);
2990 section_headers
= NULL
;
2998 get_32bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3000 Elf32_External_Phdr
*phdrs
;
3001 Elf32_External_Phdr
*external
;
3002 Elf_Internal_Phdr
*internal
;
3005 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3006 elf_header
.e_phentsize
* elf_header
.e_phnum
,
3007 _("program headers"));
3011 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3012 i
< elf_header
.e_phnum
;
3013 i
++, internal
++, external
++)
3015 internal
->p_type
= BYTE_GET (external
->p_type
);
3016 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3017 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3018 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3019 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3020 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3021 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3022 internal
->p_align
= BYTE_GET (external
->p_align
);
3031 get_64bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3033 Elf64_External_Phdr
*phdrs
;
3034 Elf64_External_Phdr
*external
;
3035 Elf_Internal_Phdr
*internal
;
3038 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3039 elf_header
.e_phentsize
* elf_header
.e_phnum
,
3040 _("program headers"));
3044 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3045 i
< elf_header
.e_phnum
;
3046 i
++, internal
++, external
++)
3048 internal
->p_type
= BYTE_GET (external
->p_type
);
3049 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3050 internal
->p_offset
= BYTE_GET8 (external
->p_offset
);
3051 internal
->p_vaddr
= BYTE_GET8 (external
->p_vaddr
);
3052 internal
->p_paddr
= BYTE_GET8 (external
->p_paddr
);
3053 internal
->p_filesz
= BYTE_GET8 (external
->p_filesz
);
3054 internal
->p_memsz
= BYTE_GET8 (external
->p_memsz
);
3055 internal
->p_align
= BYTE_GET8 (external
->p_align
);
3063 /* Returns 1 if the program headers were read into `program_headers'. */
3066 get_program_headers (FILE *file
)
3068 Elf_Internal_Phdr
*phdrs
;
3070 /* Check cache of prior read. */
3071 if (program_headers
!= NULL
)
3074 phdrs
= malloc (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
3078 error (_("Out of memory\n"));
3083 ? get_32bit_program_headers (file
, phdrs
)
3084 : get_64bit_program_headers (file
, phdrs
))
3086 program_headers
= phdrs
;
3094 /* Returns 1 if the program headers were loaded. */
3097 process_program_headers (FILE *file
)
3099 Elf_Internal_Phdr
*segment
;
3102 if (elf_header
.e_phnum
== 0)
3105 printf (_("\nThere are no program headers in this file.\n"));
3109 if (do_segments
&& !do_header
)
3111 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3112 printf (_("Entry point "));
3113 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3114 printf (_("\nThere are %d program headers, starting at offset "),
3115 elf_header
.e_phnum
);
3116 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3120 if (! get_program_headers (file
))
3125 if (elf_header
.e_phnum
> 1)
3126 printf (_("\nProgram Headers:\n"));
3128 printf (_("\nProgram Headers:\n"));
3132 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3135 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3139 (_(" Type Offset VirtAddr PhysAddr\n"));
3141 (_(" FileSiz MemSiz Flags Align\n"));
3148 for (i
= 0, segment
= program_headers
;
3149 i
< elf_header
.e_phnum
;
3154 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3158 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3159 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3160 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3161 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3162 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3164 (segment
->p_flags
& PF_R
? 'R' : ' '),
3165 (segment
->p_flags
& PF_W
? 'W' : ' '),
3166 (segment
->p_flags
& PF_X
? 'E' : ' '));
3167 printf ("%#lx", (unsigned long) segment
->p_align
);
3171 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3172 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3175 print_vma (segment
->p_offset
, FULL_HEX
);
3179 print_vma (segment
->p_vaddr
, FULL_HEX
);
3181 print_vma (segment
->p_paddr
, FULL_HEX
);
3184 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3185 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3188 print_vma (segment
->p_filesz
, FULL_HEX
);
3192 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3193 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3196 print_vma (segment
->p_offset
, FULL_HEX
);
3200 (segment
->p_flags
& PF_R
? 'R' : ' '),
3201 (segment
->p_flags
& PF_W
? 'W' : ' '),
3202 (segment
->p_flags
& PF_X
? 'E' : ' '));
3204 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3205 printf ("%#lx", (unsigned long) segment
->p_align
);
3208 print_vma (segment
->p_align
, PREFIX_HEX
);
3213 print_vma (segment
->p_offset
, FULL_HEX
);
3215 print_vma (segment
->p_vaddr
, FULL_HEX
);
3217 print_vma (segment
->p_paddr
, FULL_HEX
);
3219 print_vma (segment
->p_filesz
, FULL_HEX
);
3221 print_vma (segment
->p_memsz
, FULL_HEX
);
3223 (segment
->p_flags
& PF_R
? 'R' : ' '),
3224 (segment
->p_flags
& PF_W
? 'W' : ' '),
3225 (segment
->p_flags
& PF_X
? 'E' : ' '));
3226 print_vma (segment
->p_align
, HEX
);
3230 switch (segment
->p_type
)
3234 error (_("more than one dynamic segment\n"));
3236 /* Try to locate the .dynamic section. If there is
3237 a section header table, we can easily locate it. */
3238 if (section_headers
!= NULL
)
3240 Elf_Internal_Shdr
*sec
;
3243 for (j
= 0, sec
= section_headers
;
3244 j
< elf_header
.e_shnum
;
3246 if (strcmp (SECTION_NAME (sec
), ".dynamic") == 0)
3249 if (j
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
3251 error (_("no .dynamic section in the dynamic segment"));
3255 dynamic_addr
= sec
->sh_offset
;
3256 dynamic_size
= sec
->sh_size
;
3258 if (dynamic_addr
< segment
->p_offset
3259 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
3260 warn (_("the .dynamic section is not contained within the dynamic segment"));
3261 else if (dynamic_addr
> segment
->p_offset
)
3262 warn (_("the .dynamic section is not the first section in the dynamic segment."));
3266 /* Otherwise, we can only assume that the .dynamic
3267 section is the first section in the DYNAMIC segment. */
3268 dynamic_addr
= segment
->p_offset
;
3269 dynamic_size
= segment
->p_filesz
;
3274 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3276 error (_("Unable to find program interpreter name\n"));
3279 program_interpreter
[0] = 0;
3280 fscanf (file
, "%63s", program_interpreter
);
3283 printf (_("\n [Requesting program interpreter: %s]"),
3284 program_interpreter
);
3290 putc ('\n', stdout
);
3293 if (do_segments
&& section_headers
!= NULL
)
3295 printf (_("\n Section to Segment mapping:\n"));
3296 printf (_(" Segment Sections...\n"));
3298 assert (string_table
!= NULL
);
3300 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3303 Elf_Internal_Shdr
*section
;
3305 segment
= program_headers
+ i
;
3306 section
= section_headers
;
3308 printf (" %2.2d ", i
);
3310 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3312 if (section
->sh_size
> 0
3313 /* Compare allocated sections by VMA, unallocated
3314 sections by file offset. */
3315 && (section
->sh_flags
& SHF_ALLOC
3316 ? (section
->sh_addr
>= segment
->p_vaddr
3317 && section
->sh_addr
+ section
->sh_size
3318 <= segment
->p_vaddr
+ segment
->p_memsz
)
3319 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
3320 && (section
->sh_offset
+ section
->sh_size
3321 <= segment
->p_offset
+ segment
->p_filesz
)))
3322 /* .tbss is special. It doesn't contribute memory space
3323 to normal segments. */
3324 && (!((section
->sh_flags
& SHF_TLS
) != 0
3325 && section
->sh_type
== SHT_NOBITS
)
3326 || segment
->p_type
== PT_TLS
))
3327 printf ("%s ", SECTION_NAME (section
));
3338 /* Find the file offset corresponding to VMA by using the program headers. */
3341 offset_from_vma (FILE *file
, bfd_vma vma
, bfd_size_type size
)
3343 Elf_Internal_Phdr
*seg
;
3345 if (! get_program_headers (file
))
3347 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3351 for (seg
= program_headers
;
3352 seg
< program_headers
+ elf_header
.e_phnum
;
3355 if (seg
->p_type
!= PT_LOAD
)
3358 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3359 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3360 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3363 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3370 get_32bit_section_headers (FILE *file
, unsigned int num
)
3372 Elf32_External_Shdr
*shdrs
;
3373 Elf_Internal_Shdr
*internal
;
3376 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3377 elf_header
.e_shentsize
* num
, _("section headers"));
3381 section_headers
= malloc (num
* sizeof (Elf_Internal_Shdr
));
3383 if (section_headers
== NULL
)
3385 error (_("Out of memory\n"));
3389 for (i
= 0, internal
= section_headers
;
3393 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3394 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3395 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3396 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3397 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3398 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3399 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3400 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3401 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3402 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3411 get_64bit_section_headers (FILE *file
, unsigned int num
)
3413 Elf64_External_Shdr
*shdrs
;
3414 Elf_Internal_Shdr
*internal
;
3417 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3418 elf_header
.e_shentsize
* num
, _("section headers"));
3422 section_headers
= malloc (num
* sizeof (Elf_Internal_Shdr
));
3424 if (section_headers
== NULL
)
3426 error (_("Out of memory\n"));
3430 for (i
= 0, internal
= section_headers
;
3434 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3435 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3436 internal
->sh_flags
= BYTE_GET8 (shdrs
[i
].sh_flags
);
3437 internal
->sh_addr
= BYTE_GET8 (shdrs
[i
].sh_addr
);
3438 internal
->sh_size
= BYTE_GET8 (shdrs
[i
].sh_size
);
3439 internal
->sh_entsize
= BYTE_GET8 (shdrs
[i
].sh_entsize
);
3440 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3441 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3442 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3443 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3451 static Elf_Internal_Sym
*
3452 get_32bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3454 unsigned long number
;
3455 Elf32_External_Sym
*esyms
;
3456 Elf_External_Sym_Shndx
*shndx
;
3457 Elf_Internal_Sym
*isyms
;
3458 Elf_Internal_Sym
*psym
;
3461 esyms
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
3467 if (symtab_shndx_hdr
!= NULL
3468 && (symtab_shndx_hdr
->sh_link
3469 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3471 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3472 symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3480 number
= section
->sh_size
/ section
->sh_entsize
;
3481 isyms
= malloc (number
* sizeof (Elf_Internal_Sym
));
3485 error (_("Out of memory\n"));
3492 for (j
= 0, psym
= isyms
;
3496 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3497 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3498 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3499 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3500 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3502 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3503 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3504 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3514 static Elf_Internal_Sym
*
3515 get_64bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3517 unsigned long number
;
3518 Elf64_External_Sym
*esyms
;
3519 Elf_External_Sym_Shndx
*shndx
;
3520 Elf_Internal_Sym
*isyms
;
3521 Elf_Internal_Sym
*psym
;
3524 esyms
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
3530 if (symtab_shndx_hdr
!= NULL
3531 && (symtab_shndx_hdr
->sh_link
3532 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3534 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3535 symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3543 number
= section
->sh_size
/ section
->sh_entsize
;
3544 isyms
= malloc (number
* sizeof (Elf_Internal_Sym
));
3548 error (_("Out of memory\n"));
3555 for (j
= 0, psym
= isyms
;
3559 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3560 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3561 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3562 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3563 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3565 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3566 psym
->st_value
= BYTE_GET8 (esyms
[j
].st_value
);
3567 psym
->st_size
= BYTE_GET8 (esyms
[j
].st_size
);
3578 get_elf_section_flags (bfd_vma sh_flags
)
3580 static char buff
[32];
3588 flag
= sh_flags
& - sh_flags
;
3593 case SHF_WRITE
: strcat (buff
, "W"); break;
3594 case SHF_ALLOC
: strcat (buff
, "A"); break;
3595 case SHF_EXECINSTR
: strcat (buff
, "X"); break;
3596 case SHF_MERGE
: strcat (buff
, "M"); break;
3597 case SHF_STRINGS
: strcat (buff
, "S"); break;
3598 case SHF_INFO_LINK
: strcat (buff
, "I"); break;
3599 case SHF_LINK_ORDER
: strcat (buff
, "L"); break;
3600 case SHF_OS_NONCONFORMING
: strcat (buff
, "O"); break;
3601 case SHF_GROUP
: strcat (buff
, "G"); break;
3602 case SHF_TLS
: strcat (buff
, "T"); break;
3605 if (flag
& SHF_MASKOS
)
3608 sh_flags
&= ~ SHF_MASKOS
;
3610 else if (flag
& SHF_MASKPROC
)
3613 sh_flags
&= ~ SHF_MASKPROC
;
3625 process_section_headers (FILE *file
)
3627 Elf_Internal_Shdr
*section
;
3630 section_headers
= NULL
;
3632 if (elf_header
.e_shnum
== 0)
3635 printf (_("\nThere are no sections in this file.\n"));
3640 if (do_sections
&& !do_header
)
3641 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3642 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3646 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3649 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3652 /* Read in the string table, so that we have names to display. */
3653 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3655 if (section
->sh_size
!= 0)
3657 string_table
= get_data (NULL
, file
, section
->sh_offset
,
3658 section
->sh_size
, _("string table"));
3660 if (string_table
== NULL
)
3663 string_table_length
= section
->sh_size
;
3666 /* Scan the sections for the dynamic symbol table
3667 and dynamic string table and debug sections. */
3668 dynamic_symbols
= NULL
;
3669 dynamic_strings
= NULL
;
3670 dynamic_syminfo
= NULL
;
3671 symtab_shndx_hdr
= NULL
;
3673 for (i
= 0, section
= section_headers
;
3674 i
< elf_header
.e_shnum
;
3677 char *name
= SECTION_NAME (section
);
3679 if (section
->sh_type
== SHT_DYNSYM
)
3681 if (dynamic_symbols
!= NULL
)
3683 error (_("File contains multiple dynamic symbol tables\n"));
3687 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3688 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3690 else if (section
->sh_type
== SHT_STRTAB
3691 && strcmp (name
, ".dynstr") == 0)
3693 if (dynamic_strings
!= NULL
)
3695 error (_("File contains multiple dynamic string tables\n"));
3699 dynamic_strings
= get_data (NULL
, file
, section
->sh_offset
,
3700 section
->sh_size
, _("dynamic strings"));
3702 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
3704 if (symtab_shndx_hdr
!= NULL
)
3706 error (_("File contains multiple symtab shndx tables\n"));
3709 symtab_shndx_hdr
= section
;
3711 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
3712 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
3713 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
3715 && strncmp (name
, ".debug_", 7) == 0)
3720 || (do_debug_info
&& (strcmp (name
, "info") == 0))
3721 || (do_debug_abbrevs
&& (strcmp (name
, "abbrev") == 0))
3722 || (do_debug_lines
&& (strcmp (name
, "line") == 0))
3723 || (do_debug_pubnames
&& (strcmp (name
, "pubnames") == 0))
3724 || (do_debug_aranges
&& (strcmp (name
, "aranges") == 0))
3725 || (do_debug_frames
&& (strcmp (name
, "frame") == 0))
3726 || (do_debug_macinfo
&& (strcmp (name
, "macinfo") == 0))
3727 || (do_debug_str
&& (strcmp (name
, "str") == 0))
3728 || (do_debug_loc
&& (strcmp (name
, "loc") == 0))
3730 request_dump (i
, DEBUG_DUMP
);
3732 /* linkonce section to be combined with .debug_info at link time. */
3733 else if ((do_debugging
|| do_debug_info
)
3734 && strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
3735 request_dump (i
, DEBUG_DUMP
);
3736 else if (do_debug_frames
&& strcmp (name
, ".eh_frame") == 0)
3737 request_dump (i
, DEBUG_DUMP
);
3743 if (elf_header
.e_shnum
> 1)
3744 printf (_("\nSection Headers:\n"));
3746 printf (_("\nSection Header:\n"));
3750 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3753 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3756 printf (_(" [Nr] Name Type Address Offset\n"));
3757 printf (_(" Size EntSize Flags Link Info Align\n"));
3760 for (i
= 0, section
= section_headers
;
3761 i
< elf_header
.e_shnum
;
3764 printf (" [%2u] %-17.17s %-15.15s ",
3765 SECTION_HEADER_NUM (i
),
3766 SECTION_NAME (section
),
3767 get_section_type_name (section
->sh_type
));
3771 print_vma (section
->sh_addr
, LONG_HEX
);
3773 printf ( " %6.6lx %6.6lx %2.2lx",
3774 (unsigned long) section
->sh_offset
,
3775 (unsigned long) section
->sh_size
,
3776 (unsigned long) section
->sh_entsize
);
3778 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3780 printf ("%2ld %3lu %2ld\n",
3781 (unsigned long) section
->sh_link
,
3782 (unsigned long) section
->sh_info
,
3783 (unsigned long) section
->sh_addralign
);
3787 print_vma (section
->sh_addr
, LONG_HEX
);
3789 if ((long) section
->sh_offset
== section
->sh_offset
)
3790 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
3794 print_vma (section
->sh_offset
, LONG_HEX
);
3797 if ((unsigned long) section
->sh_size
== section
->sh_size
)
3798 printf (" %6.6lx", (unsigned long) section
->sh_size
);
3802 print_vma (section
->sh_size
, LONG_HEX
);
3805 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
3806 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
3810 print_vma (section
->sh_entsize
, LONG_HEX
);
3813 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3815 printf ("%2ld %3lu ",
3816 (unsigned long) section
->sh_link
,
3817 (unsigned long) section
->sh_info
);
3819 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
3820 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
3823 print_vma (section
->sh_addralign
, DEC
);
3830 print_vma (section
->sh_addr
, LONG_HEX
);
3831 if ((long) section
->sh_offset
== section
->sh_offset
)
3832 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
3836 print_vma (section
->sh_offset
, LONG_HEX
);
3839 print_vma (section
->sh_size
, LONG_HEX
);
3841 print_vma (section
->sh_entsize
, LONG_HEX
);
3843 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3845 printf (" %2ld %3lu %ld\n",
3846 (unsigned long) section
->sh_link
,
3847 (unsigned long) section
->sh_info
,
3848 (unsigned long) section
->sh_addralign
);
3852 printf (_("Key to Flags:\n\
3853 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3854 I (info), L (link order), G (group), x (unknown)\n\
3855 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3861 get_group_flags (unsigned int flags
)
3863 static char buff
[32];
3870 sprintf (buff
, _("[<unknown>: 0x%x]"), flags
);
3877 process_section_groups (FILE *file
)
3879 Elf_Internal_Shdr
*section
;
3881 struct group
*group
;
3883 if (elf_header
.e_shnum
== 0)
3885 if (do_section_groups
)
3886 printf (_("\nThere are no section groups in this file.\n"));
3891 if (section_headers
== NULL
)
3893 error (_("Section headers are not available!\n"));
3897 section_headers_groups
= calloc (elf_header
.e_shnum
,
3898 sizeof (struct group
*));
3900 if (section_headers_groups
== NULL
)
3902 error (_("Out of memory\n"));
3906 /* Scan the sections for the group section. */
3907 for (i
= 0, section
= section_headers
;
3908 i
< elf_header
.e_shnum
;
3910 if (section
->sh_type
== SHT_GROUP
)
3913 section_groups
= calloc (group_count
, sizeof (struct group
));
3915 if (section_groups
== NULL
)
3917 error (_("Out of memory\n"));
3921 for (i
= 0, section
= section_headers
, group
= section_groups
;
3922 i
< elf_header
.e_shnum
;
3925 if (section
->sh_type
== SHT_GROUP
)
3927 char *name
= SECTION_NAME (section
);
3928 char *group_name
, *strtab
, *start
, *indices
;
3929 unsigned int entry
, j
, size
;
3930 Elf_Internal_Sym
*sym
;
3931 Elf_Internal_Shdr
*symtab_sec
, *strtab_sec
, *sec
;
3932 Elf_Internal_Sym
*symtab
;
3934 /* Get the symbol table. */
3935 symtab_sec
= SECTION_HEADER (section
->sh_link
);
3936 if (symtab_sec
->sh_type
!= SHT_SYMTAB
)
3938 error (_("Bad sh_link in group section `%s'\n"), name
);
3941 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
);
3943 sym
= symtab
+ section
->sh_info
;
3945 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
3947 bfd_vma sec_index
= SECTION_HEADER_INDEX (sym
->st_shndx
);
3950 error (_("Bad sh_info in group section `%s'\n"), name
);
3954 group_name
= SECTION_NAME (section_headers
+ sec_index
);
3959 /* Get the string table. */
3960 strtab_sec
= SECTION_HEADER (symtab_sec
->sh_link
);
3961 strtab
= get_data (NULL
, file
, strtab_sec
->sh_offset
,
3962 strtab_sec
->sh_size
,
3965 group_name
= strtab
+ sym
->st_name
;
3968 start
= get_data (NULL
, file
, section
->sh_offset
,
3969 section
->sh_size
, _("section data"));
3972 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
3973 entry
= byte_get (indices
, 4);
3976 if (do_section_groups
)
3978 printf ("\n%s group section `%s' [%s] contains %u sections:\n",
3979 get_group_flags (entry
), name
, group_name
, size
);
3981 printf (_(" [Index] Name\n"));
3984 group
->group_index
= i
;
3986 for (j
= 0; j
< size
; j
++)
3988 struct group_list
*g
;
3990 entry
= byte_get (indices
, 4);
3993 if (section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
3996 error (_("section [%5u] already in group section [%5u]\n"),
3997 entry
, section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4001 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4004 if (do_section_groups
)
4006 sec
= SECTION_HEADER (entry
);
4007 printf (" [%5u] %s\n",
4008 entry
, SECTION_NAME (sec
));
4011 g
= xmalloc (sizeof (struct group_list
));
4012 g
->section_index
= entry
;
4013 g
->next
= group
->root
;
4035 } dynamic_relocations
[] =
4037 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
4038 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
4039 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
4042 /* Process the reloc section. */
4044 process_relocs (FILE *file
)
4046 unsigned long rel_size
;
4047 unsigned long rel_offset
;
4053 if (do_using_dynamic
)
4057 int has_dynamic_reloc
;
4060 has_dynamic_reloc
= 0;
4062 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
4064 is_rela
= dynamic_relocations
[i
].rela
;
4065 name
= dynamic_relocations
[i
].name
;
4066 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
4067 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
4069 has_dynamic_reloc
|= rel_size
;
4071 if (is_rela
== UNKNOWN
)
4073 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
4074 switch (dynamic_info
[DT_PLTREL
])
4088 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4089 name
, rel_offset
, rel_size
);
4091 dump_relocations (file
,
4092 offset_from_vma (file
, rel_offset
, rel_size
),
4094 dynamic_symbols
, num_dynamic_syms
,
4095 dynamic_strings
, is_rela
);
4099 if (! has_dynamic_reloc
)
4100 printf (_("\nThere are no dynamic relocations in this file.\n"));
4104 Elf_Internal_Shdr
*section
;
4108 for (i
= 0, section
= section_headers
;
4109 i
< elf_header
.e_shnum
;
4112 if ( section
->sh_type
!= SHT_RELA
4113 && section
->sh_type
!= SHT_REL
)
4116 rel_offset
= section
->sh_offset
;
4117 rel_size
= section
->sh_size
;
4121 Elf_Internal_Shdr
*strsec
;
4122 Elf_Internal_Sym
*symtab
;
4125 unsigned long nsyms
;
4127 printf (_("\nRelocation section "));
4129 if (string_table
== NULL
)
4130 printf ("%d", section
->sh_name
);
4132 printf (_("'%s'"), SECTION_NAME (section
));
4134 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4135 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4140 if (section
->sh_link
)
4142 Elf_Internal_Shdr
*symsec
;
4144 symsec
= SECTION_HEADER (section
->sh_link
);
4145 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4146 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4151 strsec
= SECTION_HEADER (symsec
->sh_link
);
4153 strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4154 strsec
->sh_size
, _("string table"));
4156 is_rela
= section
->sh_type
== SHT_RELA
;
4158 dump_relocations (file
, rel_offset
, rel_size
,
4159 symtab
, nsyms
, strtab
, is_rela
);
4171 printf (_("\nThere are no relocations in this file.\n"));
4177 #include "unwind-ia64.h"
4179 /* An absolute address consists of a section and an offset. If the
4180 section is NULL, the offset itself is the address, otherwise, the
4181 address equals to LOAD_ADDRESS(section) + offset. */
4185 unsigned short section
;
4191 struct unw_table_entry
4193 struct absaddr start
;
4195 struct absaddr info
;
4197 *table
; /* Unwind table. */
4198 unsigned long table_len
; /* Length of unwind table. */
4199 unsigned char *info
; /* Unwind info. */
4200 unsigned long info_size
; /* Size of unwind info. */
4201 bfd_vma info_addr
; /* starting address of unwind info. */
4202 bfd_vma seg_base
; /* Starting address of segment. */
4203 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4204 unsigned long nsyms
; /* Number of symbols. */
4205 char *strtab
; /* The string table. */
4206 unsigned long strtab_size
; /* Size of string table. */
4210 find_symbol_for_address (struct unw_aux_info
*aux
,
4211 struct absaddr addr
,
4212 const char **symname
,
4215 bfd_vma dist
= 0x100000;
4216 Elf_Internal_Sym
*sym
, *best
= NULL
;
4219 for (i
= 0, sym
= aux
->symtab
; i
< aux
->nsyms
; ++i
, ++sym
)
4221 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
4222 && sym
->st_name
!= 0
4223 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
4224 && addr
.offset
>= sym
->st_value
4225 && addr
.offset
- sym
->st_value
< dist
)
4228 dist
= addr
.offset
- sym
->st_value
;
4235 *symname
= (best
->st_name
>= aux
->strtab_size
4236 ? "<corrupt>" : aux
->strtab
+ best
->st_name
);
4241 *offset
= addr
.offset
;
4245 dump_ia64_unwind (struct unw_aux_info
*aux
)
4248 struct unw_table_entry
*tp
;
4251 addr_size
= is_32bit_elf
? 4 : 8;
4253 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4257 const unsigned char *dp
;
4258 const unsigned char *head
;
4259 const char *procname
;
4261 find_symbol_for_address (aux
, tp
->start
, &procname
, &offset
);
4263 fputs ("\n<", stdout
);
4267 fputs (procname
, stdout
);
4270 printf ("+%lx", (unsigned long) offset
);
4273 fputs (">: [", stdout
);
4274 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4275 fputc ('-', stdout
);
4276 print_vma (tp
->end
.offset
, PREFIX_HEX
);
4277 printf ("], info at +0x%lx\n",
4278 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
4280 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
4281 stamp
= BYTE_GET8 ((unsigned char *) head
);
4283 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4284 (unsigned) UNW_VER (stamp
),
4285 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
4286 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
4287 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
4288 (unsigned long) (addr_size
* UNW_LENGTH (stamp
)));
4290 if (UNW_VER (stamp
) != 1)
4292 printf ("\tUnknown version.\n");
4297 for (dp
= head
+ 8; dp
< head
+ 8 + addr_size
* UNW_LENGTH (stamp
);)
4298 dp
= unw_decode (dp
, in_body
, & in_body
);
4303 slurp_ia64_unwind_table (FILE *file
,
4304 struct unw_aux_info
*aux
,
4305 Elf_Internal_Shdr
*sec
)
4307 unsigned long size
, addr_size
, nrelas
, i
;
4308 Elf_Internal_Phdr
*seg
;
4309 struct unw_table_entry
*tep
;
4310 Elf_Internal_Shdr
*relsec
;
4311 Elf_Internal_Rela
*rela
, *rp
;
4312 unsigned char *table
, *tp
;
4313 Elf_Internal_Sym
*sym
;
4314 const char *relname
;
4316 addr_size
= is_32bit_elf
? 4 : 8;
4318 /* First, find the starting address of the segment that includes
4321 if (elf_header
.e_phnum
)
4323 if (! get_program_headers (file
))
4326 for (seg
= program_headers
;
4327 seg
< program_headers
+ elf_header
.e_phnum
;
4330 if (seg
->p_type
!= PT_LOAD
)
4333 if (sec
->sh_addr
>= seg
->p_vaddr
4334 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
4336 aux
->seg_base
= seg
->p_vaddr
;
4342 /* Second, build the unwind table from the contents of the unwind section: */
4343 size
= sec
->sh_size
;
4344 table
= get_data (NULL
, file
, sec
->sh_offset
, size
, _("unwind table"));
4348 tep
= aux
->table
= xmalloc (size
/ (3 * addr_size
) * sizeof (aux
->table
[0]));
4349 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * addr_size
, ++tep
)
4351 tep
->start
.section
= SHN_UNDEF
;
4352 tep
->end
.section
= SHN_UNDEF
;
4353 tep
->info
.section
= SHN_UNDEF
;
4356 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
4357 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
4358 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
4362 tep
->start
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 0);
4363 tep
->end
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 8);
4364 tep
->info
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 16);
4366 tep
->start
.offset
+= aux
->seg_base
;
4367 tep
->end
.offset
+= aux
->seg_base
;
4368 tep
->info
.offset
+= aux
->seg_base
;
4372 /* Third, apply any relocations to the unwind table: */
4374 for (relsec
= section_headers
;
4375 relsec
< section_headers
+ elf_header
.e_shnum
;
4378 if (relsec
->sh_type
!= SHT_RELA
4379 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4382 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
4386 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
4390 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
4391 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
4393 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
4395 warn (_("Skipping unexpected symbol type %u\n"),
4396 ELF32_ST_TYPE (sym
->st_info
));
4402 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
4403 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
4405 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
4407 warn (_("Skipping unexpected symbol type %u\n"),
4408 ELF64_ST_TYPE (sym
->st_info
));
4413 if (strncmp (relname
, "R_IA64_SEGREL", 13) != 0)
4415 warn (_("Skipping unexpected relocation type %s\n"), relname
);
4419 i
= rp
->r_offset
/ (3 * addr_size
);
4421 switch (rp
->r_offset
/addr_size
% 3)
4424 aux
->table
[i
].start
.section
= sym
->st_shndx
;
4425 aux
->table
[i
].start
.offset
+= rp
->r_addend
;
4428 aux
->table
[i
].end
.section
= sym
->st_shndx
;
4429 aux
->table
[i
].end
.offset
+= rp
->r_addend
;
4432 aux
->table
[i
].info
.section
= sym
->st_shndx
;
4433 aux
->table
[i
].info
.offset
+= rp
->r_addend
;
4443 aux
->table_len
= size
/ (3 * addr_size
);
4448 process_unwind (FILE *file
)
4450 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
4451 unsigned long i
, addr_size
, unwcount
= 0, unwstart
= 0;
4452 struct unw_aux_info aux
;
4457 if (elf_header
.e_machine
!= EM_IA_64
)
4459 printf (_("\nThere are no unwind sections in this file.\n"));
4463 memset (& aux
, 0, sizeof (aux
));
4465 addr_size
= is_32bit_elf
? 4 : 8;
4467 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
4469 if (sec
->sh_type
== SHT_SYMTAB
)
4471 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
4472 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
4474 strsec
= SECTION_HEADER (sec
->sh_link
);
4475 aux
.strtab_size
= strsec
->sh_size
;
4476 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4477 aux
.strtab_size
, _("string table"));
4479 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4484 printf (_("\nThere are no unwind sections in this file.\n"));
4486 while (unwcount
-- > 0)
4491 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
4492 i
< elf_header
.e_shnum
; ++i
, ++sec
)
4493 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4500 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
4502 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
4504 /* We need to find which section group it is in. */
4505 struct group_list
*g
= section_headers_groups
[i
]->root
;
4507 for (; g
!= NULL
; g
= g
->next
)
4509 sec
= SECTION_HEADER (g
->section_index
);
4510 if (strcmp (SECTION_NAME (sec
),
4511 ELF_STRING_ia64_unwind_info
) == 0)
4516 i
= elf_header
.e_shnum
;
4518 else if (strncmp (SECTION_NAME (unwsec
),
4519 ELF_STRING_ia64_unwind_once
, len
) == 0)
4521 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
4522 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
4523 suffix
= SECTION_NAME (unwsec
) + len
;
4524 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4526 if (strncmp (SECTION_NAME (sec
),
4527 ELF_STRING_ia64_unwind_info_once
, len2
) == 0
4528 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
4533 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4534 .IA_64.unwind or BAR -> .IA_64.unwind_info */
4535 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
4536 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
4538 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
,
4540 suffix
= SECTION_NAME (unwsec
) + len
;
4541 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4543 if (strncmp (SECTION_NAME (sec
),
4544 ELF_STRING_ia64_unwind_info
, len2
) == 0
4545 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
4549 if (i
== elf_header
.e_shnum
)
4551 printf (_("\nCould not find unwind info section for "));
4553 if (string_table
== NULL
)
4554 printf ("%d", unwsec
->sh_name
);
4556 printf (_("'%s'"), SECTION_NAME (unwsec
));
4560 aux
.info_size
= sec
->sh_size
;
4561 aux
.info_addr
= sec
->sh_addr
;
4562 aux
.info
= get_data (NULL
, file
, sec
->sh_offset
, aux
.info_size
,
4565 printf (_("\nUnwind section "));
4567 if (string_table
== NULL
)
4568 printf ("%d", unwsec
->sh_name
);
4570 printf (_("'%s'"), SECTION_NAME (unwsec
));
4572 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4573 (unsigned long) unwsec
->sh_offset
,
4574 (unsigned long) (unwsec
->sh_size
/ (3 * addr_size
)));
4576 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
4578 if (aux
.table_len
> 0)
4579 dump_ia64_unwind (& aux
);
4582 free ((char *) aux
.table
);
4584 free ((char *) aux
.info
);
4593 free ((char *) aux
.strtab
);
4599 dynamic_section_mips_val (Elf_Internal_Dyn
*entry
)
4601 switch (entry
->d_tag
)
4604 if (entry
->d_un
.d_val
== 0)
4608 static const char * opts
[] =
4610 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
4611 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
4612 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
4613 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
4618 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++cnt
)
4619 if (entry
->d_un
.d_val
& (1 << cnt
))
4621 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
4628 case DT_MIPS_IVERSION
:
4629 if (dynamic_strings
!= NULL
)
4630 printf ("Interface Version: %s\n",
4631 dynamic_strings
+ entry
->d_un
.d_val
);
4633 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4636 case DT_MIPS_TIME_STAMP
:
4641 time_t time
= entry
->d_un
.d_val
;
4642 tmp
= gmtime (&time
);
4643 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
4644 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
4645 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
4646 printf ("Time Stamp: %s\n", timebuf
);
4650 case DT_MIPS_RLD_VERSION
:
4651 case DT_MIPS_LOCAL_GOTNO
:
4652 case DT_MIPS_CONFLICTNO
:
4653 case DT_MIPS_LIBLISTNO
:
4654 case DT_MIPS_SYMTABNO
:
4655 case DT_MIPS_UNREFEXTNO
:
4656 case DT_MIPS_HIPAGENO
:
4657 case DT_MIPS_DELTA_CLASS_NO
:
4658 case DT_MIPS_DELTA_INSTANCE_NO
:
4659 case DT_MIPS_DELTA_RELOC_NO
:
4660 case DT_MIPS_DELTA_SYM_NO
:
4661 case DT_MIPS_DELTA_CLASSSYM_NO
:
4662 case DT_MIPS_COMPACT_SIZE
:
4663 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4667 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
4673 dynamic_section_parisc_val (Elf_Internal_Dyn
*entry
)
4675 switch (entry
->d_tag
)
4677 case DT_HP_DLD_FLAGS
:
4686 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
4687 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
4688 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
4689 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
4690 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
4691 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
4692 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
4693 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
4694 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
4695 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
4696 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
4700 bfd_vma val
= entry
->d_un
.d_val
;
4702 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
4703 if (val
& flags
[cnt
].bit
)
4707 fputs (flags
[cnt
].str
, stdout
);
4709 val
^= flags
[cnt
].bit
;
4712 if (val
!= 0 || first
)
4716 print_vma (val
, HEX
);
4722 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4729 dynamic_section_ia64_val (Elf_Internal_Dyn
*entry
)
4731 switch (entry
->d_tag
)
4733 case DT_IA_64_PLT_RESERVE
:
4734 /* First 3 slots reserved. */
4735 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4737 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
4741 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4748 get_32bit_dynamic_section (FILE *file
)
4750 Elf32_External_Dyn
*edyn
, *ext
;
4751 Elf_Internal_Dyn
*entry
;
4753 edyn
= get_data (NULL
, file
, dynamic_addr
, dynamic_size
,
4754 _("dynamic section"));
4758 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
4759 might not have the luxury of section headers. Look for the DT_NULL
4760 terminator to determine the number of entries. */
4761 for (ext
= edyn
, dynamic_nent
= 0;
4762 (char *) ext
< (char *) edyn
+ dynamic_size
;
4766 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
4770 dynamic_section
= malloc (dynamic_nent
* sizeof (*entry
));
4771 if (dynamic_section
== NULL
)
4773 error (_("Out of memory\n"));
4778 for (ext
= edyn
, entry
= dynamic_section
;
4779 entry
< dynamic_section
+ dynamic_nent
;
4782 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
4783 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
4792 get_64bit_dynamic_section (FILE *file
)
4794 Elf64_External_Dyn
*edyn
, *ext
;
4795 Elf_Internal_Dyn
*entry
;
4797 edyn
= get_data (NULL
, file
, dynamic_addr
, dynamic_size
,
4798 _("dynamic section"));
4802 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
4803 might not have the luxury of section headers. Look for the DT_NULL
4804 terminator to determine the number of entries. */
4805 for (ext
= edyn
, dynamic_nent
= 0;
4806 (char *) ext
< (char *) edyn
+ dynamic_size
;
4810 if (BYTE_GET8 (ext
->d_tag
) == DT_NULL
)
4814 dynamic_section
= malloc (dynamic_nent
* sizeof (*entry
));
4815 if (dynamic_section
== NULL
)
4817 error (_("Out of memory\n"));
4822 for (ext
= edyn
, entry
= dynamic_section
;
4823 entry
< dynamic_section
+ dynamic_nent
;
4826 entry
->d_tag
= BYTE_GET8 (ext
->d_tag
);
4827 entry
->d_un
.d_val
= BYTE_GET8 (ext
->d_un
.d_val
);
4836 get_dynamic_flags (bfd_vma flags
)
4838 static char buff
[128];
4846 flag
= flags
& - flags
;
4854 case DF_ORIGIN
: strcpy (p
, "ORIGIN"); break;
4855 case DF_SYMBOLIC
: strcpy (p
, "SYMBOLIC"); break;
4856 case DF_TEXTREL
: strcpy (p
, "TEXTREL"); break;
4857 case DF_BIND_NOW
: strcpy (p
, "BIND_NOW"); break;
4858 case DF_STATIC_TLS
: strcpy (p
, "STATIC_TLS"); break;
4859 default: strcpy (p
, "unknown"); break;
4862 p
= strchr (p
, '\0');
4867 /* Parse and display the contents of the dynamic section. */
4870 process_dynamic_section (FILE *file
)
4872 Elf_Internal_Dyn
*entry
;
4874 if (dynamic_size
== 0)
4877 printf (_("\nThere is no dynamic section in this file.\n"));
4884 if (! get_32bit_dynamic_section (file
))
4887 else if (! get_64bit_dynamic_section (file
))
4890 /* Find the appropriate symbol table. */
4891 if (dynamic_symbols
== NULL
)
4893 for (entry
= dynamic_section
;
4894 entry
< dynamic_section
+ dynamic_nent
;
4897 Elf_Internal_Shdr section
;
4899 if (entry
->d_tag
!= DT_SYMTAB
)
4902 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
4904 /* Since we do not know how big the symbol table is,
4905 we default to reading in the entire file (!) and
4906 processing that. This is overkill, I know, but it
4908 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
4910 if (archive_file_offset
!= 0)
4911 section
.sh_size
= archive_file_size
- section
.sh_offset
;
4914 if (fseek (file
, 0, SEEK_END
))
4915 error (_("Unable to seek to end of file!"));
4917 section
.sh_size
= ftell (file
) - section
.sh_offset
;
4921 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
4923 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
4925 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
4926 if (num_dynamic_syms
< 1)
4928 error (_("Unable to determine the number of symbols to load\n"));
4932 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
4936 /* Similarly find a string table. */
4937 if (dynamic_strings
== NULL
)
4939 for (entry
= dynamic_section
;
4940 entry
< dynamic_section
+ dynamic_nent
;
4943 unsigned long offset
;
4946 if (entry
->d_tag
!= DT_STRTAB
)
4949 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
4951 /* Since we do not know how big the string table is,
4952 we default to reading in the entire file (!) and
4953 processing that. This is overkill, I know, but it
4956 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
4958 if (archive_file_offset
!= 0)
4959 str_tab_len
= archive_file_size
- offset
;
4962 if (fseek (file
, 0, SEEK_END
))
4963 error (_("Unable to seek to end of file\n"));
4964 str_tab_len
= ftell (file
) - offset
;
4967 if (str_tab_len
< 1)
4970 (_("Unable to determine the length of the dynamic string table\n"));
4974 dynamic_strings
= get_data (NULL
, file
, offset
, str_tab_len
,
4975 _("dynamic string table"));
4980 /* And find the syminfo section if available. */
4981 if (dynamic_syminfo
== NULL
)
4983 unsigned long syminsz
= 0;
4985 for (entry
= dynamic_section
;
4986 entry
< dynamic_section
+ dynamic_nent
;
4989 if (entry
->d_tag
== DT_SYMINENT
)
4991 /* Note: these braces are necessary to avoid a syntax
4992 error from the SunOS4 C compiler. */
4993 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
4995 else if (entry
->d_tag
== DT_SYMINSZ
)
4996 syminsz
= entry
->d_un
.d_val
;
4997 else if (entry
->d_tag
== DT_SYMINFO
)
4998 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
5002 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
5004 Elf_External_Syminfo
*extsyminfo
, *extsym
;
5005 Elf_Internal_Syminfo
*syminfo
;
5007 /* There is a syminfo section. Read the data. */
5008 extsyminfo
= get_data (NULL
, file
, dynamic_syminfo_offset
, syminsz
,
5009 _("symbol information"));
5013 dynamic_syminfo
= malloc (syminsz
);
5014 if (dynamic_syminfo
== NULL
)
5016 error (_("Out of memory\n"));
5020 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
5021 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
5022 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
5023 ++syminfo
, ++extsym
)
5025 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
5026 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
5033 if (do_dynamic
&& dynamic_addr
)
5034 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
5035 dynamic_addr
, dynamic_nent
);
5037 printf (_(" Tag Type Name/Value\n"));
5039 for (entry
= dynamic_section
;
5040 entry
< dynamic_section
+ dynamic_nent
;
5048 print_vma (entry
->d_tag
, FULL_HEX
);
5049 dtype
= get_dynamic_type (entry
->d_tag
);
5050 printf (" (%s)%*s", dtype
,
5051 ((is_32bit_elf
? 27 : 19)
5052 - (int) strlen (dtype
)),
5056 switch (entry
->d_tag
)
5060 puts (get_dynamic_flags (entry
->d_un
.d_val
));
5070 switch (entry
->d_tag
)
5073 printf (_("Auxiliary library"));
5077 printf (_("Filter library"));
5081 printf (_("Configuration file"));
5085 printf (_("Dependency audit library"));
5089 printf (_("Audit library"));
5093 if (dynamic_strings
)
5094 printf (": [%s]\n", dynamic_strings
+ entry
->d_un
.d_val
);
5098 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5107 printf (_("Flags:"));
5109 if (entry
->d_un
.d_val
== 0)
5110 printf (_(" None\n"));
5113 unsigned long int val
= entry
->d_un
.d_val
;
5115 if (val
& DTF_1_PARINIT
)
5117 printf (" PARINIT");
5118 val
^= DTF_1_PARINIT
;
5120 if (val
& DTF_1_CONFEXP
)
5122 printf (" CONFEXP");
5123 val
^= DTF_1_CONFEXP
;
5126 printf (" %lx", val
);
5135 printf (_("Flags:"));
5137 if (entry
->d_un
.d_val
== 0)
5138 printf (_(" None\n"));
5141 unsigned long int val
= entry
->d_un
.d_val
;
5143 if (val
& DF_P1_LAZYLOAD
)
5145 printf (" LAZYLOAD");
5146 val
^= DF_P1_LAZYLOAD
;
5148 if (val
& DF_P1_GROUPPERM
)
5150 printf (" GROUPPERM");
5151 val
^= DF_P1_GROUPPERM
;
5154 printf (" %lx", val
);
5163 printf (_("Flags:"));
5164 if (entry
->d_un
.d_val
== 0)
5165 printf (_(" None\n"));
5168 unsigned long int val
= entry
->d_un
.d_val
;
5175 if (val
& DF_1_GLOBAL
)
5180 if (val
& DF_1_GROUP
)
5185 if (val
& DF_1_NODELETE
)
5187 printf (" NODELETE");
5188 val
^= DF_1_NODELETE
;
5190 if (val
& DF_1_LOADFLTR
)
5192 printf (" LOADFLTR");
5193 val
^= DF_1_LOADFLTR
;
5195 if (val
& DF_1_INITFIRST
)
5197 printf (" INITFIRST");
5198 val
^= DF_1_INITFIRST
;
5200 if (val
& DF_1_NOOPEN
)
5205 if (val
& DF_1_ORIGIN
)
5210 if (val
& DF_1_DIRECT
)
5215 if (val
& DF_1_TRANS
)
5220 if (val
& DF_1_INTERPOSE
)
5222 printf (" INTERPOSE");
5223 val
^= DF_1_INTERPOSE
;
5225 if (val
& DF_1_NODEFLIB
)
5227 printf (" NODEFLIB");
5228 val
^= DF_1_NODEFLIB
;
5230 if (val
& DF_1_NODUMP
)
5235 if (val
& DF_1_CONLFAT
)
5237 printf (" CONLFAT");
5238 val
^= DF_1_CONLFAT
;
5241 printf (" %lx", val
);
5248 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5250 puts (get_dynamic_type (entry
->d_un
.d_val
));
5270 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5276 if (dynamic_strings
== NULL
)
5279 name
= dynamic_strings
+ entry
->d_un
.d_val
;
5283 switch (entry
->d_tag
)
5286 printf (_("Shared library: [%s]"), name
);
5288 if (strcmp (name
, program_interpreter
) == 0)
5289 printf (_(" program interpreter"));
5293 printf (_("Library soname: [%s]"), name
);
5297 printf (_("Library rpath: [%s]"), name
);
5301 printf (_("Library runpath: [%s]"), name
);
5305 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5310 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5323 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5327 case DT_INIT_ARRAYSZ
:
5328 case DT_FINI_ARRAYSZ
:
5329 case DT_GNU_CONFLICTSZ
:
5330 case DT_GNU_LIBLISTSZ
:
5333 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
5334 printf (" (bytes)\n");
5344 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
5357 if (dynamic_strings
!= NULL
&& entry
->d_tag
== DT_USED
)
5361 name
= dynamic_strings
+ entry
->d_un
.d_val
;
5365 printf (_("Not needed object: [%s]\n"), name
);
5370 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5376 /* The value of this entry is ignored. */
5381 case DT_GNU_PRELINKED
:
5385 time_t time
= entry
->d_un
.d_val
;
5387 tmp
= gmtime (&time
);
5388 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
5389 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5390 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5396 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
5397 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
5402 switch (elf_header
.e_machine
)
5405 case EM_MIPS_RS3_LE
:
5406 dynamic_section_mips_val (entry
);
5409 dynamic_section_parisc_val (entry
);
5412 dynamic_section_ia64_val (entry
);
5415 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5427 get_ver_flags (unsigned int flags
)
5429 static char buff
[32];
5436 if (flags
& VER_FLG_BASE
)
5437 strcat (buff
, "BASE ");
5439 if (flags
& VER_FLG_WEAK
)
5441 if (flags
& VER_FLG_BASE
)
5442 strcat (buff
, "| ");
5444 strcat (buff
, "WEAK ");
5447 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
5448 strcat (buff
, "| <unknown>");
5453 /* Display the contents of the version sections. */
5455 process_version_sections (FILE *file
)
5457 Elf_Internal_Shdr
*section
;
5464 for (i
= 0, section
= section_headers
;
5465 i
< elf_header
.e_shnum
;
5468 switch (section
->sh_type
)
5470 case SHT_GNU_verdef
:
5472 Elf_External_Verdef
*edefs
;
5479 (_("\nVersion definition section '%s' contains %ld entries:\n"),
5480 SECTION_NAME (section
), section
->sh_info
);
5482 printf (_(" Addr: 0x"));
5483 printf_vma (section
->sh_addr
);
5484 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5485 (unsigned long) section
->sh_offset
, section
->sh_link
,
5486 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5488 edefs
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
5489 _("version definition section"));
5493 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5496 Elf_External_Verdef
*edef
;
5497 Elf_Internal_Verdef ent
;
5498 Elf_External_Verdaux
*eaux
;
5499 Elf_Internal_Verdaux aux
;
5503 vstart
= ((char *) edefs
) + idx
;
5505 edef
= (Elf_External_Verdef
*) vstart
;
5507 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
5508 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
5509 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
5510 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
5511 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
5512 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
5513 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
5515 printf (_(" %#06x: Rev: %d Flags: %s"),
5516 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
5518 printf (_(" Index: %d Cnt: %d "),
5519 ent
.vd_ndx
, ent
.vd_cnt
);
5521 vstart
+= ent
.vd_aux
;
5523 eaux
= (Elf_External_Verdaux
*) vstart
;
5525 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5526 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
5528 if (dynamic_strings
)
5529 printf (_("Name: %s\n"), dynamic_strings
+ aux
.vda_name
);
5531 printf (_("Name index: %ld\n"), aux
.vda_name
);
5533 isum
= idx
+ ent
.vd_aux
;
5535 for (j
= 1; j
< ent
.vd_cnt
; j
++)
5537 isum
+= aux
.vda_next
;
5538 vstart
+= aux
.vda_next
;
5540 eaux
= (Elf_External_Verdaux
*) vstart
;
5542 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5543 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
5545 if (dynamic_strings
)
5546 printf (_(" %#06x: Parent %d: %s\n"),
5547 isum
, j
, dynamic_strings
+ aux
.vda_name
);
5549 printf (_(" %#06x: Parent %d, name index: %ld\n"),
5550 isum
, j
, aux
.vda_name
);
5560 case SHT_GNU_verneed
:
5562 Elf_External_Verneed
*eneed
;
5568 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
5569 SECTION_NAME (section
), section
->sh_info
);
5571 printf (_(" Addr: 0x"));
5572 printf_vma (section
->sh_addr
);
5573 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
5574 (unsigned long) section
->sh_offset
, section
->sh_link
,
5575 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5577 eneed
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
5578 _("version need section"));
5582 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5584 Elf_External_Verneed
*entry
;
5585 Elf_Internal_Verneed ent
;
5590 vstart
= ((char *) eneed
) + idx
;
5592 entry
= (Elf_External_Verneed
*) vstart
;
5594 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
5595 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
5596 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
5597 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
5598 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
5600 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
5602 if (dynamic_strings
)
5603 printf (_(" File: %s"), dynamic_strings
+ ent
.vn_file
);
5605 printf (_(" File: %lx"), ent
.vn_file
);
5607 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
5609 vstart
+= ent
.vn_aux
;
5611 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
5613 Elf_External_Vernaux
*eaux
;
5614 Elf_Internal_Vernaux aux
;
5616 eaux
= (Elf_External_Vernaux
*) vstart
;
5618 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
5619 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
5620 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
5621 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
5622 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
5624 if (dynamic_strings
)
5625 printf (_(" %#06x: Name: %s"),
5626 isum
, dynamic_strings
+ aux
.vna_name
);
5628 printf (_(" %#06x: Name index: %lx"),
5629 isum
, aux
.vna_name
);
5631 printf (_(" Flags: %s Version: %d\n"),
5632 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
5634 isum
+= aux
.vna_next
;
5635 vstart
+= aux
.vna_next
;
5645 case SHT_GNU_versym
:
5647 Elf_Internal_Shdr
*link_section
;
5650 unsigned char *edata
;
5651 unsigned short *data
;
5653 Elf_Internal_Sym
*symbols
;
5654 Elf_Internal_Shdr
*string_sec
;
5657 link_section
= SECTION_HEADER (section
->sh_link
);
5658 total
= section
->sh_size
/ section
->sh_entsize
;
5662 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
5664 string_sec
= SECTION_HEADER (link_section
->sh_link
);
5666 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
5667 string_sec
->sh_size
, _("version string table"));
5671 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
5672 SECTION_NAME (section
), total
);
5674 printf (_(" Addr: "));
5675 printf_vma (section
->sh_addr
);
5676 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5677 (unsigned long) section
->sh_offset
, section
->sh_link
,
5678 SECTION_NAME (link_section
));
5680 off
= offset_from_vma (file
,
5681 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
5682 total
* sizeof (short));
5683 edata
= get_data (NULL
, file
, off
, total
* sizeof (short),
5684 _("version symbol data"));
5691 data
= malloc (total
* sizeof (short));
5693 for (cnt
= total
; cnt
--;)
5694 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
5699 for (cnt
= 0; cnt
< total
; cnt
+= 4)
5702 int check_def
, check_need
;
5705 printf (" %03x:", cnt
);
5707 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
5708 switch (data
[cnt
+ j
])
5711 fputs (_(" 0 (*local*) "), stdout
);
5715 fputs (_(" 1 (*global*) "), stdout
);
5719 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
5720 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
5724 if (SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
5727 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
5734 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
5736 Elf_Internal_Verneed ivn
;
5737 unsigned long offset
;
5739 offset
= offset_from_vma
5740 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
5741 sizeof (Elf_External_Verneed
));
5745 Elf_Internal_Vernaux ivna
;
5746 Elf_External_Verneed evn
;
5747 Elf_External_Vernaux evna
;
5748 unsigned long a_off
;
5750 get_data (&evn
, file
, offset
, sizeof (evn
),
5753 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5754 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5756 a_off
= offset
+ ivn
.vn_aux
;
5760 get_data (&evna
, file
, a_off
, sizeof (evna
),
5761 _("version need aux (2)"));
5763 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5764 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5766 a_off
+= ivna
.vna_next
;
5768 while (ivna
.vna_other
!= data
[cnt
+ j
]
5769 && ivna
.vna_next
!= 0);
5771 if (ivna
.vna_other
== data
[cnt
+ j
])
5773 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5775 name
= strtab
+ ivna
.vna_name
;
5776 nn
+= printf ("(%s%-*s",
5778 12 - (int) strlen (name
),
5784 offset
+= ivn
.vn_next
;
5786 while (ivn
.vn_next
);
5789 if (check_def
&& data
[cnt
+ j
] != 0x8001
5790 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5792 Elf_Internal_Verdef ivd
;
5793 Elf_External_Verdef evd
;
5794 unsigned long offset
;
5796 offset
= offset_from_vma
5797 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
5802 get_data (&evd
, file
, offset
, sizeof (evd
),
5805 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5806 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5808 offset
+= ivd
.vd_next
;
5810 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
5811 && ivd
.vd_next
!= 0);
5813 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
5815 Elf_External_Verdaux evda
;
5816 Elf_Internal_Verdaux ivda
;
5818 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5820 get_data (&evda
, file
,
5821 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
5822 sizeof (evda
), _("version def aux"));
5824 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5826 name
= strtab
+ ivda
.vda_name
;
5827 nn
+= printf ("(%s%-*s",
5829 12 - (int) strlen (name
),
5835 printf ("%*c", 18 - nn
, ' ');
5853 printf (_("\nNo version information found in this file.\n"));
5859 get_symbol_binding (unsigned int binding
)
5861 static char buff
[32];
5865 case STB_LOCAL
: return "LOCAL";
5866 case STB_GLOBAL
: return "GLOBAL";
5867 case STB_WEAK
: return "WEAK";
5869 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
5870 sprintf (buff
, _("<processor specific>: %d"), binding
);
5871 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
5872 sprintf (buff
, _("<OS specific>: %d"), binding
);
5874 sprintf (buff
, _("<unknown>: %d"), binding
);
5880 get_symbol_type (unsigned int type
)
5882 static char buff
[32];
5886 case STT_NOTYPE
: return "NOTYPE";
5887 case STT_OBJECT
: return "OBJECT";
5888 case STT_FUNC
: return "FUNC";
5889 case STT_SECTION
: return "SECTION";
5890 case STT_FILE
: return "FILE";
5891 case STT_COMMON
: return "COMMON";
5892 case STT_TLS
: return "TLS";
5894 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
5896 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
5897 return "THUMB_FUNC";
5899 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
5902 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
5903 return "PARISC_MILLI";
5905 sprintf (buff
, _("<processor specific>: %d"), type
);
5907 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
5909 if (elf_header
.e_machine
== EM_PARISC
)
5911 if (type
== STT_HP_OPAQUE
)
5913 if (type
== STT_HP_STUB
)
5917 sprintf (buff
, _("<OS specific>: %d"), type
);
5920 sprintf (buff
, _("<unknown>: %d"), type
);
5926 get_symbol_visibility (unsigned int visibility
)
5930 case STV_DEFAULT
: return "DEFAULT";
5931 case STV_INTERNAL
: return "INTERNAL";
5932 case STV_HIDDEN
: return "HIDDEN";
5933 case STV_PROTECTED
: return "PROTECTED";
5939 get_symbol_index_type (unsigned int type
)
5941 static char buff
[32];
5945 case SHN_UNDEF
: return "UND";
5946 case SHN_ABS
: return "ABS";
5947 case SHN_COMMON
: return "COM";
5949 if (type
== SHN_IA_64_ANSI_COMMON
5950 && elf_header
.e_machine
== EM_IA_64
5951 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
5953 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
5954 sprintf (buff
, "PRC[0x%04x]", type
);
5955 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
5956 sprintf (buff
, "OS [0x%04x]", type
);
5957 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
5958 sprintf (buff
, "RSV[0x%04x]", type
);
5960 sprintf (buff
, "%3d", type
);
5968 get_dynamic_data (FILE *file
, unsigned int number
)
5970 unsigned char *e_data
;
5973 e_data
= malloc (number
* 4);
5977 error (_("Out of memory\n"));
5981 if (fread (e_data
, 4, number
, file
) != number
)
5983 error (_("Unable to read in dynamic data\n"));
5987 i_data
= malloc (number
* sizeof (*i_data
));
5991 error (_("Out of memory\n"));
5997 i_data
[number
] = byte_get (e_data
+ number
* 4, 4);
6004 /* Dump the symbol table. */
6006 process_symbol_table (FILE *file
)
6008 Elf_Internal_Shdr
*section
;
6009 unsigned char nb
[4];
6010 unsigned char nc
[4];
6013 int *buckets
= NULL
;
6016 if (! do_syms
&& !do_histogram
)
6019 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
6023 (archive_file_offset
6024 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
6025 sizeof nb
+ sizeof nc
)),
6028 error (_("Unable to seek to start of dynamic information"));
6032 if (fread (nb
, sizeof (nb
), 1, file
) != 1)
6034 error (_("Failed to read in number of buckets\n"));
6038 if (fread (nc
, sizeof (nc
), 1, file
) != 1)
6040 error (_("Failed to read in number of chains\n"));
6044 nbuckets
= byte_get (nb
, 4);
6045 nchains
= byte_get (nc
, 4);
6047 buckets
= get_dynamic_data (file
, nbuckets
);
6048 chains
= get_dynamic_data (file
, nchains
);
6050 if (buckets
== NULL
|| chains
== NULL
)
6055 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
6060 printf (_("\nSymbol table for image:\n"));
6062 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6064 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6066 for (hn
= 0; hn
< nbuckets
; hn
++)
6071 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
6073 Elf_Internal_Sym
*psym
;
6075 psym
= dynamic_symbols
+ si
;
6077 printf (" %3d %3d: ", si
, hn
);
6078 print_vma (psym
->st_value
, LONG_HEX
);
6080 print_vma (psym
->st_size
, DEC_5
);
6082 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6083 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
6084 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6085 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
6086 print_symbol (25, dynamic_strings
+ psym
->st_name
);
6091 else if (do_syms
&& !do_using_dynamic
)
6095 for (i
= 0, section
= section_headers
;
6096 i
< elf_header
.e_shnum
;
6101 Elf_Internal_Sym
*symtab
;
6102 Elf_Internal_Sym
*psym
;
6105 if ( section
->sh_type
!= SHT_SYMTAB
6106 && section
->sh_type
!= SHT_DYNSYM
)
6109 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
6110 SECTION_NAME (section
),
6111 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
6113 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6115 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6117 symtab
= GET_ELF_SYMBOLS (file
, section
);
6121 if (section
->sh_link
== elf_header
.e_shstrndx
)
6122 strtab
= string_table
;
6125 Elf_Internal_Shdr
*string_sec
;
6127 string_sec
= SECTION_HEADER (section
->sh_link
);
6129 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
6130 string_sec
->sh_size
, _("string table"));
6133 for (si
= 0, psym
= symtab
;
6134 si
< section
->sh_size
/ section
->sh_entsize
;
6137 printf ("%6d: ", si
);
6138 print_vma (psym
->st_value
, LONG_HEX
);
6140 print_vma (psym
->st_size
, DEC_5
);
6141 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6142 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
6143 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6144 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
6145 print_symbol (25, strtab
+ psym
->st_name
);
6147 if (section
->sh_type
== SHT_DYNSYM
&&
6148 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
6150 unsigned char data
[2];
6151 unsigned short vers_data
;
6152 unsigned long offset
;
6156 offset
= offset_from_vma
6157 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6158 sizeof data
+ si
* sizeof (vers_data
));
6160 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
6161 sizeof (data
), _("version data"));
6163 vers_data
= byte_get (data
, 2);
6165 is_nobits
= (SECTION_HEADER (psym
->st_shndx
)->sh_type
6168 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
6170 if ((vers_data
& 0x8000) || vers_data
> 1)
6172 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
6173 && (is_nobits
|| ! check_def
))
6175 Elf_External_Verneed evn
;
6176 Elf_Internal_Verneed ivn
;
6177 Elf_Internal_Vernaux ivna
;
6179 /* We must test both. */
6180 offset
= offset_from_vma
6181 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6186 unsigned long vna_off
;
6188 get_data (&evn
, file
, offset
, sizeof (evn
),
6191 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6192 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6194 vna_off
= offset
+ ivn
.vn_aux
;
6198 Elf_External_Vernaux evna
;
6200 get_data (&evna
, file
, vna_off
,
6202 _("version need aux (3)"));
6204 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6205 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6206 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6208 vna_off
+= ivna
.vna_next
;
6210 while (ivna
.vna_other
!= vers_data
6211 && ivna
.vna_next
!= 0);
6213 if (ivna
.vna_other
== vers_data
)
6216 offset
+= ivn
.vn_next
;
6218 while (ivn
.vn_next
!= 0);
6220 if (ivna
.vna_other
== vers_data
)
6223 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
6226 else if (! is_nobits
)
6227 error (_("bad dynamic symbol"));
6234 if (vers_data
!= 0x8001
6235 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6237 Elf_Internal_Verdef ivd
;
6238 Elf_Internal_Verdaux ivda
;
6239 Elf_External_Verdaux evda
;
6240 unsigned long offset
;
6242 offset
= offset_from_vma
6244 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6245 sizeof (Elf_External_Verdef
));
6249 Elf_External_Verdef evd
;
6251 get_data (&evd
, file
, offset
, sizeof (evd
),
6254 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6255 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6256 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6258 offset
+= ivd
.vd_next
;
6260 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
6261 && ivd
.vd_next
!= 0);
6263 offset
-= ivd
.vd_next
;
6264 offset
+= ivd
.vd_aux
;
6266 get_data (&evda
, file
, offset
, sizeof (evda
),
6267 _("version def aux"));
6269 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6271 if (psym
->st_name
!= ivda
.vda_name
)
6272 printf ((vers_data
& 0x8000)
6274 strtab
+ ivda
.vda_name
);
6284 if (strtab
!= string_table
)
6290 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
6292 if (do_histogram
&& buckets
!= NULL
)
6299 int nzero_counts
= 0;
6302 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
6304 printf (_(" Length Number %% of total Coverage\n"));
6306 lengths
= calloc (nbuckets
, sizeof (int));
6307 if (lengths
== NULL
)
6309 error (_("Out of memory"));
6312 for (hn
= 0; hn
< nbuckets
; ++hn
)
6317 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
6320 if (maxlength
< ++lengths
[hn
])
6325 counts
= calloc (maxlength
+ 1, sizeof (int));
6328 error (_("Out of memory"));
6332 for (hn
= 0; hn
< nbuckets
; ++hn
)
6333 ++counts
[lengths
[hn
]];
6337 printf (" 0 %-10d (%5.1f%%)\n",
6338 counts
[0], (counts
[0] * 100.0) / nbuckets
);
6339 for (si
= 1; si
<= maxlength
; ++si
)
6341 nzero_counts
+= counts
[si
] * si
;
6342 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
6343 si
, counts
[si
], (counts
[si
] * 100.0) / nbuckets
,
6344 (nzero_counts
* 100.0) / nsyms
);
6352 if (buckets
!= NULL
)
6362 process_syminfo (FILE *file ATTRIBUTE_UNUSED
)
6366 if (dynamic_syminfo
== NULL
6368 /* No syminfo, this is ok. */
6371 /* There better should be a dynamic symbol section. */
6372 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
6376 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
6377 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
6379 printf (_(" Num: Name BoundTo Flags\n"));
6380 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
6382 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
6384 printf ("%4d: ", i
);
6385 print_symbol (30, dynamic_strings
+ dynamic_symbols
[i
].st_name
);
6388 switch (dynamic_syminfo
[i
].si_boundto
)
6390 case SYMINFO_BT_SELF
:
6391 fputs ("SELF ", stdout
);
6393 case SYMINFO_BT_PARENT
:
6394 fputs ("PARENT ", stdout
);
6397 if (dynamic_syminfo
[i
].si_boundto
> 0
6398 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
)
6403 [dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
6407 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
6411 if (flags
& SYMINFO_FLG_DIRECT
)
6413 if (flags
& SYMINFO_FLG_PASSTHRU
)
6414 printf (" PASSTHRU");
6415 if (flags
& SYMINFO_FLG_COPY
)
6417 if (flags
& SYMINFO_FLG_LAZYLOAD
)
6418 printf (" LAZYLOAD");
6426 #ifdef SUPPORT_DISASSEMBLY
6428 disassemble_section (Elf_Internal_Shdr
*section
, FILE *file
)
6430 printf (_("\nAssembly dump of section %s\n"),
6431 SECTION_NAME (section
));
6433 /* XXX -- to be done --- XXX */
6440 dump_section (Elf_Internal_Shdr
*section
, FILE *file
)
6442 bfd_size_type bytes
;
6444 unsigned char *data
;
6445 unsigned char *start
;
6447 bytes
= section
->sh_size
;
6449 if (bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
6451 printf (_("\nSection '%s' has no data to dump.\n"),
6452 SECTION_NAME (section
));
6456 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
6458 addr
= section
->sh_addr
;
6460 start
= get_data (NULL
, file
, section
->sh_offset
, bytes
, _("section data"));
6472 lbytes
= (bytes
> 16 ? 16 : bytes
);
6474 printf (" 0x%8.8lx ", (unsigned long) addr
);
6476 switch (elf_header
.e_ident
[EI_DATA
])
6480 for (j
= 15; j
>= 0; j
--)
6483 printf ("%2.2x", data
[j
]);
6493 for (j
= 0; j
< 16; j
++)
6496 printf ("%2.2x", data
[j
]);
6506 for (j
= 0; j
< lbytes
; j
++)
6509 if (k
>= ' ' && k
< 0x7f)
6528 static unsigned long int
6529 read_leb128 (unsigned char *data
, int *length_return
, int sign
)
6531 unsigned long int result
= 0;
6532 unsigned int num_read
= 0;
6541 result
|= (byte
& 0x7f) << shift
;
6546 while (byte
& 0x80);
6548 if (length_return
!= NULL
)
6549 *length_return
= num_read
;
6551 if (sign
&& (shift
< 32) && (byte
& 0x40))
6552 result
|= -1 << shift
;
6557 typedef struct State_Machine_Registers
6559 unsigned long address
;
6562 unsigned int column
;
6566 /* This variable hold the number of the last entry seen
6567 in the File Table. */
6568 unsigned int last_file_entry
;
6571 static SMR state_machine_regs
;
6574 reset_state_machine (int is_stmt
)
6576 state_machine_regs
.address
= 0;
6577 state_machine_regs
.file
= 1;
6578 state_machine_regs
.line
= 1;
6579 state_machine_regs
.column
= 0;
6580 state_machine_regs
.is_stmt
= is_stmt
;
6581 state_machine_regs
.basic_block
= 0;
6582 state_machine_regs
.end_sequence
= 0;
6583 state_machine_regs
.last_file_entry
= 0;
6586 /* Handled an extend line op. Returns true if this is the end
6589 process_extended_line_op (unsigned char *data
, int is_stmt
, int pointer_size
)
6591 unsigned char op_code
;
6594 unsigned char *name
;
6597 len
= read_leb128 (data
, & bytes_read
, 0);
6602 warn (_("badly formed extended line op encountered!\n"));
6609 printf (_(" Extended opcode %d: "), op_code
);
6613 case DW_LNE_end_sequence
:
6614 printf (_("End of Sequence\n\n"));
6615 reset_state_machine (is_stmt
);
6618 case DW_LNE_set_address
:
6619 adr
= byte_get (data
, pointer_size
);
6620 printf (_("set Address to 0x%lx\n"), adr
);
6621 state_machine_regs
.address
= adr
;
6624 case DW_LNE_define_file
:
6625 printf (_(" define new File Table entry\n"));
6626 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6628 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
6630 data
+= strlen ((char *) data
) + 1;
6631 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6633 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6635 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6636 printf (_("%s\n\n"), name
);
6640 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
6647 /* Finds section NAME inside FILE and returns a
6648 pointer to it, or NULL upon failure. */
6650 static Elf_Internal_Shdr
*
6651 find_section (const char * name
)
6653 Elf_Internal_Shdr
*sec
;
6656 for (i
= elf_header
.e_shnum
, sec
= section_headers
+ i
- 1;
6658 if (strcmp (SECTION_NAME (sec
), name
) == 0)
6661 if (i
&& sec
&& sec
->sh_size
!= 0)
6667 /* Size of pointers in the .debug_line section. This information is not
6668 really present in that section. It's obtained before dumping the debug
6669 sections by doing some pre-scan of the .debug_info section. */
6670 static unsigned int * debug_line_pointer_sizes
= NULL
;
6671 static unsigned int num_debug_line_pointer_sizes
= 0;
6673 /* Locate and scan the .debug_info section in the file and record the pointer
6674 sizes for the compilation units in it. Usually an executable will have
6675 just one pointer size, but this is not guaranteed, and so we try not to
6676 make any assumptions. Returns zero upon failure, or the number of
6677 compilation units upon success. */
6680 get_debug_line_pointer_sizes (FILE * file
)
6682 Elf_Internal_Shdr
* section
;
6683 unsigned char * start
;
6684 unsigned char * end
;
6685 unsigned char * begin
;
6686 unsigned long length
;
6687 unsigned int num_units
;
6690 section
= find_section (".debug_info");
6691 if (section
== NULL
)
6694 length
= section
->sh_size
;
6695 start
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
6696 _("extracting pointer sizes from .debug_info section"));
6700 end
= start
+ section
->sh_size
;
6701 /* First scan the section to get the number of comp units. */
6702 for (begin
= start
, num_units
= 0; begin
< end
; num_units
++)
6704 /* Read the first 4 bytes. For a 32-bit DWARF section, this will
6705 be the length. For a 64-bit DWARF section, it'll be the escape
6706 code 0xffffffff followed by an 8 byte length. */
6707 length
= byte_get (begin
, 4);
6709 if (length
== 0xffffffff)
6711 length
= byte_get (begin
+ 4, 8);
6712 begin
+= length
+ 12;
6715 begin
+= length
+ 4;
6720 error (_("No comp units in .debug_info section ?"));
6725 /* Then allocate an array to hold the pointer sizes. */
6726 debug_line_pointer_sizes
= malloc (num_units
* sizeof * debug_line_pointer_sizes
);
6727 if (debug_line_pointer_sizes
== NULL
)
6729 error (_("Not enough memory for a pointer size array of %u entries"),
6735 /* Populate the array. */
6736 for (begin
= start
, unit
= 0; begin
< end
; unit
++)
6738 length
= byte_get (begin
, 4);
6739 if (length
== 0xffffffff)
6741 /* For 64-bit DWARF, the 1-byte address_size field is 22 bytes
6742 from the start of the section. This is computed as follows:
6744 unit_length: 12 bytes
6746 debug_abbrev_offset: 8 bytes
6747 -----------------------------
6750 debug_line_pointer_sizes
[unit
] = byte_get (begin
+ 22, 1);
6751 length
= byte_get (begin
+ 4, 8);
6752 begin
+= length
+ 12;
6756 /* For 32-bit DWARF, the 1-byte address_size field is 10 bytes from
6757 the start of the section:
6759 unit_length: 4 bytes
6761 debug_abbrev_offset: 4 bytes
6762 -----------------------------
6765 debug_line_pointer_sizes
[unit
] = byte_get (begin
+ 10, 1);
6766 begin
+= length
+ 4;
6771 num_debug_line_pointer_sizes
= num_units
;
6776 display_debug_lines (Elf_Internal_Shdr
*section
,
6777 unsigned char *start
, FILE *file
)
6779 unsigned char *hdrptr
;
6780 DWARF2_Internal_LineInfo info
;
6781 unsigned char *standard_opcodes
;
6782 unsigned char *data
= start
;
6783 unsigned char *end
= start
+ section
->sh_size
;
6784 unsigned char *end_of_sequence
;
6787 int initial_length_size
;
6788 unsigned int comp_unit
= 0;
6790 printf (_("\nDump of debug contents of section %s:\n\n"),
6791 SECTION_NAME (section
));
6793 if (num_debug_line_pointer_sizes
== 0)
6794 get_debug_line_pointer_sizes (file
);
6798 unsigned int pointer_size
;
6802 /* Check the length of the block. */
6803 info
.li_length
= byte_get (hdrptr
, 4);
6806 if (info
.li_length
== 0xffffffff)
6808 /* This section is 64-bit DWARF 3. */
6809 info
.li_length
= byte_get (hdrptr
, 8);
6812 initial_length_size
= 12;
6817 initial_length_size
= 4;
6820 if (info
.li_length
+ initial_length_size
> section
->sh_size
)
6823 (_("The line info appears to be corrupt - the section is too small\n"));
6827 /* Check its version number. */
6828 info
.li_version
= byte_get (hdrptr
, 2);
6830 if (info
.li_version
!= 2 && info
.li_version
!= 3)
6832 warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
6836 info
.li_prologue_length
= byte_get (hdrptr
, offset_size
);
6837 hdrptr
+= offset_size
;
6838 info
.li_min_insn_length
= byte_get (hdrptr
, 1);
6840 info
.li_default_is_stmt
= byte_get (hdrptr
, 1);
6842 info
.li_line_base
= byte_get (hdrptr
, 1);
6844 info
.li_line_range
= byte_get (hdrptr
, 1);
6846 info
.li_opcode_base
= byte_get (hdrptr
, 1);
6849 /* Sign extend the line base field. */
6850 info
.li_line_base
<<= 24;
6851 info
.li_line_base
>>= 24;
6853 /* Get the pointer size from the comp unit associated
6854 with this block of line number information. */
6855 if (comp_unit
>= num_debug_line_pointer_sizes
)
6857 error (_("Not enough comp units for .debug_lines section\n"));
6862 pointer_size
= debug_line_pointer_sizes
[comp_unit
];
6866 printf (_(" Length: %ld\n"), info
.li_length
);
6867 printf (_(" DWARF Version: %d\n"), info
.li_version
);
6868 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
6869 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
6870 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
6871 printf (_(" Line Base: %d\n"), info
.li_line_base
);
6872 printf (_(" Line Range: %d\n"), info
.li_line_range
);
6873 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
6874 printf (_(" (Pointer size: %u)\n"), pointer_size
);
6876 end_of_sequence
= data
+ info
.li_length
+ initial_length_size
;
6878 reset_state_machine (info
.li_default_is_stmt
);
6880 /* Display the contents of the Opcodes table. */
6881 standard_opcodes
= hdrptr
;
6883 printf (_("\n Opcodes:\n"));
6885 for (i
= 1; i
< info
.li_opcode_base
; i
++)
6886 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
6888 /* Display the contents of the Directory table. */
6889 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
6892 printf (_("\n The Directory Table is empty.\n"));
6895 printf (_("\n The Directory Table:\n"));
6899 printf (_(" %s\n"), data
);
6901 data
+= strlen ((char *) data
) + 1;
6905 /* Skip the NUL at the end of the table. */
6908 /* Display the contents of the File Name table. */
6910 printf (_("\n The File Name Table is empty.\n"));
6913 printf (_("\n The File Name Table:\n"));
6914 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6918 unsigned char *name
;
6921 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
6924 data
+= strlen ((char *) data
) + 1;
6926 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6928 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6930 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6932 printf (_("%s\n"), name
);
6936 /* Skip the NUL at the end of the table. */
6939 /* Now display the statements. */
6940 printf (_("\n Line Number Statements:\n"));
6943 while (data
< end_of_sequence
)
6945 unsigned char op_code
;
6951 if (op_code
>= info
.li_opcode_base
)
6953 op_code
-= info
.li_opcode_base
;
6954 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
6955 state_machine_regs
.address
+= adv
;
6956 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6957 op_code
, adv
, state_machine_regs
.address
);
6958 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
6959 state_machine_regs
.line
+= adv
;
6960 printf (_(" and Line by %d to %d\n"),
6961 adv
, state_machine_regs
.line
);
6963 else switch (op_code
)
6965 case DW_LNS_extended_op
:
6966 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
6971 printf (_(" Copy\n"));
6974 case DW_LNS_advance_pc
:
6975 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
6977 state_machine_regs
.address
+= adv
;
6978 printf (_(" Advance PC by %d to %lx\n"), adv
,
6979 state_machine_regs
.address
);
6982 case DW_LNS_advance_line
:
6983 adv
= read_leb128 (data
, & bytes_read
, 1);
6985 state_machine_regs
.line
+= adv
;
6986 printf (_(" Advance Line by %d to %d\n"), adv
,
6987 state_machine_regs
.line
);
6990 case DW_LNS_set_file
:
6991 adv
= read_leb128 (data
, & bytes_read
, 0);
6993 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6995 state_machine_regs
.file
= adv
;
6998 case DW_LNS_set_column
:
6999 adv
= read_leb128 (data
, & bytes_read
, 0);
7001 printf (_(" Set column to %d\n"), adv
);
7002 state_machine_regs
.column
= adv
;
7005 case DW_LNS_negate_stmt
:
7006 adv
= state_machine_regs
.is_stmt
;
7008 printf (_(" Set is_stmt to %d\n"), adv
);
7009 state_machine_regs
.is_stmt
= adv
;
7012 case DW_LNS_set_basic_block
:
7013 printf (_(" Set basic block\n"));
7014 state_machine_regs
.basic_block
= 1;
7017 case DW_LNS_const_add_pc
:
7018 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
7019 * info
.li_min_insn_length
);
7020 state_machine_regs
.address
+= adv
;
7021 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
7022 state_machine_regs
.address
);
7025 case DW_LNS_fixed_advance_pc
:
7026 adv
= byte_get (data
, 2);
7028 state_machine_regs
.address
+= adv
;
7029 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
7030 adv
, state_machine_regs
.address
);
7033 case DW_LNS_set_prologue_end
:
7034 printf (_(" Set prologue_end to true\n"));
7037 case DW_LNS_set_epilogue_begin
:
7038 printf (_(" Set epilogue_begin to true\n"));
7041 case DW_LNS_set_isa
:
7042 adv
= read_leb128 (data
, & bytes_read
, 0);
7044 printf (_(" Set ISA to %d\n"), adv
);
7048 printf (_(" Unknown opcode %d with operands: "), op_code
);
7051 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
7053 printf ("0x%lx%s", read_leb128 (data
, &bytes_read
, 0),
7054 i
== 1 ? "" : ", ");
7069 display_debug_pubnames (Elf_Internal_Shdr
*section
,
7070 unsigned char *start
,
7071 FILE *file ATTRIBUTE_UNUSED
)
7073 DWARF2_Internal_PubNames pubnames
;
7076 end
= start
+ section
->sh_size
;
7078 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7082 unsigned char *data
;
7083 unsigned long offset
;
7084 int offset_size
, initial_length_size
;
7088 pubnames
.pn_length
= byte_get (data
, 4);
7090 if (pubnames
.pn_length
== 0xffffffff)
7092 pubnames
.pn_length
= byte_get (data
, 8);
7095 initial_length_size
= 12;
7100 initial_length_size
= 4;
7103 pubnames
.pn_version
= byte_get (data
, 2);
7105 pubnames
.pn_offset
= byte_get (data
, offset_size
);
7106 data
+= offset_size
;
7107 pubnames
.pn_size
= byte_get (data
, offset_size
);
7108 data
+= offset_size
;
7110 start
+= pubnames
.pn_length
+ initial_length_size
;
7112 if (pubnames
.pn_version
!= 2 && pubnames
.pn_version
!= 3)
7114 static int warned
= 0;
7118 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
7125 printf (_(" Length: %ld\n"),
7126 pubnames
.pn_length
);
7127 printf (_(" Version: %d\n"),
7128 pubnames
.pn_version
);
7129 printf (_(" Offset into .debug_info section: %ld\n"),
7130 pubnames
.pn_offset
);
7131 printf (_(" Size of area in .debug_info section: %ld\n"),
7134 printf (_("\n Offset\tName\n"));
7138 offset
= byte_get (data
, offset_size
);
7142 data
+= offset_size
;
7143 printf (" %-6ld\t\t%s\n", offset
, data
);
7144 data
+= strlen ((char *) data
) + 1;
7147 while (offset
!= 0);
7155 get_TAG_name (unsigned long tag
)
7159 case DW_TAG_padding
: return "DW_TAG_padding";
7160 case DW_TAG_array_type
: return "DW_TAG_array_type";
7161 case DW_TAG_class_type
: return "DW_TAG_class_type";
7162 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
7163 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
7164 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
7165 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
7166 case DW_TAG_label
: return "DW_TAG_label";
7167 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
7168 case DW_TAG_member
: return "DW_TAG_member";
7169 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
7170 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
7171 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
7172 case DW_TAG_string_type
: return "DW_TAG_string_type";
7173 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
7174 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
7175 case DW_TAG_typedef
: return "DW_TAG_typedef";
7176 case DW_TAG_union_type
: return "DW_TAG_union_type";
7177 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
7178 case DW_TAG_variant
: return "DW_TAG_variant";
7179 case DW_TAG_common_block
: return "DW_TAG_common_block";
7180 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
7181 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
7182 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
7183 case DW_TAG_module
: return "DW_TAG_module";
7184 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
7185 case DW_TAG_set_type
: return "DW_TAG_set_type";
7186 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
7187 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
7188 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
7189 case DW_TAG_base_type
: return "DW_TAG_base_type";
7190 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
7191 case DW_TAG_const_type
: return "DW_TAG_const_type";
7192 case DW_TAG_constant
: return "DW_TAG_constant";
7193 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
7194 case DW_TAG_file_type
: return "DW_TAG_file_type";
7195 case DW_TAG_friend
: return "DW_TAG_friend";
7196 case DW_TAG_namelist
: return "DW_TAG_namelist";
7197 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
7198 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
7199 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
7200 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
7201 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
7202 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
7203 case DW_TAG_try_block
: return "DW_TAG_try_block";
7204 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
7205 case DW_TAG_variable
: return "DW_TAG_variable";
7206 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
7207 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
7208 case DW_TAG_format_label
: return "DW_TAG_format_label";
7209 case DW_TAG_function_template
: return "DW_TAG_function_template";
7210 case DW_TAG_class_template
: return "DW_TAG_class_template";
7211 /* DWARF 2.1 values. */
7212 case DW_TAG_dwarf_procedure
: return "DW_TAG_dwarf_procedure";
7213 case DW_TAG_restrict_type
: return "DW_TAG_restrict_type";
7214 case DW_TAG_interface_type
: return "DW_TAG_interface_type";
7215 case DW_TAG_namespace
: return "DW_TAG_namespace";
7216 case DW_TAG_imported_module
: return "DW_TAG_imported_module";
7217 case DW_TAG_unspecified_type
: return "DW_TAG_unspecified_type";
7218 case DW_TAG_partial_unit
: return "DW_TAG_partial_unit";
7219 case DW_TAG_imported_unit
: return "DW_TAG_imported_unit";
7221 case DW_TAG_upc_shared_type
: return "DW_TAG_upc_shared_type";
7222 case DW_TAG_upc_strict_type
: return "DW_TAG_upc_strict_type";
7223 case DW_TAG_upc_relaxed_type
: return "DW_TAG_upc_relaxed_type";
7226 static char buffer
[100];
7228 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
7235 get_AT_name (unsigned long attribute
)
7239 case DW_AT_sibling
: return "DW_AT_sibling";
7240 case DW_AT_location
: return "DW_AT_location";
7241 case DW_AT_name
: return "DW_AT_name";
7242 case DW_AT_ordering
: return "DW_AT_ordering";
7243 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
7244 case DW_AT_byte_size
: return "DW_AT_byte_size";
7245 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
7246 case DW_AT_bit_size
: return "DW_AT_bit_size";
7247 case DW_AT_element_list
: return "DW_AT_element_list";
7248 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
7249 case DW_AT_low_pc
: return "DW_AT_low_pc";
7250 case DW_AT_high_pc
: return "DW_AT_high_pc";
7251 case DW_AT_language
: return "DW_AT_language";
7252 case DW_AT_member
: return "DW_AT_member";
7253 case DW_AT_discr
: return "DW_AT_discr";
7254 case DW_AT_discr_value
: return "DW_AT_discr_value";
7255 case DW_AT_visibility
: return "DW_AT_visibility";
7256 case DW_AT_import
: return "DW_AT_import";
7257 case DW_AT_string_length
: return "DW_AT_string_length";
7258 case DW_AT_common_reference
: return "DW_AT_common_reference";
7259 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
7260 case DW_AT_const_value
: return "DW_AT_const_value";
7261 case DW_AT_containing_type
: return "DW_AT_containing_type";
7262 case DW_AT_default_value
: return "DW_AT_default_value";
7263 case DW_AT_inline
: return "DW_AT_inline";
7264 case DW_AT_is_optional
: return "DW_AT_is_optional";
7265 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
7266 case DW_AT_producer
: return "DW_AT_producer";
7267 case DW_AT_prototyped
: return "DW_AT_prototyped";
7268 case DW_AT_return_addr
: return "DW_AT_return_addr";
7269 case DW_AT_start_scope
: return "DW_AT_start_scope";
7270 case DW_AT_stride_size
: return "DW_AT_stride_size";
7271 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
7272 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
7273 case DW_AT_accessibility
: return "DW_AT_accessibility";
7274 case DW_AT_address_class
: return "DW_AT_address_class";
7275 case DW_AT_artificial
: return "DW_AT_artificial";
7276 case DW_AT_base_types
: return "DW_AT_base_types";
7277 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
7278 case DW_AT_count
: return "DW_AT_count";
7279 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
7280 case DW_AT_decl_column
: return "DW_AT_decl_column";
7281 case DW_AT_decl_file
: return "DW_AT_decl_file";
7282 case DW_AT_decl_line
: return "DW_AT_decl_line";
7283 case DW_AT_declaration
: return "DW_AT_declaration";
7284 case DW_AT_discr_list
: return "DW_AT_discr_list";
7285 case DW_AT_encoding
: return "DW_AT_encoding";
7286 case DW_AT_external
: return "DW_AT_external";
7287 case DW_AT_frame_base
: return "DW_AT_frame_base";
7288 case DW_AT_friend
: return "DW_AT_friend";
7289 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
7290 case DW_AT_macro_info
: return "DW_AT_macro_info";
7291 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
7292 case DW_AT_priority
: return "DW_AT_priority";
7293 case DW_AT_segment
: return "DW_AT_segment";
7294 case DW_AT_specification
: return "DW_AT_specification";
7295 case DW_AT_static_link
: return "DW_AT_static_link";
7296 case DW_AT_type
: return "DW_AT_type";
7297 case DW_AT_use_location
: return "DW_AT_use_location";
7298 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
7299 case DW_AT_virtuality
: return "DW_AT_virtuality";
7300 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
7301 /* DWARF 2.1 values. */
7302 case DW_AT_allocated
: return "DW_AT_allocated";
7303 case DW_AT_associated
: return "DW_AT_associated";
7304 case DW_AT_data_location
: return "DW_AT_data_location";
7305 case DW_AT_stride
: return "DW_AT_stride";
7306 case DW_AT_entry_pc
: return "DW_AT_entry_pc";
7307 case DW_AT_use_UTF8
: return "DW_AT_use_UTF8";
7308 case DW_AT_extension
: return "DW_AT_extension";
7309 case DW_AT_ranges
: return "DW_AT_ranges";
7310 case DW_AT_trampoline
: return "DW_AT_trampoline";
7311 case DW_AT_call_column
: return "DW_AT_call_column";
7312 case DW_AT_call_file
: return "DW_AT_call_file";
7313 case DW_AT_call_line
: return "DW_AT_call_line";
7314 /* SGI/MIPS extensions. */
7315 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
7316 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
7317 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
7318 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
7319 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
7320 case DW_AT_MIPS_software_pipeline_depth
:
7321 return "DW_AT_MIPS_software_pipeline_depth";
7322 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
7323 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
7324 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
7325 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
7326 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
7327 /* GNU extensions. */
7328 case DW_AT_sf_names
: return "DW_AT_sf_names";
7329 case DW_AT_src_info
: return "DW_AT_src_info";
7330 case DW_AT_mac_info
: return "DW_AT_mac_info";
7331 case DW_AT_src_coords
: return "DW_AT_src_coords";
7332 case DW_AT_body_begin
: return "DW_AT_body_begin";
7333 case DW_AT_body_end
: return "DW_AT_body_end";
7334 case DW_AT_GNU_vector
: return "DW_AT_GNU_vector";
7335 /* UPC extension. */
7336 case DW_AT_upc_threads_scaled
: return "DW_AT_upc_threads_scaled";
7339 static char buffer
[100];
7341 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
7348 get_FORM_name (unsigned long form
)
7352 case DW_FORM_addr
: return "DW_FORM_addr";
7353 case DW_FORM_block2
: return "DW_FORM_block2";
7354 case DW_FORM_block4
: return "DW_FORM_block4";
7355 case DW_FORM_data2
: return "DW_FORM_data2";
7356 case DW_FORM_data4
: return "DW_FORM_data4";
7357 case DW_FORM_data8
: return "DW_FORM_data8";
7358 case DW_FORM_string
: return "DW_FORM_string";
7359 case DW_FORM_block
: return "DW_FORM_block";
7360 case DW_FORM_block1
: return "DW_FORM_block1";
7361 case DW_FORM_data1
: return "DW_FORM_data1";
7362 case DW_FORM_flag
: return "DW_FORM_flag";
7363 case DW_FORM_sdata
: return "DW_FORM_sdata";
7364 case DW_FORM_strp
: return "DW_FORM_strp";
7365 case DW_FORM_udata
: return "DW_FORM_udata";
7366 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
7367 case DW_FORM_ref1
: return "DW_FORM_ref1";
7368 case DW_FORM_ref2
: return "DW_FORM_ref2";
7369 case DW_FORM_ref4
: return "DW_FORM_ref4";
7370 case DW_FORM_ref8
: return "DW_FORM_ref8";
7371 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
7372 case DW_FORM_indirect
: return "DW_FORM_indirect";
7375 static char buffer
[100];
7377 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
7383 /* FIXME: There are better and more efficient ways to handle
7384 these structures. For now though, I just want something that
7385 is simple to implement. */
7386 typedef struct abbrev_attr
7388 unsigned long attribute
;
7390 struct abbrev_attr
*next
;
7394 typedef struct abbrev_entry
7396 unsigned long entry
;
7399 struct abbrev_attr
*first_attr
;
7400 struct abbrev_attr
*last_attr
;
7401 struct abbrev_entry
*next
;
7405 static abbrev_entry
*first_abbrev
= NULL
;
7406 static abbrev_entry
*last_abbrev
= NULL
;
7411 abbrev_entry
*abbrev
;
7413 for (abbrev
= first_abbrev
; abbrev
;)
7415 abbrev_entry
*next
= abbrev
->next
;
7418 for (attr
= abbrev
->first_attr
; attr
;)
7420 abbrev_attr
*next
= attr
->next
;
7430 last_abbrev
= first_abbrev
= NULL
;
7434 add_abbrev (unsigned long number
, unsigned long tag
, int children
)
7436 abbrev_entry
*entry
;
7438 entry
= malloc (sizeof (*entry
));
7444 entry
->entry
= number
;
7446 entry
->children
= children
;
7447 entry
->first_attr
= NULL
;
7448 entry
->last_attr
= NULL
;
7451 if (first_abbrev
== NULL
)
7452 first_abbrev
= entry
;
7454 last_abbrev
->next
= entry
;
7456 last_abbrev
= entry
;
7460 add_abbrev_attr (unsigned long attribute
, unsigned long form
)
7464 attr
= malloc (sizeof (*attr
));
7470 attr
->attribute
= attribute
;
7474 if (last_abbrev
->first_attr
== NULL
)
7475 last_abbrev
->first_attr
= attr
;
7477 last_abbrev
->last_attr
->next
= attr
;
7479 last_abbrev
->last_attr
= attr
;
7482 /* Processes the (partial) contents of a .debug_abbrev section.
7483 Returns NULL if the end of the section was encountered.
7484 Returns the address after the last byte read if the end of
7485 an abbreviation set was found. */
7487 static unsigned char *
7488 process_abbrev_section (unsigned char *start
, unsigned char *end
)
7490 if (first_abbrev
!= NULL
)
7496 unsigned long entry
;
7498 unsigned long attribute
;
7501 entry
= read_leb128 (start
, & bytes_read
, 0);
7502 start
+= bytes_read
;
7504 /* A single zero is supposed to end the section according
7505 to the standard. If there's more, then signal that to
7508 return start
== end
? NULL
: start
;
7510 tag
= read_leb128 (start
, & bytes_read
, 0);
7511 start
+= bytes_read
;
7513 children
= *start
++;
7515 add_abbrev (entry
, tag
, children
);
7521 attribute
= read_leb128 (start
, & bytes_read
, 0);
7522 start
+= bytes_read
;
7524 form
= read_leb128 (start
, & bytes_read
, 0);
7525 start
+= bytes_read
;
7528 add_abbrev_attr (attribute
, form
);
7530 while (attribute
!= 0);
7538 display_debug_macinfo (Elf_Internal_Shdr
*section
,
7539 unsigned char *start
,
7540 FILE *file ATTRIBUTE_UNUSED
)
7542 unsigned char *end
= start
+ section
->sh_size
;
7543 unsigned char *curr
= start
;
7544 unsigned int bytes_read
;
7545 enum dwarf_macinfo_record_type op
;
7547 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7551 unsigned int lineno
;
7559 case DW_MACINFO_start_file
:
7561 unsigned int filenum
;
7563 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7565 filenum
= read_leb128 (curr
, & bytes_read
, 0);
7568 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno
, filenum
);
7572 case DW_MACINFO_end_file
:
7573 printf (_(" DW_MACINFO_end_file\n"));
7576 case DW_MACINFO_define
:
7577 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7580 curr
+= strlen (string
) + 1;
7581 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno
, string
);
7584 case DW_MACINFO_undef
:
7585 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7588 curr
+= strlen (string
) + 1;
7589 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno
, string
);
7592 case DW_MACINFO_vendor_ext
:
7594 unsigned int constant
;
7596 constant
= read_leb128 (curr
, & bytes_read
, 0);
7599 curr
+= strlen (string
) + 1;
7600 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant
, string
);
7611 display_debug_abbrev (Elf_Internal_Shdr
*section
,
7612 unsigned char *start
,
7613 FILE *file ATTRIBUTE_UNUSED
)
7615 abbrev_entry
*entry
;
7616 unsigned char *end
= start
+ section
->sh_size
;
7618 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7622 start
= process_abbrev_section (start
, end
);
7624 if (first_abbrev
== NULL
)
7627 printf (_(" Number TAG\n"));
7629 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
7633 printf (_(" %ld %s [%s]\n"),
7635 get_TAG_name (entry
->tag
),
7636 entry
->children
? _("has children") : _("no children"));
7638 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
7640 printf (_(" %-18s %s\n"),
7641 get_AT_name (attr
->attribute
),
7642 get_FORM_name (attr
->form
));
7656 static unsigned char *
7657 display_block (unsigned char *data
, unsigned long length
)
7659 printf (_(" %lu byte block: "), length
);
7662 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
7668 decode_location_expression (unsigned char * data
,
7669 unsigned int pointer_size
,
7670 unsigned long length
)
7674 unsigned long uvalue
;
7675 unsigned char *end
= data
+ length
;
7684 printf ("DW_OP_addr: %lx",
7685 (unsigned long) byte_get (data
, pointer_size
));
7686 data
+= pointer_size
;
7689 printf ("DW_OP_deref");
7692 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
7695 printf ("DW_OP_const1s: %ld", (long) byte_get_signed (data
++, 1));
7698 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
7702 printf ("DW_OP_const2s: %ld", (long) byte_get_signed (data
, 2));
7706 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
7710 printf ("DW_OP_const4s: %ld", (long) byte_get_signed (data
, 4));
7714 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
7715 (unsigned long) byte_get (data
+ 4, 4));
7719 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
7720 (long) byte_get (data
+ 4, 4));
7724 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
7728 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
7732 printf ("DW_OP_dup");
7735 printf ("DW_OP_drop");
7738 printf ("DW_OP_over");
7741 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
7744 printf ("DW_OP_swap");
7747 printf ("DW_OP_rot");
7750 printf ("DW_OP_xderef");
7753 printf ("DW_OP_abs");
7756 printf ("DW_OP_and");
7759 printf ("DW_OP_div");
7762 printf ("DW_OP_minus");
7765 printf ("DW_OP_mod");
7768 printf ("DW_OP_mul");
7771 printf ("DW_OP_neg");
7774 printf ("DW_OP_not");
7777 printf ("DW_OP_or");
7780 printf ("DW_OP_plus");
7782 case DW_OP_plus_uconst
:
7783 printf ("DW_OP_plus_uconst: %lu",
7784 read_leb128 (data
, &bytes_read
, 0));
7788 printf ("DW_OP_shl");
7791 printf ("DW_OP_shr");
7794 printf ("DW_OP_shra");
7797 printf ("DW_OP_xor");
7800 printf ("DW_OP_bra: %ld", (long) byte_get_signed (data
, 2));
7804 printf ("DW_OP_eq");
7807 printf ("DW_OP_ge");
7810 printf ("DW_OP_gt");
7813 printf ("DW_OP_le");
7816 printf ("DW_OP_lt");
7819 printf ("DW_OP_ne");
7822 printf ("DW_OP_skip: %ld", (long) byte_get_signed (data
, 2));
7858 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
7893 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
7928 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
7929 read_leb128 (data
, &bytes_read
, 1));
7934 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
7938 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
7942 uvalue
= read_leb128 (data
, &bytes_read
, 0);
7944 printf ("DW_OP_bregx: %lu %ld", uvalue
,
7945 read_leb128 (data
, &bytes_read
, 1));
7949 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
7952 case DW_OP_deref_size
:
7953 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
7955 case DW_OP_xderef_size
:
7956 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
7959 printf ("DW_OP_nop");
7962 /* DWARF 3 extensions. */
7963 case DW_OP_push_object_address
:
7964 printf ("DW_OP_push_object_address");
7967 printf ("DW_OP_call2: <%lx>", (long) byte_get (data
, 2));
7971 printf ("DW_OP_call4: <%lx>", (long) byte_get (data
, 4));
7974 case DW_OP_call_ref
:
7975 printf ("DW_OP_call_ref");
7978 /* GNU extensions. */
7979 case DW_OP_GNU_push_tls_address
:
7980 printf ("DW_OP_GNU_push_tls_address");
7984 if (op
>= DW_OP_lo_user
7985 && op
<= DW_OP_hi_user
)
7986 printf (_("(User defined location op)"));
7988 printf (_("(Unknown location op)"));
7989 /* No way to tell where the next op is, so just bail. */
7993 /* Separate the ops. */
7999 static const char *debug_loc_contents
;
8000 static bfd_vma debug_loc_size
;
8003 load_debug_loc (FILE *file
)
8005 Elf_Internal_Shdr
*sec
;
8007 /* If it is already loaded, do nothing. */
8008 if (debug_loc_contents
!= NULL
)
8011 /* Locate the .debug_loc section. */
8012 sec
= find_section (".debug_loc");
8016 debug_loc_size
= sec
->sh_size
;
8018 debug_loc_contents
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
8019 _("debug_loc section data"));
8023 free_debug_loc (void)
8025 if (debug_loc_contents
== NULL
)
8028 free ((char *) debug_loc_contents
);
8029 debug_loc_contents
= NULL
;
8035 display_debug_loc (Elf_Internal_Shdr
*section
,
8036 unsigned char *start
, FILE *file
)
8038 unsigned char *section_end
;
8039 unsigned long bytes
;
8040 unsigned char *section_begin
= start
;
8042 unsigned int comp_unit
= 0;
8044 addr
= section
->sh_addr
;
8045 bytes
= section
->sh_size
;
8046 section_end
= start
+ bytes
;
8050 printf (_("\nThe .debug_loc section is empty.\n"));
8054 if (num_debug_line_pointer_sizes
== 0)
8055 get_debug_line_pointer_sizes (file
);
8057 printf (_("Contents of the .debug_loc section:\n\n"));
8058 printf (_("\n Offset Begin End Expression\n"));
8060 while (start
< section_end
)
8062 unsigned long begin
;
8064 unsigned short length
;
8065 unsigned long offset
;
8066 unsigned int pointer_size
;
8068 offset
= start
- section_begin
;
8070 /* Get the pointer size from the comp unit associated
8071 with this block of location information. */
8072 if (comp_unit
>= num_debug_line_pointer_sizes
)
8074 error (_("Not enough comp units for .debug_loc section\n"));
8079 pointer_size
= debug_line_pointer_sizes
[comp_unit
];
8085 begin
= byte_get (start
, pointer_size
);
8086 start
+= pointer_size
;
8087 end
= byte_get (start
, pointer_size
);
8088 start
+= pointer_size
;
8090 if (begin
== 0 && end
== 0)
8093 /* For now, skip any base address specifiers. */
8094 if (begin
== 0xffffffff)
8100 length
= byte_get (start
, 2);
8103 printf (" %8.8lx %8.8lx %8.8lx (", offset
, begin
, end
);
8104 decode_location_expression (start
, pointer_size
, length
);
8114 static const char *debug_str_contents
;
8115 static bfd_vma debug_str_size
;
8118 load_debug_str (FILE *file
)
8120 Elf_Internal_Shdr
*sec
;
8122 /* If it is already loaded, do nothing. */
8123 if (debug_str_contents
!= NULL
)
8126 /* Locate the .debug_str section. */
8127 sec
= find_section (".debug_str");
8131 debug_str_size
= sec
->sh_size
;
8133 debug_str_contents
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
8134 _("debug_str section data"));
8138 free_debug_str (void)
8140 if (debug_str_contents
== NULL
)
8143 free ((char *) debug_str_contents
);
8144 debug_str_contents
= NULL
;
8149 fetch_indirect_string (unsigned long offset
)
8151 if (debug_str_contents
== NULL
)
8152 return _("<no .debug_str section>");
8154 if (offset
> debug_str_size
)
8155 return _("<offset is too big>");
8157 return debug_str_contents
+ offset
;
8161 display_debug_str (Elf_Internal_Shdr
*section
,
8162 unsigned char *start
,
8163 FILE *file ATTRIBUTE_UNUSED
)
8165 unsigned long bytes
;
8168 addr
= section
->sh_addr
;
8169 bytes
= section
->sh_size
;
8173 printf (_("\nThe .debug_str section is empty.\n"));
8177 printf (_("Contents of the .debug_str section:\n\n"));
8185 lbytes
= (bytes
> 16 ? 16 : bytes
);
8187 printf (" 0x%8.8lx ", (unsigned long) addr
);
8189 for (j
= 0; j
< 16; j
++)
8192 printf ("%2.2x", start
[j
]);
8200 for (j
= 0; j
< lbytes
; j
++)
8203 if (k
>= ' ' && k
< 0x80)
8219 static unsigned char *
8220 read_and_display_attr_value (unsigned long attribute
,
8222 unsigned char *data
,
8223 unsigned long cu_offset
,
8224 unsigned long pointer_size
,
8225 unsigned long offset_size
,
8228 unsigned long uvalue
= 0;
8229 unsigned char *block_start
= NULL
;
8237 case DW_FORM_ref_addr
:
8238 if (dwarf_version
== 2)
8240 uvalue
= byte_get (data
, pointer_size
);
8241 data
+= pointer_size
;
8243 else if (dwarf_version
== 3)
8245 uvalue
= byte_get (data
, offset_size
);
8246 data
+= offset_size
;
8250 error (_("Internal error: DWARF version is not 2 or 3.\n"));
8255 uvalue
= byte_get (data
, pointer_size
);
8256 data
+= pointer_size
;
8260 uvalue
= byte_get (data
, offset_size
);
8261 data
+= offset_size
;
8267 uvalue
= byte_get (data
++, 1);
8272 uvalue
= byte_get (data
, 2);
8278 uvalue
= byte_get (data
, 4);
8283 uvalue
= read_leb128 (data
, & bytes_read
, 1);
8287 case DW_FORM_ref_udata
:
8289 uvalue
= read_leb128 (data
, & bytes_read
, 0);
8293 case DW_FORM_indirect
:
8294 form
= read_leb128 (data
, & bytes_read
, 0);
8296 printf (" %s", get_FORM_name (form
));
8297 return read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
8298 pointer_size
, offset_size
,
8304 case DW_FORM_ref_addr
:
8305 printf (" <#%lx>", uvalue
);
8311 case DW_FORM_ref_udata
:
8312 printf (" <%lx>", uvalue
+ cu_offset
);
8316 printf (" %#lx", uvalue
);
8325 printf (" %ld", uvalue
);
8330 uvalue
= byte_get (data
, 4);
8331 printf (" %lx", uvalue
);
8332 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
8336 case DW_FORM_string
:
8337 printf (" %s", data
);
8338 data
+= strlen ((char *) data
) + 1;
8342 uvalue
= read_leb128 (data
, & bytes_read
, 0);
8343 block_start
= data
+ bytes_read
;
8344 data
= display_block (block_start
, uvalue
);
8347 case DW_FORM_block1
:
8348 uvalue
= byte_get (data
, 1);
8349 block_start
= data
+ 1;
8350 data
= display_block (block_start
, uvalue
);
8353 case DW_FORM_block2
:
8354 uvalue
= byte_get (data
, 2);
8355 block_start
= data
+ 2;
8356 data
= display_block (block_start
, uvalue
);
8359 case DW_FORM_block4
:
8360 uvalue
= byte_get (data
, 4);
8361 block_start
= data
+ 4;
8362 data
= display_block (block_start
, uvalue
);
8366 printf (_(" (indirect string, offset: 0x%lx): %s"),
8367 uvalue
, fetch_indirect_string (uvalue
));
8370 case DW_FORM_indirect
:
8371 /* Handled above. */
8375 warn (_("Unrecognized form: %d\n"), form
);
8379 /* For some attributes we can display further information. */
8388 case DW_INL_not_inlined
:
8389 printf (_("(not inlined)"));
8391 case DW_INL_inlined
:
8392 printf (_("(inlined)"));
8394 case DW_INL_declared_not_inlined
:
8395 printf (_("(declared as inline but ignored)"));
8397 case DW_INL_declared_inlined
:
8398 printf (_("(declared as inline and inlined)"));
8401 printf (_(" (Unknown inline attribute value: %lx)"), uvalue
);
8406 case DW_AT_language
:
8409 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
8410 case DW_LANG_C89
: printf ("(ANSI C)"); break;
8411 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
8412 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
8413 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
8414 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
8415 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
8416 case DW_LANG_Ada83
: printf ("(Ada)"); break;
8417 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
8418 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
8419 /* DWARF 2.1 values. */
8420 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
8421 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
8422 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
8423 /* MIPS extension. */
8424 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
8425 /* UPC extension. */
8426 case DW_LANG_Upc
: printf ("(Unified Parallel C)"); break;
8428 printf ("(Unknown: %lx)", uvalue
);
8433 case DW_AT_encoding
:
8436 case DW_ATE_void
: printf ("(void)"); break;
8437 case DW_ATE_address
: printf ("(machine address)"); break;
8438 case DW_ATE_boolean
: printf ("(boolean)"); break;
8439 case DW_ATE_complex_float
: printf ("(complex float)"); break;
8440 case DW_ATE_float
: printf ("(float)"); break;
8441 case DW_ATE_signed
: printf ("(signed)"); break;
8442 case DW_ATE_signed_char
: printf ("(signed char)"); break;
8443 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
8444 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
8445 /* DWARF 2.1 value. */
8446 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
8448 if (uvalue
>= DW_ATE_lo_user
8449 && uvalue
<= DW_ATE_hi_user
)
8450 printf ("(user defined type)");
8452 printf ("(unknown type)");
8457 case DW_AT_accessibility
:
8460 case DW_ACCESS_public
: printf ("(public)"); break;
8461 case DW_ACCESS_protected
: printf ("(protected)"); break;
8462 case DW_ACCESS_private
: printf ("(private)"); break;
8464 printf ("(unknown accessibility)");
8469 case DW_AT_visibility
:
8472 case DW_VIS_local
: printf ("(local)"); break;
8473 case DW_VIS_exported
: printf ("(exported)"); break;
8474 case DW_VIS_qualified
: printf ("(qualified)"); break;
8475 default: printf ("(unknown visibility)"); break;
8479 case DW_AT_virtuality
:
8482 case DW_VIRTUALITY_none
: printf ("(none)"); break;
8483 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
8484 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
8485 default: printf ("(unknown virtuality)"); break;
8489 case DW_AT_identifier_case
:
8492 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
8493 case DW_ID_up_case
: printf ("(up_case)"); break;
8494 case DW_ID_down_case
: printf ("(down_case)"); break;
8495 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
8496 default: printf ("(unknown case)"); break;
8500 case DW_AT_calling_convention
:
8503 case DW_CC_normal
: printf ("(normal)"); break;
8504 case DW_CC_program
: printf ("(program)"); break;
8505 case DW_CC_nocall
: printf ("(nocall)"); break;
8507 if (uvalue
>= DW_CC_lo_user
8508 && uvalue
<= DW_CC_hi_user
)
8509 printf ("(user defined)");
8511 printf ("(unknown convention)");
8515 case DW_AT_ordering
:
8518 case -1: printf ("(undefined)"); break;
8519 case 0: printf ("(row major)"); break;
8520 case 1: printf ("(column major)"); break;
8524 case DW_AT_frame_base
:
8525 case DW_AT_location
:
8526 case DW_AT_data_member_location
:
8527 case DW_AT_vtable_elem_location
:
8528 case DW_AT_allocated
:
8529 case DW_AT_associated
:
8530 case DW_AT_data_location
:
8532 case DW_AT_upper_bound
:
8533 case DW_AT_lower_bound
:
8537 decode_location_expression (block_start
, pointer_size
, uvalue
);
8540 else if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
8543 printf ("location list");
8555 static unsigned char *
8556 read_and_display_attr (unsigned long attribute
,
8558 unsigned char *data
,
8559 unsigned long cu_offset
,
8560 unsigned long pointer_size
,
8561 unsigned long offset_size
,
8564 printf (" %-18s:", get_AT_name (attribute
));
8565 data
= read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
8566 pointer_size
, offset_size
, dwarf_version
);
8571 /* Apply addends of RELA relocations. */
8574 debug_apply_rela_addends (FILE *file
,
8575 Elf_Internal_Shdr
*section
,
8577 unsigned char *sec_data
,
8578 unsigned char *start
,
8581 Elf_Internal_Shdr
*relsec
;
8583 if (end
- start
< reloc_size
)
8586 for (relsec
= section_headers
;
8587 relsec
< section_headers
+ elf_header
.e_shnum
;
8590 unsigned long nrelas
;
8591 Elf_Internal_Rela
*rela
, *rp
;
8592 Elf_Internal_Shdr
*symsec
;
8593 Elf_Internal_Sym
*symtab
;
8594 Elf_Internal_Sym
*sym
;
8596 if (relsec
->sh_type
!= SHT_RELA
8597 || SECTION_HEADER (relsec
->sh_info
) != section
8598 || relsec
->sh_size
== 0)
8601 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
8605 symsec
= SECTION_HEADER (relsec
->sh_link
);
8606 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
8608 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
8612 if (rp
->r_offset
>= (bfd_vma
) (start
- sec_data
)
8613 && rp
->r_offset
< (bfd_vma
) (end
- sec_data
) - reloc_size
)
8614 loc
= sec_data
+ rp
->r_offset
;
8620 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
8622 if (ELF32_R_SYM (rp
->r_info
) != 0
8623 && ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
8625 warn (_("Skipping unexpected symbol type %u\n"),
8626 ELF32_ST_TYPE (sym
->st_info
));
8632 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
8634 if (ELF64_R_SYM (rp
->r_info
) != 0
8635 && ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
8637 warn (_("Skipping unexpected symbol type %u\n"),
8638 ELF64_ST_TYPE (sym
->st_info
));
8643 byte_put (loc
, rp
->r_addend
, reloc_size
);
8654 display_debug_info (Elf_Internal_Shdr
*section
,
8655 unsigned char *start
,
8658 unsigned char *end
= start
+ section
->sh_size
;
8659 unsigned char *section_begin
= start
;
8661 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
8663 load_debug_str (file
);
8664 load_debug_loc (file
);
8668 DWARF2_Internal_CompUnit compunit
;
8669 unsigned char *hdrptr
;
8670 unsigned char *cu_abbrev_offset_ptr
;
8671 unsigned char *tags
;
8673 unsigned long cu_offset
;
8675 int initial_length_size
;
8679 compunit
.cu_length
= byte_get (hdrptr
, 4);
8682 if (compunit
.cu_length
== 0xffffffff)
8684 compunit
.cu_length
= byte_get (hdrptr
, 8);
8687 initial_length_size
= 12;
8692 initial_length_size
= 4;
8695 compunit
.cu_version
= byte_get (hdrptr
, 2);
8698 cu_offset
= start
- section_begin
;
8699 start
+= compunit
.cu_length
+ initial_length_size
;
8701 if (elf_header
.e_type
== ET_REL
8702 && !debug_apply_rela_addends (file
, section
, offset_size
,
8703 section_begin
, hdrptr
, start
))
8706 cu_abbrev_offset_ptr
= hdrptr
;
8707 compunit
.cu_abbrev_offset
= byte_get (hdrptr
, offset_size
);
8708 hdrptr
+= offset_size
;
8710 compunit
.cu_pointer_size
= byte_get (hdrptr
, 1);
8715 printf (_(" Compilation Unit @ %lx:\n"), cu_offset
);
8716 printf (_(" Length: %ld\n"), compunit
.cu_length
);
8717 printf (_(" Version: %d\n"), compunit
.cu_version
);
8718 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
8719 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
8721 if (compunit
.cu_version
!= 2 && compunit
.cu_version
!= 3)
8723 warn (_("Only version 2 and 3 DWARF debug information is currently supported.\n"));
8729 /* Read in the abbrevs used by this compilation unit. */
8731 Elf_Internal_Shdr
*sec
;
8732 unsigned char *begin
;
8734 /* Locate the .debug_abbrev section and process it. */
8735 sec
= find_section (".debug_abbrev");
8738 warn (_("Unable to locate .debug_abbrev section!\n"));
8742 begin
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
8743 _("debug_abbrev section data"));
8747 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
8748 begin
+ sec
->sh_size
);
8754 while (tags
< start
)
8757 unsigned long abbrev_number
;
8758 abbrev_entry
*entry
;
8761 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
8764 /* A null DIE marks the end of a list of children. */
8765 if (abbrev_number
== 0)
8771 /* Scan through the abbreviation list until we reach the
8773 for (entry
= first_abbrev
;
8774 entry
&& entry
->entry
!= abbrev_number
;
8775 entry
= entry
->next
)
8780 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
8785 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
8787 (unsigned long) (tags
- section_begin
- bytes_read
),
8789 get_TAG_name (entry
->tag
));
8791 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
8792 tags
= read_and_display_attr (attr
->attribute
,
8795 compunit
.cu_pointer_size
,
8797 compunit
.cu_version
);
8799 if (entry
->children
)
8813 display_debug_aranges (Elf_Internal_Shdr
*section
,
8814 unsigned char *start
,
8815 FILE *file ATTRIBUTE_UNUSED
)
8817 unsigned char *end
= start
+ section
->sh_size
;
8819 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
8823 unsigned char *hdrptr
;
8824 DWARF2_Internal_ARange arange
;
8825 unsigned char *ranges
;
8826 unsigned long length
;
8827 unsigned long address
;
8830 int initial_length_size
;
8834 arange
.ar_length
= byte_get (hdrptr
, 4);
8837 if (arange
.ar_length
== 0xffffffff)
8839 arange
.ar_length
= byte_get (hdrptr
, 8);
8842 initial_length_size
= 12;
8847 initial_length_size
= 4;
8850 arange
.ar_version
= byte_get (hdrptr
, 2);
8853 arange
.ar_info_offset
= byte_get (hdrptr
, offset_size
);
8854 hdrptr
+= offset_size
;
8856 arange
.ar_pointer_size
= byte_get (hdrptr
, 1);
8859 arange
.ar_segment_size
= byte_get (hdrptr
, 1);
8862 if (arange
.ar_version
!= 2 && arange
.ar_version
!= 3)
8864 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
8868 printf (_(" Length: %ld\n"), arange
.ar_length
);
8869 printf (_(" Version: %d\n"), arange
.ar_version
);
8870 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
8871 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
8872 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
8874 printf (_("\n Address Length\n"));
8878 /* Must pad to an alignment boundary that is twice the pointer size. */
8879 excess
= (hdrptr
- start
) % (2 * arange
.ar_pointer_size
);
8881 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
8885 address
= byte_get (ranges
, arange
.ar_pointer_size
);
8887 ranges
+= arange
.ar_pointer_size
;
8889 length
= byte_get (ranges
, arange
.ar_pointer_size
);
8891 ranges
+= arange
.ar_pointer_size
;
8893 /* A pair of zeros marks the end of the list. */
8894 if (address
== 0 && length
== 0)
8897 printf (" %8.8lx %lu\n", address
, length
);
8900 start
+= arange
.ar_length
+ initial_length_size
;
8908 typedef struct Frame_Chunk
8910 struct Frame_Chunk
*next
;
8911 unsigned char *chunk_start
;
8913 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
8914 short int *col_type
;
8917 unsigned int code_factor
;
8919 unsigned long pc_begin
;
8920 unsigned long pc_range
;
8924 unsigned char fde_encoding
;
8925 unsigned char cfa_exp
;
8929 /* A marker for a col_type that means this column was never referenced
8930 in the frame info. */
8931 #define DW_CFA_unreferenced (-1)
8934 frame_need_space (Frame_Chunk
*fc
, int reg
)
8936 int prev
= fc
->ncols
;
8938 if (reg
< fc
->ncols
)
8941 fc
->ncols
= reg
+ 1;
8942 fc
->col_type
= xrealloc (fc
->col_type
, fc
->ncols
* sizeof (short int));
8943 fc
->col_offset
= xrealloc (fc
->col_offset
, fc
->ncols
* sizeof (int));
8945 while (prev
< fc
->ncols
)
8947 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
8948 fc
->col_offset
[prev
] = 0;
8954 frame_display_row (Frame_Chunk
*fc
, int *need_col_headers
, int *max_regs
)
8959 if (*max_regs
< fc
->ncols
)
8960 *max_regs
= fc
->ncols
;
8962 if (*need_col_headers
)
8964 *need_col_headers
= 0;
8966 printf (" LOC CFA ");
8968 for (r
= 0; r
< *max_regs
; r
++)
8969 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
8974 printf ("r%-4d", r
);
8980 printf ("%08lx ", fc
->pc_begin
);
8982 strcpy (tmp
, "exp");
8984 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
8985 printf ("%-8s ", tmp
);
8987 for (r
= 0; r
< fc
->ncols
; r
++)
8989 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
8991 switch (fc
->col_type
[r
])
8993 case DW_CFA_undefined
:
8996 case DW_CFA_same_value
:
9000 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
9002 case DW_CFA_register
:
9003 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
9005 case DW_CFA_expression
:
9006 strcpy (tmp
, "exp");
9009 strcpy (tmp
, "n/a");
9012 printf ("%-5s", tmp
);
9019 size_of_encoded_value (int encoding
)
9021 switch (encoding
& 0x7)
9024 case 0: return is_32bit_elf
? 4 : 8;
9032 get_encoded_value (unsigned char *data
, int encoding
)
9034 int size
= size_of_encoded_value (encoding
);
9035 if (encoding
& DW_EH_PE_signed
)
9036 return byte_get_signed (data
, size
);
9038 return byte_get (data
, size
);
9041 #define GET(N) byte_get (start, N); start += N
9042 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
9043 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
9046 display_debug_frames (Elf_Internal_Shdr
*section
,
9047 unsigned char *start
,
9048 FILE *file ATTRIBUTE_UNUSED
)
9050 unsigned char *end
= start
+ section
->sh_size
;
9051 unsigned char *section_start
= start
;
9052 Frame_Chunk
*chunks
= 0;
9053 Frame_Chunk
*remembered_state
= 0;
9055 int is_eh
= (strcmp (SECTION_NAME (section
), ".eh_frame") == 0);
9058 int addr_size
= is_32bit_elf
? 4 : 8;
9060 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
9064 unsigned char *saved_start
;
9065 unsigned char *block_end
;
9066 unsigned long length
;
9067 unsigned long cie_id
;
9070 int need_col_headers
= 1;
9071 unsigned char *augmentation_data
= NULL
;
9072 unsigned long augmentation_data_len
= 0;
9073 int encoded_ptr_size
= addr_size
;
9075 int initial_length_size
;
9077 saved_start
= start
;
9078 length
= byte_get (start
, 4); start
+= 4;
9082 printf ("\n%08lx ZERO terminator\n\n",
9083 (unsigned long)(saved_start
- section_start
));
9087 if (length
== 0xffffffff)
9089 length
= byte_get (start
, 8);
9092 initial_length_size
= 12;
9097 initial_length_size
= 4;
9100 block_end
= saved_start
+ length
+ initial_length_size
;
9101 cie_id
= byte_get (start
, offset_size
); start
+= offset_size
;
9103 if (elf_header
.e_type
== ET_REL
9104 && !debug_apply_rela_addends (file
, section
, offset_size
,
9105 section_start
, start
, block_end
))
9108 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
9112 fc
= xmalloc (sizeof (Frame_Chunk
));
9113 memset (fc
, 0, sizeof (Frame_Chunk
));
9117 fc
->chunk_start
= saved_start
;
9119 fc
->col_type
= xmalloc (sizeof (short int));
9120 fc
->col_offset
= xmalloc (sizeof (int));
9121 frame_need_space (fc
, max_regs
-1);
9125 fc
->augmentation
= start
;
9126 start
= strchr (start
, '\0') + 1;
9128 if (fc
->augmentation
[0] == 'z')
9130 fc
->code_factor
= LEB ();
9131 fc
->data_factor
= SLEB ();
9140 augmentation_data_len
= LEB ();
9141 augmentation_data
= start
;
9142 start
+= augmentation_data_len
;
9144 else if (strcmp (fc
->augmentation
, "eh") == 0)
9147 fc
->code_factor
= LEB ();
9148 fc
->data_factor
= SLEB ();
9160 fc
->code_factor
= LEB ();
9161 fc
->data_factor
= SLEB ();
9173 if (do_debug_frames_interp
)
9174 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
9175 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
9176 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
9180 printf ("\n%08lx %08lx %08lx CIE\n",
9181 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
9182 printf (" Version: %d\n", version
);
9183 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
9184 printf (" Code alignment factor: %u\n", fc
->code_factor
);
9185 printf (" Data alignment factor: %d\n", fc
->data_factor
);
9186 printf (" Return address column: %d\n", fc
->ra
);
9188 if (augmentation_data_len
)
9191 printf (" Augmentation data: ");
9192 for (i
= 0; i
< augmentation_data_len
; ++i
)
9193 printf (" %02x", augmentation_data
[i
]);
9199 if (augmentation_data_len
)
9201 unsigned char *p
, *q
;
9202 p
= fc
->augmentation
+ 1;
9203 q
= augmentation_data
;
9210 q
+= 1 + size_of_encoded_value (*q
);
9212 fc
->fde_encoding
= *q
++;
9218 if (fc
->fde_encoding
)
9219 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
9222 frame_need_space (fc
, fc
->ra
);
9226 unsigned char *look_for
;
9227 static Frame_Chunk fde_fc
;
9230 memset (fc
, 0, sizeof (Frame_Chunk
));
9232 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
9234 for (cie
= chunks
; cie
; cie
= cie
->next
)
9235 if (cie
->chunk_start
== look_for
)
9240 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
9241 cie_id
, saved_start
);
9244 fc
->col_type
= xmalloc (sizeof (short int));
9245 fc
->col_offset
= xmalloc (sizeof (int));
9246 frame_need_space (fc
, max_regs
- 1);
9248 fc
->augmentation
= "";
9249 fc
->fde_encoding
= 0;
9253 fc
->ncols
= cie
->ncols
;
9254 fc
->col_type
= xmalloc (fc
->ncols
* sizeof (short int));
9255 fc
->col_offset
= xmalloc (fc
->ncols
* sizeof (int));
9256 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
9257 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
9258 fc
->augmentation
= cie
->augmentation
;
9259 fc
->code_factor
= cie
->code_factor
;
9260 fc
->data_factor
= cie
->data_factor
;
9261 fc
->cfa_reg
= cie
->cfa_reg
;
9262 fc
->cfa_offset
= cie
->cfa_offset
;
9264 frame_need_space (fc
, max_regs
-1);
9265 fc
->fde_encoding
= cie
->fde_encoding
;
9268 if (fc
->fde_encoding
)
9269 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
9271 fc
->pc_begin
= get_encoded_value (start
, fc
->fde_encoding
);
9272 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
9273 /* Don't adjust for ET_REL since there's invariably a pcrel
9274 reloc here, which we haven't applied. */
9275 && elf_header
.e_type
!= ET_REL
)
9276 fc
->pc_begin
+= section
->sh_addr
+ (start
- section_start
);
9277 start
+= encoded_ptr_size
;
9278 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
9279 start
+= encoded_ptr_size
;
9281 if (cie
->augmentation
[0] == 'z')
9283 augmentation_data_len
= LEB ();
9284 augmentation_data
= start
;
9285 start
+= augmentation_data_len
;
9288 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
9289 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
9290 (unsigned long)(cie
->chunk_start
- section_start
),
9291 fc
->pc_begin
, fc
->pc_begin
+ fc
->pc_range
);
9292 if (! do_debug_frames_interp
&& augmentation_data_len
)
9295 printf (" Augmentation data: ");
9296 for (i
= 0; i
< augmentation_data_len
; ++i
)
9297 printf (" %02x", augmentation_data
[i
]);
9303 /* At this point, fc is the current chunk, cie (if any) is set, and we're
9304 about to interpret instructions for the chunk. */
9305 /* ??? At present we need to do this always, since this sizes the
9306 fc->col_type and fc->col_offset arrays, which we write into always.
9307 We should probably split the interpreted and non-interpreted bits
9308 into two different routines, since there's so much that doesn't
9309 really overlap between them. */
9310 if (1 || do_debug_frames_interp
)
9312 /* Start by making a pass over the chunk, allocating storage
9313 and taking note of what registers are used. */
9314 unsigned char *tmp
= start
;
9316 while (start
< block_end
)
9319 unsigned long reg
, tmp
;
9326 /* Warning: if you add any more cases to this switch, be
9327 sure to add them to the corresponding switch below. */
9330 case DW_CFA_advance_loc
:
9334 frame_need_space (fc
, opa
);
9335 fc
->col_type
[opa
] = DW_CFA_undefined
;
9337 case DW_CFA_restore
:
9338 frame_need_space (fc
, opa
);
9339 fc
->col_type
[opa
] = DW_CFA_undefined
;
9341 case DW_CFA_set_loc
:
9342 start
+= encoded_ptr_size
;
9344 case DW_CFA_advance_loc1
:
9347 case DW_CFA_advance_loc2
:
9350 case DW_CFA_advance_loc4
:
9353 case DW_CFA_offset_extended
:
9354 reg
= LEB (); LEB ();
9355 frame_need_space (fc
, reg
);
9356 fc
->col_type
[reg
] = DW_CFA_undefined
;
9358 case DW_CFA_restore_extended
:
9360 frame_need_space (fc
, reg
);
9361 fc
->col_type
[reg
] = DW_CFA_undefined
;
9363 case DW_CFA_undefined
:
9365 frame_need_space (fc
, reg
);
9366 fc
->col_type
[reg
] = DW_CFA_undefined
;
9368 case DW_CFA_same_value
:
9370 frame_need_space (fc
, reg
);
9371 fc
->col_type
[reg
] = DW_CFA_undefined
;
9373 case DW_CFA_register
:
9374 reg
= LEB (); LEB ();
9375 frame_need_space (fc
, reg
);
9376 fc
->col_type
[reg
] = DW_CFA_undefined
;
9378 case DW_CFA_def_cfa
:
9381 case DW_CFA_def_cfa_register
:
9384 case DW_CFA_def_cfa_offset
:
9387 case DW_CFA_def_cfa_expression
:
9391 case DW_CFA_expression
:
9395 frame_need_space (fc
, reg
);
9396 fc
->col_type
[reg
] = DW_CFA_undefined
;
9398 case DW_CFA_offset_extended_sf
:
9399 reg
= LEB (); SLEB ();
9400 frame_need_space (fc
, reg
);
9401 fc
->col_type
[reg
] = DW_CFA_undefined
;
9403 case DW_CFA_def_cfa_sf
:
9406 case DW_CFA_def_cfa_offset_sf
:
9409 case DW_CFA_MIPS_advance_loc8
:
9412 case DW_CFA_GNU_args_size
:
9415 case DW_CFA_GNU_negative_offset_extended
:
9416 reg
= LEB (); LEB ();
9417 frame_need_space (fc
, reg
);
9418 fc
->col_type
[reg
] = DW_CFA_undefined
;
9427 /* Now we know what registers are used, make a second pass over
9428 the chunk, this time actually printing out the info. */
9430 while (start
< block_end
)
9433 unsigned long ul
, reg
, roffs
;
9442 /* Warning: if you add any more cases to this switch, be
9443 sure to add them to the corresponding switch above. */
9446 case DW_CFA_advance_loc
:
9447 if (do_debug_frames_interp
)
9448 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9450 printf (" DW_CFA_advance_loc: %d to %08lx\n",
9451 opa
* fc
->code_factor
,
9452 fc
->pc_begin
+ opa
* fc
->code_factor
);
9453 fc
->pc_begin
+= opa
* fc
->code_factor
;
9458 if (! do_debug_frames_interp
)
9459 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
9460 opa
, roffs
* fc
->data_factor
);
9461 fc
->col_type
[opa
] = DW_CFA_offset
;
9462 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
9465 case DW_CFA_restore
:
9466 if (! do_debug_frames_interp
)
9467 printf (" DW_CFA_restore: r%d\n", opa
);
9468 fc
->col_type
[opa
] = cie
->col_type
[opa
];
9469 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
9472 case DW_CFA_set_loc
:
9473 vma
= get_encoded_value (start
, fc
->fde_encoding
);
9474 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
9475 && elf_header
.e_type
!= ET_REL
)
9476 vma
+= section
->sh_addr
+ (start
- section_start
);
9477 start
+= encoded_ptr_size
;
9478 if (do_debug_frames_interp
)
9479 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9481 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
9485 case DW_CFA_advance_loc1
:
9486 ofs
= byte_get (start
, 1); start
+= 1;
9487 if (do_debug_frames_interp
)
9488 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9490 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
9491 ofs
* fc
->code_factor
,
9492 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9493 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9496 case DW_CFA_advance_loc2
:
9497 ofs
= byte_get (start
, 2); start
+= 2;
9498 if (do_debug_frames_interp
)
9499 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9501 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
9502 ofs
* fc
->code_factor
,
9503 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9504 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9507 case DW_CFA_advance_loc4
:
9508 ofs
= byte_get (start
, 4); start
+= 4;
9509 if (do_debug_frames_interp
)
9510 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9512 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
9513 ofs
* fc
->code_factor
,
9514 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9515 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9518 case DW_CFA_offset_extended
:
9521 if (! do_debug_frames_interp
)
9522 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
9523 reg
, roffs
* fc
->data_factor
);
9524 fc
->col_type
[reg
] = DW_CFA_offset
;
9525 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
9528 case DW_CFA_restore_extended
:
9530 if (! do_debug_frames_interp
)
9531 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
9532 fc
->col_type
[reg
] = cie
->col_type
[reg
];
9533 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
9536 case DW_CFA_undefined
:
9538 if (! do_debug_frames_interp
)
9539 printf (" DW_CFA_undefined: r%ld\n", reg
);
9540 fc
->col_type
[reg
] = DW_CFA_undefined
;
9541 fc
->col_offset
[reg
] = 0;
9544 case DW_CFA_same_value
:
9546 if (! do_debug_frames_interp
)
9547 printf (" DW_CFA_same_value: r%ld\n", reg
);
9548 fc
->col_type
[reg
] = DW_CFA_same_value
;
9549 fc
->col_offset
[reg
] = 0;
9552 case DW_CFA_register
:
9555 if (! do_debug_frames_interp
)
9556 printf (" DW_CFA_register: r%ld in r%ld\n", reg
, roffs
);
9557 fc
->col_type
[reg
] = DW_CFA_register
;
9558 fc
->col_offset
[reg
] = roffs
;
9561 case DW_CFA_remember_state
:
9562 if (! do_debug_frames_interp
)
9563 printf (" DW_CFA_remember_state\n");
9564 rs
= xmalloc (sizeof (Frame_Chunk
));
9565 rs
->ncols
= fc
->ncols
;
9566 rs
->col_type
= xmalloc (rs
->ncols
* sizeof (short int));
9567 rs
->col_offset
= xmalloc (rs
->ncols
* sizeof (int));
9568 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
9569 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
9570 rs
->next
= remembered_state
;
9571 remembered_state
= rs
;
9574 case DW_CFA_restore_state
:
9575 if (! do_debug_frames_interp
)
9576 printf (" DW_CFA_restore_state\n");
9577 rs
= remembered_state
;
9580 remembered_state
= rs
->next
;
9581 frame_need_space (fc
, rs
->ncols
-1);
9582 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
9583 memcpy (fc
->col_offset
, rs
->col_offset
,
9584 rs
->ncols
* sizeof (int));
9585 free (rs
->col_type
);
9586 free (rs
->col_offset
);
9589 else if (do_debug_frames_interp
)
9590 printf ("Mismatched DW_CFA_restore_state\n");
9593 case DW_CFA_def_cfa
:
9594 fc
->cfa_reg
= LEB ();
9595 fc
->cfa_offset
= LEB ();
9597 if (! do_debug_frames_interp
)
9598 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
9599 fc
->cfa_reg
, fc
->cfa_offset
);
9602 case DW_CFA_def_cfa_register
:
9603 fc
->cfa_reg
= LEB ();
9605 if (! do_debug_frames_interp
)
9606 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
9609 case DW_CFA_def_cfa_offset
:
9610 fc
->cfa_offset
= LEB ();
9611 if (! do_debug_frames_interp
)
9612 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
9616 if (! do_debug_frames_interp
)
9617 printf (" DW_CFA_nop\n");
9620 case DW_CFA_def_cfa_expression
:
9622 if (! do_debug_frames_interp
)
9624 printf (" DW_CFA_def_cfa_expression (");
9625 decode_location_expression (start
, addr_size
, ul
);
9632 case DW_CFA_expression
:
9635 if (! do_debug_frames_interp
)
9637 printf (" DW_CFA_expression: r%ld (", reg
);
9638 decode_location_expression (start
, addr_size
, ul
);
9641 fc
->col_type
[reg
] = DW_CFA_expression
;
9645 case DW_CFA_offset_extended_sf
:
9648 frame_need_space (fc
, reg
);
9649 if (! do_debug_frames_interp
)
9650 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
9651 reg
, l
* fc
->data_factor
);
9652 fc
->col_type
[reg
] = DW_CFA_offset
;
9653 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
9656 case DW_CFA_def_cfa_sf
:
9657 fc
->cfa_reg
= LEB ();
9658 fc
->cfa_offset
= SLEB ();
9660 if (! do_debug_frames_interp
)
9661 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
9662 fc
->cfa_reg
, fc
->cfa_offset
);
9665 case DW_CFA_def_cfa_offset_sf
:
9666 fc
->cfa_offset
= SLEB ();
9667 if (! do_debug_frames_interp
)
9668 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc
->cfa_offset
);
9671 case DW_CFA_MIPS_advance_loc8
:
9672 ofs
= byte_get (start
, 8); start
+= 8;
9673 if (do_debug_frames_interp
)
9674 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9676 printf (" DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
9677 ofs
* fc
->code_factor
,
9678 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9679 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9682 case DW_CFA_GNU_window_save
:
9683 if (! do_debug_frames_interp
)
9684 printf (" DW_CFA_GNU_window_save\n");
9687 case DW_CFA_GNU_args_size
:
9689 if (! do_debug_frames_interp
)
9690 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
9693 case DW_CFA_GNU_negative_offset_extended
:
9696 frame_need_space (fc
, reg
);
9697 if (! do_debug_frames_interp
)
9698 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
9699 reg
, l
* fc
->data_factor
);
9700 fc
->col_type
[reg
] = DW_CFA_offset
;
9701 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
9705 fprintf (stderr
, "unsupported or unknown DW_CFA_%d\n", op
);
9710 if (do_debug_frames_interp
)
9711 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9726 display_debug_not_supported (Elf_Internal_Shdr
*section
,
9727 unsigned char *start ATTRIBUTE_UNUSED
,
9728 FILE *file ATTRIBUTE_UNUSED
)
9730 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
9731 SECTION_NAME (section
));
9736 /* A structure containing the name of a debug section
9737 and a pointer to a function that can decode it. */
9740 const char *const name
;
9741 int (*display
) (Elf_Internal_Shdr
*, unsigned char *, FILE *);
9745 { ".debug_abbrev", display_debug_abbrev
},
9746 { ".debug_aranges", display_debug_aranges
},
9747 { ".debug_frame", display_debug_frames
},
9748 { ".debug_info", display_debug_info
},
9749 { ".debug_line", display_debug_lines
},
9750 { ".debug_pubnames", display_debug_pubnames
},
9751 { ".eh_frame", display_debug_frames
},
9752 { ".debug_macinfo", display_debug_macinfo
},
9753 { ".debug_str", display_debug_str
},
9754 { ".debug_loc", display_debug_loc
},
9755 { ".debug_pubtypes", display_debug_pubnames
},
9756 { ".debug_ranges", display_debug_not_supported
},
9757 { ".debug_static_func", display_debug_not_supported
},
9758 { ".debug_static_vars", display_debug_not_supported
},
9759 { ".debug_types", display_debug_not_supported
},
9760 { ".debug_weaknames", display_debug_not_supported
}
9764 display_debug_section (Elf_Internal_Shdr
*section
, FILE *file
)
9766 char *name
= SECTION_NAME (section
);
9767 bfd_size_type length
;
9768 unsigned char *start
;
9771 length
= section
->sh_size
;
9774 printf (_("\nSection '%s' has no debugging data.\n"), name
);
9778 start
= get_data (NULL
, file
, section
->sh_offset
, length
,
9779 _("debug section data"));
9783 /* See if we know how to display the contents of this section. */
9784 if (strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
9785 name
= ".debug_info";
9787 for (i
= NUM_ELEM (debug_displays
); i
--;)
9788 if (strcmp (debug_displays
[i
].name
, name
) == 0)
9790 debug_displays
[i
].display (section
, start
, file
);
9795 printf (_("Unrecognized debug section: %s\n"), name
);
9799 /* If we loaded in the abbrev section at some point,
9800 we must release it here. */
9807 process_section_contents (FILE *file
)
9809 Elf_Internal_Shdr
*section
;
9815 for (i
= 0, section
= section_headers
;
9816 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
9819 #ifdef SUPPORT_DISASSEMBLY
9820 if (dump_sects
[i
] & DISASS_DUMP
)
9821 disassemble_section (section
, file
);
9823 if (dump_sects
[i
] & HEX_DUMP
)
9824 dump_section (section
, file
);
9826 if (dump_sects
[i
] & DEBUG_DUMP
)
9827 display_debug_section (section
, file
);
9830 if (i
< num_dump_sects
)
9831 warn (_("Some sections were not dumped because they do not exist!\n"));
9837 process_mips_fpe_exception (int mask
)
9842 if (mask
& OEX_FPU_INEX
)
9843 fputs ("INEX", stdout
), first
= 0;
9844 if (mask
& OEX_FPU_UFLO
)
9845 printf ("%sUFLO", first
? "" : "|"), first
= 0;
9846 if (mask
& OEX_FPU_OFLO
)
9847 printf ("%sOFLO", first
? "" : "|"), first
= 0;
9848 if (mask
& OEX_FPU_DIV0
)
9849 printf ("%sDIV0", first
? "" : "|"), first
= 0;
9850 if (mask
& OEX_FPU_INVAL
)
9851 printf ("%sINVAL", first
? "" : "|");
9854 fputs ("0", stdout
);
9858 process_mips_specific (FILE *file
)
9860 Elf_Internal_Dyn
*entry
;
9861 size_t liblist_offset
= 0;
9862 size_t liblistno
= 0;
9863 size_t conflictsno
= 0;
9864 size_t options_offset
= 0;
9865 size_t conflicts_offset
= 0;
9867 /* We have a lot of special sections. Thanks SGI! */
9868 if (dynamic_section
== NULL
)
9869 /* No information available. */
9872 for (entry
= dynamic_section
; entry
->d_tag
!= DT_NULL
; ++entry
)
9873 switch (entry
->d_tag
)
9875 case DT_MIPS_LIBLIST
:
9877 = offset_from_vma (file
, entry
->d_un
.d_val
,
9878 liblistno
* sizeof (Elf32_External_Lib
));
9880 case DT_MIPS_LIBLISTNO
:
9881 liblistno
= entry
->d_un
.d_val
;
9883 case DT_MIPS_OPTIONS
:
9884 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
9886 case DT_MIPS_CONFLICT
:
9888 = offset_from_vma (file
, entry
->d_un
.d_val
,
9889 conflictsno
* sizeof (Elf32_External_Conflict
));
9891 case DT_MIPS_CONFLICTNO
:
9892 conflictsno
= entry
->d_un
.d_val
;
9898 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
9900 Elf32_External_Lib
*elib
;
9903 elib
= get_data (NULL
, file
, liblist_offset
,
9904 liblistno
* sizeof (Elf32_External_Lib
),
9908 printf ("\nSection '.liblist' contains %lu entries:\n",
9909 (unsigned long) liblistno
);
9910 fputs (" Library Time Stamp Checksum Version Flags\n",
9913 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
9920 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9921 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9922 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9923 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9924 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9926 tmp
= gmtime (&time
);
9927 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
9928 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9929 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9931 printf ("%3lu: ", (unsigned long) cnt
);
9932 print_symbol (20, dynamic_strings
+ liblist
.l_name
);
9933 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
9936 if (liblist
.l_flags
== 0)
9947 { " EXACT_MATCH", LL_EXACT_MATCH
},
9948 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
9949 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
9950 { " EXPORTS", LL_EXPORTS
},
9951 { " DELAY_LOAD", LL_DELAY_LOAD
},
9952 { " DELTA", LL_DELTA
}
9954 int flags
= liblist
.l_flags
;
9958 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
9960 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
9962 fputs (l_flags_vals
[fcnt
].name
, stdout
);
9963 flags
^= l_flags_vals
[fcnt
].bit
;
9966 printf (" %#x", (unsigned int) flags
);
9976 if (options_offset
!= 0)
9978 Elf_External_Options
*eopt
;
9979 Elf_Internal_Shdr
*sect
= section_headers
;
9980 Elf_Internal_Options
*iopt
;
9981 Elf_Internal_Options
*option
;
9985 /* Find the section header so that we get the size. */
9986 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
9989 eopt
= get_data (NULL
, file
, options_offset
, sect
->sh_size
,
9993 iopt
= malloc ((sect
->sh_size
/ sizeof (eopt
)) * sizeof (*iopt
));
9996 error (_("Out of memory"));
10003 while (offset
< sect
->sh_size
)
10005 Elf_External_Options
*eoption
;
10007 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
10009 option
->kind
= BYTE_GET (eoption
->kind
);
10010 option
->size
= BYTE_GET (eoption
->size
);
10011 option
->section
= BYTE_GET (eoption
->section
);
10012 option
->info
= BYTE_GET (eoption
->info
);
10014 offset
+= option
->size
;
10020 printf (_("\nSection '%s' contains %d entries:\n"),
10021 SECTION_NAME (sect
), cnt
);
10029 switch (option
->kind
)
10032 /* This shouldn't happen. */
10033 printf (" NULL %d %lx", option
->section
, option
->info
);
10036 printf (" REGINFO ");
10037 if (elf_header
.e_machine
== EM_MIPS
)
10040 Elf32_External_RegInfo
*ereg
;
10041 Elf32_RegInfo reginfo
;
10043 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
10044 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
10045 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
10046 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
10047 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
10048 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
10049 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
10051 printf ("GPR %08lx GP 0x%lx\n",
10052 reginfo
.ri_gprmask
,
10053 (unsigned long) reginfo
.ri_gp_value
);
10054 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
10055 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
10056 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
10061 Elf64_External_RegInfo
*ereg
;
10062 Elf64_Internal_RegInfo reginfo
;
10064 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
10065 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
10066 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
10067 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
10068 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
10069 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
10070 reginfo
.ri_gp_value
= BYTE_GET8 (ereg
->ri_gp_value
);
10072 printf ("GPR %08lx GP 0x",
10073 reginfo
.ri_gprmask
);
10074 printf_vma (reginfo
.ri_gp_value
);
10077 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
10078 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
10079 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
10083 case ODK_EXCEPTIONS
:
10084 fputs (" EXCEPTIONS fpe_min(", stdout
);
10085 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
10086 fputs (") fpe_max(", stdout
);
10087 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
10088 fputs (")", stdout
);
10090 if (option
->info
& OEX_PAGE0
)
10091 fputs (" PAGE0", stdout
);
10092 if (option
->info
& OEX_SMM
)
10093 fputs (" SMM", stdout
);
10094 if (option
->info
& OEX_FPDBUG
)
10095 fputs (" FPDBUG", stdout
);
10096 if (option
->info
& OEX_DISMISS
)
10097 fputs (" DISMISS", stdout
);
10100 fputs (" PAD ", stdout
);
10101 if (option
->info
& OPAD_PREFIX
)
10102 fputs (" PREFIX", stdout
);
10103 if (option
->info
& OPAD_POSTFIX
)
10104 fputs (" POSTFIX", stdout
);
10105 if (option
->info
& OPAD_SYMBOL
)
10106 fputs (" SYMBOL", stdout
);
10109 fputs (" HWPATCH ", stdout
);
10110 if (option
->info
& OHW_R4KEOP
)
10111 fputs (" R4KEOP", stdout
);
10112 if (option
->info
& OHW_R8KPFETCH
)
10113 fputs (" R8KPFETCH", stdout
);
10114 if (option
->info
& OHW_R5KEOP
)
10115 fputs (" R5KEOP", stdout
);
10116 if (option
->info
& OHW_R5KCVTL
)
10117 fputs (" R5KCVTL", stdout
);
10120 fputs (" FILL ", stdout
);
10121 /* XXX Print content of info word? */
10124 fputs (" TAGS ", stdout
);
10125 /* XXX Print content of info word? */
10128 fputs (" HWAND ", stdout
);
10129 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
10130 fputs (" R4KEOP_CHECKED", stdout
);
10131 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
10132 fputs (" R4KEOP_CLEAN", stdout
);
10135 fputs (" HWOR ", stdout
);
10136 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
10137 fputs (" R4KEOP_CHECKED", stdout
);
10138 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
10139 fputs (" R4KEOP_CLEAN", stdout
);
10142 printf (" GP_GROUP %#06lx self-contained %#06lx",
10143 option
->info
& OGP_GROUP
,
10144 (option
->info
& OGP_SELF
) >> 16);
10147 printf (" IDENT %#06lx self-contained %#06lx",
10148 option
->info
& OGP_GROUP
,
10149 (option
->info
& OGP_SELF
) >> 16);
10152 /* This shouldn't happen. */
10153 printf (" %3d ??? %d %lx",
10154 option
->kind
, option
->section
, option
->info
);
10158 len
= sizeof (*eopt
);
10159 while (len
< option
->size
)
10160 if (((char *) option
)[len
] >= ' '
10161 && ((char *) option
)[len
] < 0x7f)
10162 printf ("%c", ((char *) option
)[len
++]);
10164 printf ("\\%03o", ((char *) option
)[len
++]);
10166 fputs ("\n", stdout
);
10174 if (conflicts_offset
!= 0 && conflictsno
!= 0)
10176 Elf32_Conflict
*iconf
;
10179 if (dynamic_symbols
== NULL
)
10181 error (_("conflict list found without a dynamic symbol table"));
10185 iconf
= malloc (conflictsno
* sizeof (*iconf
));
10188 error (_("Out of memory"));
10194 Elf32_External_Conflict
*econf32
;
10196 econf32
= get_data (NULL
, file
, conflicts_offset
,
10197 conflictsno
* sizeof (*econf32
), _("conflict"));
10201 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10202 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
10208 Elf64_External_Conflict
*econf64
;
10210 econf64
= get_data (NULL
, file
, conflicts_offset
,
10211 conflictsno
* sizeof (*econf64
), _("conflict"));
10215 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10216 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
10221 printf (_("\nSection '.conflict' contains %lu entries:\n"),
10222 (unsigned long) conflictsno
);
10223 puts (_(" Num: Index Value Name"));
10225 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10227 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
10229 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
10230 print_vma (psym
->st_value
, FULL_HEX
);
10232 print_symbol (25, dynamic_strings
+ psym
->st_name
);
10243 process_gnu_liblist (FILE *file
)
10245 Elf_Internal_Shdr
*section
, *string_sec
;
10246 Elf32_External_Lib
*elib
;
10254 for (i
= 0, section
= section_headers
;
10255 i
< elf_header
.e_shnum
;
10258 switch (section
->sh_type
)
10260 case SHT_GNU_LIBLIST
:
10261 elib
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
10266 string_sec
= SECTION_HEADER (section
->sh_link
);
10268 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
10269 string_sec
->sh_size
, _("liblist string table"));
10272 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
10278 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
10279 SECTION_NAME (section
),
10280 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
10282 puts (" Library Time Stamp Checksum Version Flags");
10284 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
10292 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
10293 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
10294 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
10295 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
10296 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
10298 tmp
= gmtime (&time
);
10299 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
10300 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
10301 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
10303 printf ("%3lu: ", (unsigned long) cnt
);
10305 printf ("%-20s", strtab
+ liblist
.l_name
);
10307 printf ("%-20.20s", strtab
+ liblist
.l_name
);
10308 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
10309 liblist
.l_version
, liblist
.l_flags
);
10319 static const char *
10320 get_note_type (unsigned e_type
)
10322 static char buff
[64];
10326 case NT_AUXV
: return _("NT_AUXV (auxiliary vector)");
10327 case NT_PRSTATUS
: return _("NT_PRSTATUS (prstatus structure)");
10328 case NT_FPREGSET
: return _("NT_FPREGSET (floating point registers)");
10329 case NT_PRPSINFO
: return _("NT_PRPSINFO (prpsinfo structure)");
10330 case NT_TASKSTRUCT
: return _("NT_TASKSTRUCT (task structure)");
10331 case NT_PRXFPREG
: return _("NT_PRXFPREG (user_xfpregs structure)");
10332 case NT_PSTATUS
: return _("NT_PSTATUS (pstatus structure)");
10333 case NT_FPREGS
: return _("NT_FPREGS (floating point registers)");
10334 case NT_PSINFO
: return _("NT_PSINFO (psinfo structure)");
10335 case NT_LWPSTATUS
: return _("NT_LWPSTATUS (lwpstatus_t structure)");
10336 case NT_LWPSINFO
: return _("NT_LWPSINFO (lwpsinfo_t structure)");
10337 case NT_WIN32PSTATUS
: return _("NT_WIN32PSTATUS (win32_pstatus structure)");
10339 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
10344 static const char *
10345 get_netbsd_elfcore_note_type (unsigned e_type
)
10347 static char buff
[64];
10349 if (e_type
== NT_NETBSDCORE_PROCINFO
)
10351 /* NetBSD core "procinfo" structure. */
10352 return _("NetBSD procinfo structure");
10355 /* As of Jan 2002 there are no other machine-independent notes
10356 defined for NetBSD core files. If the note type is less
10357 than the start of the machine-dependent note types, we don't
10360 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
10362 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
10366 switch (elf_header
.e_machine
)
10368 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
10369 and PT_GETFPREGS == mach+2. */
10374 case EM_SPARC32PLUS
:
10378 case NT_NETBSDCORE_FIRSTMACH
+0:
10379 return _("PT_GETREGS (reg structure)");
10380 case NT_NETBSDCORE_FIRSTMACH
+2:
10381 return _("PT_GETFPREGS (fpreg structure)");
10387 /* On all other arch's, PT_GETREGS == mach+1 and
10388 PT_GETFPREGS == mach+3. */
10392 case NT_NETBSDCORE_FIRSTMACH
+1:
10393 return _("PT_GETREGS (reg structure)");
10394 case NT_NETBSDCORE_FIRSTMACH
+3:
10395 return _("PT_GETFPREGS (fpreg structure)");
10401 sprintf (buff
, _("PT_FIRSTMACH+%d"), e_type
- NT_NETBSDCORE_FIRSTMACH
);
10405 /* Note that by the ELF standard, the name field is already null byte
10406 terminated, and namesz includes the terminating null byte.
10407 I.E. the value of namesz for the name "FSF" is 4.
10409 If the value of namesz is zero, there is no name present. */
10411 process_note (Elf_Internal_Note
*pnote
)
10415 if (pnote
->namesz
== 0)
10417 /* If there is no note name, then use the default set of
10418 note type strings. */
10419 nt
= get_note_type (pnote
->type
);
10421 else if (strncmp (pnote
->namedata
, "NetBSD-CORE", 11) == 0)
10423 /* NetBSD-specific core file notes. */
10424 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
10428 /* Don't recognize this note name; just use the default set of
10429 note type strings. */
10430 nt
= get_note_type (pnote
->type
);
10433 printf (" %s\t\t0x%08lx\t%s\n",
10434 pnote
->namesz
? pnote
->namedata
: "(NONE)",
10435 pnote
->descsz
, nt
);
10441 process_corefile_note_segment (FILE *file
, bfd_vma offset
, bfd_vma length
)
10443 Elf_External_Note
*pnotes
;
10444 Elf_External_Note
*external
;
10450 pnotes
= get_data (NULL
, file
, offset
, length
, _("notes"));
10456 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
10457 (unsigned long) offset
, (unsigned long) length
);
10458 printf (_(" Owner\t\tData size\tDescription\n"));
10460 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
10462 Elf_External_Note
*next
;
10463 Elf_Internal_Note inote
;
10466 inote
.type
= BYTE_GET (external
->type
);
10467 inote
.namesz
= BYTE_GET (external
->namesz
);
10468 inote
.namedata
= external
->name
;
10469 inote
.descsz
= BYTE_GET (external
->descsz
);
10470 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
10471 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
10473 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
10475 if (((char *) next
) > (((char *) pnotes
) + length
))
10477 warn (_("corrupt note found at offset %x into core notes\n"),
10478 ((char *) external
) - ((char *) pnotes
));
10479 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
10480 inote
.type
, inote
.namesz
, inote
.descsz
);
10486 /* Verify that name is null terminated. It appears that at least
10487 one version of Linux (RedHat 6.0) generates corefiles that don't
10488 comply with the ELF spec by failing to include the null byte in
10490 if (inote
.namedata
[inote
.namesz
] != '\0')
10492 temp
= malloc (inote
.namesz
+ 1);
10496 error (_("Out of memory\n"));
10501 strncpy (temp
, inote
.namedata
, inote
.namesz
);
10502 temp
[inote
.namesz
] = 0;
10504 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
10505 inote
.namedata
= temp
;
10508 res
&= process_note (& inote
);
10523 process_corefile_note_segments (FILE *file
)
10525 Elf_Internal_Phdr
*segment
;
10529 if (! get_program_headers (file
))
10532 for (i
= 0, segment
= program_headers
;
10533 i
< elf_header
.e_phnum
;
10536 if (segment
->p_type
== PT_NOTE
)
10537 res
&= process_corefile_note_segment (file
,
10538 (bfd_vma
) segment
->p_offset
,
10539 (bfd_vma
) segment
->p_filesz
);
10546 process_corefile_contents (FILE *file
)
10548 /* If we have not been asked to display the notes then do nothing. */
10552 /* If file is not a core file then exit. */
10553 if (elf_header
.e_type
!= ET_CORE
)
10556 /* No program headers means no NOTE segment. */
10557 if (elf_header
.e_phnum
== 0)
10559 printf (_("No note segments present in the core file.\n"));
10563 return process_corefile_note_segments (file
);
10567 process_arch_specific (FILE *file
)
10572 switch (elf_header
.e_machine
)
10575 case EM_MIPS_RS3_LE
:
10576 return process_mips_specific (file
);
10585 get_file_header (FILE *file
)
10587 /* Read in the identity array. */
10588 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
10591 /* Determine how to read the rest of the header. */
10592 switch (elf_header
.e_ident
[EI_DATA
])
10594 default: /* fall through */
10595 case ELFDATANONE
: /* fall through */
10597 byte_get
= byte_get_little_endian
;
10598 byte_put
= byte_put_little_endian
;
10601 byte_get
= byte_get_big_endian
;
10602 byte_put
= byte_put_big_endian
;
10606 /* For now we only support 32 bit and 64 bit ELF files. */
10607 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
10609 /* Read in the rest of the header. */
10612 Elf32_External_Ehdr ehdr32
;
10614 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
10617 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
10618 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
10619 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
10620 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
10621 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
10622 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
10623 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
10624 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
10625 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
10626 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
10627 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
10628 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
10629 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
10633 Elf64_External_Ehdr ehdr64
;
10635 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10636 we will not be able to cope with the 64bit data found in
10637 64 ELF files. Detect this now and abort before we start
10638 overwriting things. */
10639 if (sizeof (bfd_vma
) < 8)
10641 error (_("This instance of readelf has been built without support for a\n\
10642 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10646 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
10649 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
10650 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
10651 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
10652 elf_header
.e_entry
= BYTE_GET8 (ehdr64
.e_entry
);
10653 elf_header
.e_phoff
= BYTE_GET8 (ehdr64
.e_phoff
);
10654 elf_header
.e_shoff
= BYTE_GET8 (ehdr64
.e_shoff
);
10655 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
10656 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
10657 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
10658 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
10659 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
10660 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
10661 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
10664 if (elf_header
.e_shoff
)
10666 /* There may be some extensions in the first section header. Don't
10667 bomb if we can't read it. */
10669 get_32bit_section_headers (file
, 1);
10671 get_64bit_section_headers (file
, 1);
10677 /* Process one ELF object file according to the command line options.
10678 This file may actually be stored in an archive. The file is
10679 positioned at the start of the ELF object. */
10682 process_object (char *file_name
, FILE *file
)
10686 if (! get_file_header (file
))
10688 error (_("%s: Failed to read file header\n"), file_name
);
10692 /* Initialise per file variables. */
10693 for (i
= NUM_ELEM (version_info
); i
--;)
10694 version_info
[i
] = 0;
10696 for (i
= NUM_ELEM (dynamic_info
); i
--;)
10697 dynamic_info
[i
] = 0;
10699 /* Process the file. */
10701 printf (_("\nFile: %s\n"), file_name
);
10703 if (! process_file_header ())
10706 if (! process_section_headers (file
)
10707 || ! process_section_groups (file
))
10709 /* Without loaded section headers and section groups we
10710 cannot process lots of things. */
10711 do_unwind
= do_version
= do_dump
= do_arch
= 0;
10713 if (! do_using_dynamic
)
10714 do_syms
= do_reloc
= 0;
10717 if (process_program_headers (file
))
10718 process_dynamic_section (file
);
10720 process_relocs (file
);
10722 process_unwind (file
);
10724 process_symbol_table (file
);
10726 process_syminfo (file
);
10728 process_version_sections (file
);
10730 process_section_contents (file
);
10732 process_corefile_contents (file
);
10734 process_gnu_liblist (file
);
10736 process_arch_specific (file
);
10738 if (program_headers
)
10740 free (program_headers
);
10741 program_headers
= NULL
;
10744 if (section_headers
)
10746 free (section_headers
);
10747 section_headers
= NULL
;
10752 free (string_table
);
10753 string_table
= NULL
;
10754 string_table_length
= 0;
10757 if (dynamic_strings
)
10759 free (dynamic_strings
);
10760 dynamic_strings
= NULL
;
10763 if (dynamic_symbols
)
10765 free (dynamic_symbols
);
10766 dynamic_symbols
= NULL
;
10767 num_dynamic_syms
= 0;
10770 if (dynamic_syminfo
)
10772 free (dynamic_syminfo
);
10773 dynamic_syminfo
= NULL
;
10776 if (section_headers_groups
)
10778 free (section_headers_groups
);
10779 section_headers_groups
= NULL
;
10782 if (section_groups
)
10784 struct group_list
*g
, *next
;
10786 for (i
= 0; i
< group_count
; i
++)
10788 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
10795 free (section_groups
);
10796 section_groups
= NULL
;
10802 /* Process an ELF archive. The file is positioned just after the
10806 process_archive (char *file_name
, FILE *file
)
10808 struct ar_hdr arhdr
;
10810 unsigned long size
;
10811 char *longnames
= NULL
;
10812 unsigned long longnames_size
= 0;
10813 size_t file_name_size
;
10818 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10819 if (got
!= sizeof arhdr
)
10824 error (_("%s: failed to read archive header\n"), file_name
);
10828 if (memcmp (arhdr
.ar_name
, "/ ", 16) == 0)
10830 /* This is the archive symbol table. Skip it.
10831 FIXME: We should have an option to dump it. */
10832 size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10833 if (fseek (file
, size
+ (size
& 1), SEEK_CUR
) != 0)
10835 error (_("%s: failed to skip archive symbol table\n"), file_name
);
10839 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10840 if (got
!= sizeof arhdr
)
10845 error (_("%s: failed to read archive header\n"), file_name
);
10850 if (memcmp (arhdr
.ar_name
, "// ", 16) == 0)
10852 /* This is the archive string table holding long member
10855 longnames_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10857 longnames
= malloc (longnames_size
);
10858 if (longnames
== NULL
)
10860 error (_("Out of memory\n"));
10864 if (fread (longnames
, longnames_size
, 1, file
) != 1)
10867 error(_("%s: failed to read string table\n"), file_name
);
10871 if ((longnames_size
& 1) != 0)
10874 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10875 if (got
!= sizeof arhdr
)
10882 error (_("%s: failed to read archive header\n"), file_name
);
10887 file_name_size
= strlen (file_name
);
10896 if (arhdr
.ar_name
[0] == '/')
10900 off
= strtoul (arhdr
.ar_name
+ 1, NULL
, 10);
10901 if (off
>= longnames_size
)
10903 error (_("%s: invalid archive string table offset %lu\n"), off
);
10908 name
= longnames
+ off
;
10909 nameend
= memchr (name
, '/', longnames_size
- off
);
10913 name
= arhdr
.ar_name
;
10914 nameend
= memchr (name
, '/', 16);
10917 if (nameend
== NULL
)
10919 error (_("%s: bad archive file name\n"));
10924 namealc
= malloc (file_name_size
+ (nameend
- name
) + 3);
10925 if (namealc
== NULL
)
10927 error (_("Out of memory\n"));
10932 memcpy (namealc
, file_name
, file_name_size
);
10933 namealc
[file_name_size
] = '(';
10934 memcpy (namealc
+ file_name_size
+ 1, name
, nameend
- name
);
10935 namealc
[file_name_size
+ 1 + (nameend
- name
)] = ')';
10936 namealc
[file_name_size
+ 2 + (nameend
- name
)] = '\0';
10938 archive_file_offset
= ftell (file
);
10939 archive_file_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10941 ret
|= process_object (namealc
, file
);
10946 (archive_file_offset
10947 + archive_file_size
10948 + (archive_file_size
& 1)),
10951 error (_("%s: failed to seek to next archive header\n"), file_name
);
10956 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10957 if (got
!= sizeof arhdr
)
10962 error (_("%s: failed to read archive header\n"), file_name
);
10968 if (longnames
!= 0)
10975 process_file (char *file_name
)
10978 struct stat statbuf
;
10979 char armag
[SARMAG
];
10982 if (stat (file_name
, &statbuf
) < 0)
10984 if (errno
== ENOENT
)
10985 error (_("'%s': No such file\n"), file_name
);
10987 error (_("Could not locate '%s'. System error message: %s\n"),
10988 file_name
, strerror (errno
));
10992 if (! S_ISREG (statbuf
.st_mode
))
10994 error (_("'%s' is not an ordinary file\n"), file_name
);
10998 file
= fopen (file_name
, "rb");
11001 error (_("Input file '%s' is not readable.\n"), file_name
);
11005 if (fread (armag
, SARMAG
, 1, file
) != 1)
11007 error (_("%s: Failed to read file header\n"), file_name
);
11012 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
11013 ret
= process_archive (file_name
, file
);
11017 archive_file_size
= archive_file_offset
= 0;
11018 ret
= process_object (file_name
, file
);
11026 #ifdef SUPPORT_DISASSEMBLY
11027 /* Needed by the i386 disassembler. For extra credit, someone could
11028 fix this so that we insert symbolic addresses here, esp for GOT/PLT
11032 print_address (unsigned int addr
, FILE *outfile
)
11034 fprintf (outfile
,"0x%8.8x", addr
);
11037 /* Needed by the i386 disassembler. */
11039 db_task_printsym (unsigned int addr
)
11041 print_address (addr
, stderr
);
11046 main (int argc
, char **argv
)
11049 char *cmdline_dump_sects
= NULL
;
11050 unsigned num_cmdline_dump_sects
= 0;
11052 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
11053 setlocale (LC_MESSAGES
, "");
11055 #if defined (HAVE_SETLOCALE)
11056 setlocale (LC_CTYPE
, "");
11058 bindtextdomain (PACKAGE
, LOCALEDIR
);
11059 textdomain (PACKAGE
);
11061 parse_args (argc
, argv
);
11063 if (optind
< (argc
- 1))
11066 /* When processing more than one file remember the dump requests
11067 issued on command line to reset them after each file. */
11068 if (optind
+ 1 < argc
&& dump_sects
!= NULL
)
11070 cmdline_dump_sects
= malloc (num_dump_sects
);
11071 if (cmdline_dump_sects
== NULL
)
11072 error (_("Out of memory allocating dump request table."));
11075 memcpy (cmdline_dump_sects
, dump_sects
, num_dump_sects
);
11076 num_cmdline_dump_sects
= num_dump_sects
;
11081 while (optind
< argc
)
11083 err
|= process_file (argv
[optind
++]);
11085 /* Reset dump requests. */
11086 if (optind
< argc
&& dump_sects
!= NULL
)
11088 num_dump_sects
= num_cmdline_dump_sects
;
11089 if (num_cmdline_dump_sects
> 0)
11090 memcpy (dump_sects
, cmdline_dump_sects
, num_cmdline_dump_sects
);
11094 if (dump_sects
!= NULL
)
11096 if (cmdline_dump_sects
!= NULL
)
11097 free (cmdline_dump_sects
);