1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3 2008 Free Software Foundation, Inc.
5 Originally developed by Eric Youngdale <eric@andante.jic.com>
6 Modifications by Nick Clifton <nickc@redhat.com>
8 This file is part of GNU Binutils.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
25 /* The difference between readelf and objdump:
27 Both programs are capable of displaying the contents of ELF format files,
28 so why does the binutils project have two file dumpers ?
30 The reason is that objdump sees an ELF file through a BFD filter of the
31 world; if BFD has a bug where, say, it disagrees about a machine constant
32 in e_flags, then the odds are good that it will remain internally
33 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
34 GAS sees it the BFD way. There was need for a tool to go find out what
35 the file actually says.
37 This is why the readelf program does not link against the BFD library - it
38 exists as an independent program to help verify the correct working of BFD.
40 There is also the case that readelf can provide more information about an
41 ELF file than is provided by objdump. In particular it can display DWARF
42 debugging information which (at the moment) objdump cannot. */
56 # ifdef HAVE_SYS_PARAM_H
57 # include <sys/param.h>
61 # define PATH_MAX MAXPATHLEN
63 # define PATH_MAX 1024
69 /* Define BFD64 here, even if our default architecture is 32 bit ELF
70 as this will allow us to read in and parse 64bit and 32bit ELF files.
71 Only do this if we believe that the compiler can support a 64 bit
72 data type. For now we only rely on GCC being able to do this. */
80 #include "elf/common.h"
81 #include "elf/external.h"
82 #include "elf/internal.h"
85 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
86 we can obtain the H8 reloc numbers. We need these for the
87 get_reloc_size() function. We include h8.h again after defining
88 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
93 /* Undo the effects of #including reloc-macros.h. */
95 #undef START_RELOC_NUMBERS
99 #undef END_RELOC_NUMBERS
100 #undef _RELOC_MACROS_H
102 /* The following headers use the elf/reloc-macros.h file to
103 automatically generate relocation recognition functions
104 such as elf_mips_reloc_type() */
106 #define RELOC_MACROS_GEN_FUNC
108 #include "elf/alpha.h"
112 #include "elf/bfin.h"
113 #include "elf/cr16.h"
114 #include "elf/cris.h"
116 #include "elf/d10v.h"
117 #include "elf/d30v.h"
119 #include "elf/fr30.h"
122 #include "elf/hppa.h"
123 #include "elf/i386.h"
124 #include "elf/i370.h"
125 #include "elf/i860.h"
126 #include "elf/i960.h"
127 #include "elf/ia64.h"
128 #include "elf/ip2k.h"
129 #include "elf/iq2000.h"
130 #include "elf/m32c.h"
131 #include "elf/m32r.h"
132 #include "elf/m68k.h"
133 #include "elf/m68hc11.h"
134 #include "elf/mcore.h"
136 #include "elf/mips.h"
137 #include "elf/mmix.h"
138 #include "elf/mn10200.h"
139 #include "elf/mn10300.h"
141 #include "elf/msp430.h"
142 #include "elf/or32.h"
145 #include "elf/ppc64.h"
146 #include "elf/s390.h"
147 #include "elf/score.h"
149 #include "elf/sparc.h"
151 #include "elf/v850.h"
153 #include "elf/x86-64.h"
154 #include "elf/xstormy16.h"
155 #include "elf/xtensa.h"
160 #include "libiberty.h"
161 #include "safe-ctype.h"
163 char *program_name
= "readelf";
164 static long archive_file_offset
;
165 static unsigned long archive_file_size
;
166 static unsigned long dynamic_addr
;
167 static bfd_size_type dynamic_size
;
168 static unsigned int dynamic_nent
;
169 static char *dynamic_strings
;
170 static unsigned long dynamic_strings_length
;
171 static char *string_table
;
172 static unsigned long string_table_length
;
173 static unsigned long num_dynamic_syms
;
174 static Elf_Internal_Sym
*dynamic_symbols
;
175 static Elf_Internal_Syminfo
*dynamic_syminfo
;
176 static unsigned long dynamic_syminfo_offset
;
177 static unsigned int dynamic_syminfo_nent
;
178 static char program_interpreter
[PATH_MAX
];
179 static bfd_vma dynamic_info
[DT_JMPREL
+ 1];
180 static bfd_vma dynamic_info_DT_GNU_HASH
;
181 static bfd_vma version_info
[16];
182 static Elf_Internal_Ehdr elf_header
;
183 static Elf_Internal_Shdr
*section_headers
;
184 static Elf_Internal_Phdr
*program_headers
;
185 static Elf_Internal_Dyn
*dynamic_section
;
186 static Elf_Internal_Shdr
*symtab_shndx_hdr
;
187 static int show_name
;
188 static int do_dynamic
;
191 static int do_sections
;
192 static int do_section_groups
;
193 static int do_section_details
;
194 static int do_segments
;
195 static int do_unwind
;
196 static int do_using_dynamic
;
197 static int do_header
;
199 static int do_version
;
201 static int do_histogram
;
202 static int do_debugging
;
205 static int do_archive_index
;
206 static int is_32bit_elf
;
210 struct group_list
*next
;
211 unsigned int section_index
;
216 struct group_list
*root
;
217 unsigned int group_index
;
220 static size_t group_count
;
221 static struct group
*section_groups
;
222 static struct group
**section_headers_groups
;
225 /* Flag bits indicating particular types of dump. */
226 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
227 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
228 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
229 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
231 typedef unsigned char dump_type
;
233 /* A linked list of the section names for which dumps were requested. */
234 struct dump_list_entry
238 struct dump_list_entry
*next
;
240 static struct dump_list_entry
*dump_sects_byname
;
242 /* A dynamic array of flags indicating for which sections a dump
243 has been requested via command line switches. */
244 static dump_type
* cmdline_dump_sects
= NULL
;
245 static unsigned int num_cmdline_dump_sects
= 0;
247 /* A dynamic array of flags indicating for which sections a dump of
248 some kind has been requested. It is reset on a per-object file
249 basis and then initialised from the cmdline_dump_sects array,
250 the results of interpreting the -w switch, and the
251 dump_sects_byname list. */
252 static dump_type
* dump_sects
= NULL
;
253 static unsigned int num_dump_sects
= 0;
256 /* How to print a vma value. */
257 typedef enum print_mode
269 static void (*byte_put
) (unsigned char *, bfd_vma
, int);
273 #define SECTION_NAME(X) \
274 ((X) == NULL ? "<none>" \
275 : string_table == NULL ? "<no-name>" \
276 : ((X)->sh_name >= string_table_length ? "<corrupt>" \
277 : string_table + (X)->sh_name))
279 /* Given st_shndx I, map to section_headers index. */
280 #define SECTION_HEADER_INDEX(I) \
281 ((I) < SHN_LORESERVE \
283 : ((I) <= SHN_HIRESERVE \
285 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
287 /* Reverse of the above. */
288 #define SECTION_HEADER_NUM(N) \
289 ((N) < SHN_LORESERVE \
291 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
293 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
295 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
297 #define BYTE_GET(field) byte_get (field, sizeof (field))
299 #define GET_ELF_SYMBOLS(file, section) \
300 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
301 : get_64bit_elf_symbols (file, section))
303 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
304 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
305 already been called and verified that the string exists. */
306 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
308 /* This is just a bit of syntatic sugar. */
309 #define streq(a,b) (strcmp ((a), (b)) == 0)
310 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
311 #define const_strneq(a,b) (strncmp ((a), (b), sizeof (b) - 1) == 0)
314 get_data (void *var
, FILE *file
, long offset
, size_t size
, size_t nmemb
,
319 if (size
== 0 || nmemb
== 0)
322 if (fseek (file
, archive_file_offset
+ offset
, SEEK_SET
))
324 error (_("Unable to seek to 0x%lx for %s\n"),
325 archive_file_offset
+ offset
, reason
);
332 /* Check for overflow. */
333 if (nmemb
< (~(size_t) 0 - 1) / size
)
334 /* + 1 so that we can '\0' terminate invalid string table sections. */
335 mvar
= malloc (size
* nmemb
+ 1);
339 error (_("Out of memory allocating 0x%lx bytes for %s\n"),
340 (unsigned long)(size
* nmemb
), reason
);
344 ((char *) mvar
)[size
* nmemb
] = '\0';
347 if (fread (mvar
, size
, nmemb
, file
) != nmemb
)
349 error (_("Unable to read in 0x%lx bytes of %s\n"),
350 (unsigned long)(size
* nmemb
), reason
);
360 byte_put_little_endian (unsigned char *field
, bfd_vma value
, int size
)
365 field
[7] = (((value
>> 24) >> 24) >> 8) & 0xff;
366 field
[6] = ((value
>> 24) >> 24) & 0xff;
367 field
[5] = ((value
>> 24) >> 16) & 0xff;
368 field
[4] = ((value
>> 24) >> 8) & 0xff;
371 field
[3] = (value
>> 24) & 0xff;
372 field
[2] = (value
>> 16) & 0xff;
375 field
[1] = (value
>> 8) & 0xff;
378 field
[0] = value
& 0xff;
382 error (_("Unhandled data length: %d\n"), size
);
387 #if defined BFD64 && !BFD_HOST_64BIT_LONG && !BFD_HOST_64BIT_LONG_LONG
389 print_dec_vma (bfd_vma vma
, int is_signed
)
395 if (is_signed
&& (bfd_signed_vma
) vma
< 0)
404 *bufp
++ = '0' + vma
% 10;
416 print_hex_vma (bfd_vma vma
)
424 char digit
= '0' + (vma
& 0x0f);
426 digit
+= 'a' - '0' - 10;
439 /* Print a VMA value. */
441 print_vma (bfd_vma vma
, print_mode mode
)
450 return printf ("0x%8.8lx", (unsigned long) vma
);
453 return printf ("%8.8lx", (unsigned long) vma
);
457 return printf ("%5ld", (long) vma
);
461 return printf ("0x%lx", (unsigned long) vma
);
464 return printf ("%lx", (unsigned long) vma
);
467 return printf ("%ld", (unsigned long) vma
);
470 return printf ("%lu", (unsigned long) vma
);
493 #if BFD_HOST_64BIT_LONG
494 return nc
+ printf ("%lx", vma
);
495 #elif BFD_HOST_64BIT_LONG_LONG
497 return nc
+ printf ("%llx", vma
);
499 return nc
+ printf ("%I64x", vma
);
502 return nc
+ print_hex_vma (vma
);
506 #if BFD_HOST_64BIT_LONG
507 return printf ("%ld", vma
);
508 #elif BFD_HOST_64BIT_LONG_LONG
510 return printf ("%lld", vma
);
512 return printf ("%I64d", vma
);
515 return print_dec_vma (vma
, 1);
519 #if BFD_HOST_64BIT_LONG
521 return printf ("%5ld", vma
);
523 return printf ("%#lx", vma
);
524 #elif BFD_HOST_64BIT_LONG_LONG
527 return printf ("%5lld", vma
);
529 return printf ("%#llx", vma
);
532 return printf ("%5I64d", vma
);
534 return printf ("%#I64x", vma
);
538 return printf ("%5ld", _bfd_int64_low (vma
));
540 return print_hex_vma (vma
);
544 #if BFD_HOST_64BIT_LONG
545 return printf ("%lu", vma
);
546 #elif BFD_HOST_64BIT_LONG_LONG
548 return printf ("%llu", vma
);
550 return printf ("%I64u", vma
);
553 return print_dec_vma (vma
, 0);
561 /* Display a symbol on stdout. If do_wide is not true then
562 format the symbol to be at most WIDTH characters,
563 truncating as necessary. If WIDTH is negative then
564 format the string to be exactly - WIDTH characters,
565 truncating or padding as necessary. */
568 print_symbol (int width
, const char *symbol
)
571 printf ("%s", symbol
);
573 printf ("%-*.*s", width
, width
, symbol
);
575 printf ("%-.*s", width
, symbol
);
579 byte_put_big_endian (unsigned char *field
, bfd_vma value
, int size
)
584 field
[7] = value
& 0xff;
585 field
[6] = (value
>> 8) & 0xff;
586 field
[5] = (value
>> 16) & 0xff;
587 field
[4] = (value
>> 24) & 0xff;
592 field
[3] = value
& 0xff;
593 field
[2] = (value
>> 8) & 0xff;
597 field
[1] = value
& 0xff;
601 field
[0] = value
& 0xff;
605 error (_("Unhandled data length: %d\n"), size
);
610 /* Return a pointer to section NAME, or NULL if no such section exists. */
612 static Elf_Internal_Shdr
*
613 find_section (const char *name
)
617 for (i
= 0; i
< elf_header
.e_shnum
; i
++)
618 if (streq (SECTION_NAME (section_headers
+ i
), name
))
619 return section_headers
+ i
;
624 /* Guess the relocation size commonly used by the specific machines. */
627 guess_is_rela (unsigned int e_machine
)
631 /* Targets that use REL relocations. */
647 /* Targets that use RELA relocations. */
651 case EM_ALTERA_NIOS2
:
676 case EM_CYGNUS_MN10200
:
678 case EM_CYGNUS_MN10300
:
719 warn (_("Don't know about relocations on this machine architecture\n"));
725 slurp_rela_relocs (FILE *file
,
726 unsigned long rel_offset
,
727 unsigned long rel_size
,
728 Elf_Internal_Rela
**relasp
,
729 unsigned long *nrelasp
)
731 Elf_Internal_Rela
*relas
;
732 unsigned long nrelas
;
737 Elf32_External_Rela
*erelas
;
739 erelas
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
743 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
745 relas
= cmalloc (nrelas
, sizeof (Elf_Internal_Rela
));
750 error (_("out of memory parsing relocs\n"));
754 for (i
= 0; i
< nrelas
; i
++)
756 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
757 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
758 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
765 Elf64_External_Rela
*erelas
;
767 erelas
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
771 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
773 relas
= cmalloc (nrelas
, sizeof (Elf_Internal_Rela
));
778 error (_("out of memory parsing relocs\n"));
782 for (i
= 0; i
< nrelas
; i
++)
784 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
785 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
786 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
797 slurp_rel_relocs (FILE *file
,
798 unsigned long rel_offset
,
799 unsigned long rel_size
,
800 Elf_Internal_Rela
**relsp
,
801 unsigned long *nrelsp
)
803 Elf_Internal_Rela
*rels
;
809 Elf32_External_Rel
*erels
;
811 erels
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
815 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
817 rels
= cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
822 error (_("out of memory parsing relocs\n"));
826 for (i
= 0; i
< nrels
; i
++)
828 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
829 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
830 rels
[i
].r_addend
= 0;
837 Elf64_External_Rel
*erels
;
839 erels
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
843 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
845 rels
= cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
850 error (_("out of memory parsing relocs\n"));
854 for (i
= 0; i
< nrels
; i
++)
856 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
857 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
858 rels
[i
].r_addend
= 0;
868 /* Returns the reloc type extracted from the reloc info field. */
871 get_reloc_type (bfd_vma reloc_info
)
874 return ELF32_R_TYPE (reloc_info
);
876 switch (elf_header
.e_machine
)
879 /* Note: We assume that reloc_info has already been adjusted for us. */
880 return ELF64_MIPS_R_TYPE (reloc_info
);
883 return ELF64_R_TYPE_ID (reloc_info
);
886 return ELF64_R_TYPE (reloc_info
);
890 /* Return the symbol index extracted from the reloc info field. */
893 get_reloc_symindex (bfd_vma reloc_info
)
895 return is_32bit_elf
? ELF32_R_SYM (reloc_info
) : ELF64_R_SYM (reloc_info
);
898 /* Display the contents of the relocation data found at the specified
902 dump_relocations (FILE *file
,
903 unsigned long rel_offset
,
904 unsigned long rel_size
,
905 Elf_Internal_Sym
*symtab
,
908 unsigned long strtablen
,
912 Elf_Internal_Rela
*rels
;
915 if (is_rela
== UNKNOWN
)
916 is_rela
= guess_is_rela (elf_header
.e_machine
);
920 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
925 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
934 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
936 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
941 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
943 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
951 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
953 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
958 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
960 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
964 for (i
= 0; i
< rel_size
; i
++)
969 bfd_vma symtab_index
;
972 offset
= rels
[i
].r_offset
;
973 info
= rels
[i
].r_info
;
975 /* The #ifdef BFD64 below is to prevent a compile time warning.
976 We know that if we do not have a 64 bit data type that we
977 will never execute this code anyway. */
980 && elf_header
.e_machine
== EM_MIPS
981 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
983 /* In little-endian objects, r_info isn't really a 64-bit
984 little-endian value: it has a 32-bit little-endian
985 symbol index followed by four individual byte fields.
986 Reorder INFO accordingly. */
987 info
= (((info
& 0xffffffff) << 32)
988 | ((info
>> 56) & 0xff)
989 | ((info
>> 40) & 0xff00)
990 | ((info
>> 24) & 0xff0000)
991 | ((info
>> 8) & 0xff000000));
995 type
= get_reloc_type (info
);
996 symtab_index
= get_reloc_symindex (info
);
1000 printf ("%8.8lx %8.8lx ",
1001 (unsigned long) offset
& 0xffffffff,
1002 (unsigned long) info
& 0xffffffff);
1006 #if BFD_HOST_64BIT_LONG
1008 ? "%16.16lx %16.16lx "
1009 : "%12.12lx %12.12lx ",
1011 #elif BFD_HOST_64BIT_LONG_LONG
1014 ? "%16.16llx %16.16llx "
1015 : "%12.12llx %12.12llx ",
1019 ? "%16.16I64x %16.16I64x "
1020 : "%12.12I64x %12.12I64x ",
1025 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1026 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1027 _bfd_int64_high (offset
),
1028 _bfd_int64_low (offset
),
1029 _bfd_int64_high (info
),
1030 _bfd_int64_low (info
));
1034 switch (elf_header
.e_machine
)
1041 case EM_CYGNUS_M32R
:
1042 rtype
= elf_m32r_reloc_type (type
);
1047 rtype
= elf_i386_reloc_type (type
);
1052 rtype
= elf_m68hc11_reloc_type (type
);
1056 rtype
= elf_m68k_reloc_type (type
);
1060 rtype
= elf_i960_reloc_type (type
);
1065 rtype
= elf_avr_reloc_type (type
);
1068 case EM_OLD_SPARCV9
:
1069 case EM_SPARC32PLUS
:
1072 rtype
= elf_sparc_reloc_type (type
);
1076 rtype
= elf_spu_reloc_type (type
);
1080 case EM_CYGNUS_V850
:
1081 rtype
= v850_reloc_type (type
);
1085 case EM_CYGNUS_D10V
:
1086 rtype
= elf_d10v_reloc_type (type
);
1090 case EM_CYGNUS_D30V
:
1091 rtype
= elf_d30v_reloc_type (type
);
1095 rtype
= elf_dlx_reloc_type (type
);
1099 rtype
= elf_sh_reloc_type (type
);
1103 case EM_CYGNUS_MN10300
:
1104 rtype
= elf_mn10300_reloc_type (type
);
1108 case EM_CYGNUS_MN10200
:
1109 rtype
= elf_mn10200_reloc_type (type
);
1113 case EM_CYGNUS_FR30
:
1114 rtype
= elf_fr30_reloc_type (type
);
1118 rtype
= elf_frv_reloc_type (type
);
1122 rtype
= elf_mcore_reloc_type (type
);
1126 rtype
= elf_mmix_reloc_type (type
);
1131 rtype
= elf_msp430_reloc_type (type
);
1135 rtype
= elf_ppc_reloc_type (type
);
1139 rtype
= elf_ppc64_reloc_type (type
);
1143 case EM_MIPS_RS3_LE
:
1144 rtype
= elf_mips_reloc_type (type
);
1148 rtype
= elf_alpha_reloc_type (type
);
1152 rtype
= elf_arm_reloc_type (type
);
1156 rtype
= elf_arc_reloc_type (type
);
1160 rtype
= elf_hppa_reloc_type (type
);
1166 rtype
= elf_h8_reloc_type (type
);
1171 rtype
= elf_or32_reloc_type (type
);
1176 rtype
= elf_pj_reloc_type (type
);
1179 rtype
= elf_ia64_reloc_type (type
);
1183 rtype
= elf_cris_reloc_type (type
);
1187 rtype
= elf_i860_reloc_type (type
);
1191 rtype
= elf_x86_64_reloc_type (type
);
1195 rtype
= i370_reloc_type (type
);
1200 rtype
= elf_s390_reloc_type (type
);
1204 rtype
= elf_score_reloc_type (type
);
1208 rtype
= elf_xstormy16_reloc_type (type
);
1212 rtype
= elf_crx_reloc_type (type
);
1216 rtype
= elf_vax_reloc_type (type
);
1221 rtype
= elf_ip2k_reloc_type (type
);
1225 rtype
= elf_iq2000_reloc_type (type
);
1230 rtype
= elf_xtensa_reloc_type (type
);
1234 rtype
= elf_m32c_reloc_type (type
);
1238 rtype
= elf_mt_reloc_type (type
);
1242 rtype
= elf_bfin_reloc_type (type
);
1246 rtype
= elf_mep_reloc_type (type
);
1250 rtype
= elf_cr16_reloc_type (type
);
1255 printf (_("unrecognized: %-7lx"), (unsigned long) type
& 0xffffffff);
1257 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1259 if (elf_header
.e_machine
== EM_ALPHA
1261 && streq (rtype
, "R_ALPHA_LITUSE")
1264 switch (rels
[i
].r_addend
)
1266 case LITUSE_ALPHA_ADDR
: rtype
= "ADDR"; break;
1267 case LITUSE_ALPHA_BASE
: rtype
= "BASE"; break;
1268 case LITUSE_ALPHA_BYTOFF
: rtype
= "BYTOFF"; break;
1269 case LITUSE_ALPHA_JSR
: rtype
= "JSR"; break;
1270 case LITUSE_ALPHA_TLSGD
: rtype
= "TLSGD"; break;
1271 case LITUSE_ALPHA_TLSLDM
: rtype
= "TLSLDM"; break;
1272 case LITUSE_ALPHA_JSRDIRECT
: rtype
= "JSRDIRECT"; break;
1273 default: rtype
= NULL
;
1276 printf (" (%s)", rtype
);
1280 printf (_("<unknown addend: %lx>"),
1281 (unsigned long) rels
[i
].r_addend
);
1284 else if (symtab_index
)
1286 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1287 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1290 Elf_Internal_Sym
*psym
;
1292 psym
= symtab
+ symtab_index
;
1295 print_vma (psym
->st_value
, LONG_HEX
);
1296 printf (is_32bit_elf
? " " : " ");
1298 if (psym
->st_name
== 0)
1300 const char *sec_name
= "<null>";
1303 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1305 bfd_vma sec_index
= (bfd_vma
) -1;
1307 if (psym
->st_shndx
< SHN_LORESERVE
)
1308 sec_index
= psym
->st_shndx
;
1309 else if (psym
->st_shndx
> SHN_HIRESERVE
)
1310 sec_index
= psym
->st_shndx
- (SHN_HIRESERVE
+ 1
1313 if (sec_index
!= (bfd_vma
) -1)
1314 sec_name
= SECTION_NAME (section_headers
+ sec_index
);
1315 else if (psym
->st_shndx
== SHN_ABS
)
1317 else if (psym
->st_shndx
== SHN_COMMON
)
1318 sec_name
= "COMMON";
1319 else if (elf_header
.e_machine
== EM_MIPS
1320 && psym
->st_shndx
== SHN_MIPS_SCOMMON
)
1321 sec_name
= "SCOMMON";
1322 else if (elf_header
.e_machine
== EM_MIPS
1323 && psym
->st_shndx
== SHN_MIPS_SUNDEFINED
)
1324 sec_name
= "SUNDEF";
1325 else if (elf_header
.e_machine
== EM_X86_64
1326 && psym
->st_shndx
== SHN_X86_64_LCOMMON
)
1327 sec_name
= "LARGE_COMMON";
1328 else if (elf_header
.e_machine
== EM_IA_64
1329 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1330 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1331 sec_name
= "ANSI_COM";
1332 else if (elf_header
.e_machine
== EM_IA_64
1333 && (elf_header
.e_ident
[EI_OSABI
]
1334 == ELFOSABI_OPENVMS
)
1335 && psym
->st_shndx
== SHN_IA_64_VMS_SYMVEC
)
1336 sec_name
= "VMS_SYMVEC";
1339 sprintf (name_buf
, "<section 0x%x>",
1340 (unsigned int) psym
->st_shndx
);
1341 sec_name
= name_buf
;
1344 print_symbol (22, sec_name
);
1346 else if (strtab
== NULL
)
1347 printf (_("<string table index: %3ld>"), psym
->st_name
);
1348 else if (psym
->st_name
>= strtablen
)
1349 printf (_("<corrupt string table index: %3ld>"), psym
->st_name
);
1351 print_symbol (22, strtab
+ psym
->st_name
);
1354 printf (" + %lx", (unsigned long) rels
[i
].r_addend
);
1359 printf ("%*c", is_32bit_elf
?
1360 (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1361 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1364 if (elf_header
.e_machine
== EM_SPARCV9
1366 && streq (rtype
, "R_SPARC_OLO10"))
1367 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1372 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1374 bfd_vma type2
= ELF64_MIPS_R_TYPE2 (info
);
1375 bfd_vma type3
= ELF64_MIPS_R_TYPE3 (info
);
1376 const char *rtype2
= elf_mips_reloc_type (type2
);
1377 const char *rtype3
= elf_mips_reloc_type (type3
);
1379 printf (" Type2: ");
1382 printf (_("unrecognized: %-7lx"),
1383 (unsigned long) type2
& 0xffffffff);
1385 printf ("%-17.17s", rtype2
);
1387 printf ("\n Type3: ");
1390 printf (_("unrecognized: %-7lx"),
1391 (unsigned long) type3
& 0xffffffff);
1393 printf ("%-17.17s", rtype3
);
1404 get_mips_dynamic_type (unsigned long type
)
1408 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1409 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1410 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1411 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1412 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1413 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1414 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1415 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1416 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1417 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1418 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1419 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1420 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1421 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1422 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1423 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1424 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1425 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1426 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1427 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1428 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1429 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1430 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1431 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1432 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1433 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1434 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1435 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1436 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1437 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1438 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1439 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1440 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1441 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1442 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1443 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1444 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1445 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1446 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1447 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1448 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1449 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1450 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1457 get_sparc64_dynamic_type (unsigned long type
)
1461 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1468 get_ppc_dynamic_type (unsigned long type
)
1472 case DT_PPC_GOT
: return "PPC_GOT";
1479 get_ppc64_dynamic_type (unsigned long type
)
1483 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1484 case DT_PPC64_OPD
: return "PPC64_OPD";
1485 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1492 get_parisc_dynamic_type (unsigned long type
)
1496 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1497 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1498 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1499 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1500 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1501 case DT_HP_PREINIT
: return "HP_PREINIT";
1502 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1503 case DT_HP_NEEDED
: return "HP_NEEDED";
1504 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1505 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1506 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1507 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1508 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1509 case DT_HP_EPLTREL
: return "HP_GST_EPLTREL";
1510 case DT_HP_EPLTRELSZ
: return "HP_GST_EPLTRELSZ";
1511 case DT_HP_FILTERED
: return "HP_FILTERED";
1512 case DT_HP_FILTER_TLS
: return "HP_FILTER_TLS";
1513 case DT_HP_COMPAT_FILTERED
: return "HP_COMPAT_FILTERED";
1514 case DT_HP_LAZYLOAD
: return "HP_LAZYLOAD";
1515 case DT_HP_BIND_NOW_COUNT
: return "HP_BIND_NOW_COUNT";
1516 case DT_PLT
: return "PLT";
1517 case DT_PLT_SIZE
: return "PLT_SIZE";
1518 case DT_DLT
: return "DLT";
1519 case DT_DLT_SIZE
: return "DLT_SIZE";
1526 get_ia64_dynamic_type (unsigned long type
)
1530 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1531 case DT_IA_64_VMS_SUBTYPE
: return "VMS_SUBTYPE";
1532 case DT_IA_64_VMS_IMGIOCNT
: return "VMS_IMGIOCNT";
1533 case DT_IA_64_VMS_LNKFLAGS
: return "VMS_LNKFLAGS";
1534 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ
: return "VMS_VIR_MEM_BLK_SIZ";
1535 case DT_IA_64_VMS_IDENT
: return "VMS_IDENT";
1536 case DT_IA_64_VMS_NEEDED_IDENT
: return "VMS_NEEDED_IDENT";
1537 case DT_IA_64_VMS_IMG_RELA_CNT
: return "VMS_IMG_RELA_CNT";
1538 case DT_IA_64_VMS_SEG_RELA_CNT
: return "VMS_SEG_RELA_CNT";
1539 case DT_IA_64_VMS_FIXUP_RELA_CNT
: return "VMS_FIXUP_RELA_CNT";
1540 case DT_IA_64_VMS_FIXUP_NEEDED
: return "VMS_FIXUP_NEEDED";
1541 case DT_IA_64_VMS_SYMVEC_CNT
: return "VMS_SYMVEC_CNT";
1542 case DT_IA_64_VMS_XLATED
: return "VMS_XLATED";
1543 case DT_IA_64_VMS_STACKSIZE
: return "VMS_STACKSIZE";
1544 case DT_IA_64_VMS_UNWINDSZ
: return "VMS_UNWINDSZ";
1545 case DT_IA_64_VMS_UNWIND_CODSEG
: return "VMS_UNWIND_CODSEG";
1546 case DT_IA_64_VMS_UNWIND_INFOSEG
: return "VMS_UNWIND_INFOSEG";
1547 case DT_IA_64_VMS_LINKTIME
: return "VMS_LINKTIME";
1548 case DT_IA_64_VMS_SEG_NO
: return "VMS_SEG_NO";
1549 case DT_IA_64_VMS_SYMVEC_OFFSET
: return "VMS_SYMVEC_OFFSET";
1550 case DT_IA_64_VMS_SYMVEC_SEG
: return "VMS_SYMVEC_SEG";
1551 case DT_IA_64_VMS_UNWIND_OFFSET
: return "VMS_UNWIND_OFFSET";
1552 case DT_IA_64_VMS_UNWIND_SEG
: return "VMS_UNWIND_SEG";
1553 case DT_IA_64_VMS_STRTAB_OFFSET
: return "VMS_STRTAB_OFFSET";
1554 case DT_IA_64_VMS_SYSVER_OFFSET
: return "VMS_SYSVER_OFFSET";
1555 case DT_IA_64_VMS_IMG_RELA_OFF
: return "VMS_IMG_RELA_OFF";
1556 case DT_IA_64_VMS_SEG_RELA_OFF
: return "VMS_SEG_RELA_OFF";
1557 case DT_IA_64_VMS_FIXUP_RELA_OFF
: return "VMS_FIXUP_RELA_OFF";
1558 case DT_IA_64_VMS_PLTGOT_OFFSET
: return "VMS_PLTGOT_OFFSET";
1559 case DT_IA_64_VMS_PLTGOT_SEG
: return "VMS_PLTGOT_SEG";
1560 case DT_IA_64_VMS_FPMODE
: return "VMS_FPMODE";
1567 get_alpha_dynamic_type (unsigned long type
)
1571 case DT_ALPHA_PLTRO
: return "ALPHA_PLTRO";
1578 get_score_dynamic_type (unsigned long type
)
1582 case DT_SCORE_BASE_ADDRESS
: return "SCORE_BASE_ADDRESS";
1583 case DT_SCORE_LOCAL_GOTNO
: return "SCORE_LOCAL_GOTNO";
1584 case DT_SCORE_SYMTABNO
: return "SCORE_SYMTABNO";
1585 case DT_SCORE_GOTSYM
: return "SCORE_GOTSYM";
1586 case DT_SCORE_UNREFEXTNO
: return "SCORE_UNREFEXTNO";
1587 case DT_SCORE_HIPAGENO
: return "SCORE_HIPAGENO";
1595 get_dynamic_type (unsigned long type
)
1597 static char buff
[64];
1601 case DT_NULL
: return "NULL";
1602 case DT_NEEDED
: return "NEEDED";
1603 case DT_PLTRELSZ
: return "PLTRELSZ";
1604 case DT_PLTGOT
: return "PLTGOT";
1605 case DT_HASH
: return "HASH";
1606 case DT_STRTAB
: return "STRTAB";
1607 case DT_SYMTAB
: return "SYMTAB";
1608 case DT_RELA
: return "RELA";
1609 case DT_RELASZ
: return "RELASZ";
1610 case DT_RELAENT
: return "RELAENT";
1611 case DT_STRSZ
: return "STRSZ";
1612 case DT_SYMENT
: return "SYMENT";
1613 case DT_INIT
: return "INIT";
1614 case DT_FINI
: return "FINI";
1615 case DT_SONAME
: return "SONAME";
1616 case DT_RPATH
: return "RPATH";
1617 case DT_SYMBOLIC
: return "SYMBOLIC";
1618 case DT_REL
: return "REL";
1619 case DT_RELSZ
: return "RELSZ";
1620 case DT_RELENT
: return "RELENT";
1621 case DT_PLTREL
: return "PLTREL";
1622 case DT_DEBUG
: return "DEBUG";
1623 case DT_TEXTREL
: return "TEXTREL";
1624 case DT_JMPREL
: return "JMPREL";
1625 case DT_BIND_NOW
: return "BIND_NOW";
1626 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1627 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1628 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1629 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1630 case DT_RUNPATH
: return "RUNPATH";
1631 case DT_FLAGS
: return "FLAGS";
1633 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1634 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1636 case DT_CHECKSUM
: return "CHECKSUM";
1637 case DT_PLTPADSZ
: return "PLTPADSZ";
1638 case DT_MOVEENT
: return "MOVEENT";
1639 case DT_MOVESZ
: return "MOVESZ";
1640 case DT_FEATURE
: return "FEATURE";
1641 case DT_POSFLAG_1
: return "POSFLAG_1";
1642 case DT_SYMINSZ
: return "SYMINSZ";
1643 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1645 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1646 case DT_CONFIG
: return "CONFIG";
1647 case DT_DEPAUDIT
: return "DEPAUDIT";
1648 case DT_AUDIT
: return "AUDIT";
1649 case DT_PLTPAD
: return "PLTPAD";
1650 case DT_MOVETAB
: return "MOVETAB";
1651 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1653 case DT_VERSYM
: return "VERSYM";
1655 case DT_TLSDESC_GOT
: return "TLSDESC_GOT";
1656 case DT_TLSDESC_PLT
: return "TLSDESC_PLT";
1657 case DT_RELACOUNT
: return "RELACOUNT";
1658 case DT_RELCOUNT
: return "RELCOUNT";
1659 case DT_FLAGS_1
: return "FLAGS_1";
1660 case DT_VERDEF
: return "VERDEF";
1661 case DT_VERDEFNUM
: return "VERDEFNUM";
1662 case DT_VERNEED
: return "VERNEED";
1663 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1665 case DT_AUXILIARY
: return "AUXILIARY";
1666 case DT_USED
: return "USED";
1667 case DT_FILTER
: return "FILTER";
1669 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1670 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1671 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1672 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1673 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1674 case DT_GNU_HASH
: return "GNU_HASH";
1677 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1681 switch (elf_header
.e_machine
)
1684 case EM_MIPS_RS3_LE
:
1685 result
= get_mips_dynamic_type (type
);
1688 result
= get_sparc64_dynamic_type (type
);
1691 result
= get_ppc_dynamic_type (type
);
1694 result
= get_ppc64_dynamic_type (type
);
1697 result
= get_ia64_dynamic_type (type
);
1700 result
= get_alpha_dynamic_type (type
);
1703 result
= get_score_dynamic_type (type
);
1713 snprintf (buff
, sizeof (buff
), _("Processor Specific: %lx"), type
);
1715 else if (((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1716 || (elf_header
.e_machine
== EM_PARISC
1717 && (type
>= OLD_DT_LOOS
) && (type
<= OLD_DT_HIOS
)))
1721 switch (elf_header
.e_machine
)
1724 result
= get_parisc_dynamic_type (type
);
1727 result
= get_ia64_dynamic_type (type
);
1737 snprintf (buff
, sizeof (buff
), _("Operating System specific: %lx"),
1741 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), type
);
1748 get_file_type (unsigned e_type
)
1750 static char buff
[32];
1754 case ET_NONE
: return _("NONE (None)");
1755 case ET_REL
: return _("REL (Relocatable file)");
1756 case ET_EXEC
: return _("EXEC (Executable file)");
1757 case ET_DYN
: return _("DYN (Shared object file)");
1758 case ET_CORE
: return _("CORE (Core file)");
1761 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1762 snprintf (buff
, sizeof (buff
), _("Processor Specific: (%x)"), e_type
);
1763 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1764 snprintf (buff
, sizeof (buff
), _("OS Specific: (%x)"), e_type
);
1766 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_type
);
1772 get_machine_name (unsigned e_machine
)
1774 static char buff
[64]; /* XXX */
1778 case EM_NONE
: return _("None");
1779 case EM_M32
: return "WE32100";
1780 case EM_SPARC
: return "Sparc";
1781 case EM_SPU
: return "SPU";
1782 case EM_386
: return "Intel 80386";
1783 case EM_68K
: return "MC68000";
1784 case EM_88K
: return "MC88000";
1785 case EM_486
: return "Intel 80486";
1786 case EM_860
: return "Intel 80860";
1787 case EM_MIPS
: return "MIPS R3000";
1788 case EM_S370
: return "IBM System/370";
1789 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1790 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1791 case EM_PARISC
: return "HPPA";
1792 case EM_PPC_OLD
: return "Power PC (old)";
1793 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1794 case EM_960
: return "Intel 90860";
1795 case EM_PPC
: return "PowerPC";
1796 case EM_PPC64
: return "PowerPC64";
1797 case EM_V800
: return "NEC V800";
1798 case EM_FR20
: return "Fujitsu FR20";
1799 case EM_RH32
: return "TRW RH32";
1800 case EM_MCORE
: return "MCORE";
1801 case EM_ARM
: return "ARM";
1802 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1803 case EM_SH
: return "Renesas / SuperH SH";
1804 case EM_SPARCV9
: return "Sparc v9";
1805 case EM_TRICORE
: return "Siemens Tricore";
1806 case EM_ARC
: return "ARC";
1807 case EM_H8_300
: return "Renesas H8/300";
1808 case EM_H8_300H
: return "Renesas H8/300H";
1809 case EM_H8S
: return "Renesas H8S";
1810 case EM_H8_500
: return "Renesas H8/500";
1811 case EM_IA_64
: return "Intel IA-64";
1812 case EM_MIPS_X
: return "Stanford MIPS-X";
1813 case EM_COLDFIRE
: return "Motorola Coldfire";
1814 case EM_68HC12
: return "Motorola M68HC12";
1815 case EM_ALPHA
: return "Alpha";
1816 case EM_CYGNUS_D10V
:
1817 case EM_D10V
: return "d10v";
1818 case EM_CYGNUS_D30V
:
1819 case EM_D30V
: return "d30v";
1820 case EM_CYGNUS_M32R
:
1821 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
1822 case EM_CYGNUS_V850
:
1823 case EM_V850
: return "NEC v850";
1824 case EM_CYGNUS_MN10300
:
1825 case EM_MN10300
: return "mn10300";
1826 case EM_CYGNUS_MN10200
:
1827 case EM_MN10200
: return "mn10200";
1828 case EM_CYGNUS_FR30
:
1829 case EM_FR30
: return "Fujitsu FR30";
1830 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1832 case EM_PJ
: return "picoJava";
1833 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1834 case EM_PCP
: return "Siemens PCP";
1835 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1836 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1837 case EM_STARCORE
: return "Motorola Star*Core processor";
1838 case EM_ME16
: return "Toyota ME16 processor";
1839 case EM_ST100
: return "STMicroelectronics ST100 processor";
1840 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1841 case EM_FX66
: return "Siemens FX66 microcontroller";
1842 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1843 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1844 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1845 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1846 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1847 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1848 case EM_SVX
: return "Silicon Graphics SVx";
1849 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1850 case EM_VAX
: return "Digital VAX";
1852 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1853 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1854 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1855 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1856 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1857 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1858 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1859 case EM_PRISM
: return "Vitesse Prism";
1860 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1862 case EM_S390
: return "IBM S/390";
1863 case EM_SCORE
: return "SUNPLUS S+Core";
1864 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1866 case EM_OR32
: return "OpenRISC";
1867 case EM_CRX
: return "National Semiconductor CRX microprocessor";
1868 case EM_DLX
: return "OpenDLX";
1870 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1871 case EM_IQ2000
: return "Vitesse IQ2000";
1873 case EM_XTENSA
: return "Tensilica Xtensa Processor";
1874 case EM_M32C
: return "Renesas M32c";
1875 case EM_MT
: return "Morpho Techologies MT processor";
1876 case EM_BLACKFIN
: return "Analog Devices Blackfin";
1877 case EM_NIOS32
: return "Altera Nios";
1878 case EM_ALTERA_NIOS2
: return "Altera Nios II";
1879 case EM_XC16X
: return "Infineon Technologies xc16x";
1880 case EM_CYGNUS_MEP
: return "Toshiba MeP Media Engine";
1881 case EM_CR16
: return "National Semiconductor's CR16";
1883 snprintf (buff
, sizeof (buff
), _("<unknown>: 0x%x"), e_machine
);
1889 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
1894 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1895 e_flags
&= ~ EF_ARM_EABIMASK
;
1897 /* Handle "generic" ARM flags. */
1898 if (e_flags
& EF_ARM_RELEXEC
)
1900 strcat (buf
, ", relocatable executable");
1901 e_flags
&= ~ EF_ARM_RELEXEC
;
1904 if (e_flags
& EF_ARM_HASENTRY
)
1906 strcat (buf
, ", has entry point");
1907 e_flags
&= ~ EF_ARM_HASENTRY
;
1910 /* Now handle EABI specific flags. */
1914 strcat (buf
, ", <unrecognized EABI>");
1919 case EF_ARM_EABI_VER1
:
1920 strcat (buf
, ", Version1 EABI");
1925 /* Process flags one bit at a time. */
1926 flag
= e_flags
& - e_flags
;
1931 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1932 strcat (buf
, ", sorted symbol tables");
1942 case EF_ARM_EABI_VER2
:
1943 strcat (buf
, ", Version2 EABI");
1948 /* Process flags one bit at a time. */
1949 flag
= e_flags
& - e_flags
;
1954 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1955 strcat (buf
, ", sorted symbol tables");
1958 case EF_ARM_DYNSYMSUSESEGIDX
:
1959 strcat (buf
, ", dynamic symbols use segment index");
1962 case EF_ARM_MAPSYMSFIRST
:
1963 strcat (buf
, ", mapping symbols precede others");
1973 case EF_ARM_EABI_VER3
:
1974 strcat (buf
, ", Version3 EABI");
1977 case EF_ARM_EABI_VER4
:
1978 strcat (buf
, ", Version4 EABI");
1981 case EF_ARM_EABI_VER5
:
1982 strcat (buf
, ", Version5 EABI");
1988 /* Process flags one bit at a time. */
1989 flag
= e_flags
& - e_flags
;
1995 strcat (buf
, ", BE8");
1999 strcat (buf
, ", LE8");
2009 case EF_ARM_EABI_UNKNOWN
:
2010 strcat (buf
, ", GNU EABI");
2015 /* Process flags one bit at a time. */
2016 flag
= e_flags
& - e_flags
;
2021 case EF_ARM_INTERWORK
:
2022 strcat (buf
, ", interworking enabled");
2025 case EF_ARM_APCS_26
:
2026 strcat (buf
, ", uses APCS/26");
2029 case EF_ARM_APCS_FLOAT
:
2030 strcat (buf
, ", uses APCS/float");
2034 strcat (buf
, ", position independent");
2038 strcat (buf
, ", 8 bit structure alignment");
2041 case EF_ARM_NEW_ABI
:
2042 strcat (buf
, ", uses new ABI");
2045 case EF_ARM_OLD_ABI
:
2046 strcat (buf
, ", uses old ABI");
2049 case EF_ARM_SOFT_FLOAT
:
2050 strcat (buf
, ", software FP");
2053 case EF_ARM_VFP_FLOAT
:
2054 strcat (buf
, ", VFP");
2057 case EF_ARM_MAVERICK_FLOAT
:
2058 strcat (buf
, ", Maverick FP");
2069 strcat (buf
,", <unknown>");
2073 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
2075 static char buf
[1024];
2087 decode_ARM_machine_flags (e_flags
, buf
);
2091 switch (e_flags
& EF_FRV_CPU_MASK
)
2093 case EF_FRV_CPU_GENERIC
:
2097 strcat (buf
, ", fr???");
2100 case EF_FRV_CPU_FR300
:
2101 strcat (buf
, ", fr300");
2104 case EF_FRV_CPU_FR400
:
2105 strcat (buf
, ", fr400");
2107 case EF_FRV_CPU_FR405
:
2108 strcat (buf
, ", fr405");
2111 case EF_FRV_CPU_FR450
:
2112 strcat (buf
, ", fr450");
2115 case EF_FRV_CPU_FR500
:
2116 strcat (buf
, ", fr500");
2118 case EF_FRV_CPU_FR550
:
2119 strcat (buf
, ", fr550");
2122 case EF_FRV_CPU_SIMPLE
:
2123 strcat (buf
, ", simple");
2125 case EF_FRV_CPU_TOMCAT
:
2126 strcat (buf
, ", tomcat");
2132 if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_M68000
)
2133 strcat (buf
, ", m68000");
2134 else if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_CPU32
)
2135 strcat (buf
, ", cpu32");
2136 else if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_FIDO
)
2137 strcat (buf
, ", fido_a");
2140 char const *isa
= _("unknown");
2141 char const *mac
= _("unknown mac");
2142 char const *additional
= NULL
;
2144 switch (e_flags
& EF_M68K_CF_ISA_MASK
)
2146 case EF_M68K_CF_ISA_A_NODIV
:
2148 additional
= ", nodiv";
2150 case EF_M68K_CF_ISA_A
:
2153 case EF_M68K_CF_ISA_A_PLUS
:
2156 case EF_M68K_CF_ISA_B_NOUSP
:
2158 additional
= ", nousp";
2160 case EF_M68K_CF_ISA_B
:
2164 strcat (buf
, ", cf, isa ");
2167 strcat (buf
, additional
);
2168 if (e_flags
& EF_M68K_CF_FLOAT
)
2169 strcat (buf
, ", float");
2170 switch (e_flags
& EF_M68K_CF_MAC_MASK
)
2175 case EF_M68K_CF_MAC
:
2178 case EF_M68K_CF_EMAC
:
2191 if (e_flags
& EF_PPC_EMB
)
2192 strcat (buf
, ", emb");
2194 if (e_flags
& EF_PPC_RELOCATABLE
)
2195 strcat (buf
, ", relocatable");
2197 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
2198 strcat (buf
, ", relocatable-lib");
2202 case EM_CYGNUS_V850
:
2203 switch (e_flags
& EF_V850_ARCH
)
2206 strcat (buf
, ", v850e1");
2209 strcat (buf
, ", v850e");
2212 strcat (buf
, ", v850");
2215 strcat (buf
, ", unknown v850 architecture variant");
2221 case EM_CYGNUS_M32R
:
2222 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
2223 strcat (buf
, ", m32r");
2227 case EM_MIPS_RS3_LE
:
2228 if (e_flags
& EF_MIPS_NOREORDER
)
2229 strcat (buf
, ", noreorder");
2231 if (e_flags
& EF_MIPS_PIC
)
2232 strcat (buf
, ", pic");
2234 if (e_flags
& EF_MIPS_CPIC
)
2235 strcat (buf
, ", cpic");
2237 if (e_flags
& EF_MIPS_UCODE
)
2238 strcat (buf
, ", ugen_reserved");
2240 if (e_flags
& EF_MIPS_ABI2
)
2241 strcat (buf
, ", abi2");
2243 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
2244 strcat (buf
, ", odk first");
2246 if (e_flags
& EF_MIPS_32BITMODE
)
2247 strcat (buf
, ", 32bitmode");
2249 switch ((e_flags
& EF_MIPS_MACH
))
2251 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
2252 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
2253 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
2254 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
2255 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
2256 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
2257 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
2258 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
2259 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
2260 case E_MIPS_MACH_9000
: strcat (buf
, ", 9000"); break;
2261 case E_MIPS_MACH_LS2E
: strcat (buf
, ", loongson-2e"); break;
2262 case E_MIPS_MACH_LS2F
: strcat (buf
, ", loongson-2f"); break;
2264 /* We simply ignore the field in this case to avoid confusion:
2265 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2268 default: strcat (buf
, ", unknown CPU"); break;
2271 switch ((e_flags
& EF_MIPS_ABI
))
2273 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
2274 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
2275 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
2276 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
2278 /* We simply ignore the field in this case to avoid confusion:
2279 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2280 This means it is likely to be an o32 file, but not for
2283 default: strcat (buf
, ", unknown ABI"); break;
2286 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
2287 strcat (buf
, ", mdmx");
2289 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
2290 strcat (buf
, ", mips16");
2292 switch ((e_flags
& EF_MIPS_ARCH
))
2294 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
2295 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
2296 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
2297 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
2298 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
2299 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
2300 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
2301 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
2302 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
2303 default: strcat (buf
, ", unknown ISA"); break;
2309 switch ((e_flags
& EF_SH_MACH_MASK
))
2311 case EF_SH1
: strcat (buf
, ", sh1"); break;
2312 case EF_SH2
: strcat (buf
, ", sh2"); break;
2313 case EF_SH3
: strcat (buf
, ", sh3"); break;
2314 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
2315 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
2316 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
2317 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
2318 case EF_SH4
: strcat (buf
, ", sh4"); break;
2319 case EF_SH5
: strcat (buf
, ", sh5"); break;
2320 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
2321 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
2322 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
2323 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
2324 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
2325 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
2326 case EF_SH3_NOMMU
: strcat (buf
, ", sh3-nommu"); break;
2327 case EF_SH4_NOMMU_NOFPU
: strcat (buf
, ", sh4-nommu-nofpu"); break;
2328 case EF_SH2A_SH4_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2329 case EF_SH2A_SH3_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh3-nommu"); break;
2330 case EF_SH2A_SH4
: strcat (buf
, ", sh2a-or-sh4"); break;
2331 case EF_SH2A_SH3E
: strcat (buf
, ", sh2a-or-sh3e"); break;
2332 default: strcat (buf
, ", unknown ISA"); break;
2338 if (e_flags
& EF_SPARC_32PLUS
)
2339 strcat (buf
, ", v8+");
2341 if (e_flags
& EF_SPARC_SUN_US1
)
2342 strcat (buf
, ", ultrasparcI");
2344 if (e_flags
& EF_SPARC_SUN_US3
)
2345 strcat (buf
, ", ultrasparcIII");
2347 if (e_flags
& EF_SPARC_HAL_R1
)
2348 strcat (buf
, ", halr1");
2350 if (e_flags
& EF_SPARC_LEDATA
)
2351 strcat (buf
, ", ledata");
2353 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2354 strcat (buf
, ", tso");
2356 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2357 strcat (buf
, ", pso");
2359 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2360 strcat (buf
, ", rmo");
2364 switch (e_flags
& EF_PARISC_ARCH
)
2366 case EFA_PARISC_1_0
:
2367 strcpy (buf
, ", PA-RISC 1.0");
2369 case EFA_PARISC_1_1
:
2370 strcpy (buf
, ", PA-RISC 1.1");
2372 case EFA_PARISC_2_0
:
2373 strcpy (buf
, ", PA-RISC 2.0");
2378 if (e_flags
& EF_PARISC_TRAPNIL
)
2379 strcat (buf
, ", trapnil");
2380 if (e_flags
& EF_PARISC_EXT
)
2381 strcat (buf
, ", ext");
2382 if (e_flags
& EF_PARISC_LSB
)
2383 strcat (buf
, ", lsb");
2384 if (e_flags
& EF_PARISC_WIDE
)
2385 strcat (buf
, ", wide");
2386 if (e_flags
& EF_PARISC_NO_KABP
)
2387 strcat (buf
, ", no kabp");
2388 if (e_flags
& EF_PARISC_LAZYSWAP
)
2389 strcat (buf
, ", lazyswap");
2394 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2395 strcat (buf
, ", new calling convention");
2397 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2398 strcat (buf
, ", gnu calling convention");
2402 if ((e_flags
& EF_IA_64_ABI64
))
2403 strcat (buf
, ", 64-bit");
2405 strcat (buf
, ", 32-bit");
2406 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2407 strcat (buf
, ", reduced fp model");
2408 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2409 strcat (buf
, ", no function descriptors, constant gp");
2410 else if ((e_flags
& EF_IA_64_CONS_GP
))
2411 strcat (buf
, ", constant gp");
2412 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2413 strcat (buf
, ", absolute");
2417 if ((e_flags
& EF_VAX_NONPIC
))
2418 strcat (buf
, ", non-PIC");
2419 if ((e_flags
& EF_VAX_DFLOAT
))
2420 strcat (buf
, ", D-Float");
2421 if ((e_flags
& EF_VAX_GFLOAT
))
2422 strcat (buf
, ", G-Float");
2431 get_osabi_name (unsigned int osabi
)
2433 static char buff
[32];
2437 case ELFOSABI_NONE
: return "UNIX - System V";
2438 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2439 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2440 case ELFOSABI_LINUX
: return "UNIX - Linux";
2441 case ELFOSABI_HURD
: return "GNU/Hurd";
2442 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2443 case ELFOSABI_AIX
: return "UNIX - AIX";
2444 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2445 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2446 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2447 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2448 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2449 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2450 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2451 case ELFOSABI_AROS
: return "Amiga Research OS";
2452 case ELFOSABI_STANDALONE
: return _("Standalone App");
2453 case ELFOSABI_ARM
: return "ARM";
2455 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), osabi
);
2461 get_arm_segment_type (unsigned long type
)
2475 get_mips_segment_type (unsigned long type
)
2479 case PT_MIPS_REGINFO
:
2481 case PT_MIPS_RTPROC
:
2483 case PT_MIPS_OPTIONS
:
2493 get_parisc_segment_type (unsigned long type
)
2497 case PT_HP_TLS
: return "HP_TLS";
2498 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2499 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2500 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2501 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2502 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2503 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2504 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2505 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2506 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2507 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2508 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2509 case PT_HP_OPT_ANNOT
: return "HP_OPT_ANNOT";
2510 case PT_HP_HSL_ANNOT
: return "HP_HSL_ANNOT";
2511 case PT_HP_STACK
: return "HP_STACK";
2512 case PT_HP_CORE_UTSNAME
: return "HP_CORE_UTSNAME";
2513 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2514 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2515 case PT_PARISC_WEAKORDER
: return "PARISC_WEAKORDER";
2524 get_ia64_segment_type (unsigned long type
)
2528 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2529 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2530 case PT_HP_TLS
: return "HP_TLS";
2531 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2532 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2533 case PT_IA_64_HP_STACK
: return "HP_STACK";
2542 get_segment_type (unsigned long p_type
)
2544 static char buff
[32];
2548 case PT_NULL
: return "NULL";
2549 case PT_LOAD
: return "LOAD";
2550 case PT_DYNAMIC
: return "DYNAMIC";
2551 case PT_INTERP
: return "INTERP";
2552 case PT_NOTE
: return "NOTE";
2553 case PT_SHLIB
: return "SHLIB";
2554 case PT_PHDR
: return "PHDR";
2555 case PT_TLS
: return "TLS";
2557 case PT_GNU_EH_FRAME
:
2558 return "GNU_EH_FRAME";
2559 case PT_GNU_STACK
: return "GNU_STACK";
2560 case PT_GNU_RELRO
: return "GNU_RELRO";
2563 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2567 switch (elf_header
.e_machine
)
2570 result
= get_arm_segment_type (p_type
);
2573 case EM_MIPS_RS3_LE
:
2574 result
= get_mips_segment_type (p_type
);
2577 result
= get_parisc_segment_type (p_type
);
2580 result
= get_ia64_segment_type (p_type
);
2590 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2592 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2596 switch (elf_header
.e_machine
)
2599 result
= get_parisc_segment_type (p_type
);
2602 result
= get_ia64_segment_type (p_type
);
2612 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2615 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), p_type
);
2622 get_mips_section_type_name (unsigned int sh_type
)
2626 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2627 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2628 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2629 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2630 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2631 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2632 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2633 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2634 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2635 case SHT_MIPS_RELD
: return "MIPS_RELD";
2636 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2637 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2638 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2639 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2640 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2641 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2642 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2643 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2644 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2645 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2646 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2647 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2648 case SHT_MIPS_LINE
: return "MIPS_LINE";
2649 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2650 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2651 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2652 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2653 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2654 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2655 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2656 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2657 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2658 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2659 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2660 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2661 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2662 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2663 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2664 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2672 get_parisc_section_type_name (unsigned int sh_type
)
2676 case SHT_PARISC_EXT
: return "PARISC_EXT";
2677 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2678 case SHT_PARISC_DOC
: return "PARISC_DOC";
2679 case SHT_PARISC_ANNOT
: return "PARISC_ANNOT";
2680 case SHT_PARISC_SYMEXTN
: return "PARISC_SYMEXTN";
2681 case SHT_PARISC_STUBS
: return "PARISC_STUBS";
2682 case SHT_PARISC_DLKM
: return "PARISC_DLKM";
2690 get_ia64_section_type_name (unsigned int sh_type
)
2692 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2693 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2694 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2698 case SHT_IA_64_EXT
: return "IA_64_EXT";
2699 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2700 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2701 case SHT_IA_64_VMS_TRACE
: return "VMS_TRACE";
2702 case SHT_IA_64_VMS_TIE_SIGNATURES
: return "VMS_TIE_SIGNATURES";
2703 case SHT_IA_64_VMS_DEBUG
: return "VMS_DEBUG";
2704 case SHT_IA_64_VMS_DEBUG_STR
: return "VMS_DEBUG_STR";
2705 case SHT_IA_64_VMS_LINKAGES
: return "VMS_LINKAGES";
2706 case SHT_IA_64_VMS_SYMBOL_VECTOR
: return "VMS_SYMBOL_VECTOR";
2707 case SHT_IA_64_VMS_FIXUP
: return "VMS_FIXUP";
2715 get_x86_64_section_type_name (unsigned int sh_type
)
2719 case SHT_X86_64_UNWIND
: return "X86_64_UNWIND";
2727 get_arm_section_type_name (unsigned int sh_type
)
2733 case SHT_ARM_PREEMPTMAP
:
2734 return "ARM_PREEMPTMAP";
2735 case SHT_ARM_ATTRIBUTES
:
2736 return "ARM_ATTRIBUTES";
2744 get_section_type_name (unsigned int sh_type
)
2746 static char buff
[32];
2750 case SHT_NULL
: return "NULL";
2751 case SHT_PROGBITS
: return "PROGBITS";
2752 case SHT_SYMTAB
: return "SYMTAB";
2753 case SHT_STRTAB
: return "STRTAB";
2754 case SHT_RELA
: return "RELA";
2755 case SHT_HASH
: return "HASH";
2756 case SHT_DYNAMIC
: return "DYNAMIC";
2757 case SHT_NOTE
: return "NOTE";
2758 case SHT_NOBITS
: return "NOBITS";
2759 case SHT_REL
: return "REL";
2760 case SHT_SHLIB
: return "SHLIB";
2761 case SHT_DYNSYM
: return "DYNSYM";
2762 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2763 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2764 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2765 case SHT_GNU_HASH
: return "GNU_HASH";
2766 case SHT_GROUP
: return "GROUP";
2767 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2768 case SHT_GNU_verdef
: return "VERDEF";
2769 case SHT_GNU_verneed
: return "VERNEED";
2770 case SHT_GNU_versym
: return "VERSYM";
2771 case 0x6ffffff0: return "VERSYM";
2772 case 0x6ffffffc: return "VERDEF";
2773 case 0x7ffffffd: return "AUXILIARY";
2774 case 0x7fffffff: return "FILTER";
2775 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2778 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2782 switch (elf_header
.e_machine
)
2785 case EM_MIPS_RS3_LE
:
2786 result
= get_mips_section_type_name (sh_type
);
2789 result
= get_parisc_section_type_name (sh_type
);
2792 result
= get_ia64_section_type_name (sh_type
);
2795 result
= get_x86_64_section_type_name (sh_type
);
2798 result
= get_arm_section_type_name (sh_type
);
2808 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2810 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2814 switch (elf_header
.e_machine
)
2817 result
= get_ia64_section_type_name (sh_type
);
2827 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2829 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2830 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2832 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), sh_type
);
2838 #define OPTION_DEBUG_DUMP 512
2840 static struct option options
[] =
2842 {"all", no_argument
, 0, 'a'},
2843 {"file-header", no_argument
, 0, 'h'},
2844 {"program-headers", no_argument
, 0, 'l'},
2845 {"headers", no_argument
, 0, 'e'},
2846 {"histogram", no_argument
, 0, 'I'},
2847 {"segments", no_argument
, 0, 'l'},
2848 {"sections", no_argument
, 0, 'S'},
2849 {"section-headers", no_argument
, 0, 'S'},
2850 {"section-groups", no_argument
, 0, 'g'},
2851 {"section-details", no_argument
, 0, 't'},
2852 {"full-section-name",no_argument
, 0, 'N'},
2853 {"symbols", no_argument
, 0, 's'},
2854 {"syms", no_argument
, 0, 's'},
2855 {"relocs", no_argument
, 0, 'r'},
2856 {"notes", no_argument
, 0, 'n'},
2857 {"dynamic", no_argument
, 0, 'd'},
2858 {"arch-specific", no_argument
, 0, 'A'},
2859 {"version-info", no_argument
, 0, 'V'},
2860 {"use-dynamic", no_argument
, 0, 'D'},
2861 {"unwind", no_argument
, 0, 'u'},
2862 {"archive-index", no_argument
, 0, 'c'},
2863 {"hex-dump", required_argument
, 0, 'x'},
2864 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2865 {"string-dump", required_argument
, 0, 'p'},
2866 #ifdef SUPPORT_DISASSEMBLY
2867 {"instruction-dump", required_argument
, 0, 'i'},
2870 {"version", no_argument
, 0, 'v'},
2871 {"wide", no_argument
, 0, 'W'},
2872 {"help", no_argument
, 0, 'H'},
2873 {0, no_argument
, 0, 0}
2877 usage (FILE *stream
)
2879 fprintf (stream
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2880 fprintf (stream
, _(" Display information about the contents of ELF format files\n"));
2881 fprintf (stream
, _(" Options are:\n\
2882 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2883 -h --file-header Display the ELF file header\n\
2884 -l --program-headers Display the program headers\n\
2885 --segments An alias for --program-headers\n\
2886 -S --section-headers Display the sections' header\n\
2887 --sections An alias for --section-headers\n\
2888 -g --section-groups Display the section groups\n\
2889 -t --section-details Display the section details\n\
2890 -e --headers Equivalent to: -h -l -S\n\
2891 -s --syms Display the symbol table\n\
2892 --symbols An alias for --syms\n\
2893 -n --notes Display the core notes (if present)\n\
2894 -r --relocs Display the relocations (if present)\n\
2895 -u --unwind Display the unwind info (if present)\n\
2896 -d --dynamic Display the dynamic section (if present)\n\
2897 -V --version-info Display the version sections (if present)\n\
2898 -A --arch-specific Display architecture specific information (if any).\n\
2899 -c --archive-index Display the symbol/file index in an archive\n\
2900 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2901 -x --hex-dump=<number|name>\n\
2902 Dump the contents of section <number|name> as bytes\n\
2903 -p --string-dump=<number|name>\n\
2904 Dump the contents of section <number|name> as strings\n\
2905 -w[liaprmfFsoR] or\n\
2906 --debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]\n\
2907 Display the contents of DWARF2 debug sections\n"));
2908 #ifdef SUPPORT_DISASSEMBLY
2909 fprintf (stream
, _("\
2910 -i --instruction-dump=<number|name>\n\
2911 Disassemble the contents of section <number|name>\n"));
2913 fprintf (stream
, _("\
2914 -I --histogram Display histogram of bucket list lengths\n\
2915 -W --wide Allow output width to exceed 80 characters\n\
2916 @<file> Read options from <file>\n\
2917 -H --help Display this information\n\
2918 -v --version Display the version number of readelf\n"));
2920 if (REPORT_BUGS_TO
[0] && stream
== stdout
)
2921 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2923 exit (stream
== stdout
? 0 : 1);
2926 /* Record the fact that the user wants the contents of section number
2927 SECTION to be displayed using the method(s) encoded as flags bits
2928 in TYPE. Note, TYPE can be zero if we are creating the array for
2932 request_dump_bynumber (unsigned int section
, dump_type type
)
2934 if (section
>= num_dump_sects
)
2936 dump_type
*new_dump_sects
;
2938 new_dump_sects
= calloc (section
+ 1, sizeof (* dump_sects
));
2940 if (new_dump_sects
== NULL
)
2941 error (_("Out of memory allocating dump request table.\n"));
2944 /* Copy current flag settings. */
2945 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
* sizeof (* dump_sects
));
2949 dump_sects
= new_dump_sects
;
2950 num_dump_sects
= section
+ 1;
2955 dump_sects
[section
] |= type
;
2960 /* Request a dump by section name. */
2963 request_dump_byname (const char *section
, dump_type type
)
2965 struct dump_list_entry
*new_request
;
2967 new_request
= malloc (sizeof (struct dump_list_entry
));
2969 error (_("Out of memory allocating dump request table.\n"));
2971 new_request
->name
= strdup (section
);
2972 if (!new_request
->name
)
2973 error (_("Out of memory allocating dump request table.\n"));
2975 new_request
->type
= type
;
2977 new_request
->next
= dump_sects_byname
;
2978 dump_sects_byname
= new_request
;
2982 parse_args (int argc
, char **argv
)
2989 while ((c
= getopt_long
2990 (argc
, argv
, "ADHINSVWacdeghi:lnp:rstuvw::x:", options
, NULL
)) != EOF
)
3011 do_section_groups
++;
3019 do_section_groups
++;
3024 do_section_details
++;
3069 section
= strtoul (optarg
, & cp
, 0);
3070 if (! *cp
&& section
>= 0)
3071 request_dump_bynumber (section
, HEX_DUMP
);
3073 request_dump_byname (optarg
, HEX_DUMP
);
3077 section
= strtoul (optarg
, & cp
, 0);
3078 if (! *cp
&& section
>= 0)
3079 request_dump_bynumber (section
, STRING_DUMP
);
3081 request_dump_byname (optarg
, STRING_DUMP
);
3089 unsigned int index
= 0;
3093 while (optarg
[index
])
3094 switch (optarg
[index
++])
3101 do_debug_abbrevs
= 1;
3109 do_debug_pubnames
= 1;
3113 do_debug_aranges
= 1;
3117 do_debug_ranges
= 1;
3121 do_debug_frames_interp
= 1;
3123 do_debug_frames
= 1;
3127 do_debug_macinfo
= 1;
3139 warn (_("Unrecognized debug option '%s'\n"), optarg
);
3144 case OPTION_DEBUG_DUMP
:
3152 const char * option
;
3155 debug_dump_long_opts
;
3157 debug_dump_long_opts opts_table
[] =
3159 /* Please keep this table alpha- sorted. */
3160 { "Ranges", & do_debug_ranges
},
3161 { "abbrev", & do_debug_abbrevs
},
3162 { "aranges", & do_debug_aranges
},
3163 { "frames", & do_debug_frames
},
3164 { "frames-interp", & do_debug_frames_interp
},
3165 { "info", & do_debug_info
},
3166 { "line", & do_debug_lines
},
3167 { "loc", & do_debug_loc
},
3168 { "macro", & do_debug_macinfo
},
3169 { "pubnames", & do_debug_pubnames
},
3170 /* This entry is for compatability
3171 with earlier versions of readelf. */
3172 { "ranges", & do_debug_aranges
},
3173 { "str", & do_debug_str
},
3184 debug_dump_long_opts
* entry
;
3186 for (entry
= opts_table
; entry
->option
; entry
++)
3188 size_t len
= strlen (entry
->option
);
3190 if (strneq (p
, entry
->option
, len
)
3191 && (p
[len
] == ',' || p
[len
] == '\0'))
3193 * entry
->variable
= 1;
3195 /* The --debug-dump=frames-interp option also
3196 enables the --debug-dump=frames option. */
3197 if (do_debug_frames_interp
)
3198 do_debug_frames
= 1;
3205 if (entry
->option
== NULL
)
3207 warn (_("Unrecognized debug option '%s'\n"), p
);
3208 p
= strchr (p
, ',');
3218 #ifdef SUPPORT_DISASSEMBLY
3221 section
= strtoul (optarg
, & cp
, 0);
3222 if (! *cp
&& section
>= 0)
3223 request_dump_bynumber (section
, DISASS_DUMP
);
3225 request_dump_byname (optarg
, DISASS_DUMP
);
3228 print_version (program_name
);
3237 /* xgettext:c-format */
3238 error (_("Invalid option '-%c'\n"), c
);
3245 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
3246 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
3247 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
3248 && !do_section_groups
&& !do_archive_index
)
3252 warn (_("Nothing to do.\n"));
3258 get_elf_class (unsigned int elf_class
)
3260 static char buff
[32];
3264 case ELFCLASSNONE
: return _("none");
3265 case ELFCLASS32
: return "ELF32";
3266 case ELFCLASS64
: return "ELF64";
3268 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), elf_class
);
3274 get_data_encoding (unsigned int encoding
)
3276 static char buff
[32];
3280 case ELFDATANONE
: return _("none");
3281 case ELFDATA2LSB
: return _("2's complement, little endian");
3282 case ELFDATA2MSB
: return _("2's complement, big endian");
3284 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), encoding
);
3289 /* Decode the data held in 'elf_header'. */
3292 process_file_header (void)
3294 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
3295 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
3296 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
3297 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
3300 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3304 init_dwarf_regnames (elf_header
.e_machine
);
3310 printf (_("ELF Header:\n"));
3311 printf (_(" Magic: "));
3312 for (i
= 0; i
< EI_NIDENT
; i
++)
3313 printf ("%2.2x ", elf_header
.e_ident
[i
]);
3315 printf (_(" Class: %s\n"),
3316 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
3317 printf (_(" Data: %s\n"),
3318 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
3319 printf (_(" Version: %d %s\n"),
3320 elf_header
.e_ident
[EI_VERSION
],
3321 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
3323 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
3326 printf (_(" OS/ABI: %s\n"),
3327 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
3328 printf (_(" ABI Version: %d\n"),
3329 elf_header
.e_ident
[EI_ABIVERSION
]);
3330 printf (_(" Type: %s\n"),
3331 get_file_type (elf_header
.e_type
));
3332 printf (_(" Machine: %s\n"),
3333 get_machine_name (elf_header
.e_machine
));
3334 printf (_(" Version: 0x%lx\n"),
3335 (unsigned long) elf_header
.e_version
);
3337 printf (_(" Entry point address: "));
3338 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3339 printf (_("\n Start of program headers: "));
3340 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3341 printf (_(" (bytes into file)\n Start of section headers: "));
3342 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
3343 printf (_(" (bytes into file)\n"));
3345 printf (_(" Flags: 0x%lx%s\n"),
3346 (unsigned long) elf_header
.e_flags
,
3347 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
3348 printf (_(" Size of this header: %ld (bytes)\n"),
3349 (long) elf_header
.e_ehsize
);
3350 printf (_(" Size of program headers: %ld (bytes)\n"),
3351 (long) elf_header
.e_phentsize
);
3352 printf (_(" Number of program headers: %ld\n"),
3353 (long) elf_header
.e_phnum
);
3354 printf (_(" Size of section headers: %ld (bytes)\n"),
3355 (long) elf_header
.e_shentsize
);
3356 printf (_(" Number of section headers: %ld"),
3357 (long) elf_header
.e_shnum
);
3358 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
3359 printf (" (%ld)", (long) section_headers
[0].sh_size
);
3360 putc ('\n', stdout
);
3361 printf (_(" Section header string table index: %ld"),
3362 (long) elf_header
.e_shstrndx
);
3363 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
3364 printf (" (%ld)", (long) section_headers
[0].sh_link
);
3365 else if (elf_header
.e_shstrndx
!= SHN_UNDEF
3366 && (elf_header
.e_shstrndx
>= elf_header
.e_shnum
3367 || (elf_header
.e_shstrndx
>= SHN_LORESERVE
3368 && elf_header
.e_shstrndx
<= SHN_HIRESERVE
)))
3369 printf (" <corrupt: out of range>");
3370 putc ('\n', stdout
);
3373 if (section_headers
!= NULL
)
3375 if (elf_header
.e_shnum
== 0)
3376 elf_header
.e_shnum
= section_headers
[0].sh_size
;
3377 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
3378 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
3379 else if (elf_header
.e_shstrndx
!= SHN_UNDEF
3380 && (elf_header
.e_shstrndx
>= elf_header
.e_shnum
3381 || (elf_header
.e_shstrndx
>= SHN_LORESERVE
3382 && elf_header
.e_shstrndx
<= SHN_HIRESERVE
)))
3383 elf_header
.e_shstrndx
= SHN_UNDEF
;
3384 free (section_headers
);
3385 section_headers
= NULL
;
3393 get_32bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3395 Elf32_External_Phdr
*phdrs
;
3396 Elf32_External_Phdr
*external
;
3397 Elf_Internal_Phdr
*internal
;
3400 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3401 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3402 _("program headers"));
3406 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3407 i
< elf_header
.e_phnum
;
3408 i
++, internal
++, external
++)
3410 internal
->p_type
= BYTE_GET (external
->p_type
);
3411 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3412 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3413 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3414 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3415 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3416 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3417 internal
->p_align
= BYTE_GET (external
->p_align
);
3426 get_64bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3428 Elf64_External_Phdr
*phdrs
;
3429 Elf64_External_Phdr
*external
;
3430 Elf_Internal_Phdr
*internal
;
3433 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3434 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3435 _("program headers"));
3439 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3440 i
< elf_header
.e_phnum
;
3441 i
++, internal
++, external
++)
3443 internal
->p_type
= BYTE_GET (external
->p_type
);
3444 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3445 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3446 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3447 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3448 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3449 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3450 internal
->p_align
= BYTE_GET (external
->p_align
);
3458 /* Returns 1 if the program headers were read into `program_headers'. */
3461 get_program_headers (FILE *file
)
3463 Elf_Internal_Phdr
*phdrs
;
3465 /* Check cache of prior read. */
3466 if (program_headers
!= NULL
)
3469 phdrs
= cmalloc (elf_header
.e_phnum
, sizeof (Elf_Internal_Phdr
));
3473 error (_("Out of memory\n"));
3478 ? get_32bit_program_headers (file
, phdrs
)
3479 : get_64bit_program_headers (file
, phdrs
))
3481 program_headers
= phdrs
;
3489 /* Returns 1 if the program headers were loaded. */
3492 process_program_headers (FILE *file
)
3494 Elf_Internal_Phdr
*segment
;
3497 if (elf_header
.e_phnum
== 0)
3500 printf (_("\nThere are no program headers in this file.\n"));
3504 if (do_segments
&& !do_header
)
3506 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3507 printf (_("Entry point "));
3508 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3509 printf (_("\nThere are %d program headers, starting at offset "),
3510 elf_header
.e_phnum
);
3511 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3515 if (! get_program_headers (file
))
3520 if (elf_header
.e_phnum
> 1)
3521 printf (_("\nProgram Headers:\n"));
3523 printf (_("\nProgram Headers:\n"));
3527 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3530 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3534 (_(" Type Offset VirtAddr PhysAddr\n"));
3536 (_(" FileSiz MemSiz Flags Align\n"));
3543 for (i
= 0, segment
= program_headers
;
3544 i
< elf_header
.e_phnum
;
3549 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3553 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3554 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3555 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3556 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3557 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3559 (segment
->p_flags
& PF_R
? 'R' : ' '),
3560 (segment
->p_flags
& PF_W
? 'W' : ' '),
3561 (segment
->p_flags
& PF_X
? 'E' : ' '));
3562 printf ("%#lx", (unsigned long) segment
->p_align
);
3566 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3567 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3570 print_vma (segment
->p_offset
, FULL_HEX
);
3574 print_vma (segment
->p_vaddr
, FULL_HEX
);
3576 print_vma (segment
->p_paddr
, FULL_HEX
);
3579 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3580 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3583 print_vma (segment
->p_filesz
, FULL_HEX
);
3587 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3588 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3591 print_vma (segment
->p_offset
, FULL_HEX
);
3595 (segment
->p_flags
& PF_R
? 'R' : ' '),
3596 (segment
->p_flags
& PF_W
? 'W' : ' '),
3597 (segment
->p_flags
& PF_X
? 'E' : ' '));
3599 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3600 printf ("%#lx", (unsigned long) segment
->p_align
);
3603 print_vma (segment
->p_align
, PREFIX_HEX
);
3608 print_vma (segment
->p_offset
, FULL_HEX
);
3610 print_vma (segment
->p_vaddr
, FULL_HEX
);
3612 print_vma (segment
->p_paddr
, FULL_HEX
);
3614 print_vma (segment
->p_filesz
, FULL_HEX
);
3616 print_vma (segment
->p_memsz
, FULL_HEX
);
3618 (segment
->p_flags
& PF_R
? 'R' : ' '),
3619 (segment
->p_flags
& PF_W
? 'W' : ' '),
3620 (segment
->p_flags
& PF_X
? 'E' : ' '));
3621 print_vma (segment
->p_align
, HEX
);
3625 switch (segment
->p_type
)
3629 error (_("more than one dynamic segment\n"));
3631 /* By default, assume that the .dynamic section is the first
3632 section in the DYNAMIC segment. */
3633 dynamic_addr
= segment
->p_offset
;
3634 dynamic_size
= segment
->p_filesz
;
3636 /* Try to locate the .dynamic section. If there is
3637 a section header table, we can easily locate it. */
3638 if (section_headers
!= NULL
)
3640 Elf_Internal_Shdr
*sec
;
3642 sec
= find_section (".dynamic");
3643 if (sec
== NULL
|| sec
->sh_size
== 0)
3645 error (_("no .dynamic section in the dynamic segment\n"));
3649 if (sec
->sh_type
== SHT_NOBITS
)
3655 dynamic_addr
= sec
->sh_offset
;
3656 dynamic_size
= sec
->sh_size
;
3658 if (dynamic_addr
< segment
->p_offset
3659 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
3660 warn (_("the .dynamic section is not contained"
3661 " within the dynamic segment\n"));
3662 else if (dynamic_addr
> segment
->p_offset
)
3663 warn (_("the .dynamic section is not the first section"
3664 " in the dynamic segment.\n"));
3669 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3671 error (_("Unable to find program interpreter name\n"));
3675 int ret
= snprintf (fmt
, sizeof (fmt
), "%%%ds", PATH_MAX
);
3677 if (ret
>= (int) sizeof (fmt
) || ret
< 0)
3678 error (_("Internal error: failed to create format string to display program interpreter\n"));
3680 program_interpreter
[0] = 0;
3681 if (fscanf (file
, fmt
, program_interpreter
) <= 0)
3682 error (_("Unable to read program interpreter name\n"));
3685 printf (_("\n [Requesting program interpreter: %s]"),
3686 program_interpreter
);
3692 putc ('\n', stdout
);
3695 if (do_segments
&& section_headers
!= NULL
&& string_table
!= NULL
)
3697 printf (_("\n Section to Segment mapping:\n"));
3698 printf (_(" Segment Sections...\n"));
3700 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3703 Elf_Internal_Shdr
*section
;
3705 segment
= program_headers
+ i
;
3706 section
= section_headers
;
3708 printf (" %2.2d ", i
);
3710 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3712 if (ELF_IS_SECTION_IN_SEGMENT_MEMORY(section
, segment
))
3713 printf ("%s ", SECTION_NAME (section
));
3724 /* Find the file offset corresponding to VMA by using the program headers. */
3727 offset_from_vma (FILE *file
, bfd_vma vma
, bfd_size_type size
)
3729 Elf_Internal_Phdr
*seg
;
3731 if (! get_program_headers (file
))
3733 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3737 for (seg
= program_headers
;
3738 seg
< program_headers
+ elf_header
.e_phnum
;
3741 if (seg
->p_type
!= PT_LOAD
)
3744 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3745 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3746 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3749 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3756 get_32bit_section_headers (FILE *file
, unsigned int num
)
3758 Elf32_External_Shdr
*shdrs
;
3759 Elf_Internal_Shdr
*internal
;
3762 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3763 elf_header
.e_shentsize
, num
, _("section headers"));
3767 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3769 if (section_headers
== NULL
)
3771 error (_("Out of memory\n"));
3775 for (i
= 0, internal
= section_headers
;
3779 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3780 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3781 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3782 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3783 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3784 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3785 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3786 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3787 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3788 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3797 get_64bit_section_headers (FILE *file
, unsigned int num
)
3799 Elf64_External_Shdr
*shdrs
;
3800 Elf_Internal_Shdr
*internal
;
3803 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3804 elf_header
.e_shentsize
, num
, _("section headers"));
3808 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3810 if (section_headers
== NULL
)
3812 error (_("Out of memory\n"));
3816 for (i
= 0, internal
= section_headers
;
3820 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3821 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3822 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3823 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3824 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3825 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3826 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3827 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3828 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3829 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3837 static Elf_Internal_Sym
*
3838 get_32bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3840 unsigned long number
;
3841 Elf32_External_Sym
*esyms
;
3842 Elf_External_Sym_Shndx
*shndx
;
3843 Elf_Internal_Sym
*isyms
;
3844 Elf_Internal_Sym
*psym
;
3847 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3853 if (symtab_shndx_hdr
!= NULL
3854 && (symtab_shndx_hdr
->sh_link
3855 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3857 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3858 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3866 number
= section
->sh_size
/ section
->sh_entsize
;
3867 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3871 error (_("Out of memory\n"));
3878 for (j
= 0, psym
= isyms
;
3882 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3883 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3884 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3885 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3886 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3888 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3889 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3890 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3900 static Elf_Internal_Sym
*
3901 get_64bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3903 unsigned long number
;
3904 Elf64_External_Sym
*esyms
;
3905 Elf_External_Sym_Shndx
*shndx
;
3906 Elf_Internal_Sym
*isyms
;
3907 Elf_Internal_Sym
*psym
;
3910 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3916 if (symtab_shndx_hdr
!= NULL
3917 && (symtab_shndx_hdr
->sh_link
3918 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3920 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3921 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3929 number
= section
->sh_size
/ section
->sh_entsize
;
3930 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3934 error (_("Out of memory\n"));
3941 for (j
= 0, psym
= isyms
;
3945 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3946 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3947 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3948 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3949 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3951 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3952 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3953 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3964 get_elf_section_flags (bfd_vma sh_flags
)
3966 static char buff
[1024];
3968 int field_size
= is_32bit_elf
? 8 : 16;
3969 int index
, size
= sizeof (buff
) - (field_size
+ 4 + 1);
3970 bfd_vma os_flags
= 0;
3971 bfd_vma proc_flags
= 0;
3972 bfd_vma unknown_flags
= 0;
3986 { "LINK ORDER", 10 },
3987 { "OS NONCONF", 10 },
3990 /* IA-64 specific. */
3993 /* IA-64 OpenVMS specific. */
3994 { "VMS_GLOBAL", 10 },
3995 { "VMS_OVERLAID", 12 },
3996 { "VMS_SHARED", 10 },
3997 { "VMS_VECTOR", 10 },
3998 { "VMS_ALLOC_64BIT", 15 },
3999 { "VMS_PROTECTED", 13}
4002 if (do_section_details
)
4004 sprintf (buff
, "[%*.*lx]: ",
4005 field_size
, field_size
, (unsigned long) sh_flags
);
4006 p
+= field_size
+ 4;
4013 flag
= sh_flags
& - sh_flags
;
4016 if (do_section_details
)
4020 case SHF_WRITE
: index
= 0; break;
4021 case SHF_ALLOC
: index
= 1; break;
4022 case SHF_EXECINSTR
: index
= 2; break;
4023 case SHF_MERGE
: index
= 3; break;
4024 case SHF_STRINGS
: index
= 4; break;
4025 case SHF_INFO_LINK
: index
= 5; break;
4026 case SHF_LINK_ORDER
: index
= 6; break;
4027 case SHF_OS_NONCONFORMING
: index
= 7; break;
4028 case SHF_GROUP
: index
= 8; break;
4029 case SHF_TLS
: index
= 9; break;
4033 if (elf_header
.e_machine
== EM_IA_64
)
4035 if (flag
== SHF_IA_64_SHORT
)
4037 else if (flag
== SHF_IA_64_NORECOV
)
4040 else if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_OPENVMS
)
4043 case SHF_IA_64_VMS_GLOBAL
: index
= 12; break;
4044 case SHF_IA_64_VMS_OVERLAID
: index
= 13; break;
4045 case SHF_IA_64_VMS_SHARED
: index
= 14; break;
4046 case SHF_IA_64_VMS_VECTOR
: index
= 15; break;
4047 case SHF_IA_64_VMS_ALLOC_64BIT
: index
= 16; break;
4048 case SHF_IA_64_VMS_PROTECTED
: index
= 17; break;
4058 if (p
!= buff
+ field_size
+ 4)
4060 if (size
< (10 + 2))
4067 size
-= flags
[index
].len
;
4068 p
= stpcpy (p
, flags
[index
].str
);
4070 else if (flag
& SHF_MASKOS
)
4072 else if (flag
& SHF_MASKPROC
)
4075 unknown_flags
|= flag
;
4081 case SHF_WRITE
: *p
= 'W'; break;
4082 case SHF_ALLOC
: *p
= 'A'; break;
4083 case SHF_EXECINSTR
: *p
= 'X'; break;
4084 case SHF_MERGE
: *p
= 'M'; break;
4085 case SHF_STRINGS
: *p
= 'S'; break;
4086 case SHF_INFO_LINK
: *p
= 'I'; break;
4087 case SHF_LINK_ORDER
: *p
= 'L'; break;
4088 case SHF_OS_NONCONFORMING
: *p
= 'O'; break;
4089 case SHF_GROUP
: *p
= 'G'; break;
4090 case SHF_TLS
: *p
= 'T'; break;
4093 if (elf_header
.e_machine
== EM_X86_64
4094 && flag
== SHF_X86_64_LARGE
)
4096 else if (flag
& SHF_MASKOS
)
4099 sh_flags
&= ~ SHF_MASKOS
;
4101 else if (flag
& SHF_MASKPROC
)
4104 sh_flags
&= ~ SHF_MASKPROC
;
4114 if (do_section_details
)
4118 size
-= 5 + field_size
;
4119 if (p
!= buff
+ field_size
+ 4)
4127 sprintf (p
, "OS (%*.*lx)", field_size
, field_size
,
4128 (unsigned long) os_flags
);
4129 p
+= 5 + field_size
;
4133 size
-= 7 + field_size
;
4134 if (p
!= buff
+ field_size
+ 4)
4142 sprintf (p
, "PROC (%*.*lx)", field_size
, field_size
,
4143 (unsigned long) proc_flags
);
4144 p
+= 7 + field_size
;
4148 size
-= 10 + field_size
;
4149 if (p
!= buff
+ field_size
+ 4)
4157 sprintf (p
, "UNKNOWN (%*.*lx)", field_size
, field_size
,
4158 (unsigned long) unknown_flags
);
4159 p
+= 10 + field_size
;
4168 process_section_headers (FILE *file
)
4170 Elf_Internal_Shdr
*section
;
4173 section_headers
= NULL
;
4175 if (elf_header
.e_shnum
== 0)
4178 printf (_("\nThere are no sections in this file.\n"));
4183 if (do_sections
&& !do_header
)
4184 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
4185 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
4189 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
4192 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
4195 /* Read in the string table, so that we have names to display. */
4196 if (elf_header
.e_shstrndx
!= SHN_UNDEF
4197 && SECTION_HEADER_INDEX (elf_header
.e_shstrndx
) < elf_header
.e_shnum
)
4199 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
4201 if (section
->sh_size
!= 0)
4203 string_table
= get_data (NULL
, file
, section
->sh_offset
,
4204 1, section
->sh_size
, _("string table"));
4206 string_table_length
= string_table
!= NULL
? section
->sh_size
: 0;
4210 /* Scan the sections for the dynamic symbol table
4211 and dynamic string table and debug sections. */
4212 dynamic_symbols
= NULL
;
4213 dynamic_strings
= NULL
;
4214 dynamic_syminfo
= NULL
;
4215 symtab_shndx_hdr
= NULL
;
4217 eh_addr_size
= is_32bit_elf
? 4 : 8;
4218 switch (elf_header
.e_machine
)
4221 case EM_MIPS_RS3_LE
:
4222 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
4223 FDE addresses. However, the ABI also has a semi-official ILP32
4224 variant for which the normal FDE address size rules apply.
4226 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
4227 section, where XX is the size of longs in bits. Unfortunately,
4228 earlier compilers provided no way of distinguishing ILP32 objects
4229 from LP64 objects, so if there's any doubt, we should assume that
4230 the official LP64 form is being used. */
4231 if ((elf_header
.e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
4232 && find_section (".gcc_compiled_long32") == NULL
)
4238 switch (elf_header
.e_flags
& EF_H8_MACH
)
4240 case E_H8_MACH_H8300
:
4241 case E_H8_MACH_H8300HN
:
4242 case E_H8_MACH_H8300SN
:
4243 case E_H8_MACH_H8300SXN
:
4246 case E_H8_MACH_H8300H
:
4247 case E_H8_MACH_H8300S
:
4248 case E_H8_MACH_H8300SX
:
4255 switch (elf_header
.e_flags
& EF_M32C_CPU_MASK
)
4257 case EF_M32C_CPU_M16C
:
4264 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
4267 size_t expected_entsize \
4268 = is_32bit_elf ? size32 : size64; \
4269 if (section->sh_entsize != expected_entsize) \
4270 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
4271 i, (unsigned long int) section->sh_entsize, \
4272 (unsigned long int) expected_entsize); \
4273 section->sh_entsize = expected_entsize; \
4276 #define CHECK_ENTSIZE(section, i, type) \
4277 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
4278 sizeof (Elf64_External_##type))
4280 for (i
= 0, section
= section_headers
;
4281 i
< elf_header
.e_shnum
;
4284 char *name
= SECTION_NAME (section
);
4286 if (section
->sh_type
== SHT_DYNSYM
)
4288 if (dynamic_symbols
!= NULL
)
4290 error (_("File contains multiple dynamic symbol tables\n"));
4294 CHECK_ENTSIZE (section
, i
, Sym
);
4295 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
4296 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
4298 else if (section
->sh_type
== SHT_STRTAB
4299 && streq (name
, ".dynstr"))
4301 if (dynamic_strings
!= NULL
)
4303 error (_("File contains multiple dynamic string tables\n"));
4307 dynamic_strings
= get_data (NULL
, file
, section
->sh_offset
,
4308 1, section
->sh_size
, _("dynamic strings"));
4309 dynamic_strings_length
= section
->sh_size
;
4311 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
4313 if (symtab_shndx_hdr
!= NULL
)
4315 error (_("File contains multiple symtab shndx tables\n"));
4318 symtab_shndx_hdr
= section
;
4320 else if (section
->sh_type
== SHT_SYMTAB
)
4321 CHECK_ENTSIZE (section
, i
, Sym
);
4322 else if (section
->sh_type
== SHT_GROUP
)
4323 CHECK_ENTSIZE_VALUES (section
, i
, GRP_ENTRY_SIZE
, GRP_ENTRY_SIZE
);
4324 else if (section
->sh_type
== SHT_REL
)
4325 CHECK_ENTSIZE (section
, i
, Rel
);
4326 else if (section
->sh_type
== SHT_RELA
)
4327 CHECK_ENTSIZE (section
, i
, Rela
);
4328 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
4329 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
4330 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
4331 || do_debug_loc
|| do_debug_ranges
)
4332 && const_strneq (name
, ".debug_"))
4337 || (do_debug_info
&& streq (name
, "info"))
4338 || (do_debug_abbrevs
&& streq (name
, "abbrev"))
4339 || (do_debug_lines
&& streq (name
, "line"))
4340 || (do_debug_pubnames
&& streq (name
, "pubnames"))
4341 || (do_debug_aranges
&& streq (name
, "aranges"))
4342 || (do_debug_ranges
&& streq (name
, "ranges"))
4343 || (do_debug_frames
&& streq (name
, "frame"))
4344 || (do_debug_macinfo
&& streq (name
, "macinfo"))
4345 || (do_debug_str
&& streq (name
, "str"))
4346 || (do_debug_loc
&& streq (name
, "loc"))
4348 request_dump_bynumber (i
, DEBUG_DUMP
);
4350 /* linkonce section to be combined with .debug_info at link time. */
4351 else if ((do_debugging
|| do_debug_info
)
4352 && const_strneq (name
, ".gnu.linkonce.wi."))
4353 request_dump_bynumber (i
, DEBUG_DUMP
);
4354 else if (do_debug_frames
&& streq (name
, ".eh_frame"))
4355 request_dump_bynumber (i
, DEBUG_DUMP
);
4361 if (elf_header
.e_shnum
> 1)
4362 printf (_("\nSection Headers:\n"));
4364 printf (_("\nSection Header:\n"));
4368 if (do_section_details
)
4370 printf (_(" [Nr] Name\n"));
4371 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
4375 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4379 if (do_section_details
)
4381 printf (_(" [Nr] Name\n"));
4382 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
4386 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4390 if (do_section_details
)
4392 printf (_(" [Nr] Name\n"));
4393 printf (_(" Type Address Offset Link\n"));
4394 printf (_(" Size EntSize Info Align\n"));
4398 printf (_(" [Nr] Name Type Address Offset\n"));
4399 printf (_(" Size EntSize Flags Link Info Align\n"));
4403 if (do_section_details
)
4404 printf (_(" Flags\n"));
4406 for (i
= 0, section
= section_headers
;
4407 i
< elf_header
.e_shnum
;
4410 if (do_section_details
)
4412 printf (" [%2u] %s\n",
4413 SECTION_HEADER_NUM (i
),
4414 SECTION_NAME (section
));
4415 if (is_32bit_elf
|| do_wide
)
4416 printf (" %-15.15s ",
4417 get_section_type_name (section
->sh_type
));
4420 printf (" [%2u] %-17.17s %-15.15s ",
4421 SECTION_HEADER_NUM (i
),
4422 SECTION_NAME (section
),
4423 get_section_type_name (section
->sh_type
));
4427 print_vma (section
->sh_addr
, LONG_HEX
);
4429 printf ( " %6.6lx %6.6lx %2.2lx",
4430 (unsigned long) section
->sh_offset
,
4431 (unsigned long) section
->sh_size
,
4432 (unsigned long) section
->sh_entsize
);
4434 if (do_section_details
)
4435 fputs (" ", stdout
);
4437 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4439 printf ("%2ld %3lu %2ld\n",
4440 (unsigned long) section
->sh_link
,
4441 (unsigned long) section
->sh_info
,
4442 (unsigned long) section
->sh_addralign
);
4446 print_vma (section
->sh_addr
, LONG_HEX
);
4448 if ((long) section
->sh_offset
== section
->sh_offset
)
4449 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
4453 print_vma (section
->sh_offset
, LONG_HEX
);
4456 if ((unsigned long) section
->sh_size
== section
->sh_size
)
4457 printf (" %6.6lx", (unsigned long) section
->sh_size
);
4461 print_vma (section
->sh_size
, LONG_HEX
);
4464 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
4465 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
4469 print_vma (section
->sh_entsize
, LONG_HEX
);
4472 if (do_section_details
)
4473 fputs (" ", stdout
);
4475 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4477 printf ("%2ld %3lu ",
4478 (unsigned long) section
->sh_link
,
4479 (unsigned long) section
->sh_info
);
4481 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
4482 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
4485 print_vma (section
->sh_addralign
, DEC
);
4489 else if (do_section_details
)
4491 printf (" %-15.15s ",
4492 get_section_type_name (section
->sh_type
));
4493 print_vma (section
->sh_addr
, LONG_HEX
);
4494 if ((long) section
->sh_offset
== section
->sh_offset
)
4495 printf (" %16.16lx", (unsigned long) section
->sh_offset
);
4499 print_vma (section
->sh_offset
, LONG_HEX
);
4501 printf (" %ld\n ", (unsigned long) section
->sh_link
);
4502 print_vma (section
->sh_size
, LONG_HEX
);
4504 print_vma (section
->sh_entsize
, LONG_HEX
);
4506 printf (" %-16lu %ld\n",
4507 (unsigned long) section
->sh_info
,
4508 (unsigned long) section
->sh_addralign
);
4513 print_vma (section
->sh_addr
, LONG_HEX
);
4514 if ((long) section
->sh_offset
== section
->sh_offset
)
4515 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
4519 print_vma (section
->sh_offset
, LONG_HEX
);
4522 print_vma (section
->sh_size
, LONG_HEX
);
4524 print_vma (section
->sh_entsize
, LONG_HEX
);
4526 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4528 printf (" %2ld %3lu %ld\n",
4529 (unsigned long) section
->sh_link
,
4530 (unsigned long) section
->sh_info
,
4531 (unsigned long) section
->sh_addralign
);
4534 if (do_section_details
)
4535 printf (" %s\n", get_elf_section_flags (section
->sh_flags
));
4538 if (!do_section_details
)
4539 printf (_("Key to Flags:\n\
4540 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4541 I (info), L (link order), G (group), x (unknown)\n\
4542 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4548 get_group_flags (unsigned int flags
)
4550 static char buff
[32];
4557 snprintf (buff
, sizeof (buff
), _("[<unknown>: 0x%x]"), flags
);
4564 process_section_groups (FILE *file
)
4566 Elf_Internal_Shdr
*section
;
4568 struct group
*group
;
4569 Elf_Internal_Shdr
*symtab_sec
, *strtab_sec
;
4570 Elf_Internal_Sym
*symtab
;
4574 /* Don't process section groups unless needed. */
4575 if (!do_unwind
&& !do_section_groups
)
4578 if (elf_header
.e_shnum
== 0)
4580 if (do_section_groups
)
4581 printf (_("\nThere are no sections in this file.\n"));
4586 if (section_headers
== NULL
)
4588 error (_("Section headers are not available!\n"));
4592 section_headers_groups
= calloc (elf_header
.e_shnum
,
4593 sizeof (struct group
*));
4595 if (section_headers_groups
== NULL
)
4597 error (_("Out of memory\n"));
4601 /* Scan the sections for the group section. */
4603 for (i
= 0, section
= section_headers
;
4604 i
< elf_header
.e_shnum
;
4606 if (section
->sh_type
== SHT_GROUP
)
4609 if (group_count
== 0)
4611 if (do_section_groups
)
4612 printf (_("\nThere are no section groups in this file.\n"));
4617 section_groups
= calloc (group_count
, sizeof (struct group
));
4619 if (section_groups
== NULL
)
4621 error (_("Out of memory\n"));
4630 for (i
= 0, section
= section_headers
, group
= section_groups
;
4631 i
< elf_header
.e_shnum
;
4634 if (section
->sh_type
== SHT_GROUP
)
4636 char *name
= SECTION_NAME (section
);
4638 unsigned char *start
, *indices
;
4639 unsigned int entry
, j
, size
;
4640 Elf_Internal_Shdr
*sec
;
4641 Elf_Internal_Sym
*sym
;
4643 /* Get the symbol table. */
4644 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
4645 || ((sec
= SECTION_HEADER (section
->sh_link
))->sh_type
4648 error (_("Bad sh_link in group section `%s'\n"), name
);
4652 if (symtab_sec
!= sec
)
4657 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
);
4660 sym
= symtab
+ section
->sh_info
;
4662 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4664 bfd_vma sec_index
= SECTION_HEADER_INDEX (sym
->st_shndx
);
4667 error (_("Bad sh_info in group section `%s'\n"), name
);
4671 group_name
= SECTION_NAME (section_headers
+ sec_index
);
4680 /* Get the string table. */
4681 if (SECTION_HEADER_INDEX (symtab_sec
->sh_link
)
4682 >= elf_header
.e_shnum
)
4691 != (sec
= SECTION_HEADER (symtab_sec
->sh_link
)))
4696 strtab
= get_data (NULL
, file
, strtab_sec
->sh_offset
,
4697 1, strtab_sec
->sh_size
,
4699 strtab_size
= strtab
!= NULL
? strtab_sec
->sh_size
: 0;
4701 group_name
= sym
->st_name
< strtab_size
4702 ? strtab
+ sym
->st_name
: "<corrupt>";
4705 start
= get_data (NULL
, file
, section
->sh_offset
,
4706 1, section
->sh_size
, _("section data"));
4709 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
4710 entry
= byte_get (indices
, 4);
4713 if (do_section_groups
)
4715 printf ("\n%s group section [%5u] `%s' [%s] contains %u sections:\n",
4716 get_group_flags (entry
), i
, name
, group_name
, size
);
4718 printf (_(" [Index] Name\n"));
4721 group
->group_index
= i
;
4723 for (j
= 0; j
< size
; j
++)
4725 struct group_list
*g
;
4727 entry
= byte_get (indices
, 4);
4730 if (SECTION_HEADER_INDEX (entry
) >= elf_header
.e_shnum
)
4732 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
4733 entry
, i
, elf_header
.e_shnum
- 1);
4736 else if (entry
>= SHN_LORESERVE
&& entry
<= SHN_HIRESERVE
)
4738 error (_("invalid section [%5u] in group section [%5u]\n"),
4743 if (section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4748 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
4750 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4755 /* Intel C/C++ compiler may put section 0 in a
4756 section group. We just warn it the first time
4757 and ignore it afterwards. */
4758 static int warned
= 0;
4761 error (_("section 0 in group section [%5u]\n"),
4762 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4768 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4771 if (do_section_groups
)
4773 sec
= SECTION_HEADER (entry
);
4774 printf (" [%5u] %s\n", entry
, SECTION_NAME (sec
));
4777 g
= xmalloc (sizeof (struct group_list
));
4778 g
->section_index
= entry
;
4779 g
->next
= group
->root
;
4803 } dynamic_relocations
[] =
4805 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
4806 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
4807 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
4810 /* Process the reloc section. */
4813 process_relocs (FILE *file
)
4815 unsigned long rel_size
;
4816 unsigned long rel_offset
;
4822 if (do_using_dynamic
)
4826 int has_dynamic_reloc
;
4829 has_dynamic_reloc
= 0;
4831 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
4833 is_rela
= dynamic_relocations
[i
].rela
;
4834 name
= dynamic_relocations
[i
].name
;
4835 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
4836 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
4838 has_dynamic_reloc
|= rel_size
;
4840 if (is_rela
== UNKNOWN
)
4842 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
4843 switch (dynamic_info
[DT_PLTREL
])
4857 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4858 name
, rel_offset
, rel_size
);
4860 dump_relocations (file
,
4861 offset_from_vma (file
, rel_offset
, rel_size
),
4863 dynamic_symbols
, num_dynamic_syms
,
4864 dynamic_strings
, dynamic_strings_length
, is_rela
);
4868 if (! has_dynamic_reloc
)
4869 printf (_("\nThere are no dynamic relocations in this file.\n"));
4873 Elf_Internal_Shdr
*section
;
4877 for (i
= 0, section
= section_headers
;
4878 i
< elf_header
.e_shnum
;
4881 if ( section
->sh_type
!= SHT_RELA
4882 && section
->sh_type
!= SHT_REL
)
4885 rel_offset
= section
->sh_offset
;
4886 rel_size
= section
->sh_size
;
4890 Elf_Internal_Shdr
*strsec
;
4893 printf (_("\nRelocation section "));
4895 if (string_table
== NULL
)
4896 printf ("%d", section
->sh_name
);
4898 printf (_("'%s'"), SECTION_NAME (section
));
4900 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4901 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4903 is_rela
= section
->sh_type
== SHT_RELA
;
4905 if (section
->sh_link
4906 && SECTION_HEADER_INDEX (section
->sh_link
)
4907 < elf_header
.e_shnum
)
4909 Elf_Internal_Shdr
*symsec
;
4910 Elf_Internal_Sym
*symtab
;
4911 unsigned long nsyms
;
4912 unsigned long strtablen
= 0;
4913 char *strtab
= NULL
;
4915 symsec
= SECTION_HEADER (section
->sh_link
);
4916 if (symsec
->sh_type
!= SHT_SYMTAB
4917 && symsec
->sh_type
!= SHT_DYNSYM
)
4920 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4921 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4926 if (SECTION_HEADER_INDEX (symsec
->sh_link
)
4927 < elf_header
.e_shnum
)
4929 strsec
= SECTION_HEADER (symsec
->sh_link
);
4931 strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4934 strtablen
= strtab
== NULL
? 0 : strsec
->sh_size
;
4937 dump_relocations (file
, rel_offset
, rel_size
,
4938 symtab
, nsyms
, strtab
, strtablen
, is_rela
);
4944 dump_relocations (file
, rel_offset
, rel_size
,
4945 NULL
, 0, NULL
, 0, is_rela
);
4952 printf (_("\nThere are no relocations in this file.\n"));
4958 /* Process the unwind section. */
4960 #include "unwind-ia64.h"
4962 /* An absolute address consists of a section and an offset. If the
4963 section is NULL, the offset itself is the address, otherwise, the
4964 address equals to LOAD_ADDRESS(section) + offset. */
4968 unsigned short section
;
4972 #define ABSADDR(a) \
4974 ? section_headers [(a).section].sh_addr + (a).offset \
4977 struct ia64_unw_aux_info
4979 struct ia64_unw_table_entry
4981 struct absaddr start
;
4983 struct absaddr info
;
4985 *table
; /* Unwind table. */
4986 unsigned long table_len
; /* Length of unwind table. */
4987 unsigned char *info
; /* Unwind info. */
4988 unsigned long info_size
; /* Size of unwind info. */
4989 bfd_vma info_addr
; /* starting address of unwind info. */
4990 bfd_vma seg_base
; /* Starting address of segment. */
4991 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4992 unsigned long nsyms
; /* Number of symbols. */
4993 char *strtab
; /* The string table. */
4994 unsigned long strtab_size
; /* Size of string table. */
4998 find_symbol_for_address (Elf_Internal_Sym
*symtab
,
4999 unsigned long nsyms
,
5001 unsigned long strtab_size
,
5002 struct absaddr addr
,
5003 const char **symname
,
5006 bfd_vma dist
= 0x100000;
5007 Elf_Internal_Sym
*sym
, *best
= NULL
;
5010 for (i
= 0, sym
= symtab
; i
< nsyms
; ++i
, ++sym
)
5012 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
5013 && sym
->st_name
!= 0
5014 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
5015 && addr
.offset
>= sym
->st_value
5016 && addr
.offset
- sym
->st_value
< dist
)
5019 dist
= addr
.offset
- sym
->st_value
;
5026 *symname
= (best
->st_name
>= strtab_size
5027 ? "<corrupt>" : strtab
+ best
->st_name
);
5032 *offset
= addr
.offset
;
5036 dump_ia64_unwind (struct ia64_unw_aux_info
*aux
)
5038 struct ia64_unw_table_entry
*tp
;
5041 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
5045 const unsigned char *dp
;
5046 const unsigned char *head
;
5047 const char *procname
;
5049 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
5050 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
5052 fputs ("\n<", stdout
);
5056 fputs (procname
, stdout
);
5059 printf ("+%lx", (unsigned long) offset
);
5062 fputs (">: [", stdout
);
5063 print_vma (tp
->start
.offset
, PREFIX_HEX
);
5064 fputc ('-', stdout
);
5065 print_vma (tp
->end
.offset
, PREFIX_HEX
);
5066 printf ("], info at +0x%lx\n",
5067 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
5069 head
= aux
->info
+ (ABSADDR (tp
->info
) - aux
->info_addr
);
5070 stamp
= byte_get ((unsigned char *) head
, sizeof (stamp
));
5072 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
5073 (unsigned) UNW_VER (stamp
),
5074 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
5075 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
5076 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
5077 (unsigned long) (eh_addr_size
* UNW_LENGTH (stamp
)));
5079 if (UNW_VER (stamp
) != 1)
5081 printf ("\tUnknown version.\n");
5086 for (dp
= head
+ 8; dp
< head
+ 8 + eh_addr_size
* UNW_LENGTH (stamp
);)
5087 dp
= unw_decode (dp
, in_body
, & in_body
);
5092 slurp_ia64_unwind_table (FILE *file
,
5093 struct ia64_unw_aux_info
*aux
,
5094 Elf_Internal_Shdr
*sec
)
5096 unsigned long size
, nrelas
, i
;
5097 Elf_Internal_Phdr
*seg
;
5098 struct ia64_unw_table_entry
*tep
;
5099 Elf_Internal_Shdr
*relsec
;
5100 Elf_Internal_Rela
*rela
, *rp
;
5101 unsigned char *table
, *tp
;
5102 Elf_Internal_Sym
*sym
;
5103 const char *relname
;
5105 /* First, find the starting address of the segment that includes
5108 if (elf_header
.e_phnum
)
5110 if (! get_program_headers (file
))
5113 for (seg
= program_headers
;
5114 seg
< program_headers
+ elf_header
.e_phnum
;
5117 if (seg
->p_type
!= PT_LOAD
)
5120 if (sec
->sh_addr
>= seg
->p_vaddr
5121 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5123 aux
->seg_base
= seg
->p_vaddr
;
5129 /* Second, build the unwind table from the contents of the unwind section: */
5130 size
= sec
->sh_size
;
5131 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
5135 aux
->table
= xcmalloc (size
/ (3 * eh_addr_size
), sizeof (aux
->table
[0]));
5137 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * eh_addr_size
, ++tep
)
5139 tep
->start
.section
= SHN_UNDEF
;
5140 tep
->end
.section
= SHN_UNDEF
;
5141 tep
->info
.section
= SHN_UNDEF
;
5144 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
5145 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
5146 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
5150 tep
->start
.offset
= BYTE_GET ((unsigned char *) tp
+ 0);
5151 tep
->end
.offset
= BYTE_GET ((unsigned char *) tp
+ 8);
5152 tep
->info
.offset
= BYTE_GET ((unsigned char *) tp
+ 16);
5154 tep
->start
.offset
+= aux
->seg_base
;
5155 tep
->end
.offset
+= aux
->seg_base
;
5156 tep
->info
.offset
+= aux
->seg_base
;
5160 /* Third, apply any relocations to the unwind table: */
5161 for (relsec
= section_headers
;
5162 relsec
< section_headers
+ elf_header
.e_shnum
;
5165 if (relsec
->sh_type
!= SHT_RELA
5166 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
5167 || SECTION_HEADER (relsec
->sh_info
) != sec
)
5170 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5174 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5176 relname
= elf_ia64_reloc_type (get_reloc_type (rp
->r_info
));
5177 sym
= aux
->symtab
+ get_reloc_symindex (rp
->r_info
);
5179 if (! const_strneq (relname
, "R_IA64_SEGREL"))
5181 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5185 i
= rp
->r_offset
/ (3 * eh_addr_size
);
5187 switch (rp
->r_offset
/eh_addr_size
% 3)
5190 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5191 aux
->table
[i
].start
.offset
+= rp
->r_addend
+ sym
->st_value
;
5194 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5195 aux
->table
[i
].end
.offset
+= rp
->r_addend
+ sym
->st_value
;
5198 aux
->table
[i
].info
.section
= sym
->st_shndx
;
5199 aux
->table
[i
].info
.offset
+= rp
->r_addend
+ sym
->st_value
;
5209 aux
->table_len
= size
/ (3 * eh_addr_size
);
5214 ia64_process_unwind (FILE *file
)
5216 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
5217 unsigned long i
, unwcount
= 0, unwstart
= 0;
5218 struct ia64_unw_aux_info aux
;
5220 memset (& aux
, 0, sizeof (aux
));
5222 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5224 if (sec
->sh_type
== SHT_SYMTAB
5225 && SECTION_HEADER_INDEX (sec
->sh_link
) < elf_header
.e_shnum
)
5227 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5228 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5230 strsec
= SECTION_HEADER (sec
->sh_link
);
5231 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
5232 1, strsec
->sh_size
, _("string table"));
5233 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5235 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
5240 printf (_("\nThere are no unwind sections in this file.\n"));
5242 while (unwcount
-- > 0)
5247 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
5248 i
< elf_header
.e_shnum
; ++i
, ++sec
)
5249 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
5256 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
5258 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
5260 /* We need to find which section group it is in. */
5261 struct group_list
*g
= section_headers_groups
[i
]->root
;
5263 for (; g
!= NULL
; g
= g
->next
)
5265 sec
= SECTION_HEADER (g
->section_index
);
5267 if (streq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
))
5272 i
= elf_header
.e_shnum
;
5274 else if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
, len
))
5276 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
5277 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
5278 suffix
= SECTION_NAME (unwsec
) + len
;
5279 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
5281 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info_once
, len2
)
5282 && streq (SECTION_NAME (sec
) + len2
, suffix
))
5287 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
5288 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
5289 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
5290 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
5292 if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
, len
))
5293 suffix
= SECTION_NAME (unwsec
) + len
;
5294 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
5296 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
, len2
)
5297 && streq (SECTION_NAME (sec
) + len2
, suffix
))
5301 if (i
== elf_header
.e_shnum
)
5303 printf (_("\nCould not find unwind info section for "));
5305 if (string_table
== NULL
)
5306 printf ("%d", unwsec
->sh_name
);
5308 printf (_("'%s'"), SECTION_NAME (unwsec
));
5312 aux
.info_size
= sec
->sh_size
;
5313 aux
.info_addr
= sec
->sh_addr
;
5314 aux
.info
= get_data (NULL
, file
, sec
->sh_offset
, 1, aux
.info_size
,
5317 printf (_("\nUnwind section "));
5319 if (string_table
== NULL
)
5320 printf ("%d", unwsec
->sh_name
);
5322 printf (_("'%s'"), SECTION_NAME (unwsec
));
5324 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5325 (unsigned long) unwsec
->sh_offset
,
5326 (unsigned long) (unwsec
->sh_size
/ (3 * eh_addr_size
)));
5328 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
5330 if (aux
.table_len
> 0)
5331 dump_ia64_unwind (& aux
);
5334 free ((char *) aux
.table
);
5336 free ((char *) aux
.info
);
5345 free ((char *) aux
.strtab
);
5350 struct hppa_unw_aux_info
5352 struct hppa_unw_table_entry
5354 struct absaddr start
;
5356 unsigned int Cannot_unwind
:1; /* 0 */
5357 unsigned int Millicode
:1; /* 1 */
5358 unsigned int Millicode_save_sr0
:1; /* 2 */
5359 unsigned int Region_description
:2; /* 3..4 */
5360 unsigned int reserved1
:1; /* 5 */
5361 unsigned int Entry_SR
:1; /* 6 */
5362 unsigned int Entry_FR
:4; /* number saved */ /* 7..10 */
5363 unsigned int Entry_GR
:5; /* number saved */ /* 11..15 */
5364 unsigned int Args_stored
:1; /* 16 */
5365 unsigned int Variable_Frame
:1; /* 17 */
5366 unsigned int Separate_Package_Body
:1; /* 18 */
5367 unsigned int Frame_Extension_Millicode
:1; /* 19 */
5368 unsigned int Stack_Overflow_Check
:1; /* 20 */
5369 unsigned int Two_Instruction_SP_Increment
:1; /* 21 */
5370 unsigned int Ada_Region
:1; /* 22 */
5371 unsigned int cxx_info
:1; /* 23 */
5372 unsigned int cxx_try_catch
:1; /* 24 */
5373 unsigned int sched_entry_seq
:1; /* 25 */
5374 unsigned int reserved2
:1; /* 26 */
5375 unsigned int Save_SP
:1; /* 27 */
5376 unsigned int Save_RP
:1; /* 28 */
5377 unsigned int Save_MRP_in_frame
:1; /* 29 */
5378 unsigned int extn_ptr_defined
:1; /* 30 */
5379 unsigned int Cleanup_defined
:1; /* 31 */
5381 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
5382 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
5383 unsigned int Large_frame
:1; /* 2 */
5384 unsigned int Pseudo_SP_Set
:1; /* 3 */
5385 unsigned int reserved4
:1; /* 4 */
5386 unsigned int Total_frame_size
:27; /* 5..31 */
5388 *table
; /* Unwind table. */
5389 unsigned long table_len
; /* Length of unwind table. */
5390 bfd_vma seg_base
; /* Starting address of segment. */
5391 Elf_Internal_Sym
*symtab
; /* The symbol table. */
5392 unsigned long nsyms
; /* Number of symbols. */
5393 char *strtab
; /* The string table. */
5394 unsigned long strtab_size
; /* Size of string table. */
5398 dump_hppa_unwind (struct hppa_unw_aux_info
*aux
)
5400 struct hppa_unw_table_entry
*tp
;
5402 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
5405 const char *procname
;
5407 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
5408 aux
->strtab_size
, tp
->start
, &procname
,
5411 fputs ("\n<", stdout
);
5415 fputs (procname
, stdout
);
5418 printf ("+%lx", (unsigned long) offset
);
5421 fputs (">: [", stdout
);
5422 print_vma (tp
->start
.offset
, PREFIX_HEX
);
5423 fputc ('-', stdout
);
5424 print_vma (tp
->end
.offset
, PREFIX_HEX
);
5427 #define PF(_m) if (tp->_m) printf (#_m " ");
5428 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5431 PF(Millicode_save_sr0
);
5432 /* PV(Region_description); */
5438 PF(Separate_Package_Body
);
5439 PF(Frame_Extension_Millicode
);
5440 PF(Stack_Overflow_Check
);
5441 PF(Two_Instruction_SP_Increment
);
5445 PF(sched_entry_seq
);
5448 PF(Save_MRP_in_frame
);
5449 PF(extn_ptr_defined
);
5450 PF(Cleanup_defined
);
5451 PF(MPE_XL_interrupt_marker
);
5452 PF(HP_UX_interrupt_marker
);
5455 PV(Total_frame_size
);
5464 slurp_hppa_unwind_table (FILE *file
,
5465 struct hppa_unw_aux_info
*aux
,
5466 Elf_Internal_Shdr
*sec
)
5468 unsigned long size
, unw_ent_size
, nentries
, nrelas
, i
;
5469 Elf_Internal_Phdr
*seg
;
5470 struct hppa_unw_table_entry
*tep
;
5471 Elf_Internal_Shdr
*relsec
;
5472 Elf_Internal_Rela
*rela
, *rp
;
5473 unsigned char *table
, *tp
;
5474 Elf_Internal_Sym
*sym
;
5475 const char *relname
;
5477 /* First, find the starting address of the segment that includes
5480 if (elf_header
.e_phnum
)
5482 if (! get_program_headers (file
))
5485 for (seg
= program_headers
;
5486 seg
< program_headers
+ elf_header
.e_phnum
;
5489 if (seg
->p_type
!= PT_LOAD
)
5492 if (sec
->sh_addr
>= seg
->p_vaddr
5493 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5495 aux
->seg_base
= seg
->p_vaddr
;
5501 /* Second, build the unwind table from the contents of the unwind
5503 size
= sec
->sh_size
;
5504 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
5509 nentries
= size
/ unw_ent_size
;
5510 size
= unw_ent_size
* nentries
;
5512 tep
= aux
->table
= xcmalloc (nentries
, sizeof (aux
->table
[0]));
5514 for (tp
= table
; tp
< table
+ size
; tp
+= unw_ent_size
, ++tep
)
5516 unsigned int tmp1
, tmp2
;
5518 tep
->start
.section
= SHN_UNDEF
;
5519 tep
->end
.section
= SHN_UNDEF
;
5521 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
5522 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
5523 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
5524 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
5526 tep
->start
.offset
+= aux
->seg_base
;
5527 tep
->end
.offset
+= aux
->seg_base
;
5529 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
5530 tep
->Millicode
= (tmp1
>> 30) & 0x1;
5531 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
5532 tep
->Region_description
= (tmp1
>> 27) & 0x3;
5533 tep
->reserved1
= (tmp1
>> 26) & 0x1;
5534 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
5535 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
5536 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
5537 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
5538 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
5539 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
5540 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
5541 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
5542 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
5543 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
5544 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
5545 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
5546 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
5547 tep
->reserved2
= (tmp1
>> 5) & 0x1;
5548 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
5549 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
5550 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
5551 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
5552 tep
->Cleanup_defined
= tmp1
& 0x1;
5554 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
5555 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
5556 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
5557 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
5558 tep
->reserved4
= (tmp2
>> 27) & 0x1;
5559 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
5563 /* Third, apply any relocations to the unwind table. */
5564 for (relsec
= section_headers
;
5565 relsec
< section_headers
+ elf_header
.e_shnum
;
5568 if (relsec
->sh_type
!= SHT_RELA
5569 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
5570 || SECTION_HEADER (relsec
->sh_info
) != sec
)
5573 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5577 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5579 relname
= elf_hppa_reloc_type (get_reloc_type (rp
->r_info
));
5580 sym
= aux
->symtab
+ get_reloc_symindex (rp
->r_info
);
5582 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
5583 if (! const_strneq (relname
, "R_PARISC_SEGREL"))
5585 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5589 i
= rp
->r_offset
/ unw_ent_size
;
5591 switch ((rp
->r_offset
% unw_ent_size
) / eh_addr_size
)
5594 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5595 aux
->table
[i
].start
.offset
+= sym
->st_value
+ rp
->r_addend
;
5598 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5599 aux
->table
[i
].end
.offset
+= sym
->st_value
+ rp
->r_addend
;
5609 aux
->table_len
= nentries
;
5615 hppa_process_unwind (FILE *file
)
5617 struct hppa_unw_aux_info aux
;
5618 Elf_Internal_Shdr
*unwsec
= NULL
;
5619 Elf_Internal_Shdr
*strsec
;
5620 Elf_Internal_Shdr
*sec
;
5623 memset (& aux
, 0, sizeof (aux
));
5625 if (string_table
== NULL
)
5628 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5630 if (sec
->sh_type
== SHT_SYMTAB
5631 && SECTION_HEADER_INDEX (sec
->sh_link
) < elf_header
.e_shnum
)
5633 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5634 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5636 strsec
= SECTION_HEADER (sec
->sh_link
);
5637 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
5638 1, strsec
->sh_size
, _("string table"));
5639 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5641 else if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5646 printf (_("\nThere are no unwind sections in this file.\n"));
5648 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5650 if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5652 printf (_("\nUnwind section "));
5653 printf (_("'%s'"), SECTION_NAME (sec
));
5655 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5656 (unsigned long) sec
->sh_offset
,
5657 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
+ 8)));
5659 slurp_hppa_unwind_table (file
, &aux
, sec
);
5660 if (aux
.table_len
> 0)
5661 dump_hppa_unwind (&aux
);
5664 free ((char *) aux
.table
);
5672 free ((char *) aux
.strtab
);
5678 process_unwind (FILE *file
)
5680 struct unwind_handler
{
5682 int (*handler
)(FILE *file
);
5684 { EM_IA_64
, ia64_process_unwind
},
5685 { EM_PARISC
, hppa_process_unwind
},
5693 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
5694 if (elf_header
.e_machine
== handlers
[i
].machtype
)
5695 return handlers
[i
].handler (file
);
5697 printf (_("\nThere are no unwind sections in this file.\n"));
5702 dynamic_section_mips_val (Elf_Internal_Dyn
*entry
)
5704 switch (entry
->d_tag
)
5707 if (entry
->d_un
.d_val
== 0)
5711 static const char * opts
[] =
5713 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5714 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5715 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5716 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5721 for (cnt
= 0; cnt
< ARRAY_SIZE (opts
); ++cnt
)
5722 if (entry
->d_un
.d_val
& (1 << cnt
))
5724 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
5731 case DT_MIPS_IVERSION
:
5732 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5733 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5735 printf ("<corrupt: %ld>\n", (long) entry
->d_un
.d_ptr
);
5738 case DT_MIPS_TIME_STAMP
:
5743 time_t time
= entry
->d_un
.d_val
;
5744 tmp
= gmtime (&time
);
5745 snprintf (timebuf
, sizeof (timebuf
), "%04u-%02u-%02uT%02u:%02u:%02u",
5746 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5747 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5748 printf ("Time Stamp: %s\n", timebuf
);
5752 case DT_MIPS_RLD_VERSION
:
5753 case DT_MIPS_LOCAL_GOTNO
:
5754 case DT_MIPS_CONFLICTNO
:
5755 case DT_MIPS_LIBLISTNO
:
5756 case DT_MIPS_SYMTABNO
:
5757 case DT_MIPS_UNREFEXTNO
:
5758 case DT_MIPS_HIPAGENO
:
5759 case DT_MIPS_DELTA_CLASS_NO
:
5760 case DT_MIPS_DELTA_INSTANCE_NO
:
5761 case DT_MIPS_DELTA_RELOC_NO
:
5762 case DT_MIPS_DELTA_SYM_NO
:
5763 case DT_MIPS_DELTA_CLASSSYM_NO
:
5764 case DT_MIPS_COMPACT_SIZE
:
5765 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
5769 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
5775 dynamic_section_parisc_val (Elf_Internal_Dyn
*entry
)
5777 switch (entry
->d_tag
)
5779 case DT_HP_DLD_FLAGS
:
5788 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
5789 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
5790 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
5791 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
5792 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
5793 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
5794 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
5795 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
5796 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
5797 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
5798 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" },
5799 { DT_HP_GST
, "HP_GST" },
5800 { DT_HP_SHLIB_FIXED
, "HP_SHLIB_FIXED" },
5801 { DT_HP_MERGE_SHLIB_SEG
, "HP_MERGE_SHLIB_SEG" },
5802 { DT_HP_NODELETE
, "HP_NODELETE" },
5803 { DT_HP_GROUP
, "HP_GROUP" },
5804 { DT_HP_PROTECT_LINKAGE_TABLE
, "HP_PROTECT_LINKAGE_TABLE" }
5808 bfd_vma val
= entry
->d_un
.d_val
;
5810 for (cnt
= 0; cnt
< ARRAY_SIZE (flags
); ++cnt
)
5811 if (val
& flags
[cnt
].bit
)
5815 fputs (flags
[cnt
].str
, stdout
);
5817 val
^= flags
[cnt
].bit
;
5820 if (val
!= 0 || first
)
5824 print_vma (val
, HEX
);
5830 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5837 dynamic_section_ia64_val (Elf_Internal_Dyn
*entry
)
5839 switch (entry
->d_tag
)
5841 case DT_IA_64_PLT_RESERVE
:
5842 /* First 3 slots reserved. */
5843 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5845 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
5849 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5856 get_32bit_dynamic_section (FILE *file
)
5858 Elf32_External_Dyn
*edyn
, *ext
;
5859 Elf_Internal_Dyn
*entry
;
5861 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5862 _("dynamic section"));
5866 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5867 might not have the luxury of section headers. Look for the DT_NULL
5868 terminator to determine the number of entries. */
5869 for (ext
= edyn
, dynamic_nent
= 0;
5870 (char *) ext
< (char *) edyn
+ dynamic_size
;
5874 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5878 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5879 if (dynamic_section
== NULL
)
5881 error (_("Out of memory\n"));
5886 for (ext
= edyn
, entry
= dynamic_section
;
5887 entry
< dynamic_section
+ dynamic_nent
;
5890 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5891 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5900 get_64bit_dynamic_section (FILE *file
)
5902 Elf64_External_Dyn
*edyn
, *ext
;
5903 Elf_Internal_Dyn
*entry
;
5905 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5906 _("dynamic section"));
5910 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5911 might not have the luxury of section headers. Look for the DT_NULL
5912 terminator to determine the number of entries. */
5913 for (ext
= edyn
, dynamic_nent
= 0;
5914 (char *) ext
< (char *) edyn
+ dynamic_size
;
5918 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5922 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5923 if (dynamic_section
== NULL
)
5925 error (_("Out of memory\n"));
5930 for (ext
= edyn
, entry
= dynamic_section
;
5931 entry
< dynamic_section
+ dynamic_nent
;
5934 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5935 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5944 print_dynamic_flags (bfd_vma flags
)
5952 flag
= flags
& - flags
;
5962 case DF_ORIGIN
: fputs ("ORIGIN", stdout
); break;
5963 case DF_SYMBOLIC
: fputs ("SYMBOLIC", stdout
); break;
5964 case DF_TEXTREL
: fputs ("TEXTREL", stdout
); break;
5965 case DF_BIND_NOW
: fputs ("BIND_NOW", stdout
); break;
5966 case DF_STATIC_TLS
: fputs ("STATIC_TLS", stdout
); break;
5967 default: fputs ("unknown", stdout
); break;
5973 /* Parse and display the contents of the dynamic section. */
5976 process_dynamic_section (FILE *file
)
5978 Elf_Internal_Dyn
*entry
;
5980 if (dynamic_size
== 0)
5983 printf (_("\nThere is no dynamic section in this file.\n"));
5990 if (! get_32bit_dynamic_section (file
))
5993 else if (! get_64bit_dynamic_section (file
))
5996 /* Find the appropriate symbol table. */
5997 if (dynamic_symbols
== NULL
)
5999 for (entry
= dynamic_section
;
6000 entry
< dynamic_section
+ dynamic_nent
;
6003 Elf_Internal_Shdr section
;
6005 if (entry
->d_tag
!= DT_SYMTAB
)
6008 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
6010 /* Since we do not know how big the symbol table is,
6011 we default to reading in the entire file (!) and
6012 processing that. This is overkill, I know, but it
6014 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
6016 if (archive_file_offset
!= 0)
6017 section
.sh_size
= archive_file_size
- section
.sh_offset
;
6020 if (fseek (file
, 0, SEEK_END
))
6021 error (_("Unable to seek to end of file!\n"));
6023 section
.sh_size
= ftell (file
) - section
.sh_offset
;
6027 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
6029 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
6031 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
6032 if (num_dynamic_syms
< 1)
6034 error (_("Unable to determine the number of symbols to load\n"));
6038 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
6042 /* Similarly find a string table. */
6043 if (dynamic_strings
== NULL
)
6045 for (entry
= dynamic_section
;
6046 entry
< dynamic_section
+ dynamic_nent
;
6049 unsigned long offset
;
6052 if (entry
->d_tag
!= DT_STRTAB
)
6055 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
6057 /* Since we do not know how big the string table is,
6058 we default to reading in the entire file (!) and
6059 processing that. This is overkill, I know, but it
6062 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
6064 if (archive_file_offset
!= 0)
6065 str_tab_len
= archive_file_size
- offset
;
6068 if (fseek (file
, 0, SEEK_END
))
6069 error (_("Unable to seek to end of file\n"));
6070 str_tab_len
= ftell (file
) - offset
;
6073 if (str_tab_len
< 1)
6076 (_("Unable to determine the length of the dynamic string table\n"));
6080 dynamic_strings
= get_data (NULL
, file
, offset
, 1, str_tab_len
,
6081 _("dynamic string table"));
6082 dynamic_strings_length
= str_tab_len
;
6087 /* And find the syminfo section if available. */
6088 if (dynamic_syminfo
== NULL
)
6090 unsigned long syminsz
= 0;
6092 for (entry
= dynamic_section
;
6093 entry
< dynamic_section
+ dynamic_nent
;
6096 if (entry
->d_tag
== DT_SYMINENT
)
6098 /* Note: these braces are necessary to avoid a syntax
6099 error from the SunOS4 C compiler. */
6100 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
6102 else if (entry
->d_tag
== DT_SYMINSZ
)
6103 syminsz
= entry
->d_un
.d_val
;
6104 else if (entry
->d_tag
== DT_SYMINFO
)
6105 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
6109 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
6111 Elf_External_Syminfo
*extsyminfo
, *extsym
;
6112 Elf_Internal_Syminfo
*syminfo
;
6114 /* There is a syminfo section. Read the data. */
6115 extsyminfo
= get_data (NULL
, file
, dynamic_syminfo_offset
, 1,
6116 syminsz
, _("symbol information"));
6120 dynamic_syminfo
= malloc (syminsz
);
6121 if (dynamic_syminfo
== NULL
)
6123 error (_("Out of memory\n"));
6127 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
6128 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
6129 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
6130 ++syminfo
, ++extsym
)
6132 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
6133 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
6140 if (do_dynamic
&& dynamic_addr
)
6141 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
6142 dynamic_addr
, dynamic_nent
);
6144 printf (_(" Tag Type Name/Value\n"));
6146 for (entry
= dynamic_section
;
6147 entry
< dynamic_section
+ dynamic_nent
;
6155 print_vma (entry
->d_tag
, FULL_HEX
);
6156 dtype
= get_dynamic_type (entry
->d_tag
);
6157 printf (" (%s)%*s", dtype
,
6158 ((is_32bit_elf
? 27 : 19)
6159 - (int) strlen (dtype
)),
6163 switch (entry
->d_tag
)
6167 print_dynamic_flags (entry
->d_un
.d_val
);
6177 switch (entry
->d_tag
)
6180 printf (_("Auxiliary library"));
6184 printf (_("Filter library"));
6188 printf (_("Configuration file"));
6192 printf (_("Dependency audit library"));
6196 printf (_("Audit library"));
6200 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6201 printf (": [%s]\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
6205 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6214 printf (_("Flags:"));
6216 if (entry
->d_un
.d_val
== 0)
6217 printf (_(" None\n"));
6220 unsigned long int val
= entry
->d_un
.d_val
;
6222 if (val
& DTF_1_PARINIT
)
6224 printf (" PARINIT");
6225 val
^= DTF_1_PARINIT
;
6227 if (val
& DTF_1_CONFEXP
)
6229 printf (" CONFEXP");
6230 val
^= DTF_1_CONFEXP
;
6233 printf (" %lx", val
);
6242 printf (_("Flags:"));
6244 if (entry
->d_un
.d_val
== 0)
6245 printf (_(" None\n"));
6248 unsigned long int val
= entry
->d_un
.d_val
;
6250 if (val
& DF_P1_LAZYLOAD
)
6252 printf (" LAZYLOAD");
6253 val
^= DF_P1_LAZYLOAD
;
6255 if (val
& DF_P1_GROUPPERM
)
6257 printf (" GROUPPERM");
6258 val
^= DF_P1_GROUPPERM
;
6261 printf (" %lx", val
);
6270 printf (_("Flags:"));
6271 if (entry
->d_un
.d_val
== 0)
6272 printf (_(" None\n"));
6275 unsigned long int val
= entry
->d_un
.d_val
;
6282 if (val
& DF_1_GLOBAL
)
6287 if (val
& DF_1_GROUP
)
6292 if (val
& DF_1_NODELETE
)
6294 printf (" NODELETE");
6295 val
^= DF_1_NODELETE
;
6297 if (val
& DF_1_LOADFLTR
)
6299 printf (" LOADFLTR");
6300 val
^= DF_1_LOADFLTR
;
6302 if (val
& DF_1_INITFIRST
)
6304 printf (" INITFIRST");
6305 val
^= DF_1_INITFIRST
;
6307 if (val
& DF_1_NOOPEN
)
6312 if (val
& DF_1_ORIGIN
)
6317 if (val
& DF_1_DIRECT
)
6322 if (val
& DF_1_TRANS
)
6327 if (val
& DF_1_INTERPOSE
)
6329 printf (" INTERPOSE");
6330 val
^= DF_1_INTERPOSE
;
6332 if (val
& DF_1_NODEFLIB
)
6334 printf (" NODEFLIB");
6335 val
^= DF_1_NODEFLIB
;
6337 if (val
& DF_1_NODUMP
)
6342 if (val
& DF_1_CONLFAT
)
6344 printf (" CONLFAT");
6345 val
^= DF_1_CONLFAT
;
6348 printf (" %lx", val
);
6355 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6357 puts (get_dynamic_type (entry
->d_un
.d_val
));
6377 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6383 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6384 name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6390 switch (entry
->d_tag
)
6393 printf (_("Shared library: [%s]"), name
);
6395 if (streq (name
, program_interpreter
))
6396 printf (_(" program interpreter"));
6400 printf (_("Library soname: [%s]"), name
);
6404 printf (_("Library rpath: [%s]"), name
);
6408 printf (_("Library runpath: [%s]"), name
);
6412 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6417 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6430 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6434 case DT_INIT_ARRAYSZ
:
6435 case DT_FINI_ARRAYSZ
:
6436 case DT_GNU_CONFLICTSZ
:
6437 case DT_GNU_LIBLISTSZ
:
6440 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6441 printf (" (bytes)\n");
6451 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6464 if (entry
->d_tag
== DT_USED
6465 && VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6467 char *name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6471 printf (_("Not needed object: [%s]\n"), name
);
6476 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6482 /* The value of this entry is ignored. */
6487 case DT_GNU_PRELINKED
:
6491 time_t time
= entry
->d_un
.d_val
;
6493 tmp
= gmtime (&time
);
6494 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
6495 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
6496 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
6502 dynamic_info_DT_GNU_HASH
= entry
->d_un
.d_val
;
6505 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6511 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
6512 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
6517 switch (elf_header
.e_machine
)
6520 case EM_MIPS_RS3_LE
:
6521 dynamic_section_mips_val (entry
);
6524 dynamic_section_parisc_val (entry
);
6527 dynamic_section_ia64_val (entry
);
6530 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6542 get_ver_flags (unsigned int flags
)
6544 static char buff
[32];
6551 if (flags
& VER_FLG_BASE
)
6552 strcat (buff
, "BASE ");
6554 if (flags
& VER_FLG_WEAK
)
6556 if (flags
& VER_FLG_BASE
)
6557 strcat (buff
, "| ");
6559 strcat (buff
, "WEAK ");
6562 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
6563 strcat (buff
, "| <unknown>");
6568 /* Display the contents of the version sections. */
6570 process_version_sections (FILE *file
)
6572 Elf_Internal_Shdr
*section
;
6579 for (i
= 0, section
= section_headers
;
6580 i
< elf_header
.e_shnum
;
6583 switch (section
->sh_type
)
6585 case SHT_GNU_verdef
:
6587 Elf_External_Verdef
*edefs
;
6595 (_("\nVersion definition section '%s' contains %ld entries:\n"),
6596 SECTION_NAME (section
), section
->sh_info
);
6598 printf (_(" Addr: 0x"));
6599 printf_vma (section
->sh_addr
);
6600 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6601 (unsigned long) section
->sh_offset
, section
->sh_link
,
6602 SECTION_HEADER_INDEX (section
->sh_link
)
6603 < elf_header
.e_shnum
6604 ? SECTION_NAME (SECTION_HEADER (section
->sh_link
))
6607 edefs
= get_data (NULL
, file
, section
->sh_offset
, 1,
6609 _("version definition section"));
6610 endbuf
= (char *) edefs
+ section
->sh_size
;
6614 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6617 Elf_External_Verdef
*edef
;
6618 Elf_Internal_Verdef ent
;
6619 Elf_External_Verdaux
*eaux
;
6620 Elf_Internal_Verdaux aux
;
6624 vstart
= ((char *) edefs
) + idx
;
6625 if (vstart
+ sizeof (*edef
) > endbuf
)
6628 edef
= (Elf_External_Verdef
*) vstart
;
6630 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
6631 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
6632 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
6633 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
6634 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
6635 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
6636 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
6638 printf (_(" %#06x: Rev: %d Flags: %s"),
6639 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
6641 printf (_(" Index: %d Cnt: %d "),
6642 ent
.vd_ndx
, ent
.vd_cnt
);
6644 vstart
+= ent
.vd_aux
;
6646 eaux
= (Elf_External_Verdaux
*) vstart
;
6648 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6649 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6651 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6652 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux
.vda_name
));
6654 printf (_("Name index: %ld\n"), aux
.vda_name
);
6656 isum
= idx
+ ent
.vd_aux
;
6658 for (j
= 1; j
< ent
.vd_cnt
; j
++)
6660 isum
+= aux
.vda_next
;
6661 vstart
+= aux
.vda_next
;
6663 eaux
= (Elf_External_Verdaux
*) vstart
;
6664 if (vstart
+ sizeof (*eaux
) > endbuf
)
6667 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6668 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6670 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6671 printf (_(" %#06x: Parent %d: %s\n"),
6672 isum
, j
, GET_DYNAMIC_NAME (aux
.vda_name
));
6674 printf (_(" %#06x: Parent %d, name index: %ld\n"),
6675 isum
, j
, aux
.vda_name
);
6678 printf (_(" Version def aux past end of section\n"));
6682 if (cnt
< section
->sh_info
)
6683 printf (_(" Version definition past end of section\n"));
6689 case SHT_GNU_verneed
:
6691 Elf_External_Verneed
*eneed
;
6698 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
6699 SECTION_NAME (section
), section
->sh_info
);
6701 printf (_(" Addr: 0x"));
6702 printf_vma (section
->sh_addr
);
6703 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
6704 (unsigned long) section
->sh_offset
, section
->sh_link
,
6705 SECTION_HEADER_INDEX (section
->sh_link
)
6706 < elf_header
.e_shnum
6707 ? SECTION_NAME (SECTION_HEADER (section
->sh_link
))
6710 eneed
= get_data (NULL
, file
, section
->sh_offset
, 1,
6712 _("version need section"));
6713 endbuf
= (char *) eneed
+ section
->sh_size
;
6717 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6719 Elf_External_Verneed
*entry
;
6720 Elf_Internal_Verneed ent
;
6725 vstart
= ((char *) eneed
) + idx
;
6726 if (vstart
+ sizeof (*entry
) > endbuf
)
6729 entry
= (Elf_External_Verneed
*) vstart
;
6731 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
6732 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
6733 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
6734 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
6735 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
6737 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
6739 if (VALID_DYNAMIC_NAME (ent
.vn_file
))
6740 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent
.vn_file
));
6742 printf (_(" File: %lx"), ent
.vn_file
);
6744 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
6746 vstart
+= ent
.vn_aux
;
6748 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
6750 Elf_External_Vernaux
*eaux
;
6751 Elf_Internal_Vernaux aux
;
6753 if (vstart
+ sizeof (*eaux
) > endbuf
)
6755 eaux
= (Elf_External_Vernaux
*) vstart
;
6757 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
6758 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
6759 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
6760 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
6761 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
6763 if (VALID_DYNAMIC_NAME (aux
.vna_name
))
6764 printf (_(" %#06x: Name: %s"),
6765 isum
, GET_DYNAMIC_NAME (aux
.vna_name
));
6767 printf (_(" %#06x: Name index: %lx"),
6768 isum
, aux
.vna_name
);
6770 printf (_(" Flags: %s Version: %d\n"),
6771 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
6773 isum
+= aux
.vna_next
;
6774 vstart
+= aux
.vna_next
;
6777 printf (_(" Version need aux past end of section\n"));
6781 if (cnt
< section
->sh_info
)
6782 printf (_(" Version need past end of section\n"));
6788 case SHT_GNU_versym
:
6790 Elf_Internal_Shdr
*link_section
;
6793 unsigned char *edata
;
6794 unsigned short *data
;
6796 Elf_Internal_Sym
*symbols
;
6797 Elf_Internal_Shdr
*string_sec
;
6800 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
)
6803 link_section
= SECTION_HEADER (section
->sh_link
);
6804 total
= section
->sh_size
/ sizeof (Elf_External_Versym
);
6806 if (SECTION_HEADER_INDEX (link_section
->sh_link
)
6807 >= elf_header
.e_shnum
)
6812 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
6814 string_sec
= SECTION_HEADER (link_section
->sh_link
);
6816 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
6817 string_sec
->sh_size
, _("version string table"));
6821 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6822 SECTION_NAME (section
), total
);
6824 printf (_(" Addr: "));
6825 printf_vma (section
->sh_addr
);
6826 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6827 (unsigned long) section
->sh_offset
, section
->sh_link
,
6828 SECTION_NAME (link_section
));
6830 off
= offset_from_vma (file
,
6831 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6832 total
* sizeof (short));
6833 edata
= get_data (NULL
, file
, off
, total
, sizeof (short),
6834 _("version symbol data"));
6841 data
= cmalloc (total
, sizeof (short));
6843 for (cnt
= total
; cnt
--;)
6844 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
6849 for (cnt
= 0; cnt
< total
; cnt
+= 4)
6852 int check_def
, check_need
;
6855 printf (" %03x:", cnt
);
6857 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
6858 switch (data
[cnt
+ j
])
6861 fputs (_(" 0 (*local*) "), stdout
);
6865 fputs (_(" 1 (*global*) "), stdout
);
6869 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
6870 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
6874 if (SECTION_HEADER_INDEX (symbols
[cnt
+ j
].st_shndx
)
6875 >= elf_header
.e_shnum
6876 || SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
6879 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
6886 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
6888 Elf_Internal_Verneed ivn
;
6889 unsigned long offset
;
6891 offset
= offset_from_vma
6892 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6893 sizeof (Elf_External_Verneed
));
6897 Elf_Internal_Vernaux ivna
;
6898 Elf_External_Verneed evn
;
6899 Elf_External_Vernaux evna
;
6900 unsigned long a_off
;
6902 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
6905 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6906 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6908 a_off
= offset
+ ivn
.vn_aux
;
6912 get_data (&evna
, file
, a_off
, sizeof (evna
),
6913 1, _("version need aux (2)"));
6915 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6916 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6918 a_off
+= ivna
.vna_next
;
6920 while (ivna
.vna_other
!= data
[cnt
+ j
]
6921 && ivna
.vna_next
!= 0);
6923 if (ivna
.vna_other
== data
[cnt
+ j
])
6925 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6927 if (ivna
.vna_name
>= string_sec
->sh_size
)
6928 name
= _("*invalid*");
6930 name
= strtab
+ ivna
.vna_name
;
6931 nn
+= printf ("(%s%-*s",
6933 12 - (int) strlen (name
),
6939 offset
+= ivn
.vn_next
;
6941 while (ivn
.vn_next
);
6944 if (check_def
&& data
[cnt
+ j
] != 0x8001
6945 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6947 Elf_Internal_Verdef ivd
;
6948 Elf_External_Verdef evd
;
6949 unsigned long offset
;
6951 offset
= offset_from_vma
6952 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6957 get_data (&evd
, file
, offset
, sizeof (evd
), 1,
6960 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6961 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6963 offset
+= ivd
.vd_next
;
6965 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
6966 && ivd
.vd_next
!= 0);
6968 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
6970 Elf_External_Verdaux evda
;
6971 Elf_Internal_Verdaux ivda
;
6973 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6975 get_data (&evda
, file
,
6976 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
6978 _("version def aux"));
6980 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6982 if (ivda
.vda_name
>= string_sec
->sh_size
)
6983 name
= _("*invalid*");
6985 name
= strtab
+ ivda
.vda_name
;
6986 nn
+= printf ("(%s%-*s",
6988 12 - (int) strlen (name
),
6994 printf ("%*c", 18 - nn
, ' ');
7012 printf (_("\nNo version information found in this file.\n"));
7018 get_symbol_binding (unsigned int binding
)
7020 static char buff
[32];
7024 case STB_LOCAL
: return "LOCAL";
7025 case STB_GLOBAL
: return "GLOBAL";
7026 case STB_WEAK
: return "WEAK";
7028 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
7029 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"),
7031 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
7032 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), binding
);
7034 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), binding
);
7040 get_symbol_type (unsigned int type
)
7042 static char buff
[32];
7046 case STT_NOTYPE
: return "NOTYPE";
7047 case STT_OBJECT
: return "OBJECT";
7048 case STT_FUNC
: return "FUNC";
7049 case STT_SECTION
: return "SECTION";
7050 case STT_FILE
: return "FILE";
7051 case STT_COMMON
: return "COMMON";
7052 case STT_TLS
: return "TLS";
7053 case STT_RELC
: return "RELC";
7054 case STT_SRELC
: return "SRELC";
7056 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
7058 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
7059 return "THUMB_FUNC";
7061 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
7064 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
7065 return "PARISC_MILLI";
7067 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"), type
);
7069 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
7071 if (elf_header
.e_machine
== EM_PARISC
)
7073 if (type
== STT_HP_OPAQUE
)
7075 if (type
== STT_HP_STUB
)
7079 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), type
);
7082 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), type
);
7088 get_symbol_visibility (unsigned int visibility
)
7092 case STV_DEFAULT
: return "DEFAULT";
7093 case STV_INTERNAL
: return "INTERNAL";
7094 case STV_HIDDEN
: return "HIDDEN";
7095 case STV_PROTECTED
: return "PROTECTED";
7101 get_mips_symbol_other (unsigned int other
)
7105 case STO_OPTIONAL
: return "OPTIONAL";
7106 case STO_MIPS16
: return "MIPS16";
7107 default: return NULL
;
7112 get_symbol_other (unsigned int other
)
7114 const char * result
= NULL
;
7115 static char buff
[32];
7120 switch (elf_header
.e_machine
)
7123 result
= get_mips_symbol_other (other
);
7131 snprintf (buff
, sizeof buff
, _("<other>: %x"), other
);
7136 get_symbol_index_type (unsigned int type
)
7138 static char buff
[32];
7142 case SHN_UNDEF
: return "UND";
7143 case SHN_ABS
: return "ABS";
7144 case SHN_COMMON
: return "COM";
7146 if (type
== SHN_IA_64_ANSI_COMMON
7147 && elf_header
.e_machine
== EM_IA_64
7148 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
7150 else if (elf_header
.e_machine
== EM_X86_64
7151 && type
== SHN_X86_64_LCOMMON
)
7153 else if (type
== SHN_MIPS_SCOMMON
7154 && elf_header
.e_machine
== EM_MIPS
)
7156 else if (type
== SHN_MIPS_SUNDEFINED
7157 && elf_header
.e_machine
== EM_MIPS
)
7159 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
7160 sprintf (buff
, "PRC[0x%04x]", type
);
7161 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
7162 sprintf (buff
, "OS [0x%04x]", type
);
7163 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
7164 sprintf (buff
, "RSV[0x%04x]", type
);
7166 sprintf (buff
, "%3d", type
);
7174 get_dynamic_data (FILE *file
, unsigned int number
, unsigned int ent_size
)
7176 unsigned char *e_data
;
7179 e_data
= cmalloc (number
, ent_size
);
7183 error (_("Out of memory\n"));
7187 if (fread (e_data
, ent_size
, number
, file
) != number
)
7189 error (_("Unable to read in dynamic data\n"));
7193 i_data
= cmalloc (number
, sizeof (*i_data
));
7197 error (_("Out of memory\n"));
7203 i_data
[number
] = byte_get (e_data
+ number
* ent_size
, ent_size
);
7211 print_dynamic_symbol (bfd_vma si
, unsigned long hn
)
7213 Elf_Internal_Sym
*psym
;
7216 psym
= dynamic_symbols
+ si
;
7218 n
= print_vma (si
, DEC_5
);
7220 fputs (" " + n
, stdout
);
7221 printf (" %3lu: ", hn
);
7222 print_vma (psym
->st_value
, LONG_HEX
);
7224 print_vma (psym
->st_size
, DEC_5
);
7226 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
7227 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
7228 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
7229 /* Check to see if any other bits in the st_other field are set.
7230 Note - displaying this information disrupts the layout of the
7231 table being generated, but for the moment this case is very
7233 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
7234 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
7235 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
7236 if (VALID_DYNAMIC_NAME (psym
->st_name
))
7237 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
7239 printf (" <corrupt: %14ld>", psym
->st_name
);
7243 /* Dump the symbol table. */
7245 process_symbol_table (FILE *file
)
7247 Elf_Internal_Shdr
*section
;
7248 bfd_vma nbuckets
= 0;
7249 bfd_vma nchains
= 0;
7250 bfd_vma
*buckets
= NULL
;
7251 bfd_vma
*chains
= NULL
;
7252 bfd_vma ngnubuckets
= 0;
7253 bfd_vma
*gnubuckets
= NULL
;
7254 bfd_vma
*gnuchains
= NULL
;
7255 bfd_vma gnusymidx
= 0;
7257 if (! do_syms
&& !do_histogram
)
7260 if (dynamic_info
[DT_HASH
]
7262 || (do_using_dynamic
&& dynamic_strings
!= NULL
)))
7264 unsigned char nb
[8];
7265 unsigned char nc
[8];
7266 int hash_ent_size
= 4;
7268 if ((elf_header
.e_machine
== EM_ALPHA
7269 || elf_header
.e_machine
== EM_S390
7270 || elf_header
.e_machine
== EM_S390_OLD
)
7271 && elf_header
.e_ident
[EI_CLASS
] == ELFCLASS64
)
7275 (archive_file_offset
7276 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
7277 sizeof nb
+ sizeof nc
)),
7280 error (_("Unable to seek to start of dynamic information\n"));
7284 if (fread (nb
, hash_ent_size
, 1, file
) != 1)
7286 error (_("Failed to read in number of buckets\n"));
7290 if (fread (nc
, hash_ent_size
, 1, file
) != 1)
7292 error (_("Failed to read in number of chains\n"));
7296 nbuckets
= byte_get (nb
, hash_ent_size
);
7297 nchains
= byte_get (nc
, hash_ent_size
);
7299 buckets
= get_dynamic_data (file
, nbuckets
, hash_ent_size
);
7300 chains
= get_dynamic_data (file
, nchains
, hash_ent_size
);
7302 if (buckets
== NULL
|| chains
== NULL
)
7306 if (dynamic_info_DT_GNU_HASH
7308 || (do_using_dynamic
&& dynamic_strings
!= NULL
)))
7310 unsigned char nb
[16];
7311 bfd_vma i
, maxchain
= 0xffffffff, bitmaskwords
;
7312 bfd_vma buckets_vma
;
7315 (archive_file_offset
7316 + offset_from_vma (file
, dynamic_info_DT_GNU_HASH
,
7320 error (_("Unable to seek to start of dynamic information\n"));
7324 if (fread (nb
, 16, 1, file
) != 1)
7326 error (_("Failed to read in number of buckets\n"));
7330 ngnubuckets
= byte_get (nb
, 4);
7331 gnusymidx
= byte_get (nb
+ 4, 4);
7332 bitmaskwords
= byte_get (nb
+ 8, 4);
7333 buckets_vma
= dynamic_info_DT_GNU_HASH
+ 16;
7335 buckets_vma
+= bitmaskwords
* 4;
7337 buckets_vma
+= bitmaskwords
* 8;
7340 (archive_file_offset
7341 + offset_from_vma (file
, buckets_vma
, 4)),
7344 error (_("Unable to seek to start of dynamic information\n"));
7348 gnubuckets
= get_dynamic_data (file
, ngnubuckets
, 4);
7350 if (gnubuckets
== NULL
)
7353 for (i
= 0; i
< ngnubuckets
; i
++)
7354 if (gnubuckets
[i
] != 0)
7356 if (gnubuckets
[i
] < gnusymidx
)
7359 if (maxchain
== 0xffffffff || gnubuckets
[i
] > maxchain
)
7360 maxchain
= gnubuckets
[i
];
7363 if (maxchain
== 0xffffffff)
7366 maxchain
-= gnusymidx
;
7369 (archive_file_offset
7370 + offset_from_vma (file
, buckets_vma
7371 + 4 * (ngnubuckets
+ maxchain
), 4)),
7374 error (_("Unable to seek to start of dynamic information\n"));
7380 if (fread (nb
, 4, 1, file
) != 1)
7382 error (_("Failed to determine last chain length\n"));
7386 if (maxchain
+ 1 == 0)
7391 while ((byte_get (nb
, 4) & 1) == 0);
7394 (archive_file_offset
7395 + offset_from_vma (file
, buckets_vma
+ 4 * ngnubuckets
, 4)),
7398 error (_("Unable to seek to start of dynamic information\n"));
7402 gnuchains
= get_dynamic_data (file
, maxchain
, 4);
7404 if (gnuchains
== NULL
)
7408 if ((dynamic_info
[DT_HASH
] || dynamic_info_DT_GNU_HASH
)
7411 && dynamic_strings
!= NULL
)
7415 if (dynamic_info
[DT_HASH
])
7419 printf (_("\nSymbol table for image:\n"));
7421 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7423 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7425 for (hn
= 0; hn
< nbuckets
; hn
++)
7430 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
7431 print_dynamic_symbol (si
, hn
);
7435 if (dynamic_info_DT_GNU_HASH
)
7437 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
7439 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7441 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7443 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7444 if (gnubuckets
[hn
] != 0)
7446 bfd_vma si
= gnubuckets
[hn
];
7447 bfd_vma off
= si
- gnusymidx
;
7451 print_dynamic_symbol (si
, hn
);
7454 while ((gnuchains
[off
++] & 1) == 0);
7458 else if (do_syms
&& !do_using_dynamic
)
7462 for (i
= 0, section
= section_headers
;
7463 i
< elf_header
.e_shnum
;
7467 char *strtab
= NULL
;
7468 unsigned long int strtab_size
= 0;
7469 Elf_Internal_Sym
*symtab
;
7470 Elf_Internal_Sym
*psym
;
7473 if ( section
->sh_type
!= SHT_SYMTAB
7474 && section
->sh_type
!= SHT_DYNSYM
)
7477 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
7478 SECTION_NAME (section
),
7479 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
7481 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7483 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7485 symtab
= GET_ELF_SYMBOLS (file
, section
);
7489 if (section
->sh_link
== elf_header
.e_shstrndx
)
7491 strtab
= string_table
;
7492 strtab_size
= string_table_length
;
7494 else if (SECTION_HEADER_INDEX (section
->sh_link
) < elf_header
.e_shnum
)
7496 Elf_Internal_Shdr
*string_sec
;
7498 string_sec
= SECTION_HEADER (section
->sh_link
);
7500 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
7501 1, string_sec
->sh_size
, _("string table"));
7502 strtab_size
= strtab
!= NULL
? string_sec
->sh_size
: 0;
7505 for (si
= 0, psym
= symtab
;
7506 si
< section
->sh_size
/ section
->sh_entsize
;
7509 printf ("%6d: ", si
);
7510 print_vma (psym
->st_value
, LONG_HEX
);
7512 print_vma (psym
->st_size
, DEC_5
);
7513 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
7514 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
7515 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
7516 /* Check to see if any other bits in the st_other field are set.
7517 Note - displaying this information disrupts the layout of the
7518 table being generated, but for the moment this case is very rare. */
7519 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
7520 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
7521 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
7522 print_symbol (25, psym
->st_name
< strtab_size
7523 ? strtab
+ psym
->st_name
: "<corrupt>");
7525 if (section
->sh_type
== SHT_DYNSYM
&&
7526 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
7528 unsigned char data
[2];
7529 unsigned short vers_data
;
7530 unsigned long offset
;
7534 offset
= offset_from_vma
7535 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
7536 sizeof data
+ si
* sizeof (vers_data
));
7538 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
7539 sizeof (data
), 1, _("version data"));
7541 vers_data
= byte_get (data
, 2);
7543 is_nobits
= (SECTION_HEADER_INDEX (psym
->st_shndx
)
7544 < elf_header
.e_shnum
7545 && SECTION_HEADER (psym
->st_shndx
)->sh_type
7548 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
7550 if ((vers_data
& 0x8000) || vers_data
> 1)
7552 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
7553 && (is_nobits
|| ! check_def
))
7555 Elf_External_Verneed evn
;
7556 Elf_Internal_Verneed ivn
;
7557 Elf_Internal_Vernaux ivna
;
7559 /* We must test both. */
7560 offset
= offset_from_vma
7561 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
7566 unsigned long vna_off
;
7568 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
7571 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
7572 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
7574 vna_off
= offset
+ ivn
.vn_aux
;
7578 Elf_External_Vernaux evna
;
7580 get_data (&evna
, file
, vna_off
,
7582 _("version need aux (3)"));
7584 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
7585 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
7586 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
7588 vna_off
+= ivna
.vna_next
;
7590 while (ivna
.vna_other
!= vers_data
7591 && ivna
.vna_next
!= 0);
7593 if (ivna
.vna_other
== vers_data
)
7596 offset
+= ivn
.vn_next
;
7598 while (ivn
.vn_next
!= 0);
7600 if (ivna
.vna_other
== vers_data
)
7603 ivna
.vna_name
< strtab_size
7604 ? strtab
+ ivna
.vna_name
: "<corrupt>",
7608 else if (! is_nobits
)
7609 error (_("bad dynamic symbol\n"));
7616 if (vers_data
!= 0x8001
7617 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
7619 Elf_Internal_Verdef ivd
;
7620 Elf_Internal_Verdaux ivda
;
7621 Elf_External_Verdaux evda
;
7622 unsigned long offset
;
7624 offset
= offset_from_vma
7626 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
7627 sizeof (Elf_External_Verdef
));
7631 Elf_External_Verdef evd
;
7633 get_data (&evd
, file
, offset
, sizeof (evd
),
7634 1, _("version def"));
7636 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
7637 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
7638 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
7640 offset
+= ivd
.vd_next
;
7642 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
7643 && ivd
.vd_next
!= 0);
7645 offset
-= ivd
.vd_next
;
7646 offset
+= ivd
.vd_aux
;
7648 get_data (&evda
, file
, offset
, sizeof (evda
),
7649 1, _("version def aux"));
7651 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
7653 if (psym
->st_name
!= ivda
.vda_name
)
7654 printf ((vers_data
& 0x8000)
7656 ivda
.vda_name
< strtab_size
7657 ? strtab
+ ivda
.vda_name
: "<corrupt>");
7667 if (strtab
!= string_table
)
7673 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
7675 if (do_histogram
&& buckets
!= NULL
)
7677 unsigned long *lengths
;
7678 unsigned long *counts
;
7681 unsigned long maxlength
= 0;
7682 unsigned long nzero_counts
= 0;
7683 unsigned long nsyms
= 0;
7685 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
7686 (unsigned long) nbuckets
);
7687 printf (_(" Length Number %% of total Coverage\n"));
7689 lengths
= calloc (nbuckets
, sizeof (*lengths
));
7690 if (lengths
== NULL
)
7692 error (_("Out of memory\n"));
7695 for (hn
= 0; hn
< nbuckets
; ++hn
)
7697 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
7700 if (maxlength
< ++lengths
[hn
])
7705 counts
= calloc (maxlength
+ 1, sizeof (*counts
));
7708 error (_("Out of memory\n"));
7712 for (hn
= 0; hn
< nbuckets
; ++hn
)
7713 ++counts
[lengths
[hn
]];
7718 printf (" 0 %-10lu (%5.1f%%)\n",
7719 counts
[0], (counts
[0] * 100.0) / nbuckets
);
7720 for (i
= 1; i
<= maxlength
; ++i
)
7722 nzero_counts
+= counts
[i
] * i
;
7723 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7724 i
, counts
[i
], (counts
[i
] * 100.0) / nbuckets
,
7725 (nzero_counts
* 100.0) / nsyms
);
7733 if (buckets
!= NULL
)
7739 if (do_histogram
&& dynamic_info_DT_GNU_HASH
)
7741 unsigned long *lengths
;
7742 unsigned long *counts
;
7744 unsigned long maxlength
= 0;
7745 unsigned long nzero_counts
= 0;
7746 unsigned long nsyms
= 0;
7748 lengths
= calloc (ngnubuckets
, sizeof (*lengths
));
7749 if (lengths
== NULL
)
7751 error (_("Out of memory\n"));
7755 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
7756 (unsigned long) ngnubuckets
);
7757 printf (_(" Length Number %% of total Coverage\n"));
7759 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7760 if (gnubuckets
[hn
] != 0)
7762 bfd_vma off
, length
= 1;
7764 for (off
= gnubuckets
[hn
] - gnusymidx
;
7765 (gnuchains
[off
] & 1) == 0; ++off
)
7767 lengths
[hn
] = length
;
7768 if (length
> maxlength
)
7773 counts
= calloc (maxlength
+ 1, sizeof (*counts
));
7776 error (_("Out of memory\n"));
7780 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7781 ++counts
[lengths
[hn
]];
7783 if (ngnubuckets
> 0)
7786 printf (" 0 %-10lu (%5.1f%%)\n",
7787 counts
[0], (counts
[0] * 100.0) / ngnubuckets
);
7788 for (j
= 1; j
<= maxlength
; ++j
)
7790 nzero_counts
+= counts
[j
] * j
;
7791 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7792 j
, counts
[j
], (counts
[j
] * 100.0) / ngnubuckets
,
7793 (nzero_counts
* 100.0) / nsyms
);
7807 process_syminfo (FILE *file ATTRIBUTE_UNUSED
)
7811 if (dynamic_syminfo
== NULL
7813 /* No syminfo, this is ok. */
7816 /* There better should be a dynamic symbol section. */
7817 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
7821 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
7822 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
7824 printf (_(" Num: Name BoundTo Flags\n"));
7825 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
7827 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
7829 printf ("%4d: ", i
);
7830 if (VALID_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
))
7831 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
));
7833 printf ("<corrupt: %19ld>", dynamic_symbols
[i
].st_name
);
7836 switch (dynamic_syminfo
[i
].si_boundto
)
7838 case SYMINFO_BT_SELF
:
7839 fputs ("SELF ", stdout
);
7841 case SYMINFO_BT_PARENT
:
7842 fputs ("PARENT ", stdout
);
7845 if (dynamic_syminfo
[i
].si_boundto
> 0
7846 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
7847 && VALID_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
7849 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
7853 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
7857 if (flags
& SYMINFO_FLG_DIRECT
)
7859 if (flags
& SYMINFO_FLG_PASSTHRU
)
7860 printf (" PASSTHRU");
7861 if (flags
& SYMINFO_FLG_COPY
)
7863 if (flags
& SYMINFO_FLG_LAZYLOAD
)
7864 printf (" LAZYLOAD");
7872 #ifdef SUPPORT_DISASSEMBLY
7874 disassemble_section (Elf_Internal_Shdr
*section
, FILE *file
)
7876 printf (_("\nAssembly dump of section %s\n"),
7877 SECTION_NAME (section
));
7879 /* XXX -- to be done --- XXX */
7886 dump_section_as_strings (Elf_Internal_Shdr
*section
, FILE *file
)
7888 Elf_Internal_Shdr
*relsec
;
7889 bfd_size_type num_bytes
;
7894 char *name
= SECTION_NAME (section
);
7895 bfd_boolean some_strings_shown
;
7897 num_bytes
= section
->sh_size
;
7899 if (num_bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
7901 printf (_("\nSection '%s' has no data to dump.\n"), name
);
7905 addr
= section
->sh_addr
;
7907 start
= get_data (NULL
, file
, section
->sh_offset
, 1, num_bytes
,
7912 printf (_("\nString dump of section '%s':\n"), name
);
7914 /* If the section being dumped has relocations against it the user might
7915 be expecting these relocations to have been applied. Check for this
7916 case and issue a warning message in order to avoid confusion.
7917 FIXME: Maybe we ought to have an option that dumps a section with
7919 for (relsec
= section_headers
;
7920 relsec
< section_headers
+ elf_header
.e_shnum
;
7923 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
7924 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
7925 || SECTION_HEADER (relsec
->sh_info
) != section
7926 || relsec
->sh_size
== 0
7927 || SECTION_HEADER_INDEX (relsec
->sh_link
) >= elf_header
.e_shnum
)
7930 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
7935 end
= start
+ num_bytes
;
7936 some_strings_shown
= FALSE
;
7940 while (!ISPRINT (* data
))
7947 printf (" [%6tx] %s\n", data
- start
, data
);
7949 printf (" [%6Ix] %s\n", (size_t) (data
- start
), data
);
7951 data
+= strlen (data
);
7952 some_strings_shown
= TRUE
;
7956 if (! some_strings_shown
)
7957 printf (_(" No strings found in this section."));
7967 dump_section_as_bytes (Elf_Internal_Shdr
*section
, FILE *file
)
7969 Elf_Internal_Shdr
*relsec
;
7970 bfd_size_type bytes
;
7972 unsigned char *data
;
7973 unsigned char *start
;
7975 bytes
= section
->sh_size
;
7977 if (bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
7979 printf (_("\nSection '%s' has no data to dump.\n"),
7980 SECTION_NAME (section
));
7984 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
7986 addr
= section
->sh_addr
;
7988 start
= get_data (NULL
, file
, section
->sh_offset
, 1, bytes
,
7993 /* If the section being dumped has relocations against it the user might
7994 be expecting these relocations to have been applied. Check for this
7995 case and issue a warning message in order to avoid confusion.
7996 FIXME: Maybe we ought to have an option that dumps a section with
7998 for (relsec
= section_headers
;
7999 relsec
< section_headers
+ elf_header
.e_shnum
;
8002 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
8003 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
8004 || SECTION_HEADER (relsec
->sh_info
) != section
8005 || relsec
->sh_size
== 0
8006 || SECTION_HEADER_INDEX (relsec
->sh_link
) >= elf_header
.e_shnum
)
8009 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
8021 lbytes
= (bytes
> 16 ? 16 : bytes
);
8023 printf (" 0x%8.8lx ", (unsigned long) addr
);
8025 for (j
= 0; j
< 16; j
++)
8028 printf ("%2.2x", data
[j
]);
8036 for (j
= 0; j
< lbytes
; j
++)
8039 if (k
>= ' ' && k
< 0x7f)
8058 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
8059 DWARF debug sections. This is a target specific test. Note - we do not
8060 go through the whole including-target-headers-multiple-times route, (as
8061 we have already done with <elf/h8.h>) because this would become very
8062 messy and even then this function would have to contain target specific
8063 information (the names of the relocs instead of their numeric values).
8064 FIXME: This is not the correct way to solve this problem. The proper way
8065 is to have target specific reloc sizing and typing functions created by
8066 the reloc-macros.h header, in the same way that it already creates the
8067 reloc naming functions. */
8070 is_32bit_abs_reloc (unsigned int reloc_type
)
8072 switch (elf_header
.e_machine
)
8076 return reloc_type
== 1; /* R_386_32. */
8078 return reloc_type
== 1; /* R_68K_32. */
8080 return reloc_type
== 1; /* R_860_32. */
8082 return reloc_type
== 1; /* XXX Is this right ? */
8084 return reloc_type
== 1; /* R_ARC_32. */
8086 return reloc_type
== 2; /* R_ARM_ABS32 */
8089 return reloc_type
== 1;
8091 return reloc_type
== 0x12; /* R_byte4_data. */
8093 return reloc_type
== 3; /* R_CRIS_32. */
8095 return reloc_type
== 3; /* R_CR16_NUM32. */
8097 return reloc_type
== 15; /* R_CRX_NUM32. */
8099 return reloc_type
== 1;
8100 case EM_CYGNUS_D10V
:
8102 return reloc_type
== 6; /* R_D10V_32. */
8103 case EM_CYGNUS_D30V
:
8105 return reloc_type
== 12; /* R_D30V_32_NORMAL. */
8107 return reloc_type
== 3; /* R_DLX_RELOC_32. */
8108 case EM_CYGNUS_FR30
:
8110 return reloc_type
== 3; /* R_FR30_32. */
8114 return reloc_type
== 1; /* R_H8_DIR32. */
8116 return reloc_type
== 0x65; /* R_IA64_SECREL32LSB. */
8119 return reloc_type
== 2; /* R_IP2K_32. */
8121 return reloc_type
== 2; /* R_IQ2000_32. */
8123 return reloc_type
== 3; /* R_M32C_32. */
8125 return reloc_type
== 34; /* R_M32R_32_RELA. */
8127 return reloc_type
== 1; /* R_MCORE_ADDR32. */
8129 return reloc_type
== 4; /* R_MEP_32. */
8131 return reloc_type
== 2; /* R_MIPS_32. */
8133 return reloc_type
== 4; /* R_MMIX_32. */
8134 case EM_CYGNUS_MN10200
:
8136 return reloc_type
== 1; /* R_MN10200_32. */
8137 case EM_CYGNUS_MN10300
:
8139 return reloc_type
== 1; /* R_MN10300_32. */
8142 return reloc_type
== 1; /* R_MSP43_32. */
8144 return reloc_type
== 2; /* R_MT_32. */
8145 case EM_ALTERA_NIOS2
:
8147 return reloc_type
== 1; /* R_NIOS_32. */
8150 return reloc_type
== 1; /* R_OR32_32. */
8152 return reloc_type
== 1; /* R_PARISC_DIR32. */
8155 return reloc_type
== 1; /* R_PJ_DATA_DIR32. */
8157 return reloc_type
== 1; /* R_PPC64_ADDR32. */
8159 return reloc_type
== 1; /* R_PPC_ADDR32. */
8161 return reloc_type
== 1; /* R_I370_ADDR31. */
8164 return reloc_type
== 4; /* R_S390_32. */
8166 return reloc_type
== 8; /* R_SCORE_ABS32. */
8168 return reloc_type
== 1; /* R_SH_DIR32. */
8169 case EM_SPARC32PLUS
:
8172 return reloc_type
== 3 /* R_SPARC_32. */
8173 || reloc_type
== 23; /* R_SPARC_UA32. */
8175 return reloc_type
== 6; /* R_SPU_ADDR32 */
8176 case EM_CYGNUS_V850
:
8178 return reloc_type
== 6; /* R_V850_ABS32. */
8180 return reloc_type
== 1; /* R_VAX_32. */
8182 return reloc_type
== 10; /* R_X86_64_32. */
8184 return reloc_type
== 1; /* R_XSTROMY16_32. */
8187 return reloc_type
== 1; /* R_XTENSA_32. */
8190 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
8191 elf_header
.e_machine
);
8196 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8197 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
8200 is_32bit_pcrel_reloc (unsigned int reloc_type
)
8202 switch (elf_header
.e_machine
)
8206 return reloc_type
== 2; /* R_386_PC32. */
8208 return reloc_type
== 4; /* R_68K_PC32. */
8210 return reloc_type
== 10; /* R_ALPHA_SREL32. */
8212 return reloc_type
== 3; /* R_ARM_REL32 */
8214 return reloc_type
== 0; /* R_PARISC_NONE. *//* FIXME: This reloc is generated, but it may be a bug. */
8216 return reloc_type
== 26; /* R_PPC_REL32. */
8218 return reloc_type
== 26; /* R_PPC64_REL32. */
8221 return reloc_type
== 5; /* R_390_PC32. */
8223 return reloc_type
== 2; /* R_SH_REL32. */
8224 case EM_SPARC32PLUS
:
8227 return reloc_type
== 6; /* R_SPARC_DISP32. */
8229 return reloc_type
== 13; /* R_SPU_REL32. */
8231 return reloc_type
== 2; /* R_X86_64_PC32. */
8234 return reloc_type
== 14; /* R_XTENSA_32_PCREL. */
8236 /* Do not abort or issue an error message here. Not all targets use
8237 pc-relative 32-bit relocs in their DWARF debug information and we
8238 have already tested for target coverage in is_32bit_abs_reloc. A
8239 more helpful warning message will be generated by
8240 debug_apply_relocations anyway, so just return. */
8245 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8246 a 64-bit absolute RELA relocation used in DWARF debug sections. */
8249 is_64bit_abs_reloc (unsigned int reloc_type
)
8251 switch (elf_header
.e_machine
)
8254 return reloc_type
== 2; /* R_ALPHA_REFQUAD. */
8256 return reloc_type
== 0x27; /* R_IA64_DIR64LSB. */
8258 return reloc_type
== 80; /* R_PARISC_DIR64. */
8260 return reloc_type
== 38; /* R_PPC64_ADDR64. */
8261 case EM_SPARC32PLUS
:
8264 return reloc_type
== 54; /* R_SPARC_UA64. */
8266 return reloc_type
== 1; /* R_X86_64_64. */
8269 return reloc_type
== 22; /* R_S390_64 */
8275 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8276 a 16-bit absolute RELA relocation used in DWARF debug sections. */
8279 is_16bit_abs_reloc (unsigned int reloc_type
)
8281 switch (elf_header
.e_machine
)
8285 return reloc_type
== 4; /* R_AVR_16. */
8286 case EM_CYGNUS_D10V
:
8288 return reloc_type
== 3; /* R_D10V_16. */
8292 return reloc_type
== R_H8_DIR16
;
8295 return reloc_type
== 1; /* R_IP2K_16. */
8297 return reloc_type
== 1; /* R_M32C_16 */
8300 return reloc_type
== 5; /* R_MSP430_16_BYTE. */
8301 case EM_ALTERA_NIOS2
:
8303 return reloc_type
== 9; /* R_NIOS_16. */
8309 /* Apply relocations to a debug section. */
8312 debug_apply_relocations (void *file
,
8313 Elf_Internal_Shdr
*section
,
8314 unsigned char *start
)
8316 Elf_Internal_Shdr
*relsec
;
8317 unsigned char *end
= start
+ section
->sh_size
;
8319 if (elf_header
.e_type
!= ET_REL
)
8322 /* Find the reloc section associated with the debug section. */
8323 for (relsec
= section_headers
;
8324 relsec
< section_headers
+ elf_header
.e_shnum
;
8327 bfd_boolean is_rela
;
8328 unsigned long num_relocs
;
8329 Elf_Internal_Rela
*relocs
, *rp
;
8330 Elf_Internal_Shdr
*symsec
;
8331 Elf_Internal_Sym
*symtab
;
8332 Elf_Internal_Sym
*sym
;
8334 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
8335 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
8336 || SECTION_HEADER (relsec
->sh_info
) != section
8337 || relsec
->sh_size
== 0
8338 || SECTION_HEADER_INDEX (relsec
->sh_link
) >= elf_header
.e_shnum
)
8341 is_rela
= relsec
->sh_type
== SHT_RELA
;
8345 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
8346 & relocs
, & num_relocs
))
8351 if (!slurp_rel_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
8352 & relocs
, & num_relocs
))
8356 /* SH uses RELA but uses in place value instead of the addend field. */
8357 if (elf_header
.e_machine
== EM_SH
)
8360 symsec
= SECTION_HEADER (relsec
->sh_link
);
8361 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
8363 for (rp
= relocs
; rp
< relocs
+ num_relocs
; ++rp
)
8366 unsigned int reloc_type
;
8367 unsigned int reloc_size
;
8368 unsigned char * loc
;
8370 /* In MIPS little-endian objects, r_info isn't really a
8371 64-bit little-endian value: it has a 32-bit little-endian
8372 symbol index followed by four individual byte fields.
8373 Reorder INFO accordingly. */
8375 && elf_header
.e_machine
== EM_MIPS
8376 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
8377 rp
->r_info
= (((rp
->r_info
& 0xffffffff) << 32)
8378 | ((rp
->r_info
>> 56) & 0xff)
8379 | ((rp
->r_info
>> 40) & 0xff00)
8380 | ((rp
->r_info
>> 24) & 0xff0000)
8381 | ((rp
->r_info
>> 8) & 0xff000000));
8383 reloc_type
= get_reloc_type (rp
->r_info
);
8385 if (is_32bit_abs_reloc (reloc_type
)
8386 || is_32bit_pcrel_reloc (reloc_type
))
8388 else if (is_64bit_abs_reloc (reloc_type
))
8390 else if (is_16bit_abs_reloc (reloc_type
))
8394 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
8395 reloc_type
, SECTION_NAME (section
));
8399 loc
= start
+ rp
->r_offset
;
8400 if ((loc
+ reloc_size
) > end
)
8402 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
8403 (unsigned long) rp
->r_offset
,
8404 SECTION_NAME (section
));
8408 sym
= symtab
+ get_reloc_symindex (rp
->r_info
);
8410 /* If the reloc has a symbol associated with it,
8411 make sure that it is of an appropriate type. */
8413 && ELF_ST_TYPE (sym
->st_info
) != STT_SECTION
8414 /* Relocations against symbols without type can happen.
8415 Gcc -feliminate-dwarf2-dups may generate symbols
8416 without type for debug info. */
8417 && ELF_ST_TYPE (sym
->st_info
) != STT_NOTYPE
8418 /* Relocations against object symbols can happen,
8419 eg when referencing a global array. For an
8420 example of this see the _clz.o binary in libgcc.a. */
8421 && ELF_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
8423 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
8424 get_symbol_type (ELF_ST_TYPE (sym
->st_info
)),
8425 (long int)(rp
- relocs
),
8426 SECTION_NAME (relsec
));
8430 addend
= is_rela
? rp
->r_addend
: byte_get (loc
, reloc_size
);
8432 if (is_32bit_pcrel_reloc (reloc_type
))
8433 byte_put (loc
, (addend
+ sym
->st_value
) - rp
->r_offset
,
8436 byte_put (loc
, addend
+ sym
->st_value
, reloc_size
);
8446 load_debug_section (enum dwarf_section_display_enum debug
, void *file
)
8448 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
8449 Elf_Internal_Shdr
*sec
;
8452 /* If it is already loaded, do nothing. */
8453 if (section
->start
!= NULL
)
8456 /* Locate the debug section. */
8457 sec
= find_section (section
->name
);
8461 snprintf (buf
, sizeof (buf
), _("%s section data"), section
->name
);
8462 section
->address
= sec
->sh_addr
;
8463 section
->size
= sec
->sh_size
;
8464 section
->start
= get_data (NULL
, file
, sec
->sh_offset
, 1,
8467 if (debug_displays
[debug
].relocate
)
8468 debug_apply_relocations (file
, sec
, section
->start
);
8470 return section
->start
!= NULL
;
8474 free_debug_section (enum dwarf_section_display_enum debug
)
8476 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
8478 if (section
->start
== NULL
)
8481 free ((char *) section
->start
);
8482 section
->start
= NULL
;
8483 section
->address
= 0;
8488 display_debug_section (Elf_Internal_Shdr
*section
, FILE *file
)
8490 char *name
= SECTION_NAME (section
);
8491 bfd_size_type length
;
8493 enum dwarf_section_display_enum i
;
8495 length
= section
->sh_size
;
8498 printf (_("\nSection '%s' has no debugging data.\n"), name
);
8502 if (const_strneq (name
, ".gnu.linkonce.wi."))
8503 name
= ".debug_info";
8505 /* See if we know how to display the contents of this section. */
8506 for (i
= 0; i
< max
; i
++)
8507 if (streq (debug_displays
[i
].section
.name
, name
))
8509 struct dwarf_section
*sec
= &debug_displays
[i
].section
;
8511 if (load_debug_section (i
, file
))
8513 result
&= debug_displays
[i
].display (sec
, file
);
8515 if (i
!= info
&& i
!= abbrev
)
8516 free_debug_section (i
);
8524 printf (_("Unrecognized debug section: %s\n"), name
);
8531 /* Set DUMP_SECTS for all sections where dumps were requested
8532 based on section name. */
8535 initialise_dumps_byname (void)
8537 struct dump_list_entry
*cur
;
8539 for (cur
= dump_sects_byname
; cur
; cur
= cur
->next
)
8544 for (i
= 0, any
= 0; i
< elf_header
.e_shnum
; i
++)
8545 if (streq (SECTION_NAME (section_headers
+ i
), cur
->name
))
8547 request_dump_bynumber (i
, cur
->type
);
8552 warn (_("Section '%s' was not dumped because it does not exist!\n"),
8558 process_section_contents (FILE *file
)
8560 Elf_Internal_Shdr
*section
;
8566 initialise_dumps_byname ();
8568 for (i
= 0, section
= section_headers
;
8569 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
8572 #ifdef SUPPORT_DISASSEMBLY
8573 if (dump_sects
[i
] & DISASS_DUMP
)
8574 disassemble_section (section
, file
);
8576 if (dump_sects
[i
] & HEX_DUMP
)
8577 dump_section_as_bytes (section
, file
);
8579 if (dump_sects
[i
] & DEBUG_DUMP
)
8580 display_debug_section (section
, file
);
8582 if (dump_sects
[i
] & STRING_DUMP
)
8583 dump_section_as_strings (section
, file
);
8586 /* Check to see if the user requested a
8587 dump of a section that does not exist. */
8588 while (i
++ < num_dump_sects
)
8590 warn (_("Section %d was not dumped because it does not exist!\n"), i
);
8594 process_mips_fpe_exception (int mask
)
8599 if (mask
& OEX_FPU_INEX
)
8600 fputs ("INEX", stdout
), first
= 0;
8601 if (mask
& OEX_FPU_UFLO
)
8602 printf ("%sUFLO", first
? "" : "|"), first
= 0;
8603 if (mask
& OEX_FPU_OFLO
)
8604 printf ("%sOFLO", first
? "" : "|"), first
= 0;
8605 if (mask
& OEX_FPU_DIV0
)
8606 printf ("%sDIV0", first
? "" : "|"), first
= 0;
8607 if (mask
& OEX_FPU_INVAL
)
8608 printf ("%sINVAL", first
? "" : "|");
8611 fputs ("0", stdout
);
8614 /* ARM EABI attributes section. */
8619 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
8622 } arm_attr_public_tag
;
8624 static const char *arm_attr_tag_CPU_arch
[] =
8625 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
8627 static const char *arm_attr_tag_ARM_ISA_use
[] = {"No", "Yes"};
8628 static const char *arm_attr_tag_THUMB_ISA_use
[] =
8629 {"No", "Thumb-1", "Thumb-2"};
8630 /* FIXME: VFPv3 encoding was extrapolated! */
8631 static const char *arm_attr_tag_VFP_arch
[] = {"No", "VFPv1", "VFPv2", "VFPv3"};
8632 static const char *arm_attr_tag_WMMX_arch
[] = {"No", "WMMXv1"};
8633 static const char *arm_attr_tag_NEON_arch
[] = {"No", "NEONv1"};
8634 static const char *arm_attr_tag_ABI_PCS_config
[] =
8635 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
8636 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
8637 static const char *arm_attr_tag_ABI_PCS_R9_use
[] =
8638 {"V6", "SB", "TLS", "Unused"};
8639 static const char *arm_attr_tag_ABI_PCS_RW_data
[] =
8640 {"Absolute", "PC-relative", "SB-relative", "None"};
8641 static const char *arm_attr_tag_ABI_PCS_RO_DATA
[] =
8642 {"Absolute", "PC-relative", "None"};
8643 static const char *arm_attr_tag_ABI_PCS_GOT_use
[] =
8644 {"None", "direct", "GOT-indirect"};
8645 static const char *arm_attr_tag_ABI_PCS_wchar_t
[] =
8646 {"None", "??? 1", "2", "??? 3", "4"};
8647 static const char *arm_attr_tag_ABI_FP_rounding
[] = {"Unused", "Needed"};
8648 static const char *arm_attr_tag_ABI_FP_denormal
[] = {"Unused", "Needed"};
8649 static const char *arm_attr_tag_ABI_FP_exceptions
[] = {"Unused", "Needed"};
8650 static const char *arm_attr_tag_ABI_FP_user_exceptions
[] = {"Unused", "Needed"};
8651 static const char *arm_attr_tag_ABI_FP_number_model
[] =
8652 {"Unused", "Finite", "RTABI", "IEEE 754"};
8653 static const char *arm_attr_tag_ABI_align8_needed
[] = {"No", "Yes", "4-byte"};
8654 static const char *arm_attr_tag_ABI_align8_preserved
[] =
8655 {"No", "Yes, except leaf SP", "Yes"};
8656 static const char *arm_attr_tag_ABI_enum_size
[] =
8657 {"Unused", "small", "int", "forced to int"};
8658 static const char *arm_attr_tag_ABI_HardFP_use
[] =
8659 {"As Tag_VFP_arch", "SP only", "DP only", "SP and DP"};
8660 static const char *arm_attr_tag_ABI_VFP_args
[] =
8661 {"AAPCS", "VFP registers", "custom"};
8662 static const char *arm_attr_tag_ABI_WMMX_args
[] =
8663 {"AAPCS", "WMMX registers", "custom"};
8664 static const char *arm_attr_tag_ABI_optimization_goals
[] =
8665 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
8666 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
8667 static const char *arm_attr_tag_ABI_FP_optimization_goals
[] =
8668 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
8669 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
8671 #define LOOKUP(id, name) \
8672 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
8673 static arm_attr_public_tag arm_attr_public_tags
[] =
8675 {4, "CPU_raw_name", 1, NULL
},
8676 {5, "CPU_name", 1, NULL
},
8677 LOOKUP(6, CPU_arch
),
8678 {7, "CPU_arch_profile", 0, NULL
},
8679 LOOKUP(8, ARM_ISA_use
),
8680 LOOKUP(9, THUMB_ISA_use
),
8681 LOOKUP(10, VFP_arch
),
8682 LOOKUP(11, WMMX_arch
),
8683 LOOKUP(12, NEON_arch
),
8684 LOOKUP(13, ABI_PCS_config
),
8685 LOOKUP(14, ABI_PCS_R9_use
),
8686 LOOKUP(15, ABI_PCS_RW_data
),
8687 LOOKUP(16, ABI_PCS_RO_DATA
),
8688 LOOKUP(17, ABI_PCS_GOT_use
),
8689 LOOKUP(18, ABI_PCS_wchar_t
),
8690 LOOKUP(19, ABI_FP_rounding
),
8691 LOOKUP(20, ABI_FP_denormal
),
8692 LOOKUP(21, ABI_FP_exceptions
),
8693 LOOKUP(22, ABI_FP_user_exceptions
),
8694 LOOKUP(23, ABI_FP_number_model
),
8695 LOOKUP(24, ABI_align8_needed
),
8696 LOOKUP(25, ABI_align8_preserved
),
8697 LOOKUP(26, ABI_enum_size
),
8698 LOOKUP(27, ABI_HardFP_use
),
8699 LOOKUP(28, ABI_VFP_args
),
8700 LOOKUP(29, ABI_WMMX_args
),
8701 LOOKUP(30, ABI_optimization_goals
),
8702 LOOKUP(31, ABI_FP_optimization_goals
),
8703 {32, "compatibility", 0, NULL
}
8707 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
8710 read_uleb128 (unsigned char *p
, unsigned int *plen
)
8724 val
|= ((unsigned int)c
& 0x7f) << shift
;
8733 static unsigned char *
8734 display_arm_attribute (unsigned char *p
)
8739 arm_attr_public_tag
*attr
;
8743 tag
= read_uleb128 (p
, &len
);
8746 for (i
= 0; i
< ARRAY_SIZE(arm_attr_public_tags
); i
++)
8748 if (arm_attr_public_tags
[i
].tag
== tag
)
8750 attr
= &arm_attr_public_tags
[i
];
8757 printf (" Tag_%s: ", attr
->name
);
8763 case 7: /* Tag_CPU_arch_profile. */
8764 val
= read_uleb128 (p
, &len
);
8768 case 0: printf ("None\n"); break;
8769 case 'A': printf ("Application\n"); break;
8770 case 'R': printf ("Realtime\n"); break;
8771 case 'M': printf ("Microcontroller\n"); break;
8772 default: printf ("??? (%d)\n", val
); break;
8776 case 32: /* Tag_compatibility. */
8777 val
= read_uleb128 (p
, &len
);
8779 printf ("flag = %d, vendor = %s\n", val
, p
);
8780 p
+= strlen((char *)p
) + 1;
8794 assert (attr
->type
& 0x80);
8795 val
= read_uleb128 (p
, &len
);
8797 type
= attr
->type
& 0x7f;
8799 printf ("??? (%d)\n", val
);
8801 printf ("%s\n", attr
->table
[val
]);
8808 type
= 1; /* String. */
8810 type
= 2; /* uleb128. */
8811 printf (" Tag_unknown_%d: ", tag
);
8816 printf ("\"%s\"\n", p
);
8817 p
+= strlen((char *)p
) + 1;
8821 val
= read_uleb128 (p
, &len
);
8823 printf ("%d (0x%x)\n", val
, val
);
8829 static unsigned char *
8830 display_gnu_attribute (unsigned char * p
,
8831 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, int))
8838 tag
= read_uleb128 (p
, &len
);
8841 /* Tag_compatibility is the only generic GNU attribute defined at
8845 val
= read_uleb128 (p
, &len
);
8847 printf ("flag = %d, vendor = %s\n", val
, p
);
8848 p
+= strlen ((char *) p
) + 1;
8852 if ((tag
& 2) == 0 && display_proc_gnu_attribute
)
8853 return display_proc_gnu_attribute (p
, tag
);
8856 type
= 1; /* String. */
8858 type
= 2; /* uleb128. */
8859 printf (" Tag_unknown_%d: ", tag
);
8863 printf ("\"%s\"\n", p
);
8864 p
+= strlen ((char *) p
) + 1;
8868 val
= read_uleb128 (p
, &len
);
8870 printf ("%d (0x%x)\n", val
, val
);
8876 static unsigned char *
8877 display_power_gnu_attribute (unsigned char *p
, int tag
)
8883 if (tag
== Tag_GNU_Power_ABI_FP
)
8885 val
= read_uleb128 (p
, &len
);
8887 printf (" Tag_GNU_Power_ABI_FP: ");
8892 printf ("Hard or soft float\n");
8895 printf ("Hard float\n");
8898 printf ("Soft float\n");
8901 printf ("??? (%d)\n", val
);
8907 if (tag
== Tag_GNU_Power_ABI_Vector
)
8909 val
= read_uleb128 (p
, &len
);
8911 printf (" Tag_GNU_Power_ABI_Vector: ");
8918 printf ("Generic\n");
8921 printf ("AltiVec\n");
8927 printf ("??? (%d)\n", val
);
8934 type
= 1; /* String. */
8936 type
= 2; /* uleb128. */
8937 printf (" Tag_unknown_%d: ", tag
);
8941 printf ("\"%s\"\n", p
);
8942 p
+= strlen ((char *) p
) + 1;
8946 val
= read_uleb128 (p
, &len
);
8948 printf ("%d (0x%x)\n", val
, val
);
8954 static unsigned char *
8955 display_mips_gnu_attribute (unsigned char *p
, int tag
)
8961 if (tag
== Tag_GNU_MIPS_ABI_FP
)
8963 val
= read_uleb128 (p
, &len
);
8965 printf (" Tag_GNU_MIPS_ABI_FP: ");
8970 printf ("Hard or soft float\n");
8973 printf ("Hard float (-mdouble-float)\n");
8976 printf ("Hard float (-msingle-float)\n");
8979 printf ("Soft float\n");
8982 printf ("64-bit float (-mips32r2 -mfp64)\n");
8985 printf ("??? (%d)\n", val
);
8992 type
= 1; /* String. */
8994 type
= 2; /* uleb128. */
8995 printf (" Tag_unknown_%d: ", tag
);
8999 printf ("\"%s\"\n", p
);
9000 p
+= strlen ((char *) p
) + 1;
9004 val
= read_uleb128 (p
, &len
);
9006 printf ("%d (0x%x)\n", val
, val
);
9013 process_attributes (FILE * file
,
9014 const char * public_name
,
9015 unsigned int proc_type
,
9016 unsigned char * (* display_pub_attribute
) (unsigned char *),
9017 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, int))
9019 Elf_Internal_Shdr
*sect
;
9020 unsigned char *contents
;
9023 bfd_vma section_len
;
9027 /* Find the section header so that we get the size. */
9028 for (i
= 0, sect
= section_headers
;
9029 i
< elf_header
.e_shnum
;
9032 if (sect
->sh_type
!= proc_type
&& sect
->sh_type
!= SHT_GNU_ATTRIBUTES
)
9035 contents
= get_data (NULL
, file
, sect
->sh_offset
, 1, sect
->sh_size
,
9037 if (contents
== NULL
)
9043 len
= sect
->sh_size
- 1;
9049 bfd_boolean public_section
;
9050 bfd_boolean gnu_section
;
9052 section_len
= byte_get (p
, 4);
9055 if (section_len
> len
)
9057 printf (_("ERROR: Bad section length (%d > %d)\n"),
9058 (int) section_len
, (int) len
);
9063 printf ("Attribute Section: %s\n", p
);
9065 if (public_name
&& streq ((char *) p
, public_name
))
9066 public_section
= TRUE
;
9068 public_section
= FALSE
;
9070 if (streq ((char *) p
, "gnu"))
9073 gnu_section
= FALSE
;
9075 namelen
= strlen ((char *) p
) + 1;
9077 section_len
-= namelen
+ 4;
9079 while (section_len
> 0)
9085 size
= byte_get (p
, 4);
9086 if (size
> section_len
)
9088 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
9089 (int) size
, (int) section_len
);
9093 section_len
-= size
;
9100 printf ("File Attributes\n");
9103 printf ("Section Attributes:");
9106 printf ("Symbol Attributes:");
9112 val
= read_uleb128 (p
, &i
);
9116 printf (" %d", val
);
9121 printf ("Unknown tag: %d\n", tag
);
9122 public_section
= FALSE
;
9129 p
= display_pub_attribute (p
);
9131 else if (gnu_section
)
9134 p
= display_gnu_attribute (p
,
9135 display_proc_gnu_attribute
);
9139 /* ??? Do something sensible, like dump hex. */
9140 printf (" Unknown section contexts\n");
9147 printf (_("Unknown format '%c'\n"), *p
);
9155 process_arm_specific (FILE *file
)
9157 return process_attributes (file
, "aeabi", SHT_ARM_ATTRIBUTES
,
9158 display_arm_attribute
, NULL
);
9162 process_power_specific (FILE *file
)
9164 return process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
9165 display_power_gnu_attribute
);
9169 process_mips_specific (FILE *file
)
9171 Elf_Internal_Dyn
*entry
;
9172 size_t liblist_offset
= 0;
9173 size_t liblistno
= 0;
9174 size_t conflictsno
= 0;
9175 size_t options_offset
= 0;
9176 size_t conflicts_offset
= 0;
9178 process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
9179 display_mips_gnu_attribute
);
9181 /* We have a lot of special sections. Thanks SGI! */
9182 if (dynamic_section
== NULL
)
9183 /* No information available. */
9186 for (entry
= dynamic_section
; entry
->d_tag
!= DT_NULL
; ++entry
)
9187 switch (entry
->d_tag
)
9189 case DT_MIPS_LIBLIST
:
9191 = offset_from_vma (file
, entry
->d_un
.d_val
,
9192 liblistno
* sizeof (Elf32_External_Lib
));
9194 case DT_MIPS_LIBLISTNO
:
9195 liblistno
= entry
->d_un
.d_val
;
9197 case DT_MIPS_OPTIONS
:
9198 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
9200 case DT_MIPS_CONFLICT
:
9202 = offset_from_vma (file
, entry
->d_un
.d_val
,
9203 conflictsno
* sizeof (Elf32_External_Conflict
));
9205 case DT_MIPS_CONFLICTNO
:
9206 conflictsno
= entry
->d_un
.d_val
;
9212 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
9214 Elf32_External_Lib
*elib
;
9217 elib
= get_data (NULL
, file
, liblist_offset
,
9218 liblistno
, sizeof (Elf32_External_Lib
),
9222 printf ("\nSection '.liblist' contains %lu entries:\n",
9223 (unsigned long) liblistno
);
9224 fputs (" Library Time Stamp Checksum Version Flags\n",
9227 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
9234 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9235 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9236 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9237 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9238 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9240 tmp
= gmtime (&time
);
9241 snprintf (timebuf
, sizeof (timebuf
),
9242 "%04u-%02u-%02uT%02u:%02u:%02u",
9243 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9244 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9246 printf ("%3lu: ", (unsigned long) cnt
);
9247 if (VALID_DYNAMIC_NAME (liblist
.l_name
))
9248 print_symbol (20, GET_DYNAMIC_NAME (liblist
.l_name
));
9250 printf ("<corrupt: %9ld>", liblist
.l_name
);
9251 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
9254 if (liblist
.l_flags
== 0)
9265 { " EXACT_MATCH", LL_EXACT_MATCH
},
9266 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
9267 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
9268 { " EXPORTS", LL_EXPORTS
},
9269 { " DELAY_LOAD", LL_DELAY_LOAD
},
9270 { " DELTA", LL_DELTA
}
9272 int flags
= liblist
.l_flags
;
9275 for (fcnt
= 0; fcnt
< ARRAY_SIZE (l_flags_vals
); ++fcnt
)
9276 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
9278 fputs (l_flags_vals
[fcnt
].name
, stdout
);
9279 flags
^= l_flags_vals
[fcnt
].bit
;
9282 printf (" %#x", (unsigned int) flags
);
9292 if (options_offset
!= 0)
9294 Elf_External_Options
*eopt
;
9295 Elf_Internal_Shdr
*sect
= section_headers
;
9296 Elf_Internal_Options
*iopt
;
9297 Elf_Internal_Options
*option
;
9301 /* Find the section header so that we get the size. */
9302 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
9305 eopt
= get_data (NULL
, file
, options_offset
, 1, sect
->sh_size
,
9309 iopt
= cmalloc ((sect
->sh_size
/ sizeof (eopt
)), sizeof (*iopt
));
9312 error (_("Out of memory\n"));
9319 while (offset
< sect
->sh_size
)
9321 Elf_External_Options
*eoption
;
9323 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
9325 option
->kind
= BYTE_GET (eoption
->kind
);
9326 option
->size
= BYTE_GET (eoption
->size
);
9327 option
->section
= BYTE_GET (eoption
->section
);
9328 option
->info
= BYTE_GET (eoption
->info
);
9330 offset
+= option
->size
;
9336 printf (_("\nSection '%s' contains %d entries:\n"),
9337 SECTION_NAME (sect
), cnt
);
9345 switch (option
->kind
)
9348 /* This shouldn't happen. */
9349 printf (" NULL %d %lx", option
->section
, option
->info
);
9352 printf (" REGINFO ");
9353 if (elf_header
.e_machine
== EM_MIPS
)
9356 Elf32_External_RegInfo
*ereg
;
9357 Elf32_RegInfo reginfo
;
9359 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
9360 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9361 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9362 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9363 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9364 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9365 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9367 printf ("GPR %08lx GP 0x%lx\n",
9369 (unsigned long) reginfo
.ri_gp_value
);
9370 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9371 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9372 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9377 Elf64_External_RegInfo
*ereg
;
9378 Elf64_Internal_RegInfo reginfo
;
9380 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
9381 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9382 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9383 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9384 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9385 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9386 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9388 printf ("GPR %08lx GP 0x",
9389 reginfo
.ri_gprmask
);
9390 printf_vma (reginfo
.ri_gp_value
);
9393 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9394 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9395 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9399 case ODK_EXCEPTIONS
:
9400 fputs (" EXCEPTIONS fpe_min(", stdout
);
9401 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
9402 fputs (") fpe_max(", stdout
);
9403 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
9404 fputs (")", stdout
);
9406 if (option
->info
& OEX_PAGE0
)
9407 fputs (" PAGE0", stdout
);
9408 if (option
->info
& OEX_SMM
)
9409 fputs (" SMM", stdout
);
9410 if (option
->info
& OEX_FPDBUG
)
9411 fputs (" FPDBUG", stdout
);
9412 if (option
->info
& OEX_DISMISS
)
9413 fputs (" DISMISS", stdout
);
9416 fputs (" PAD ", stdout
);
9417 if (option
->info
& OPAD_PREFIX
)
9418 fputs (" PREFIX", stdout
);
9419 if (option
->info
& OPAD_POSTFIX
)
9420 fputs (" POSTFIX", stdout
);
9421 if (option
->info
& OPAD_SYMBOL
)
9422 fputs (" SYMBOL", stdout
);
9425 fputs (" HWPATCH ", stdout
);
9426 if (option
->info
& OHW_R4KEOP
)
9427 fputs (" R4KEOP", stdout
);
9428 if (option
->info
& OHW_R8KPFETCH
)
9429 fputs (" R8KPFETCH", stdout
);
9430 if (option
->info
& OHW_R5KEOP
)
9431 fputs (" R5KEOP", stdout
);
9432 if (option
->info
& OHW_R5KCVTL
)
9433 fputs (" R5KCVTL", stdout
);
9436 fputs (" FILL ", stdout
);
9437 /* XXX Print content of info word? */
9440 fputs (" TAGS ", stdout
);
9441 /* XXX Print content of info word? */
9444 fputs (" HWAND ", stdout
);
9445 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9446 fputs (" R4KEOP_CHECKED", stdout
);
9447 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9448 fputs (" R4KEOP_CLEAN", stdout
);
9451 fputs (" HWOR ", stdout
);
9452 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9453 fputs (" R4KEOP_CHECKED", stdout
);
9454 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9455 fputs (" R4KEOP_CLEAN", stdout
);
9458 printf (" GP_GROUP %#06lx self-contained %#06lx",
9459 option
->info
& OGP_GROUP
,
9460 (option
->info
& OGP_SELF
) >> 16);
9463 printf (" IDENT %#06lx self-contained %#06lx",
9464 option
->info
& OGP_GROUP
,
9465 (option
->info
& OGP_SELF
) >> 16);
9468 /* This shouldn't happen. */
9469 printf (" %3d ??? %d %lx",
9470 option
->kind
, option
->section
, option
->info
);
9474 len
= sizeof (*eopt
);
9475 while (len
< option
->size
)
9476 if (((char *) option
)[len
] >= ' '
9477 && ((char *) option
)[len
] < 0x7f)
9478 printf ("%c", ((char *) option
)[len
++]);
9480 printf ("\\%03o", ((char *) option
)[len
++]);
9482 fputs ("\n", stdout
);
9490 if (conflicts_offset
!= 0 && conflictsno
!= 0)
9492 Elf32_Conflict
*iconf
;
9495 if (dynamic_symbols
== NULL
)
9497 error (_("conflict list found without a dynamic symbol table\n"));
9501 iconf
= cmalloc (conflictsno
, sizeof (*iconf
));
9504 error (_("Out of memory\n"));
9510 Elf32_External_Conflict
*econf32
;
9512 econf32
= get_data (NULL
, file
, conflicts_offset
,
9513 conflictsno
, sizeof (*econf32
), _("conflict"));
9517 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9518 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
9524 Elf64_External_Conflict
*econf64
;
9526 econf64
= get_data (NULL
, file
, conflicts_offset
,
9527 conflictsno
, sizeof (*econf64
), _("conflict"));
9531 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9532 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
9537 printf (_("\nSection '.conflict' contains %lu entries:\n"),
9538 (unsigned long) conflictsno
);
9539 puts (_(" Num: Index Value Name"));
9541 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9543 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
9545 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
9546 print_vma (psym
->st_value
, FULL_HEX
);
9548 if (VALID_DYNAMIC_NAME (psym
->st_name
))
9549 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
9551 printf ("<corrupt: %14ld>", psym
->st_name
);
9562 process_gnu_liblist (FILE *file
)
9564 Elf_Internal_Shdr
*section
, *string_sec
;
9565 Elf32_External_Lib
*elib
;
9574 for (i
= 0, section
= section_headers
;
9575 i
< elf_header
.e_shnum
;
9578 switch (section
->sh_type
)
9580 case SHT_GNU_LIBLIST
:
9581 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
)
9584 elib
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
9589 string_sec
= SECTION_HEADER (section
->sh_link
);
9591 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
9592 string_sec
->sh_size
, _("liblist string table"));
9593 strtab_size
= string_sec
->sh_size
;
9596 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
9602 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
9603 SECTION_NAME (section
),
9604 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
9606 puts (" Library Time Stamp Checksum Version Flags");
9608 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
9616 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9617 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9618 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9619 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9620 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9622 tmp
= gmtime (&time
);
9623 snprintf (timebuf
, sizeof (timebuf
),
9624 "%04u-%02u-%02uT%02u:%02u:%02u",
9625 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9626 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9628 printf ("%3lu: ", (unsigned long) cnt
);
9630 printf ("%-20s", liblist
.l_name
< strtab_size
9631 ? strtab
+ liblist
.l_name
: "<corrupt>");
9633 printf ("%-20.20s", liblist
.l_name
< strtab_size
9634 ? strtab
+ liblist
.l_name
: "<corrupt>");
9635 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
9636 liblist
.l_version
, liblist
.l_flags
);
9647 get_note_type (unsigned e_type
)
9649 static char buff
[64];
9651 if (elf_header
.e_type
== ET_CORE
)
9655 return _("NT_AUXV (auxiliary vector)");
9657 return _("NT_PRSTATUS (prstatus structure)");
9659 return _("NT_FPREGSET (floating point registers)");
9661 return _("NT_PRPSINFO (prpsinfo structure)");
9663 return _("NT_TASKSTRUCT (task structure)");
9665 return _("NT_PRXFPREG (user_xfpregs structure)");
9667 return _("NT_PPC_VMX (ppc Altivec registers)");
9669 return _("NT_PSTATUS (pstatus structure)");
9671 return _("NT_FPREGS (floating point registers)");
9673 return _("NT_PSINFO (psinfo structure)");
9675 return _("NT_LWPSTATUS (lwpstatus_t structure)");
9677 return _("NT_LWPSINFO (lwpsinfo_t structure)");
9678 case NT_WIN32PSTATUS
:
9679 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9687 return _("NT_VERSION (version)");
9689 return _("NT_ARCH (architecture)");
9694 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
9699 get_gnu_elf_note_type (unsigned e_type
)
9701 static char buff
[64];
9705 case NT_GNU_ABI_TAG
:
9706 return _("NT_GNU_ABI_TAG (ABI version tag)");
9708 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
9709 case NT_GNU_BUILD_ID
:
9710 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
9715 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
9720 get_netbsd_elfcore_note_type (unsigned e_type
)
9722 static char buff
[64];
9724 if (e_type
== NT_NETBSDCORE_PROCINFO
)
9726 /* NetBSD core "procinfo" structure. */
9727 return _("NetBSD procinfo structure");
9730 /* As of Jan 2002 there are no other machine-independent notes
9731 defined for NetBSD core files. If the note type is less
9732 than the start of the machine-dependent note types, we don't
9735 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
9737 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
9741 switch (elf_header
.e_machine
)
9743 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
9744 and PT_GETFPREGS == mach+2. */
9749 case EM_SPARC32PLUS
:
9753 case NT_NETBSDCORE_FIRSTMACH
+0:
9754 return _("PT_GETREGS (reg structure)");
9755 case NT_NETBSDCORE_FIRSTMACH
+2:
9756 return _("PT_GETFPREGS (fpreg structure)");
9762 /* On all other arch's, PT_GETREGS == mach+1 and
9763 PT_GETFPREGS == mach+3. */
9767 case NT_NETBSDCORE_FIRSTMACH
+1:
9768 return _("PT_GETREGS (reg structure)");
9769 case NT_NETBSDCORE_FIRSTMACH
+3:
9770 return _("PT_GETFPREGS (fpreg structure)");
9776 snprintf (buff
, sizeof (buff
), _("PT_FIRSTMACH+%d"),
9777 e_type
- NT_NETBSDCORE_FIRSTMACH
);
9781 /* Note that by the ELF standard, the name field is already null byte
9782 terminated, and namesz includes the terminating null byte.
9783 I.E. the value of namesz for the name "FSF" is 4.
9785 If the value of namesz is zero, there is no name present. */
9787 process_note (Elf_Internal_Note
*pnote
)
9789 const char *name
= pnote
->namesz
? pnote
->namedata
: "(NONE)";
9792 if (pnote
->namesz
== 0)
9793 /* If there is no note name, then use the default set of
9794 note type strings. */
9795 nt
= get_note_type (pnote
->type
);
9797 else if (const_strneq (pnote
->namedata
, "GNU"))
9798 /* GNU-specific object file notes. */
9799 nt
= get_gnu_elf_note_type (pnote
->type
);
9801 else if (const_strneq (pnote
->namedata
, "NetBSD-CORE"))
9802 /* NetBSD-specific core file notes. */
9803 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
9805 else if (strneq (pnote
->namedata
, "SPU/", 4))
9807 /* SPU-specific core file notes. */
9808 nt
= pnote
->namedata
+ 4;
9813 /* Don't recognize this note name; just use the default set of
9814 note type strings. */
9815 nt
= get_note_type (pnote
->type
);
9817 printf (" %s\t\t0x%08lx\t%s\n", name
, pnote
->descsz
, nt
);
9823 process_corefile_note_segment (FILE *file
, bfd_vma offset
, bfd_vma length
)
9825 Elf_External_Note
*pnotes
;
9826 Elf_External_Note
*external
;
9832 pnotes
= get_data (NULL
, file
, offset
, 1, length
, _("notes"));
9838 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9839 (unsigned long) offset
, (unsigned long) length
);
9840 printf (_(" Owner\t\tData size\tDescription\n"));
9842 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
9844 Elf_External_Note
*next
;
9845 Elf_Internal_Note inote
;
9848 inote
.type
= BYTE_GET (external
->type
);
9849 inote
.namesz
= BYTE_GET (external
->namesz
);
9850 inote
.namedata
= external
->name
;
9851 inote
.descsz
= BYTE_GET (external
->descsz
);
9852 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
9853 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
9855 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
9857 if (((char *) next
) > (((char *) pnotes
) + length
))
9859 warn (_("corrupt note found at offset %lx into core notes\n"),
9860 (long)((char *)external
- (char *)pnotes
));
9861 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
9862 inote
.type
, inote
.namesz
, inote
.descsz
);
9868 /* Verify that name is null terminated. It appears that at least
9869 one version of Linux (RedHat 6.0) generates corefiles that don't
9870 comply with the ELF spec by failing to include the null byte in
9872 if (inote
.namedata
[inote
.namesz
] != '\0')
9874 temp
= malloc (inote
.namesz
+ 1);
9878 error (_("Out of memory\n"));
9883 strncpy (temp
, inote
.namedata
, inote
.namesz
);
9884 temp
[inote
.namesz
] = 0;
9886 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9887 inote
.namedata
= temp
;
9890 res
&= process_note (& inote
);
9905 process_corefile_note_segments (FILE *file
)
9907 Elf_Internal_Phdr
*segment
;
9911 if (! get_program_headers (file
))
9914 for (i
= 0, segment
= program_headers
;
9915 i
< elf_header
.e_phnum
;
9918 if (segment
->p_type
== PT_NOTE
)
9919 res
&= process_corefile_note_segment (file
,
9920 (bfd_vma
) segment
->p_offset
,
9921 (bfd_vma
) segment
->p_filesz
);
9928 process_note_sections (FILE *file
)
9930 Elf_Internal_Shdr
*section
;
9934 for (i
= 0, section
= section_headers
;
9935 i
< elf_header
.e_shnum
;
9937 if (section
->sh_type
== SHT_NOTE
)
9938 res
&= process_corefile_note_segment (file
,
9939 (bfd_vma
) section
->sh_offset
,
9940 (bfd_vma
) section
->sh_size
);
9946 process_notes (FILE *file
)
9948 /* If we have not been asked to display the notes then do nothing. */
9952 if (elf_header
.e_type
!= ET_CORE
)
9953 return process_note_sections (file
);
9955 /* No program headers means no NOTE segment. */
9956 if (elf_header
.e_phnum
> 0)
9957 return process_corefile_note_segments (file
);
9959 printf (_("No note segments present in the core file.\n"));
9964 process_arch_specific (FILE *file
)
9969 switch (elf_header
.e_machine
)
9972 return process_arm_specific (file
);
9974 case EM_MIPS_RS3_LE
:
9975 return process_mips_specific (file
);
9978 return process_power_specific (file
);
9987 get_file_header (FILE *file
)
9989 /* Read in the identity array. */
9990 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
9993 /* Determine how to read the rest of the header. */
9994 switch (elf_header
.e_ident
[EI_DATA
])
9996 default: /* fall through */
9997 case ELFDATANONE
: /* fall through */
9999 byte_get
= byte_get_little_endian
;
10000 byte_put
= byte_put_little_endian
;
10003 byte_get
= byte_get_big_endian
;
10004 byte_put
= byte_put_big_endian
;
10008 /* For now we only support 32 bit and 64 bit ELF files. */
10009 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
10011 /* Read in the rest of the header. */
10014 Elf32_External_Ehdr ehdr32
;
10016 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
10019 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
10020 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
10021 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
10022 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
10023 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
10024 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
10025 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
10026 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
10027 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
10028 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
10029 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
10030 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
10031 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
10035 Elf64_External_Ehdr ehdr64
;
10037 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10038 we will not be able to cope with the 64bit data found in
10039 64 ELF files. Detect this now and abort before we start
10040 overwriting things. */
10041 if (sizeof (bfd_vma
) < 8)
10043 error (_("This instance of readelf has been built without support for a\n\
10044 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10048 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
10051 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
10052 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
10053 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
10054 elf_header
.e_entry
= BYTE_GET (ehdr64
.e_entry
);
10055 elf_header
.e_phoff
= BYTE_GET (ehdr64
.e_phoff
);
10056 elf_header
.e_shoff
= BYTE_GET (ehdr64
.e_shoff
);
10057 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
10058 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
10059 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
10060 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
10061 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
10062 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
10063 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
10066 if (elf_header
.e_shoff
)
10068 /* There may be some extensions in the first section header. Don't
10069 bomb if we can't read it. */
10071 get_32bit_section_headers (file
, 1);
10073 get_64bit_section_headers (file
, 1);
10079 /* Process one ELF object file according to the command line options.
10080 This file may actually be stored in an archive. The file is
10081 positioned at the start of the ELF object. */
10084 process_object (char *file_name
, FILE *file
)
10088 if (! get_file_header (file
))
10090 error (_("%s: Failed to read file header\n"), file_name
);
10094 /* Initialise per file variables. */
10095 for (i
= ARRAY_SIZE (version_info
); i
--;)
10096 version_info
[i
] = 0;
10098 for (i
= ARRAY_SIZE (dynamic_info
); i
--;)
10099 dynamic_info
[i
] = 0;
10101 /* Process the file. */
10103 printf (_("\nFile: %s\n"), file_name
);
10105 /* Initialise the dump_sects array from the cmdline_dump_sects array.
10106 Note we do this even if cmdline_dump_sects is empty because we
10107 must make sure that the dump_sets array is zeroed out before each
10108 object file is processed. */
10109 if (num_dump_sects
> num_cmdline_dump_sects
)
10110 memset (dump_sects
, 0, num_dump_sects
* sizeof (* dump_sects
));
10112 if (num_cmdline_dump_sects
> 0)
10114 if (num_dump_sects
== 0)
10115 /* A sneaky way of allocating the dump_sects array. */
10116 request_dump_bynumber (num_cmdline_dump_sects
, 0);
10118 assert (num_dump_sects
>= num_cmdline_dump_sects
);
10119 memcpy (dump_sects
, cmdline_dump_sects
,
10120 num_cmdline_dump_sects
* sizeof (* dump_sects
));
10123 if (! process_file_header ())
10126 if (! process_section_headers (file
))
10128 /* Without loaded section headers we cannot process lots of
10130 do_unwind
= do_version
= do_dump
= do_arch
= 0;
10132 if (! do_using_dynamic
)
10133 do_syms
= do_reloc
= 0;
10136 if (! process_section_groups (file
))
10138 /* Without loaded section groups we cannot process unwind. */
10142 if (process_program_headers (file
))
10143 process_dynamic_section (file
);
10145 process_relocs (file
);
10147 process_unwind (file
);
10149 process_symbol_table (file
);
10151 process_syminfo (file
);
10153 process_version_sections (file
);
10155 process_section_contents (file
);
10157 process_notes (file
);
10159 process_gnu_liblist (file
);
10161 process_arch_specific (file
);
10163 if (program_headers
)
10165 free (program_headers
);
10166 program_headers
= NULL
;
10169 if (section_headers
)
10171 free (section_headers
);
10172 section_headers
= NULL
;
10177 free (string_table
);
10178 string_table
= NULL
;
10179 string_table_length
= 0;
10182 if (dynamic_strings
)
10184 free (dynamic_strings
);
10185 dynamic_strings
= NULL
;
10186 dynamic_strings_length
= 0;
10189 if (dynamic_symbols
)
10191 free (dynamic_symbols
);
10192 dynamic_symbols
= NULL
;
10193 num_dynamic_syms
= 0;
10196 if (dynamic_syminfo
)
10198 free (dynamic_syminfo
);
10199 dynamic_syminfo
= NULL
;
10202 if (section_headers_groups
)
10204 free (section_headers_groups
);
10205 section_headers_groups
= NULL
;
10208 if (section_groups
)
10210 struct group_list
*g
, *next
;
10212 for (i
= 0; i
< group_count
; i
++)
10214 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
10221 free (section_groups
);
10222 section_groups
= NULL
;
10225 free_debug_memory ();
10230 /* Process an ELF archive.
10231 On entry the file is positioned just after the ARMAG string. */
10234 process_archive (char *file_name
, FILE *file
)
10236 struct ar_hdr arhdr
;
10238 unsigned long size
;
10239 unsigned long index_num
= 0;
10240 unsigned long *index_array
= NULL
;
10241 char *sym_table
= NULL
;
10242 unsigned long sym_size
= 0;
10243 char *longnames
= NULL
;
10244 unsigned long longnames_size
= 0;
10245 size_t file_name_size
;
10250 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10251 if (got
!= sizeof arhdr
)
10256 error (_("%s: failed to read archive header\n"), file_name
);
10260 /* See if this is the archive symbol table. */
10261 if (const_strneq (arhdr
.ar_name
, "/ ")
10262 || const_strneq (arhdr
.ar_name
, "/SYM64/ "))
10264 size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10265 size
= size
+ (size
& 1);
10267 if (do_archive_index
)
10270 /* A buffer used to hold numbers read in from an archive index.
10271 These are always 4 bytes long and stored in big-endian format. */
10272 #define SIZEOF_AR_INDEX_NUMBERS 4
10273 unsigned char integer_buffer
[SIZEOF_AR_INDEX_NUMBERS
];
10274 unsigned char * index_buffer
;
10276 /* Check the size of the archive index. */
10277 if (size
< SIZEOF_AR_INDEX_NUMBERS
)
10279 error (_("%s: the archive index is empty\n"), file_name
);
10283 /* Read the numer of entries in the archive index. */
10284 got
= fread (integer_buffer
, 1, sizeof integer_buffer
, file
);
10285 if (got
!= sizeof (integer_buffer
))
10287 error (_("%s: failed to read archive index\n"), file_name
);
10290 index_num
= byte_get_big_endian (integer_buffer
, sizeof integer_buffer
);
10291 size
-= SIZEOF_AR_INDEX_NUMBERS
;
10293 /* Read in the archive index. */
10294 if (size
< index_num
* SIZEOF_AR_INDEX_NUMBERS
)
10296 error (_("%s: the archive index is supposed to have %ld entries, but the size in the header is too small\n"),
10297 file_name
, index_num
);
10300 index_buffer
= malloc (index_num
* SIZEOF_AR_INDEX_NUMBERS
);
10301 if (index_buffer
== NULL
)
10303 error (_("Out of memory whilst trying to read archive symbol index\n"));
10306 got
= fread (index_buffer
, SIZEOF_AR_INDEX_NUMBERS
, index_num
, file
);
10307 if (got
!= index_num
)
10309 free (index_buffer
);
10310 error (_("%s: failed to read archive index\n"), file_name
);
10314 size
-= index_num
* SIZEOF_AR_INDEX_NUMBERS
;
10316 /* Convert the index numbers into the host's numeric format. */
10317 index_array
= malloc (index_num
* sizeof (* index_array
));
10318 if (index_array
== NULL
)
10320 free (index_buffer
);
10321 error (_("Out of memory whilst trying to convert the archive symbol index\n"));
10325 for (i
= 0; i
< index_num
; i
++)
10326 index_array
[i
] = byte_get_big_endian ((unsigned char *)(index_buffer
+ (i
* SIZEOF_AR_INDEX_NUMBERS
)),
10327 SIZEOF_AR_INDEX_NUMBERS
);
10328 free (index_buffer
);
10330 /* The remaining space in the header is taken up by the symbol table. */
10333 error (_("%s: the archive has an index but no symbols\n"), file_name
);
10337 sym_table
= malloc (size
);
10339 if (sym_table
== NULL
)
10341 error (_("Out of memory whilst trying to read archive index symbol table\n"));
10345 got
= fread (sym_table
, 1, size
, file
);
10348 error (_("%s: failed to read archive index symbol table\n"), file_name
);
10355 if (fseek (file
, size
, SEEK_CUR
) != 0)
10357 error (_("%s: failed to skip archive symbol table\n"), file_name
);
10362 got
= fread (& arhdr
, 1, sizeof arhdr
, file
);
10363 if (got
!= sizeof arhdr
)
10371 error (_("%s: failed to read archive header following archive index\n"), file_name
);
10376 else if (do_archive_index
)
10377 printf (_("%s has no archive index\n"), file_name
);
10379 if (const_strneq (arhdr
.ar_name
, "// "))
10381 /* This is the archive string table holding long member
10384 longnames_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10385 longnames
= malloc (longnames_size
);
10386 if (longnames
== NULL
)
10388 error (_("Out of memory reading long symbol names in archive\n"));
10393 if (fread (longnames
, longnames_size
, 1, file
) != 1)
10396 error (_("%s: failed to read long symbol name string table\n"), file_name
);
10401 if ((longnames_size
& 1) != 0)
10404 got
= fread (& arhdr
, 1, sizeof arhdr
, file
);
10405 if (got
!= sizeof arhdr
)
10411 error (_("%s: failed to read archive header following long symbol names\n"), file_name
);
10418 if (do_archive_index
)
10420 if (sym_table
== NULL
)
10421 error (_("%s: unable to dump the index as none was found\n"), file_name
);
10424 unsigned int i
, j
, k
, l
;
10426 unsigned long current_pos
;
10428 printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
10429 file_name
, index_num
, sym_size
);
10430 current_pos
= ftell (file
);
10432 for (i
= l
= 0; i
< index_num
; i
++)
10434 if ((i
== 0) || ((i
> 0) && (index_array
[i
] != index_array
[i
- 1])))
10436 if (fseek (file
, index_array
[i
], SEEK_SET
) != 0)
10438 error (_("%s: failed to seek to next file name\n"), file_name
);
10442 got
= fread (elf_name
, 1, 16, file
);
10445 error (_("%s: failed to read file name\n"), file_name
);
10450 if (elf_name
[0] == '/')
10452 /* We have a long name. */
10453 k
= j
= strtoul (elf_name
+ 1, NULL
, 10);
10454 while ((j
< longnames_size
) && (longnames
[j
] != '/'))
10456 longnames
[j
] = '\0';
10457 printf (_("Binary %s contains:\n"), longnames
+ k
);
10458 longnames
[j
] = '/';
10463 while ((elf_name
[j
] != '/') && (j
< 16))
10465 elf_name
[j
] = '\0';
10466 printf(_("Binary %s contains:\n"), elf_name
);
10471 error (_("%s: end of the symbol table reached before the end of the index\n"),
10475 printf ("\t%s\n", sym_table
+ l
);
10476 l
+= strlen (sym_table
+ l
) + 1;
10480 error (_("%s: symbols remain in the index symbol table, but without corresponding entries in the index table\n"),
10483 free (index_array
);
10484 index_array
= NULL
;
10487 if (fseek (file
, current_pos
, SEEK_SET
) != 0)
10489 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name
);
10494 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
10495 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
10496 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
10497 && !do_section_groups
)
10498 return 0; /* Archive index only. */
10501 file_name_size
= strlen (file_name
);
10510 if (arhdr
.ar_name
[0] == '/')
10514 off
= strtoul (arhdr
.ar_name
+ 1, NULL
, 10);
10515 if (off
>= longnames_size
)
10517 error (_("%s: invalid archive string table offset %lu\n"), file_name
, off
);
10522 name
= longnames
+ off
;
10523 nameend
= memchr (name
, '/', longnames_size
- off
);
10527 name
= arhdr
.ar_name
;
10528 nameend
= memchr (name
, '/', 16);
10531 if (nameend
== NULL
)
10533 error (_("%s: bad archive file name\n"), file_name
);
10538 namealc
= malloc (file_name_size
+ (nameend
- name
) + 3);
10539 if (namealc
== NULL
)
10541 error (_("Out of memory\n"));
10546 memcpy (namealc
, file_name
, file_name_size
);
10547 namealc
[file_name_size
] = '(';
10548 memcpy (namealc
+ file_name_size
+ 1, name
, nameend
- name
);
10549 namealc
[file_name_size
+ 1 + (nameend
- name
)] = ')';
10550 namealc
[file_name_size
+ 2 + (nameend
- name
)] = '\0';
10552 archive_file_offset
= ftell (file
);
10553 archive_file_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10555 ret
|= process_object (namealc
, file
);
10560 (archive_file_offset
10561 + archive_file_size
10562 + (archive_file_size
& 1)),
10565 error (_("%s: failed to seek to next archive header\n"), file_name
);
10570 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10571 if (got
!= sizeof arhdr
)
10576 error (_("%s: failed to read archive header\n"), file_name
);
10583 if (index_array
!= NULL
)
10584 free (index_array
);
10585 if (sym_table
!= NULL
)
10587 if (longnames
!= NULL
)
10594 process_file (char *file_name
)
10597 struct stat statbuf
;
10598 char armag
[SARMAG
];
10601 if (stat (file_name
, &statbuf
) < 0)
10603 if (errno
== ENOENT
)
10604 error (_("'%s': No such file\n"), file_name
);
10606 error (_("Could not locate '%s'. System error message: %s\n"),
10607 file_name
, strerror (errno
));
10611 if (! S_ISREG (statbuf
.st_mode
))
10613 error (_("'%s' is not an ordinary file\n"), file_name
);
10617 file
= fopen (file_name
, "rb");
10620 error (_("Input file '%s' is not readable.\n"), file_name
);
10624 if (fread (armag
, SARMAG
, 1, file
) != 1)
10626 error (_("%s: Failed to read file's magic number\n"), file_name
);
10631 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
10632 ret
= process_archive (file_name
, file
);
10635 if (do_archive_index
)
10636 error (_("File %s is not an archive so its index cannot be displayed.\n"),
10640 archive_file_size
= archive_file_offset
= 0;
10641 ret
= process_object (file_name
, file
);
10649 #ifdef SUPPORT_DISASSEMBLY
10650 /* Needed by the i386 disassembler. For extra credit, someone could
10651 fix this so that we insert symbolic addresses here, esp for GOT/PLT
10655 print_address (unsigned int addr
, FILE *outfile
)
10657 fprintf (outfile
,"0x%8.8x", addr
);
10660 /* Needed by the i386 disassembler. */
10662 db_task_printsym (unsigned int addr
)
10664 print_address (addr
, stderr
);
10669 main (int argc
, char **argv
)
10673 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
10674 setlocale (LC_MESSAGES
, "");
10676 #if defined (HAVE_SETLOCALE)
10677 setlocale (LC_CTYPE
, "");
10679 bindtextdomain (PACKAGE
, LOCALEDIR
);
10680 textdomain (PACKAGE
);
10682 expandargv (&argc
, &argv
);
10684 parse_args (argc
, argv
);
10686 if (num_dump_sects
> 0)
10688 /* Make a copy of the dump_sects array. */
10689 cmdline_dump_sects
= malloc (num_dump_sects
* sizeof (* dump_sects
));
10690 if (cmdline_dump_sects
== NULL
)
10691 error (_("Out of memory allocating dump request table.\n"));
10694 memcpy (cmdline_dump_sects
, dump_sects
,
10695 num_dump_sects
* sizeof (* dump_sects
));
10696 num_cmdline_dump_sects
= num_dump_sects
;
10700 if (optind
< (argc
- 1))
10704 while (optind
< argc
)
10705 err
|= process_file (argv
[optind
++]);
10707 if (dump_sects
!= NULL
)
10709 if (cmdline_dump_sects
!= NULL
)
10710 free (cmdline_dump_sects
);