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;
2263 case E_MIPS_MACH_OCTEON
: strcat (buf
, ", octeon"); break;
2265 /* We simply ignore the field in this case to avoid confusion:
2266 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2269 default: strcat (buf
, ", unknown CPU"); break;
2272 switch ((e_flags
& EF_MIPS_ABI
))
2274 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
2275 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
2276 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
2277 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
2279 /* We simply ignore the field in this case to avoid confusion:
2280 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2281 This means it is likely to be an o32 file, but not for
2284 default: strcat (buf
, ", unknown ABI"); break;
2287 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
2288 strcat (buf
, ", mdmx");
2290 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
2291 strcat (buf
, ", mips16");
2293 switch ((e_flags
& EF_MIPS_ARCH
))
2295 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
2296 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
2297 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
2298 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
2299 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
2300 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
2301 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
2302 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
2303 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
2304 default: strcat (buf
, ", unknown ISA"); break;
2310 switch ((e_flags
& EF_SH_MACH_MASK
))
2312 case EF_SH1
: strcat (buf
, ", sh1"); break;
2313 case EF_SH2
: strcat (buf
, ", sh2"); break;
2314 case EF_SH3
: strcat (buf
, ", sh3"); break;
2315 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
2316 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
2317 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
2318 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
2319 case EF_SH4
: strcat (buf
, ", sh4"); break;
2320 case EF_SH5
: strcat (buf
, ", sh5"); break;
2321 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
2322 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
2323 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
2324 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
2325 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
2326 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
2327 case EF_SH3_NOMMU
: strcat (buf
, ", sh3-nommu"); break;
2328 case EF_SH4_NOMMU_NOFPU
: strcat (buf
, ", sh4-nommu-nofpu"); break;
2329 case EF_SH2A_SH4_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2330 case EF_SH2A_SH3_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh3-nommu"); break;
2331 case EF_SH2A_SH4
: strcat (buf
, ", sh2a-or-sh4"); break;
2332 case EF_SH2A_SH3E
: strcat (buf
, ", sh2a-or-sh3e"); break;
2333 default: strcat (buf
, ", unknown ISA"); break;
2339 if (e_flags
& EF_SPARC_32PLUS
)
2340 strcat (buf
, ", v8+");
2342 if (e_flags
& EF_SPARC_SUN_US1
)
2343 strcat (buf
, ", ultrasparcI");
2345 if (e_flags
& EF_SPARC_SUN_US3
)
2346 strcat (buf
, ", ultrasparcIII");
2348 if (e_flags
& EF_SPARC_HAL_R1
)
2349 strcat (buf
, ", halr1");
2351 if (e_flags
& EF_SPARC_LEDATA
)
2352 strcat (buf
, ", ledata");
2354 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2355 strcat (buf
, ", tso");
2357 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2358 strcat (buf
, ", pso");
2360 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2361 strcat (buf
, ", rmo");
2365 switch (e_flags
& EF_PARISC_ARCH
)
2367 case EFA_PARISC_1_0
:
2368 strcpy (buf
, ", PA-RISC 1.0");
2370 case EFA_PARISC_1_1
:
2371 strcpy (buf
, ", PA-RISC 1.1");
2373 case EFA_PARISC_2_0
:
2374 strcpy (buf
, ", PA-RISC 2.0");
2379 if (e_flags
& EF_PARISC_TRAPNIL
)
2380 strcat (buf
, ", trapnil");
2381 if (e_flags
& EF_PARISC_EXT
)
2382 strcat (buf
, ", ext");
2383 if (e_flags
& EF_PARISC_LSB
)
2384 strcat (buf
, ", lsb");
2385 if (e_flags
& EF_PARISC_WIDE
)
2386 strcat (buf
, ", wide");
2387 if (e_flags
& EF_PARISC_NO_KABP
)
2388 strcat (buf
, ", no kabp");
2389 if (e_flags
& EF_PARISC_LAZYSWAP
)
2390 strcat (buf
, ", lazyswap");
2395 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2396 strcat (buf
, ", new calling convention");
2398 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2399 strcat (buf
, ", gnu calling convention");
2403 if ((e_flags
& EF_IA_64_ABI64
))
2404 strcat (buf
, ", 64-bit");
2406 strcat (buf
, ", 32-bit");
2407 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2408 strcat (buf
, ", reduced fp model");
2409 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2410 strcat (buf
, ", no function descriptors, constant gp");
2411 else if ((e_flags
& EF_IA_64_CONS_GP
))
2412 strcat (buf
, ", constant gp");
2413 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2414 strcat (buf
, ", absolute");
2418 if ((e_flags
& EF_VAX_NONPIC
))
2419 strcat (buf
, ", non-PIC");
2420 if ((e_flags
& EF_VAX_DFLOAT
))
2421 strcat (buf
, ", D-Float");
2422 if ((e_flags
& EF_VAX_GFLOAT
))
2423 strcat (buf
, ", G-Float");
2432 get_osabi_name (unsigned int osabi
)
2434 static char buff
[32];
2438 case ELFOSABI_NONE
: return "UNIX - System V";
2439 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2440 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2441 case ELFOSABI_LINUX
: return "UNIX - Linux";
2442 case ELFOSABI_HURD
: return "GNU/Hurd";
2443 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2444 case ELFOSABI_AIX
: return "UNIX - AIX";
2445 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2446 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2447 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2448 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2449 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2450 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2451 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2452 case ELFOSABI_AROS
: return "Amiga Research OS";
2453 case ELFOSABI_STANDALONE
: return _("Standalone App");
2454 case ELFOSABI_ARM
: return "ARM";
2456 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), osabi
);
2462 get_arm_segment_type (unsigned long type
)
2476 get_mips_segment_type (unsigned long type
)
2480 case PT_MIPS_REGINFO
:
2482 case PT_MIPS_RTPROC
:
2484 case PT_MIPS_OPTIONS
:
2494 get_parisc_segment_type (unsigned long type
)
2498 case PT_HP_TLS
: return "HP_TLS";
2499 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2500 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2501 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2502 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2503 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2504 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2505 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2506 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2507 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2508 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2509 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2510 case PT_HP_OPT_ANNOT
: return "HP_OPT_ANNOT";
2511 case PT_HP_HSL_ANNOT
: return "HP_HSL_ANNOT";
2512 case PT_HP_STACK
: return "HP_STACK";
2513 case PT_HP_CORE_UTSNAME
: return "HP_CORE_UTSNAME";
2514 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2515 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2516 case PT_PARISC_WEAKORDER
: return "PARISC_WEAKORDER";
2525 get_ia64_segment_type (unsigned long type
)
2529 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2530 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2531 case PT_HP_TLS
: return "HP_TLS";
2532 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2533 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2534 case PT_IA_64_HP_STACK
: return "HP_STACK";
2543 get_segment_type (unsigned long p_type
)
2545 static char buff
[32];
2549 case PT_NULL
: return "NULL";
2550 case PT_LOAD
: return "LOAD";
2551 case PT_DYNAMIC
: return "DYNAMIC";
2552 case PT_INTERP
: return "INTERP";
2553 case PT_NOTE
: return "NOTE";
2554 case PT_SHLIB
: return "SHLIB";
2555 case PT_PHDR
: return "PHDR";
2556 case PT_TLS
: return "TLS";
2558 case PT_GNU_EH_FRAME
:
2559 return "GNU_EH_FRAME";
2560 case PT_GNU_STACK
: return "GNU_STACK";
2561 case PT_GNU_RELRO
: return "GNU_RELRO";
2564 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2568 switch (elf_header
.e_machine
)
2571 result
= get_arm_segment_type (p_type
);
2574 case EM_MIPS_RS3_LE
:
2575 result
= get_mips_segment_type (p_type
);
2578 result
= get_parisc_segment_type (p_type
);
2581 result
= get_ia64_segment_type (p_type
);
2591 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2593 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2597 switch (elf_header
.e_machine
)
2600 result
= get_parisc_segment_type (p_type
);
2603 result
= get_ia64_segment_type (p_type
);
2613 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2616 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), p_type
);
2623 get_mips_section_type_name (unsigned int sh_type
)
2627 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2628 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2629 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2630 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2631 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2632 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2633 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2634 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2635 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2636 case SHT_MIPS_RELD
: return "MIPS_RELD";
2637 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2638 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2639 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2640 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2641 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2642 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2643 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2644 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2645 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2646 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2647 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2648 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2649 case SHT_MIPS_LINE
: return "MIPS_LINE";
2650 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2651 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2652 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2653 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2654 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2655 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2656 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2657 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2658 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2659 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2660 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2661 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2662 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2663 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2664 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2665 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2673 get_parisc_section_type_name (unsigned int sh_type
)
2677 case SHT_PARISC_EXT
: return "PARISC_EXT";
2678 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2679 case SHT_PARISC_DOC
: return "PARISC_DOC";
2680 case SHT_PARISC_ANNOT
: return "PARISC_ANNOT";
2681 case SHT_PARISC_SYMEXTN
: return "PARISC_SYMEXTN";
2682 case SHT_PARISC_STUBS
: return "PARISC_STUBS";
2683 case SHT_PARISC_DLKM
: return "PARISC_DLKM";
2691 get_ia64_section_type_name (unsigned int sh_type
)
2693 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2694 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2695 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2699 case SHT_IA_64_EXT
: return "IA_64_EXT";
2700 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2701 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2702 case SHT_IA_64_VMS_TRACE
: return "VMS_TRACE";
2703 case SHT_IA_64_VMS_TIE_SIGNATURES
: return "VMS_TIE_SIGNATURES";
2704 case SHT_IA_64_VMS_DEBUG
: return "VMS_DEBUG";
2705 case SHT_IA_64_VMS_DEBUG_STR
: return "VMS_DEBUG_STR";
2706 case SHT_IA_64_VMS_LINKAGES
: return "VMS_LINKAGES";
2707 case SHT_IA_64_VMS_SYMBOL_VECTOR
: return "VMS_SYMBOL_VECTOR";
2708 case SHT_IA_64_VMS_FIXUP
: return "VMS_FIXUP";
2716 get_x86_64_section_type_name (unsigned int sh_type
)
2720 case SHT_X86_64_UNWIND
: return "X86_64_UNWIND";
2728 get_arm_section_type_name (unsigned int sh_type
)
2734 case SHT_ARM_PREEMPTMAP
:
2735 return "ARM_PREEMPTMAP";
2736 case SHT_ARM_ATTRIBUTES
:
2737 return "ARM_ATTRIBUTES";
2745 get_section_type_name (unsigned int sh_type
)
2747 static char buff
[32];
2751 case SHT_NULL
: return "NULL";
2752 case SHT_PROGBITS
: return "PROGBITS";
2753 case SHT_SYMTAB
: return "SYMTAB";
2754 case SHT_STRTAB
: return "STRTAB";
2755 case SHT_RELA
: return "RELA";
2756 case SHT_HASH
: return "HASH";
2757 case SHT_DYNAMIC
: return "DYNAMIC";
2758 case SHT_NOTE
: return "NOTE";
2759 case SHT_NOBITS
: return "NOBITS";
2760 case SHT_REL
: return "REL";
2761 case SHT_SHLIB
: return "SHLIB";
2762 case SHT_DYNSYM
: return "DYNSYM";
2763 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2764 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2765 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2766 case SHT_GNU_HASH
: return "GNU_HASH";
2767 case SHT_GROUP
: return "GROUP";
2768 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2769 case SHT_GNU_verdef
: return "VERDEF";
2770 case SHT_GNU_verneed
: return "VERNEED";
2771 case SHT_GNU_versym
: return "VERSYM";
2772 case 0x6ffffff0: return "VERSYM";
2773 case 0x6ffffffc: return "VERDEF";
2774 case 0x7ffffffd: return "AUXILIARY";
2775 case 0x7fffffff: return "FILTER";
2776 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2779 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2783 switch (elf_header
.e_machine
)
2786 case EM_MIPS_RS3_LE
:
2787 result
= get_mips_section_type_name (sh_type
);
2790 result
= get_parisc_section_type_name (sh_type
);
2793 result
= get_ia64_section_type_name (sh_type
);
2796 result
= get_x86_64_section_type_name (sh_type
);
2799 result
= get_arm_section_type_name (sh_type
);
2809 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2811 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2815 switch (elf_header
.e_machine
)
2818 result
= get_ia64_section_type_name (sh_type
);
2828 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2830 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2831 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2833 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), sh_type
);
2839 #define OPTION_DEBUG_DUMP 512
2841 static struct option options
[] =
2843 {"all", no_argument
, 0, 'a'},
2844 {"file-header", no_argument
, 0, 'h'},
2845 {"program-headers", no_argument
, 0, 'l'},
2846 {"headers", no_argument
, 0, 'e'},
2847 {"histogram", no_argument
, 0, 'I'},
2848 {"segments", no_argument
, 0, 'l'},
2849 {"sections", no_argument
, 0, 'S'},
2850 {"section-headers", no_argument
, 0, 'S'},
2851 {"section-groups", no_argument
, 0, 'g'},
2852 {"section-details", no_argument
, 0, 't'},
2853 {"full-section-name",no_argument
, 0, 'N'},
2854 {"symbols", no_argument
, 0, 's'},
2855 {"syms", no_argument
, 0, 's'},
2856 {"relocs", no_argument
, 0, 'r'},
2857 {"notes", no_argument
, 0, 'n'},
2858 {"dynamic", no_argument
, 0, 'd'},
2859 {"arch-specific", no_argument
, 0, 'A'},
2860 {"version-info", no_argument
, 0, 'V'},
2861 {"use-dynamic", no_argument
, 0, 'D'},
2862 {"unwind", no_argument
, 0, 'u'},
2863 {"archive-index", no_argument
, 0, 'c'},
2864 {"hex-dump", required_argument
, 0, 'x'},
2865 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2866 {"string-dump", required_argument
, 0, 'p'},
2867 #ifdef SUPPORT_DISASSEMBLY
2868 {"instruction-dump", required_argument
, 0, 'i'},
2871 {"version", no_argument
, 0, 'v'},
2872 {"wide", no_argument
, 0, 'W'},
2873 {"help", no_argument
, 0, 'H'},
2874 {0, no_argument
, 0, 0}
2878 usage (FILE *stream
)
2880 fprintf (stream
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2881 fprintf (stream
, _(" Display information about the contents of ELF format files\n"));
2882 fprintf (stream
, _(" Options are:\n\
2883 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2884 -h --file-header Display the ELF file header\n\
2885 -l --program-headers Display the program headers\n\
2886 --segments An alias for --program-headers\n\
2887 -S --section-headers Display the sections' header\n\
2888 --sections An alias for --section-headers\n\
2889 -g --section-groups Display the section groups\n\
2890 -t --section-details Display the section details\n\
2891 -e --headers Equivalent to: -h -l -S\n\
2892 -s --syms Display the symbol table\n\
2893 --symbols An alias for --syms\n\
2894 -n --notes Display the core notes (if present)\n\
2895 -r --relocs Display the relocations (if present)\n\
2896 -u --unwind Display the unwind info (if present)\n\
2897 -d --dynamic Display the dynamic section (if present)\n\
2898 -V --version-info Display the version sections (if present)\n\
2899 -A --arch-specific Display architecture specific information (if any).\n\
2900 -c --archive-index Display the symbol/file index in an archive\n\
2901 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2902 -x --hex-dump=<number|name>\n\
2903 Dump the contents of section <number|name> as bytes\n\
2904 -p --string-dump=<number|name>\n\
2905 Dump the contents of section <number|name> as strings\n\
2906 -w[liaprmfFsoR] or\n\
2907 --debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]\n\
2908 Display the contents of DWARF2 debug sections\n"));
2909 #ifdef SUPPORT_DISASSEMBLY
2910 fprintf (stream
, _("\
2911 -i --instruction-dump=<number|name>\n\
2912 Disassemble the contents of section <number|name>\n"));
2914 fprintf (stream
, _("\
2915 -I --histogram Display histogram of bucket list lengths\n\
2916 -W --wide Allow output width to exceed 80 characters\n\
2917 @<file> Read options from <file>\n\
2918 -H --help Display this information\n\
2919 -v --version Display the version number of readelf\n"));
2921 if (REPORT_BUGS_TO
[0] && stream
== stdout
)
2922 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2924 exit (stream
== stdout
? 0 : 1);
2927 /* Record the fact that the user wants the contents of section number
2928 SECTION to be displayed using the method(s) encoded as flags bits
2929 in TYPE. Note, TYPE can be zero if we are creating the array for
2933 request_dump_bynumber (unsigned int section
, dump_type type
)
2935 if (section
>= num_dump_sects
)
2937 dump_type
*new_dump_sects
;
2939 new_dump_sects
= calloc (section
+ 1, sizeof (* dump_sects
));
2941 if (new_dump_sects
== NULL
)
2942 error (_("Out of memory allocating dump request table.\n"));
2945 /* Copy current flag settings. */
2946 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
* sizeof (* dump_sects
));
2950 dump_sects
= new_dump_sects
;
2951 num_dump_sects
= section
+ 1;
2956 dump_sects
[section
] |= type
;
2961 /* Request a dump by section name. */
2964 request_dump_byname (const char *section
, dump_type type
)
2966 struct dump_list_entry
*new_request
;
2968 new_request
= malloc (sizeof (struct dump_list_entry
));
2970 error (_("Out of memory allocating dump request table.\n"));
2972 new_request
->name
= strdup (section
);
2973 if (!new_request
->name
)
2974 error (_("Out of memory allocating dump request table.\n"));
2976 new_request
->type
= type
;
2978 new_request
->next
= dump_sects_byname
;
2979 dump_sects_byname
= new_request
;
2983 parse_args (int argc
, char **argv
)
2990 while ((c
= getopt_long
2991 (argc
, argv
, "ADHINSVWacdeghi:lnp:rstuvw::x:", options
, NULL
)) != EOF
)
3012 do_section_groups
++;
3020 do_section_groups
++;
3025 do_section_details
++;
3070 section
= strtoul (optarg
, & cp
, 0);
3071 if (! *cp
&& section
>= 0)
3072 request_dump_bynumber (section
, HEX_DUMP
);
3074 request_dump_byname (optarg
, HEX_DUMP
);
3078 section
= strtoul (optarg
, & cp
, 0);
3079 if (! *cp
&& section
>= 0)
3080 request_dump_bynumber (section
, STRING_DUMP
);
3082 request_dump_byname (optarg
, STRING_DUMP
);
3090 unsigned int index
= 0;
3094 while (optarg
[index
])
3095 switch (optarg
[index
++])
3102 do_debug_abbrevs
= 1;
3110 do_debug_pubnames
= 1;
3114 do_debug_aranges
= 1;
3118 do_debug_ranges
= 1;
3122 do_debug_frames_interp
= 1;
3124 do_debug_frames
= 1;
3128 do_debug_macinfo
= 1;
3140 warn (_("Unrecognized debug option '%s'\n"), optarg
);
3145 case OPTION_DEBUG_DUMP
:
3153 const char * option
;
3156 debug_dump_long_opts
;
3158 debug_dump_long_opts opts_table
[] =
3160 /* Please keep this table alpha- sorted. */
3161 { "Ranges", & do_debug_ranges
},
3162 { "abbrev", & do_debug_abbrevs
},
3163 { "aranges", & do_debug_aranges
},
3164 { "frames", & do_debug_frames
},
3165 { "frames-interp", & do_debug_frames_interp
},
3166 { "info", & do_debug_info
},
3167 { "line", & do_debug_lines
},
3168 { "loc", & do_debug_loc
},
3169 { "macro", & do_debug_macinfo
},
3170 { "pubnames", & do_debug_pubnames
},
3171 /* This entry is for compatability
3172 with earlier versions of readelf. */
3173 { "ranges", & do_debug_aranges
},
3174 { "str", & do_debug_str
},
3185 debug_dump_long_opts
* entry
;
3187 for (entry
= opts_table
; entry
->option
; entry
++)
3189 size_t len
= strlen (entry
->option
);
3191 if (strneq (p
, entry
->option
, len
)
3192 && (p
[len
] == ',' || p
[len
] == '\0'))
3194 * entry
->variable
= 1;
3196 /* The --debug-dump=frames-interp option also
3197 enables the --debug-dump=frames option. */
3198 if (do_debug_frames_interp
)
3199 do_debug_frames
= 1;
3206 if (entry
->option
== NULL
)
3208 warn (_("Unrecognized debug option '%s'\n"), p
);
3209 p
= strchr (p
, ',');
3219 #ifdef SUPPORT_DISASSEMBLY
3222 section
= strtoul (optarg
, & cp
, 0);
3223 if (! *cp
&& section
>= 0)
3224 request_dump_bynumber (section
, DISASS_DUMP
);
3226 request_dump_byname (optarg
, DISASS_DUMP
);
3229 print_version (program_name
);
3238 /* xgettext:c-format */
3239 error (_("Invalid option '-%c'\n"), c
);
3246 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
3247 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
3248 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
3249 && !do_section_groups
&& !do_archive_index
)
3253 warn (_("Nothing to do.\n"));
3259 get_elf_class (unsigned int elf_class
)
3261 static char buff
[32];
3265 case ELFCLASSNONE
: return _("none");
3266 case ELFCLASS32
: return "ELF32";
3267 case ELFCLASS64
: return "ELF64";
3269 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), elf_class
);
3275 get_data_encoding (unsigned int encoding
)
3277 static char buff
[32];
3281 case ELFDATANONE
: return _("none");
3282 case ELFDATA2LSB
: return _("2's complement, little endian");
3283 case ELFDATA2MSB
: return _("2's complement, big endian");
3285 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), encoding
);
3290 /* Decode the data held in 'elf_header'. */
3293 process_file_header (void)
3295 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
3296 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
3297 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
3298 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
3301 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3305 init_dwarf_regnames (elf_header
.e_machine
);
3311 printf (_("ELF Header:\n"));
3312 printf (_(" Magic: "));
3313 for (i
= 0; i
< EI_NIDENT
; i
++)
3314 printf ("%2.2x ", elf_header
.e_ident
[i
]);
3316 printf (_(" Class: %s\n"),
3317 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
3318 printf (_(" Data: %s\n"),
3319 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
3320 printf (_(" Version: %d %s\n"),
3321 elf_header
.e_ident
[EI_VERSION
],
3322 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
3324 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
3327 printf (_(" OS/ABI: %s\n"),
3328 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
3329 printf (_(" ABI Version: %d\n"),
3330 elf_header
.e_ident
[EI_ABIVERSION
]);
3331 printf (_(" Type: %s\n"),
3332 get_file_type (elf_header
.e_type
));
3333 printf (_(" Machine: %s\n"),
3334 get_machine_name (elf_header
.e_machine
));
3335 printf (_(" Version: 0x%lx\n"),
3336 (unsigned long) elf_header
.e_version
);
3338 printf (_(" Entry point address: "));
3339 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3340 printf (_("\n Start of program headers: "));
3341 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3342 printf (_(" (bytes into file)\n Start of section headers: "));
3343 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
3344 printf (_(" (bytes into file)\n"));
3346 printf (_(" Flags: 0x%lx%s\n"),
3347 (unsigned long) elf_header
.e_flags
,
3348 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
3349 printf (_(" Size of this header: %ld (bytes)\n"),
3350 (long) elf_header
.e_ehsize
);
3351 printf (_(" Size of program headers: %ld (bytes)\n"),
3352 (long) elf_header
.e_phentsize
);
3353 printf (_(" Number of program headers: %ld\n"),
3354 (long) elf_header
.e_phnum
);
3355 printf (_(" Size of section headers: %ld (bytes)\n"),
3356 (long) elf_header
.e_shentsize
);
3357 printf (_(" Number of section headers: %ld"),
3358 (long) elf_header
.e_shnum
);
3359 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
3360 printf (" (%ld)", (long) section_headers
[0].sh_size
);
3361 putc ('\n', stdout
);
3362 printf (_(" Section header string table index: %ld"),
3363 (long) elf_header
.e_shstrndx
);
3364 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
3365 printf (" (%ld)", (long) section_headers
[0].sh_link
);
3366 else if (elf_header
.e_shstrndx
!= SHN_UNDEF
3367 && (elf_header
.e_shstrndx
>= elf_header
.e_shnum
3368 || (elf_header
.e_shstrndx
>= SHN_LORESERVE
3369 && elf_header
.e_shstrndx
<= SHN_HIRESERVE
)))
3370 printf (" <corrupt: out of range>");
3371 putc ('\n', stdout
);
3374 if (section_headers
!= NULL
)
3376 if (elf_header
.e_shnum
== 0)
3377 elf_header
.e_shnum
= section_headers
[0].sh_size
;
3378 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
3379 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
3380 else if (elf_header
.e_shstrndx
!= SHN_UNDEF
3381 && (elf_header
.e_shstrndx
>= elf_header
.e_shnum
3382 || (elf_header
.e_shstrndx
>= SHN_LORESERVE
3383 && elf_header
.e_shstrndx
<= SHN_HIRESERVE
)))
3384 elf_header
.e_shstrndx
= SHN_UNDEF
;
3385 free (section_headers
);
3386 section_headers
= NULL
;
3394 get_32bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3396 Elf32_External_Phdr
*phdrs
;
3397 Elf32_External_Phdr
*external
;
3398 Elf_Internal_Phdr
*internal
;
3401 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3402 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3403 _("program headers"));
3407 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3408 i
< elf_header
.e_phnum
;
3409 i
++, internal
++, external
++)
3411 internal
->p_type
= BYTE_GET (external
->p_type
);
3412 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3413 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3414 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3415 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3416 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3417 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3418 internal
->p_align
= BYTE_GET (external
->p_align
);
3427 get_64bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3429 Elf64_External_Phdr
*phdrs
;
3430 Elf64_External_Phdr
*external
;
3431 Elf_Internal_Phdr
*internal
;
3434 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3435 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3436 _("program headers"));
3440 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3441 i
< elf_header
.e_phnum
;
3442 i
++, internal
++, external
++)
3444 internal
->p_type
= BYTE_GET (external
->p_type
);
3445 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3446 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3447 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3448 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3449 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3450 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3451 internal
->p_align
= BYTE_GET (external
->p_align
);
3459 /* Returns 1 if the program headers were read into `program_headers'. */
3462 get_program_headers (FILE *file
)
3464 Elf_Internal_Phdr
*phdrs
;
3466 /* Check cache of prior read. */
3467 if (program_headers
!= NULL
)
3470 phdrs
= cmalloc (elf_header
.e_phnum
, sizeof (Elf_Internal_Phdr
));
3474 error (_("Out of memory\n"));
3479 ? get_32bit_program_headers (file
, phdrs
)
3480 : get_64bit_program_headers (file
, phdrs
))
3482 program_headers
= phdrs
;
3490 /* Returns 1 if the program headers were loaded. */
3493 process_program_headers (FILE *file
)
3495 Elf_Internal_Phdr
*segment
;
3498 if (elf_header
.e_phnum
== 0)
3501 printf (_("\nThere are no program headers in this file.\n"));
3505 if (do_segments
&& !do_header
)
3507 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3508 printf (_("Entry point "));
3509 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3510 printf (_("\nThere are %d program headers, starting at offset "),
3511 elf_header
.e_phnum
);
3512 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3516 if (! get_program_headers (file
))
3521 if (elf_header
.e_phnum
> 1)
3522 printf (_("\nProgram Headers:\n"));
3524 printf (_("\nProgram Headers:\n"));
3528 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3531 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3535 (_(" Type Offset VirtAddr PhysAddr\n"));
3537 (_(" FileSiz MemSiz Flags Align\n"));
3544 for (i
= 0, segment
= program_headers
;
3545 i
< elf_header
.e_phnum
;
3550 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3554 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3555 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3556 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3557 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3558 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3560 (segment
->p_flags
& PF_R
? 'R' : ' '),
3561 (segment
->p_flags
& PF_W
? 'W' : ' '),
3562 (segment
->p_flags
& PF_X
? 'E' : ' '));
3563 printf ("%#lx", (unsigned long) segment
->p_align
);
3567 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3568 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3571 print_vma (segment
->p_offset
, FULL_HEX
);
3575 print_vma (segment
->p_vaddr
, FULL_HEX
);
3577 print_vma (segment
->p_paddr
, FULL_HEX
);
3580 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3581 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3584 print_vma (segment
->p_filesz
, FULL_HEX
);
3588 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3589 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3592 print_vma (segment
->p_offset
, FULL_HEX
);
3596 (segment
->p_flags
& PF_R
? 'R' : ' '),
3597 (segment
->p_flags
& PF_W
? 'W' : ' '),
3598 (segment
->p_flags
& PF_X
? 'E' : ' '));
3600 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3601 printf ("%#lx", (unsigned long) segment
->p_align
);
3604 print_vma (segment
->p_align
, PREFIX_HEX
);
3609 print_vma (segment
->p_offset
, FULL_HEX
);
3611 print_vma (segment
->p_vaddr
, FULL_HEX
);
3613 print_vma (segment
->p_paddr
, FULL_HEX
);
3615 print_vma (segment
->p_filesz
, FULL_HEX
);
3617 print_vma (segment
->p_memsz
, FULL_HEX
);
3619 (segment
->p_flags
& PF_R
? 'R' : ' '),
3620 (segment
->p_flags
& PF_W
? 'W' : ' '),
3621 (segment
->p_flags
& PF_X
? 'E' : ' '));
3622 print_vma (segment
->p_align
, HEX
);
3626 switch (segment
->p_type
)
3630 error (_("more than one dynamic segment\n"));
3632 /* By default, assume that the .dynamic section is the first
3633 section in the DYNAMIC segment. */
3634 dynamic_addr
= segment
->p_offset
;
3635 dynamic_size
= segment
->p_filesz
;
3637 /* Try to locate the .dynamic section. If there is
3638 a section header table, we can easily locate it. */
3639 if (section_headers
!= NULL
)
3641 Elf_Internal_Shdr
*sec
;
3643 sec
= find_section (".dynamic");
3644 if (sec
== NULL
|| sec
->sh_size
== 0)
3646 error (_("no .dynamic section in the dynamic segment\n"));
3650 if (sec
->sh_type
== SHT_NOBITS
)
3656 dynamic_addr
= sec
->sh_offset
;
3657 dynamic_size
= sec
->sh_size
;
3659 if (dynamic_addr
< segment
->p_offset
3660 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
3661 warn (_("the .dynamic section is not contained"
3662 " within the dynamic segment\n"));
3663 else if (dynamic_addr
> segment
->p_offset
)
3664 warn (_("the .dynamic section is not the first section"
3665 " in the dynamic segment.\n"));
3670 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3672 error (_("Unable to find program interpreter name\n"));
3676 int ret
= snprintf (fmt
, sizeof (fmt
), "%%%ds", PATH_MAX
);
3678 if (ret
>= (int) sizeof (fmt
) || ret
< 0)
3679 error (_("Internal error: failed to create format string to display program interpreter\n"));
3681 program_interpreter
[0] = 0;
3682 if (fscanf (file
, fmt
, program_interpreter
) <= 0)
3683 error (_("Unable to read program interpreter name\n"));
3686 printf (_("\n [Requesting program interpreter: %s]"),
3687 program_interpreter
);
3693 putc ('\n', stdout
);
3696 if (do_segments
&& section_headers
!= NULL
&& string_table
!= NULL
)
3698 printf (_("\n Section to Segment mapping:\n"));
3699 printf (_(" Segment Sections...\n"));
3701 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3704 Elf_Internal_Shdr
*section
;
3706 segment
= program_headers
+ i
;
3707 section
= section_headers
;
3709 printf (" %2.2d ", i
);
3711 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3713 if (ELF_IS_SECTION_IN_SEGMENT_MEMORY(section
, segment
))
3714 printf ("%s ", SECTION_NAME (section
));
3725 /* Find the file offset corresponding to VMA by using the program headers. */
3728 offset_from_vma (FILE *file
, bfd_vma vma
, bfd_size_type size
)
3730 Elf_Internal_Phdr
*seg
;
3732 if (! get_program_headers (file
))
3734 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3738 for (seg
= program_headers
;
3739 seg
< program_headers
+ elf_header
.e_phnum
;
3742 if (seg
->p_type
!= PT_LOAD
)
3745 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3746 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3747 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3750 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3757 get_32bit_section_headers (FILE *file
, unsigned int num
)
3759 Elf32_External_Shdr
*shdrs
;
3760 Elf_Internal_Shdr
*internal
;
3763 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3764 elf_header
.e_shentsize
, num
, _("section headers"));
3768 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3770 if (section_headers
== NULL
)
3772 error (_("Out of memory\n"));
3776 for (i
= 0, internal
= section_headers
;
3780 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3781 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3782 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3783 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3784 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3785 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3786 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3787 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3788 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3789 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3798 get_64bit_section_headers (FILE *file
, unsigned int num
)
3800 Elf64_External_Shdr
*shdrs
;
3801 Elf_Internal_Shdr
*internal
;
3804 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3805 elf_header
.e_shentsize
, num
, _("section headers"));
3809 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3811 if (section_headers
== NULL
)
3813 error (_("Out of memory\n"));
3817 for (i
= 0, internal
= section_headers
;
3821 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3822 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3823 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3824 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3825 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3826 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3827 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3828 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3829 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3830 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3838 static Elf_Internal_Sym
*
3839 get_32bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3841 unsigned long number
;
3842 Elf32_External_Sym
*esyms
;
3843 Elf_External_Sym_Shndx
*shndx
;
3844 Elf_Internal_Sym
*isyms
;
3845 Elf_Internal_Sym
*psym
;
3848 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3854 if (symtab_shndx_hdr
!= NULL
3855 && (symtab_shndx_hdr
->sh_link
3856 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3858 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3859 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3867 number
= section
->sh_size
/ section
->sh_entsize
;
3868 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3872 error (_("Out of memory\n"));
3879 for (j
= 0, psym
= isyms
;
3883 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3884 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3885 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3886 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3887 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3889 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3890 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3891 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3901 static Elf_Internal_Sym
*
3902 get_64bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3904 unsigned long number
;
3905 Elf64_External_Sym
*esyms
;
3906 Elf_External_Sym_Shndx
*shndx
;
3907 Elf_Internal_Sym
*isyms
;
3908 Elf_Internal_Sym
*psym
;
3911 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3917 if (symtab_shndx_hdr
!= NULL
3918 && (symtab_shndx_hdr
->sh_link
3919 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3921 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3922 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3930 number
= section
->sh_size
/ section
->sh_entsize
;
3931 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3935 error (_("Out of memory\n"));
3942 for (j
= 0, psym
= isyms
;
3946 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3947 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3948 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3949 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3950 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3952 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3953 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3954 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3965 get_elf_section_flags (bfd_vma sh_flags
)
3967 static char buff
[1024];
3969 int field_size
= is_32bit_elf
? 8 : 16;
3970 int index
, size
= sizeof (buff
) - (field_size
+ 4 + 1);
3971 bfd_vma os_flags
= 0;
3972 bfd_vma proc_flags
= 0;
3973 bfd_vma unknown_flags
= 0;
3987 { "LINK ORDER", 10 },
3988 { "OS NONCONF", 10 },
3991 /* IA-64 specific. */
3994 /* IA-64 OpenVMS specific. */
3995 { "VMS_GLOBAL", 10 },
3996 { "VMS_OVERLAID", 12 },
3997 { "VMS_SHARED", 10 },
3998 { "VMS_VECTOR", 10 },
3999 { "VMS_ALLOC_64BIT", 15 },
4000 { "VMS_PROTECTED", 13}
4003 if (do_section_details
)
4005 sprintf (buff
, "[%*.*lx]: ",
4006 field_size
, field_size
, (unsigned long) sh_flags
);
4007 p
+= field_size
+ 4;
4014 flag
= sh_flags
& - sh_flags
;
4017 if (do_section_details
)
4021 case SHF_WRITE
: index
= 0; break;
4022 case SHF_ALLOC
: index
= 1; break;
4023 case SHF_EXECINSTR
: index
= 2; break;
4024 case SHF_MERGE
: index
= 3; break;
4025 case SHF_STRINGS
: index
= 4; break;
4026 case SHF_INFO_LINK
: index
= 5; break;
4027 case SHF_LINK_ORDER
: index
= 6; break;
4028 case SHF_OS_NONCONFORMING
: index
= 7; break;
4029 case SHF_GROUP
: index
= 8; break;
4030 case SHF_TLS
: index
= 9; break;
4034 if (elf_header
.e_machine
== EM_IA_64
)
4036 if (flag
== SHF_IA_64_SHORT
)
4038 else if (flag
== SHF_IA_64_NORECOV
)
4041 else if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_OPENVMS
)
4044 case SHF_IA_64_VMS_GLOBAL
: index
= 12; break;
4045 case SHF_IA_64_VMS_OVERLAID
: index
= 13; break;
4046 case SHF_IA_64_VMS_SHARED
: index
= 14; break;
4047 case SHF_IA_64_VMS_VECTOR
: index
= 15; break;
4048 case SHF_IA_64_VMS_ALLOC_64BIT
: index
= 16; break;
4049 case SHF_IA_64_VMS_PROTECTED
: index
= 17; break;
4059 if (p
!= buff
+ field_size
+ 4)
4061 if (size
< (10 + 2))
4068 size
-= flags
[index
].len
;
4069 p
= stpcpy (p
, flags
[index
].str
);
4071 else if (flag
& SHF_MASKOS
)
4073 else if (flag
& SHF_MASKPROC
)
4076 unknown_flags
|= flag
;
4082 case SHF_WRITE
: *p
= 'W'; break;
4083 case SHF_ALLOC
: *p
= 'A'; break;
4084 case SHF_EXECINSTR
: *p
= 'X'; break;
4085 case SHF_MERGE
: *p
= 'M'; break;
4086 case SHF_STRINGS
: *p
= 'S'; break;
4087 case SHF_INFO_LINK
: *p
= 'I'; break;
4088 case SHF_LINK_ORDER
: *p
= 'L'; break;
4089 case SHF_OS_NONCONFORMING
: *p
= 'O'; break;
4090 case SHF_GROUP
: *p
= 'G'; break;
4091 case SHF_TLS
: *p
= 'T'; break;
4094 if (elf_header
.e_machine
== EM_X86_64
4095 && flag
== SHF_X86_64_LARGE
)
4097 else if (flag
& SHF_MASKOS
)
4100 sh_flags
&= ~ SHF_MASKOS
;
4102 else if (flag
& SHF_MASKPROC
)
4105 sh_flags
&= ~ SHF_MASKPROC
;
4115 if (do_section_details
)
4119 size
-= 5 + field_size
;
4120 if (p
!= buff
+ field_size
+ 4)
4128 sprintf (p
, "OS (%*.*lx)", field_size
, field_size
,
4129 (unsigned long) os_flags
);
4130 p
+= 5 + field_size
;
4134 size
-= 7 + field_size
;
4135 if (p
!= buff
+ field_size
+ 4)
4143 sprintf (p
, "PROC (%*.*lx)", field_size
, field_size
,
4144 (unsigned long) proc_flags
);
4145 p
+= 7 + field_size
;
4149 size
-= 10 + field_size
;
4150 if (p
!= buff
+ field_size
+ 4)
4158 sprintf (p
, "UNKNOWN (%*.*lx)", field_size
, field_size
,
4159 (unsigned long) unknown_flags
);
4160 p
+= 10 + field_size
;
4169 process_section_headers (FILE *file
)
4171 Elf_Internal_Shdr
*section
;
4174 section_headers
= NULL
;
4176 if (elf_header
.e_shnum
== 0)
4179 printf (_("\nThere are no sections in this file.\n"));
4184 if (do_sections
&& !do_header
)
4185 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
4186 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
4190 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
4193 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
4196 /* Read in the string table, so that we have names to display. */
4197 if (elf_header
.e_shstrndx
!= SHN_UNDEF
4198 && SECTION_HEADER_INDEX (elf_header
.e_shstrndx
) < elf_header
.e_shnum
)
4200 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
4202 if (section
->sh_size
!= 0)
4204 string_table
= get_data (NULL
, file
, section
->sh_offset
,
4205 1, section
->sh_size
, _("string table"));
4207 string_table_length
= string_table
!= NULL
? section
->sh_size
: 0;
4211 /* Scan the sections for the dynamic symbol table
4212 and dynamic string table and debug sections. */
4213 dynamic_symbols
= NULL
;
4214 dynamic_strings
= NULL
;
4215 dynamic_syminfo
= NULL
;
4216 symtab_shndx_hdr
= NULL
;
4218 eh_addr_size
= is_32bit_elf
? 4 : 8;
4219 switch (elf_header
.e_machine
)
4222 case EM_MIPS_RS3_LE
:
4223 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
4224 FDE addresses. However, the ABI also has a semi-official ILP32
4225 variant for which the normal FDE address size rules apply.
4227 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
4228 section, where XX is the size of longs in bits. Unfortunately,
4229 earlier compilers provided no way of distinguishing ILP32 objects
4230 from LP64 objects, so if there's any doubt, we should assume that
4231 the official LP64 form is being used. */
4232 if ((elf_header
.e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
4233 && find_section (".gcc_compiled_long32") == NULL
)
4239 switch (elf_header
.e_flags
& EF_H8_MACH
)
4241 case E_H8_MACH_H8300
:
4242 case E_H8_MACH_H8300HN
:
4243 case E_H8_MACH_H8300SN
:
4244 case E_H8_MACH_H8300SXN
:
4247 case E_H8_MACH_H8300H
:
4248 case E_H8_MACH_H8300S
:
4249 case E_H8_MACH_H8300SX
:
4256 switch (elf_header
.e_flags
& EF_M32C_CPU_MASK
)
4258 case EF_M32C_CPU_M16C
:
4265 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
4268 size_t expected_entsize \
4269 = is_32bit_elf ? size32 : size64; \
4270 if (section->sh_entsize != expected_entsize) \
4271 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
4272 i, (unsigned long int) section->sh_entsize, \
4273 (unsigned long int) expected_entsize); \
4274 section->sh_entsize = expected_entsize; \
4277 #define CHECK_ENTSIZE(section, i, type) \
4278 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
4279 sizeof (Elf64_External_##type))
4281 for (i
= 0, section
= section_headers
;
4282 i
< elf_header
.e_shnum
;
4285 char *name
= SECTION_NAME (section
);
4287 if (section
->sh_type
== SHT_DYNSYM
)
4289 if (dynamic_symbols
!= NULL
)
4291 error (_("File contains multiple dynamic symbol tables\n"));
4295 CHECK_ENTSIZE (section
, i
, Sym
);
4296 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
4297 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
4299 else if (section
->sh_type
== SHT_STRTAB
4300 && streq (name
, ".dynstr"))
4302 if (dynamic_strings
!= NULL
)
4304 error (_("File contains multiple dynamic string tables\n"));
4308 dynamic_strings
= get_data (NULL
, file
, section
->sh_offset
,
4309 1, section
->sh_size
, _("dynamic strings"));
4310 dynamic_strings_length
= section
->sh_size
;
4312 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
4314 if (symtab_shndx_hdr
!= NULL
)
4316 error (_("File contains multiple symtab shndx tables\n"));
4319 symtab_shndx_hdr
= section
;
4321 else if (section
->sh_type
== SHT_SYMTAB
)
4322 CHECK_ENTSIZE (section
, i
, Sym
);
4323 else if (section
->sh_type
== SHT_GROUP
)
4324 CHECK_ENTSIZE_VALUES (section
, i
, GRP_ENTRY_SIZE
, GRP_ENTRY_SIZE
);
4325 else if (section
->sh_type
== SHT_REL
)
4326 CHECK_ENTSIZE (section
, i
, Rel
);
4327 else if (section
->sh_type
== SHT_RELA
)
4328 CHECK_ENTSIZE (section
, i
, Rela
);
4329 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
4330 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
4331 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
4332 || do_debug_loc
|| do_debug_ranges
)
4333 && const_strneq (name
, ".debug_"))
4338 || (do_debug_info
&& streq (name
, "info"))
4339 || (do_debug_abbrevs
&& streq (name
, "abbrev"))
4340 || (do_debug_lines
&& streq (name
, "line"))
4341 || (do_debug_pubnames
&& streq (name
, "pubnames"))
4342 || (do_debug_aranges
&& streq (name
, "aranges"))
4343 || (do_debug_ranges
&& streq (name
, "ranges"))
4344 || (do_debug_frames
&& streq (name
, "frame"))
4345 || (do_debug_macinfo
&& streq (name
, "macinfo"))
4346 || (do_debug_str
&& streq (name
, "str"))
4347 || (do_debug_loc
&& streq (name
, "loc"))
4349 request_dump_bynumber (i
, DEBUG_DUMP
);
4351 /* linkonce section to be combined with .debug_info at link time. */
4352 else if ((do_debugging
|| do_debug_info
)
4353 && const_strneq (name
, ".gnu.linkonce.wi."))
4354 request_dump_bynumber (i
, DEBUG_DUMP
);
4355 else if (do_debug_frames
&& streq (name
, ".eh_frame"))
4356 request_dump_bynumber (i
, DEBUG_DUMP
);
4362 if (elf_header
.e_shnum
> 1)
4363 printf (_("\nSection Headers:\n"));
4365 printf (_("\nSection Header:\n"));
4369 if (do_section_details
)
4371 printf (_(" [Nr] Name\n"));
4372 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
4376 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4380 if (do_section_details
)
4382 printf (_(" [Nr] Name\n"));
4383 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
4387 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4391 if (do_section_details
)
4393 printf (_(" [Nr] Name\n"));
4394 printf (_(" Type Address Offset Link\n"));
4395 printf (_(" Size EntSize Info Align\n"));
4399 printf (_(" [Nr] Name Type Address Offset\n"));
4400 printf (_(" Size EntSize Flags Link Info Align\n"));
4404 if (do_section_details
)
4405 printf (_(" Flags\n"));
4407 for (i
= 0, section
= section_headers
;
4408 i
< elf_header
.e_shnum
;
4411 if (do_section_details
)
4413 printf (" [%2u] %s\n",
4414 SECTION_HEADER_NUM (i
),
4415 SECTION_NAME (section
));
4416 if (is_32bit_elf
|| do_wide
)
4417 printf (" %-15.15s ",
4418 get_section_type_name (section
->sh_type
));
4421 printf (" [%2u] %-17.17s %-15.15s ",
4422 SECTION_HEADER_NUM (i
),
4423 SECTION_NAME (section
),
4424 get_section_type_name (section
->sh_type
));
4428 print_vma (section
->sh_addr
, LONG_HEX
);
4430 printf ( " %6.6lx %6.6lx %2.2lx",
4431 (unsigned long) section
->sh_offset
,
4432 (unsigned long) section
->sh_size
,
4433 (unsigned long) section
->sh_entsize
);
4435 if (do_section_details
)
4436 fputs (" ", stdout
);
4438 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4440 printf ("%2ld %3lu %2ld\n",
4441 (unsigned long) section
->sh_link
,
4442 (unsigned long) section
->sh_info
,
4443 (unsigned long) section
->sh_addralign
);
4447 print_vma (section
->sh_addr
, LONG_HEX
);
4449 if ((long) section
->sh_offset
== section
->sh_offset
)
4450 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
4454 print_vma (section
->sh_offset
, LONG_HEX
);
4457 if ((unsigned long) section
->sh_size
== section
->sh_size
)
4458 printf (" %6.6lx", (unsigned long) section
->sh_size
);
4462 print_vma (section
->sh_size
, LONG_HEX
);
4465 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
4466 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
4470 print_vma (section
->sh_entsize
, LONG_HEX
);
4473 if (do_section_details
)
4474 fputs (" ", stdout
);
4476 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4478 printf ("%2ld %3lu ",
4479 (unsigned long) section
->sh_link
,
4480 (unsigned long) section
->sh_info
);
4482 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
4483 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
4486 print_vma (section
->sh_addralign
, DEC
);
4490 else if (do_section_details
)
4492 printf (" %-15.15s ",
4493 get_section_type_name (section
->sh_type
));
4494 print_vma (section
->sh_addr
, LONG_HEX
);
4495 if ((long) section
->sh_offset
== section
->sh_offset
)
4496 printf (" %16.16lx", (unsigned long) section
->sh_offset
);
4500 print_vma (section
->sh_offset
, LONG_HEX
);
4502 printf (" %ld\n ", (unsigned long) section
->sh_link
);
4503 print_vma (section
->sh_size
, LONG_HEX
);
4505 print_vma (section
->sh_entsize
, LONG_HEX
);
4507 printf (" %-16lu %ld\n",
4508 (unsigned long) section
->sh_info
,
4509 (unsigned long) section
->sh_addralign
);
4514 print_vma (section
->sh_addr
, LONG_HEX
);
4515 if ((long) section
->sh_offset
== section
->sh_offset
)
4516 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
4520 print_vma (section
->sh_offset
, LONG_HEX
);
4523 print_vma (section
->sh_size
, LONG_HEX
);
4525 print_vma (section
->sh_entsize
, LONG_HEX
);
4527 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4529 printf (" %2ld %3lu %ld\n",
4530 (unsigned long) section
->sh_link
,
4531 (unsigned long) section
->sh_info
,
4532 (unsigned long) section
->sh_addralign
);
4535 if (do_section_details
)
4536 printf (" %s\n", get_elf_section_flags (section
->sh_flags
));
4539 if (!do_section_details
)
4540 printf (_("Key to Flags:\n\
4541 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4542 I (info), L (link order), G (group), x (unknown)\n\
4543 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4549 get_group_flags (unsigned int flags
)
4551 static char buff
[32];
4558 snprintf (buff
, sizeof (buff
), _("[<unknown>: 0x%x]"), flags
);
4565 process_section_groups (FILE *file
)
4567 Elf_Internal_Shdr
*section
;
4569 struct group
*group
;
4570 Elf_Internal_Shdr
*symtab_sec
, *strtab_sec
;
4571 Elf_Internal_Sym
*symtab
;
4575 /* Don't process section groups unless needed. */
4576 if (!do_unwind
&& !do_section_groups
)
4579 if (elf_header
.e_shnum
== 0)
4581 if (do_section_groups
)
4582 printf (_("\nThere are no sections in this file.\n"));
4587 if (section_headers
== NULL
)
4589 error (_("Section headers are not available!\n"));
4593 section_headers_groups
= calloc (elf_header
.e_shnum
,
4594 sizeof (struct group
*));
4596 if (section_headers_groups
== NULL
)
4598 error (_("Out of memory\n"));
4602 /* Scan the sections for the group section. */
4604 for (i
= 0, section
= section_headers
;
4605 i
< elf_header
.e_shnum
;
4607 if (section
->sh_type
== SHT_GROUP
)
4610 if (group_count
== 0)
4612 if (do_section_groups
)
4613 printf (_("\nThere are no section groups in this file.\n"));
4618 section_groups
= calloc (group_count
, sizeof (struct group
));
4620 if (section_groups
== NULL
)
4622 error (_("Out of memory\n"));
4631 for (i
= 0, section
= section_headers
, group
= section_groups
;
4632 i
< elf_header
.e_shnum
;
4635 if (section
->sh_type
== SHT_GROUP
)
4637 char *name
= SECTION_NAME (section
);
4639 unsigned char *start
, *indices
;
4640 unsigned int entry
, j
, size
;
4641 Elf_Internal_Shdr
*sec
;
4642 Elf_Internal_Sym
*sym
;
4644 /* Get the symbol table. */
4645 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
4646 || ((sec
= SECTION_HEADER (section
->sh_link
))->sh_type
4649 error (_("Bad sh_link in group section `%s'\n"), name
);
4653 if (symtab_sec
!= sec
)
4658 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
);
4661 sym
= symtab
+ section
->sh_info
;
4663 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4665 bfd_vma sec_index
= SECTION_HEADER_INDEX (sym
->st_shndx
);
4668 error (_("Bad sh_info in group section `%s'\n"), name
);
4672 group_name
= SECTION_NAME (section_headers
+ sec_index
);
4681 /* Get the string table. */
4682 if (SECTION_HEADER_INDEX (symtab_sec
->sh_link
)
4683 >= elf_header
.e_shnum
)
4692 != (sec
= SECTION_HEADER (symtab_sec
->sh_link
)))
4697 strtab
= get_data (NULL
, file
, strtab_sec
->sh_offset
,
4698 1, strtab_sec
->sh_size
,
4700 strtab_size
= strtab
!= NULL
? strtab_sec
->sh_size
: 0;
4702 group_name
= sym
->st_name
< strtab_size
4703 ? strtab
+ sym
->st_name
: "<corrupt>";
4706 start
= get_data (NULL
, file
, section
->sh_offset
,
4707 1, section
->sh_size
, _("section data"));
4710 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
4711 entry
= byte_get (indices
, 4);
4714 if (do_section_groups
)
4716 printf ("\n%s group section [%5u] `%s' [%s] contains %u sections:\n",
4717 get_group_flags (entry
), i
, name
, group_name
, size
);
4719 printf (_(" [Index] Name\n"));
4722 group
->group_index
= i
;
4724 for (j
= 0; j
< size
; j
++)
4726 struct group_list
*g
;
4728 entry
= byte_get (indices
, 4);
4731 if (SECTION_HEADER_INDEX (entry
) >= elf_header
.e_shnum
)
4733 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
4734 entry
, i
, elf_header
.e_shnum
- 1);
4737 else if (entry
>= SHN_LORESERVE
&& entry
<= SHN_HIRESERVE
)
4739 error (_("invalid section [%5u] in group section [%5u]\n"),
4744 if (section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4749 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
4751 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4756 /* Intel C/C++ compiler may put section 0 in a
4757 section group. We just warn it the first time
4758 and ignore it afterwards. */
4759 static int warned
= 0;
4762 error (_("section 0 in group section [%5u]\n"),
4763 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4769 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4772 if (do_section_groups
)
4774 sec
= SECTION_HEADER (entry
);
4775 printf (" [%5u] %s\n", entry
, SECTION_NAME (sec
));
4778 g
= xmalloc (sizeof (struct group_list
));
4779 g
->section_index
= entry
;
4780 g
->next
= group
->root
;
4804 } dynamic_relocations
[] =
4806 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
4807 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
4808 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
4811 /* Process the reloc section. */
4814 process_relocs (FILE *file
)
4816 unsigned long rel_size
;
4817 unsigned long rel_offset
;
4823 if (do_using_dynamic
)
4827 int has_dynamic_reloc
;
4830 has_dynamic_reloc
= 0;
4832 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
4834 is_rela
= dynamic_relocations
[i
].rela
;
4835 name
= dynamic_relocations
[i
].name
;
4836 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
4837 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
4839 has_dynamic_reloc
|= rel_size
;
4841 if (is_rela
== UNKNOWN
)
4843 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
4844 switch (dynamic_info
[DT_PLTREL
])
4858 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4859 name
, rel_offset
, rel_size
);
4861 dump_relocations (file
,
4862 offset_from_vma (file
, rel_offset
, rel_size
),
4864 dynamic_symbols
, num_dynamic_syms
,
4865 dynamic_strings
, dynamic_strings_length
, is_rela
);
4869 if (! has_dynamic_reloc
)
4870 printf (_("\nThere are no dynamic relocations in this file.\n"));
4874 Elf_Internal_Shdr
*section
;
4878 for (i
= 0, section
= section_headers
;
4879 i
< elf_header
.e_shnum
;
4882 if ( section
->sh_type
!= SHT_RELA
4883 && section
->sh_type
!= SHT_REL
)
4886 rel_offset
= section
->sh_offset
;
4887 rel_size
= section
->sh_size
;
4891 Elf_Internal_Shdr
*strsec
;
4894 printf (_("\nRelocation section "));
4896 if (string_table
== NULL
)
4897 printf ("%d", section
->sh_name
);
4899 printf (_("'%s'"), SECTION_NAME (section
));
4901 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4902 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4904 is_rela
= section
->sh_type
== SHT_RELA
;
4906 if (section
->sh_link
4907 && SECTION_HEADER_INDEX (section
->sh_link
)
4908 < elf_header
.e_shnum
)
4910 Elf_Internal_Shdr
*symsec
;
4911 Elf_Internal_Sym
*symtab
;
4912 unsigned long nsyms
;
4913 unsigned long strtablen
= 0;
4914 char *strtab
= NULL
;
4916 symsec
= SECTION_HEADER (section
->sh_link
);
4917 if (symsec
->sh_type
!= SHT_SYMTAB
4918 && symsec
->sh_type
!= SHT_DYNSYM
)
4921 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4922 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4927 if (SECTION_HEADER_INDEX (symsec
->sh_link
)
4928 < elf_header
.e_shnum
)
4930 strsec
= SECTION_HEADER (symsec
->sh_link
);
4932 strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4935 strtablen
= strtab
== NULL
? 0 : strsec
->sh_size
;
4938 dump_relocations (file
, rel_offset
, rel_size
,
4939 symtab
, nsyms
, strtab
, strtablen
, is_rela
);
4945 dump_relocations (file
, rel_offset
, rel_size
,
4946 NULL
, 0, NULL
, 0, is_rela
);
4953 printf (_("\nThere are no relocations in this file.\n"));
4959 /* Process the unwind section. */
4961 #include "unwind-ia64.h"
4963 /* An absolute address consists of a section and an offset. If the
4964 section is NULL, the offset itself is the address, otherwise, the
4965 address equals to LOAD_ADDRESS(section) + offset. */
4969 unsigned short section
;
4973 #define ABSADDR(a) \
4975 ? section_headers [(a).section].sh_addr + (a).offset \
4978 struct ia64_unw_aux_info
4980 struct ia64_unw_table_entry
4982 struct absaddr start
;
4984 struct absaddr info
;
4986 *table
; /* Unwind table. */
4987 unsigned long table_len
; /* Length of unwind table. */
4988 unsigned char *info
; /* Unwind info. */
4989 unsigned long info_size
; /* Size of unwind info. */
4990 bfd_vma info_addr
; /* starting address of unwind info. */
4991 bfd_vma seg_base
; /* Starting address of segment. */
4992 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4993 unsigned long nsyms
; /* Number of symbols. */
4994 char *strtab
; /* The string table. */
4995 unsigned long strtab_size
; /* Size of string table. */
4999 find_symbol_for_address (Elf_Internal_Sym
*symtab
,
5000 unsigned long nsyms
,
5002 unsigned long strtab_size
,
5003 struct absaddr addr
,
5004 const char **symname
,
5007 bfd_vma dist
= 0x100000;
5008 Elf_Internal_Sym
*sym
, *best
= NULL
;
5011 for (i
= 0, sym
= symtab
; i
< nsyms
; ++i
, ++sym
)
5013 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
5014 && sym
->st_name
!= 0
5015 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
5016 && addr
.offset
>= sym
->st_value
5017 && addr
.offset
- sym
->st_value
< dist
)
5020 dist
= addr
.offset
- sym
->st_value
;
5027 *symname
= (best
->st_name
>= strtab_size
5028 ? "<corrupt>" : strtab
+ best
->st_name
);
5033 *offset
= addr
.offset
;
5037 dump_ia64_unwind (struct ia64_unw_aux_info
*aux
)
5039 struct ia64_unw_table_entry
*tp
;
5042 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
5046 const unsigned char *dp
;
5047 const unsigned char *head
;
5048 const char *procname
;
5050 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
5051 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
5053 fputs ("\n<", stdout
);
5057 fputs (procname
, stdout
);
5060 printf ("+%lx", (unsigned long) offset
);
5063 fputs (">: [", stdout
);
5064 print_vma (tp
->start
.offset
, PREFIX_HEX
);
5065 fputc ('-', stdout
);
5066 print_vma (tp
->end
.offset
, PREFIX_HEX
);
5067 printf ("], info at +0x%lx\n",
5068 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
5070 head
= aux
->info
+ (ABSADDR (tp
->info
) - aux
->info_addr
);
5071 stamp
= byte_get ((unsigned char *) head
, sizeof (stamp
));
5073 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
5074 (unsigned) UNW_VER (stamp
),
5075 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
5076 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
5077 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
5078 (unsigned long) (eh_addr_size
* UNW_LENGTH (stamp
)));
5080 if (UNW_VER (stamp
) != 1)
5082 printf ("\tUnknown version.\n");
5087 for (dp
= head
+ 8; dp
< head
+ 8 + eh_addr_size
* UNW_LENGTH (stamp
);)
5088 dp
= unw_decode (dp
, in_body
, & in_body
);
5093 slurp_ia64_unwind_table (FILE *file
,
5094 struct ia64_unw_aux_info
*aux
,
5095 Elf_Internal_Shdr
*sec
)
5097 unsigned long size
, nrelas
, i
;
5098 Elf_Internal_Phdr
*seg
;
5099 struct ia64_unw_table_entry
*tep
;
5100 Elf_Internal_Shdr
*relsec
;
5101 Elf_Internal_Rela
*rela
, *rp
;
5102 unsigned char *table
, *tp
;
5103 Elf_Internal_Sym
*sym
;
5104 const char *relname
;
5106 /* First, find the starting address of the segment that includes
5109 if (elf_header
.e_phnum
)
5111 if (! get_program_headers (file
))
5114 for (seg
= program_headers
;
5115 seg
< program_headers
+ elf_header
.e_phnum
;
5118 if (seg
->p_type
!= PT_LOAD
)
5121 if (sec
->sh_addr
>= seg
->p_vaddr
5122 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5124 aux
->seg_base
= seg
->p_vaddr
;
5130 /* Second, build the unwind table from the contents of the unwind section: */
5131 size
= sec
->sh_size
;
5132 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
5136 aux
->table
= xcmalloc (size
/ (3 * eh_addr_size
), sizeof (aux
->table
[0]));
5138 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * eh_addr_size
, ++tep
)
5140 tep
->start
.section
= SHN_UNDEF
;
5141 tep
->end
.section
= SHN_UNDEF
;
5142 tep
->info
.section
= SHN_UNDEF
;
5145 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
5146 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
5147 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
5151 tep
->start
.offset
= BYTE_GET ((unsigned char *) tp
+ 0);
5152 tep
->end
.offset
= BYTE_GET ((unsigned char *) tp
+ 8);
5153 tep
->info
.offset
= BYTE_GET ((unsigned char *) tp
+ 16);
5155 tep
->start
.offset
+= aux
->seg_base
;
5156 tep
->end
.offset
+= aux
->seg_base
;
5157 tep
->info
.offset
+= aux
->seg_base
;
5161 /* Third, apply any relocations to the unwind table: */
5162 for (relsec
= section_headers
;
5163 relsec
< section_headers
+ elf_header
.e_shnum
;
5166 if (relsec
->sh_type
!= SHT_RELA
5167 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
5168 || SECTION_HEADER (relsec
->sh_info
) != sec
)
5171 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5175 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5177 relname
= elf_ia64_reloc_type (get_reloc_type (rp
->r_info
));
5178 sym
= aux
->symtab
+ get_reloc_symindex (rp
->r_info
);
5180 if (! const_strneq (relname
, "R_IA64_SEGREL"))
5182 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5186 i
= rp
->r_offset
/ (3 * eh_addr_size
);
5188 switch (rp
->r_offset
/eh_addr_size
% 3)
5191 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5192 aux
->table
[i
].start
.offset
+= rp
->r_addend
+ sym
->st_value
;
5195 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5196 aux
->table
[i
].end
.offset
+= rp
->r_addend
+ sym
->st_value
;
5199 aux
->table
[i
].info
.section
= sym
->st_shndx
;
5200 aux
->table
[i
].info
.offset
+= rp
->r_addend
+ sym
->st_value
;
5210 aux
->table_len
= size
/ (3 * eh_addr_size
);
5215 ia64_process_unwind (FILE *file
)
5217 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
5218 unsigned long i
, unwcount
= 0, unwstart
= 0;
5219 struct ia64_unw_aux_info aux
;
5221 memset (& aux
, 0, sizeof (aux
));
5223 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5225 if (sec
->sh_type
== SHT_SYMTAB
5226 && SECTION_HEADER_INDEX (sec
->sh_link
) < elf_header
.e_shnum
)
5228 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5229 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5231 strsec
= SECTION_HEADER (sec
->sh_link
);
5232 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
5233 1, strsec
->sh_size
, _("string table"));
5234 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5236 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
5241 printf (_("\nThere are no unwind sections in this file.\n"));
5243 while (unwcount
-- > 0)
5248 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
5249 i
< elf_header
.e_shnum
; ++i
, ++sec
)
5250 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
5257 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
5259 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
5261 /* We need to find which section group it is in. */
5262 struct group_list
*g
= section_headers_groups
[i
]->root
;
5264 for (; g
!= NULL
; g
= g
->next
)
5266 sec
= SECTION_HEADER (g
->section_index
);
5268 if (streq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
))
5273 i
= elf_header
.e_shnum
;
5275 else if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
, len
))
5277 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
5278 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
5279 suffix
= SECTION_NAME (unwsec
) + len
;
5280 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
5282 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info_once
, len2
)
5283 && streq (SECTION_NAME (sec
) + len2
, suffix
))
5288 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
5289 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
5290 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
5291 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
5293 if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
, len
))
5294 suffix
= SECTION_NAME (unwsec
) + len
;
5295 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
5297 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
, len2
)
5298 && streq (SECTION_NAME (sec
) + len2
, suffix
))
5302 if (i
== elf_header
.e_shnum
)
5304 printf (_("\nCould not find unwind info section for "));
5306 if (string_table
== NULL
)
5307 printf ("%d", unwsec
->sh_name
);
5309 printf (_("'%s'"), SECTION_NAME (unwsec
));
5313 aux
.info_size
= sec
->sh_size
;
5314 aux
.info_addr
= sec
->sh_addr
;
5315 aux
.info
= get_data (NULL
, file
, sec
->sh_offset
, 1, aux
.info_size
,
5318 printf (_("\nUnwind section "));
5320 if (string_table
== NULL
)
5321 printf ("%d", unwsec
->sh_name
);
5323 printf (_("'%s'"), SECTION_NAME (unwsec
));
5325 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5326 (unsigned long) unwsec
->sh_offset
,
5327 (unsigned long) (unwsec
->sh_size
/ (3 * eh_addr_size
)));
5329 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
5331 if (aux
.table_len
> 0)
5332 dump_ia64_unwind (& aux
);
5335 free ((char *) aux
.table
);
5337 free ((char *) aux
.info
);
5346 free ((char *) aux
.strtab
);
5351 struct hppa_unw_aux_info
5353 struct hppa_unw_table_entry
5355 struct absaddr start
;
5357 unsigned int Cannot_unwind
:1; /* 0 */
5358 unsigned int Millicode
:1; /* 1 */
5359 unsigned int Millicode_save_sr0
:1; /* 2 */
5360 unsigned int Region_description
:2; /* 3..4 */
5361 unsigned int reserved1
:1; /* 5 */
5362 unsigned int Entry_SR
:1; /* 6 */
5363 unsigned int Entry_FR
:4; /* number saved */ /* 7..10 */
5364 unsigned int Entry_GR
:5; /* number saved */ /* 11..15 */
5365 unsigned int Args_stored
:1; /* 16 */
5366 unsigned int Variable_Frame
:1; /* 17 */
5367 unsigned int Separate_Package_Body
:1; /* 18 */
5368 unsigned int Frame_Extension_Millicode
:1; /* 19 */
5369 unsigned int Stack_Overflow_Check
:1; /* 20 */
5370 unsigned int Two_Instruction_SP_Increment
:1; /* 21 */
5371 unsigned int Ada_Region
:1; /* 22 */
5372 unsigned int cxx_info
:1; /* 23 */
5373 unsigned int cxx_try_catch
:1; /* 24 */
5374 unsigned int sched_entry_seq
:1; /* 25 */
5375 unsigned int reserved2
:1; /* 26 */
5376 unsigned int Save_SP
:1; /* 27 */
5377 unsigned int Save_RP
:1; /* 28 */
5378 unsigned int Save_MRP_in_frame
:1; /* 29 */
5379 unsigned int extn_ptr_defined
:1; /* 30 */
5380 unsigned int Cleanup_defined
:1; /* 31 */
5382 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
5383 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
5384 unsigned int Large_frame
:1; /* 2 */
5385 unsigned int Pseudo_SP_Set
:1; /* 3 */
5386 unsigned int reserved4
:1; /* 4 */
5387 unsigned int Total_frame_size
:27; /* 5..31 */
5389 *table
; /* Unwind table. */
5390 unsigned long table_len
; /* Length of unwind table. */
5391 bfd_vma seg_base
; /* Starting address of segment. */
5392 Elf_Internal_Sym
*symtab
; /* The symbol table. */
5393 unsigned long nsyms
; /* Number of symbols. */
5394 char *strtab
; /* The string table. */
5395 unsigned long strtab_size
; /* Size of string table. */
5399 dump_hppa_unwind (struct hppa_unw_aux_info
*aux
)
5401 struct hppa_unw_table_entry
*tp
;
5403 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
5406 const char *procname
;
5408 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
5409 aux
->strtab_size
, tp
->start
, &procname
,
5412 fputs ("\n<", stdout
);
5416 fputs (procname
, stdout
);
5419 printf ("+%lx", (unsigned long) offset
);
5422 fputs (">: [", stdout
);
5423 print_vma (tp
->start
.offset
, PREFIX_HEX
);
5424 fputc ('-', stdout
);
5425 print_vma (tp
->end
.offset
, PREFIX_HEX
);
5428 #define PF(_m) if (tp->_m) printf (#_m " ");
5429 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5432 PF(Millicode_save_sr0
);
5433 /* PV(Region_description); */
5439 PF(Separate_Package_Body
);
5440 PF(Frame_Extension_Millicode
);
5441 PF(Stack_Overflow_Check
);
5442 PF(Two_Instruction_SP_Increment
);
5446 PF(sched_entry_seq
);
5449 PF(Save_MRP_in_frame
);
5450 PF(extn_ptr_defined
);
5451 PF(Cleanup_defined
);
5452 PF(MPE_XL_interrupt_marker
);
5453 PF(HP_UX_interrupt_marker
);
5456 PV(Total_frame_size
);
5465 slurp_hppa_unwind_table (FILE *file
,
5466 struct hppa_unw_aux_info
*aux
,
5467 Elf_Internal_Shdr
*sec
)
5469 unsigned long size
, unw_ent_size
, nentries
, nrelas
, i
;
5470 Elf_Internal_Phdr
*seg
;
5471 struct hppa_unw_table_entry
*tep
;
5472 Elf_Internal_Shdr
*relsec
;
5473 Elf_Internal_Rela
*rela
, *rp
;
5474 unsigned char *table
, *tp
;
5475 Elf_Internal_Sym
*sym
;
5476 const char *relname
;
5478 /* First, find the starting address of the segment that includes
5481 if (elf_header
.e_phnum
)
5483 if (! get_program_headers (file
))
5486 for (seg
= program_headers
;
5487 seg
< program_headers
+ elf_header
.e_phnum
;
5490 if (seg
->p_type
!= PT_LOAD
)
5493 if (sec
->sh_addr
>= seg
->p_vaddr
5494 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5496 aux
->seg_base
= seg
->p_vaddr
;
5502 /* Second, build the unwind table from the contents of the unwind
5504 size
= sec
->sh_size
;
5505 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
5510 nentries
= size
/ unw_ent_size
;
5511 size
= unw_ent_size
* nentries
;
5513 tep
= aux
->table
= xcmalloc (nentries
, sizeof (aux
->table
[0]));
5515 for (tp
= table
; tp
< table
+ size
; tp
+= unw_ent_size
, ++tep
)
5517 unsigned int tmp1
, tmp2
;
5519 tep
->start
.section
= SHN_UNDEF
;
5520 tep
->end
.section
= SHN_UNDEF
;
5522 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
5523 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
5524 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
5525 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
5527 tep
->start
.offset
+= aux
->seg_base
;
5528 tep
->end
.offset
+= aux
->seg_base
;
5530 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
5531 tep
->Millicode
= (tmp1
>> 30) & 0x1;
5532 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
5533 tep
->Region_description
= (tmp1
>> 27) & 0x3;
5534 tep
->reserved1
= (tmp1
>> 26) & 0x1;
5535 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
5536 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
5537 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
5538 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
5539 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
5540 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
5541 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
5542 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
5543 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
5544 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
5545 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
5546 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
5547 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
5548 tep
->reserved2
= (tmp1
>> 5) & 0x1;
5549 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
5550 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
5551 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
5552 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
5553 tep
->Cleanup_defined
= tmp1
& 0x1;
5555 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
5556 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
5557 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
5558 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
5559 tep
->reserved4
= (tmp2
>> 27) & 0x1;
5560 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
5564 /* Third, apply any relocations to the unwind table. */
5565 for (relsec
= section_headers
;
5566 relsec
< section_headers
+ elf_header
.e_shnum
;
5569 if (relsec
->sh_type
!= SHT_RELA
5570 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
5571 || SECTION_HEADER (relsec
->sh_info
) != sec
)
5574 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5578 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5580 relname
= elf_hppa_reloc_type (get_reloc_type (rp
->r_info
));
5581 sym
= aux
->symtab
+ get_reloc_symindex (rp
->r_info
);
5583 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
5584 if (! const_strneq (relname
, "R_PARISC_SEGREL"))
5586 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5590 i
= rp
->r_offset
/ unw_ent_size
;
5592 switch ((rp
->r_offset
% unw_ent_size
) / eh_addr_size
)
5595 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5596 aux
->table
[i
].start
.offset
+= sym
->st_value
+ rp
->r_addend
;
5599 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5600 aux
->table
[i
].end
.offset
+= sym
->st_value
+ rp
->r_addend
;
5610 aux
->table_len
= nentries
;
5616 hppa_process_unwind (FILE *file
)
5618 struct hppa_unw_aux_info aux
;
5619 Elf_Internal_Shdr
*unwsec
= NULL
;
5620 Elf_Internal_Shdr
*strsec
;
5621 Elf_Internal_Shdr
*sec
;
5624 memset (& aux
, 0, sizeof (aux
));
5626 if (string_table
== NULL
)
5629 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5631 if (sec
->sh_type
== SHT_SYMTAB
5632 && SECTION_HEADER_INDEX (sec
->sh_link
) < elf_header
.e_shnum
)
5634 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5635 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5637 strsec
= SECTION_HEADER (sec
->sh_link
);
5638 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
5639 1, strsec
->sh_size
, _("string table"));
5640 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5642 else if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5647 printf (_("\nThere are no unwind sections in this file.\n"));
5649 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5651 if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5653 printf (_("\nUnwind section "));
5654 printf (_("'%s'"), SECTION_NAME (sec
));
5656 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5657 (unsigned long) sec
->sh_offset
,
5658 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
+ 8)));
5660 slurp_hppa_unwind_table (file
, &aux
, sec
);
5661 if (aux
.table_len
> 0)
5662 dump_hppa_unwind (&aux
);
5665 free ((char *) aux
.table
);
5673 free ((char *) aux
.strtab
);
5679 process_unwind (FILE *file
)
5681 struct unwind_handler
{
5683 int (*handler
)(FILE *file
);
5685 { EM_IA_64
, ia64_process_unwind
},
5686 { EM_PARISC
, hppa_process_unwind
},
5694 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
5695 if (elf_header
.e_machine
== handlers
[i
].machtype
)
5696 return handlers
[i
].handler (file
);
5698 printf (_("\nThere are no unwind sections in this file.\n"));
5703 dynamic_section_mips_val (Elf_Internal_Dyn
*entry
)
5705 switch (entry
->d_tag
)
5708 if (entry
->d_un
.d_val
== 0)
5712 static const char * opts
[] =
5714 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5715 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5716 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5717 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5722 for (cnt
= 0; cnt
< ARRAY_SIZE (opts
); ++cnt
)
5723 if (entry
->d_un
.d_val
& (1 << cnt
))
5725 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
5732 case DT_MIPS_IVERSION
:
5733 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5734 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5736 printf ("<corrupt: %ld>\n", (long) entry
->d_un
.d_ptr
);
5739 case DT_MIPS_TIME_STAMP
:
5744 time_t time
= entry
->d_un
.d_val
;
5745 tmp
= gmtime (&time
);
5746 snprintf (timebuf
, sizeof (timebuf
), "%04u-%02u-%02uT%02u:%02u:%02u",
5747 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5748 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5749 printf ("Time Stamp: %s\n", timebuf
);
5753 case DT_MIPS_RLD_VERSION
:
5754 case DT_MIPS_LOCAL_GOTNO
:
5755 case DT_MIPS_CONFLICTNO
:
5756 case DT_MIPS_LIBLISTNO
:
5757 case DT_MIPS_SYMTABNO
:
5758 case DT_MIPS_UNREFEXTNO
:
5759 case DT_MIPS_HIPAGENO
:
5760 case DT_MIPS_DELTA_CLASS_NO
:
5761 case DT_MIPS_DELTA_INSTANCE_NO
:
5762 case DT_MIPS_DELTA_RELOC_NO
:
5763 case DT_MIPS_DELTA_SYM_NO
:
5764 case DT_MIPS_DELTA_CLASSSYM_NO
:
5765 case DT_MIPS_COMPACT_SIZE
:
5766 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
5770 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
5776 dynamic_section_parisc_val (Elf_Internal_Dyn
*entry
)
5778 switch (entry
->d_tag
)
5780 case DT_HP_DLD_FLAGS
:
5789 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
5790 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
5791 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
5792 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
5793 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
5794 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
5795 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
5796 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
5797 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
5798 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
5799 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" },
5800 { DT_HP_GST
, "HP_GST" },
5801 { DT_HP_SHLIB_FIXED
, "HP_SHLIB_FIXED" },
5802 { DT_HP_MERGE_SHLIB_SEG
, "HP_MERGE_SHLIB_SEG" },
5803 { DT_HP_NODELETE
, "HP_NODELETE" },
5804 { DT_HP_GROUP
, "HP_GROUP" },
5805 { DT_HP_PROTECT_LINKAGE_TABLE
, "HP_PROTECT_LINKAGE_TABLE" }
5809 bfd_vma val
= entry
->d_un
.d_val
;
5811 for (cnt
= 0; cnt
< ARRAY_SIZE (flags
); ++cnt
)
5812 if (val
& flags
[cnt
].bit
)
5816 fputs (flags
[cnt
].str
, stdout
);
5818 val
^= flags
[cnt
].bit
;
5821 if (val
!= 0 || first
)
5825 print_vma (val
, HEX
);
5831 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5838 dynamic_section_ia64_val (Elf_Internal_Dyn
*entry
)
5840 switch (entry
->d_tag
)
5842 case DT_IA_64_PLT_RESERVE
:
5843 /* First 3 slots reserved. */
5844 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5846 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
5850 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5857 get_32bit_dynamic_section (FILE *file
)
5859 Elf32_External_Dyn
*edyn
, *ext
;
5860 Elf_Internal_Dyn
*entry
;
5862 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5863 _("dynamic section"));
5867 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5868 might not have the luxury of section headers. Look for the DT_NULL
5869 terminator to determine the number of entries. */
5870 for (ext
= edyn
, dynamic_nent
= 0;
5871 (char *) ext
< (char *) edyn
+ dynamic_size
;
5875 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5879 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5880 if (dynamic_section
== NULL
)
5882 error (_("Out of memory\n"));
5887 for (ext
= edyn
, entry
= dynamic_section
;
5888 entry
< dynamic_section
+ dynamic_nent
;
5891 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5892 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5901 get_64bit_dynamic_section (FILE *file
)
5903 Elf64_External_Dyn
*edyn
, *ext
;
5904 Elf_Internal_Dyn
*entry
;
5906 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5907 _("dynamic section"));
5911 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5912 might not have the luxury of section headers. Look for the DT_NULL
5913 terminator to determine the number of entries. */
5914 for (ext
= edyn
, dynamic_nent
= 0;
5915 (char *) ext
< (char *) edyn
+ dynamic_size
;
5919 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5923 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5924 if (dynamic_section
== NULL
)
5926 error (_("Out of memory\n"));
5931 for (ext
= edyn
, entry
= dynamic_section
;
5932 entry
< dynamic_section
+ dynamic_nent
;
5935 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5936 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5945 print_dynamic_flags (bfd_vma flags
)
5953 flag
= flags
& - flags
;
5963 case DF_ORIGIN
: fputs ("ORIGIN", stdout
); break;
5964 case DF_SYMBOLIC
: fputs ("SYMBOLIC", stdout
); break;
5965 case DF_TEXTREL
: fputs ("TEXTREL", stdout
); break;
5966 case DF_BIND_NOW
: fputs ("BIND_NOW", stdout
); break;
5967 case DF_STATIC_TLS
: fputs ("STATIC_TLS", stdout
); break;
5968 default: fputs ("unknown", stdout
); break;
5974 /* Parse and display the contents of the dynamic section. */
5977 process_dynamic_section (FILE *file
)
5979 Elf_Internal_Dyn
*entry
;
5981 if (dynamic_size
== 0)
5984 printf (_("\nThere is no dynamic section in this file.\n"));
5991 if (! get_32bit_dynamic_section (file
))
5994 else if (! get_64bit_dynamic_section (file
))
5997 /* Find the appropriate symbol table. */
5998 if (dynamic_symbols
== NULL
)
6000 for (entry
= dynamic_section
;
6001 entry
< dynamic_section
+ dynamic_nent
;
6004 Elf_Internal_Shdr section
;
6006 if (entry
->d_tag
!= DT_SYMTAB
)
6009 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
6011 /* Since we do not know how big the symbol table is,
6012 we default to reading in the entire file (!) and
6013 processing that. This is overkill, I know, but it
6015 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
6017 if (archive_file_offset
!= 0)
6018 section
.sh_size
= archive_file_size
- section
.sh_offset
;
6021 if (fseek (file
, 0, SEEK_END
))
6022 error (_("Unable to seek to end of file!\n"));
6024 section
.sh_size
= ftell (file
) - section
.sh_offset
;
6028 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
6030 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
6032 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
6033 if (num_dynamic_syms
< 1)
6035 error (_("Unable to determine the number of symbols to load\n"));
6039 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
6043 /* Similarly find a string table. */
6044 if (dynamic_strings
== NULL
)
6046 for (entry
= dynamic_section
;
6047 entry
< dynamic_section
+ dynamic_nent
;
6050 unsigned long offset
;
6053 if (entry
->d_tag
!= DT_STRTAB
)
6056 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
6058 /* Since we do not know how big the string table is,
6059 we default to reading in the entire file (!) and
6060 processing that. This is overkill, I know, but it
6063 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
6065 if (archive_file_offset
!= 0)
6066 str_tab_len
= archive_file_size
- offset
;
6069 if (fseek (file
, 0, SEEK_END
))
6070 error (_("Unable to seek to end of file\n"));
6071 str_tab_len
= ftell (file
) - offset
;
6074 if (str_tab_len
< 1)
6077 (_("Unable to determine the length of the dynamic string table\n"));
6081 dynamic_strings
= get_data (NULL
, file
, offset
, 1, str_tab_len
,
6082 _("dynamic string table"));
6083 dynamic_strings_length
= str_tab_len
;
6088 /* And find the syminfo section if available. */
6089 if (dynamic_syminfo
== NULL
)
6091 unsigned long syminsz
= 0;
6093 for (entry
= dynamic_section
;
6094 entry
< dynamic_section
+ dynamic_nent
;
6097 if (entry
->d_tag
== DT_SYMINENT
)
6099 /* Note: these braces are necessary to avoid a syntax
6100 error from the SunOS4 C compiler. */
6101 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
6103 else if (entry
->d_tag
== DT_SYMINSZ
)
6104 syminsz
= entry
->d_un
.d_val
;
6105 else if (entry
->d_tag
== DT_SYMINFO
)
6106 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
6110 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
6112 Elf_External_Syminfo
*extsyminfo
, *extsym
;
6113 Elf_Internal_Syminfo
*syminfo
;
6115 /* There is a syminfo section. Read the data. */
6116 extsyminfo
= get_data (NULL
, file
, dynamic_syminfo_offset
, 1,
6117 syminsz
, _("symbol information"));
6121 dynamic_syminfo
= malloc (syminsz
);
6122 if (dynamic_syminfo
== NULL
)
6124 error (_("Out of memory\n"));
6128 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
6129 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
6130 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
6131 ++syminfo
, ++extsym
)
6133 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
6134 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
6141 if (do_dynamic
&& dynamic_addr
)
6142 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
6143 dynamic_addr
, dynamic_nent
);
6145 printf (_(" Tag Type Name/Value\n"));
6147 for (entry
= dynamic_section
;
6148 entry
< dynamic_section
+ dynamic_nent
;
6156 print_vma (entry
->d_tag
, FULL_HEX
);
6157 dtype
= get_dynamic_type (entry
->d_tag
);
6158 printf (" (%s)%*s", dtype
,
6159 ((is_32bit_elf
? 27 : 19)
6160 - (int) strlen (dtype
)),
6164 switch (entry
->d_tag
)
6168 print_dynamic_flags (entry
->d_un
.d_val
);
6178 switch (entry
->d_tag
)
6181 printf (_("Auxiliary library"));
6185 printf (_("Filter library"));
6189 printf (_("Configuration file"));
6193 printf (_("Dependency audit library"));
6197 printf (_("Audit library"));
6201 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6202 printf (": [%s]\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
6206 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6215 printf (_("Flags:"));
6217 if (entry
->d_un
.d_val
== 0)
6218 printf (_(" None\n"));
6221 unsigned long int val
= entry
->d_un
.d_val
;
6223 if (val
& DTF_1_PARINIT
)
6225 printf (" PARINIT");
6226 val
^= DTF_1_PARINIT
;
6228 if (val
& DTF_1_CONFEXP
)
6230 printf (" CONFEXP");
6231 val
^= DTF_1_CONFEXP
;
6234 printf (" %lx", val
);
6243 printf (_("Flags:"));
6245 if (entry
->d_un
.d_val
== 0)
6246 printf (_(" None\n"));
6249 unsigned long int val
= entry
->d_un
.d_val
;
6251 if (val
& DF_P1_LAZYLOAD
)
6253 printf (" LAZYLOAD");
6254 val
^= DF_P1_LAZYLOAD
;
6256 if (val
& DF_P1_GROUPPERM
)
6258 printf (" GROUPPERM");
6259 val
^= DF_P1_GROUPPERM
;
6262 printf (" %lx", val
);
6271 printf (_("Flags:"));
6272 if (entry
->d_un
.d_val
== 0)
6273 printf (_(" None\n"));
6276 unsigned long int val
= entry
->d_un
.d_val
;
6283 if (val
& DF_1_GLOBAL
)
6288 if (val
& DF_1_GROUP
)
6293 if (val
& DF_1_NODELETE
)
6295 printf (" NODELETE");
6296 val
^= DF_1_NODELETE
;
6298 if (val
& DF_1_LOADFLTR
)
6300 printf (" LOADFLTR");
6301 val
^= DF_1_LOADFLTR
;
6303 if (val
& DF_1_INITFIRST
)
6305 printf (" INITFIRST");
6306 val
^= DF_1_INITFIRST
;
6308 if (val
& DF_1_NOOPEN
)
6313 if (val
& DF_1_ORIGIN
)
6318 if (val
& DF_1_DIRECT
)
6323 if (val
& DF_1_TRANS
)
6328 if (val
& DF_1_INTERPOSE
)
6330 printf (" INTERPOSE");
6331 val
^= DF_1_INTERPOSE
;
6333 if (val
& DF_1_NODEFLIB
)
6335 printf (" NODEFLIB");
6336 val
^= DF_1_NODEFLIB
;
6338 if (val
& DF_1_NODUMP
)
6343 if (val
& DF_1_CONLFAT
)
6345 printf (" CONLFAT");
6346 val
^= DF_1_CONLFAT
;
6349 printf (" %lx", val
);
6356 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6358 puts (get_dynamic_type (entry
->d_un
.d_val
));
6378 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6384 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6385 name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6391 switch (entry
->d_tag
)
6394 printf (_("Shared library: [%s]"), name
);
6396 if (streq (name
, program_interpreter
))
6397 printf (_(" program interpreter"));
6401 printf (_("Library soname: [%s]"), name
);
6405 printf (_("Library rpath: [%s]"), name
);
6409 printf (_("Library runpath: [%s]"), name
);
6413 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6418 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6431 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6435 case DT_INIT_ARRAYSZ
:
6436 case DT_FINI_ARRAYSZ
:
6437 case DT_GNU_CONFLICTSZ
:
6438 case DT_GNU_LIBLISTSZ
:
6441 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6442 printf (" (bytes)\n");
6452 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6465 if (entry
->d_tag
== DT_USED
6466 && VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6468 char *name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6472 printf (_("Not needed object: [%s]\n"), name
);
6477 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6483 /* The value of this entry is ignored. */
6488 case DT_GNU_PRELINKED
:
6492 time_t time
= entry
->d_un
.d_val
;
6494 tmp
= gmtime (&time
);
6495 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
6496 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
6497 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
6503 dynamic_info_DT_GNU_HASH
= entry
->d_un
.d_val
;
6506 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6512 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
6513 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
6518 switch (elf_header
.e_machine
)
6521 case EM_MIPS_RS3_LE
:
6522 dynamic_section_mips_val (entry
);
6525 dynamic_section_parisc_val (entry
);
6528 dynamic_section_ia64_val (entry
);
6531 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6543 get_ver_flags (unsigned int flags
)
6545 static char buff
[32];
6552 if (flags
& VER_FLG_BASE
)
6553 strcat (buff
, "BASE ");
6555 if (flags
& VER_FLG_WEAK
)
6557 if (flags
& VER_FLG_BASE
)
6558 strcat (buff
, "| ");
6560 strcat (buff
, "WEAK ");
6563 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
6564 strcat (buff
, "| <unknown>");
6569 /* Display the contents of the version sections. */
6571 process_version_sections (FILE *file
)
6573 Elf_Internal_Shdr
*section
;
6580 for (i
= 0, section
= section_headers
;
6581 i
< elf_header
.e_shnum
;
6584 switch (section
->sh_type
)
6586 case SHT_GNU_verdef
:
6588 Elf_External_Verdef
*edefs
;
6596 (_("\nVersion definition section '%s' contains %ld entries:\n"),
6597 SECTION_NAME (section
), section
->sh_info
);
6599 printf (_(" Addr: 0x"));
6600 printf_vma (section
->sh_addr
);
6601 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6602 (unsigned long) section
->sh_offset
, section
->sh_link
,
6603 SECTION_HEADER_INDEX (section
->sh_link
)
6604 < elf_header
.e_shnum
6605 ? SECTION_NAME (SECTION_HEADER (section
->sh_link
))
6608 edefs
= get_data (NULL
, file
, section
->sh_offset
, 1,
6610 _("version definition section"));
6611 endbuf
= (char *) edefs
+ section
->sh_size
;
6615 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6618 Elf_External_Verdef
*edef
;
6619 Elf_Internal_Verdef ent
;
6620 Elf_External_Verdaux
*eaux
;
6621 Elf_Internal_Verdaux aux
;
6625 vstart
= ((char *) edefs
) + idx
;
6626 if (vstart
+ sizeof (*edef
) > endbuf
)
6629 edef
= (Elf_External_Verdef
*) vstart
;
6631 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
6632 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
6633 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
6634 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
6635 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
6636 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
6637 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
6639 printf (_(" %#06x: Rev: %d Flags: %s"),
6640 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
6642 printf (_(" Index: %d Cnt: %d "),
6643 ent
.vd_ndx
, ent
.vd_cnt
);
6645 vstart
+= ent
.vd_aux
;
6647 eaux
= (Elf_External_Verdaux
*) vstart
;
6649 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6650 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6652 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6653 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux
.vda_name
));
6655 printf (_("Name index: %ld\n"), aux
.vda_name
);
6657 isum
= idx
+ ent
.vd_aux
;
6659 for (j
= 1; j
< ent
.vd_cnt
; j
++)
6661 isum
+= aux
.vda_next
;
6662 vstart
+= aux
.vda_next
;
6664 eaux
= (Elf_External_Verdaux
*) vstart
;
6665 if (vstart
+ sizeof (*eaux
) > endbuf
)
6668 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6669 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6671 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6672 printf (_(" %#06x: Parent %d: %s\n"),
6673 isum
, j
, GET_DYNAMIC_NAME (aux
.vda_name
));
6675 printf (_(" %#06x: Parent %d, name index: %ld\n"),
6676 isum
, j
, aux
.vda_name
);
6679 printf (_(" Version def aux past end of section\n"));
6683 if (cnt
< section
->sh_info
)
6684 printf (_(" Version definition past end of section\n"));
6690 case SHT_GNU_verneed
:
6692 Elf_External_Verneed
*eneed
;
6699 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
6700 SECTION_NAME (section
), section
->sh_info
);
6702 printf (_(" Addr: 0x"));
6703 printf_vma (section
->sh_addr
);
6704 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
6705 (unsigned long) section
->sh_offset
, section
->sh_link
,
6706 SECTION_HEADER_INDEX (section
->sh_link
)
6707 < elf_header
.e_shnum
6708 ? SECTION_NAME (SECTION_HEADER (section
->sh_link
))
6711 eneed
= get_data (NULL
, file
, section
->sh_offset
, 1,
6713 _("version need section"));
6714 endbuf
= (char *) eneed
+ section
->sh_size
;
6718 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6720 Elf_External_Verneed
*entry
;
6721 Elf_Internal_Verneed ent
;
6726 vstart
= ((char *) eneed
) + idx
;
6727 if (vstart
+ sizeof (*entry
) > endbuf
)
6730 entry
= (Elf_External_Verneed
*) vstart
;
6732 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
6733 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
6734 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
6735 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
6736 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
6738 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
6740 if (VALID_DYNAMIC_NAME (ent
.vn_file
))
6741 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent
.vn_file
));
6743 printf (_(" File: %lx"), ent
.vn_file
);
6745 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
6747 vstart
+= ent
.vn_aux
;
6749 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
6751 Elf_External_Vernaux
*eaux
;
6752 Elf_Internal_Vernaux aux
;
6754 if (vstart
+ sizeof (*eaux
) > endbuf
)
6756 eaux
= (Elf_External_Vernaux
*) vstart
;
6758 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
6759 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
6760 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
6761 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
6762 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
6764 if (VALID_DYNAMIC_NAME (aux
.vna_name
))
6765 printf (_(" %#06x: Name: %s"),
6766 isum
, GET_DYNAMIC_NAME (aux
.vna_name
));
6768 printf (_(" %#06x: Name index: %lx"),
6769 isum
, aux
.vna_name
);
6771 printf (_(" Flags: %s Version: %d\n"),
6772 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
6774 isum
+= aux
.vna_next
;
6775 vstart
+= aux
.vna_next
;
6778 printf (_(" Version need aux past end of section\n"));
6782 if (cnt
< section
->sh_info
)
6783 printf (_(" Version need past end of section\n"));
6789 case SHT_GNU_versym
:
6791 Elf_Internal_Shdr
*link_section
;
6794 unsigned char *edata
;
6795 unsigned short *data
;
6797 Elf_Internal_Sym
*symbols
;
6798 Elf_Internal_Shdr
*string_sec
;
6801 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
)
6804 link_section
= SECTION_HEADER (section
->sh_link
);
6805 total
= section
->sh_size
/ sizeof (Elf_External_Versym
);
6807 if (SECTION_HEADER_INDEX (link_section
->sh_link
)
6808 >= elf_header
.e_shnum
)
6813 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
6815 string_sec
= SECTION_HEADER (link_section
->sh_link
);
6817 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
6818 string_sec
->sh_size
, _("version string table"));
6822 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6823 SECTION_NAME (section
), total
);
6825 printf (_(" Addr: "));
6826 printf_vma (section
->sh_addr
);
6827 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6828 (unsigned long) section
->sh_offset
, section
->sh_link
,
6829 SECTION_NAME (link_section
));
6831 off
= offset_from_vma (file
,
6832 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6833 total
* sizeof (short));
6834 edata
= get_data (NULL
, file
, off
, total
, sizeof (short),
6835 _("version symbol data"));
6842 data
= cmalloc (total
, sizeof (short));
6844 for (cnt
= total
; cnt
--;)
6845 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
6850 for (cnt
= 0; cnt
< total
; cnt
+= 4)
6853 int check_def
, check_need
;
6856 printf (" %03x:", cnt
);
6858 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
6859 switch (data
[cnt
+ j
])
6862 fputs (_(" 0 (*local*) "), stdout
);
6866 fputs (_(" 1 (*global*) "), stdout
);
6870 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
6871 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
6875 if (SECTION_HEADER_INDEX (symbols
[cnt
+ j
].st_shndx
)
6876 >= elf_header
.e_shnum
6877 || SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
6880 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
6887 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
6889 Elf_Internal_Verneed ivn
;
6890 unsigned long offset
;
6892 offset
= offset_from_vma
6893 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6894 sizeof (Elf_External_Verneed
));
6898 Elf_Internal_Vernaux ivna
;
6899 Elf_External_Verneed evn
;
6900 Elf_External_Vernaux evna
;
6901 unsigned long a_off
;
6903 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
6906 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6907 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6909 a_off
= offset
+ ivn
.vn_aux
;
6913 get_data (&evna
, file
, a_off
, sizeof (evna
),
6914 1, _("version need aux (2)"));
6916 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6917 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6919 a_off
+= ivna
.vna_next
;
6921 while (ivna
.vna_other
!= data
[cnt
+ j
]
6922 && ivna
.vna_next
!= 0);
6924 if (ivna
.vna_other
== data
[cnt
+ j
])
6926 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6928 if (ivna
.vna_name
>= string_sec
->sh_size
)
6929 name
= _("*invalid*");
6931 name
= strtab
+ ivna
.vna_name
;
6932 nn
+= printf ("(%s%-*s",
6934 12 - (int) strlen (name
),
6940 offset
+= ivn
.vn_next
;
6942 while (ivn
.vn_next
);
6945 if (check_def
&& data
[cnt
+ j
] != 0x8001
6946 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6948 Elf_Internal_Verdef ivd
;
6949 Elf_External_Verdef evd
;
6950 unsigned long offset
;
6952 offset
= offset_from_vma
6953 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6958 get_data (&evd
, file
, offset
, sizeof (evd
), 1,
6961 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6962 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6964 offset
+= ivd
.vd_next
;
6966 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
6967 && ivd
.vd_next
!= 0);
6969 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
6971 Elf_External_Verdaux evda
;
6972 Elf_Internal_Verdaux ivda
;
6974 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6976 get_data (&evda
, file
,
6977 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
6979 _("version def aux"));
6981 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6983 if (ivda
.vda_name
>= string_sec
->sh_size
)
6984 name
= _("*invalid*");
6986 name
= strtab
+ ivda
.vda_name
;
6987 nn
+= printf ("(%s%-*s",
6989 12 - (int) strlen (name
),
6995 printf ("%*c", 18 - nn
, ' ');
7013 printf (_("\nNo version information found in this file.\n"));
7019 get_symbol_binding (unsigned int binding
)
7021 static char buff
[32];
7025 case STB_LOCAL
: return "LOCAL";
7026 case STB_GLOBAL
: return "GLOBAL";
7027 case STB_WEAK
: return "WEAK";
7029 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
7030 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"),
7032 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
7033 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), binding
);
7035 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), binding
);
7041 get_symbol_type (unsigned int type
)
7043 static char buff
[32];
7047 case STT_NOTYPE
: return "NOTYPE";
7048 case STT_OBJECT
: return "OBJECT";
7049 case STT_FUNC
: return "FUNC";
7050 case STT_SECTION
: return "SECTION";
7051 case STT_FILE
: return "FILE";
7052 case STT_COMMON
: return "COMMON";
7053 case STT_TLS
: return "TLS";
7054 case STT_RELC
: return "RELC";
7055 case STT_SRELC
: return "SRELC";
7057 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
7059 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
7060 return "THUMB_FUNC";
7062 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
7065 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
7066 return "PARISC_MILLI";
7068 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"), type
);
7070 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
7072 if (elf_header
.e_machine
== EM_PARISC
)
7074 if (type
== STT_HP_OPAQUE
)
7076 if (type
== STT_HP_STUB
)
7080 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), type
);
7083 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), type
);
7089 get_symbol_visibility (unsigned int visibility
)
7093 case STV_DEFAULT
: return "DEFAULT";
7094 case STV_INTERNAL
: return "INTERNAL";
7095 case STV_HIDDEN
: return "HIDDEN";
7096 case STV_PROTECTED
: return "PROTECTED";
7102 get_mips_symbol_other (unsigned int other
)
7106 case STO_OPTIONAL
: return "OPTIONAL";
7107 case STO_MIPS16
: return "MIPS16";
7108 default: return NULL
;
7113 get_symbol_other (unsigned int other
)
7115 const char * result
= NULL
;
7116 static char buff
[32];
7121 switch (elf_header
.e_machine
)
7124 result
= get_mips_symbol_other (other
);
7132 snprintf (buff
, sizeof buff
, _("<other>: %x"), other
);
7137 get_symbol_index_type (unsigned int type
)
7139 static char buff
[32];
7143 case SHN_UNDEF
: return "UND";
7144 case SHN_ABS
: return "ABS";
7145 case SHN_COMMON
: return "COM";
7147 if (type
== SHN_IA_64_ANSI_COMMON
7148 && elf_header
.e_machine
== EM_IA_64
7149 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
7151 else if (elf_header
.e_machine
== EM_X86_64
7152 && type
== SHN_X86_64_LCOMMON
)
7154 else if (type
== SHN_MIPS_SCOMMON
7155 && elf_header
.e_machine
== EM_MIPS
)
7157 else if (type
== SHN_MIPS_SUNDEFINED
7158 && elf_header
.e_machine
== EM_MIPS
)
7160 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
7161 sprintf (buff
, "PRC[0x%04x]", type
);
7162 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
7163 sprintf (buff
, "OS [0x%04x]", type
);
7164 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
7165 sprintf (buff
, "RSV[0x%04x]", type
);
7167 sprintf (buff
, "%3d", type
);
7175 get_dynamic_data (FILE *file
, unsigned int number
, unsigned int ent_size
)
7177 unsigned char *e_data
;
7180 e_data
= cmalloc (number
, ent_size
);
7184 error (_("Out of memory\n"));
7188 if (fread (e_data
, ent_size
, number
, file
) != number
)
7190 error (_("Unable to read in dynamic data\n"));
7194 i_data
= cmalloc (number
, sizeof (*i_data
));
7198 error (_("Out of memory\n"));
7204 i_data
[number
] = byte_get (e_data
+ number
* ent_size
, ent_size
);
7212 print_dynamic_symbol (bfd_vma si
, unsigned long hn
)
7214 Elf_Internal_Sym
*psym
;
7217 psym
= dynamic_symbols
+ si
;
7219 n
= print_vma (si
, DEC_5
);
7221 fputs (" " + n
, stdout
);
7222 printf (" %3lu: ", hn
);
7223 print_vma (psym
->st_value
, LONG_HEX
);
7225 print_vma (psym
->st_size
, DEC_5
);
7227 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
7228 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
7229 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
7230 /* Check to see if any other bits in the st_other field are set.
7231 Note - displaying this information disrupts the layout of the
7232 table being generated, but for the moment this case is very
7234 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
7235 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
7236 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
7237 if (VALID_DYNAMIC_NAME (psym
->st_name
))
7238 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
7240 printf (" <corrupt: %14ld>", psym
->st_name
);
7244 /* Dump the symbol table. */
7246 process_symbol_table (FILE *file
)
7248 Elf_Internal_Shdr
*section
;
7249 bfd_vma nbuckets
= 0;
7250 bfd_vma nchains
= 0;
7251 bfd_vma
*buckets
= NULL
;
7252 bfd_vma
*chains
= NULL
;
7253 bfd_vma ngnubuckets
= 0;
7254 bfd_vma
*gnubuckets
= NULL
;
7255 bfd_vma
*gnuchains
= NULL
;
7256 bfd_vma gnusymidx
= 0;
7258 if (! do_syms
&& !do_histogram
)
7261 if (dynamic_info
[DT_HASH
]
7263 || (do_using_dynamic
&& dynamic_strings
!= NULL
)))
7265 unsigned char nb
[8];
7266 unsigned char nc
[8];
7267 int hash_ent_size
= 4;
7269 if ((elf_header
.e_machine
== EM_ALPHA
7270 || elf_header
.e_machine
== EM_S390
7271 || elf_header
.e_machine
== EM_S390_OLD
)
7272 && elf_header
.e_ident
[EI_CLASS
] == ELFCLASS64
)
7276 (archive_file_offset
7277 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
7278 sizeof nb
+ sizeof nc
)),
7281 error (_("Unable to seek to start of dynamic information\n"));
7285 if (fread (nb
, hash_ent_size
, 1, file
) != 1)
7287 error (_("Failed to read in number of buckets\n"));
7291 if (fread (nc
, hash_ent_size
, 1, file
) != 1)
7293 error (_("Failed to read in number of chains\n"));
7297 nbuckets
= byte_get (nb
, hash_ent_size
);
7298 nchains
= byte_get (nc
, hash_ent_size
);
7300 buckets
= get_dynamic_data (file
, nbuckets
, hash_ent_size
);
7301 chains
= get_dynamic_data (file
, nchains
, hash_ent_size
);
7303 if (buckets
== NULL
|| chains
== NULL
)
7307 if (dynamic_info_DT_GNU_HASH
7309 || (do_using_dynamic
&& dynamic_strings
!= NULL
)))
7311 unsigned char nb
[16];
7312 bfd_vma i
, maxchain
= 0xffffffff, bitmaskwords
;
7313 bfd_vma buckets_vma
;
7316 (archive_file_offset
7317 + offset_from_vma (file
, dynamic_info_DT_GNU_HASH
,
7321 error (_("Unable to seek to start of dynamic information\n"));
7325 if (fread (nb
, 16, 1, file
) != 1)
7327 error (_("Failed to read in number of buckets\n"));
7331 ngnubuckets
= byte_get (nb
, 4);
7332 gnusymidx
= byte_get (nb
+ 4, 4);
7333 bitmaskwords
= byte_get (nb
+ 8, 4);
7334 buckets_vma
= dynamic_info_DT_GNU_HASH
+ 16;
7336 buckets_vma
+= bitmaskwords
* 4;
7338 buckets_vma
+= bitmaskwords
* 8;
7341 (archive_file_offset
7342 + offset_from_vma (file
, buckets_vma
, 4)),
7345 error (_("Unable to seek to start of dynamic information\n"));
7349 gnubuckets
= get_dynamic_data (file
, ngnubuckets
, 4);
7351 if (gnubuckets
== NULL
)
7354 for (i
= 0; i
< ngnubuckets
; i
++)
7355 if (gnubuckets
[i
] != 0)
7357 if (gnubuckets
[i
] < gnusymidx
)
7360 if (maxchain
== 0xffffffff || gnubuckets
[i
] > maxchain
)
7361 maxchain
= gnubuckets
[i
];
7364 if (maxchain
== 0xffffffff)
7367 maxchain
-= gnusymidx
;
7370 (archive_file_offset
7371 + offset_from_vma (file
, buckets_vma
7372 + 4 * (ngnubuckets
+ maxchain
), 4)),
7375 error (_("Unable to seek to start of dynamic information\n"));
7381 if (fread (nb
, 4, 1, file
) != 1)
7383 error (_("Failed to determine last chain length\n"));
7387 if (maxchain
+ 1 == 0)
7392 while ((byte_get (nb
, 4) & 1) == 0);
7395 (archive_file_offset
7396 + offset_from_vma (file
, buckets_vma
+ 4 * ngnubuckets
, 4)),
7399 error (_("Unable to seek to start of dynamic information\n"));
7403 gnuchains
= get_dynamic_data (file
, maxchain
, 4);
7405 if (gnuchains
== NULL
)
7409 if ((dynamic_info
[DT_HASH
] || dynamic_info_DT_GNU_HASH
)
7412 && dynamic_strings
!= NULL
)
7416 if (dynamic_info
[DT_HASH
])
7420 printf (_("\nSymbol table for image:\n"));
7422 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7424 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7426 for (hn
= 0; hn
< nbuckets
; hn
++)
7431 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
7432 print_dynamic_symbol (si
, hn
);
7436 if (dynamic_info_DT_GNU_HASH
)
7438 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
7440 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7442 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7444 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7445 if (gnubuckets
[hn
] != 0)
7447 bfd_vma si
= gnubuckets
[hn
];
7448 bfd_vma off
= si
- gnusymidx
;
7452 print_dynamic_symbol (si
, hn
);
7455 while ((gnuchains
[off
++] & 1) == 0);
7459 else if (do_syms
&& !do_using_dynamic
)
7463 for (i
= 0, section
= section_headers
;
7464 i
< elf_header
.e_shnum
;
7468 char *strtab
= NULL
;
7469 unsigned long int strtab_size
= 0;
7470 Elf_Internal_Sym
*symtab
;
7471 Elf_Internal_Sym
*psym
;
7474 if ( section
->sh_type
!= SHT_SYMTAB
7475 && section
->sh_type
!= SHT_DYNSYM
)
7478 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
7479 SECTION_NAME (section
),
7480 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
7482 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7484 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7486 symtab
= GET_ELF_SYMBOLS (file
, section
);
7490 if (section
->sh_link
== elf_header
.e_shstrndx
)
7492 strtab
= string_table
;
7493 strtab_size
= string_table_length
;
7495 else if (SECTION_HEADER_INDEX (section
->sh_link
) < elf_header
.e_shnum
)
7497 Elf_Internal_Shdr
*string_sec
;
7499 string_sec
= SECTION_HEADER (section
->sh_link
);
7501 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
7502 1, string_sec
->sh_size
, _("string table"));
7503 strtab_size
= strtab
!= NULL
? string_sec
->sh_size
: 0;
7506 for (si
= 0, psym
= symtab
;
7507 si
< section
->sh_size
/ section
->sh_entsize
;
7510 printf ("%6d: ", si
);
7511 print_vma (psym
->st_value
, LONG_HEX
);
7513 print_vma (psym
->st_size
, DEC_5
);
7514 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
7515 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
7516 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
7517 /* Check to see if any other bits in the st_other field are set.
7518 Note - displaying this information disrupts the layout of the
7519 table being generated, but for the moment this case is very rare. */
7520 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
7521 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
7522 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
7523 print_symbol (25, psym
->st_name
< strtab_size
7524 ? strtab
+ psym
->st_name
: "<corrupt>");
7526 if (section
->sh_type
== SHT_DYNSYM
&&
7527 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
7529 unsigned char data
[2];
7530 unsigned short vers_data
;
7531 unsigned long offset
;
7535 offset
= offset_from_vma
7536 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
7537 sizeof data
+ si
* sizeof (vers_data
));
7539 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
7540 sizeof (data
), 1, _("version data"));
7542 vers_data
= byte_get (data
, 2);
7544 is_nobits
= (SECTION_HEADER_INDEX (psym
->st_shndx
)
7545 < elf_header
.e_shnum
7546 && SECTION_HEADER (psym
->st_shndx
)->sh_type
7549 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
7551 if ((vers_data
& 0x8000) || vers_data
> 1)
7553 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
7554 && (is_nobits
|| ! check_def
))
7556 Elf_External_Verneed evn
;
7557 Elf_Internal_Verneed ivn
;
7558 Elf_Internal_Vernaux ivna
;
7560 /* We must test both. */
7561 offset
= offset_from_vma
7562 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
7567 unsigned long vna_off
;
7569 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
7572 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
7573 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
7575 vna_off
= offset
+ ivn
.vn_aux
;
7579 Elf_External_Vernaux evna
;
7581 get_data (&evna
, file
, vna_off
,
7583 _("version need aux (3)"));
7585 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
7586 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
7587 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
7589 vna_off
+= ivna
.vna_next
;
7591 while (ivna
.vna_other
!= vers_data
7592 && ivna
.vna_next
!= 0);
7594 if (ivna
.vna_other
== vers_data
)
7597 offset
+= ivn
.vn_next
;
7599 while (ivn
.vn_next
!= 0);
7601 if (ivna
.vna_other
== vers_data
)
7604 ivna
.vna_name
< strtab_size
7605 ? strtab
+ ivna
.vna_name
: "<corrupt>",
7609 else if (! is_nobits
)
7610 error (_("bad dynamic symbol\n"));
7617 if (vers_data
!= 0x8001
7618 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
7620 Elf_Internal_Verdef ivd
;
7621 Elf_Internal_Verdaux ivda
;
7622 Elf_External_Verdaux evda
;
7623 unsigned long offset
;
7625 offset
= offset_from_vma
7627 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
7628 sizeof (Elf_External_Verdef
));
7632 Elf_External_Verdef evd
;
7634 get_data (&evd
, file
, offset
, sizeof (evd
),
7635 1, _("version def"));
7637 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
7638 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
7639 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
7641 offset
+= ivd
.vd_next
;
7643 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
7644 && ivd
.vd_next
!= 0);
7646 offset
-= ivd
.vd_next
;
7647 offset
+= ivd
.vd_aux
;
7649 get_data (&evda
, file
, offset
, sizeof (evda
),
7650 1, _("version def aux"));
7652 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
7654 if (psym
->st_name
!= ivda
.vda_name
)
7655 printf ((vers_data
& 0x8000)
7657 ivda
.vda_name
< strtab_size
7658 ? strtab
+ ivda
.vda_name
: "<corrupt>");
7668 if (strtab
!= string_table
)
7674 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
7676 if (do_histogram
&& buckets
!= NULL
)
7678 unsigned long *lengths
;
7679 unsigned long *counts
;
7682 unsigned long maxlength
= 0;
7683 unsigned long nzero_counts
= 0;
7684 unsigned long nsyms
= 0;
7686 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
7687 (unsigned long) nbuckets
);
7688 printf (_(" Length Number %% of total Coverage\n"));
7690 lengths
= calloc (nbuckets
, sizeof (*lengths
));
7691 if (lengths
== NULL
)
7693 error (_("Out of memory\n"));
7696 for (hn
= 0; hn
< nbuckets
; ++hn
)
7698 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
7701 if (maxlength
< ++lengths
[hn
])
7706 counts
= calloc (maxlength
+ 1, sizeof (*counts
));
7709 error (_("Out of memory\n"));
7713 for (hn
= 0; hn
< nbuckets
; ++hn
)
7714 ++counts
[lengths
[hn
]];
7719 printf (" 0 %-10lu (%5.1f%%)\n",
7720 counts
[0], (counts
[0] * 100.0) / nbuckets
);
7721 for (i
= 1; i
<= maxlength
; ++i
)
7723 nzero_counts
+= counts
[i
] * i
;
7724 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7725 i
, counts
[i
], (counts
[i
] * 100.0) / nbuckets
,
7726 (nzero_counts
* 100.0) / nsyms
);
7734 if (buckets
!= NULL
)
7740 if (do_histogram
&& dynamic_info_DT_GNU_HASH
)
7742 unsigned long *lengths
;
7743 unsigned long *counts
;
7745 unsigned long maxlength
= 0;
7746 unsigned long nzero_counts
= 0;
7747 unsigned long nsyms
= 0;
7749 lengths
= calloc (ngnubuckets
, sizeof (*lengths
));
7750 if (lengths
== NULL
)
7752 error (_("Out of memory\n"));
7756 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
7757 (unsigned long) ngnubuckets
);
7758 printf (_(" Length Number %% of total Coverage\n"));
7760 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7761 if (gnubuckets
[hn
] != 0)
7763 bfd_vma off
, length
= 1;
7765 for (off
= gnubuckets
[hn
] - gnusymidx
;
7766 (gnuchains
[off
] & 1) == 0; ++off
)
7768 lengths
[hn
] = length
;
7769 if (length
> maxlength
)
7774 counts
= calloc (maxlength
+ 1, sizeof (*counts
));
7777 error (_("Out of memory\n"));
7781 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7782 ++counts
[lengths
[hn
]];
7784 if (ngnubuckets
> 0)
7787 printf (" 0 %-10lu (%5.1f%%)\n",
7788 counts
[0], (counts
[0] * 100.0) / ngnubuckets
);
7789 for (j
= 1; j
<= maxlength
; ++j
)
7791 nzero_counts
+= counts
[j
] * j
;
7792 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7793 j
, counts
[j
], (counts
[j
] * 100.0) / ngnubuckets
,
7794 (nzero_counts
* 100.0) / nsyms
);
7808 process_syminfo (FILE *file ATTRIBUTE_UNUSED
)
7812 if (dynamic_syminfo
== NULL
7814 /* No syminfo, this is ok. */
7817 /* There better should be a dynamic symbol section. */
7818 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
7822 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
7823 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
7825 printf (_(" Num: Name BoundTo Flags\n"));
7826 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
7828 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
7830 printf ("%4d: ", i
);
7831 if (VALID_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
))
7832 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
));
7834 printf ("<corrupt: %19ld>", dynamic_symbols
[i
].st_name
);
7837 switch (dynamic_syminfo
[i
].si_boundto
)
7839 case SYMINFO_BT_SELF
:
7840 fputs ("SELF ", stdout
);
7842 case SYMINFO_BT_PARENT
:
7843 fputs ("PARENT ", stdout
);
7846 if (dynamic_syminfo
[i
].si_boundto
> 0
7847 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
7848 && VALID_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
7850 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
7854 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
7858 if (flags
& SYMINFO_FLG_DIRECT
)
7860 if (flags
& SYMINFO_FLG_PASSTHRU
)
7861 printf (" PASSTHRU");
7862 if (flags
& SYMINFO_FLG_COPY
)
7864 if (flags
& SYMINFO_FLG_LAZYLOAD
)
7865 printf (" LAZYLOAD");
7873 #ifdef SUPPORT_DISASSEMBLY
7875 disassemble_section (Elf_Internal_Shdr
*section
, FILE *file
)
7877 printf (_("\nAssembly dump of section %s\n"),
7878 SECTION_NAME (section
));
7880 /* XXX -- to be done --- XXX */
7887 dump_section_as_strings (Elf_Internal_Shdr
*section
, FILE *file
)
7889 Elf_Internal_Shdr
*relsec
;
7890 bfd_size_type num_bytes
;
7895 char *name
= SECTION_NAME (section
);
7896 bfd_boolean some_strings_shown
;
7898 num_bytes
= section
->sh_size
;
7900 if (num_bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
7902 printf (_("\nSection '%s' has no data to dump.\n"), name
);
7906 addr
= section
->sh_addr
;
7908 start
= get_data (NULL
, file
, section
->sh_offset
, 1, num_bytes
,
7913 printf (_("\nString dump of section '%s':\n"), name
);
7915 /* If the section being dumped has relocations against it the user might
7916 be expecting these relocations to have been applied. Check for this
7917 case and issue a warning message in order to avoid confusion.
7918 FIXME: Maybe we ought to have an option that dumps a section with
7920 for (relsec
= section_headers
;
7921 relsec
< section_headers
+ elf_header
.e_shnum
;
7924 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
7925 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
7926 || SECTION_HEADER (relsec
->sh_info
) != section
7927 || relsec
->sh_size
== 0
7928 || SECTION_HEADER_INDEX (relsec
->sh_link
) >= elf_header
.e_shnum
)
7931 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
7936 end
= start
+ num_bytes
;
7937 some_strings_shown
= FALSE
;
7941 while (!ISPRINT (* data
))
7948 printf (" [%6tx] %s\n", data
- start
, data
);
7950 printf (" [%6Ix] %s\n", (size_t) (data
- start
), data
);
7952 data
+= strlen (data
);
7953 some_strings_shown
= TRUE
;
7957 if (! some_strings_shown
)
7958 printf (_(" No strings found in this section."));
7968 dump_section_as_bytes (Elf_Internal_Shdr
*section
, FILE *file
)
7970 Elf_Internal_Shdr
*relsec
;
7971 bfd_size_type bytes
;
7973 unsigned char *data
;
7974 unsigned char *start
;
7976 bytes
= section
->sh_size
;
7978 if (bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
7980 printf (_("\nSection '%s' has no data to dump.\n"),
7981 SECTION_NAME (section
));
7985 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
7987 addr
= section
->sh_addr
;
7989 start
= get_data (NULL
, file
, section
->sh_offset
, 1, bytes
,
7994 /* If the section being dumped has relocations against it the user might
7995 be expecting these relocations to have been applied. Check for this
7996 case and issue a warning message in order to avoid confusion.
7997 FIXME: Maybe we ought to have an option that dumps a section with
7999 for (relsec
= section_headers
;
8000 relsec
< section_headers
+ elf_header
.e_shnum
;
8003 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
8004 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
8005 || SECTION_HEADER (relsec
->sh_info
) != section
8006 || relsec
->sh_size
== 0
8007 || SECTION_HEADER_INDEX (relsec
->sh_link
) >= elf_header
.e_shnum
)
8010 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
8022 lbytes
= (bytes
> 16 ? 16 : bytes
);
8024 printf (" 0x%8.8lx ", (unsigned long) addr
);
8026 for (j
= 0; j
< 16; j
++)
8029 printf ("%2.2x", data
[j
]);
8037 for (j
= 0; j
< lbytes
; j
++)
8040 if (k
>= ' ' && k
< 0x7f)
8059 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
8060 DWARF debug sections. This is a target specific test. Note - we do not
8061 go through the whole including-target-headers-multiple-times route, (as
8062 we have already done with <elf/h8.h>) because this would become very
8063 messy and even then this function would have to contain target specific
8064 information (the names of the relocs instead of their numeric values).
8065 FIXME: This is not the correct way to solve this problem. The proper way
8066 is to have target specific reloc sizing and typing functions created by
8067 the reloc-macros.h header, in the same way that it already creates the
8068 reloc naming functions. */
8071 is_32bit_abs_reloc (unsigned int reloc_type
)
8073 switch (elf_header
.e_machine
)
8077 return reloc_type
== 1; /* R_386_32. */
8079 return reloc_type
== 1; /* R_68K_32. */
8081 return reloc_type
== 1; /* R_860_32. */
8083 return reloc_type
== 1; /* XXX Is this right ? */
8085 return reloc_type
== 1; /* R_ARC_32. */
8087 return reloc_type
== 2; /* R_ARM_ABS32 */
8090 return reloc_type
== 1;
8092 return reloc_type
== 0x12; /* R_byte4_data. */
8094 return reloc_type
== 3; /* R_CRIS_32. */
8096 return reloc_type
== 3; /* R_CR16_NUM32. */
8098 return reloc_type
== 15; /* R_CRX_NUM32. */
8100 return reloc_type
== 1;
8101 case EM_CYGNUS_D10V
:
8103 return reloc_type
== 6; /* R_D10V_32. */
8104 case EM_CYGNUS_D30V
:
8106 return reloc_type
== 12; /* R_D30V_32_NORMAL. */
8108 return reloc_type
== 3; /* R_DLX_RELOC_32. */
8109 case EM_CYGNUS_FR30
:
8111 return reloc_type
== 3; /* R_FR30_32. */
8115 return reloc_type
== 1; /* R_H8_DIR32. */
8117 return reloc_type
== 0x65; /* R_IA64_SECREL32LSB. */
8120 return reloc_type
== 2; /* R_IP2K_32. */
8122 return reloc_type
== 2; /* R_IQ2000_32. */
8124 return reloc_type
== 3; /* R_M32C_32. */
8126 return reloc_type
== 34; /* R_M32R_32_RELA. */
8128 return reloc_type
== 1; /* R_MCORE_ADDR32. */
8130 return reloc_type
== 4; /* R_MEP_32. */
8132 return reloc_type
== 2; /* R_MIPS_32. */
8134 return reloc_type
== 4; /* R_MMIX_32. */
8135 case EM_CYGNUS_MN10200
:
8137 return reloc_type
== 1; /* R_MN10200_32. */
8138 case EM_CYGNUS_MN10300
:
8140 return reloc_type
== 1; /* R_MN10300_32. */
8143 return reloc_type
== 1; /* R_MSP43_32. */
8145 return reloc_type
== 2; /* R_MT_32. */
8146 case EM_ALTERA_NIOS2
:
8148 return reloc_type
== 1; /* R_NIOS_32. */
8151 return reloc_type
== 1; /* R_OR32_32. */
8153 return reloc_type
== 1; /* R_PARISC_DIR32. */
8156 return reloc_type
== 1; /* R_PJ_DATA_DIR32. */
8158 return reloc_type
== 1; /* R_PPC64_ADDR32. */
8160 return reloc_type
== 1; /* R_PPC_ADDR32. */
8162 return reloc_type
== 1; /* R_I370_ADDR31. */
8165 return reloc_type
== 4; /* R_S390_32. */
8167 return reloc_type
== 8; /* R_SCORE_ABS32. */
8169 return reloc_type
== 1; /* R_SH_DIR32. */
8170 case EM_SPARC32PLUS
:
8173 return reloc_type
== 3 /* R_SPARC_32. */
8174 || reloc_type
== 23; /* R_SPARC_UA32. */
8176 return reloc_type
== 6; /* R_SPU_ADDR32 */
8177 case EM_CYGNUS_V850
:
8179 return reloc_type
== 6; /* R_V850_ABS32. */
8181 return reloc_type
== 1; /* R_VAX_32. */
8183 return reloc_type
== 10; /* R_X86_64_32. */
8185 return reloc_type
== 1; /* R_XSTROMY16_32. */
8188 return reloc_type
== 1; /* R_XTENSA_32. */
8191 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
8192 elf_header
.e_machine
);
8197 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8198 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
8201 is_32bit_pcrel_reloc (unsigned int reloc_type
)
8203 switch (elf_header
.e_machine
)
8207 return reloc_type
== 2; /* R_386_PC32. */
8209 return reloc_type
== 4; /* R_68K_PC32. */
8211 return reloc_type
== 10; /* R_ALPHA_SREL32. */
8213 return reloc_type
== 3; /* R_ARM_REL32 */
8215 return reloc_type
== 0; /* R_PARISC_NONE. *//* FIXME: This reloc is generated, but it may be a bug. */
8217 return reloc_type
== 26; /* R_PPC_REL32. */
8219 return reloc_type
== 26; /* R_PPC64_REL32. */
8222 return reloc_type
== 5; /* R_390_PC32. */
8224 return reloc_type
== 2; /* R_SH_REL32. */
8225 case EM_SPARC32PLUS
:
8228 return reloc_type
== 6; /* R_SPARC_DISP32. */
8230 return reloc_type
== 13; /* R_SPU_REL32. */
8232 return reloc_type
== 2; /* R_X86_64_PC32. */
8235 return reloc_type
== 14; /* R_XTENSA_32_PCREL. */
8237 /* Do not abort or issue an error message here. Not all targets use
8238 pc-relative 32-bit relocs in their DWARF debug information and we
8239 have already tested for target coverage in is_32bit_abs_reloc. A
8240 more helpful warning message will be generated by
8241 debug_apply_relocations anyway, so just return. */
8246 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8247 a 64-bit absolute RELA relocation used in DWARF debug sections. */
8250 is_64bit_abs_reloc (unsigned int reloc_type
)
8252 switch (elf_header
.e_machine
)
8255 return reloc_type
== 2; /* R_ALPHA_REFQUAD. */
8257 return reloc_type
== 0x27; /* R_IA64_DIR64LSB. */
8259 return reloc_type
== 80; /* R_PARISC_DIR64. */
8261 return reloc_type
== 38; /* R_PPC64_ADDR64. */
8262 case EM_SPARC32PLUS
:
8265 return reloc_type
== 54; /* R_SPARC_UA64. */
8267 return reloc_type
== 1; /* R_X86_64_64. */
8270 return reloc_type
== 22; /* R_S390_64 */
8276 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8277 a 16-bit absolute RELA relocation used in DWARF debug sections. */
8280 is_16bit_abs_reloc (unsigned int reloc_type
)
8282 switch (elf_header
.e_machine
)
8286 return reloc_type
== 4; /* R_AVR_16. */
8287 case EM_CYGNUS_D10V
:
8289 return reloc_type
== 3; /* R_D10V_16. */
8293 return reloc_type
== R_H8_DIR16
;
8296 return reloc_type
== 1; /* R_IP2K_16. */
8298 return reloc_type
== 1; /* R_M32C_16 */
8301 return reloc_type
== 5; /* R_MSP430_16_BYTE. */
8302 case EM_ALTERA_NIOS2
:
8304 return reloc_type
== 9; /* R_NIOS_16. */
8310 /* Apply relocations to a debug section. */
8313 debug_apply_relocations (void *file
,
8314 Elf_Internal_Shdr
*section
,
8315 unsigned char *start
)
8317 Elf_Internal_Shdr
*relsec
;
8318 unsigned char *end
= start
+ section
->sh_size
;
8320 if (elf_header
.e_type
!= ET_REL
)
8323 /* Find the reloc section associated with the debug section. */
8324 for (relsec
= section_headers
;
8325 relsec
< section_headers
+ elf_header
.e_shnum
;
8328 bfd_boolean is_rela
;
8329 unsigned long num_relocs
;
8330 Elf_Internal_Rela
*relocs
, *rp
;
8331 Elf_Internal_Shdr
*symsec
;
8332 Elf_Internal_Sym
*symtab
;
8333 Elf_Internal_Sym
*sym
;
8335 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
8336 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
8337 || SECTION_HEADER (relsec
->sh_info
) != section
8338 || relsec
->sh_size
== 0
8339 || SECTION_HEADER_INDEX (relsec
->sh_link
) >= elf_header
.e_shnum
)
8342 is_rela
= relsec
->sh_type
== SHT_RELA
;
8346 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
8347 & relocs
, & num_relocs
))
8352 if (!slurp_rel_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
8353 & relocs
, & num_relocs
))
8357 /* SH uses RELA but uses in place value instead of the addend field. */
8358 if (elf_header
.e_machine
== EM_SH
)
8361 symsec
= SECTION_HEADER (relsec
->sh_link
);
8362 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
8364 for (rp
= relocs
; rp
< relocs
+ num_relocs
; ++rp
)
8367 unsigned int reloc_type
;
8368 unsigned int reloc_size
;
8369 unsigned char * loc
;
8371 /* In MIPS little-endian objects, r_info isn't really a
8372 64-bit little-endian value: it has a 32-bit little-endian
8373 symbol index followed by four individual byte fields.
8374 Reorder INFO accordingly. */
8376 && elf_header
.e_machine
== EM_MIPS
8377 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
8378 rp
->r_info
= (((rp
->r_info
& 0xffffffff) << 32)
8379 | ((rp
->r_info
>> 56) & 0xff)
8380 | ((rp
->r_info
>> 40) & 0xff00)
8381 | ((rp
->r_info
>> 24) & 0xff0000)
8382 | ((rp
->r_info
>> 8) & 0xff000000));
8384 reloc_type
= get_reloc_type (rp
->r_info
);
8386 if (is_32bit_abs_reloc (reloc_type
)
8387 || is_32bit_pcrel_reloc (reloc_type
))
8389 else if (is_64bit_abs_reloc (reloc_type
))
8391 else if (is_16bit_abs_reloc (reloc_type
))
8395 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
8396 reloc_type
, SECTION_NAME (section
));
8400 loc
= start
+ rp
->r_offset
;
8401 if ((loc
+ reloc_size
) > end
)
8403 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
8404 (unsigned long) rp
->r_offset
,
8405 SECTION_NAME (section
));
8409 sym
= symtab
+ get_reloc_symindex (rp
->r_info
);
8411 /* If the reloc has a symbol associated with it,
8412 make sure that it is of an appropriate type. */
8414 && ELF_ST_TYPE (sym
->st_info
) != STT_SECTION
8415 /* Relocations against symbols without type can happen.
8416 Gcc -feliminate-dwarf2-dups may generate symbols
8417 without type for debug info. */
8418 && ELF_ST_TYPE (sym
->st_info
) != STT_NOTYPE
8419 /* Relocations against object symbols can happen,
8420 eg when referencing a global array. For an
8421 example of this see the _clz.o binary in libgcc.a. */
8422 && ELF_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
8424 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
8425 get_symbol_type (ELF_ST_TYPE (sym
->st_info
)),
8426 (long int)(rp
- relocs
),
8427 SECTION_NAME (relsec
));
8431 addend
= is_rela
? rp
->r_addend
: byte_get (loc
, reloc_size
);
8433 if (is_32bit_pcrel_reloc (reloc_type
))
8434 byte_put (loc
, (addend
+ sym
->st_value
) - rp
->r_offset
,
8437 byte_put (loc
, addend
+ sym
->st_value
, reloc_size
);
8447 load_debug_section (enum dwarf_section_display_enum debug
, void *file
)
8449 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
8450 Elf_Internal_Shdr
*sec
;
8453 /* If it is already loaded, do nothing. */
8454 if (section
->start
!= NULL
)
8457 /* Locate the debug section. */
8458 sec
= find_section (section
->name
);
8462 snprintf (buf
, sizeof (buf
), _("%s section data"), section
->name
);
8463 section
->address
= sec
->sh_addr
;
8464 section
->size
= sec
->sh_size
;
8465 section
->start
= get_data (NULL
, file
, sec
->sh_offset
, 1,
8468 if (debug_displays
[debug
].relocate
)
8469 debug_apply_relocations (file
, sec
, section
->start
);
8471 return section
->start
!= NULL
;
8475 free_debug_section (enum dwarf_section_display_enum debug
)
8477 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
8479 if (section
->start
== NULL
)
8482 free ((char *) section
->start
);
8483 section
->start
= NULL
;
8484 section
->address
= 0;
8489 display_debug_section (Elf_Internal_Shdr
*section
, FILE *file
)
8491 char *name
= SECTION_NAME (section
);
8492 bfd_size_type length
;
8494 enum dwarf_section_display_enum i
;
8496 length
= section
->sh_size
;
8499 printf (_("\nSection '%s' has no debugging data.\n"), name
);
8503 if (const_strneq (name
, ".gnu.linkonce.wi."))
8504 name
= ".debug_info";
8506 /* See if we know how to display the contents of this section. */
8507 for (i
= 0; i
< max
; i
++)
8508 if (streq (debug_displays
[i
].section
.name
, name
))
8510 struct dwarf_section
*sec
= &debug_displays
[i
].section
;
8512 if (load_debug_section (i
, file
))
8514 result
&= debug_displays
[i
].display (sec
, file
);
8516 if (i
!= info
&& i
!= abbrev
)
8517 free_debug_section (i
);
8525 printf (_("Unrecognized debug section: %s\n"), name
);
8532 /* Set DUMP_SECTS for all sections where dumps were requested
8533 based on section name. */
8536 initialise_dumps_byname (void)
8538 struct dump_list_entry
*cur
;
8540 for (cur
= dump_sects_byname
; cur
; cur
= cur
->next
)
8545 for (i
= 0, any
= 0; i
< elf_header
.e_shnum
; i
++)
8546 if (streq (SECTION_NAME (section_headers
+ i
), cur
->name
))
8548 request_dump_bynumber (i
, cur
->type
);
8553 warn (_("Section '%s' was not dumped because it does not exist!\n"),
8559 process_section_contents (FILE *file
)
8561 Elf_Internal_Shdr
*section
;
8567 initialise_dumps_byname ();
8569 for (i
= 0, section
= section_headers
;
8570 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
8573 #ifdef SUPPORT_DISASSEMBLY
8574 if (dump_sects
[i
] & DISASS_DUMP
)
8575 disassemble_section (section
, file
);
8577 if (dump_sects
[i
] & HEX_DUMP
)
8578 dump_section_as_bytes (section
, file
);
8580 if (dump_sects
[i
] & DEBUG_DUMP
)
8581 display_debug_section (section
, file
);
8583 if (dump_sects
[i
] & STRING_DUMP
)
8584 dump_section_as_strings (section
, file
);
8587 /* Check to see if the user requested a
8588 dump of a section that does not exist. */
8589 while (i
++ < num_dump_sects
)
8591 warn (_("Section %d was not dumped because it does not exist!\n"), i
);
8595 process_mips_fpe_exception (int mask
)
8600 if (mask
& OEX_FPU_INEX
)
8601 fputs ("INEX", stdout
), first
= 0;
8602 if (mask
& OEX_FPU_UFLO
)
8603 printf ("%sUFLO", first
? "" : "|"), first
= 0;
8604 if (mask
& OEX_FPU_OFLO
)
8605 printf ("%sOFLO", first
? "" : "|"), first
= 0;
8606 if (mask
& OEX_FPU_DIV0
)
8607 printf ("%sDIV0", first
? "" : "|"), first
= 0;
8608 if (mask
& OEX_FPU_INVAL
)
8609 printf ("%sINVAL", first
? "" : "|");
8612 fputs ("0", stdout
);
8615 /* ARM EABI attributes section. */
8620 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
8623 } arm_attr_public_tag
;
8625 static const char *arm_attr_tag_CPU_arch
[] =
8626 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
8628 static const char *arm_attr_tag_ARM_ISA_use
[] = {"No", "Yes"};
8629 static const char *arm_attr_tag_THUMB_ISA_use
[] =
8630 {"No", "Thumb-1", "Thumb-2"};
8631 /* FIXME: VFPv3 encoding was extrapolated! */
8632 static const char *arm_attr_tag_VFP_arch
[] = {"No", "VFPv1", "VFPv2", "VFPv3"};
8633 static const char *arm_attr_tag_WMMX_arch
[] = {"No", "WMMXv1"};
8634 static const char *arm_attr_tag_NEON_arch
[] = {"No", "NEONv1"};
8635 static const char *arm_attr_tag_ABI_PCS_config
[] =
8636 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
8637 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
8638 static const char *arm_attr_tag_ABI_PCS_R9_use
[] =
8639 {"V6", "SB", "TLS", "Unused"};
8640 static const char *arm_attr_tag_ABI_PCS_RW_data
[] =
8641 {"Absolute", "PC-relative", "SB-relative", "None"};
8642 static const char *arm_attr_tag_ABI_PCS_RO_DATA
[] =
8643 {"Absolute", "PC-relative", "None"};
8644 static const char *arm_attr_tag_ABI_PCS_GOT_use
[] =
8645 {"None", "direct", "GOT-indirect"};
8646 static const char *arm_attr_tag_ABI_PCS_wchar_t
[] =
8647 {"None", "??? 1", "2", "??? 3", "4"};
8648 static const char *arm_attr_tag_ABI_FP_rounding
[] = {"Unused", "Needed"};
8649 static const char *arm_attr_tag_ABI_FP_denormal
[] = {"Unused", "Needed"};
8650 static const char *arm_attr_tag_ABI_FP_exceptions
[] = {"Unused", "Needed"};
8651 static const char *arm_attr_tag_ABI_FP_user_exceptions
[] = {"Unused", "Needed"};
8652 static const char *arm_attr_tag_ABI_FP_number_model
[] =
8653 {"Unused", "Finite", "RTABI", "IEEE 754"};
8654 static const char *arm_attr_tag_ABI_align8_needed
[] = {"No", "Yes", "4-byte"};
8655 static const char *arm_attr_tag_ABI_align8_preserved
[] =
8656 {"No", "Yes, except leaf SP", "Yes"};
8657 static const char *arm_attr_tag_ABI_enum_size
[] =
8658 {"Unused", "small", "int", "forced to int"};
8659 static const char *arm_attr_tag_ABI_HardFP_use
[] =
8660 {"As Tag_VFP_arch", "SP only", "DP only", "SP and DP"};
8661 static const char *arm_attr_tag_ABI_VFP_args
[] =
8662 {"AAPCS", "VFP registers", "custom"};
8663 static const char *arm_attr_tag_ABI_WMMX_args
[] =
8664 {"AAPCS", "WMMX registers", "custom"};
8665 static const char *arm_attr_tag_ABI_optimization_goals
[] =
8666 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
8667 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
8668 static const char *arm_attr_tag_ABI_FP_optimization_goals
[] =
8669 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
8670 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
8672 #define LOOKUP(id, name) \
8673 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
8674 static arm_attr_public_tag arm_attr_public_tags
[] =
8676 {4, "CPU_raw_name", 1, NULL
},
8677 {5, "CPU_name", 1, NULL
},
8678 LOOKUP(6, CPU_arch
),
8679 {7, "CPU_arch_profile", 0, NULL
},
8680 LOOKUP(8, ARM_ISA_use
),
8681 LOOKUP(9, THUMB_ISA_use
),
8682 LOOKUP(10, VFP_arch
),
8683 LOOKUP(11, WMMX_arch
),
8684 LOOKUP(12, NEON_arch
),
8685 LOOKUP(13, ABI_PCS_config
),
8686 LOOKUP(14, ABI_PCS_R9_use
),
8687 LOOKUP(15, ABI_PCS_RW_data
),
8688 LOOKUP(16, ABI_PCS_RO_DATA
),
8689 LOOKUP(17, ABI_PCS_GOT_use
),
8690 LOOKUP(18, ABI_PCS_wchar_t
),
8691 LOOKUP(19, ABI_FP_rounding
),
8692 LOOKUP(20, ABI_FP_denormal
),
8693 LOOKUP(21, ABI_FP_exceptions
),
8694 LOOKUP(22, ABI_FP_user_exceptions
),
8695 LOOKUP(23, ABI_FP_number_model
),
8696 LOOKUP(24, ABI_align8_needed
),
8697 LOOKUP(25, ABI_align8_preserved
),
8698 LOOKUP(26, ABI_enum_size
),
8699 LOOKUP(27, ABI_HardFP_use
),
8700 LOOKUP(28, ABI_VFP_args
),
8701 LOOKUP(29, ABI_WMMX_args
),
8702 LOOKUP(30, ABI_optimization_goals
),
8703 LOOKUP(31, ABI_FP_optimization_goals
),
8704 {32, "compatibility", 0, NULL
}
8708 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
8711 read_uleb128 (unsigned char *p
, unsigned int *plen
)
8725 val
|= ((unsigned int)c
& 0x7f) << shift
;
8734 static unsigned char *
8735 display_arm_attribute (unsigned char *p
)
8740 arm_attr_public_tag
*attr
;
8744 tag
= read_uleb128 (p
, &len
);
8747 for (i
= 0; i
< ARRAY_SIZE(arm_attr_public_tags
); i
++)
8749 if (arm_attr_public_tags
[i
].tag
== tag
)
8751 attr
= &arm_attr_public_tags
[i
];
8758 printf (" Tag_%s: ", attr
->name
);
8764 case 7: /* Tag_CPU_arch_profile. */
8765 val
= read_uleb128 (p
, &len
);
8769 case 0: printf ("None\n"); break;
8770 case 'A': printf ("Application\n"); break;
8771 case 'R': printf ("Realtime\n"); break;
8772 case 'M': printf ("Microcontroller\n"); break;
8773 default: printf ("??? (%d)\n", val
); break;
8777 case 32: /* Tag_compatibility. */
8778 val
= read_uleb128 (p
, &len
);
8780 printf ("flag = %d, vendor = %s\n", val
, p
);
8781 p
+= strlen((char *)p
) + 1;
8795 assert (attr
->type
& 0x80);
8796 val
= read_uleb128 (p
, &len
);
8798 type
= attr
->type
& 0x7f;
8800 printf ("??? (%d)\n", val
);
8802 printf ("%s\n", attr
->table
[val
]);
8809 type
= 1; /* String. */
8811 type
= 2; /* uleb128. */
8812 printf (" Tag_unknown_%d: ", tag
);
8817 printf ("\"%s\"\n", p
);
8818 p
+= strlen((char *)p
) + 1;
8822 val
= read_uleb128 (p
, &len
);
8824 printf ("%d (0x%x)\n", val
, val
);
8830 static unsigned char *
8831 display_gnu_attribute (unsigned char * p
,
8832 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, int))
8839 tag
= read_uleb128 (p
, &len
);
8842 /* Tag_compatibility is the only generic GNU attribute defined at
8846 val
= read_uleb128 (p
, &len
);
8848 printf ("flag = %d, vendor = %s\n", val
, p
);
8849 p
+= strlen ((char *) p
) + 1;
8853 if ((tag
& 2) == 0 && display_proc_gnu_attribute
)
8854 return display_proc_gnu_attribute (p
, tag
);
8857 type
= 1; /* String. */
8859 type
= 2; /* uleb128. */
8860 printf (" Tag_unknown_%d: ", tag
);
8864 printf ("\"%s\"\n", p
);
8865 p
+= strlen ((char *) p
) + 1;
8869 val
= read_uleb128 (p
, &len
);
8871 printf ("%d (0x%x)\n", val
, val
);
8877 static unsigned char *
8878 display_power_gnu_attribute (unsigned char *p
, int tag
)
8884 if (tag
== Tag_GNU_Power_ABI_FP
)
8886 val
= read_uleb128 (p
, &len
);
8888 printf (" Tag_GNU_Power_ABI_FP: ");
8893 printf ("Hard or soft float\n");
8896 printf ("Hard float\n");
8899 printf ("Soft float\n");
8902 printf ("??? (%d)\n", val
);
8908 if (tag
== Tag_GNU_Power_ABI_Vector
)
8910 val
= read_uleb128 (p
, &len
);
8912 printf (" Tag_GNU_Power_ABI_Vector: ");
8919 printf ("Generic\n");
8922 printf ("AltiVec\n");
8928 printf ("??? (%d)\n", val
);
8935 type
= 1; /* String. */
8937 type
= 2; /* uleb128. */
8938 printf (" Tag_unknown_%d: ", tag
);
8942 printf ("\"%s\"\n", p
);
8943 p
+= strlen ((char *) p
) + 1;
8947 val
= read_uleb128 (p
, &len
);
8949 printf ("%d (0x%x)\n", val
, val
);
8955 static unsigned char *
8956 display_mips_gnu_attribute (unsigned char *p
, int tag
)
8962 if (tag
== Tag_GNU_MIPS_ABI_FP
)
8964 val
= read_uleb128 (p
, &len
);
8966 printf (" Tag_GNU_MIPS_ABI_FP: ");
8971 printf ("Hard or soft float\n");
8974 printf ("Hard float (-mdouble-float)\n");
8977 printf ("Hard float (-msingle-float)\n");
8980 printf ("Soft float\n");
8983 printf ("64-bit float (-mips32r2 -mfp64)\n");
8986 printf ("??? (%d)\n", val
);
8993 type
= 1; /* String. */
8995 type
= 2; /* uleb128. */
8996 printf (" Tag_unknown_%d: ", tag
);
9000 printf ("\"%s\"\n", p
);
9001 p
+= strlen ((char *) p
) + 1;
9005 val
= read_uleb128 (p
, &len
);
9007 printf ("%d (0x%x)\n", val
, val
);
9014 process_attributes (FILE * file
,
9015 const char * public_name
,
9016 unsigned int proc_type
,
9017 unsigned char * (* display_pub_attribute
) (unsigned char *),
9018 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, int))
9020 Elf_Internal_Shdr
*sect
;
9021 unsigned char *contents
;
9024 bfd_vma section_len
;
9028 /* Find the section header so that we get the size. */
9029 for (i
= 0, sect
= section_headers
;
9030 i
< elf_header
.e_shnum
;
9033 if (sect
->sh_type
!= proc_type
&& sect
->sh_type
!= SHT_GNU_ATTRIBUTES
)
9036 contents
= get_data (NULL
, file
, sect
->sh_offset
, 1, sect
->sh_size
,
9038 if (contents
== NULL
)
9044 len
= sect
->sh_size
- 1;
9050 bfd_boolean public_section
;
9051 bfd_boolean gnu_section
;
9053 section_len
= byte_get (p
, 4);
9056 if (section_len
> len
)
9058 printf (_("ERROR: Bad section length (%d > %d)\n"),
9059 (int) section_len
, (int) len
);
9064 printf ("Attribute Section: %s\n", p
);
9066 if (public_name
&& streq ((char *) p
, public_name
))
9067 public_section
= TRUE
;
9069 public_section
= FALSE
;
9071 if (streq ((char *) p
, "gnu"))
9074 gnu_section
= FALSE
;
9076 namelen
= strlen ((char *) p
) + 1;
9078 section_len
-= namelen
+ 4;
9080 while (section_len
> 0)
9086 size
= byte_get (p
, 4);
9087 if (size
> section_len
)
9089 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
9090 (int) size
, (int) section_len
);
9094 section_len
-= size
;
9101 printf ("File Attributes\n");
9104 printf ("Section Attributes:");
9107 printf ("Symbol Attributes:");
9113 val
= read_uleb128 (p
, &i
);
9117 printf (" %d", val
);
9122 printf ("Unknown tag: %d\n", tag
);
9123 public_section
= FALSE
;
9130 p
= display_pub_attribute (p
);
9132 else if (gnu_section
)
9135 p
= display_gnu_attribute (p
,
9136 display_proc_gnu_attribute
);
9140 /* ??? Do something sensible, like dump hex. */
9141 printf (" Unknown section contexts\n");
9148 printf (_("Unknown format '%c'\n"), *p
);
9156 process_arm_specific (FILE *file
)
9158 return process_attributes (file
, "aeabi", SHT_ARM_ATTRIBUTES
,
9159 display_arm_attribute
, NULL
);
9163 process_power_specific (FILE *file
)
9165 return process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
9166 display_power_gnu_attribute
);
9170 process_mips_specific (FILE *file
)
9172 Elf_Internal_Dyn
*entry
;
9173 size_t liblist_offset
= 0;
9174 size_t liblistno
= 0;
9175 size_t conflictsno
= 0;
9176 size_t options_offset
= 0;
9177 size_t conflicts_offset
= 0;
9179 process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
9180 display_mips_gnu_attribute
);
9182 /* We have a lot of special sections. Thanks SGI! */
9183 if (dynamic_section
== NULL
)
9184 /* No information available. */
9187 for (entry
= dynamic_section
; entry
->d_tag
!= DT_NULL
; ++entry
)
9188 switch (entry
->d_tag
)
9190 case DT_MIPS_LIBLIST
:
9192 = offset_from_vma (file
, entry
->d_un
.d_val
,
9193 liblistno
* sizeof (Elf32_External_Lib
));
9195 case DT_MIPS_LIBLISTNO
:
9196 liblistno
= entry
->d_un
.d_val
;
9198 case DT_MIPS_OPTIONS
:
9199 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
9201 case DT_MIPS_CONFLICT
:
9203 = offset_from_vma (file
, entry
->d_un
.d_val
,
9204 conflictsno
* sizeof (Elf32_External_Conflict
));
9206 case DT_MIPS_CONFLICTNO
:
9207 conflictsno
= entry
->d_un
.d_val
;
9213 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
9215 Elf32_External_Lib
*elib
;
9218 elib
= get_data (NULL
, file
, liblist_offset
,
9219 liblistno
, sizeof (Elf32_External_Lib
),
9223 printf ("\nSection '.liblist' contains %lu entries:\n",
9224 (unsigned long) liblistno
);
9225 fputs (" Library Time Stamp Checksum Version Flags\n",
9228 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
9235 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9236 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9237 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9238 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9239 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9241 tmp
= gmtime (&time
);
9242 snprintf (timebuf
, sizeof (timebuf
),
9243 "%04u-%02u-%02uT%02u:%02u:%02u",
9244 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9245 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9247 printf ("%3lu: ", (unsigned long) cnt
);
9248 if (VALID_DYNAMIC_NAME (liblist
.l_name
))
9249 print_symbol (20, GET_DYNAMIC_NAME (liblist
.l_name
));
9251 printf ("<corrupt: %9ld>", liblist
.l_name
);
9252 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
9255 if (liblist
.l_flags
== 0)
9266 { " EXACT_MATCH", LL_EXACT_MATCH
},
9267 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
9268 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
9269 { " EXPORTS", LL_EXPORTS
},
9270 { " DELAY_LOAD", LL_DELAY_LOAD
},
9271 { " DELTA", LL_DELTA
}
9273 int flags
= liblist
.l_flags
;
9276 for (fcnt
= 0; fcnt
< ARRAY_SIZE (l_flags_vals
); ++fcnt
)
9277 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
9279 fputs (l_flags_vals
[fcnt
].name
, stdout
);
9280 flags
^= l_flags_vals
[fcnt
].bit
;
9283 printf (" %#x", (unsigned int) flags
);
9293 if (options_offset
!= 0)
9295 Elf_External_Options
*eopt
;
9296 Elf_Internal_Shdr
*sect
= section_headers
;
9297 Elf_Internal_Options
*iopt
;
9298 Elf_Internal_Options
*option
;
9302 /* Find the section header so that we get the size. */
9303 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
9306 eopt
= get_data (NULL
, file
, options_offset
, 1, sect
->sh_size
,
9310 iopt
= cmalloc ((sect
->sh_size
/ sizeof (eopt
)), sizeof (*iopt
));
9313 error (_("Out of memory\n"));
9320 while (offset
< sect
->sh_size
)
9322 Elf_External_Options
*eoption
;
9324 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
9326 option
->kind
= BYTE_GET (eoption
->kind
);
9327 option
->size
= BYTE_GET (eoption
->size
);
9328 option
->section
= BYTE_GET (eoption
->section
);
9329 option
->info
= BYTE_GET (eoption
->info
);
9331 offset
+= option
->size
;
9337 printf (_("\nSection '%s' contains %d entries:\n"),
9338 SECTION_NAME (sect
), cnt
);
9346 switch (option
->kind
)
9349 /* This shouldn't happen. */
9350 printf (" NULL %d %lx", option
->section
, option
->info
);
9353 printf (" REGINFO ");
9354 if (elf_header
.e_machine
== EM_MIPS
)
9357 Elf32_External_RegInfo
*ereg
;
9358 Elf32_RegInfo reginfo
;
9360 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
9361 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9362 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9363 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9364 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9365 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9366 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9368 printf ("GPR %08lx GP 0x%lx\n",
9370 (unsigned long) reginfo
.ri_gp_value
);
9371 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9372 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9373 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9378 Elf64_External_RegInfo
*ereg
;
9379 Elf64_Internal_RegInfo reginfo
;
9381 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
9382 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9383 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9384 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9385 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9386 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9387 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9389 printf ("GPR %08lx GP 0x",
9390 reginfo
.ri_gprmask
);
9391 printf_vma (reginfo
.ri_gp_value
);
9394 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9395 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9396 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9400 case ODK_EXCEPTIONS
:
9401 fputs (" EXCEPTIONS fpe_min(", stdout
);
9402 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
9403 fputs (") fpe_max(", stdout
);
9404 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
9405 fputs (")", stdout
);
9407 if (option
->info
& OEX_PAGE0
)
9408 fputs (" PAGE0", stdout
);
9409 if (option
->info
& OEX_SMM
)
9410 fputs (" SMM", stdout
);
9411 if (option
->info
& OEX_FPDBUG
)
9412 fputs (" FPDBUG", stdout
);
9413 if (option
->info
& OEX_DISMISS
)
9414 fputs (" DISMISS", stdout
);
9417 fputs (" PAD ", stdout
);
9418 if (option
->info
& OPAD_PREFIX
)
9419 fputs (" PREFIX", stdout
);
9420 if (option
->info
& OPAD_POSTFIX
)
9421 fputs (" POSTFIX", stdout
);
9422 if (option
->info
& OPAD_SYMBOL
)
9423 fputs (" SYMBOL", stdout
);
9426 fputs (" HWPATCH ", stdout
);
9427 if (option
->info
& OHW_R4KEOP
)
9428 fputs (" R4KEOP", stdout
);
9429 if (option
->info
& OHW_R8KPFETCH
)
9430 fputs (" R8KPFETCH", stdout
);
9431 if (option
->info
& OHW_R5KEOP
)
9432 fputs (" R5KEOP", stdout
);
9433 if (option
->info
& OHW_R5KCVTL
)
9434 fputs (" R5KCVTL", stdout
);
9437 fputs (" FILL ", stdout
);
9438 /* XXX Print content of info word? */
9441 fputs (" TAGS ", stdout
);
9442 /* XXX Print content of info word? */
9445 fputs (" HWAND ", stdout
);
9446 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9447 fputs (" R4KEOP_CHECKED", stdout
);
9448 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9449 fputs (" R4KEOP_CLEAN", stdout
);
9452 fputs (" HWOR ", stdout
);
9453 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9454 fputs (" R4KEOP_CHECKED", stdout
);
9455 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9456 fputs (" R4KEOP_CLEAN", stdout
);
9459 printf (" GP_GROUP %#06lx self-contained %#06lx",
9460 option
->info
& OGP_GROUP
,
9461 (option
->info
& OGP_SELF
) >> 16);
9464 printf (" IDENT %#06lx self-contained %#06lx",
9465 option
->info
& OGP_GROUP
,
9466 (option
->info
& OGP_SELF
) >> 16);
9469 /* This shouldn't happen. */
9470 printf (" %3d ??? %d %lx",
9471 option
->kind
, option
->section
, option
->info
);
9475 len
= sizeof (*eopt
);
9476 while (len
< option
->size
)
9477 if (((char *) option
)[len
] >= ' '
9478 && ((char *) option
)[len
] < 0x7f)
9479 printf ("%c", ((char *) option
)[len
++]);
9481 printf ("\\%03o", ((char *) option
)[len
++]);
9483 fputs ("\n", stdout
);
9491 if (conflicts_offset
!= 0 && conflictsno
!= 0)
9493 Elf32_Conflict
*iconf
;
9496 if (dynamic_symbols
== NULL
)
9498 error (_("conflict list found without a dynamic symbol table\n"));
9502 iconf
= cmalloc (conflictsno
, sizeof (*iconf
));
9505 error (_("Out of memory\n"));
9511 Elf32_External_Conflict
*econf32
;
9513 econf32
= get_data (NULL
, file
, conflicts_offset
,
9514 conflictsno
, sizeof (*econf32
), _("conflict"));
9518 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9519 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
9525 Elf64_External_Conflict
*econf64
;
9527 econf64
= get_data (NULL
, file
, conflicts_offset
,
9528 conflictsno
, sizeof (*econf64
), _("conflict"));
9532 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9533 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
9538 printf (_("\nSection '.conflict' contains %lu entries:\n"),
9539 (unsigned long) conflictsno
);
9540 puts (_(" Num: Index Value Name"));
9542 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9544 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
9546 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
9547 print_vma (psym
->st_value
, FULL_HEX
);
9549 if (VALID_DYNAMIC_NAME (psym
->st_name
))
9550 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
9552 printf ("<corrupt: %14ld>", psym
->st_name
);
9563 process_gnu_liblist (FILE *file
)
9565 Elf_Internal_Shdr
*section
, *string_sec
;
9566 Elf32_External_Lib
*elib
;
9575 for (i
= 0, section
= section_headers
;
9576 i
< elf_header
.e_shnum
;
9579 switch (section
->sh_type
)
9581 case SHT_GNU_LIBLIST
:
9582 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
)
9585 elib
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
9590 string_sec
= SECTION_HEADER (section
->sh_link
);
9592 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
9593 string_sec
->sh_size
, _("liblist string table"));
9594 strtab_size
= string_sec
->sh_size
;
9597 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
9603 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
9604 SECTION_NAME (section
),
9605 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
9607 puts (" Library Time Stamp Checksum Version Flags");
9609 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
9617 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9618 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9619 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9620 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9621 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9623 tmp
= gmtime (&time
);
9624 snprintf (timebuf
, sizeof (timebuf
),
9625 "%04u-%02u-%02uT%02u:%02u:%02u",
9626 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9627 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9629 printf ("%3lu: ", (unsigned long) cnt
);
9631 printf ("%-20s", liblist
.l_name
< strtab_size
9632 ? strtab
+ liblist
.l_name
: "<corrupt>");
9634 printf ("%-20.20s", liblist
.l_name
< strtab_size
9635 ? strtab
+ liblist
.l_name
: "<corrupt>");
9636 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
9637 liblist
.l_version
, liblist
.l_flags
);
9648 get_note_type (unsigned e_type
)
9650 static char buff
[64];
9652 if (elf_header
.e_type
== ET_CORE
)
9656 return _("NT_AUXV (auxiliary vector)");
9658 return _("NT_PRSTATUS (prstatus structure)");
9660 return _("NT_FPREGSET (floating point registers)");
9662 return _("NT_PRPSINFO (prpsinfo structure)");
9664 return _("NT_TASKSTRUCT (task structure)");
9666 return _("NT_PRXFPREG (user_xfpregs structure)");
9668 return _("NT_PPC_VMX (ppc Altivec registers)");
9670 return _("NT_PSTATUS (pstatus structure)");
9672 return _("NT_FPREGS (floating point registers)");
9674 return _("NT_PSINFO (psinfo structure)");
9676 return _("NT_LWPSTATUS (lwpstatus_t structure)");
9678 return _("NT_LWPSINFO (lwpsinfo_t structure)");
9679 case NT_WIN32PSTATUS
:
9680 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9688 return _("NT_VERSION (version)");
9690 return _("NT_ARCH (architecture)");
9695 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
9700 get_gnu_elf_note_type (unsigned e_type
)
9702 static char buff
[64];
9706 case NT_GNU_ABI_TAG
:
9707 return _("NT_GNU_ABI_TAG (ABI version tag)");
9709 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
9710 case NT_GNU_BUILD_ID
:
9711 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
9716 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
9721 get_netbsd_elfcore_note_type (unsigned e_type
)
9723 static char buff
[64];
9725 if (e_type
== NT_NETBSDCORE_PROCINFO
)
9727 /* NetBSD core "procinfo" structure. */
9728 return _("NetBSD procinfo structure");
9731 /* As of Jan 2002 there are no other machine-independent notes
9732 defined for NetBSD core files. If the note type is less
9733 than the start of the machine-dependent note types, we don't
9736 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
9738 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
9742 switch (elf_header
.e_machine
)
9744 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
9745 and PT_GETFPREGS == mach+2. */
9750 case EM_SPARC32PLUS
:
9754 case NT_NETBSDCORE_FIRSTMACH
+0:
9755 return _("PT_GETREGS (reg structure)");
9756 case NT_NETBSDCORE_FIRSTMACH
+2:
9757 return _("PT_GETFPREGS (fpreg structure)");
9763 /* On all other arch's, PT_GETREGS == mach+1 and
9764 PT_GETFPREGS == mach+3. */
9768 case NT_NETBSDCORE_FIRSTMACH
+1:
9769 return _("PT_GETREGS (reg structure)");
9770 case NT_NETBSDCORE_FIRSTMACH
+3:
9771 return _("PT_GETFPREGS (fpreg structure)");
9777 snprintf (buff
, sizeof (buff
), _("PT_FIRSTMACH+%d"),
9778 e_type
- NT_NETBSDCORE_FIRSTMACH
);
9782 /* Note that by the ELF standard, the name field is already null byte
9783 terminated, and namesz includes the terminating null byte.
9784 I.E. the value of namesz for the name "FSF" is 4.
9786 If the value of namesz is zero, there is no name present. */
9788 process_note (Elf_Internal_Note
*pnote
)
9790 const char *name
= pnote
->namesz
? pnote
->namedata
: "(NONE)";
9793 if (pnote
->namesz
== 0)
9794 /* If there is no note name, then use the default set of
9795 note type strings. */
9796 nt
= get_note_type (pnote
->type
);
9798 else if (const_strneq (pnote
->namedata
, "GNU"))
9799 /* GNU-specific object file notes. */
9800 nt
= get_gnu_elf_note_type (pnote
->type
);
9802 else if (const_strneq (pnote
->namedata
, "NetBSD-CORE"))
9803 /* NetBSD-specific core file notes. */
9804 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
9806 else if (strneq (pnote
->namedata
, "SPU/", 4))
9808 /* SPU-specific core file notes. */
9809 nt
= pnote
->namedata
+ 4;
9814 /* Don't recognize this note name; just use the default set of
9815 note type strings. */
9816 nt
= get_note_type (pnote
->type
);
9818 printf (" %s\t\t0x%08lx\t%s\n", name
, pnote
->descsz
, nt
);
9824 process_corefile_note_segment (FILE *file
, bfd_vma offset
, bfd_vma length
)
9826 Elf_External_Note
*pnotes
;
9827 Elf_External_Note
*external
;
9833 pnotes
= get_data (NULL
, file
, offset
, 1, length
, _("notes"));
9839 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9840 (unsigned long) offset
, (unsigned long) length
);
9841 printf (_(" Owner\t\tData size\tDescription\n"));
9843 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
9845 Elf_External_Note
*next
;
9846 Elf_Internal_Note inote
;
9849 inote
.type
= BYTE_GET (external
->type
);
9850 inote
.namesz
= BYTE_GET (external
->namesz
);
9851 inote
.namedata
= external
->name
;
9852 inote
.descsz
= BYTE_GET (external
->descsz
);
9853 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
9854 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
9856 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
9858 if (((char *) next
) > (((char *) pnotes
) + length
))
9860 warn (_("corrupt note found at offset %lx into core notes\n"),
9861 (long)((char *)external
- (char *)pnotes
));
9862 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
9863 inote
.type
, inote
.namesz
, inote
.descsz
);
9869 /* Verify that name is null terminated. It appears that at least
9870 one version of Linux (RedHat 6.0) generates corefiles that don't
9871 comply with the ELF spec by failing to include the null byte in
9873 if (inote
.namedata
[inote
.namesz
] != '\0')
9875 temp
= malloc (inote
.namesz
+ 1);
9879 error (_("Out of memory\n"));
9884 strncpy (temp
, inote
.namedata
, inote
.namesz
);
9885 temp
[inote
.namesz
] = 0;
9887 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9888 inote
.namedata
= temp
;
9891 res
&= process_note (& inote
);
9906 process_corefile_note_segments (FILE *file
)
9908 Elf_Internal_Phdr
*segment
;
9912 if (! get_program_headers (file
))
9915 for (i
= 0, segment
= program_headers
;
9916 i
< elf_header
.e_phnum
;
9919 if (segment
->p_type
== PT_NOTE
)
9920 res
&= process_corefile_note_segment (file
,
9921 (bfd_vma
) segment
->p_offset
,
9922 (bfd_vma
) segment
->p_filesz
);
9929 process_note_sections (FILE *file
)
9931 Elf_Internal_Shdr
*section
;
9935 for (i
= 0, section
= section_headers
;
9936 i
< elf_header
.e_shnum
;
9938 if (section
->sh_type
== SHT_NOTE
)
9939 res
&= process_corefile_note_segment (file
,
9940 (bfd_vma
) section
->sh_offset
,
9941 (bfd_vma
) section
->sh_size
);
9947 process_notes (FILE *file
)
9949 /* If we have not been asked to display the notes then do nothing. */
9953 if (elf_header
.e_type
!= ET_CORE
)
9954 return process_note_sections (file
);
9956 /* No program headers means no NOTE segment. */
9957 if (elf_header
.e_phnum
> 0)
9958 return process_corefile_note_segments (file
);
9960 printf (_("No note segments present in the core file.\n"));
9965 process_arch_specific (FILE *file
)
9970 switch (elf_header
.e_machine
)
9973 return process_arm_specific (file
);
9975 case EM_MIPS_RS3_LE
:
9976 return process_mips_specific (file
);
9979 return process_power_specific (file
);
9988 get_file_header (FILE *file
)
9990 /* Read in the identity array. */
9991 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
9994 /* Determine how to read the rest of the header. */
9995 switch (elf_header
.e_ident
[EI_DATA
])
9997 default: /* fall through */
9998 case ELFDATANONE
: /* fall through */
10000 byte_get
= byte_get_little_endian
;
10001 byte_put
= byte_put_little_endian
;
10004 byte_get
= byte_get_big_endian
;
10005 byte_put
= byte_put_big_endian
;
10009 /* For now we only support 32 bit and 64 bit ELF files. */
10010 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
10012 /* Read in the rest of the header. */
10015 Elf32_External_Ehdr ehdr32
;
10017 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
10020 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
10021 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
10022 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
10023 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
10024 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
10025 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
10026 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
10027 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
10028 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
10029 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
10030 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
10031 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
10032 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
10036 Elf64_External_Ehdr ehdr64
;
10038 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10039 we will not be able to cope with the 64bit data found in
10040 64 ELF files. Detect this now and abort before we start
10041 overwriting things. */
10042 if (sizeof (bfd_vma
) < 8)
10044 error (_("This instance of readelf has been built without support for a\n\
10045 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10049 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
10052 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
10053 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
10054 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
10055 elf_header
.e_entry
= BYTE_GET (ehdr64
.e_entry
);
10056 elf_header
.e_phoff
= BYTE_GET (ehdr64
.e_phoff
);
10057 elf_header
.e_shoff
= BYTE_GET (ehdr64
.e_shoff
);
10058 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
10059 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
10060 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
10061 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
10062 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
10063 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
10064 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
10067 if (elf_header
.e_shoff
)
10069 /* There may be some extensions in the first section header. Don't
10070 bomb if we can't read it. */
10072 get_32bit_section_headers (file
, 1);
10074 get_64bit_section_headers (file
, 1);
10080 /* Process one ELF object file according to the command line options.
10081 This file may actually be stored in an archive. The file is
10082 positioned at the start of the ELF object. */
10085 process_object (char *file_name
, FILE *file
)
10089 if (! get_file_header (file
))
10091 error (_("%s: Failed to read file header\n"), file_name
);
10095 /* Initialise per file variables. */
10096 for (i
= ARRAY_SIZE (version_info
); i
--;)
10097 version_info
[i
] = 0;
10099 for (i
= ARRAY_SIZE (dynamic_info
); i
--;)
10100 dynamic_info
[i
] = 0;
10102 /* Process the file. */
10104 printf (_("\nFile: %s\n"), file_name
);
10106 /* Initialise the dump_sects array from the cmdline_dump_sects array.
10107 Note we do this even if cmdline_dump_sects is empty because we
10108 must make sure that the dump_sets array is zeroed out before each
10109 object file is processed. */
10110 if (num_dump_sects
> num_cmdline_dump_sects
)
10111 memset (dump_sects
, 0, num_dump_sects
* sizeof (* dump_sects
));
10113 if (num_cmdline_dump_sects
> 0)
10115 if (num_dump_sects
== 0)
10116 /* A sneaky way of allocating the dump_sects array. */
10117 request_dump_bynumber (num_cmdline_dump_sects
, 0);
10119 assert (num_dump_sects
>= num_cmdline_dump_sects
);
10120 memcpy (dump_sects
, cmdline_dump_sects
,
10121 num_cmdline_dump_sects
* sizeof (* dump_sects
));
10124 if (! process_file_header ())
10127 if (! process_section_headers (file
))
10129 /* Without loaded section headers we cannot process lots of
10131 do_unwind
= do_version
= do_dump
= do_arch
= 0;
10133 if (! do_using_dynamic
)
10134 do_syms
= do_reloc
= 0;
10137 if (! process_section_groups (file
))
10139 /* Without loaded section groups we cannot process unwind. */
10143 if (process_program_headers (file
))
10144 process_dynamic_section (file
);
10146 process_relocs (file
);
10148 process_unwind (file
);
10150 process_symbol_table (file
);
10152 process_syminfo (file
);
10154 process_version_sections (file
);
10156 process_section_contents (file
);
10158 process_notes (file
);
10160 process_gnu_liblist (file
);
10162 process_arch_specific (file
);
10164 if (program_headers
)
10166 free (program_headers
);
10167 program_headers
= NULL
;
10170 if (section_headers
)
10172 free (section_headers
);
10173 section_headers
= NULL
;
10178 free (string_table
);
10179 string_table
= NULL
;
10180 string_table_length
= 0;
10183 if (dynamic_strings
)
10185 free (dynamic_strings
);
10186 dynamic_strings
= NULL
;
10187 dynamic_strings_length
= 0;
10190 if (dynamic_symbols
)
10192 free (dynamic_symbols
);
10193 dynamic_symbols
= NULL
;
10194 num_dynamic_syms
= 0;
10197 if (dynamic_syminfo
)
10199 free (dynamic_syminfo
);
10200 dynamic_syminfo
= NULL
;
10203 if (section_headers_groups
)
10205 free (section_headers_groups
);
10206 section_headers_groups
= NULL
;
10209 if (section_groups
)
10211 struct group_list
*g
, *next
;
10213 for (i
= 0; i
< group_count
; i
++)
10215 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
10222 free (section_groups
);
10223 section_groups
= NULL
;
10226 free_debug_memory ();
10231 /* Process an ELF archive.
10232 On entry the file is positioned just after the ARMAG string. */
10235 process_archive (char *file_name
, FILE *file
)
10237 struct ar_hdr arhdr
;
10239 unsigned long size
;
10240 unsigned long index_num
= 0;
10241 unsigned long *index_array
= NULL
;
10242 char *sym_table
= NULL
;
10243 unsigned long sym_size
= 0;
10244 char *longnames
= NULL
;
10245 unsigned long longnames_size
= 0;
10246 size_t file_name_size
;
10251 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10252 if (got
!= sizeof arhdr
)
10257 error (_("%s: failed to read archive header\n"), file_name
);
10261 /* See if this is the archive symbol table. */
10262 if (const_strneq (arhdr
.ar_name
, "/ ")
10263 || const_strneq (arhdr
.ar_name
, "/SYM64/ "))
10265 size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10266 size
= size
+ (size
& 1);
10268 if (do_archive_index
)
10271 /* A buffer used to hold numbers read in from an archive index.
10272 These are always 4 bytes long and stored in big-endian format. */
10273 #define SIZEOF_AR_INDEX_NUMBERS 4
10274 unsigned char integer_buffer
[SIZEOF_AR_INDEX_NUMBERS
];
10275 unsigned char * index_buffer
;
10277 /* Check the size of the archive index. */
10278 if (size
< SIZEOF_AR_INDEX_NUMBERS
)
10280 error (_("%s: the archive index is empty\n"), file_name
);
10284 /* Read the numer of entries in the archive index. */
10285 got
= fread (integer_buffer
, 1, sizeof integer_buffer
, file
);
10286 if (got
!= sizeof (integer_buffer
))
10288 error (_("%s: failed to read archive index\n"), file_name
);
10291 index_num
= byte_get_big_endian (integer_buffer
, sizeof integer_buffer
);
10292 size
-= SIZEOF_AR_INDEX_NUMBERS
;
10294 /* Read in the archive index. */
10295 if (size
< index_num
* SIZEOF_AR_INDEX_NUMBERS
)
10297 error (_("%s: the archive index is supposed to have %ld entries, but the size in the header is too small\n"),
10298 file_name
, index_num
);
10301 index_buffer
= malloc (index_num
* SIZEOF_AR_INDEX_NUMBERS
);
10302 if (index_buffer
== NULL
)
10304 error (_("Out of memory whilst trying to read archive symbol index\n"));
10307 got
= fread (index_buffer
, SIZEOF_AR_INDEX_NUMBERS
, index_num
, file
);
10308 if (got
!= index_num
)
10310 free (index_buffer
);
10311 error (_("%s: failed to read archive index\n"), file_name
);
10315 size
-= index_num
* SIZEOF_AR_INDEX_NUMBERS
;
10317 /* Convert the index numbers into the host's numeric format. */
10318 index_array
= malloc (index_num
* sizeof (* index_array
));
10319 if (index_array
== NULL
)
10321 free (index_buffer
);
10322 error (_("Out of memory whilst trying to convert the archive symbol index\n"));
10326 for (i
= 0; i
< index_num
; i
++)
10327 index_array
[i
] = byte_get_big_endian ((unsigned char *)(index_buffer
+ (i
* SIZEOF_AR_INDEX_NUMBERS
)),
10328 SIZEOF_AR_INDEX_NUMBERS
);
10329 free (index_buffer
);
10331 /* The remaining space in the header is taken up by the symbol table. */
10334 error (_("%s: the archive has an index but no symbols\n"), file_name
);
10338 sym_table
= malloc (size
);
10340 if (sym_table
== NULL
)
10342 error (_("Out of memory whilst trying to read archive index symbol table\n"));
10346 got
= fread (sym_table
, 1, size
, file
);
10349 error (_("%s: failed to read archive index symbol table\n"), file_name
);
10356 if (fseek (file
, size
, SEEK_CUR
) != 0)
10358 error (_("%s: failed to skip archive symbol table\n"), file_name
);
10363 got
= fread (& arhdr
, 1, sizeof arhdr
, file
);
10364 if (got
!= sizeof arhdr
)
10372 error (_("%s: failed to read archive header following archive index\n"), file_name
);
10377 else if (do_archive_index
)
10378 printf (_("%s has no archive index\n"), file_name
);
10380 if (const_strneq (arhdr
.ar_name
, "// "))
10382 /* This is the archive string table holding long member
10385 longnames_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10386 longnames
= malloc (longnames_size
);
10387 if (longnames
== NULL
)
10389 error (_("Out of memory reading long symbol names in archive\n"));
10394 if (fread (longnames
, longnames_size
, 1, file
) != 1)
10397 error (_("%s: failed to read long symbol name string table\n"), file_name
);
10402 if ((longnames_size
& 1) != 0)
10405 got
= fread (& arhdr
, 1, sizeof arhdr
, file
);
10406 if (got
!= sizeof arhdr
)
10412 error (_("%s: failed to read archive header following long symbol names\n"), file_name
);
10419 if (do_archive_index
)
10421 if (sym_table
== NULL
)
10422 error (_("%s: unable to dump the index as none was found\n"), file_name
);
10425 unsigned int i
, j
, k
, l
;
10427 unsigned long current_pos
;
10429 printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
10430 file_name
, index_num
, sym_size
);
10431 current_pos
= ftell (file
);
10433 for (i
= l
= 0; i
< index_num
; i
++)
10435 if ((i
== 0) || ((i
> 0) && (index_array
[i
] != index_array
[i
- 1])))
10437 if (fseek (file
, index_array
[i
], SEEK_SET
) != 0)
10439 error (_("%s: failed to seek to next file name\n"), file_name
);
10443 got
= fread (elf_name
, 1, 16, file
);
10446 error (_("%s: failed to read file name\n"), file_name
);
10451 if (elf_name
[0] == '/')
10453 /* We have a long name. */
10454 k
= j
= strtoul (elf_name
+ 1, NULL
, 10);
10455 while ((j
< longnames_size
) && (longnames
[j
] != '/'))
10457 longnames
[j
] = '\0';
10458 printf (_("Binary %s contains:\n"), longnames
+ k
);
10459 longnames
[j
] = '/';
10464 while ((elf_name
[j
] != '/') && (j
< 16))
10466 elf_name
[j
] = '\0';
10467 printf(_("Binary %s contains:\n"), elf_name
);
10472 error (_("%s: end of the symbol table reached before the end of the index\n"),
10476 printf ("\t%s\n", sym_table
+ l
);
10477 l
+= strlen (sym_table
+ l
) + 1;
10481 error (_("%s: symbols remain in the index symbol table, but without corresponding entries in the index table\n"),
10484 free (index_array
);
10485 index_array
= NULL
;
10488 if (fseek (file
, current_pos
, SEEK_SET
) != 0)
10490 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name
);
10495 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
10496 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
10497 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
10498 && !do_section_groups
)
10499 return 0; /* Archive index only. */
10502 file_name_size
= strlen (file_name
);
10511 if (arhdr
.ar_name
[0] == '/')
10515 off
= strtoul (arhdr
.ar_name
+ 1, NULL
, 10);
10516 if (off
>= longnames_size
)
10518 error (_("%s: invalid archive string table offset %lu\n"), file_name
, off
);
10523 name
= longnames
+ off
;
10524 nameend
= memchr (name
, '/', longnames_size
- off
);
10528 name
= arhdr
.ar_name
;
10529 nameend
= memchr (name
, '/', 16);
10532 if (nameend
== NULL
)
10534 error (_("%s: bad archive file name\n"), file_name
);
10539 namealc
= malloc (file_name_size
+ (nameend
- name
) + 3);
10540 if (namealc
== NULL
)
10542 error (_("Out of memory\n"));
10547 memcpy (namealc
, file_name
, file_name_size
);
10548 namealc
[file_name_size
] = '(';
10549 memcpy (namealc
+ file_name_size
+ 1, name
, nameend
- name
);
10550 namealc
[file_name_size
+ 1 + (nameend
- name
)] = ')';
10551 namealc
[file_name_size
+ 2 + (nameend
- name
)] = '\0';
10553 archive_file_offset
= ftell (file
);
10554 archive_file_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10556 ret
|= process_object (namealc
, file
);
10561 (archive_file_offset
10562 + archive_file_size
10563 + (archive_file_size
& 1)),
10566 error (_("%s: failed to seek to next archive header\n"), file_name
);
10571 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10572 if (got
!= sizeof arhdr
)
10577 error (_("%s: failed to read archive header\n"), file_name
);
10584 if (index_array
!= NULL
)
10585 free (index_array
);
10586 if (sym_table
!= NULL
)
10588 if (longnames
!= NULL
)
10595 process_file (char *file_name
)
10598 struct stat statbuf
;
10599 char armag
[SARMAG
];
10602 if (stat (file_name
, &statbuf
) < 0)
10604 if (errno
== ENOENT
)
10605 error (_("'%s': No such file\n"), file_name
);
10607 error (_("Could not locate '%s'. System error message: %s\n"),
10608 file_name
, strerror (errno
));
10612 if (! S_ISREG (statbuf
.st_mode
))
10614 error (_("'%s' is not an ordinary file\n"), file_name
);
10618 file
= fopen (file_name
, "rb");
10621 error (_("Input file '%s' is not readable.\n"), file_name
);
10625 if (fread (armag
, SARMAG
, 1, file
) != 1)
10627 error (_("%s: Failed to read file's magic number\n"), file_name
);
10632 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
10633 ret
= process_archive (file_name
, file
);
10636 if (do_archive_index
)
10637 error (_("File %s is not an archive so its index cannot be displayed.\n"),
10641 archive_file_size
= archive_file_offset
= 0;
10642 ret
= process_object (file_name
, file
);
10650 #ifdef SUPPORT_DISASSEMBLY
10651 /* Needed by the i386 disassembler. For extra credit, someone could
10652 fix this so that we insert symbolic addresses here, esp for GOT/PLT
10656 print_address (unsigned int addr
, FILE *outfile
)
10658 fprintf (outfile
,"0x%8.8x", addr
);
10661 /* Needed by the i386 disassembler. */
10663 db_task_printsym (unsigned int addr
)
10665 print_address (addr
, stderr
);
10670 main (int argc
, char **argv
)
10674 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
10675 setlocale (LC_MESSAGES
, "");
10677 #if defined (HAVE_SETLOCALE)
10678 setlocale (LC_CTYPE
, "");
10680 bindtextdomain (PACKAGE
, LOCALEDIR
);
10681 textdomain (PACKAGE
);
10683 expandargv (&argc
, &argv
);
10685 parse_args (argc
, argv
);
10687 if (num_dump_sects
> 0)
10689 /* Make a copy of the dump_sects array. */
10690 cmdline_dump_sects
= malloc (num_dump_sects
* sizeof (* dump_sects
));
10691 if (cmdline_dump_sects
== NULL
)
10692 error (_("Out of memory allocating dump request table.\n"));
10695 memcpy (cmdline_dump_sects
, dump_sects
,
10696 num_dump_sects
* sizeof (* dump_sects
));
10697 num_cmdline_dump_sects
= num_dump_sects
;
10701 if (optind
< (argc
- 1))
10705 while (optind
< argc
)
10706 err
|= process_file (argv
[optind
++]);
10708 if (dump_sects
!= NULL
)
10710 if (cmdline_dump_sects
!= NULL
)
10711 free (cmdline_dump_sects
);