1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
24 /* The difference between readelf and objdump:
26 Both programs are capabale of displaying the contents of ELF format files,
27 so why does the binutils project have two file dumpers ?
29 The reason is that objdump sees an ELF file through a BFD filter of the
30 world; if BFD has a bug where, say, it disagrees about a machine constant
31 in e_flags, then the odds are good that it will remain internally
32 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
33 GAS sees it the BFD way. There was need for a tool to go find out what
34 the file actually says.
36 This is why the readelf program does not link against the BFD library - it
37 exists as an independent program to help verify the correct working of BFD.
39 There is also the case that readelf can provide more information about an
40 ELF file than is provided by objdump. In particular it can display DWARF
41 debugging information which (at the moment) objdump cannot. */
44 #include <sys/types.h>
50 /* Define BFD64 here, even if our default architecture is 32 bit ELF
51 as this will allow us to read in and parse 64bit and 32bit ELF files.
52 Only do this if we believe that the compiler can support a 64 bit
53 data type. For now we only rely on GCC being able to do this. */
59 #include "elf/common.h"
60 #include "elf/external.h"
61 #include "elf/internal.h"
62 #include "elf/dwarf2.h"
64 /* The following headers use the elf/reloc-macros.h file to
65 automatically generate relocation recognition functions
66 such as elf_mips_reloc_type() */
68 #define RELOC_MACROS_GEN_FUNC
70 #include "elf/alpha.h"
90 #include "elf/m68hc11.h"
91 #include "elf/mcore.h"
94 #include "elf/mn10200.h"
95 #include "elf/mn10300.h"
96 #include "elf/msp430.h"
100 #include "elf/ppc64.h"
101 #include "elf/s390.h"
103 #include "elf/sparc.h"
104 #include "elf/v850.h"
106 #include "elf/x86-64.h"
107 #include "elf/xstormy16.h"
108 #include "elf/iq2000.h"
109 #include "elf/xtensa.h"
115 #include "libiberty.h"
117 char *program_name
= "readelf";
118 long archive_file_offset
;
119 unsigned long archive_file_size
;
120 unsigned long dynamic_addr
;
121 bfd_size_type dynamic_size
;
122 unsigned int dynamic_nent
;
123 char *dynamic_strings
;
125 unsigned long string_table_length
;
126 unsigned long num_dynamic_syms
;
127 Elf_Internal_Sym
*dynamic_symbols
;
128 Elf_Internal_Syminfo
*dynamic_syminfo
;
129 unsigned long dynamic_syminfo_offset
;
130 unsigned int dynamic_syminfo_nent
;
131 char program_interpreter
[64];
132 bfd_vma dynamic_info
[DT_JMPREL
+ 1];
133 bfd_vma version_info
[16];
134 Elf_Internal_Ehdr elf_header
;
135 Elf_Internal_Shdr
*section_headers
;
136 Elf_Internal_Phdr
*program_headers
;
137 Elf_Internal_Dyn
*dynamic_section
;
138 Elf_Internal_Shdr
*symtab_shndx_hdr
;
144 int do_section_groups
;
147 int do_using_dynamic
;
155 int do_debug_abbrevs
;
157 int do_debug_pubnames
;
158 int do_debug_aranges
;
160 int do_debug_frames_interp
;
161 int do_debug_macinfo
;
170 struct group_list
*next
;
171 unsigned int section_index
;
176 struct group_list
*root
;
177 unsigned int group_index
;
180 struct group
*section_groups
;
181 size_t group_count
= 0;
183 struct group
**section_headers_groups
;
185 /* A dynamic array of flags indicating which sections require dumping. */
186 char *dump_sects
= NULL
;
187 unsigned int num_dump_sects
= 0;
189 #define HEX_DUMP (1 << 0)
190 #define DISASS_DUMP (1 << 1)
191 #define DEBUG_DUMP (1 << 2)
193 /* How to rpint a vma value. */
194 typedef enum print_mode
206 static bfd_vma (*byte_get
) (unsigned char *, int);
207 static void (*byte_put
) (unsigned char *, bfd_vma
, int);
211 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
212 ((X)->sh_name >= string_table_length \
213 ? "<corrupt>" : string_table + (X)->sh_name))
215 /* Given st_shndx I, map to section_headers index. */
216 #define SECTION_HEADER_INDEX(I) \
217 ((I) < SHN_LORESERVE \
219 : ((I) <= SHN_HIRESERVE \
221 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
223 /* Reverse of the above. */
224 #define SECTION_HEADER_NUM(N) \
225 ((N) < SHN_LORESERVE \
227 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
229 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
231 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
233 #define BYTE_GET(field) byte_get (field, sizeof (field))
235 /* If we can support a 64 bit data type then BFD64 should be defined
236 and sizeof (bfd_vma) == 8. In this case when translating from an
237 external 8 byte field to an internal field, we can assume that the
238 internal field is also 8 bytes wide and so we can extract all the data.
239 If, however, BFD64 is not defined, then we must assume that the
240 internal data structure only has 4 byte wide fields that are the
241 equivalent of the 8 byte wide external counterparts, and so we must
242 truncate the data. */
244 #define BYTE_GET8(field) byte_get (field, -8)
246 #define BYTE_GET8(field) byte_get (field, 8)
249 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
251 #define GET_ELF_SYMBOLS(file, section) \
252 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
253 : get_64bit_elf_symbols (file, section))
257 error (const char *message
, ...)
261 va_start (args
, message
);
262 fprintf (stderr
, _("%s: Error: "), program_name
);
263 vfprintf (stderr
, message
, args
);
268 warn (const char *message
, ...)
272 va_start (args
, message
);
273 fprintf (stderr
, _("%s: Warning: "), program_name
);
274 vfprintf (stderr
, message
, args
);
279 get_data (void *var
, FILE *file
, long offset
, size_t size
, const char *reason
)
286 if (fseek (file
, archive_file_offset
+ offset
, SEEK_SET
))
288 error (_("Unable to seek to 0x%x for %s\n"),
289 archive_file_offset
+ offset
, reason
);
296 mvar
= malloc (size
);
300 error (_("Out of memory allocating 0x%x bytes for %s\n"),
306 if (fread (mvar
, size
, 1, file
) != 1)
308 error (_("Unable to read in 0x%x bytes of %s\n"), size
, reason
);
318 byte_get_little_endian (unsigned char *field
, int size
)
326 return ((unsigned int) (field
[0]))
327 | (((unsigned int) (field
[1])) << 8);
331 /* We want to extract data from an 8 byte wide field and
332 place it into a 4 byte wide field. Since this is a little
333 endian source we can just use the 4 byte extraction code. */
337 return ((unsigned long) (field
[0]))
338 | (((unsigned long) (field
[1])) << 8)
339 | (((unsigned long) (field
[2])) << 16)
340 | (((unsigned long) (field
[3])) << 24);
345 /* This is a special case, generated by the BYTE_GET8 macro.
346 It means that we are loading an 8 byte value from a field
347 in an external structure into an 8 byte value in a field
348 in an internal structure. */
349 return ((bfd_vma
) (field
[0]))
350 | (((bfd_vma
) (field
[1])) << 8)
351 | (((bfd_vma
) (field
[2])) << 16)
352 | (((bfd_vma
) (field
[3])) << 24)
353 | (((bfd_vma
) (field
[4])) << 32)
354 | (((bfd_vma
) (field
[5])) << 40)
355 | (((bfd_vma
) (field
[6])) << 48)
356 | (((bfd_vma
) (field
[7])) << 56);
359 error (_("Unhandled data length: %d\n"), size
);
365 byte_get_signed (unsigned char *field
, int size
)
367 bfd_vma x
= byte_get (field
, size
);
372 return (x
^ 0x80) - 0x80;
374 return (x
^ 0x8000) - 0x8000;
376 return (x
^ 0x80000000) - 0x80000000;
386 byte_put_little_endian (unsigned char *field
, bfd_vma value
, int size
)
391 field
[7] = (((value
>> 24) >> 24) >> 8) & 0xff;
392 field
[6] = ((value
>> 24) >> 24) & 0xff;
393 field
[5] = ((value
>> 24) >> 16) & 0xff;
394 field
[4] = ((value
>> 24) >> 8) & 0xff;
397 field
[3] = (value
>> 24) & 0xff;
398 field
[2] = (value
>> 16) & 0xff;
401 field
[1] = (value
>> 8) & 0xff;
404 field
[0] = value
& 0xff;
408 error (_("Unhandled data length: %d\n"), size
);
413 /* Print a VMA value. */
415 print_vma (bfd_vma vma
, print_mode mode
)
427 printf ("%8.8lx", (unsigned long) vma
);
433 printf ("%5ld", (long) vma
);
441 printf ("%lx", (unsigned long) vma
);
445 printf ("%ld", (unsigned long) vma
);
449 printf ("%lu", (unsigned long) vma
);
471 #if BFD_HOST_64BIT_LONG
474 if (_bfd_int64_high (vma
))
475 printf ("%lx%8.8lx", _bfd_int64_high (vma
), _bfd_int64_low (vma
));
477 printf ("%lx", _bfd_int64_low (vma
));
482 #if BFD_HOST_64BIT_LONG
485 if (_bfd_int64_high (vma
))
487 printf ("++%ld", _bfd_int64_low (vma
));
489 printf ("%ld", _bfd_int64_low (vma
));
494 #if BFD_HOST_64BIT_LONG
496 printf ("%5ld", vma
);
498 printf ("%#lx", vma
);
500 if (_bfd_int64_high (vma
))
502 printf ("++%ld", _bfd_int64_low (vma
));
503 else if (vma
<= 99999)
504 printf ("%5ld", _bfd_int64_low (vma
));
506 printf ("%#lx", _bfd_int64_low (vma
));
511 #if BFD_HOST_64BIT_LONG
514 if (_bfd_int64_high (vma
))
516 printf ("++%lu", _bfd_int64_low (vma
));
518 printf ("%lu", _bfd_int64_low (vma
));
526 /* Display a symbol on stdout. If do_wide is not true then
527 format the symbol to be at most WIDTH characters,
528 truncating as necessary. If WIDTH is negative then
529 format the string to be exactly - WIDTH characters,
530 truncating or padding as necessary. */
533 print_symbol (int width
, const char *symbol
)
536 printf ("%s", symbol
);
538 printf ("%-*.*s", width
, width
, symbol
);
540 printf ("%-.*s", width
, symbol
);
544 byte_get_big_endian (unsigned char *field
, int size
)
552 return ((unsigned int) (field
[1])) | (((int) (field
[0])) << 8);
555 return ((unsigned long) (field
[3]))
556 | (((unsigned long) (field
[2])) << 8)
557 | (((unsigned long) (field
[1])) << 16)
558 | (((unsigned long) (field
[0])) << 24);
562 /* Although we are extracing data from an 8 byte wide field, we
563 are returning only 4 bytes of data. */
564 return ((unsigned long) (field
[7]))
565 | (((unsigned long) (field
[6])) << 8)
566 | (((unsigned long) (field
[5])) << 16)
567 | (((unsigned long) (field
[4])) << 24);
571 /* This is a special case, generated by the BYTE_GET8 macro.
572 It means that we are loading an 8 byte value from a field
573 in an external structure into an 8 byte value in a field
574 in an internal structure. */
575 return ((bfd_vma
) (field
[7]))
576 | (((bfd_vma
) (field
[6])) << 8)
577 | (((bfd_vma
) (field
[5])) << 16)
578 | (((bfd_vma
) (field
[4])) << 24)
579 | (((bfd_vma
) (field
[3])) << 32)
580 | (((bfd_vma
) (field
[2])) << 40)
581 | (((bfd_vma
) (field
[1])) << 48)
582 | (((bfd_vma
) (field
[0])) << 56);
586 error (_("Unhandled data length: %d\n"), size
);
592 byte_put_big_endian (unsigned char *field
, bfd_vma value
, int size
)
597 field
[7] = value
& 0xff;
598 field
[6] = (value
>> 8) & 0xff;
599 field
[5] = (value
>> 16) & 0xff;
600 field
[4] = (value
>> 24) & 0xff;
605 field
[3] = value
& 0xff;
606 field
[2] = (value
>> 8) & 0xff;
610 field
[1] = value
& 0xff;
614 field
[0] = value
& 0xff;
618 error (_("Unhandled data length: %d\n"), size
);
623 /* Guess the relocation size commonly used by the specific machines. */
626 guess_is_rela (unsigned long e_machine
)
630 /* Targets that use REL relocations. */
645 /* Targets that use RELA relocations. */
660 case EM_CYGNUS_MN10200
:
662 case EM_CYGNUS_MN10300
:
708 warn (_("Don't know about relocations on this machine architecture\n"));
714 slurp_rela_relocs (FILE *file
,
715 unsigned long rel_offset
,
716 unsigned long rel_size
,
717 Elf_Internal_Rela
**relasp
,
718 unsigned long *nrelasp
)
720 Elf_Internal_Rela
*relas
;
721 unsigned long nrelas
;
726 Elf32_External_Rela
*erelas
;
728 erelas
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
732 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
734 relas
= malloc (nrelas
* sizeof (Elf_Internal_Rela
));
738 error(_("out of memory parsing relocs"));
742 for (i
= 0; i
< nrelas
; i
++)
744 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
745 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
746 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
753 Elf64_External_Rela
*erelas
;
755 erelas
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
759 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
761 relas
= malloc (nrelas
* sizeof (Elf_Internal_Rela
));
765 error(_("out of memory parsing relocs"));
769 for (i
= 0; i
< nrelas
; i
++)
771 relas
[i
].r_offset
= BYTE_GET8 (erelas
[i
].r_offset
);
772 relas
[i
].r_info
= BYTE_GET8 (erelas
[i
].r_info
);
773 relas
[i
].r_addend
= BYTE_GET8 (erelas
[i
].r_addend
);
784 slurp_rel_relocs (FILE *file
,
785 unsigned long rel_offset
,
786 unsigned long rel_size
,
787 Elf_Internal_Rela
**relsp
,
788 unsigned long *nrelsp
)
790 Elf_Internal_Rela
*rels
;
796 Elf32_External_Rel
*erels
;
798 erels
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
802 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
804 rels
= malloc (nrels
* sizeof (Elf_Internal_Rela
));
808 error(_("out of memory parsing relocs"));
812 for (i
= 0; i
< nrels
; i
++)
814 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
815 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
816 rels
[i
].r_addend
= 0;
823 Elf64_External_Rel
*erels
;
825 erels
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
829 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
831 rels
= malloc (nrels
* sizeof (Elf_Internal_Rela
));
835 error(_("out of memory parsing relocs"));
839 for (i
= 0; i
< nrels
; i
++)
841 rels
[i
].r_offset
= BYTE_GET8 (erels
[i
].r_offset
);
842 rels
[i
].r_info
= BYTE_GET8 (erels
[i
].r_info
);
843 rels
[i
].r_addend
= 0;
853 /* Display the contents of the relocation data found at the specified
857 dump_relocations (FILE *file
,
858 unsigned long rel_offset
,
859 unsigned long rel_size
,
860 Elf_Internal_Sym
*symtab
,
866 Elf_Internal_Rela
*rels
;
869 if (is_rela
== UNKNOWN
)
870 is_rela
= guess_is_rela (elf_header
.e_machine
);
874 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
879 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
888 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
890 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
895 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
897 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
905 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
907 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
912 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
914 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
918 for (i
= 0; i
< rel_size
; i
++)
921 const char *rtype2
= NULL
;
922 const char *rtype3
= NULL
;
925 bfd_vma symtab_index
;
930 offset
= rels
[i
].r_offset
;
931 info
= rels
[i
].r_info
;
935 type
= ELF32_R_TYPE (info
);
936 symtab_index
= ELF32_R_SYM (info
);
940 /* The #ifdef BFD64 below is to prevent a compile time warning.
941 We know that if we do not have a 64 bit data type that we
942 will never execute this code anyway. */
944 if (elf_header
.e_machine
== EM_MIPS
)
946 /* In little-endian objects, r_info isn't really a 64-bit
947 little-endian value: it has a 32-bit little-endian
948 symbol index followed by four individual byte fields.
949 Reorder INFO accordingly. */
950 if (elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
951 info
= (((info
& 0xffffffff) << 32)
952 | ((info
>> 56) & 0xff)
953 | ((info
>> 40) & 0xff00)
954 | ((info
>> 24) & 0xff0000)
955 | ((info
>> 8) & 0xff000000));
956 type
= ELF64_MIPS_R_TYPE (info
);
957 type2
= ELF64_MIPS_R_TYPE2 (info
);
958 type3
= ELF64_MIPS_R_TYPE3 (info
);
960 else if (elf_header
.e_machine
== EM_SPARCV9
)
961 type
= ELF64_R_TYPE_ID (info
);
963 type
= ELF64_R_TYPE (info
);
965 symtab_index
= ELF64_R_SYM (info
);
971 #ifdef _bfd_int64_low
972 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
974 printf ("%8.8lx %8.8lx ", offset
, info
);
979 #ifdef _bfd_int64_low
981 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
982 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
983 _bfd_int64_high (offset
),
984 _bfd_int64_low (offset
),
985 _bfd_int64_high (info
),
986 _bfd_int64_low (info
));
989 ? "%16.16lx %16.16lx "
990 : "%12.12lx %12.12lx ",
995 switch (elf_header
.e_machine
)
1002 case EM_CYGNUS_M32R
:
1003 rtype
= elf_m32r_reloc_type (type
);
1008 rtype
= elf_i386_reloc_type (type
);
1013 rtype
= elf_m68hc11_reloc_type (type
);
1017 rtype
= elf_m68k_reloc_type (type
);
1021 rtype
= elf_i960_reloc_type (type
);
1026 rtype
= elf_avr_reloc_type (type
);
1029 case EM_OLD_SPARCV9
:
1030 case EM_SPARC32PLUS
:
1033 rtype
= elf_sparc_reloc_type (type
);
1037 case EM_CYGNUS_V850
:
1038 rtype
= v850_reloc_type (type
);
1042 case EM_CYGNUS_D10V
:
1043 rtype
= elf_d10v_reloc_type (type
);
1047 case EM_CYGNUS_D30V
:
1048 rtype
= elf_d30v_reloc_type (type
);
1052 rtype
= elf_dlx_reloc_type (type
);
1056 rtype
= elf_sh_reloc_type (type
);
1060 case EM_CYGNUS_MN10300
:
1061 rtype
= elf_mn10300_reloc_type (type
);
1065 case EM_CYGNUS_MN10200
:
1066 rtype
= elf_mn10200_reloc_type (type
);
1070 case EM_CYGNUS_FR30
:
1071 rtype
= elf_fr30_reloc_type (type
);
1075 rtype
= elf_frv_reloc_type (type
);
1079 rtype
= elf_mcore_reloc_type (type
);
1083 rtype
= elf_mmix_reloc_type (type
);
1088 rtype
= elf_msp430_reloc_type (type
);
1092 rtype
= elf_ppc_reloc_type (type
);
1096 rtype
= elf_ppc64_reloc_type (type
);
1100 case EM_MIPS_RS3_LE
:
1101 rtype
= elf_mips_reloc_type (type
);
1104 rtype2
= elf_mips_reloc_type (type2
);
1105 rtype3
= elf_mips_reloc_type (type3
);
1110 rtype
= elf_alpha_reloc_type (type
);
1114 rtype
= elf_arm_reloc_type (type
);
1118 rtype
= elf_arc_reloc_type (type
);
1122 rtype
= elf_hppa_reloc_type (type
);
1128 rtype
= elf_h8_reloc_type (type
);
1133 rtype
= elf_or32_reloc_type (type
);
1138 rtype
= elf_pj_reloc_type (type
);
1141 rtype
= elf_ia64_reloc_type (type
);
1145 rtype
= elf_cris_reloc_type (type
);
1149 rtype
= elf_i860_reloc_type (type
);
1153 rtype
= elf_x86_64_reloc_type (type
);
1157 rtype
= i370_reloc_type (type
);
1162 rtype
= elf_s390_reloc_type (type
);
1166 rtype
= elf_xstormy16_reloc_type (type
);
1170 rtype
= elf_vax_reloc_type (type
);
1175 rtype
= elf_ip2k_reloc_type (type
);
1179 rtype
= elf_iq2000_reloc_type (type
);
1184 rtype
= elf_xtensa_reloc_type (type
);
1189 #ifdef _bfd_int64_low
1190 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type
));
1192 printf (_("unrecognized: %-7lx"), type
);
1195 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1199 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1200 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1203 Elf_Internal_Sym
*psym
;
1205 psym
= symtab
+ symtab_index
;
1208 print_vma (psym
->st_value
, LONG_HEX
);
1209 printf (is_32bit_elf
? " " : " ");
1211 if (psym
->st_name
== 0)
1213 const char *sec_name
= "<null>";
1216 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1218 bfd_vma sec_index
= (bfd_vma
) -1;
1220 if (psym
->st_shndx
< SHN_LORESERVE
)
1221 sec_index
= psym
->st_shndx
;
1222 else if (psym
->st_shndx
> SHN_LORESERVE
)
1223 sec_index
= psym
->st_shndx
- (SHN_HIRESERVE
+ 1
1226 if (sec_index
!= (bfd_vma
) -1)
1227 sec_name
= SECTION_NAME (section_headers
+ sec_index
);
1228 else if (psym
->st_shndx
== SHN_ABS
)
1230 else if (psym
->st_shndx
== SHN_COMMON
)
1231 sec_name
= "COMMON";
1232 else if (elf_header
.e_machine
== EM_IA_64
1233 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1234 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1235 sec_name
= "ANSI_COM";
1238 sprintf (name_buf
, "<section 0x%x>",
1239 (unsigned int) psym
->st_shndx
);
1240 sec_name
= name_buf
;
1243 print_symbol (22, sec_name
);
1245 else if (strtab
== NULL
)
1246 printf (_("<string table index %3ld>"), psym
->st_name
);
1248 print_symbol (22, strtab
+ psym
->st_name
);
1251 printf (" + %lx", (unsigned long) rels
[i
].r_addend
);
1256 printf ("%*c", is_32bit_elf
? (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1257 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1260 if (elf_header
.e_machine
== EM_SPARCV9
1261 && !strcmp (rtype
, "R_SPARC_OLO10"))
1262 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1266 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1268 printf (" Type2: ");
1271 #ifdef _bfd_int64_low
1272 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2
));
1274 printf (_("unrecognized: %-7lx"), type2
);
1277 printf ("%-17.17s", rtype2
);
1279 printf("\n Type3: ");
1282 #ifdef _bfd_int64_low
1283 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3
));
1285 printf (_("unrecognized: %-7lx"), type3
);
1288 printf ("%-17.17s", rtype3
);
1300 get_mips_dynamic_type (unsigned long type
)
1304 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1305 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1306 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1307 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1308 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1309 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1310 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1311 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1312 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1313 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1314 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1315 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1316 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1317 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1318 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1319 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1320 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1321 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1322 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1323 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1324 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1325 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1326 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1327 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1328 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1329 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1330 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1331 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1332 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1333 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1334 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1335 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1336 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1337 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1338 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1339 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1340 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1341 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1342 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1343 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1344 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1345 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1346 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1353 get_sparc64_dynamic_type (unsigned long type
)
1357 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1364 get_ppc64_dynamic_type (unsigned long type
)
1368 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1369 case DT_PPC64_OPD
: return "PPC64_OPD";
1370 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1377 get_parisc_dynamic_type (unsigned long type
)
1381 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1382 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1383 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1384 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1385 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1386 case DT_HP_PREINIT
: return "HP_PREINIT";
1387 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1388 case DT_HP_NEEDED
: return "HP_NEEDED";
1389 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1390 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1391 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1392 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1393 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1400 get_ia64_dynamic_type (unsigned long type
)
1404 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1411 get_dynamic_type (unsigned long type
)
1413 static char buff
[32];
1417 case DT_NULL
: return "NULL";
1418 case DT_NEEDED
: return "NEEDED";
1419 case DT_PLTRELSZ
: return "PLTRELSZ";
1420 case DT_PLTGOT
: return "PLTGOT";
1421 case DT_HASH
: return "HASH";
1422 case DT_STRTAB
: return "STRTAB";
1423 case DT_SYMTAB
: return "SYMTAB";
1424 case DT_RELA
: return "RELA";
1425 case DT_RELASZ
: return "RELASZ";
1426 case DT_RELAENT
: return "RELAENT";
1427 case DT_STRSZ
: return "STRSZ";
1428 case DT_SYMENT
: return "SYMENT";
1429 case DT_INIT
: return "INIT";
1430 case DT_FINI
: return "FINI";
1431 case DT_SONAME
: return "SONAME";
1432 case DT_RPATH
: return "RPATH";
1433 case DT_SYMBOLIC
: return "SYMBOLIC";
1434 case DT_REL
: return "REL";
1435 case DT_RELSZ
: return "RELSZ";
1436 case DT_RELENT
: return "RELENT";
1437 case DT_PLTREL
: return "PLTREL";
1438 case DT_DEBUG
: return "DEBUG";
1439 case DT_TEXTREL
: return "TEXTREL";
1440 case DT_JMPREL
: return "JMPREL";
1441 case DT_BIND_NOW
: return "BIND_NOW";
1442 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1443 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1444 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1445 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1446 case DT_RUNPATH
: return "RUNPATH";
1447 case DT_FLAGS
: return "FLAGS";
1449 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1450 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1452 case DT_CHECKSUM
: return "CHECKSUM";
1453 case DT_PLTPADSZ
: return "PLTPADSZ";
1454 case DT_MOVEENT
: return "MOVEENT";
1455 case DT_MOVESZ
: return "MOVESZ";
1456 case DT_FEATURE
: return "FEATURE";
1457 case DT_POSFLAG_1
: return "POSFLAG_1";
1458 case DT_SYMINSZ
: return "SYMINSZ";
1459 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1461 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1462 case DT_CONFIG
: return "CONFIG";
1463 case DT_DEPAUDIT
: return "DEPAUDIT";
1464 case DT_AUDIT
: return "AUDIT";
1465 case DT_PLTPAD
: return "PLTPAD";
1466 case DT_MOVETAB
: return "MOVETAB";
1467 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1469 case DT_VERSYM
: return "VERSYM";
1471 case DT_RELACOUNT
: return "RELACOUNT";
1472 case DT_RELCOUNT
: return "RELCOUNT";
1473 case DT_FLAGS_1
: return "FLAGS_1";
1474 case DT_VERDEF
: return "VERDEF";
1475 case DT_VERDEFNUM
: return "VERDEFNUM";
1476 case DT_VERNEED
: return "VERNEED";
1477 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1479 case DT_AUXILIARY
: return "AUXILIARY";
1480 case DT_USED
: return "USED";
1481 case DT_FILTER
: return "FILTER";
1483 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1484 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1485 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1486 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1487 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1490 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1494 switch (elf_header
.e_machine
)
1497 case EM_MIPS_RS3_LE
:
1498 result
= get_mips_dynamic_type (type
);
1501 result
= get_sparc64_dynamic_type (type
);
1504 result
= get_ppc64_dynamic_type (type
);
1507 result
= get_ia64_dynamic_type (type
);
1517 sprintf (buff
, _("Processor Specific: %lx"), type
);
1519 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1523 switch (elf_header
.e_machine
)
1526 result
= get_parisc_dynamic_type (type
);
1536 sprintf (buff
, _("Operating System specific: %lx"), type
);
1539 sprintf (buff
, _("<unknown>: %lx"), type
);
1546 get_file_type (unsigned e_type
)
1548 static char buff
[32];
1552 case ET_NONE
: return _("NONE (None)");
1553 case ET_REL
: return _("REL (Relocatable file)");
1554 case ET_EXEC
: return _("EXEC (Executable file)");
1555 case ET_DYN
: return _("DYN (Shared object file)");
1556 case ET_CORE
: return _("CORE (Core file)");
1559 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1560 sprintf (buff
, _("Processor Specific: (%x)"), e_type
);
1561 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1562 sprintf (buff
, _("OS Specific: (%x)"), e_type
);
1564 sprintf (buff
, _("<unknown>: %x"), e_type
);
1570 get_machine_name (unsigned e_machine
)
1572 static char buff
[64]; /* XXX */
1576 case EM_NONE
: return _("None");
1577 case EM_M32
: return "WE32100";
1578 case EM_SPARC
: return "Sparc";
1579 case EM_386
: return "Intel 80386";
1580 case EM_68K
: return "MC68000";
1581 case EM_88K
: return "MC88000";
1582 case EM_486
: return "Intel 80486";
1583 case EM_860
: return "Intel 80860";
1584 case EM_MIPS
: return "MIPS R3000";
1585 case EM_S370
: return "IBM System/370";
1586 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1587 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1588 case EM_PARISC
: return "HPPA";
1589 case EM_PPC_OLD
: return "Power PC (old)";
1590 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1591 case EM_960
: return "Intel 90860";
1592 case EM_PPC
: return "PowerPC";
1593 case EM_PPC64
: return "PowerPC64";
1594 case EM_V800
: return "NEC V800";
1595 case EM_FR20
: return "Fujitsu FR20";
1596 case EM_RH32
: return "TRW RH32";
1597 case EM_MCORE
: return "MCORE";
1598 case EM_ARM
: return "ARM";
1599 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1600 case EM_SH
: return "Renesas / SuperH SH";
1601 case EM_SPARCV9
: return "Sparc v9";
1602 case EM_TRICORE
: return "Siemens Tricore";
1603 case EM_ARC
: return "ARC";
1604 case EM_H8_300
: return "Renesas H8/300";
1605 case EM_H8_300H
: return "Renesas H8/300H";
1606 case EM_H8S
: return "Renesas H8S";
1607 case EM_H8_500
: return "Renesas H8/500";
1608 case EM_IA_64
: return "Intel IA-64";
1609 case EM_MIPS_X
: return "Stanford MIPS-X";
1610 case EM_COLDFIRE
: return "Motorola Coldfire";
1611 case EM_68HC12
: return "Motorola M68HC12";
1612 case EM_ALPHA
: return "Alpha";
1613 case EM_CYGNUS_D10V
:
1614 case EM_D10V
: return "d10v";
1615 case EM_CYGNUS_D30V
:
1616 case EM_D30V
: return "d30v";
1617 case EM_CYGNUS_M32R
:
1618 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
1619 case EM_CYGNUS_V850
:
1620 case EM_V850
: return "NEC v850";
1621 case EM_CYGNUS_MN10300
:
1622 case EM_MN10300
: return "mn10300";
1623 case EM_CYGNUS_MN10200
:
1624 case EM_MN10200
: return "mn10200";
1625 case EM_CYGNUS_FR30
:
1626 case EM_FR30
: return "Fujitsu FR30";
1627 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1629 case EM_PJ
: return "picoJava";
1630 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1631 case EM_PCP
: return "Siemens PCP";
1632 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1633 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1634 case EM_STARCORE
: return "Motorola Star*Core processor";
1635 case EM_ME16
: return "Toyota ME16 processor";
1636 case EM_ST100
: return "STMicroelectronics ST100 processor";
1637 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1638 case EM_FX66
: return "Siemens FX66 microcontroller";
1639 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1640 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1641 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1642 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1643 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1644 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1645 case EM_SVX
: return "Silicon Graphics SVx";
1646 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1647 case EM_VAX
: return "Digital VAX";
1649 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1650 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1651 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1652 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1653 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1654 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1655 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1656 case EM_PRISM
: return "Vitesse Prism";
1657 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1659 case EM_S390
: return "IBM S/390";
1660 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1662 case EM_OR32
: return "OpenRISC";
1663 case EM_DLX
: return "OpenDLX";
1665 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1666 case EM_IQ2000
: return "Vitesse IQ2000";
1668 case EM_XTENSA
: return "Tensilica Xtensa Processor";
1670 sprintf (buff
, _("<unknown>: %x"), e_machine
);
1676 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
1681 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1682 e_flags
&= ~ EF_ARM_EABIMASK
;
1684 /* Handle "generic" ARM flags. */
1685 if (e_flags
& EF_ARM_RELEXEC
)
1687 strcat (buf
, ", relocatable executable");
1688 e_flags
&= ~ EF_ARM_RELEXEC
;
1691 if (e_flags
& EF_ARM_HASENTRY
)
1693 strcat (buf
, ", has entry point");
1694 e_flags
&= ~ EF_ARM_HASENTRY
;
1697 /* Now handle EABI specific flags. */
1701 strcat (buf
, ", <unrecognized EABI>");
1706 case EF_ARM_EABI_VER1
:
1707 strcat (buf
, ", Version1 EABI");
1712 /* Process flags one bit at a time. */
1713 flag
= e_flags
& - e_flags
;
1718 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1719 strcat (buf
, ", sorted symbol tables");
1729 case EF_ARM_EABI_VER2
:
1730 strcat (buf
, ", Version2 EABI");
1735 /* Process flags one bit at a time. */
1736 flag
= e_flags
& - e_flags
;
1741 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1742 strcat (buf
, ", sorted symbol tables");
1745 case EF_ARM_DYNSYMSUSESEGIDX
:
1746 strcat (buf
, ", dynamic symbols use segment index");
1749 case EF_ARM_MAPSYMSFIRST
:
1750 strcat (buf
, ", mapping symbols precede others");
1760 case EF_ARM_EABI_VER3
:
1761 strcat (buf
, ", Version3 EABI");
1766 /* Process flags one bit at a time. */
1767 flag
= e_flags
& - e_flags
;
1773 strcat (buf
, ", BE8");
1777 strcat (buf
, ", LE8");
1787 case EF_ARM_EABI_UNKNOWN
:
1788 strcat (buf
, ", GNU EABI");
1793 /* Process flags one bit at a time. */
1794 flag
= e_flags
& - e_flags
;
1799 case EF_ARM_INTERWORK
:
1800 strcat (buf
, ", interworking enabled");
1803 case EF_ARM_APCS_26
:
1804 strcat (buf
, ", uses APCS/26");
1807 case EF_ARM_APCS_FLOAT
:
1808 strcat (buf
, ", uses APCS/float");
1812 strcat (buf
, ", position independent");
1816 strcat (buf
, ", 8 bit structure alignment");
1819 case EF_ARM_NEW_ABI
:
1820 strcat (buf
, ", uses new ABI");
1823 case EF_ARM_OLD_ABI
:
1824 strcat (buf
, ", uses old ABI");
1827 case EF_ARM_SOFT_FLOAT
:
1828 strcat (buf
, ", software FP");
1831 case EF_ARM_VFP_FLOAT
:
1832 strcat (buf
, ", VFP");
1835 case EF_ARM_MAVERICK_FLOAT
:
1836 strcat (buf
, ", Maverick FP");
1847 strcat (buf
,", <unknown>");
1851 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
1853 static char buf
[1024];
1865 decode_ARM_machine_flags (e_flags
, buf
);
1869 if (e_flags
& EF_CPU32
)
1870 strcat (buf
, ", cpu32");
1871 if (e_flags
& EF_M68000
)
1872 strcat (buf
, ", m68000");
1876 if (e_flags
& EF_PPC_EMB
)
1877 strcat (buf
, ", emb");
1879 if (e_flags
& EF_PPC_RELOCATABLE
)
1880 strcat (buf
, ", relocatable");
1882 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
1883 strcat (buf
, ", relocatable-lib");
1887 case EM_CYGNUS_V850
:
1888 switch (e_flags
& EF_V850_ARCH
)
1891 strcat (buf
, ", v850e1");
1894 strcat (buf
, ", v850e");
1897 strcat (buf
, ", v850");
1900 strcat (buf
, ", unknown v850 architecture variant");
1906 case EM_CYGNUS_M32R
:
1907 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
1908 strcat (buf
, ", m32r");
1913 case EM_MIPS_RS3_LE
:
1914 if (e_flags
& EF_MIPS_NOREORDER
)
1915 strcat (buf
, ", noreorder");
1917 if (e_flags
& EF_MIPS_PIC
)
1918 strcat (buf
, ", pic");
1920 if (e_flags
& EF_MIPS_CPIC
)
1921 strcat (buf
, ", cpic");
1923 if (e_flags
& EF_MIPS_UCODE
)
1924 strcat (buf
, ", ugen_reserved");
1926 if (e_flags
& EF_MIPS_ABI2
)
1927 strcat (buf
, ", abi2");
1929 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
1930 strcat (buf
, ", odk first");
1932 if (e_flags
& EF_MIPS_32BITMODE
)
1933 strcat (buf
, ", 32bitmode");
1935 switch ((e_flags
& EF_MIPS_MACH
))
1937 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
1938 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
1939 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
1940 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
1941 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
1942 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
1943 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
1944 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
1945 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
1947 /* We simply ignore the field in this case to avoid confusion:
1948 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
1951 default: strcat (buf
, ", unknown CPU"); break;
1954 switch ((e_flags
& EF_MIPS_ABI
))
1956 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
1957 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
1958 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
1959 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
1961 /* We simply ignore the field in this case to avoid confusion:
1962 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
1963 This means it is likely to be an o32 file, but not for
1966 default: strcat (buf
, ", unknown ABI"); break;
1969 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
1970 strcat (buf
, ", mdmx");
1972 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
1973 strcat (buf
, ", mips16");
1975 switch ((e_flags
& EF_MIPS_ARCH
))
1977 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
1978 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
1979 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
1980 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
1981 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
1982 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
1983 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
1984 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
1985 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
1986 default: strcat (buf
, ", unknown ISA"); break;
1992 if (e_flags
& EF_SPARC_32PLUS
)
1993 strcat (buf
, ", v8+");
1995 if (e_flags
& EF_SPARC_SUN_US1
)
1996 strcat (buf
, ", ultrasparcI");
1998 if (e_flags
& EF_SPARC_SUN_US3
)
1999 strcat (buf
, ", ultrasparcIII");
2001 if (e_flags
& EF_SPARC_HAL_R1
)
2002 strcat (buf
, ", halr1");
2004 if (e_flags
& EF_SPARC_LEDATA
)
2005 strcat (buf
, ", ledata");
2007 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2008 strcat (buf
, ", tso");
2010 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2011 strcat (buf
, ", pso");
2013 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2014 strcat (buf
, ", rmo");
2018 switch (e_flags
& EF_PARISC_ARCH
)
2020 case EFA_PARISC_1_0
:
2021 strcpy (buf
, ", PA-RISC 1.0");
2023 case EFA_PARISC_1_1
:
2024 strcpy (buf
, ", PA-RISC 1.1");
2026 case EFA_PARISC_2_0
:
2027 strcpy (buf
, ", PA-RISC 2.0");
2032 if (e_flags
& EF_PARISC_TRAPNIL
)
2033 strcat (buf
, ", trapnil");
2034 if (e_flags
& EF_PARISC_EXT
)
2035 strcat (buf
, ", ext");
2036 if (e_flags
& EF_PARISC_LSB
)
2037 strcat (buf
, ", lsb");
2038 if (e_flags
& EF_PARISC_WIDE
)
2039 strcat (buf
, ", wide");
2040 if (e_flags
& EF_PARISC_NO_KABP
)
2041 strcat (buf
, ", no kabp");
2042 if (e_flags
& EF_PARISC_LAZYSWAP
)
2043 strcat (buf
, ", lazyswap");
2048 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2049 strcat (buf
, ", new calling convention");
2051 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2052 strcat (buf
, ", gnu calling convention");
2056 if ((e_flags
& EF_IA_64_ABI64
))
2057 strcat (buf
, ", 64-bit");
2059 strcat (buf
, ", 32-bit");
2060 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2061 strcat (buf
, ", reduced fp model");
2062 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2063 strcat (buf
, ", no function descriptors, constant gp");
2064 else if ((e_flags
& EF_IA_64_CONS_GP
))
2065 strcat (buf
, ", constant gp");
2066 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2067 strcat (buf
, ", absolute");
2071 if ((e_flags
& EF_VAX_NONPIC
))
2072 strcat (buf
, ", non-PIC");
2073 if ((e_flags
& EF_VAX_DFLOAT
))
2074 strcat (buf
, ", D-Float");
2075 if ((e_flags
& EF_VAX_GFLOAT
))
2076 strcat (buf
, ", G-Float");
2085 get_osabi_name (unsigned int osabi
)
2087 static char buff
[32];
2091 case ELFOSABI_NONE
: return "UNIX - System V";
2092 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2093 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2094 case ELFOSABI_LINUX
: return "UNIX - Linux";
2095 case ELFOSABI_HURD
: return "GNU/Hurd";
2096 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2097 case ELFOSABI_AIX
: return "UNIX - AIX";
2098 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2099 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2100 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2101 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2102 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2103 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2104 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2105 case ELFOSABI_AROS
: return "Amiga Research OS";
2106 case ELFOSABI_STANDALONE
: return _("Standalone App");
2107 case ELFOSABI_ARM
: return "ARM";
2109 sprintf (buff
, _("<unknown: %x>"), osabi
);
2115 get_mips_segment_type (unsigned long type
)
2119 case PT_MIPS_REGINFO
:
2121 case PT_MIPS_RTPROC
:
2123 case PT_MIPS_OPTIONS
:
2133 get_parisc_segment_type (unsigned long type
)
2137 case PT_HP_TLS
: return "HP_TLS";
2138 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2139 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2140 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2141 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2142 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2143 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2144 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2145 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2146 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2147 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2148 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2149 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2150 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2159 get_ia64_segment_type (unsigned long type
)
2163 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2164 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2165 case PT_HP_TLS
: return "HP_TLS";
2166 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2167 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2168 case PT_IA_64_HP_STACK
: return "HP_STACK";
2177 get_segment_type (unsigned long p_type
)
2179 static char buff
[32];
2183 case PT_NULL
: return "NULL";
2184 case PT_LOAD
: return "LOAD";
2185 case PT_DYNAMIC
: return "DYNAMIC";
2186 case PT_INTERP
: return "INTERP";
2187 case PT_NOTE
: return "NOTE";
2188 case PT_SHLIB
: return "SHLIB";
2189 case PT_PHDR
: return "PHDR";
2190 case PT_TLS
: return "TLS";
2192 case PT_GNU_EH_FRAME
:
2193 return "GNU_EH_FRAME";
2194 case PT_GNU_STACK
: return "GNU_STACK";
2195 case PT_GNU_RELRO
: return "GNU_RELRO";
2198 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2202 switch (elf_header
.e_machine
)
2205 case EM_MIPS_RS3_LE
:
2206 result
= get_mips_segment_type (p_type
);
2209 result
= get_parisc_segment_type (p_type
);
2212 result
= get_ia64_segment_type (p_type
);
2222 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2224 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2228 switch (elf_header
.e_machine
)
2231 result
= get_parisc_segment_type (p_type
);
2234 result
= get_ia64_segment_type (p_type
);
2244 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2247 sprintf (buff
, _("<unknown>: %lx"), p_type
);
2254 get_mips_section_type_name (unsigned int sh_type
)
2258 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2259 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2260 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2261 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2262 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2263 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2264 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2265 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2266 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2267 case SHT_MIPS_RELD
: return "MIPS_RELD";
2268 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2269 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2270 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2271 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2272 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2273 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2274 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2275 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2276 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2277 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2278 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2279 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2280 case SHT_MIPS_LINE
: return "MIPS_LINE";
2281 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2282 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2283 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2284 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2285 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2286 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2287 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2288 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2289 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2290 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2291 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2292 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2293 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2294 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2295 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2296 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2304 get_parisc_section_type_name (unsigned int sh_type
)
2308 case SHT_PARISC_EXT
: return "PARISC_EXT";
2309 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2310 case SHT_PARISC_DOC
: return "PARISC_DOC";
2318 get_ia64_section_type_name (unsigned int sh_type
)
2320 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2321 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2322 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2326 case SHT_IA_64_EXT
: return "IA_64_EXT";
2327 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2328 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2336 get_section_type_name (unsigned int sh_type
)
2338 static char buff
[32];
2342 case SHT_NULL
: return "NULL";
2343 case SHT_PROGBITS
: return "PROGBITS";
2344 case SHT_SYMTAB
: return "SYMTAB";
2345 case SHT_STRTAB
: return "STRTAB";
2346 case SHT_RELA
: return "RELA";
2347 case SHT_HASH
: return "HASH";
2348 case SHT_DYNAMIC
: return "DYNAMIC";
2349 case SHT_NOTE
: return "NOTE";
2350 case SHT_NOBITS
: return "NOBITS";
2351 case SHT_REL
: return "REL";
2352 case SHT_SHLIB
: return "SHLIB";
2353 case SHT_DYNSYM
: return "DYNSYM";
2354 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2355 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2356 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2357 case SHT_GROUP
: return "GROUP";
2358 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2359 case SHT_GNU_verdef
: return "VERDEF";
2360 case SHT_GNU_verneed
: return "VERNEED";
2361 case SHT_GNU_versym
: return "VERSYM";
2362 case 0x6ffffff0: return "VERSYM";
2363 case 0x6ffffffc: return "VERDEF";
2364 case 0x7ffffffd: return "AUXILIARY";
2365 case 0x7fffffff: return "FILTER";
2366 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2369 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2373 switch (elf_header
.e_machine
)
2376 case EM_MIPS_RS3_LE
:
2377 result
= get_mips_section_type_name (sh_type
);
2380 result
= get_parisc_section_type_name (sh_type
);
2383 result
= get_ia64_section_type_name (sh_type
);
2393 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2395 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2396 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2397 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2398 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2400 sprintf (buff
, _("<unknown>: %x"), sh_type
);
2406 #define OPTION_DEBUG_DUMP 512
2408 struct option options
[] =
2410 {"all", no_argument
, 0, 'a'},
2411 {"file-header", no_argument
, 0, 'h'},
2412 {"program-headers", no_argument
, 0, 'l'},
2413 {"headers", no_argument
, 0, 'e'},
2414 {"histogram", no_argument
, 0, 'I'},
2415 {"segments", no_argument
, 0, 'l'},
2416 {"sections", no_argument
, 0, 'S'},
2417 {"section-headers", no_argument
, 0, 'S'},
2418 {"section-groups", no_argument
, 0, 'g'},
2419 {"symbols", no_argument
, 0, 's'},
2420 {"syms", no_argument
, 0, 's'},
2421 {"relocs", no_argument
, 0, 'r'},
2422 {"notes", no_argument
, 0, 'n'},
2423 {"dynamic", no_argument
, 0, 'd'},
2424 {"arch-specific", no_argument
, 0, 'A'},
2425 {"version-info", no_argument
, 0, 'V'},
2426 {"use-dynamic", no_argument
, 0, 'D'},
2427 {"hex-dump", required_argument
, 0, 'x'},
2428 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2429 {"unwind", no_argument
, 0, 'u'},
2430 #ifdef SUPPORT_DISASSEMBLY
2431 {"instruction-dump", required_argument
, 0, 'i'},
2434 {"version", no_argument
, 0, 'v'},
2435 {"wide", no_argument
, 0, 'W'},
2436 {"help", no_argument
, 0, 'H'},
2437 {0, no_argument
, 0, 0}
2443 fprintf (stdout
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2444 fprintf (stdout
, _(" Display information about the contents of ELF format files\n"));
2445 fprintf (stdout
, _(" Options are:\n\
2446 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2447 -h --file-header Display the ELF file header\n\
2448 -l --program-headers Display the program headers\n\
2449 --segments An alias for --program-headers\n\
2450 -S --section-headers Display the sections' header\n\
2451 --sections An alias for --section-headers\n\
2452 -g --section-groups Display the section groups\n\
2453 -e --headers Equivalent to: -h -l -S\n\
2454 -s --syms Display the symbol table\n\
2455 --symbols An alias for --syms\n\
2456 -n --notes Display the core notes (if present)\n\
2457 -r --relocs Display the relocations (if present)\n\
2458 -u --unwind Display the unwind info (if present)\n\
2459 -d --dynamic Display the dynamic section (if present)\n\
2460 -V --version-info Display the version sections (if present)\n\
2461 -A --arch-specific Display architecture specific information (if any).\n\
2462 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2463 -x --hex-dump=<number> Dump the contents of section <number>\n\
2464 -w[liaprmfFso] or\n\
2465 --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]\n\
2466 Display the contents of DWARF2 debug sections\n"));
2467 #ifdef SUPPORT_DISASSEMBLY
2468 fprintf (stdout
, _("\
2469 -i --instruction-dump=<number>\n\
2470 Disassemble the contents of section <number>\n"));
2472 fprintf (stdout
, _("\
2473 -I --histogram Display histogram of bucket list lengths\n\
2474 -W --wide Allow output width to exceed 80 characters\n\
2475 -H --help Display this information\n\
2476 -v --version Display the version number of readelf\n"));
2477 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2483 request_dump (unsigned int section
, int type
)
2485 if (section
>= num_dump_sects
)
2487 char *new_dump_sects
;
2489 new_dump_sects
= calloc (section
+ 1, 1);
2491 if (new_dump_sects
== NULL
)
2492 error (_("Out of memory allocating dump request table."));
2495 /* Copy current flag settings. */
2496 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2500 dump_sects
= new_dump_sects
;
2501 num_dump_sects
= section
+ 1;
2506 dump_sects
[section
] |= type
;
2512 parse_args (int argc
, char **argv
)
2519 while ((c
= getopt_long
2520 (argc
, argv
, "ersuahnldSDAIgw::x:i:vVWH", options
, NULL
)) != EOF
)
2541 do_section_groups
++;
2549 do_section_groups
++;
2591 section
= strtoul (optarg
, & cp
, 0);
2592 if (! *cp
&& section
>= 0)
2594 request_dump (section
, HEX_DUMP
);
2604 unsigned int index
= 0;
2608 while (optarg
[index
])
2609 switch (optarg
[index
++])
2618 do_debug_abbrevs
= 1;
2628 do_debug_pubnames
= 1;
2633 do_debug_aranges
= 1;
2637 do_debug_frames_interp
= 1;
2639 do_debug_frames
= 1;
2644 do_debug_macinfo
= 1;
2658 warn (_("Unrecognized debug option '%s'\n"), optarg
);
2663 case OPTION_DEBUG_DUMP
:
2669 static const char *debug_dump_opt
[]
2670 = { "line", "info", "abbrev", "pubnames", "ranges",
2671 "macro", "frames", "frames-interp", "str", "loc", NULL
};
2680 for (index
= 0; debug_dump_opt
[index
]; index
++)
2682 size_t len
= strlen (debug_dump_opt
[index
]);
2684 if (strncmp (p
, debug_dump_opt
[index
], len
) == 0
2685 && (p
[len
] == ',' || p
[len
] == '\0'))
2694 do_debug_abbrevs
= 1;
2705 do_debug_pubnames
= 1;
2709 do_debug_aranges
= 1;
2714 do_debug_frames_interp
= 1;
2715 do_debug_frames
= 1;
2719 do_debug_macinfo
= 1;
2732 if (debug_dump_opt
[index
] == NULL
)
2734 warn (_("Unrecognized debug option '%s'\n"), p
);
2735 p
= strchr (p
, ',');
2745 #ifdef SUPPORT_DISASSEMBLY
2748 section
= strtoul (optarg
, & cp
, 0);
2749 if (! *cp
&& section
>= 0)
2751 request_dump (section
, DISASS_DUMP
);
2757 print_version (program_name
);
2767 /* xgettext:c-format */
2768 error (_("Invalid option '-%c'\n"), c
);
2775 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
2776 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2777 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
2778 && !do_section_groups
)
2782 warn (_("Nothing to do.\n"));
2788 get_elf_class (unsigned int elf_class
)
2790 static char buff
[32];
2794 case ELFCLASSNONE
: return _("none");
2795 case ELFCLASS32
: return "ELF32";
2796 case ELFCLASS64
: return "ELF64";
2798 sprintf (buff
, _("<unknown: %x>"), elf_class
);
2804 get_data_encoding (unsigned int encoding
)
2806 static char buff
[32];
2810 case ELFDATANONE
: return _("none");
2811 case ELFDATA2LSB
: return _("2's complement, little endian");
2812 case ELFDATA2MSB
: return _("2's complement, big endian");
2814 sprintf (buff
, _("<unknown: %x>"), encoding
);
2819 /* Decode the data held in 'elf_header'. */
2822 process_file_header (void)
2824 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2825 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
2826 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
2827 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
2830 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2838 printf (_("ELF Header:\n"));
2839 printf (_(" Magic: "));
2840 for (i
= 0; i
< EI_NIDENT
; i
++)
2841 printf ("%2.2x ", elf_header
.e_ident
[i
]);
2843 printf (_(" Class: %s\n"),
2844 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
2845 printf (_(" Data: %s\n"),
2846 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
2847 printf (_(" Version: %d %s\n"),
2848 elf_header
.e_ident
[EI_VERSION
],
2849 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
2851 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
2854 printf (_(" OS/ABI: %s\n"),
2855 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
2856 printf (_(" ABI Version: %d\n"),
2857 elf_header
.e_ident
[EI_ABIVERSION
]);
2858 printf (_(" Type: %s\n"),
2859 get_file_type (elf_header
.e_type
));
2860 printf (_(" Machine: %s\n"),
2861 get_machine_name (elf_header
.e_machine
));
2862 printf (_(" Version: 0x%lx\n"),
2863 (unsigned long) elf_header
.e_version
);
2865 printf (_(" Entry point address: "));
2866 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2867 printf (_("\n Start of program headers: "));
2868 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2869 printf (_(" (bytes into file)\n Start of section headers: "));
2870 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
2871 printf (_(" (bytes into file)\n"));
2873 printf (_(" Flags: 0x%lx%s\n"),
2874 (unsigned long) elf_header
.e_flags
,
2875 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
2876 printf (_(" Size of this header: %ld (bytes)\n"),
2877 (long) elf_header
.e_ehsize
);
2878 printf (_(" Size of program headers: %ld (bytes)\n"),
2879 (long) elf_header
.e_phentsize
);
2880 printf (_(" Number of program headers: %ld\n"),
2881 (long) elf_header
.e_phnum
);
2882 printf (_(" Size of section headers: %ld (bytes)\n"),
2883 (long) elf_header
.e_shentsize
);
2884 printf (_(" Number of section headers: %ld"),
2885 (long) elf_header
.e_shnum
);
2886 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
2887 printf (" (%ld)", (long) section_headers
[0].sh_size
);
2888 putc ('\n', stdout
);
2889 printf (_(" Section header string table index: %ld"),
2890 (long) elf_header
.e_shstrndx
);
2891 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
2892 printf (" (%ld)", (long) section_headers
[0].sh_link
);
2893 putc ('\n', stdout
);
2896 if (section_headers
!= NULL
)
2898 if (elf_header
.e_shnum
== 0)
2899 elf_header
.e_shnum
= section_headers
[0].sh_size
;
2900 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
2901 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
2902 free (section_headers
);
2903 section_headers
= NULL
;
2911 get_32bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
2913 Elf32_External_Phdr
*phdrs
;
2914 Elf32_External_Phdr
*external
;
2915 Elf_Internal_Phdr
*internal
;
2918 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
2919 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2920 _("program headers"));
2924 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2925 i
< elf_header
.e_phnum
;
2926 i
++, internal
++, external
++)
2928 internal
->p_type
= BYTE_GET (external
->p_type
);
2929 internal
->p_offset
= BYTE_GET (external
->p_offset
);
2930 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
2931 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
2932 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
2933 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
2934 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2935 internal
->p_align
= BYTE_GET (external
->p_align
);
2944 get_64bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
2946 Elf64_External_Phdr
*phdrs
;
2947 Elf64_External_Phdr
*external
;
2948 Elf_Internal_Phdr
*internal
;
2951 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
2952 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2953 _("program headers"));
2957 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2958 i
< elf_header
.e_phnum
;
2959 i
++, internal
++, external
++)
2961 internal
->p_type
= BYTE_GET (external
->p_type
);
2962 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2963 internal
->p_offset
= BYTE_GET8 (external
->p_offset
);
2964 internal
->p_vaddr
= BYTE_GET8 (external
->p_vaddr
);
2965 internal
->p_paddr
= BYTE_GET8 (external
->p_paddr
);
2966 internal
->p_filesz
= BYTE_GET8 (external
->p_filesz
);
2967 internal
->p_memsz
= BYTE_GET8 (external
->p_memsz
);
2968 internal
->p_align
= BYTE_GET8 (external
->p_align
);
2976 /* Returns 1 if the program headers were read into `program_headers'. */
2979 get_program_headers (FILE *file
)
2981 Elf_Internal_Phdr
*phdrs
;
2983 /* Check cache of prior read. */
2984 if (program_headers
!= NULL
)
2987 phdrs
= malloc (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
2991 error (_("Out of memory\n"));
2996 ? get_32bit_program_headers (file
, phdrs
)
2997 : get_64bit_program_headers (file
, phdrs
))
2999 program_headers
= phdrs
;
3007 /* Returns 1 if the program headers were loaded. */
3010 process_program_headers (FILE *file
)
3012 Elf_Internal_Phdr
*segment
;
3015 if (elf_header
.e_phnum
== 0)
3018 printf (_("\nThere are no program headers in this file.\n"));
3022 if (do_segments
&& !do_header
)
3024 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3025 printf (_("Entry point "));
3026 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3027 printf (_("\nThere are %d program headers, starting at offset "),
3028 elf_header
.e_phnum
);
3029 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3033 if (! get_program_headers (file
))
3038 if (elf_header
.e_phnum
> 1)
3039 printf (_("\nProgram Headers:\n"));
3041 printf (_("\nProgram Headers:\n"));
3045 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3048 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3052 (_(" Type Offset VirtAddr PhysAddr\n"));
3054 (_(" FileSiz MemSiz Flags Align\n"));
3061 for (i
= 0, segment
= program_headers
;
3062 i
< elf_header
.e_phnum
;
3067 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3071 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3072 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3073 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3074 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3075 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3077 (segment
->p_flags
& PF_R
? 'R' : ' '),
3078 (segment
->p_flags
& PF_W
? 'W' : ' '),
3079 (segment
->p_flags
& PF_X
? 'E' : ' '));
3080 printf ("%#lx", (unsigned long) segment
->p_align
);
3084 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3085 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3088 print_vma (segment
->p_offset
, FULL_HEX
);
3092 print_vma (segment
->p_vaddr
, FULL_HEX
);
3094 print_vma (segment
->p_paddr
, FULL_HEX
);
3097 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3098 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3101 print_vma (segment
->p_filesz
, FULL_HEX
);
3105 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3106 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3109 print_vma (segment
->p_offset
, FULL_HEX
);
3113 (segment
->p_flags
& PF_R
? 'R' : ' '),
3114 (segment
->p_flags
& PF_W
? 'W' : ' '),
3115 (segment
->p_flags
& PF_X
? 'E' : ' '));
3117 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3118 printf ("%#lx", (unsigned long) segment
->p_align
);
3121 print_vma (segment
->p_align
, PREFIX_HEX
);
3126 print_vma (segment
->p_offset
, FULL_HEX
);
3128 print_vma (segment
->p_vaddr
, FULL_HEX
);
3130 print_vma (segment
->p_paddr
, FULL_HEX
);
3132 print_vma (segment
->p_filesz
, FULL_HEX
);
3134 print_vma (segment
->p_memsz
, FULL_HEX
);
3136 (segment
->p_flags
& PF_R
? 'R' : ' '),
3137 (segment
->p_flags
& PF_W
? 'W' : ' '),
3138 (segment
->p_flags
& PF_X
? 'E' : ' '));
3139 print_vma (segment
->p_align
, HEX
);
3143 switch (segment
->p_type
)
3147 error (_("more than one dynamic segment\n"));
3149 /* Try to locate the .dynamic section. If there is
3150 a section header table, we can easily locate it. */
3151 if (section_headers
!= NULL
)
3153 Elf_Internal_Shdr
*sec
;
3156 for (j
= 0, sec
= section_headers
;
3157 j
< elf_header
.e_shnum
;
3159 if (strcmp (SECTION_NAME (sec
), ".dynamic") == 0)
3162 if (j
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
3164 error (_("no .dynamic section in the dynamic segment"));
3168 dynamic_addr
= sec
->sh_offset
;
3169 dynamic_size
= sec
->sh_size
;
3171 if (dynamic_addr
< segment
->p_offset
3172 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
3173 warn (_("the .dynamic section is not contained within the dynamic segment"));
3174 else if (dynamic_addr
> segment
->p_offset
)
3175 warn (_("the .dynamic section is not the first section in the dynamic segment."));
3179 /* Otherwise, we can only assume that the .dynamic
3180 section is the first section in the DYNAMIC segment. */
3181 dynamic_addr
= segment
->p_offset
;
3182 dynamic_size
= segment
->p_filesz
;
3187 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3189 error (_("Unable to find program interpreter name\n"));
3192 program_interpreter
[0] = 0;
3193 fscanf (file
, "%63s", program_interpreter
);
3196 printf (_("\n [Requesting program interpreter: %s]"),
3197 program_interpreter
);
3203 putc ('\n', stdout
);
3206 if (do_segments
&& section_headers
!= NULL
)
3208 printf (_("\n Section to Segment mapping:\n"));
3209 printf (_(" Segment Sections...\n"));
3211 assert (string_table
!= NULL
);
3213 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3216 Elf_Internal_Shdr
*section
;
3218 segment
= program_headers
+ i
;
3219 section
= section_headers
;
3221 printf (" %2.2d ", i
);
3223 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3225 if (section
->sh_size
> 0
3226 /* Compare allocated sections by VMA, unallocated
3227 sections by file offset. */
3228 && (section
->sh_flags
& SHF_ALLOC
3229 ? (section
->sh_addr
>= segment
->p_vaddr
3230 && section
->sh_addr
+ section
->sh_size
3231 <= segment
->p_vaddr
+ segment
->p_memsz
)
3232 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
3233 && (section
->sh_offset
+ section
->sh_size
3234 <= segment
->p_offset
+ segment
->p_filesz
))))
3235 printf ("%s ", SECTION_NAME (section
));
3246 /* Find the file offset corresponding to VMA by using the program headers. */
3249 offset_from_vma (FILE *file
, bfd_vma vma
, bfd_size_type size
)
3251 Elf_Internal_Phdr
*seg
;
3253 if (! get_program_headers (file
))
3255 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3259 for (seg
= program_headers
;
3260 seg
< program_headers
+ elf_header
.e_phnum
;
3263 if (seg
->p_type
!= PT_LOAD
)
3266 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3267 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3268 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3271 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3278 get_32bit_section_headers (FILE *file
, unsigned int num
)
3280 Elf32_External_Shdr
*shdrs
;
3281 Elf_Internal_Shdr
*internal
;
3284 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3285 elf_header
.e_shentsize
* num
, _("section headers"));
3289 section_headers
= malloc (num
* sizeof (Elf_Internal_Shdr
));
3291 if (section_headers
== NULL
)
3293 error (_("Out of memory\n"));
3297 for (i
= 0, internal
= section_headers
;
3301 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3302 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3303 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3304 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3305 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3306 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3307 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3308 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3309 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3310 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3319 get_64bit_section_headers (FILE *file
, unsigned int num
)
3321 Elf64_External_Shdr
*shdrs
;
3322 Elf_Internal_Shdr
*internal
;
3325 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3326 elf_header
.e_shentsize
* num
, _("section headers"));
3330 section_headers
= malloc (num
* sizeof (Elf_Internal_Shdr
));
3332 if (section_headers
== NULL
)
3334 error (_("Out of memory\n"));
3338 for (i
= 0, internal
= section_headers
;
3342 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3343 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3344 internal
->sh_flags
= BYTE_GET8 (shdrs
[i
].sh_flags
);
3345 internal
->sh_addr
= BYTE_GET8 (shdrs
[i
].sh_addr
);
3346 internal
->sh_size
= BYTE_GET8 (shdrs
[i
].sh_size
);
3347 internal
->sh_entsize
= BYTE_GET8 (shdrs
[i
].sh_entsize
);
3348 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3349 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3350 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3351 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3359 static Elf_Internal_Sym
*
3360 get_32bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3362 unsigned long number
;
3363 Elf32_External_Sym
*esyms
;
3364 Elf_External_Sym_Shndx
*shndx
;
3365 Elf_Internal_Sym
*isyms
;
3366 Elf_Internal_Sym
*psym
;
3369 esyms
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
3375 if (symtab_shndx_hdr
!= NULL
3376 && (symtab_shndx_hdr
->sh_link
3377 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3379 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3380 symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3388 number
= section
->sh_size
/ section
->sh_entsize
;
3389 isyms
= malloc (number
* sizeof (Elf_Internal_Sym
));
3393 error (_("Out of memory\n"));
3400 for (j
= 0, psym
= isyms
;
3404 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3405 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3406 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3407 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3408 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3410 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3411 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3412 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3422 static Elf_Internal_Sym
*
3423 get_64bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3425 unsigned long number
;
3426 Elf64_External_Sym
*esyms
;
3427 Elf_External_Sym_Shndx
*shndx
;
3428 Elf_Internal_Sym
*isyms
;
3429 Elf_Internal_Sym
*psym
;
3432 esyms
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
3438 if (symtab_shndx_hdr
!= NULL
3439 && (symtab_shndx_hdr
->sh_link
3440 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3442 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3443 symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3451 number
= section
->sh_size
/ section
->sh_entsize
;
3452 isyms
= malloc (number
* sizeof (Elf_Internal_Sym
));
3456 error (_("Out of memory\n"));
3463 for (j
= 0, psym
= isyms
;
3467 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3468 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3469 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3470 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3471 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3473 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3474 psym
->st_value
= BYTE_GET8 (esyms
[j
].st_value
);
3475 psym
->st_size
= BYTE_GET8 (esyms
[j
].st_size
);
3486 get_elf_section_flags (bfd_vma sh_flags
)
3488 static char buff
[32];
3496 flag
= sh_flags
& - sh_flags
;
3501 case SHF_WRITE
: strcat (buff
, "W"); break;
3502 case SHF_ALLOC
: strcat (buff
, "A"); break;
3503 case SHF_EXECINSTR
: strcat (buff
, "X"); break;
3504 case SHF_MERGE
: strcat (buff
, "M"); break;
3505 case SHF_STRINGS
: strcat (buff
, "S"); break;
3506 case SHF_INFO_LINK
: strcat (buff
, "I"); break;
3507 case SHF_LINK_ORDER
: strcat (buff
, "L"); break;
3508 case SHF_OS_NONCONFORMING
: strcat (buff
, "O"); break;
3509 case SHF_GROUP
: strcat (buff
, "G"); break;
3510 case SHF_TLS
: strcat (buff
, "T"); break;
3513 if (flag
& SHF_MASKOS
)
3516 sh_flags
&= ~ SHF_MASKOS
;
3518 else if (flag
& SHF_MASKPROC
)
3521 sh_flags
&= ~ SHF_MASKPROC
;
3533 process_section_headers (FILE *file
)
3535 Elf_Internal_Shdr
*section
;
3538 section_headers
= NULL
;
3540 if (elf_header
.e_shnum
== 0)
3543 printf (_("\nThere are no sections in this file.\n"));
3548 if (do_sections
&& !do_header
)
3549 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3550 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3554 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3557 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3560 /* Read in the string table, so that we have names to display. */
3561 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3563 if (section
->sh_size
!= 0)
3565 string_table
= get_data (NULL
, file
, section
->sh_offset
,
3566 section
->sh_size
, _("string table"));
3568 if (string_table
== NULL
)
3571 string_table_length
= section
->sh_size
;
3574 /* Scan the sections for the dynamic symbol table
3575 and dynamic string table and debug sections. */
3576 dynamic_symbols
= NULL
;
3577 dynamic_strings
= NULL
;
3578 dynamic_syminfo
= NULL
;
3579 symtab_shndx_hdr
= NULL
;
3581 for (i
= 0, section
= section_headers
;
3582 i
< elf_header
.e_shnum
;
3585 char *name
= SECTION_NAME (section
);
3587 if (section
->sh_type
== SHT_DYNSYM
)
3589 if (dynamic_symbols
!= NULL
)
3591 error (_("File contains multiple dynamic symbol tables\n"));
3595 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3596 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3598 else if (section
->sh_type
== SHT_STRTAB
3599 && strcmp (name
, ".dynstr") == 0)
3601 if (dynamic_strings
!= NULL
)
3603 error (_("File contains multiple dynamic string tables\n"));
3607 dynamic_strings
= get_data (NULL
, file
, section
->sh_offset
,
3608 section
->sh_size
, _("dynamic strings"));
3610 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
3612 if (symtab_shndx_hdr
!= NULL
)
3614 error (_("File contains multiple symtab shndx tables\n"));
3617 symtab_shndx_hdr
= section
;
3619 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
3620 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
3621 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
3623 && strncmp (name
, ".debug_", 7) == 0)
3628 || (do_debug_info
&& (strcmp (name
, "info") == 0))
3629 || (do_debug_abbrevs
&& (strcmp (name
, "abbrev") == 0))
3630 || (do_debug_lines
&& (strcmp (name
, "line") == 0))
3631 || (do_debug_pubnames
&& (strcmp (name
, "pubnames") == 0))
3632 || (do_debug_aranges
&& (strcmp (name
, "aranges") == 0))
3633 || (do_debug_frames
&& (strcmp (name
, "frame") == 0))
3634 || (do_debug_macinfo
&& (strcmp (name
, "macinfo") == 0))
3635 || (do_debug_str
&& (strcmp (name
, "str") == 0))
3636 || (do_debug_loc
&& (strcmp (name
, "loc") == 0))
3638 request_dump (i
, DEBUG_DUMP
);
3640 /* linkonce section to be combined with .debug_info at link time. */
3641 else if ((do_debugging
|| do_debug_info
)
3642 && strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
3643 request_dump (i
, DEBUG_DUMP
);
3644 else if (do_debug_frames
&& strcmp (name
, ".eh_frame") == 0)
3645 request_dump (i
, DEBUG_DUMP
);
3651 if (elf_header
.e_shnum
> 1)
3652 printf (_("\nSection Headers:\n"));
3654 printf (_("\nSection Header:\n"));
3658 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3661 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3664 printf (_(" [Nr] Name Type Address Offset\n"));
3665 printf (_(" Size EntSize Flags Link Info Align\n"));
3668 for (i
= 0, section
= section_headers
;
3669 i
< elf_header
.e_shnum
;
3672 printf (" [%2u] %-17.17s %-15.15s ",
3673 SECTION_HEADER_NUM (i
),
3674 SECTION_NAME (section
),
3675 get_section_type_name (section
->sh_type
));
3679 print_vma (section
->sh_addr
, LONG_HEX
);
3681 printf ( " %6.6lx %6.6lx %2.2lx",
3682 (unsigned long) section
->sh_offset
,
3683 (unsigned long) section
->sh_size
,
3684 (unsigned long) section
->sh_entsize
);
3686 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3688 printf ("%2ld %3lu %2ld\n",
3689 (unsigned long) section
->sh_link
,
3690 (unsigned long) section
->sh_info
,
3691 (unsigned long) section
->sh_addralign
);
3695 print_vma (section
->sh_addr
, LONG_HEX
);
3697 if ((long) section
->sh_offset
== section
->sh_offset
)
3698 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
3702 print_vma (section
->sh_offset
, LONG_HEX
);
3705 if ((unsigned long) section
->sh_size
== section
->sh_size
)
3706 printf (" %6.6lx", (unsigned long) section
->sh_size
);
3710 print_vma (section
->sh_size
, LONG_HEX
);
3713 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
3714 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
3718 print_vma (section
->sh_entsize
, LONG_HEX
);
3721 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3723 printf ("%2ld %3lu ",
3724 (unsigned long) section
->sh_link
,
3725 (unsigned long) section
->sh_info
);
3727 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
3728 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
3731 print_vma (section
->sh_addralign
, DEC
);
3738 print_vma (section
->sh_addr
, LONG_HEX
);
3739 if ((long) section
->sh_offset
== section
->sh_offset
)
3740 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
3744 print_vma (section
->sh_offset
, LONG_HEX
);
3747 print_vma (section
->sh_size
, LONG_HEX
);
3749 print_vma (section
->sh_entsize
, LONG_HEX
);
3751 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3753 printf (" %2ld %3lu %ld\n",
3754 (unsigned long) section
->sh_link
,
3755 (unsigned long) section
->sh_info
,
3756 (unsigned long) section
->sh_addralign
);
3760 printf (_("Key to Flags:\n\
3761 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3762 I (info), L (link order), G (group), x (unknown)\n\
3763 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3769 get_group_flags (unsigned int flags
)
3771 static char buff
[32];
3778 sprintf (buff
, _("[<unknown>: 0x%x]"), flags
);
3785 process_section_groups (FILE *file
)
3787 Elf_Internal_Shdr
*section
;
3789 struct group
*group
;
3791 if (elf_header
.e_shnum
== 0)
3793 if (do_section_groups
)
3794 printf (_("\nThere are no section groups in this file.\n"));
3799 if (section_headers
== NULL
)
3801 error (_("Section headers are not available!\n"));
3805 section_headers_groups
= calloc (elf_header
.e_shnum
,
3806 sizeof (struct group
*));
3808 if (section_headers_groups
== NULL
)
3810 error (_("Out of memory\n"));
3814 /* Scan the sections for the group section. */
3815 for (i
= 0, section
= section_headers
;
3816 i
< elf_header
.e_shnum
;
3818 if (section
->sh_type
== SHT_GROUP
)
3821 section_groups
= calloc (group_count
, sizeof (struct group
));
3823 if (section_groups
== NULL
)
3825 error (_("Out of memory\n"));
3829 for (i
= 0, section
= section_headers
, group
= section_groups
;
3830 i
< elf_header
.e_shnum
;
3833 if (section
->sh_type
== SHT_GROUP
)
3835 char *name
= SECTION_NAME (section
);
3836 char *group_name
, *strtab
, *start
, *indices
;
3837 unsigned int entry
, j
, size
;
3838 Elf_Internal_Sym
*sym
;
3839 Elf_Internal_Shdr
*symtab_sec
, *strtab_sec
, *sec
;
3840 Elf_Internal_Sym
*symtab
;
3842 /* Get the symbol table. */
3843 symtab_sec
= SECTION_HEADER (section
->sh_link
);
3844 if (symtab_sec
->sh_type
!= SHT_SYMTAB
)
3846 error (_("Bad sh_link in group section `%s'\n"), name
);
3849 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
);
3851 sym
= symtab
+ section
->sh_info
;
3853 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
3855 bfd_vma sec_index
= SECTION_HEADER_INDEX (sym
->st_shndx
);
3858 error (_("Bad sh_info in group section `%s'\n"), name
);
3862 group_name
= SECTION_NAME (section_headers
+ sec_index
);
3867 /* Get the string table. */
3868 strtab_sec
= SECTION_HEADER (symtab_sec
->sh_link
);
3869 strtab
= get_data (NULL
, file
, strtab_sec
->sh_offset
,
3870 strtab_sec
->sh_size
,
3873 group_name
= strtab
+ sym
->st_name
;
3876 start
= get_data (NULL
, file
, section
->sh_offset
,
3877 section
->sh_size
, _("section data"));
3880 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
3881 entry
= byte_get (indices
, 4);
3884 if (do_section_groups
)
3886 printf ("\n%s group section `%s' [%s] contains %u sections:\n",
3887 get_group_flags (entry
), name
, group_name
, size
);
3889 printf (_(" [Index] Name\n"));
3892 group
->group_index
= i
;
3894 for (j
= 0; j
< size
; j
++)
3896 struct group_list
*g
;
3898 entry
= byte_get (indices
, 4);
3901 if (section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
3904 error (_("section [%5u] already in group section [%5u]\n"),
3905 entry
, section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
3909 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
3912 if (do_section_groups
)
3914 sec
= SECTION_HEADER (entry
);
3915 printf (" [%5u] %s\n",
3916 entry
, SECTION_NAME (sec
));
3919 g
= xmalloc (sizeof (struct group_list
));
3920 g
->section_index
= entry
;
3921 g
->next
= group
->root
;
3943 } dynamic_relocations
[] =
3945 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
3946 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
3947 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
3950 /* Process the reloc section. */
3952 process_relocs (FILE *file
)
3954 unsigned long rel_size
;
3955 unsigned long rel_offset
;
3961 if (do_using_dynamic
)
3965 int has_dynamic_reloc
;
3968 has_dynamic_reloc
= 0;
3970 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
3972 is_rela
= dynamic_relocations
[i
].rela
;
3973 name
= dynamic_relocations
[i
].name
;
3974 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
3975 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
3977 has_dynamic_reloc
|= rel_size
;
3979 if (is_rela
== UNKNOWN
)
3981 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
3982 switch (dynamic_info
[DT_PLTREL
])
3996 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
3997 name
, rel_offset
, rel_size
);
3999 dump_relocations (file
,
4000 offset_from_vma (file
, rel_offset
, rel_size
),
4002 dynamic_symbols
, num_dynamic_syms
,
4003 dynamic_strings
, is_rela
);
4007 if (! has_dynamic_reloc
)
4008 printf (_("\nThere are no dynamic relocations in this file.\n"));
4012 Elf_Internal_Shdr
*section
;
4016 for (i
= 0, section
= section_headers
;
4017 i
< elf_header
.e_shnum
;
4020 if ( section
->sh_type
!= SHT_RELA
4021 && section
->sh_type
!= SHT_REL
)
4024 rel_offset
= section
->sh_offset
;
4025 rel_size
= section
->sh_size
;
4029 Elf_Internal_Shdr
*strsec
;
4030 Elf_Internal_Sym
*symtab
;
4033 unsigned long nsyms
;
4035 printf (_("\nRelocation section "));
4037 if (string_table
== NULL
)
4038 printf ("%d", section
->sh_name
);
4040 printf (_("'%s'"), SECTION_NAME (section
));
4042 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4043 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4048 if (section
->sh_link
)
4050 Elf_Internal_Shdr
*symsec
;
4052 symsec
= SECTION_HEADER (section
->sh_link
);
4053 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4054 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4059 strsec
= SECTION_HEADER (symsec
->sh_link
);
4061 strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4062 strsec
->sh_size
, _("string table"));
4064 is_rela
= section
->sh_type
== SHT_RELA
;
4066 dump_relocations (file
, rel_offset
, rel_size
,
4067 symtab
, nsyms
, strtab
, is_rela
);
4079 printf (_("\nThere are no relocations in this file.\n"));
4085 #include "unwind-ia64.h"
4087 /* An absolute address consists of a section and an offset. If the
4088 section is NULL, the offset itself is the address, otherwise, the
4089 address equals to LOAD_ADDRESS(section) + offset. */
4093 unsigned short section
;
4099 struct unw_table_entry
4101 struct absaddr start
;
4103 struct absaddr info
;
4105 *table
; /* Unwind table. */
4106 unsigned long table_len
; /* Length of unwind table. */
4107 unsigned char *info
; /* Unwind info. */
4108 unsigned long info_size
; /* Size of unwind info. */
4109 bfd_vma info_addr
; /* starting address of unwind info. */
4110 bfd_vma seg_base
; /* Starting address of segment. */
4111 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4112 unsigned long nsyms
; /* Number of symbols. */
4113 char *strtab
; /* The string table. */
4114 unsigned long strtab_size
; /* Size of string table. */
4118 find_symbol_for_address (struct unw_aux_info
*aux
,
4119 struct absaddr addr
,
4120 const char **symname
,
4123 bfd_vma dist
= 0x100000;
4124 Elf_Internal_Sym
*sym
, *best
= NULL
;
4127 for (i
= 0, sym
= aux
->symtab
; i
< aux
->nsyms
; ++i
, ++sym
)
4129 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
4130 && sym
->st_name
!= 0
4131 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
4132 && addr
.offset
>= sym
->st_value
4133 && addr
.offset
- sym
->st_value
< dist
)
4136 dist
= addr
.offset
- sym
->st_value
;
4143 *symname
= (best
->st_name
>= aux
->strtab_size
4144 ? "<corrupt>" : aux
->strtab
+ best
->st_name
);
4149 *offset
= addr
.offset
;
4153 dump_ia64_unwind (struct unw_aux_info
*aux
)
4156 struct unw_table_entry
*tp
;
4159 addr_size
= is_32bit_elf
? 4 : 8;
4161 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4165 const unsigned char *dp
;
4166 const unsigned char *head
;
4167 const char *procname
;
4169 find_symbol_for_address (aux
, tp
->start
, &procname
, &offset
);
4171 fputs ("\n<", stdout
);
4175 fputs (procname
, stdout
);
4178 printf ("+%lx", (unsigned long) offset
);
4181 fputs (">: [", stdout
);
4182 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4183 fputc ('-', stdout
);
4184 print_vma (tp
->end
.offset
, PREFIX_HEX
);
4185 printf ("], info at +0x%lx\n",
4186 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
4188 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
4189 stamp
= BYTE_GET8 ((unsigned char *) head
);
4191 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4192 (unsigned) UNW_VER (stamp
),
4193 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
4194 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
4195 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
4196 (unsigned long) (addr_size
* UNW_LENGTH (stamp
)));
4198 if (UNW_VER (stamp
) != 1)
4200 printf ("\tUnknown version.\n");
4205 for (dp
= head
+ 8; dp
< head
+ 8 + addr_size
* UNW_LENGTH (stamp
);)
4206 dp
= unw_decode (dp
, in_body
, & in_body
);
4211 slurp_ia64_unwind_table (FILE *file
,
4212 struct unw_aux_info
*aux
,
4213 Elf_Internal_Shdr
*sec
)
4215 unsigned long size
, addr_size
, nrelas
, i
;
4216 Elf_Internal_Phdr
*seg
;
4217 struct unw_table_entry
*tep
;
4218 Elf_Internal_Shdr
*relsec
;
4219 Elf_Internal_Rela
*rela
, *rp
;
4220 unsigned char *table
, *tp
;
4221 Elf_Internal_Sym
*sym
;
4222 const char *relname
;
4224 addr_size
= is_32bit_elf
? 4 : 8;
4226 /* First, find the starting address of the segment that includes
4229 if (elf_header
.e_phnum
)
4231 if (! get_program_headers (file
))
4234 for (seg
= program_headers
;
4235 seg
< program_headers
+ elf_header
.e_phnum
;
4238 if (seg
->p_type
!= PT_LOAD
)
4241 if (sec
->sh_addr
>= seg
->p_vaddr
4242 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
4244 aux
->seg_base
= seg
->p_vaddr
;
4250 /* Second, build the unwind table from the contents of the unwind section: */
4251 size
= sec
->sh_size
;
4252 table
= get_data (NULL
, file
, sec
->sh_offset
, size
, _("unwind table"));
4256 tep
= aux
->table
= xmalloc (size
/ (3 * addr_size
) * sizeof (aux
->table
[0]));
4257 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * addr_size
, ++tep
)
4259 tep
->start
.section
= SHN_UNDEF
;
4260 tep
->end
.section
= SHN_UNDEF
;
4261 tep
->info
.section
= SHN_UNDEF
;
4264 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
4265 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
4266 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
4270 tep
->start
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 0);
4271 tep
->end
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 8);
4272 tep
->info
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 16);
4274 tep
->start
.offset
+= aux
->seg_base
;
4275 tep
->end
.offset
+= aux
->seg_base
;
4276 tep
->info
.offset
+= aux
->seg_base
;
4280 /* Third, apply any relocations to the unwind table: */
4282 for (relsec
= section_headers
;
4283 relsec
< section_headers
+ elf_header
.e_shnum
;
4286 if (relsec
->sh_type
!= SHT_RELA
4287 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4290 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
4294 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
4298 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
4299 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
4301 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
4303 warn (_("Skipping unexpected symbol type %u\n"),
4304 ELF32_ST_TYPE (sym
->st_info
));
4310 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
4311 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
4313 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
4315 warn (_("Skipping unexpected symbol type %u\n"),
4316 ELF64_ST_TYPE (sym
->st_info
));
4321 if (strncmp (relname
, "R_IA64_SEGREL", 13) != 0)
4323 warn (_("Skipping unexpected relocation type %s\n"), relname
);
4327 i
= rp
->r_offset
/ (3 * addr_size
);
4329 switch (rp
->r_offset
/addr_size
% 3)
4332 aux
->table
[i
].start
.section
= sym
->st_shndx
;
4333 aux
->table
[i
].start
.offset
+= rp
->r_addend
;
4336 aux
->table
[i
].end
.section
= sym
->st_shndx
;
4337 aux
->table
[i
].end
.offset
+= rp
->r_addend
;
4340 aux
->table
[i
].info
.section
= sym
->st_shndx
;
4341 aux
->table
[i
].info
.offset
+= rp
->r_addend
;
4351 aux
->table_len
= size
/ (3 * addr_size
);
4356 process_unwind (FILE *file
)
4358 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
4359 unsigned long i
, addr_size
, unwcount
= 0, unwstart
= 0;
4360 struct unw_aux_info aux
;
4365 if (elf_header
.e_machine
!= EM_IA_64
)
4367 printf (_("\nThere are no unwind sections in this file.\n"));
4371 memset (& aux
, 0, sizeof (aux
));
4373 addr_size
= is_32bit_elf
? 4 : 8;
4375 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
4377 if (sec
->sh_type
== SHT_SYMTAB
)
4379 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
4380 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
4382 strsec
= SECTION_HEADER (sec
->sh_link
);
4383 aux
.strtab_size
= strsec
->sh_size
;
4384 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4385 aux
.strtab_size
, _("string table"));
4387 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4392 printf (_("\nThere are no unwind sections in this file.\n"));
4394 while (unwcount
-- > 0)
4399 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
4400 i
< elf_header
.e_shnum
; ++i
, ++sec
)
4401 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4408 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
4410 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
4412 /* We need to find which section group it is in. */
4413 struct group_list
*g
= section_headers_groups
[i
]->root
;
4415 for (; g
!= NULL
; g
= g
->next
)
4417 sec
= SECTION_HEADER (g
->section_index
);
4418 if (strcmp (SECTION_NAME (sec
),
4419 ELF_STRING_ia64_unwind_info
) == 0)
4424 i
= elf_header
.e_shnum
;
4426 else if (strncmp (SECTION_NAME (unwsec
),
4427 ELF_STRING_ia64_unwind_once
, len
) == 0)
4429 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
4430 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
4431 suffix
= SECTION_NAME (unwsec
) + len
;
4432 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4434 if (strncmp (SECTION_NAME (sec
),
4435 ELF_STRING_ia64_unwind_info_once
, len2
) == 0
4436 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
4441 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4442 .IA_64.unwind or BAR -> .IA_64.unwind_info */
4443 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
4444 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
4446 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
,
4448 suffix
= SECTION_NAME (unwsec
) + len
;
4449 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4451 if (strncmp (SECTION_NAME (sec
),
4452 ELF_STRING_ia64_unwind_info
, len2
) == 0
4453 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
4457 if (i
== elf_header
.e_shnum
)
4459 printf (_("\nCould not find unwind info section for "));
4461 if (string_table
== NULL
)
4462 printf ("%d", unwsec
->sh_name
);
4464 printf (_("'%s'"), SECTION_NAME (unwsec
));
4468 aux
.info_size
= sec
->sh_size
;
4469 aux
.info_addr
= sec
->sh_addr
;
4470 aux
.info
= get_data (NULL
, file
, sec
->sh_offset
, aux
.info_size
,
4473 printf (_("\nUnwind section "));
4475 if (string_table
== NULL
)
4476 printf ("%d", unwsec
->sh_name
);
4478 printf (_("'%s'"), SECTION_NAME (unwsec
));
4480 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4481 (unsigned long) unwsec
->sh_offset
,
4482 (unsigned long) (unwsec
->sh_size
/ (3 * addr_size
)));
4484 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
4486 if (aux
.table_len
> 0)
4487 dump_ia64_unwind (& aux
);
4490 free ((char *) aux
.table
);
4492 free ((char *) aux
.info
);
4501 free ((char *) aux
.strtab
);
4507 dynamic_section_mips_val (Elf_Internal_Dyn
*entry
)
4509 switch (entry
->d_tag
)
4512 if (entry
->d_un
.d_val
== 0)
4516 static const char * opts
[] =
4518 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
4519 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
4520 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
4521 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
4526 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++cnt
)
4527 if (entry
->d_un
.d_val
& (1 << cnt
))
4529 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
4536 case DT_MIPS_IVERSION
:
4537 if (dynamic_strings
!= NULL
)
4538 printf ("Interface Version: %s\n",
4539 dynamic_strings
+ entry
->d_un
.d_val
);
4541 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4544 case DT_MIPS_TIME_STAMP
:
4549 time_t time
= entry
->d_un
.d_val
;
4550 tmp
= gmtime (&time
);
4551 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
4552 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
4553 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
4554 printf ("Time Stamp: %s\n", timebuf
);
4558 case DT_MIPS_RLD_VERSION
:
4559 case DT_MIPS_LOCAL_GOTNO
:
4560 case DT_MIPS_CONFLICTNO
:
4561 case DT_MIPS_LIBLISTNO
:
4562 case DT_MIPS_SYMTABNO
:
4563 case DT_MIPS_UNREFEXTNO
:
4564 case DT_MIPS_HIPAGENO
:
4565 case DT_MIPS_DELTA_CLASS_NO
:
4566 case DT_MIPS_DELTA_INSTANCE_NO
:
4567 case DT_MIPS_DELTA_RELOC_NO
:
4568 case DT_MIPS_DELTA_SYM_NO
:
4569 case DT_MIPS_DELTA_CLASSSYM_NO
:
4570 case DT_MIPS_COMPACT_SIZE
:
4571 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4575 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
4581 dynamic_section_parisc_val (Elf_Internal_Dyn
*entry
)
4583 switch (entry
->d_tag
)
4585 case DT_HP_DLD_FLAGS
:
4594 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
4595 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
4596 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
4597 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
4598 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
4599 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
4600 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
4601 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
4602 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
4603 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
4604 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
4608 bfd_vma val
= entry
->d_un
.d_val
;
4610 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
4611 if (val
& flags
[cnt
].bit
)
4615 fputs (flags
[cnt
].str
, stdout
);
4617 val
^= flags
[cnt
].bit
;
4620 if (val
!= 0 || first
)
4624 print_vma (val
, HEX
);
4630 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4637 dynamic_section_ia64_val (Elf_Internal_Dyn
*entry
)
4639 switch (entry
->d_tag
)
4641 case DT_IA_64_PLT_RESERVE
:
4642 /* First 3 slots reserved. */
4643 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4645 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
4649 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4656 get_32bit_dynamic_section (FILE *file
)
4658 Elf32_External_Dyn
*edyn
, *ext
;
4659 Elf_Internal_Dyn
*entry
;
4661 edyn
= get_data (NULL
, file
, dynamic_addr
, dynamic_size
,
4662 _("dynamic section"));
4666 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
4667 might not have the luxury of section headers. Look for the DT_NULL
4668 terminator to determine the number of entries. */
4669 for (ext
= edyn
, dynamic_nent
= 0;
4670 (char *) ext
< (char *) edyn
+ dynamic_size
;
4674 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
4678 dynamic_section
= malloc (dynamic_nent
* sizeof (*entry
));
4679 if (dynamic_section
== NULL
)
4681 error (_("Out of memory\n"));
4686 for (ext
= edyn
, entry
= dynamic_section
;
4687 entry
< dynamic_section
+ dynamic_nent
;
4690 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
4691 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
4700 get_64bit_dynamic_section (FILE *file
)
4702 Elf64_External_Dyn
*edyn
, *ext
;
4703 Elf_Internal_Dyn
*entry
;
4705 edyn
= get_data (NULL
, file
, dynamic_addr
, dynamic_size
,
4706 _("dynamic section"));
4710 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
4711 might not have the luxury of section headers. Look for the DT_NULL
4712 terminator to determine the number of entries. */
4713 for (ext
= edyn
, dynamic_nent
= 0;
4714 (char *) ext
< (char *) edyn
+ dynamic_size
;
4718 if (BYTE_GET8 (ext
->d_tag
) == DT_NULL
)
4722 dynamic_section
= malloc (dynamic_nent
* sizeof (*entry
));
4723 if (dynamic_section
== NULL
)
4725 error (_("Out of memory\n"));
4730 for (ext
= edyn
, entry
= dynamic_section
;
4731 entry
< dynamic_section
+ dynamic_nent
;
4734 entry
->d_tag
= BYTE_GET8 (ext
->d_tag
);
4735 entry
->d_un
.d_val
= BYTE_GET8 (ext
->d_un
.d_val
);
4744 get_dynamic_flags (bfd_vma flags
)
4746 static char buff
[128];
4754 flag
= flags
& - flags
;
4762 case DF_ORIGIN
: strcpy (p
, "ORIGIN"); break;
4763 case DF_SYMBOLIC
: strcpy (p
, "SYMBOLIC"); break;
4764 case DF_TEXTREL
: strcpy (p
, "TEXTREL"); break;
4765 case DF_BIND_NOW
: strcpy (p
, "BIND_NOW"); break;
4766 case DF_STATIC_TLS
: strcpy (p
, "STATIC_TLS"); break;
4767 default: strcpy (p
, "unknown"); break;
4770 p
= strchr (p
, '\0');
4775 /* Parse and display the contents of the dynamic section. */
4778 process_dynamic_section (FILE *file
)
4780 Elf_Internal_Dyn
*entry
;
4782 if (dynamic_size
== 0)
4785 printf (_("\nThere is no dynamic section in this file.\n"));
4792 if (! get_32bit_dynamic_section (file
))
4795 else if (! get_64bit_dynamic_section (file
))
4798 /* Find the appropriate symbol table. */
4799 if (dynamic_symbols
== NULL
)
4801 for (entry
= dynamic_section
;
4802 entry
< dynamic_section
+ dynamic_nent
;
4805 Elf_Internal_Shdr section
;
4807 if (entry
->d_tag
!= DT_SYMTAB
)
4810 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
4812 /* Since we do not know how big the symbol table is,
4813 we default to reading in the entire file (!) and
4814 processing that. This is overkill, I know, but it
4816 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
4818 if (archive_file_offset
!= 0)
4819 section
.sh_size
= archive_file_size
- section
.sh_offset
;
4822 if (fseek (file
, 0, SEEK_END
))
4823 error (_("Unable to seek to end of file!"));
4825 section
.sh_size
= ftell (file
) - section
.sh_offset
;
4829 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
4831 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
4833 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
4834 if (num_dynamic_syms
< 1)
4836 error (_("Unable to determine the number of symbols to load\n"));
4840 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
4844 /* Similarly find a string table. */
4845 if (dynamic_strings
== NULL
)
4847 for (entry
= dynamic_section
;
4848 entry
< dynamic_section
+ dynamic_nent
;
4851 unsigned long offset
;
4854 if (entry
->d_tag
!= DT_STRTAB
)
4857 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
4859 /* Since we do not know how big the string table is,
4860 we default to reading in the entire file (!) and
4861 processing that. This is overkill, I know, but it
4864 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
4866 if (archive_file_offset
!= 0)
4867 str_tab_len
= archive_file_size
- offset
;
4870 if (fseek (file
, 0, SEEK_END
))
4871 error (_("Unable to seek to end of file\n"));
4872 str_tab_len
= ftell (file
) - offset
;
4875 if (str_tab_len
< 1)
4878 (_("Unable to determine the length of the dynamic string table\n"));
4882 dynamic_strings
= get_data (NULL
, file
, offset
, str_tab_len
,
4883 _("dynamic string table"));
4888 /* And find the syminfo section if available. */
4889 if (dynamic_syminfo
== NULL
)
4891 unsigned long syminsz
= 0;
4893 for (entry
= dynamic_section
;
4894 entry
< dynamic_section
+ dynamic_nent
;
4897 if (entry
->d_tag
== DT_SYMINENT
)
4899 /* Note: these braces are necessary to avoid a syntax
4900 error from the SunOS4 C compiler. */
4901 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
4903 else if (entry
->d_tag
== DT_SYMINSZ
)
4904 syminsz
= entry
->d_un
.d_val
;
4905 else if (entry
->d_tag
== DT_SYMINFO
)
4906 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
4910 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
4912 Elf_External_Syminfo
*extsyminfo
, *extsym
;
4913 Elf_Internal_Syminfo
*syminfo
;
4915 /* There is a syminfo section. Read the data. */
4916 extsyminfo
= get_data (NULL
, file
, dynamic_syminfo_offset
, syminsz
,
4917 _("symbol information"));
4921 dynamic_syminfo
= malloc (syminsz
);
4922 if (dynamic_syminfo
== NULL
)
4924 error (_("Out of memory\n"));
4928 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
4929 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
4930 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
4931 ++syminfo
, ++extsym
)
4933 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
4934 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
4941 if (do_dynamic
&& dynamic_addr
)
4942 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
4943 dynamic_addr
, dynamic_nent
);
4945 printf (_(" Tag Type Name/Value\n"));
4947 for (entry
= dynamic_section
;
4948 entry
< dynamic_section
+ dynamic_nent
;
4956 print_vma (entry
->d_tag
, FULL_HEX
);
4957 dtype
= get_dynamic_type (entry
->d_tag
);
4958 printf (" (%s)%*s", dtype
,
4959 ((is_32bit_elf
? 27 : 19)
4960 - (int) strlen (dtype
)),
4964 switch (entry
->d_tag
)
4968 puts (get_dynamic_flags (entry
->d_un
.d_val
));
4978 switch (entry
->d_tag
)
4981 printf (_("Auxiliary library"));
4985 printf (_("Filter library"));
4989 printf (_("Configuration file"));
4993 printf (_("Dependency audit library"));
4997 printf (_("Audit library"));
5001 if (dynamic_strings
)
5002 printf (": [%s]\n", dynamic_strings
+ entry
->d_un
.d_val
);
5006 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5015 printf (_("Flags:"));
5017 if (entry
->d_un
.d_val
== 0)
5018 printf (_(" None\n"));
5021 unsigned long int val
= entry
->d_un
.d_val
;
5023 if (val
& DTF_1_PARINIT
)
5025 printf (" PARINIT");
5026 val
^= DTF_1_PARINIT
;
5028 if (val
& DTF_1_CONFEXP
)
5030 printf (" CONFEXP");
5031 val
^= DTF_1_CONFEXP
;
5034 printf (" %lx", val
);
5043 printf (_("Flags:"));
5045 if (entry
->d_un
.d_val
== 0)
5046 printf (_(" None\n"));
5049 unsigned long int val
= entry
->d_un
.d_val
;
5051 if (val
& DF_P1_LAZYLOAD
)
5053 printf (" LAZYLOAD");
5054 val
^= DF_P1_LAZYLOAD
;
5056 if (val
& DF_P1_GROUPPERM
)
5058 printf (" GROUPPERM");
5059 val
^= DF_P1_GROUPPERM
;
5062 printf (" %lx", val
);
5071 printf (_("Flags:"));
5072 if (entry
->d_un
.d_val
== 0)
5073 printf (_(" None\n"));
5076 unsigned long int val
= entry
->d_un
.d_val
;
5083 if (val
& DF_1_GLOBAL
)
5088 if (val
& DF_1_GROUP
)
5093 if (val
& DF_1_NODELETE
)
5095 printf (" NODELETE");
5096 val
^= DF_1_NODELETE
;
5098 if (val
& DF_1_LOADFLTR
)
5100 printf (" LOADFLTR");
5101 val
^= DF_1_LOADFLTR
;
5103 if (val
& DF_1_INITFIRST
)
5105 printf (" INITFIRST");
5106 val
^= DF_1_INITFIRST
;
5108 if (val
& DF_1_NOOPEN
)
5113 if (val
& DF_1_ORIGIN
)
5118 if (val
& DF_1_DIRECT
)
5123 if (val
& DF_1_TRANS
)
5128 if (val
& DF_1_INTERPOSE
)
5130 printf (" INTERPOSE");
5131 val
^= DF_1_INTERPOSE
;
5133 if (val
& DF_1_NODEFLIB
)
5135 printf (" NODEFLIB");
5136 val
^= DF_1_NODEFLIB
;
5138 if (val
& DF_1_NODUMP
)
5143 if (val
& DF_1_CONLFAT
)
5145 printf (" CONLFAT");
5146 val
^= DF_1_CONLFAT
;
5149 printf (" %lx", val
);
5156 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5158 puts (get_dynamic_type (entry
->d_un
.d_val
));
5178 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5184 if (dynamic_strings
== NULL
)
5187 name
= dynamic_strings
+ entry
->d_un
.d_val
;
5191 switch (entry
->d_tag
)
5194 printf (_("Shared library: [%s]"), name
);
5196 if (strcmp (name
, program_interpreter
) == 0)
5197 printf (_(" program interpreter"));
5201 printf (_("Library soname: [%s]"), name
);
5205 printf (_("Library rpath: [%s]"), name
);
5209 printf (_("Library runpath: [%s]"), name
);
5213 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5218 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5231 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5235 case DT_INIT_ARRAYSZ
:
5236 case DT_FINI_ARRAYSZ
:
5237 case DT_GNU_CONFLICTSZ
:
5238 case DT_GNU_LIBLISTSZ
:
5241 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
5242 printf (" (bytes)\n");
5252 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
5265 if (dynamic_strings
!= NULL
&& entry
->d_tag
== DT_USED
)
5269 name
= dynamic_strings
+ entry
->d_un
.d_val
;
5273 printf (_("Not needed object: [%s]\n"), name
);
5278 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5284 /* The value of this entry is ignored. */
5289 case DT_GNU_PRELINKED
:
5293 time_t time
= entry
->d_un
.d_val
;
5295 tmp
= gmtime (&time
);
5296 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
5297 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5298 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5304 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
5305 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
5310 switch (elf_header
.e_machine
)
5313 case EM_MIPS_RS3_LE
:
5314 dynamic_section_mips_val (entry
);
5317 dynamic_section_parisc_val (entry
);
5320 dynamic_section_ia64_val (entry
);
5323 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5335 get_ver_flags (unsigned int flags
)
5337 static char buff
[32];
5344 if (flags
& VER_FLG_BASE
)
5345 strcat (buff
, "BASE ");
5347 if (flags
& VER_FLG_WEAK
)
5349 if (flags
& VER_FLG_BASE
)
5350 strcat (buff
, "| ");
5352 strcat (buff
, "WEAK ");
5355 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
5356 strcat (buff
, "| <unknown>");
5361 /* Display the contents of the version sections. */
5363 process_version_sections (FILE *file
)
5365 Elf_Internal_Shdr
*section
;
5372 for (i
= 0, section
= section_headers
;
5373 i
< elf_header
.e_shnum
;
5376 switch (section
->sh_type
)
5378 case SHT_GNU_verdef
:
5380 Elf_External_Verdef
*edefs
;
5387 (_("\nVersion definition section '%s' contains %ld entries:\n"),
5388 SECTION_NAME (section
), section
->sh_info
);
5390 printf (_(" Addr: 0x"));
5391 printf_vma (section
->sh_addr
);
5392 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5393 (unsigned long) section
->sh_offset
, section
->sh_link
,
5394 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5396 edefs
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
5397 _("version definition section"));
5401 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5404 Elf_External_Verdef
*edef
;
5405 Elf_Internal_Verdef ent
;
5406 Elf_External_Verdaux
*eaux
;
5407 Elf_Internal_Verdaux aux
;
5411 vstart
= ((char *) edefs
) + idx
;
5413 edef
= (Elf_External_Verdef
*) vstart
;
5415 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
5416 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
5417 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
5418 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
5419 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
5420 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
5421 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
5423 printf (_(" %#06x: Rev: %d Flags: %s"),
5424 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
5426 printf (_(" Index: %d Cnt: %d "),
5427 ent
.vd_ndx
, ent
.vd_cnt
);
5429 vstart
+= ent
.vd_aux
;
5431 eaux
= (Elf_External_Verdaux
*) vstart
;
5433 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5434 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
5436 if (dynamic_strings
)
5437 printf (_("Name: %s\n"), dynamic_strings
+ aux
.vda_name
);
5439 printf (_("Name index: %ld\n"), aux
.vda_name
);
5441 isum
= idx
+ ent
.vd_aux
;
5443 for (j
= 1; j
< ent
.vd_cnt
; j
++)
5445 isum
+= aux
.vda_next
;
5446 vstart
+= aux
.vda_next
;
5448 eaux
= (Elf_External_Verdaux
*) vstart
;
5450 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5451 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
5453 if (dynamic_strings
)
5454 printf (_(" %#06x: Parent %d: %s\n"),
5455 isum
, j
, dynamic_strings
+ aux
.vda_name
);
5457 printf (_(" %#06x: Parent %d, name index: %ld\n"),
5458 isum
, j
, aux
.vda_name
);
5468 case SHT_GNU_verneed
:
5470 Elf_External_Verneed
*eneed
;
5476 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
5477 SECTION_NAME (section
), section
->sh_info
);
5479 printf (_(" Addr: 0x"));
5480 printf_vma (section
->sh_addr
);
5481 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
5482 (unsigned long) section
->sh_offset
, section
->sh_link
,
5483 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5485 eneed
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
5486 _("version need section"));
5490 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5492 Elf_External_Verneed
*entry
;
5493 Elf_Internal_Verneed ent
;
5498 vstart
= ((char *) eneed
) + idx
;
5500 entry
= (Elf_External_Verneed
*) vstart
;
5502 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
5503 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
5504 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
5505 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
5506 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
5508 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
5510 if (dynamic_strings
)
5511 printf (_(" File: %s"), dynamic_strings
+ ent
.vn_file
);
5513 printf (_(" File: %lx"), ent
.vn_file
);
5515 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
5517 vstart
+= ent
.vn_aux
;
5519 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
5521 Elf_External_Vernaux
*eaux
;
5522 Elf_Internal_Vernaux aux
;
5524 eaux
= (Elf_External_Vernaux
*) vstart
;
5526 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
5527 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
5528 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
5529 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
5530 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
5532 if (dynamic_strings
)
5533 printf (_(" %#06x: Name: %s"),
5534 isum
, dynamic_strings
+ aux
.vna_name
);
5536 printf (_(" %#06x: Name index: %lx"),
5537 isum
, aux
.vna_name
);
5539 printf (_(" Flags: %s Version: %d\n"),
5540 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
5542 isum
+= aux
.vna_next
;
5543 vstart
+= aux
.vna_next
;
5553 case SHT_GNU_versym
:
5555 Elf_Internal_Shdr
*link_section
;
5558 unsigned char *edata
;
5559 unsigned short *data
;
5561 Elf_Internal_Sym
*symbols
;
5562 Elf_Internal_Shdr
*string_sec
;
5565 link_section
= SECTION_HEADER (section
->sh_link
);
5566 total
= section
->sh_size
/ section
->sh_entsize
;
5570 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
5572 string_sec
= SECTION_HEADER (link_section
->sh_link
);
5574 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
5575 string_sec
->sh_size
, _("version string table"));
5579 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
5580 SECTION_NAME (section
), total
);
5582 printf (_(" Addr: "));
5583 printf_vma (section
->sh_addr
);
5584 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5585 (unsigned long) section
->sh_offset
, section
->sh_link
,
5586 SECTION_NAME (link_section
));
5588 off
= offset_from_vma (file
,
5589 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
5590 total
* sizeof (short));
5591 edata
= get_data (NULL
, file
, off
, total
* sizeof (short),
5592 _("version symbol data"));
5599 data
= malloc (total
* sizeof (short));
5601 for (cnt
= total
; cnt
--;)
5602 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
5607 for (cnt
= 0; cnt
< total
; cnt
+= 4)
5610 int check_def
, check_need
;
5613 printf (" %03x:", cnt
);
5615 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
5616 switch (data
[cnt
+ j
])
5619 fputs (_(" 0 (*local*) "), stdout
);
5623 fputs (_(" 1 (*global*) "), stdout
);
5627 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
5628 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
5632 if (SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
5635 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
5642 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
5644 Elf_Internal_Verneed ivn
;
5645 unsigned long offset
;
5647 offset
= offset_from_vma
5648 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
5649 sizeof (Elf_External_Verneed
));
5653 Elf_Internal_Vernaux ivna
;
5654 Elf_External_Verneed evn
;
5655 Elf_External_Vernaux evna
;
5656 unsigned long a_off
;
5658 get_data (&evn
, file
, offset
, sizeof (evn
),
5661 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5662 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5664 a_off
= offset
+ ivn
.vn_aux
;
5668 get_data (&evna
, file
, a_off
, sizeof (evna
),
5669 _("version need aux (2)"));
5671 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5672 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5674 a_off
+= ivna
.vna_next
;
5676 while (ivna
.vna_other
!= data
[cnt
+ j
]
5677 && ivna
.vna_next
!= 0);
5679 if (ivna
.vna_other
== data
[cnt
+ j
])
5681 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5683 name
= strtab
+ ivna
.vna_name
;
5684 nn
+= printf ("(%s%-*s",
5686 12 - (int) strlen (name
),
5692 offset
+= ivn
.vn_next
;
5694 while (ivn
.vn_next
);
5697 if (check_def
&& data
[cnt
+ j
] != 0x8001
5698 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5700 Elf_Internal_Verdef ivd
;
5701 Elf_External_Verdef evd
;
5702 unsigned long offset
;
5704 offset
= offset_from_vma
5705 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
5710 get_data (&evd
, file
, offset
, sizeof (evd
),
5713 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5714 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5716 offset
+= ivd
.vd_next
;
5718 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
5719 && ivd
.vd_next
!= 0);
5721 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
5723 Elf_External_Verdaux evda
;
5724 Elf_Internal_Verdaux ivda
;
5726 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5728 get_data (&evda
, file
,
5729 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
5730 sizeof (evda
), _("version def aux"));
5732 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5734 name
= strtab
+ ivda
.vda_name
;
5735 nn
+= printf ("(%s%-*s",
5737 12 - (int) strlen (name
),
5743 printf ("%*c", 18 - nn
, ' ');
5761 printf (_("\nNo version information found in this file.\n"));
5767 get_symbol_binding (unsigned int binding
)
5769 static char buff
[32];
5773 case STB_LOCAL
: return "LOCAL";
5774 case STB_GLOBAL
: return "GLOBAL";
5775 case STB_WEAK
: return "WEAK";
5777 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
5778 sprintf (buff
, _("<processor specific>: %d"), binding
);
5779 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
5780 sprintf (buff
, _("<OS specific>: %d"), binding
);
5782 sprintf (buff
, _("<unknown>: %d"), binding
);
5788 get_symbol_type (unsigned int type
)
5790 static char buff
[32];
5794 case STT_NOTYPE
: return "NOTYPE";
5795 case STT_OBJECT
: return "OBJECT";
5796 case STT_FUNC
: return "FUNC";
5797 case STT_SECTION
: return "SECTION";
5798 case STT_FILE
: return "FILE";
5799 case STT_COMMON
: return "COMMON";
5800 case STT_TLS
: return "TLS";
5802 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
5804 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
5805 return "THUMB_FUNC";
5807 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
5810 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
5811 return "PARISC_MILLI";
5813 sprintf (buff
, _("<processor specific>: %d"), type
);
5815 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
5817 if (elf_header
.e_machine
== EM_PARISC
)
5819 if (type
== STT_HP_OPAQUE
)
5821 if (type
== STT_HP_STUB
)
5825 sprintf (buff
, _("<OS specific>: %d"), type
);
5828 sprintf (buff
, _("<unknown>: %d"), type
);
5834 get_symbol_visibility (unsigned int visibility
)
5838 case STV_DEFAULT
: return "DEFAULT";
5839 case STV_INTERNAL
: return "INTERNAL";
5840 case STV_HIDDEN
: return "HIDDEN";
5841 case STV_PROTECTED
: return "PROTECTED";
5847 get_symbol_index_type (unsigned int type
)
5849 static char buff
[32];
5853 case SHN_UNDEF
: return "UND";
5854 case SHN_ABS
: return "ABS";
5855 case SHN_COMMON
: return "COM";
5857 if (type
== SHN_IA_64_ANSI_COMMON
5858 && elf_header
.e_machine
== EM_IA_64
5859 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
5861 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
5862 sprintf (buff
, "PRC[0x%04x]", type
);
5863 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
5864 sprintf (buff
, "OS [0x%04x]", type
);
5865 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
5866 sprintf (buff
, "RSV[0x%04x]", type
);
5868 sprintf (buff
, "%3d", type
);
5876 get_dynamic_data (FILE *file
, unsigned int number
)
5878 unsigned char *e_data
;
5881 e_data
= malloc (number
* 4);
5885 error (_("Out of memory\n"));
5889 if (fread (e_data
, 4, number
, file
) != number
)
5891 error (_("Unable to read in dynamic data\n"));
5895 i_data
= malloc (number
* sizeof (*i_data
));
5899 error (_("Out of memory\n"));
5905 i_data
[number
] = byte_get (e_data
+ number
* 4, 4);
5912 /* Dump the symbol table. */
5914 process_symbol_table (FILE *file
)
5916 Elf_Internal_Shdr
*section
;
5917 unsigned char nb
[4];
5918 unsigned char nc
[4];
5921 int *buckets
= NULL
;
5924 if (! do_syms
&& !do_histogram
)
5927 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
5931 (archive_file_offset
5932 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
5933 sizeof nb
+ sizeof nc
)),
5936 error (_("Unable to seek to start of dynamic information"));
5940 if (fread (nb
, sizeof (nb
), 1, file
) != 1)
5942 error (_("Failed to read in number of buckets\n"));
5946 if (fread (nc
, sizeof (nc
), 1, file
) != 1)
5948 error (_("Failed to read in number of chains\n"));
5952 nbuckets
= byte_get (nb
, 4);
5953 nchains
= byte_get (nc
, 4);
5955 buckets
= get_dynamic_data (file
, nbuckets
);
5956 chains
= get_dynamic_data (file
, nchains
);
5958 if (buckets
== NULL
|| chains
== NULL
)
5963 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
5968 printf (_("\nSymbol table for image:\n"));
5970 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5972 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5974 for (hn
= 0; hn
< nbuckets
; hn
++)
5979 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
5981 Elf_Internal_Sym
*psym
;
5983 psym
= dynamic_symbols
+ si
;
5985 printf (" %3d %3d: ", si
, hn
);
5986 print_vma (psym
->st_value
, LONG_HEX
);
5988 print_vma (psym
->st_size
, DEC_5
);
5990 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5991 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5992 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5993 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
5994 print_symbol (25, dynamic_strings
+ psym
->st_name
);
5999 else if (do_syms
&& !do_using_dynamic
)
6003 for (i
= 0, section
= section_headers
;
6004 i
< elf_header
.e_shnum
;
6009 Elf_Internal_Sym
*symtab
;
6010 Elf_Internal_Sym
*psym
;
6013 if ( section
->sh_type
!= SHT_SYMTAB
6014 && section
->sh_type
!= SHT_DYNSYM
)
6017 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
6018 SECTION_NAME (section
),
6019 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
6021 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6023 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6025 symtab
= GET_ELF_SYMBOLS (file
, section
);
6029 if (section
->sh_link
== elf_header
.e_shstrndx
)
6030 strtab
= string_table
;
6033 Elf_Internal_Shdr
*string_sec
;
6035 string_sec
= SECTION_HEADER (section
->sh_link
);
6037 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
6038 string_sec
->sh_size
, _("string table"));
6041 for (si
= 0, psym
= symtab
;
6042 si
< section
->sh_size
/ section
->sh_entsize
;
6045 printf ("%6d: ", si
);
6046 print_vma (psym
->st_value
, LONG_HEX
);
6048 print_vma (psym
->st_size
, DEC_5
);
6049 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6050 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
6051 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6052 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
6053 print_symbol (25, strtab
+ psym
->st_name
);
6055 if (section
->sh_type
== SHT_DYNSYM
&&
6056 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
6058 unsigned char data
[2];
6059 unsigned short vers_data
;
6060 unsigned long offset
;
6064 offset
= offset_from_vma
6065 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6066 sizeof data
+ si
* sizeof (vers_data
));
6068 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
6069 sizeof (data
), _("version data"));
6071 vers_data
= byte_get (data
, 2);
6073 is_nobits
= (SECTION_HEADER (psym
->st_shndx
)->sh_type
6076 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
6078 if ((vers_data
& 0x8000) || vers_data
> 1)
6080 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
6081 && (is_nobits
|| ! check_def
))
6083 Elf_External_Verneed evn
;
6084 Elf_Internal_Verneed ivn
;
6085 Elf_Internal_Vernaux ivna
;
6087 /* We must test both. */
6088 offset
= offset_from_vma
6089 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6094 unsigned long vna_off
;
6096 get_data (&evn
, file
, offset
, sizeof (evn
),
6099 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6100 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6102 vna_off
= offset
+ ivn
.vn_aux
;
6106 Elf_External_Vernaux evna
;
6108 get_data (&evna
, file
, vna_off
,
6110 _("version need aux (3)"));
6112 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6113 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6114 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6116 vna_off
+= ivna
.vna_next
;
6118 while (ivna
.vna_other
!= vers_data
6119 && ivna
.vna_next
!= 0);
6121 if (ivna
.vna_other
== vers_data
)
6124 offset
+= ivn
.vn_next
;
6126 while (ivn
.vn_next
!= 0);
6128 if (ivna
.vna_other
== vers_data
)
6131 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
6134 else if (! is_nobits
)
6135 error (_("bad dynamic symbol"));
6142 if (vers_data
!= 0x8001
6143 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6145 Elf_Internal_Verdef ivd
;
6146 Elf_Internal_Verdaux ivda
;
6147 Elf_External_Verdaux evda
;
6148 unsigned long offset
;
6150 offset
= offset_from_vma
6152 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6153 sizeof (Elf_External_Verdef
));
6157 Elf_External_Verdef evd
;
6159 get_data (&evd
, file
, offset
, sizeof (evd
),
6162 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6163 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6164 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6166 offset
+= ivd
.vd_next
;
6168 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
6169 && ivd
.vd_next
!= 0);
6171 offset
-= ivd
.vd_next
;
6172 offset
+= ivd
.vd_aux
;
6174 get_data (&evda
, file
, offset
, sizeof (evda
),
6175 _("version def aux"));
6177 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6179 if (psym
->st_name
!= ivda
.vda_name
)
6180 printf ((vers_data
& 0x8000)
6182 strtab
+ ivda
.vda_name
);
6192 if (strtab
!= string_table
)
6198 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
6200 if (do_histogram
&& buckets
!= NULL
)
6207 int nzero_counts
= 0;
6210 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
6212 printf (_(" Length Number %% of total Coverage\n"));
6214 lengths
= calloc (nbuckets
, sizeof (int));
6215 if (lengths
== NULL
)
6217 error (_("Out of memory"));
6220 for (hn
= 0; hn
< nbuckets
; ++hn
)
6225 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
6228 if (maxlength
< ++lengths
[hn
])
6233 counts
= calloc (maxlength
+ 1, sizeof (int));
6236 error (_("Out of memory"));
6240 for (hn
= 0; hn
< nbuckets
; ++hn
)
6241 ++counts
[lengths
[hn
]];
6245 printf (" 0 %-10d (%5.1f%%)\n",
6246 counts
[0], (counts
[0] * 100.0) / nbuckets
);
6247 for (si
= 1; si
<= maxlength
; ++si
)
6249 nzero_counts
+= counts
[si
] * si
;
6250 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
6251 si
, counts
[si
], (counts
[si
] * 100.0) / nbuckets
,
6252 (nzero_counts
* 100.0) / nsyms
);
6260 if (buckets
!= NULL
)
6270 process_syminfo (FILE *file ATTRIBUTE_UNUSED
)
6274 if (dynamic_syminfo
== NULL
6276 /* No syminfo, this is ok. */
6279 /* There better should be a dynamic symbol section. */
6280 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
6284 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
6285 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
6287 printf (_(" Num: Name BoundTo Flags\n"));
6288 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
6290 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
6292 printf ("%4d: ", i
);
6293 print_symbol (30, dynamic_strings
+ dynamic_symbols
[i
].st_name
);
6296 switch (dynamic_syminfo
[i
].si_boundto
)
6298 case SYMINFO_BT_SELF
:
6299 fputs ("SELF ", stdout
);
6301 case SYMINFO_BT_PARENT
:
6302 fputs ("PARENT ", stdout
);
6305 if (dynamic_syminfo
[i
].si_boundto
> 0
6306 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
)
6311 [dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
6315 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
6319 if (flags
& SYMINFO_FLG_DIRECT
)
6321 if (flags
& SYMINFO_FLG_PASSTHRU
)
6322 printf (" PASSTHRU");
6323 if (flags
& SYMINFO_FLG_COPY
)
6325 if (flags
& SYMINFO_FLG_LAZYLOAD
)
6326 printf (" LAZYLOAD");
6334 #ifdef SUPPORT_DISASSEMBLY
6336 disassemble_section (Elf_Internal_Shdr
*section
, FILE *file
)
6338 printf (_("\nAssembly dump of section %s\n"),
6339 SECTION_NAME (section
));
6341 /* XXX -- to be done --- XXX */
6348 dump_section (Elf_Internal_Shdr
*section
, FILE *file
)
6350 bfd_size_type bytes
;
6352 unsigned char *data
;
6353 unsigned char *start
;
6355 bytes
= section
->sh_size
;
6357 if (bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
6359 printf (_("\nSection '%s' has no data to dump.\n"),
6360 SECTION_NAME (section
));
6364 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
6366 addr
= section
->sh_addr
;
6368 start
= get_data (NULL
, file
, section
->sh_offset
, bytes
, _("section data"));
6380 lbytes
= (bytes
> 16 ? 16 : bytes
);
6382 printf (" 0x%8.8lx ", (unsigned long) addr
);
6384 switch (elf_header
.e_ident
[EI_DATA
])
6388 for (j
= 15; j
>= 0; j
--)
6391 printf ("%2.2x", data
[j
]);
6401 for (j
= 0; j
< 16; j
++)
6404 printf ("%2.2x", data
[j
]);
6414 for (j
= 0; j
< lbytes
; j
++)
6417 if (k
>= ' ' && k
< 0x7f)
6436 static unsigned long int
6437 read_leb128 (unsigned char *data
, int *length_return
, int sign
)
6439 unsigned long int result
= 0;
6440 unsigned int num_read
= 0;
6449 result
|= (byte
& 0x7f) << shift
;
6454 while (byte
& 0x80);
6456 if (length_return
!= NULL
)
6457 *length_return
= num_read
;
6459 if (sign
&& (shift
< 32) && (byte
& 0x40))
6460 result
|= -1 << shift
;
6465 typedef struct State_Machine_Registers
6467 unsigned long address
;
6470 unsigned int column
;
6474 /* This variable hold the number of the last entry seen
6475 in the File Table. */
6476 unsigned int last_file_entry
;
6479 static SMR state_machine_regs
;
6482 reset_state_machine (int is_stmt
)
6484 state_machine_regs
.address
= 0;
6485 state_machine_regs
.file
= 1;
6486 state_machine_regs
.line
= 1;
6487 state_machine_regs
.column
= 0;
6488 state_machine_regs
.is_stmt
= is_stmt
;
6489 state_machine_regs
.basic_block
= 0;
6490 state_machine_regs
.end_sequence
= 0;
6491 state_machine_regs
.last_file_entry
= 0;
6494 /* Handled an extend line op. Returns true if this is the end
6497 process_extended_line_op (unsigned char *data
, int is_stmt
, int pointer_size
)
6499 unsigned char op_code
;
6502 unsigned char *name
;
6505 len
= read_leb128 (data
, & bytes_read
, 0);
6510 warn (_("badly formed extended line op encountered!\n"));
6517 printf (_(" Extended opcode %d: "), op_code
);
6521 case DW_LNE_end_sequence
:
6522 printf (_("End of Sequence\n\n"));
6523 reset_state_machine (is_stmt
);
6526 case DW_LNE_set_address
:
6527 adr
= byte_get (data
, pointer_size
);
6528 printf (_("set Address to 0x%lx\n"), adr
);
6529 state_machine_regs
.address
= adr
;
6532 case DW_LNE_define_file
:
6533 printf (_(" define new File Table entry\n"));
6534 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6536 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
6538 data
+= strlen ((char *) data
) + 1;
6539 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6541 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6543 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6544 printf (_("%s\n\n"), name
);
6548 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
6555 /* Finds section NAME inside FILE and returns a
6556 pointer to it, or NULL upon failure. */
6558 static Elf_Internal_Shdr
*
6559 find_section (const char * name
)
6561 Elf_Internal_Shdr
*sec
;
6564 for (i
= elf_header
.e_shnum
, sec
= section_headers
+ i
- 1;
6566 if (strcmp (SECTION_NAME (sec
), name
) == 0)
6569 if (i
&& sec
&& sec
->sh_size
!= 0)
6575 /* Size of pointers in the .debug_line section. This information is not
6576 really present in that section. It's obtained before dumping the debug
6577 sections by doing some pre-scan of the .debug_info section. */
6578 static unsigned int * debug_line_pointer_sizes
= NULL
;
6579 static unsigned int num_debug_line_pointer_sizes
= 0;
6581 /* Locate and scan the .debug_info section in the file and record the pointer
6582 sizes for the compilation units in it. Usually an executable will have
6583 just one pointer size, but this is not guaranteed, and so we try not to
6584 make any assumptions. Returns zero upon failure, or the number of
6585 compilation units upon success. */
6588 get_debug_line_pointer_sizes (FILE * file
)
6590 Elf_Internal_Shdr
* section
;
6591 unsigned char * start
;
6592 unsigned char * end
;
6593 unsigned char * begin
;
6594 unsigned long length
;
6595 unsigned int num_units
;
6598 section
= find_section (".debug_info");
6599 if (section
== NULL
)
6602 length
= section
->sh_size
;
6603 start
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
6604 _("extracting pointer sizes from .debug_info section"));
6608 end
= start
+ section
->sh_size
;
6609 /* First scan the section to get the number of comp units. */
6610 for (begin
= start
, num_units
= 0; begin
< end
; num_units
++)
6612 /* Read the first 4 bytes. For a 32-bit DWARF section, this will
6613 be the length. For a 64-bit DWARF section, it'll be the escape
6614 code 0xffffffff followed by an 8 byte length. */
6615 length
= byte_get (begin
, 4);
6617 if (length
== 0xffffffff)
6619 length
= byte_get (begin
+ 4, 8);
6620 begin
+= length
+ 12;
6623 begin
+= length
+ 4;
6628 error (_("No comp units in .debug_info section ?"));
6633 /* Then allocate an array to hold the pointer sizes. */
6634 debug_line_pointer_sizes
= malloc (num_units
* sizeof * debug_line_pointer_sizes
);
6635 if (debug_line_pointer_sizes
== NULL
)
6637 error (_("Not enough memory for a pointer size array of %u entries"),
6643 /* Populate the array. */
6644 for (begin
= start
, unit
= 0; begin
< end
; unit
++)
6646 length
= byte_get (begin
, 4);
6647 if (length
== 0xffffffff)
6649 /* For 64-bit DWARF, the 1-byte address_size field is 22 bytes
6650 from the start of the section. This is computed as follows:
6652 unit_length: 12 bytes
6654 debug_abbrev_offset: 8 bytes
6655 -----------------------------
6658 debug_line_pointer_sizes
[unit
] = byte_get (begin
+ 22, 1);
6659 length
= byte_get (begin
+ 4, 8);
6660 begin
+= length
+ 12;
6664 /* For 32-bit DWARF, the 1-byte address_size field is 10 bytes from
6665 the start of the section:
6667 unit_length: 4 bytes
6669 debug_abbrev_offset: 4 bytes
6670 -----------------------------
6673 debug_line_pointer_sizes
[unit
] = byte_get (begin
+ 10, 1);
6674 begin
+= length
+ 4;
6679 num_debug_line_pointer_sizes
= num_units
;
6684 display_debug_lines (Elf_Internal_Shdr
*section
,
6685 unsigned char *start
, FILE *file
)
6687 unsigned char *hdrptr
;
6688 DWARF2_Internal_LineInfo info
;
6689 unsigned char *standard_opcodes
;
6690 unsigned char *data
= start
;
6691 unsigned char *end
= start
+ section
->sh_size
;
6692 unsigned char *end_of_sequence
;
6695 int initial_length_size
;
6696 unsigned int comp_unit
= 0;
6698 printf (_("\nDump of debug contents of section %s:\n\n"),
6699 SECTION_NAME (section
));
6701 if (num_debug_line_pointer_sizes
== 0)
6702 get_debug_line_pointer_sizes (file
);
6706 unsigned int pointer_size
;
6710 /* Check the length of the block. */
6711 info
.li_length
= byte_get (hdrptr
, 4);
6714 if (info
.li_length
== 0xffffffff)
6716 /* This section is 64-bit DWARF 3. */
6717 info
.li_length
= byte_get (hdrptr
, 8);
6720 initial_length_size
= 12;
6725 initial_length_size
= 4;
6728 if (info
.li_length
+ initial_length_size
> section
->sh_size
)
6731 (_("The line info appears to be corrupt - the section is too small\n"));
6735 /* Check its version number. */
6736 info
.li_version
= byte_get (hdrptr
, 2);
6738 if (info
.li_version
!= 2 && info
.li_version
!= 3)
6740 warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
6744 info
.li_prologue_length
= byte_get (hdrptr
, offset_size
);
6745 hdrptr
+= offset_size
;
6746 info
.li_min_insn_length
= byte_get (hdrptr
, 1);
6748 info
.li_default_is_stmt
= byte_get (hdrptr
, 1);
6750 info
.li_line_base
= byte_get (hdrptr
, 1);
6752 info
.li_line_range
= byte_get (hdrptr
, 1);
6754 info
.li_opcode_base
= byte_get (hdrptr
, 1);
6757 /* Sign extend the line base field. */
6758 info
.li_line_base
<<= 24;
6759 info
.li_line_base
>>= 24;
6761 /* Get the pointer size from the comp unit associated
6762 with this block of line number information. */
6763 if (comp_unit
>= num_debug_line_pointer_sizes
)
6765 error (_("Not enough comp units for .debug_lines section\n"));
6770 pointer_size
= debug_line_pointer_sizes
[comp_unit
];
6774 printf (_(" Length: %ld\n"), info
.li_length
);
6775 printf (_(" DWARF Version: %d\n"), info
.li_version
);
6776 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
6777 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
6778 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
6779 printf (_(" Line Base: %d\n"), info
.li_line_base
);
6780 printf (_(" Line Range: %d\n"), info
.li_line_range
);
6781 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
6782 printf (_(" (Pointer size: %u)\n"), pointer_size
);
6784 end_of_sequence
= data
+ info
.li_length
+ initial_length_size
;
6786 reset_state_machine (info
.li_default_is_stmt
);
6788 /* Display the contents of the Opcodes table. */
6789 standard_opcodes
= hdrptr
;
6791 printf (_("\n Opcodes:\n"));
6793 for (i
= 1; i
< info
.li_opcode_base
; i
++)
6794 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
6796 /* Display the contents of the Directory table. */
6797 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
6800 printf (_("\n The Directory Table is empty.\n"));
6803 printf (_("\n The Directory Table:\n"));
6807 printf (_(" %s\n"), data
);
6809 data
+= strlen ((char *) data
) + 1;
6813 /* Skip the NUL at the end of the table. */
6816 /* Display the contents of the File Name table. */
6818 printf (_("\n The File Name Table is empty.\n"));
6821 printf (_("\n The File Name Table:\n"));
6822 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6826 unsigned char *name
;
6829 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
6832 data
+= strlen ((char *) data
) + 1;
6834 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6836 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6838 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6840 printf (_("%s\n"), name
);
6844 /* Skip the NUL at the end of the table. */
6847 /* Now display the statements. */
6848 printf (_("\n Line Number Statements:\n"));
6851 while (data
< end_of_sequence
)
6853 unsigned char op_code
;
6859 if (op_code
>= info
.li_opcode_base
)
6861 op_code
-= info
.li_opcode_base
;
6862 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
6863 state_machine_regs
.address
+= adv
;
6864 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6865 op_code
, adv
, state_machine_regs
.address
);
6866 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
6867 state_machine_regs
.line
+= adv
;
6868 printf (_(" and Line by %d to %d\n"),
6869 adv
, state_machine_regs
.line
);
6871 else switch (op_code
)
6873 case DW_LNS_extended_op
:
6874 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
6879 printf (_(" Copy\n"));
6882 case DW_LNS_advance_pc
:
6883 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
6885 state_machine_regs
.address
+= adv
;
6886 printf (_(" Advance PC by %d to %lx\n"), adv
,
6887 state_machine_regs
.address
);
6890 case DW_LNS_advance_line
:
6891 adv
= read_leb128 (data
, & bytes_read
, 1);
6893 state_machine_regs
.line
+= adv
;
6894 printf (_(" Advance Line by %d to %d\n"), adv
,
6895 state_machine_regs
.line
);
6898 case DW_LNS_set_file
:
6899 adv
= read_leb128 (data
, & bytes_read
, 0);
6901 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6903 state_machine_regs
.file
= adv
;
6906 case DW_LNS_set_column
:
6907 adv
= read_leb128 (data
, & bytes_read
, 0);
6909 printf (_(" Set column to %d\n"), adv
);
6910 state_machine_regs
.column
= adv
;
6913 case DW_LNS_negate_stmt
:
6914 adv
= state_machine_regs
.is_stmt
;
6916 printf (_(" Set is_stmt to %d\n"), adv
);
6917 state_machine_regs
.is_stmt
= adv
;
6920 case DW_LNS_set_basic_block
:
6921 printf (_(" Set basic block\n"));
6922 state_machine_regs
.basic_block
= 1;
6925 case DW_LNS_const_add_pc
:
6926 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
6927 * info
.li_min_insn_length
);
6928 state_machine_regs
.address
+= adv
;
6929 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
6930 state_machine_regs
.address
);
6933 case DW_LNS_fixed_advance_pc
:
6934 adv
= byte_get (data
, 2);
6936 state_machine_regs
.address
+= adv
;
6937 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6938 adv
, state_machine_regs
.address
);
6941 case DW_LNS_set_prologue_end
:
6942 printf (_(" Set prologue_end to true\n"));
6945 case DW_LNS_set_epilogue_begin
:
6946 printf (_(" Set epilogue_begin to true\n"));
6949 case DW_LNS_set_isa
:
6950 adv
= read_leb128 (data
, & bytes_read
, 0);
6952 printf (_(" Set ISA to %d\n"), adv
);
6956 printf (_(" Unknown opcode %d with operands: "), op_code
);
6959 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
6961 printf ("0x%lx%s", read_leb128 (data
, &bytes_read
, 0),
6962 i
== 1 ? "" : ", ");
6977 display_debug_pubnames (Elf_Internal_Shdr
*section
,
6978 unsigned char *start
,
6979 FILE *file ATTRIBUTE_UNUSED
)
6981 DWARF2_Internal_PubNames pubnames
;
6984 end
= start
+ section
->sh_size
;
6986 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6990 unsigned char *data
;
6991 unsigned long offset
;
6992 int offset_size
, initial_length_size
;
6996 pubnames
.pn_length
= byte_get (data
, 4);
6998 if (pubnames
.pn_length
== 0xffffffff)
7000 pubnames
.pn_length
= byte_get (data
, 8);
7003 initial_length_size
= 12;
7008 initial_length_size
= 4;
7011 pubnames
.pn_version
= byte_get (data
, 2);
7013 pubnames
.pn_offset
= byte_get (data
, offset_size
);
7014 data
+= offset_size
;
7015 pubnames
.pn_size
= byte_get (data
, offset_size
);
7016 data
+= offset_size
;
7018 start
+= pubnames
.pn_length
+ initial_length_size
;
7020 if (pubnames
.pn_version
!= 2 && pubnames
.pn_version
!= 3)
7022 static int warned
= 0;
7026 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
7033 printf (_(" Length: %ld\n"),
7034 pubnames
.pn_length
);
7035 printf (_(" Version: %d\n"),
7036 pubnames
.pn_version
);
7037 printf (_(" Offset into .debug_info section: %ld\n"),
7038 pubnames
.pn_offset
);
7039 printf (_(" Size of area in .debug_info section: %ld\n"),
7042 printf (_("\n Offset\tName\n"));
7046 offset
= byte_get (data
, offset_size
);
7050 data
+= offset_size
;
7051 printf (" %-6ld\t\t%s\n", offset
, data
);
7052 data
+= strlen ((char *) data
) + 1;
7055 while (offset
!= 0);
7063 get_TAG_name (unsigned long tag
)
7067 case DW_TAG_padding
: return "DW_TAG_padding";
7068 case DW_TAG_array_type
: return "DW_TAG_array_type";
7069 case DW_TAG_class_type
: return "DW_TAG_class_type";
7070 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
7071 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
7072 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
7073 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
7074 case DW_TAG_label
: return "DW_TAG_label";
7075 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
7076 case DW_TAG_member
: return "DW_TAG_member";
7077 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
7078 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
7079 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
7080 case DW_TAG_string_type
: return "DW_TAG_string_type";
7081 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
7082 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
7083 case DW_TAG_typedef
: return "DW_TAG_typedef";
7084 case DW_TAG_union_type
: return "DW_TAG_union_type";
7085 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
7086 case DW_TAG_variant
: return "DW_TAG_variant";
7087 case DW_TAG_common_block
: return "DW_TAG_common_block";
7088 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
7089 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
7090 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
7091 case DW_TAG_module
: return "DW_TAG_module";
7092 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
7093 case DW_TAG_set_type
: return "DW_TAG_set_type";
7094 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
7095 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
7096 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
7097 case DW_TAG_base_type
: return "DW_TAG_base_type";
7098 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
7099 case DW_TAG_const_type
: return "DW_TAG_const_type";
7100 case DW_TAG_constant
: return "DW_TAG_constant";
7101 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
7102 case DW_TAG_file_type
: return "DW_TAG_file_type";
7103 case DW_TAG_friend
: return "DW_TAG_friend";
7104 case DW_TAG_namelist
: return "DW_TAG_namelist";
7105 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
7106 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
7107 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
7108 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
7109 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
7110 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
7111 case DW_TAG_try_block
: return "DW_TAG_try_block";
7112 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
7113 case DW_TAG_variable
: return "DW_TAG_variable";
7114 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
7115 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
7116 case DW_TAG_format_label
: return "DW_TAG_format_label";
7117 case DW_TAG_function_template
: return "DW_TAG_function_template";
7118 case DW_TAG_class_template
: return "DW_TAG_class_template";
7119 /* DWARF 2.1 values. */
7120 case DW_TAG_dwarf_procedure
: return "DW_TAG_dwarf_procedure";
7121 case DW_TAG_restrict_type
: return "DW_TAG_restrict_type";
7122 case DW_TAG_interface_type
: return "DW_TAG_interface_type";
7123 case DW_TAG_namespace
: return "DW_TAG_namespace";
7124 case DW_TAG_imported_module
: return "DW_TAG_imported_module";
7125 case DW_TAG_unspecified_type
: return "DW_TAG_unspecified_type";
7126 case DW_TAG_partial_unit
: return "DW_TAG_partial_unit";
7127 case DW_TAG_imported_unit
: return "DW_TAG_imported_unit";
7129 case DW_TAG_upc_shared_type
: return "DW_TAG_upc_shared_type";
7130 case DW_TAG_upc_strict_type
: return "DW_TAG_upc_strict_type";
7131 case DW_TAG_upc_relaxed_type
: return "DW_TAG_upc_relaxed_type";
7134 static char buffer
[100];
7136 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
7143 get_AT_name (unsigned long attribute
)
7147 case DW_AT_sibling
: return "DW_AT_sibling";
7148 case DW_AT_location
: return "DW_AT_location";
7149 case DW_AT_name
: return "DW_AT_name";
7150 case DW_AT_ordering
: return "DW_AT_ordering";
7151 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
7152 case DW_AT_byte_size
: return "DW_AT_byte_size";
7153 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
7154 case DW_AT_bit_size
: return "DW_AT_bit_size";
7155 case DW_AT_element_list
: return "DW_AT_element_list";
7156 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
7157 case DW_AT_low_pc
: return "DW_AT_low_pc";
7158 case DW_AT_high_pc
: return "DW_AT_high_pc";
7159 case DW_AT_language
: return "DW_AT_language";
7160 case DW_AT_member
: return "DW_AT_member";
7161 case DW_AT_discr
: return "DW_AT_discr";
7162 case DW_AT_discr_value
: return "DW_AT_discr_value";
7163 case DW_AT_visibility
: return "DW_AT_visibility";
7164 case DW_AT_import
: return "DW_AT_import";
7165 case DW_AT_string_length
: return "DW_AT_string_length";
7166 case DW_AT_common_reference
: return "DW_AT_common_reference";
7167 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
7168 case DW_AT_const_value
: return "DW_AT_const_value";
7169 case DW_AT_containing_type
: return "DW_AT_containing_type";
7170 case DW_AT_default_value
: return "DW_AT_default_value";
7171 case DW_AT_inline
: return "DW_AT_inline";
7172 case DW_AT_is_optional
: return "DW_AT_is_optional";
7173 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
7174 case DW_AT_producer
: return "DW_AT_producer";
7175 case DW_AT_prototyped
: return "DW_AT_prototyped";
7176 case DW_AT_return_addr
: return "DW_AT_return_addr";
7177 case DW_AT_start_scope
: return "DW_AT_start_scope";
7178 case DW_AT_stride_size
: return "DW_AT_stride_size";
7179 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
7180 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
7181 case DW_AT_accessibility
: return "DW_AT_accessibility";
7182 case DW_AT_address_class
: return "DW_AT_address_class";
7183 case DW_AT_artificial
: return "DW_AT_artificial";
7184 case DW_AT_base_types
: return "DW_AT_base_types";
7185 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
7186 case DW_AT_count
: return "DW_AT_count";
7187 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
7188 case DW_AT_decl_column
: return "DW_AT_decl_column";
7189 case DW_AT_decl_file
: return "DW_AT_decl_file";
7190 case DW_AT_decl_line
: return "DW_AT_decl_line";
7191 case DW_AT_declaration
: return "DW_AT_declaration";
7192 case DW_AT_discr_list
: return "DW_AT_discr_list";
7193 case DW_AT_encoding
: return "DW_AT_encoding";
7194 case DW_AT_external
: return "DW_AT_external";
7195 case DW_AT_frame_base
: return "DW_AT_frame_base";
7196 case DW_AT_friend
: return "DW_AT_friend";
7197 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
7198 case DW_AT_macro_info
: return "DW_AT_macro_info";
7199 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
7200 case DW_AT_priority
: return "DW_AT_priority";
7201 case DW_AT_segment
: return "DW_AT_segment";
7202 case DW_AT_specification
: return "DW_AT_specification";
7203 case DW_AT_static_link
: return "DW_AT_static_link";
7204 case DW_AT_type
: return "DW_AT_type";
7205 case DW_AT_use_location
: return "DW_AT_use_location";
7206 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
7207 case DW_AT_virtuality
: return "DW_AT_virtuality";
7208 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
7209 /* DWARF 2.1 values. */
7210 case DW_AT_allocated
: return "DW_AT_allocated";
7211 case DW_AT_associated
: return "DW_AT_associated";
7212 case DW_AT_data_location
: return "DW_AT_data_location";
7213 case DW_AT_stride
: return "DW_AT_stride";
7214 case DW_AT_entry_pc
: return "DW_AT_entry_pc";
7215 case DW_AT_use_UTF8
: return "DW_AT_use_UTF8";
7216 case DW_AT_extension
: return "DW_AT_extension";
7217 case DW_AT_ranges
: return "DW_AT_ranges";
7218 case DW_AT_trampoline
: return "DW_AT_trampoline";
7219 case DW_AT_call_column
: return "DW_AT_call_column";
7220 case DW_AT_call_file
: return "DW_AT_call_file";
7221 case DW_AT_call_line
: return "DW_AT_call_line";
7222 /* SGI/MIPS extensions. */
7223 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
7224 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
7225 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
7226 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
7227 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
7228 case DW_AT_MIPS_software_pipeline_depth
:
7229 return "DW_AT_MIPS_software_pipeline_depth";
7230 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
7231 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
7232 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
7233 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
7234 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
7235 /* GNU extensions. */
7236 case DW_AT_sf_names
: return "DW_AT_sf_names";
7237 case DW_AT_src_info
: return "DW_AT_src_info";
7238 case DW_AT_mac_info
: return "DW_AT_mac_info";
7239 case DW_AT_src_coords
: return "DW_AT_src_coords";
7240 case DW_AT_body_begin
: return "DW_AT_body_begin";
7241 case DW_AT_body_end
: return "DW_AT_body_end";
7242 case DW_AT_GNU_vector
: return "DW_AT_GNU_vector";
7243 /* UPC extension. */
7244 case DW_AT_upc_threads_scaled
: return "DW_AT_upc_threads_scaled";
7247 static char buffer
[100];
7249 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
7256 get_FORM_name (unsigned long form
)
7260 case DW_FORM_addr
: return "DW_FORM_addr";
7261 case DW_FORM_block2
: return "DW_FORM_block2";
7262 case DW_FORM_block4
: return "DW_FORM_block4";
7263 case DW_FORM_data2
: return "DW_FORM_data2";
7264 case DW_FORM_data4
: return "DW_FORM_data4";
7265 case DW_FORM_data8
: return "DW_FORM_data8";
7266 case DW_FORM_string
: return "DW_FORM_string";
7267 case DW_FORM_block
: return "DW_FORM_block";
7268 case DW_FORM_block1
: return "DW_FORM_block1";
7269 case DW_FORM_data1
: return "DW_FORM_data1";
7270 case DW_FORM_flag
: return "DW_FORM_flag";
7271 case DW_FORM_sdata
: return "DW_FORM_sdata";
7272 case DW_FORM_strp
: return "DW_FORM_strp";
7273 case DW_FORM_udata
: return "DW_FORM_udata";
7274 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
7275 case DW_FORM_ref1
: return "DW_FORM_ref1";
7276 case DW_FORM_ref2
: return "DW_FORM_ref2";
7277 case DW_FORM_ref4
: return "DW_FORM_ref4";
7278 case DW_FORM_ref8
: return "DW_FORM_ref8";
7279 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
7280 case DW_FORM_indirect
: return "DW_FORM_indirect";
7283 static char buffer
[100];
7285 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
7291 /* FIXME: There are better and more efficient ways to handle
7292 these structures. For now though, I just want something that
7293 is simple to implement. */
7294 typedef struct abbrev_attr
7296 unsigned long attribute
;
7298 struct abbrev_attr
*next
;
7302 typedef struct abbrev_entry
7304 unsigned long entry
;
7307 struct abbrev_attr
*first_attr
;
7308 struct abbrev_attr
*last_attr
;
7309 struct abbrev_entry
*next
;
7313 static abbrev_entry
*first_abbrev
= NULL
;
7314 static abbrev_entry
*last_abbrev
= NULL
;
7319 abbrev_entry
*abbrev
;
7321 for (abbrev
= first_abbrev
; abbrev
;)
7323 abbrev_entry
*next
= abbrev
->next
;
7326 for (attr
= abbrev
->first_attr
; attr
;)
7328 abbrev_attr
*next
= attr
->next
;
7338 last_abbrev
= first_abbrev
= NULL
;
7342 add_abbrev (unsigned long number
, unsigned long tag
, int children
)
7344 abbrev_entry
*entry
;
7346 entry
= malloc (sizeof (*entry
));
7352 entry
->entry
= number
;
7354 entry
->children
= children
;
7355 entry
->first_attr
= NULL
;
7356 entry
->last_attr
= NULL
;
7359 if (first_abbrev
== NULL
)
7360 first_abbrev
= entry
;
7362 last_abbrev
->next
= entry
;
7364 last_abbrev
= entry
;
7368 add_abbrev_attr (unsigned long attribute
, unsigned long form
)
7372 attr
= malloc (sizeof (*attr
));
7378 attr
->attribute
= attribute
;
7382 if (last_abbrev
->first_attr
== NULL
)
7383 last_abbrev
->first_attr
= attr
;
7385 last_abbrev
->last_attr
->next
= attr
;
7387 last_abbrev
->last_attr
= attr
;
7390 /* Processes the (partial) contents of a .debug_abbrev section.
7391 Returns NULL if the end of the section was encountered.
7392 Returns the address after the last byte read if the end of
7393 an abbreviation set was found. */
7395 static unsigned char *
7396 process_abbrev_section (unsigned char *start
, unsigned char *end
)
7398 if (first_abbrev
!= NULL
)
7404 unsigned long entry
;
7406 unsigned long attribute
;
7409 entry
= read_leb128 (start
, & bytes_read
, 0);
7410 start
+= bytes_read
;
7412 /* A single zero is supposed to end the section according
7413 to the standard. If there's more, then signal that to
7416 return start
== end
? NULL
: start
;
7418 tag
= read_leb128 (start
, & bytes_read
, 0);
7419 start
+= bytes_read
;
7421 children
= *start
++;
7423 add_abbrev (entry
, tag
, children
);
7429 attribute
= read_leb128 (start
, & bytes_read
, 0);
7430 start
+= bytes_read
;
7432 form
= read_leb128 (start
, & bytes_read
, 0);
7433 start
+= bytes_read
;
7436 add_abbrev_attr (attribute
, form
);
7438 while (attribute
!= 0);
7446 display_debug_macinfo (Elf_Internal_Shdr
*section
,
7447 unsigned char *start
,
7448 FILE *file ATTRIBUTE_UNUSED
)
7450 unsigned char *end
= start
+ section
->sh_size
;
7451 unsigned char *curr
= start
;
7452 unsigned int bytes_read
;
7453 enum dwarf_macinfo_record_type op
;
7455 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7459 unsigned int lineno
;
7467 case DW_MACINFO_start_file
:
7469 unsigned int filenum
;
7471 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7473 filenum
= read_leb128 (curr
, & bytes_read
, 0);
7476 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno
, filenum
);
7480 case DW_MACINFO_end_file
:
7481 printf (_(" DW_MACINFO_end_file\n"));
7484 case DW_MACINFO_define
:
7485 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7488 curr
+= strlen (string
) + 1;
7489 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno
, string
);
7492 case DW_MACINFO_undef
:
7493 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7496 curr
+= strlen (string
) + 1;
7497 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno
, string
);
7500 case DW_MACINFO_vendor_ext
:
7502 unsigned int constant
;
7504 constant
= read_leb128 (curr
, & bytes_read
, 0);
7507 curr
+= strlen (string
) + 1;
7508 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant
, string
);
7519 display_debug_abbrev (Elf_Internal_Shdr
*section
,
7520 unsigned char *start
,
7521 FILE *file ATTRIBUTE_UNUSED
)
7523 abbrev_entry
*entry
;
7524 unsigned char *end
= start
+ section
->sh_size
;
7526 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7530 start
= process_abbrev_section (start
, end
);
7532 if (first_abbrev
== NULL
)
7535 printf (_(" Number TAG\n"));
7537 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
7541 printf (_(" %ld %s [%s]\n"),
7543 get_TAG_name (entry
->tag
),
7544 entry
->children
? _("has children") : _("no children"));
7546 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
7548 printf (_(" %-18s %s\n"),
7549 get_AT_name (attr
->attribute
),
7550 get_FORM_name (attr
->form
));
7564 static unsigned char *
7565 display_block (unsigned char *data
, unsigned long length
)
7567 printf (_(" %lu byte block: "), length
);
7570 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
7576 decode_location_expression (unsigned char * data
,
7577 unsigned int pointer_size
,
7578 unsigned long length
)
7582 unsigned long uvalue
;
7583 unsigned char *end
= data
+ length
;
7592 printf ("DW_OP_addr: %lx",
7593 (unsigned long) byte_get (data
, pointer_size
));
7594 data
+= pointer_size
;
7597 printf ("DW_OP_deref");
7600 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
7603 printf ("DW_OP_const1s: %ld", (long) byte_get (data
++, 1));
7606 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
7610 printf ("DW_OP_const2s: %ld", (long) byte_get (data
, 2));
7614 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
7618 printf ("DW_OP_const4s: %ld", (long) byte_get (data
, 4));
7622 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
7623 (unsigned long) byte_get (data
+ 4, 4));
7627 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
7628 (long) byte_get (data
+ 4, 4));
7632 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
7636 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
7640 printf ("DW_OP_dup");
7643 printf ("DW_OP_drop");
7646 printf ("DW_OP_over");
7649 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
7652 printf ("DW_OP_swap");
7655 printf ("DW_OP_rot");
7658 printf ("DW_OP_xderef");
7661 printf ("DW_OP_abs");
7664 printf ("DW_OP_and");
7667 printf ("DW_OP_div");
7670 printf ("DW_OP_minus");
7673 printf ("DW_OP_mod");
7676 printf ("DW_OP_mul");
7679 printf ("DW_OP_neg");
7682 printf ("DW_OP_not");
7685 printf ("DW_OP_or");
7688 printf ("DW_OP_plus");
7690 case DW_OP_plus_uconst
:
7691 printf ("DW_OP_plus_uconst: %lu",
7692 read_leb128 (data
, &bytes_read
, 0));
7696 printf ("DW_OP_shl");
7699 printf ("DW_OP_shr");
7702 printf ("DW_OP_shra");
7705 printf ("DW_OP_xor");
7708 printf ("DW_OP_bra: %ld", (long) byte_get (data
, 2));
7712 printf ("DW_OP_eq");
7715 printf ("DW_OP_ge");
7718 printf ("DW_OP_gt");
7721 printf ("DW_OP_le");
7724 printf ("DW_OP_lt");
7727 printf ("DW_OP_ne");
7730 printf ("DW_OP_skip: %ld", (long) byte_get (data
, 2));
7766 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
7801 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
7836 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
7837 read_leb128 (data
, &bytes_read
, 1));
7842 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
7846 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
7850 uvalue
= read_leb128 (data
, &bytes_read
, 0);
7852 printf ("DW_OP_bregx: %lu %ld", uvalue
,
7853 read_leb128 (data
, &bytes_read
, 1));
7857 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
7860 case DW_OP_deref_size
:
7861 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
7863 case DW_OP_xderef_size
:
7864 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
7867 printf ("DW_OP_nop");
7870 /* DWARF 3 extensions. */
7871 case DW_OP_push_object_address
:
7872 printf ("DW_OP_push_object_address");
7875 printf ("DW_OP_call2: <%lx>", (long) byte_get (data
, 2));
7879 printf ("DW_OP_call4: <%lx>", (long) byte_get (data
, 4));
7882 case DW_OP_call_ref
:
7883 printf ("DW_OP_call_ref");
7886 /* GNU extensions. */
7887 case DW_OP_GNU_push_tls_address
:
7888 printf ("DW_OP_GNU_push_tls_address");
7892 if (op
>= DW_OP_lo_user
7893 && op
<= DW_OP_hi_user
)
7894 printf (_("(User defined location op)"));
7896 printf (_("(Unknown location op)"));
7897 /* No way to tell where the next op is, so just bail. */
7901 /* Separate the ops. */
7907 static const char *debug_loc_contents
;
7908 static bfd_vma debug_loc_size
;
7911 load_debug_loc (FILE *file
)
7913 Elf_Internal_Shdr
*sec
;
7915 /* If it is already loaded, do nothing. */
7916 if (debug_loc_contents
!= NULL
)
7919 /* Locate the .debug_loc section. */
7920 sec
= find_section (".debug_loc");
7924 debug_loc_size
= sec
->sh_size
;
7926 debug_loc_contents
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7927 _("debug_loc section data"));
7931 free_debug_loc (void)
7933 if (debug_loc_contents
== NULL
)
7936 free ((char *) debug_loc_contents
);
7937 debug_loc_contents
= NULL
;
7943 display_debug_loc (Elf_Internal_Shdr
*section
,
7944 unsigned char *start
, FILE *file
)
7946 unsigned char *section_end
;
7947 unsigned long bytes
;
7948 unsigned char *section_begin
= start
;
7950 unsigned int comp_unit
= 0;
7952 addr
= section
->sh_addr
;
7953 bytes
= section
->sh_size
;
7954 section_end
= start
+ bytes
;
7958 printf (_("\nThe .debug_loc section is empty.\n"));
7962 if (num_debug_line_pointer_sizes
== 0)
7963 get_debug_line_pointer_sizes (file
);
7965 printf (_("Contents of the .debug_loc section:\n\n"));
7966 printf (_("\n Offset Begin End Expression\n"));
7968 while (start
< section_end
)
7970 unsigned long begin
;
7972 unsigned short length
;
7973 unsigned long offset
;
7974 unsigned int pointer_size
;
7976 offset
= start
- section_begin
;
7978 /* Get the pointer size from the comp unit associated
7979 with this block of location information. */
7980 if (comp_unit
>= num_debug_line_pointer_sizes
)
7982 error (_("Not enough comp units for .debug_loc section\n"));
7987 pointer_size
= debug_line_pointer_sizes
[comp_unit
];
7993 begin
= byte_get (start
, pointer_size
);
7994 start
+= pointer_size
;
7995 end
= byte_get (start
, pointer_size
);
7996 start
+= pointer_size
;
7998 if (begin
== 0 && end
== 0)
8001 /* For now, skip any base address specifiers. */
8002 if (begin
== 0xffffffff)
8008 length
= byte_get (start
, 2);
8011 printf (" %8.8lx %8.8lx %8.8lx (", offset
, begin
, end
);
8012 decode_location_expression (start
, pointer_size
, length
);
8022 static const char *debug_str_contents
;
8023 static bfd_vma debug_str_size
;
8026 load_debug_str (FILE *file
)
8028 Elf_Internal_Shdr
*sec
;
8030 /* If it is already loaded, do nothing. */
8031 if (debug_str_contents
!= NULL
)
8034 /* Locate the .debug_str section. */
8035 sec
= find_section (".debug_str");
8039 debug_str_size
= sec
->sh_size
;
8041 debug_str_contents
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
8042 _("debug_str section data"));
8046 free_debug_str (void)
8048 if (debug_str_contents
== NULL
)
8051 free ((char *) debug_str_contents
);
8052 debug_str_contents
= NULL
;
8057 fetch_indirect_string (unsigned long offset
)
8059 if (debug_str_contents
== NULL
)
8060 return _("<no .debug_str section>");
8062 if (offset
> debug_str_size
)
8063 return _("<offset is too big>");
8065 return debug_str_contents
+ offset
;
8069 display_debug_str (Elf_Internal_Shdr
*section
,
8070 unsigned char *start
,
8071 FILE *file ATTRIBUTE_UNUSED
)
8073 unsigned long bytes
;
8076 addr
= section
->sh_addr
;
8077 bytes
= section
->sh_size
;
8081 printf (_("\nThe .debug_str section is empty.\n"));
8085 printf (_("Contents of the .debug_str section:\n\n"));
8093 lbytes
= (bytes
> 16 ? 16 : bytes
);
8095 printf (" 0x%8.8lx ", (unsigned long) addr
);
8097 for (j
= 0; j
< 16; j
++)
8100 printf ("%2.2x", start
[j
]);
8108 for (j
= 0; j
< lbytes
; j
++)
8111 if (k
>= ' ' && k
< 0x80)
8127 static unsigned char *
8128 read_and_display_attr_value (unsigned long attribute
,
8130 unsigned char *data
,
8131 unsigned long cu_offset
,
8132 unsigned long pointer_size
,
8133 unsigned long offset_size
,
8136 unsigned long uvalue
= 0;
8137 unsigned char *block_start
= NULL
;
8145 case DW_FORM_ref_addr
:
8146 if (dwarf_version
== 2)
8148 uvalue
= byte_get (data
, pointer_size
);
8149 data
+= pointer_size
;
8151 else if (dwarf_version
== 3)
8153 uvalue
= byte_get (data
, offset_size
);
8154 data
+= offset_size
;
8158 error (_("Internal error: DWARF version is not 2 or 3.\n"));
8163 uvalue
= byte_get (data
, pointer_size
);
8164 data
+= pointer_size
;
8168 uvalue
= byte_get (data
, offset_size
);
8169 data
+= offset_size
;
8175 uvalue
= byte_get (data
++, 1);
8180 uvalue
= byte_get (data
, 2);
8186 uvalue
= byte_get (data
, 4);
8191 uvalue
= read_leb128 (data
, & bytes_read
, 1);
8195 case DW_FORM_ref_udata
:
8197 uvalue
= read_leb128 (data
, & bytes_read
, 0);
8201 case DW_FORM_indirect
:
8202 form
= read_leb128 (data
, & bytes_read
, 0);
8204 printf (" %s", get_FORM_name (form
));
8205 return read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
8206 pointer_size
, offset_size
,
8212 case DW_FORM_ref_addr
:
8213 printf (" <#%lx>", uvalue
);
8219 case DW_FORM_ref_udata
:
8220 printf (" <%lx>", uvalue
+ cu_offset
);
8224 printf (" %#lx", uvalue
);
8233 printf (" %ld", uvalue
);
8238 uvalue
= byte_get (data
, 4);
8239 printf (" %lx", uvalue
);
8240 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
8244 case DW_FORM_string
:
8245 printf (" %s", data
);
8246 data
+= strlen ((char *) data
) + 1;
8250 uvalue
= read_leb128 (data
, & bytes_read
, 0);
8251 block_start
= data
+ bytes_read
;
8252 data
= display_block (block_start
, uvalue
);
8255 case DW_FORM_block1
:
8256 uvalue
= byte_get (data
, 1);
8257 block_start
= data
+ 1;
8258 data
= display_block (block_start
, uvalue
);
8261 case DW_FORM_block2
:
8262 uvalue
= byte_get (data
, 2);
8263 block_start
= data
+ 2;
8264 data
= display_block (block_start
, uvalue
);
8267 case DW_FORM_block4
:
8268 uvalue
= byte_get (data
, 4);
8269 block_start
= data
+ 4;
8270 data
= display_block (block_start
, uvalue
);
8274 printf (_(" (indirect string, offset: 0x%lx): %s"),
8275 uvalue
, fetch_indirect_string (uvalue
));
8278 case DW_FORM_indirect
:
8279 /* Handled above. */
8283 warn (_("Unrecognized form: %d\n"), form
);
8287 /* For some attributes we can display further information. */
8296 case DW_INL_not_inlined
:
8297 printf (_("(not inlined)"));
8299 case DW_INL_inlined
:
8300 printf (_("(inlined)"));
8302 case DW_INL_declared_not_inlined
:
8303 printf (_("(declared as inline but ignored)"));
8305 case DW_INL_declared_inlined
:
8306 printf (_("(declared as inline and inlined)"));
8309 printf (_(" (Unknown inline attribute value: %lx)"), uvalue
);
8314 case DW_AT_language
:
8317 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
8318 case DW_LANG_C89
: printf ("(ANSI C)"); break;
8319 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
8320 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
8321 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
8322 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
8323 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
8324 case DW_LANG_Ada83
: printf ("(Ada)"); break;
8325 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
8326 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
8327 /* DWARF 2.1 values. */
8328 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
8329 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
8330 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
8331 /* MIPS extension. */
8332 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
8333 /* UPC extension. */
8334 case DW_LANG_Upc
: printf ("(Unified Parallel C)"); break;
8336 printf ("(Unknown: %lx)", uvalue
);
8341 case DW_AT_encoding
:
8344 case DW_ATE_void
: printf ("(void)"); break;
8345 case DW_ATE_address
: printf ("(machine address)"); break;
8346 case DW_ATE_boolean
: printf ("(boolean)"); break;
8347 case DW_ATE_complex_float
: printf ("(complex float)"); break;
8348 case DW_ATE_float
: printf ("(float)"); break;
8349 case DW_ATE_signed
: printf ("(signed)"); break;
8350 case DW_ATE_signed_char
: printf ("(signed char)"); break;
8351 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
8352 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
8353 /* DWARF 2.1 value. */
8354 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
8356 if (uvalue
>= DW_ATE_lo_user
8357 && uvalue
<= DW_ATE_hi_user
)
8358 printf ("(user defined type)");
8360 printf ("(unknown type)");
8365 case DW_AT_accessibility
:
8368 case DW_ACCESS_public
: printf ("(public)"); break;
8369 case DW_ACCESS_protected
: printf ("(protected)"); break;
8370 case DW_ACCESS_private
: printf ("(private)"); break;
8372 printf ("(unknown accessibility)");
8377 case DW_AT_visibility
:
8380 case DW_VIS_local
: printf ("(local)"); break;
8381 case DW_VIS_exported
: printf ("(exported)"); break;
8382 case DW_VIS_qualified
: printf ("(qualified)"); break;
8383 default: printf ("(unknown visibility)"); break;
8387 case DW_AT_virtuality
:
8390 case DW_VIRTUALITY_none
: printf ("(none)"); break;
8391 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
8392 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
8393 default: printf ("(unknown virtuality)"); break;
8397 case DW_AT_identifier_case
:
8400 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
8401 case DW_ID_up_case
: printf ("(up_case)"); break;
8402 case DW_ID_down_case
: printf ("(down_case)"); break;
8403 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
8404 default: printf ("(unknown case)"); break;
8408 case DW_AT_calling_convention
:
8411 case DW_CC_normal
: printf ("(normal)"); break;
8412 case DW_CC_program
: printf ("(program)"); break;
8413 case DW_CC_nocall
: printf ("(nocall)"); break;
8415 if (uvalue
>= DW_CC_lo_user
8416 && uvalue
<= DW_CC_hi_user
)
8417 printf ("(user defined)");
8419 printf ("(unknown convention)");
8423 case DW_AT_ordering
:
8426 case -1: printf ("(undefined)"); break;
8427 case 0: printf ("(row major)"); break;
8428 case 1: printf ("(column major)"); break;
8432 case DW_AT_frame_base
:
8433 case DW_AT_location
:
8434 case DW_AT_data_member_location
:
8435 case DW_AT_vtable_elem_location
:
8436 case DW_AT_allocated
:
8437 case DW_AT_associated
:
8438 case DW_AT_data_location
:
8440 case DW_AT_upper_bound
:
8441 case DW_AT_lower_bound
:
8445 decode_location_expression (block_start
, pointer_size
, uvalue
);
8448 else if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
8451 printf ("location list");
8463 static unsigned char *
8464 read_and_display_attr (unsigned long attribute
,
8466 unsigned char *data
,
8467 unsigned long cu_offset
,
8468 unsigned long pointer_size
,
8469 unsigned long offset_size
,
8472 printf (" %-18s:", get_AT_name (attribute
));
8473 data
= read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
8474 pointer_size
, offset_size
, dwarf_version
);
8480 display_debug_info (Elf_Internal_Shdr
*section
,
8481 unsigned char *start
,
8484 unsigned char *end
= start
+ section
->sh_size
;
8485 unsigned char *section_begin
= start
;
8487 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
8489 load_debug_str (file
);
8490 load_debug_loc (file
);
8494 DWARF2_Internal_CompUnit compunit
;
8495 Elf_Internal_Shdr
*relsec
;
8496 unsigned char *hdrptr
;
8497 unsigned char *cu_abbrev_offset_ptr
;
8498 unsigned char *tags
;
8500 unsigned long cu_offset
;
8502 int initial_length_size
;
8506 compunit
.cu_length
= byte_get (hdrptr
, 4);
8509 if (compunit
.cu_length
== 0xffffffff)
8511 compunit
.cu_length
= byte_get (hdrptr
, 8);
8514 initial_length_size
= 12;
8519 initial_length_size
= 4;
8522 compunit
.cu_version
= byte_get (hdrptr
, 2);
8525 /* Apply addends of RELA relocations. */
8526 for (relsec
= section_headers
;
8527 relsec
< section_headers
+ elf_header
.e_shnum
;
8530 unsigned long nrelas
;
8531 Elf_Internal_Rela
*rela
, *rp
;
8532 Elf_Internal_Shdr
*symsec
;
8533 Elf_Internal_Sym
*symtab
;
8534 Elf_Internal_Sym
*sym
;
8536 if (relsec
->sh_type
!= SHT_RELA
8537 || SECTION_HEADER (relsec
->sh_info
) != section
8538 || relsec
->sh_size
== 0)
8541 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
8545 symsec
= SECTION_HEADER (relsec
->sh_link
);
8546 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
8548 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
8552 if (rp
->r_offset
>= (bfd_vma
) (hdrptr
- section_begin
)
8553 && section
->sh_size
> (bfd_vma
) offset_size
8554 && rp
->r_offset
<= section
->sh_size
- offset_size
)
8555 loc
= section_begin
+ rp
->r_offset
;
8561 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
8563 if (ELF32_R_SYM (rp
->r_info
) != 0
8564 && ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
8566 warn (_("Skipping unexpected symbol type %u\n"),
8567 ELF32_ST_TYPE (sym
->st_info
));
8573 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
8575 if (ELF64_R_SYM (rp
->r_info
) != 0
8576 && ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
8578 warn (_("Skipping unexpected symbol type %u\n"),
8579 ELF64_ST_TYPE (sym
->st_info
));
8584 byte_put (loc
, rp
->r_addend
, offset_size
);
8591 cu_abbrev_offset_ptr
= hdrptr
;
8592 compunit
.cu_abbrev_offset
= byte_get (hdrptr
, offset_size
);
8593 hdrptr
+= offset_size
;
8595 compunit
.cu_pointer_size
= byte_get (hdrptr
, 1);
8599 cu_offset
= start
- section_begin
;
8600 start
+= compunit
.cu_length
+ initial_length_size
;
8602 printf (_(" Compilation Unit @ %lx:\n"), cu_offset
);
8603 printf (_(" Length: %ld\n"), compunit
.cu_length
);
8604 printf (_(" Version: %d\n"), compunit
.cu_version
);
8605 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
8606 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
8608 if (compunit
.cu_version
!= 2 && compunit
.cu_version
!= 3)
8610 warn (_("Only version 2 and 3 DWARF debug information is currently supported.\n"));
8616 /* Read in the abbrevs used by this compilation unit. */
8618 Elf_Internal_Shdr
*sec
;
8619 unsigned char *begin
;
8621 /* Locate the .debug_abbrev section and process it. */
8622 sec
= find_section (".debug_abbrev");
8625 warn (_("Unable to locate .debug_abbrev section!\n"));
8629 begin
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
8630 _("debug_abbrev section data"));
8634 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
8635 begin
+ sec
->sh_size
);
8641 while (tags
< start
)
8644 unsigned long abbrev_number
;
8645 abbrev_entry
*entry
;
8648 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
8651 /* A null DIE marks the end of a list of children. */
8652 if (abbrev_number
== 0)
8658 /* Scan through the abbreviation list until we reach the
8660 for (entry
= first_abbrev
;
8661 entry
&& entry
->entry
!= abbrev_number
;
8662 entry
= entry
->next
)
8667 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
8672 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
8674 (unsigned long) (tags
- section_begin
- bytes_read
),
8676 get_TAG_name (entry
->tag
));
8678 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
8679 tags
= read_and_display_attr (attr
->attribute
,
8682 compunit
.cu_pointer_size
,
8684 compunit
.cu_version
);
8686 if (entry
->children
)
8700 display_debug_aranges (Elf_Internal_Shdr
*section
,
8701 unsigned char *start
,
8702 FILE *file ATTRIBUTE_UNUSED
)
8704 unsigned char *end
= start
+ section
->sh_size
;
8706 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
8710 unsigned char *hdrptr
;
8711 DWARF2_Internal_ARange arange
;
8712 unsigned char *ranges
;
8713 unsigned long length
;
8714 unsigned long address
;
8717 int initial_length_size
;
8721 arange
.ar_length
= byte_get (hdrptr
, 4);
8724 if (arange
.ar_length
== 0xffffffff)
8726 arange
.ar_length
= byte_get (hdrptr
, 8);
8729 initial_length_size
= 12;
8734 initial_length_size
= 4;
8737 arange
.ar_version
= byte_get (hdrptr
, 2);
8740 arange
.ar_info_offset
= byte_get (hdrptr
, offset_size
);
8741 hdrptr
+= offset_size
;
8743 arange
.ar_pointer_size
= byte_get (hdrptr
, 1);
8746 arange
.ar_segment_size
= byte_get (hdrptr
, 1);
8749 if (arange
.ar_version
!= 2 && arange
.ar_version
!= 3)
8751 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
8755 printf (_(" Length: %ld\n"), arange
.ar_length
);
8756 printf (_(" Version: %d\n"), arange
.ar_version
);
8757 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
8758 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
8759 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
8761 printf (_("\n Address Length\n"));
8765 /* Must pad to an alignment boundary that is twice the pointer size. */
8766 excess
= (hdrptr
- start
) % (2 * arange
.ar_pointer_size
);
8768 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
8772 address
= byte_get (ranges
, arange
.ar_pointer_size
);
8774 ranges
+= arange
.ar_pointer_size
;
8776 length
= byte_get (ranges
, arange
.ar_pointer_size
);
8778 ranges
+= arange
.ar_pointer_size
;
8780 /* A pair of zeros marks the end of the list. */
8781 if (address
== 0 && length
== 0)
8784 printf (" %8.8lx %lu\n", address
, length
);
8787 start
+= arange
.ar_length
+ initial_length_size
;
8795 typedef struct Frame_Chunk
8797 struct Frame_Chunk
*next
;
8798 unsigned char *chunk_start
;
8800 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
8801 short int *col_type
;
8804 unsigned int code_factor
;
8806 unsigned long pc_begin
;
8807 unsigned long pc_range
;
8811 unsigned char fde_encoding
;
8812 unsigned char cfa_exp
;
8816 /* A marker for a col_type that means this column was never referenced
8817 in the frame info. */
8818 #define DW_CFA_unreferenced (-1)
8821 frame_need_space (Frame_Chunk
*fc
, int reg
)
8823 int prev
= fc
->ncols
;
8825 if (reg
< fc
->ncols
)
8828 fc
->ncols
= reg
+ 1;
8829 fc
->col_type
= xrealloc (fc
->col_type
, fc
->ncols
* sizeof (short int));
8830 fc
->col_offset
= xrealloc (fc
->col_offset
, fc
->ncols
* sizeof (int));
8832 while (prev
< fc
->ncols
)
8834 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
8835 fc
->col_offset
[prev
] = 0;
8841 frame_display_row (Frame_Chunk
*fc
, int *need_col_headers
, int *max_regs
)
8846 if (*max_regs
< fc
->ncols
)
8847 *max_regs
= fc
->ncols
;
8849 if (*need_col_headers
)
8851 *need_col_headers
= 0;
8853 printf (" LOC CFA ");
8855 for (r
= 0; r
< *max_regs
; r
++)
8856 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
8861 printf ("r%-4d", r
);
8867 printf ("%08lx ", fc
->pc_begin
);
8869 strcpy (tmp
, "exp");
8871 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
8872 printf ("%-8s ", tmp
);
8874 for (r
= 0; r
< fc
->ncols
; r
++)
8876 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
8878 switch (fc
->col_type
[r
])
8880 case DW_CFA_undefined
:
8883 case DW_CFA_same_value
:
8887 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
8889 case DW_CFA_register
:
8890 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
8892 case DW_CFA_expression
:
8893 strcpy (tmp
, "exp");
8896 strcpy (tmp
, "n/a");
8899 printf ("%-5s", tmp
);
8906 size_of_encoded_value (int encoding
)
8908 switch (encoding
& 0x7)
8911 case 0: return is_32bit_elf
? 4 : 8;
8919 get_encoded_value (unsigned char *data
, int encoding
)
8921 int size
= size_of_encoded_value (encoding
);
8922 if (encoding
& DW_EH_PE_signed
)
8923 return byte_get_signed (data
, size
);
8925 return byte_get (data
, size
);
8928 #define GET(N) byte_get (start, N); start += N
8929 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
8930 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
8933 display_debug_frames (Elf_Internal_Shdr
*section
,
8934 unsigned char *start
,
8935 FILE *file ATTRIBUTE_UNUSED
)
8937 unsigned char *end
= start
+ section
->sh_size
;
8938 unsigned char *section_start
= start
;
8939 Frame_Chunk
*chunks
= 0;
8940 Frame_Chunk
*remembered_state
= 0;
8942 int is_eh
= (strcmp (SECTION_NAME (section
), ".eh_frame") == 0);
8945 int addr_size
= is_32bit_elf
? 4 : 8;
8947 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
8951 unsigned char *saved_start
;
8952 unsigned char *block_end
;
8953 unsigned long length
;
8954 unsigned long cie_id
;
8957 int need_col_headers
= 1;
8958 unsigned char *augmentation_data
= NULL
;
8959 unsigned long augmentation_data_len
= 0;
8960 int encoded_ptr_size
= addr_size
;
8962 int initial_length_size
;
8964 saved_start
= start
;
8965 length
= byte_get (start
, 4); start
+= 4;
8969 printf ("\n%08lx ZERO terminator\n\n",
8970 (unsigned long)(saved_start
- section_start
));
8974 if (length
== 0xffffffff)
8976 length
= byte_get (start
, 8);
8979 initial_length_size
= 12;
8984 initial_length_size
= 4;
8987 block_end
= saved_start
+ length
+ initial_length_size
;
8988 cie_id
= byte_get (start
, offset_size
); start
+= offset_size
;
8990 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
8994 fc
= xmalloc (sizeof (Frame_Chunk
));
8995 memset (fc
, 0, sizeof (Frame_Chunk
));
8999 fc
->chunk_start
= saved_start
;
9001 fc
->col_type
= xmalloc (sizeof (short int));
9002 fc
->col_offset
= xmalloc (sizeof (int));
9003 frame_need_space (fc
, max_regs
-1);
9007 fc
->augmentation
= start
;
9008 start
= strchr (start
, '\0') + 1;
9010 if (fc
->augmentation
[0] == 'z')
9012 fc
->code_factor
= LEB ();
9013 fc
->data_factor
= SLEB ();
9022 augmentation_data_len
= LEB ();
9023 augmentation_data
= start
;
9024 start
+= augmentation_data_len
;
9026 else if (strcmp (fc
->augmentation
, "eh") == 0)
9029 fc
->code_factor
= LEB ();
9030 fc
->data_factor
= SLEB ();
9042 fc
->code_factor
= LEB ();
9043 fc
->data_factor
= SLEB ();
9055 if (do_debug_frames_interp
)
9056 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
9057 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
9058 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
9062 printf ("\n%08lx %08lx %08lx CIE\n",
9063 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
9064 printf (" Version: %d\n", version
);
9065 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
9066 printf (" Code alignment factor: %u\n", fc
->code_factor
);
9067 printf (" Data alignment factor: %d\n", fc
->data_factor
);
9068 printf (" Return address column: %d\n", fc
->ra
);
9070 if (augmentation_data_len
)
9073 printf (" Augmentation data: ");
9074 for (i
= 0; i
< augmentation_data_len
; ++i
)
9075 printf (" %02x", augmentation_data
[i
]);
9081 if (augmentation_data_len
)
9083 unsigned char *p
, *q
;
9084 p
= fc
->augmentation
+ 1;
9085 q
= augmentation_data
;
9092 q
+= 1 + size_of_encoded_value (*q
);
9094 fc
->fde_encoding
= *q
++;
9100 if (fc
->fde_encoding
)
9101 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
9104 frame_need_space (fc
, fc
->ra
);
9108 unsigned char *look_for
;
9109 static Frame_Chunk fde_fc
;
9112 memset (fc
, 0, sizeof (Frame_Chunk
));
9114 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
9116 for (cie
= chunks
; cie
; cie
= cie
->next
)
9117 if (cie
->chunk_start
== look_for
)
9122 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
9123 cie_id
, saved_start
);
9126 fc
->col_type
= xmalloc (sizeof (short int));
9127 fc
->col_offset
= xmalloc (sizeof (int));
9128 frame_need_space (fc
, max_regs
- 1);
9130 fc
->augmentation
= "";
9131 fc
->fde_encoding
= 0;
9135 fc
->ncols
= cie
->ncols
;
9136 fc
->col_type
= xmalloc (fc
->ncols
* sizeof (short int));
9137 fc
->col_offset
= xmalloc (fc
->ncols
* sizeof (int));
9138 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
9139 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
9140 fc
->augmentation
= cie
->augmentation
;
9141 fc
->code_factor
= cie
->code_factor
;
9142 fc
->data_factor
= cie
->data_factor
;
9143 fc
->cfa_reg
= cie
->cfa_reg
;
9144 fc
->cfa_offset
= cie
->cfa_offset
;
9146 frame_need_space (fc
, max_regs
-1);
9147 fc
->fde_encoding
= cie
->fde_encoding
;
9150 if (fc
->fde_encoding
)
9151 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
9153 fc
->pc_begin
= get_encoded_value (start
, fc
->fde_encoding
);
9154 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
)
9155 fc
->pc_begin
+= section
->sh_addr
+ (start
- section_start
);
9156 start
+= encoded_ptr_size
;
9157 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
9158 start
+= encoded_ptr_size
;
9160 if (cie
->augmentation
[0] == 'z')
9162 augmentation_data_len
= LEB ();
9163 augmentation_data
= start
;
9164 start
+= augmentation_data_len
;
9167 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
9168 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
9169 (unsigned long)(cie
->chunk_start
- section_start
),
9170 fc
->pc_begin
, fc
->pc_begin
+ fc
->pc_range
);
9171 if (! do_debug_frames_interp
&& augmentation_data_len
)
9174 printf (" Augmentation data: ");
9175 for (i
= 0; i
< augmentation_data_len
; ++i
)
9176 printf (" %02x", augmentation_data
[i
]);
9182 /* At this point, fc is the current chunk, cie (if any) is set, and we're
9183 about to interpret instructions for the chunk. */
9184 /* ??? At present we need to do this always, since this sizes the
9185 fc->col_type and fc->col_offset arrays, which we write into always.
9186 We should probably split the interpreted and non-interpreted bits
9187 into two different routines, since there's so much that doesn't
9188 really overlap between them. */
9189 if (1 || do_debug_frames_interp
)
9191 /* Start by making a pass over the chunk, allocating storage
9192 and taking note of what registers are used. */
9193 unsigned char *tmp
= start
;
9195 while (start
< block_end
)
9198 unsigned long reg
, tmp
;
9205 /* Warning: if you add any more cases to this switch, be
9206 sure to add them to the corresponding switch below. */
9209 case DW_CFA_advance_loc
:
9213 frame_need_space (fc
, opa
);
9214 fc
->col_type
[opa
] = DW_CFA_undefined
;
9216 case DW_CFA_restore
:
9217 frame_need_space (fc
, opa
);
9218 fc
->col_type
[opa
] = DW_CFA_undefined
;
9220 case DW_CFA_set_loc
:
9221 start
+= encoded_ptr_size
;
9223 case DW_CFA_advance_loc1
:
9226 case DW_CFA_advance_loc2
:
9229 case DW_CFA_advance_loc4
:
9232 case DW_CFA_offset_extended
:
9233 reg
= LEB (); LEB ();
9234 frame_need_space (fc
, reg
);
9235 fc
->col_type
[reg
] = DW_CFA_undefined
;
9237 case DW_CFA_restore_extended
:
9239 frame_need_space (fc
, reg
);
9240 fc
->col_type
[reg
] = DW_CFA_undefined
;
9242 case DW_CFA_undefined
:
9244 frame_need_space (fc
, reg
);
9245 fc
->col_type
[reg
] = DW_CFA_undefined
;
9247 case DW_CFA_same_value
:
9249 frame_need_space (fc
, reg
);
9250 fc
->col_type
[reg
] = DW_CFA_undefined
;
9252 case DW_CFA_register
:
9253 reg
= LEB (); LEB ();
9254 frame_need_space (fc
, reg
);
9255 fc
->col_type
[reg
] = DW_CFA_undefined
;
9257 case DW_CFA_def_cfa
:
9260 case DW_CFA_def_cfa_register
:
9263 case DW_CFA_def_cfa_offset
:
9266 case DW_CFA_def_cfa_expression
:
9270 case DW_CFA_expression
:
9274 frame_need_space (fc
, reg
);
9275 fc
->col_type
[reg
] = DW_CFA_undefined
;
9277 case DW_CFA_offset_extended_sf
:
9278 reg
= LEB (); SLEB ();
9279 frame_need_space (fc
, reg
);
9280 fc
->col_type
[reg
] = DW_CFA_undefined
;
9282 case DW_CFA_def_cfa_sf
:
9285 case DW_CFA_def_cfa_offset_sf
:
9288 case DW_CFA_MIPS_advance_loc8
:
9291 case DW_CFA_GNU_args_size
:
9294 case DW_CFA_GNU_negative_offset_extended
:
9295 reg
= LEB (); LEB ();
9296 frame_need_space (fc
, reg
);
9297 fc
->col_type
[reg
] = DW_CFA_undefined
;
9306 /* Now we know what registers are used, make a second pass over
9307 the chunk, this time actually printing out the info. */
9309 while (start
< block_end
)
9312 unsigned long ul
, reg
, roffs
;
9321 /* Warning: if you add any more cases to this switch, be
9322 sure to add them to the corresponding switch above. */
9325 case DW_CFA_advance_loc
:
9326 if (do_debug_frames_interp
)
9327 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9329 printf (" DW_CFA_advance_loc: %d to %08lx\n",
9330 opa
* fc
->code_factor
,
9331 fc
->pc_begin
+ opa
* fc
->code_factor
);
9332 fc
->pc_begin
+= opa
* fc
->code_factor
;
9337 if (! do_debug_frames_interp
)
9338 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
9339 opa
, roffs
* fc
->data_factor
);
9340 fc
->col_type
[opa
] = DW_CFA_offset
;
9341 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
9344 case DW_CFA_restore
:
9345 if (! do_debug_frames_interp
)
9346 printf (" DW_CFA_restore: r%d\n", opa
);
9347 fc
->col_type
[opa
] = cie
->col_type
[opa
];
9348 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
9351 case DW_CFA_set_loc
:
9352 vma
= get_encoded_value (start
, fc
->fde_encoding
);
9353 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
)
9354 vma
+= section
->sh_addr
+ (start
- section_start
);
9355 start
+= encoded_ptr_size
;
9356 if (do_debug_frames_interp
)
9357 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9359 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
9363 case DW_CFA_advance_loc1
:
9364 ofs
= byte_get (start
, 1); start
+= 1;
9365 if (do_debug_frames_interp
)
9366 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9368 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
9369 ofs
* fc
->code_factor
,
9370 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9371 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9374 case DW_CFA_advance_loc2
:
9375 ofs
= byte_get (start
, 2); start
+= 2;
9376 if (do_debug_frames_interp
)
9377 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9379 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
9380 ofs
* fc
->code_factor
,
9381 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9382 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9385 case DW_CFA_advance_loc4
:
9386 ofs
= byte_get (start
, 4); start
+= 4;
9387 if (do_debug_frames_interp
)
9388 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9390 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
9391 ofs
* fc
->code_factor
,
9392 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9393 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9396 case DW_CFA_offset_extended
:
9399 if (! do_debug_frames_interp
)
9400 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
9401 reg
, roffs
* fc
->data_factor
);
9402 fc
->col_type
[reg
] = DW_CFA_offset
;
9403 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
9406 case DW_CFA_restore_extended
:
9408 if (! do_debug_frames_interp
)
9409 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
9410 fc
->col_type
[reg
] = cie
->col_type
[reg
];
9411 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
9414 case DW_CFA_undefined
:
9416 if (! do_debug_frames_interp
)
9417 printf (" DW_CFA_undefined: r%ld\n", reg
);
9418 fc
->col_type
[reg
] = DW_CFA_undefined
;
9419 fc
->col_offset
[reg
] = 0;
9422 case DW_CFA_same_value
:
9424 if (! do_debug_frames_interp
)
9425 printf (" DW_CFA_same_value: r%ld\n", reg
);
9426 fc
->col_type
[reg
] = DW_CFA_same_value
;
9427 fc
->col_offset
[reg
] = 0;
9430 case DW_CFA_register
:
9433 if (! do_debug_frames_interp
)
9434 printf (" DW_CFA_register: r%ld in r%ld\n", reg
, roffs
);
9435 fc
->col_type
[reg
] = DW_CFA_register
;
9436 fc
->col_offset
[reg
] = roffs
;
9439 case DW_CFA_remember_state
:
9440 if (! do_debug_frames_interp
)
9441 printf (" DW_CFA_remember_state\n");
9442 rs
= xmalloc (sizeof (Frame_Chunk
));
9443 rs
->ncols
= fc
->ncols
;
9444 rs
->col_type
= xmalloc (rs
->ncols
* sizeof (short int));
9445 rs
->col_offset
= xmalloc (rs
->ncols
* sizeof (int));
9446 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
9447 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
9448 rs
->next
= remembered_state
;
9449 remembered_state
= rs
;
9452 case DW_CFA_restore_state
:
9453 if (! do_debug_frames_interp
)
9454 printf (" DW_CFA_restore_state\n");
9455 rs
= remembered_state
;
9458 remembered_state
= rs
->next
;
9459 frame_need_space (fc
, rs
->ncols
-1);
9460 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
9461 memcpy (fc
->col_offset
, rs
->col_offset
,
9462 rs
->ncols
* sizeof (int));
9463 free (rs
->col_type
);
9464 free (rs
->col_offset
);
9467 else if (do_debug_frames_interp
)
9468 printf ("Mismatched DW_CFA_restore_state\n");
9471 case DW_CFA_def_cfa
:
9472 fc
->cfa_reg
= LEB ();
9473 fc
->cfa_offset
= LEB ();
9475 if (! do_debug_frames_interp
)
9476 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
9477 fc
->cfa_reg
, fc
->cfa_offset
);
9480 case DW_CFA_def_cfa_register
:
9481 fc
->cfa_reg
= LEB ();
9483 if (! do_debug_frames_interp
)
9484 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
9487 case DW_CFA_def_cfa_offset
:
9488 fc
->cfa_offset
= LEB ();
9489 if (! do_debug_frames_interp
)
9490 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
9494 if (! do_debug_frames_interp
)
9495 printf (" DW_CFA_nop\n");
9498 case DW_CFA_def_cfa_expression
:
9500 if (! do_debug_frames_interp
)
9502 printf (" DW_CFA_def_cfa_expression (");
9503 decode_location_expression (start
, addr_size
, ul
);
9510 case DW_CFA_expression
:
9513 if (! do_debug_frames_interp
)
9515 printf (" DW_CFA_expression: r%ld (", reg
);
9516 decode_location_expression (start
, addr_size
, ul
);
9519 fc
->col_type
[reg
] = DW_CFA_expression
;
9523 case DW_CFA_offset_extended_sf
:
9526 frame_need_space (fc
, reg
);
9527 if (! do_debug_frames_interp
)
9528 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
9529 reg
, l
* fc
->data_factor
);
9530 fc
->col_type
[reg
] = DW_CFA_offset
;
9531 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
9534 case DW_CFA_def_cfa_sf
:
9535 fc
->cfa_reg
= LEB ();
9536 fc
->cfa_offset
= SLEB ();
9538 if (! do_debug_frames_interp
)
9539 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
9540 fc
->cfa_reg
, fc
->cfa_offset
);
9543 case DW_CFA_def_cfa_offset_sf
:
9544 fc
->cfa_offset
= SLEB ();
9545 if (! do_debug_frames_interp
)
9546 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc
->cfa_offset
);
9549 case DW_CFA_MIPS_advance_loc8
:
9550 ofs
= byte_get (start
, 8); start
+= 8;
9551 if (do_debug_frames_interp
)
9552 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9554 printf (" DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
9555 ofs
* fc
->code_factor
,
9556 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9557 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9560 case DW_CFA_GNU_window_save
:
9561 if (! do_debug_frames_interp
)
9562 printf (" DW_CFA_GNU_window_save\n");
9565 case DW_CFA_GNU_args_size
:
9567 if (! do_debug_frames_interp
)
9568 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
9571 case DW_CFA_GNU_negative_offset_extended
:
9574 frame_need_space (fc
, reg
);
9575 if (! do_debug_frames_interp
)
9576 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
9577 reg
, l
* fc
->data_factor
);
9578 fc
->col_type
[reg
] = DW_CFA_offset
;
9579 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
9583 fprintf (stderr
, "unsupported or unknown DW_CFA_%d\n", op
);
9588 if (do_debug_frames_interp
)
9589 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9604 display_debug_not_supported (Elf_Internal_Shdr
*section
,
9605 unsigned char *start ATTRIBUTE_UNUSED
,
9606 FILE *file ATTRIBUTE_UNUSED
)
9608 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
9609 SECTION_NAME (section
));
9614 /* A structure containing the name of a debug section
9615 and a pointer to a function that can decode it. */
9618 const char *const name
;
9619 int (*display
) (Elf_Internal_Shdr
*, unsigned char *, FILE *);
9623 { ".debug_abbrev", display_debug_abbrev
},
9624 { ".debug_aranges", display_debug_aranges
},
9625 { ".debug_frame", display_debug_frames
},
9626 { ".debug_info", display_debug_info
},
9627 { ".debug_line", display_debug_lines
},
9628 { ".debug_pubnames", display_debug_pubnames
},
9629 { ".eh_frame", display_debug_frames
},
9630 { ".debug_macinfo", display_debug_macinfo
},
9631 { ".debug_str", display_debug_str
},
9632 { ".debug_loc", display_debug_loc
},
9633 { ".debug_pubtypes", display_debug_pubnames
},
9634 { ".debug_ranges", display_debug_not_supported
},
9635 { ".debug_static_func", display_debug_not_supported
},
9636 { ".debug_static_vars", display_debug_not_supported
},
9637 { ".debug_types", display_debug_not_supported
},
9638 { ".debug_weaknames", display_debug_not_supported
}
9642 display_debug_section (Elf_Internal_Shdr
*section
, FILE *file
)
9644 char *name
= SECTION_NAME (section
);
9645 bfd_size_type length
;
9646 unsigned char *start
;
9649 length
= section
->sh_size
;
9652 printf (_("\nSection '%s' has no debugging data.\n"), name
);
9656 start
= get_data (NULL
, file
, section
->sh_offset
, length
,
9657 _("debug section data"));
9661 /* See if we know how to display the contents of this section. */
9662 if (strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
9663 name
= ".debug_info";
9665 for (i
= NUM_ELEM (debug_displays
); i
--;)
9666 if (strcmp (debug_displays
[i
].name
, name
) == 0)
9668 debug_displays
[i
].display (section
, start
, file
);
9673 printf (_("Unrecognized debug section: %s\n"), name
);
9677 /* If we loaded in the abbrev section at some point,
9678 we must release it here. */
9685 process_section_contents (FILE *file
)
9687 Elf_Internal_Shdr
*section
;
9693 for (i
= 0, section
= section_headers
;
9694 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
9697 #ifdef SUPPORT_DISASSEMBLY
9698 if (dump_sects
[i
] & DISASS_DUMP
)
9699 disassemble_section (section
, file
);
9701 if (dump_sects
[i
] & HEX_DUMP
)
9702 dump_section (section
, file
);
9704 if (dump_sects
[i
] & DEBUG_DUMP
)
9705 display_debug_section (section
, file
);
9708 if (i
< num_dump_sects
)
9709 warn (_("Some sections were not dumped because they do not exist!\n"));
9715 process_mips_fpe_exception (int mask
)
9720 if (mask
& OEX_FPU_INEX
)
9721 fputs ("INEX", stdout
), first
= 0;
9722 if (mask
& OEX_FPU_UFLO
)
9723 printf ("%sUFLO", first
? "" : "|"), first
= 0;
9724 if (mask
& OEX_FPU_OFLO
)
9725 printf ("%sOFLO", first
? "" : "|"), first
= 0;
9726 if (mask
& OEX_FPU_DIV0
)
9727 printf ("%sDIV0", first
? "" : "|"), first
= 0;
9728 if (mask
& OEX_FPU_INVAL
)
9729 printf ("%sINVAL", first
? "" : "|");
9732 fputs ("0", stdout
);
9736 process_mips_specific (FILE *file
)
9738 Elf_Internal_Dyn
*entry
;
9739 size_t liblist_offset
= 0;
9740 size_t liblistno
= 0;
9741 size_t conflictsno
= 0;
9742 size_t options_offset
= 0;
9743 size_t conflicts_offset
= 0;
9745 /* We have a lot of special sections. Thanks SGI! */
9746 if (dynamic_section
== NULL
)
9747 /* No information available. */
9750 for (entry
= dynamic_section
; entry
->d_tag
!= DT_NULL
; ++entry
)
9751 switch (entry
->d_tag
)
9753 case DT_MIPS_LIBLIST
:
9755 = offset_from_vma (file
, entry
->d_un
.d_val
,
9756 liblistno
* sizeof (Elf32_External_Lib
));
9758 case DT_MIPS_LIBLISTNO
:
9759 liblistno
= entry
->d_un
.d_val
;
9761 case DT_MIPS_OPTIONS
:
9762 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
9764 case DT_MIPS_CONFLICT
:
9766 = offset_from_vma (file
, entry
->d_un
.d_val
,
9767 conflictsno
* sizeof (Elf32_External_Conflict
));
9769 case DT_MIPS_CONFLICTNO
:
9770 conflictsno
= entry
->d_un
.d_val
;
9776 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
9778 Elf32_External_Lib
*elib
;
9781 elib
= get_data (NULL
, file
, liblist_offset
,
9782 liblistno
* sizeof (Elf32_External_Lib
),
9786 printf ("\nSection '.liblist' contains %lu entries:\n",
9787 (unsigned long) liblistno
);
9788 fputs (" Library Time Stamp Checksum Version Flags\n",
9791 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
9798 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9799 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9800 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9801 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9802 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9804 tmp
= gmtime (&time
);
9805 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
9806 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9807 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9809 printf ("%3lu: ", (unsigned long) cnt
);
9810 print_symbol (20, dynamic_strings
+ liblist
.l_name
);
9811 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
9814 if (liblist
.l_flags
== 0)
9825 { " EXACT_MATCH", LL_EXACT_MATCH
},
9826 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
9827 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
9828 { " EXPORTS", LL_EXPORTS
},
9829 { " DELAY_LOAD", LL_DELAY_LOAD
},
9830 { " DELTA", LL_DELTA
}
9832 int flags
= liblist
.l_flags
;
9836 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
9838 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
9840 fputs (l_flags_vals
[fcnt
].name
, stdout
);
9841 flags
^= l_flags_vals
[fcnt
].bit
;
9844 printf (" %#x", (unsigned int) flags
);
9854 if (options_offset
!= 0)
9856 Elf_External_Options
*eopt
;
9857 Elf_Internal_Shdr
*sect
= section_headers
;
9858 Elf_Internal_Options
*iopt
;
9859 Elf_Internal_Options
*option
;
9863 /* Find the section header so that we get the size. */
9864 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
9867 eopt
= get_data (NULL
, file
, options_offset
, sect
->sh_size
,
9871 iopt
= malloc ((sect
->sh_size
/ sizeof (eopt
)) * sizeof (*iopt
));
9874 error (_("Out of memory"));
9881 while (offset
< sect
->sh_size
)
9883 Elf_External_Options
*eoption
;
9885 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
9887 option
->kind
= BYTE_GET (eoption
->kind
);
9888 option
->size
= BYTE_GET (eoption
->size
);
9889 option
->section
= BYTE_GET (eoption
->section
);
9890 option
->info
= BYTE_GET (eoption
->info
);
9892 offset
+= option
->size
;
9898 printf (_("\nSection '%s' contains %d entries:\n"),
9899 SECTION_NAME (sect
), cnt
);
9907 switch (option
->kind
)
9910 /* This shouldn't happen. */
9911 printf (" NULL %d %lx", option
->section
, option
->info
);
9914 printf (" REGINFO ");
9915 if (elf_header
.e_machine
== EM_MIPS
)
9918 Elf32_External_RegInfo
*ereg
;
9919 Elf32_RegInfo reginfo
;
9921 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
9922 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9923 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9924 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9925 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9926 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9927 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9929 printf ("GPR %08lx GP 0x%lx\n",
9931 (unsigned long) reginfo
.ri_gp_value
);
9932 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9933 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9934 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9939 Elf64_External_RegInfo
*ereg
;
9940 Elf64_Internal_RegInfo reginfo
;
9942 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
9943 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9944 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9945 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9946 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9947 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9948 reginfo
.ri_gp_value
= BYTE_GET8 (ereg
->ri_gp_value
);
9950 printf ("GPR %08lx GP 0x",
9951 reginfo
.ri_gprmask
);
9952 printf_vma (reginfo
.ri_gp_value
);
9955 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9956 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9957 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9961 case ODK_EXCEPTIONS
:
9962 fputs (" EXCEPTIONS fpe_min(", stdout
);
9963 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
9964 fputs (") fpe_max(", stdout
);
9965 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
9966 fputs (")", stdout
);
9968 if (option
->info
& OEX_PAGE0
)
9969 fputs (" PAGE0", stdout
);
9970 if (option
->info
& OEX_SMM
)
9971 fputs (" SMM", stdout
);
9972 if (option
->info
& OEX_FPDBUG
)
9973 fputs (" FPDBUG", stdout
);
9974 if (option
->info
& OEX_DISMISS
)
9975 fputs (" DISMISS", stdout
);
9978 fputs (" PAD ", stdout
);
9979 if (option
->info
& OPAD_PREFIX
)
9980 fputs (" PREFIX", stdout
);
9981 if (option
->info
& OPAD_POSTFIX
)
9982 fputs (" POSTFIX", stdout
);
9983 if (option
->info
& OPAD_SYMBOL
)
9984 fputs (" SYMBOL", stdout
);
9987 fputs (" HWPATCH ", stdout
);
9988 if (option
->info
& OHW_R4KEOP
)
9989 fputs (" R4KEOP", stdout
);
9990 if (option
->info
& OHW_R8KPFETCH
)
9991 fputs (" R8KPFETCH", stdout
);
9992 if (option
->info
& OHW_R5KEOP
)
9993 fputs (" R5KEOP", stdout
);
9994 if (option
->info
& OHW_R5KCVTL
)
9995 fputs (" R5KCVTL", stdout
);
9998 fputs (" FILL ", stdout
);
9999 /* XXX Print content of info word? */
10002 fputs (" TAGS ", stdout
);
10003 /* XXX Print content of info word? */
10006 fputs (" HWAND ", stdout
);
10007 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
10008 fputs (" R4KEOP_CHECKED", stdout
);
10009 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
10010 fputs (" R4KEOP_CLEAN", stdout
);
10013 fputs (" HWOR ", stdout
);
10014 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
10015 fputs (" R4KEOP_CHECKED", stdout
);
10016 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
10017 fputs (" R4KEOP_CLEAN", stdout
);
10020 printf (" GP_GROUP %#06lx self-contained %#06lx",
10021 option
->info
& OGP_GROUP
,
10022 (option
->info
& OGP_SELF
) >> 16);
10025 printf (" IDENT %#06lx self-contained %#06lx",
10026 option
->info
& OGP_GROUP
,
10027 (option
->info
& OGP_SELF
) >> 16);
10030 /* This shouldn't happen. */
10031 printf (" %3d ??? %d %lx",
10032 option
->kind
, option
->section
, option
->info
);
10036 len
= sizeof (*eopt
);
10037 while (len
< option
->size
)
10038 if (((char *) option
)[len
] >= ' '
10039 && ((char *) option
)[len
] < 0x7f)
10040 printf ("%c", ((char *) option
)[len
++]);
10042 printf ("\\%03o", ((char *) option
)[len
++]);
10044 fputs ("\n", stdout
);
10052 if (conflicts_offset
!= 0 && conflictsno
!= 0)
10054 Elf32_Conflict
*iconf
;
10057 if (dynamic_symbols
== NULL
)
10059 error (_("conflict list found without a dynamic symbol table"));
10063 iconf
= malloc (conflictsno
* sizeof (*iconf
));
10066 error (_("Out of memory"));
10072 Elf32_External_Conflict
*econf32
;
10074 econf32
= get_data (NULL
, file
, conflicts_offset
,
10075 conflictsno
* sizeof (*econf32
), _("conflict"));
10079 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10080 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
10086 Elf64_External_Conflict
*econf64
;
10088 econf64
= get_data (NULL
, file
, conflicts_offset
,
10089 conflictsno
* sizeof (*econf64
), _("conflict"));
10093 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10094 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
10099 printf (_("\nSection '.conflict' contains %lu entries:\n"),
10100 (unsigned long) conflictsno
);
10101 puts (_(" Num: Index Value Name"));
10103 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10105 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
10107 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
10108 print_vma (psym
->st_value
, FULL_HEX
);
10110 print_symbol (25, dynamic_strings
+ psym
->st_name
);
10121 process_gnu_liblist (FILE *file
)
10123 Elf_Internal_Shdr
*section
, *string_sec
;
10124 Elf32_External_Lib
*elib
;
10132 for (i
= 0, section
= section_headers
;
10133 i
< elf_header
.e_shnum
;
10136 switch (section
->sh_type
)
10138 case SHT_GNU_LIBLIST
:
10139 elib
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
10144 string_sec
= SECTION_HEADER (section
->sh_link
);
10146 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
10147 string_sec
->sh_size
, _("liblist string table"));
10150 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
10156 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
10157 SECTION_NAME (section
),
10158 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
10160 puts (" Library Time Stamp Checksum Version Flags");
10162 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
10170 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
10171 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
10172 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
10173 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
10174 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
10176 tmp
= gmtime (&time
);
10177 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
10178 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
10179 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
10181 printf ("%3lu: ", (unsigned long) cnt
);
10183 printf ("%-20s", strtab
+ liblist
.l_name
);
10185 printf ("%-20.20s", strtab
+ liblist
.l_name
);
10186 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
10187 liblist
.l_version
, liblist
.l_flags
);
10197 static const char *
10198 get_note_type (unsigned e_type
)
10200 static char buff
[64];
10204 case NT_AUXV
: return _("NT_AUXV (auxiliary vector)");
10205 case NT_PRSTATUS
: return _("NT_PRSTATUS (prstatus structure)");
10206 case NT_FPREGSET
: return _("NT_FPREGSET (floating point registers)");
10207 case NT_PRPSINFO
: return _("NT_PRPSINFO (prpsinfo structure)");
10208 case NT_TASKSTRUCT
: return _("NT_TASKSTRUCT (task structure)");
10209 case NT_PRXFPREG
: return _("NT_PRXFPREG (user_xfpregs structure)");
10210 case NT_PSTATUS
: return _("NT_PSTATUS (pstatus structure)");
10211 case NT_FPREGS
: return _("NT_FPREGS (floating point registers)");
10212 case NT_PSINFO
: return _("NT_PSINFO (psinfo structure)");
10213 case NT_LWPSTATUS
: return _("NT_LWPSTATUS (lwpstatus_t structure)");
10214 case NT_LWPSINFO
: return _("NT_LWPSINFO (lwpsinfo_t structure)");
10215 case NT_WIN32PSTATUS
: return _("NT_WIN32PSTATUS (win32_pstatus structure)");
10217 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
10222 static const char *
10223 get_netbsd_elfcore_note_type (unsigned e_type
)
10225 static char buff
[64];
10227 if (e_type
== NT_NETBSDCORE_PROCINFO
)
10229 /* NetBSD core "procinfo" structure. */
10230 return _("NetBSD procinfo structure");
10233 /* As of Jan 2002 there are no other machine-independent notes
10234 defined for NetBSD core files. If the note type is less
10235 than the start of the machine-dependent note types, we don't
10238 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
10240 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
10244 switch (elf_header
.e_machine
)
10246 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
10247 and PT_GETFPREGS == mach+2. */
10252 case EM_SPARC32PLUS
:
10256 case NT_NETBSDCORE_FIRSTMACH
+0:
10257 return _("PT_GETREGS (reg structure)");
10258 case NT_NETBSDCORE_FIRSTMACH
+2:
10259 return _("PT_GETFPREGS (fpreg structure)");
10265 /* On all other arch's, PT_GETREGS == mach+1 and
10266 PT_GETFPREGS == mach+3. */
10270 case NT_NETBSDCORE_FIRSTMACH
+1:
10271 return _("PT_GETREGS (reg structure)");
10272 case NT_NETBSDCORE_FIRSTMACH
+3:
10273 return _("PT_GETFPREGS (fpreg structure)");
10279 sprintf (buff
, _("PT_FIRSTMACH+%d"), e_type
- NT_NETBSDCORE_FIRSTMACH
);
10283 /* Note that by the ELF standard, the name field is already null byte
10284 terminated, and namesz includes the terminating null byte.
10285 I.E. the value of namesz for the name "FSF" is 4.
10287 If the value of namesz is zero, there is no name present. */
10289 process_note (Elf_Internal_Note
*pnote
)
10293 if (pnote
->namesz
== 0)
10295 /* If there is no note name, then use the default set of
10296 note type strings. */
10297 nt
= get_note_type (pnote
->type
);
10299 else if (strncmp (pnote
->namedata
, "NetBSD-CORE", 11) == 0)
10301 /* NetBSD-specific core file notes. */
10302 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
10306 /* Don't recognize this note name; just use the default set of
10307 note type strings. */
10308 nt
= get_note_type (pnote
->type
);
10311 printf (" %s\t\t0x%08lx\t%s\n",
10312 pnote
->namesz
? pnote
->namedata
: "(NONE)",
10313 pnote
->descsz
, nt
);
10319 process_corefile_note_segment (FILE *file
, bfd_vma offset
, bfd_vma length
)
10321 Elf_External_Note
*pnotes
;
10322 Elf_External_Note
*external
;
10328 pnotes
= get_data (NULL
, file
, offset
, length
, _("notes"));
10334 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
10335 (unsigned long) offset
, (unsigned long) length
);
10336 printf (_(" Owner\t\tData size\tDescription\n"));
10338 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
10340 Elf_External_Note
*next
;
10341 Elf_Internal_Note inote
;
10344 inote
.type
= BYTE_GET (external
->type
);
10345 inote
.namesz
= BYTE_GET (external
->namesz
);
10346 inote
.namedata
= external
->name
;
10347 inote
.descsz
= BYTE_GET (external
->descsz
);
10348 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
10349 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
10351 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
10353 if (((char *) next
) > (((char *) pnotes
) + length
))
10355 warn (_("corrupt note found at offset %x into core notes\n"),
10356 ((char *) external
) - ((char *) pnotes
));
10357 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
10358 inote
.type
, inote
.namesz
, inote
.descsz
);
10364 /* Verify that name is null terminated. It appears that at least
10365 one version of Linux (RedHat 6.0) generates corefiles that don't
10366 comply with the ELF spec by failing to include the null byte in
10368 if (inote
.namedata
[inote
.namesz
] != '\0')
10370 temp
= malloc (inote
.namesz
+ 1);
10374 error (_("Out of memory\n"));
10379 strncpy (temp
, inote
.namedata
, inote
.namesz
);
10380 temp
[inote
.namesz
] = 0;
10382 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
10383 inote
.namedata
= temp
;
10386 res
&= process_note (& inote
);
10401 process_corefile_note_segments (FILE *file
)
10403 Elf_Internal_Phdr
*segment
;
10407 if (! get_program_headers (file
))
10410 for (i
= 0, segment
= program_headers
;
10411 i
< elf_header
.e_phnum
;
10414 if (segment
->p_type
== PT_NOTE
)
10415 res
&= process_corefile_note_segment (file
,
10416 (bfd_vma
) segment
->p_offset
,
10417 (bfd_vma
) segment
->p_filesz
);
10424 process_corefile_contents (FILE *file
)
10426 /* If we have not been asked to display the notes then do nothing. */
10430 /* If file is not a core file then exit. */
10431 if (elf_header
.e_type
!= ET_CORE
)
10434 /* No program headers means no NOTE segment. */
10435 if (elf_header
.e_phnum
== 0)
10437 printf (_("No note segments present in the core file.\n"));
10441 return process_corefile_note_segments (file
);
10445 process_arch_specific (FILE *file
)
10450 switch (elf_header
.e_machine
)
10453 case EM_MIPS_RS3_LE
:
10454 return process_mips_specific (file
);
10463 get_file_header (FILE *file
)
10465 /* Read in the identity array. */
10466 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
10469 /* Determine how to read the rest of the header. */
10470 switch (elf_header
.e_ident
[EI_DATA
])
10472 default: /* fall through */
10473 case ELFDATANONE
: /* fall through */
10475 byte_get
= byte_get_little_endian
;
10476 byte_put
= byte_put_little_endian
;
10479 byte_get
= byte_get_big_endian
;
10480 byte_put
= byte_put_big_endian
;
10484 /* For now we only support 32 bit and 64 bit ELF files. */
10485 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
10487 /* Read in the rest of the header. */
10490 Elf32_External_Ehdr ehdr32
;
10492 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
10495 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
10496 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
10497 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
10498 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
10499 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
10500 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
10501 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
10502 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
10503 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
10504 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
10505 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
10506 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
10507 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
10511 Elf64_External_Ehdr ehdr64
;
10513 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10514 we will not be able to cope with the 64bit data found in
10515 64 ELF files. Detect this now and abort before we start
10516 overwriting things. */
10517 if (sizeof (bfd_vma
) < 8)
10519 error (_("This instance of readelf has been built without support for a\n\
10520 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10524 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
10527 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
10528 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
10529 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
10530 elf_header
.e_entry
= BYTE_GET8 (ehdr64
.e_entry
);
10531 elf_header
.e_phoff
= BYTE_GET8 (ehdr64
.e_phoff
);
10532 elf_header
.e_shoff
= BYTE_GET8 (ehdr64
.e_shoff
);
10533 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
10534 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
10535 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
10536 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
10537 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
10538 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
10539 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
10542 if (elf_header
.e_shoff
)
10544 /* There may be some extensions in the first section header. Don't
10545 bomb if we can't read it. */
10547 get_32bit_section_headers (file
, 1);
10549 get_64bit_section_headers (file
, 1);
10555 /* Process one ELF object file according to the command line options.
10556 This file may actually be stored in an archive. The file is
10557 positioned at the start of the ELF object. */
10560 process_object (char *file_name
, FILE *file
)
10564 if (! get_file_header (file
))
10566 error (_("%s: Failed to read file header\n"), file_name
);
10570 /* Initialise per file variables. */
10571 for (i
= NUM_ELEM (version_info
); i
--;)
10572 version_info
[i
] = 0;
10574 for (i
= NUM_ELEM (dynamic_info
); i
--;)
10575 dynamic_info
[i
] = 0;
10577 /* Process the file. */
10579 printf (_("\nFile: %s\n"), file_name
);
10581 if (! process_file_header ())
10584 if (! process_section_headers (file
)
10585 || ! process_section_groups (file
))
10587 /* Without loaded section headers and section groups we
10588 cannot process lots of things. */
10589 do_unwind
= do_version
= do_dump
= do_arch
= 0;
10591 if (! do_using_dynamic
)
10592 do_syms
= do_reloc
= 0;
10595 if (process_program_headers (file
))
10596 process_dynamic_section (file
);
10598 process_relocs (file
);
10600 process_unwind (file
);
10602 process_symbol_table (file
);
10604 process_syminfo (file
);
10606 process_version_sections (file
);
10608 process_section_contents (file
);
10610 process_corefile_contents (file
);
10612 process_gnu_liblist (file
);
10614 process_arch_specific (file
);
10616 if (program_headers
)
10618 free (program_headers
);
10619 program_headers
= NULL
;
10622 if (section_headers
)
10624 free (section_headers
);
10625 section_headers
= NULL
;
10630 free (string_table
);
10631 string_table
= NULL
;
10632 string_table_length
= 0;
10635 if (dynamic_strings
)
10637 free (dynamic_strings
);
10638 dynamic_strings
= NULL
;
10641 if (dynamic_symbols
)
10643 free (dynamic_symbols
);
10644 dynamic_symbols
= NULL
;
10645 num_dynamic_syms
= 0;
10648 if (dynamic_syminfo
)
10650 free (dynamic_syminfo
);
10651 dynamic_syminfo
= NULL
;
10654 if (section_headers_groups
)
10656 free (section_headers_groups
);
10657 section_headers_groups
= NULL
;
10660 if (section_groups
)
10662 struct group_list
*g
, *next
;
10664 for (i
= 0; i
< group_count
; i
++)
10666 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
10673 free (section_groups
);
10674 section_groups
= NULL
;
10680 /* Process an ELF archive. The file is positioned just after the
10684 process_archive (char *file_name
, FILE *file
)
10686 struct ar_hdr arhdr
;
10688 unsigned long size
;
10689 char *longnames
= NULL
;
10690 unsigned long longnames_size
= 0;
10691 size_t file_name_size
;
10696 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10697 if (got
!= sizeof arhdr
)
10702 error (_("%s: failed to read archive header\n"), file_name
);
10706 if (memcmp (arhdr
.ar_name
, "/ ", 16) == 0)
10708 /* This is the archive symbol table. Skip it.
10709 FIXME: We should have an option to dump it. */
10710 size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10711 if (fseek (file
, size
+ (size
& 1), SEEK_CUR
) != 0)
10713 error (_("%s: failed to skip archive symbol table\n"), file_name
);
10717 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10718 if (got
!= sizeof arhdr
)
10723 error (_("%s: failed to read archive header\n"), file_name
);
10728 if (memcmp (arhdr
.ar_name
, "// ", 16) == 0)
10730 /* This is the archive string table holding long member
10733 longnames_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10735 longnames
= malloc (longnames_size
);
10736 if (longnames
== NULL
)
10738 error (_("Out of memory\n"));
10742 if (fread (longnames
, longnames_size
, 1, file
) != 1)
10745 error(_("%s: failed to read string table\n"), file_name
);
10749 if ((longnames_size
& 1) != 0)
10752 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10753 if (got
!= sizeof arhdr
)
10760 error (_("%s: failed to read archive header\n"), file_name
);
10765 file_name_size
= strlen (file_name
);
10774 if (arhdr
.ar_name
[0] == '/')
10778 off
= strtoul (arhdr
.ar_name
+ 1, NULL
, 10);
10779 if (off
>= longnames_size
)
10781 error (_("%s: invalid archive string table offset %lu\n"), off
);
10786 name
= longnames
+ off
;
10787 nameend
= memchr (name
, '/', longnames_size
- off
);
10791 name
= arhdr
.ar_name
;
10792 nameend
= memchr (name
, '/', 16);
10795 if (nameend
== NULL
)
10797 error (_("%s: bad archive file name\n"));
10802 namealc
= malloc (file_name_size
+ (nameend
- name
) + 3);
10803 if (namealc
== NULL
)
10805 error (_("Out of memory\n"));
10810 memcpy (namealc
, file_name
, file_name_size
);
10811 namealc
[file_name_size
] = '(';
10812 memcpy (namealc
+ file_name_size
+ 1, name
, nameend
- name
);
10813 namealc
[file_name_size
+ 1 + (nameend
- name
)] = ')';
10814 namealc
[file_name_size
+ 2 + (nameend
- name
)] = '\0';
10816 archive_file_offset
= ftell (file
);
10817 archive_file_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10819 ret
|= process_object (namealc
, file
);
10824 (archive_file_offset
10825 + archive_file_size
10826 + (archive_file_size
& 1)),
10829 error (_("%s: failed to seek to next archive header\n"), file_name
);
10834 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10835 if (got
!= sizeof arhdr
)
10840 error (_("%s: failed to read archive header\n"), file_name
);
10846 if (longnames
!= 0)
10853 process_file (char *file_name
)
10856 struct stat statbuf
;
10857 char armag
[SARMAG
];
10860 if (stat (file_name
, &statbuf
) < 0)
10862 if (errno
== ENOENT
)
10863 error (_("'%s': No such file\n"), file_name
);
10865 error (_("Could not locate '%s'. System error message: %s\n"),
10866 file_name
, strerror (errno
));
10870 if (! S_ISREG (statbuf
.st_mode
))
10872 error (_("'%s' is not an ordinary file\n"), file_name
);
10876 file
= fopen (file_name
, "rb");
10879 error (_("Input file '%s' is not readable.\n"), file_name
);
10883 if (fread (armag
, SARMAG
, 1, file
) != 1)
10885 error (_("%s: Failed to read file header\n"), file_name
);
10890 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
10891 ret
= process_archive (file_name
, file
);
10895 archive_file_size
= archive_file_offset
= 0;
10896 ret
= process_object (file_name
, file
);
10904 #ifdef SUPPORT_DISASSEMBLY
10905 /* Needed by the i386 disassembler. For extra credit, someone could
10906 fix this so that we insert symbolic addresses here, esp for GOT/PLT
10910 print_address (unsigned int addr
, FILE *outfile
)
10912 fprintf (outfile
,"0x%8.8x", addr
);
10915 /* Needed by the i386 disassembler. */
10917 db_task_printsym (unsigned int addr
)
10919 print_address (addr
, stderr
);
10924 main (int argc
, char **argv
)
10927 char *cmdline_dump_sects
= NULL
;
10928 unsigned num_cmdline_dump_sects
= 0;
10930 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
10931 setlocale (LC_MESSAGES
, "");
10933 #if defined (HAVE_SETLOCALE)
10934 setlocale (LC_CTYPE
, "");
10936 bindtextdomain (PACKAGE
, LOCALEDIR
);
10937 textdomain (PACKAGE
);
10939 parse_args (argc
, argv
);
10941 if (optind
< (argc
- 1))
10944 /* When processing more than one file remember the dump requests
10945 issued on command line to reset them after each file. */
10946 if (optind
+ 1 < argc
&& dump_sects
!= NULL
)
10948 cmdline_dump_sects
= malloc (num_dump_sects
);
10949 if (cmdline_dump_sects
== NULL
)
10950 error (_("Out of memory allocating dump request table."));
10953 memcpy (cmdline_dump_sects
, dump_sects
, num_dump_sects
);
10954 num_cmdline_dump_sects
= num_dump_sects
;
10959 while (optind
< argc
)
10961 err
|= process_file (argv
[optind
++]);
10963 /* Reset dump requests. */
10964 if (optind
< argc
&& dump_sects
!= NULL
)
10966 num_dump_sects
= num_cmdline_dump_sects
;
10967 if (num_cmdline_dump_sects
> 0)
10968 memcpy (dump_sects
, cmdline_dump_sects
, num_cmdline_dump_sects
);
10972 if (dump_sects
!= NULL
)
10974 if (cmdline_dump_sects
!= NULL
)
10975 free (cmdline_dump_sects
);