1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
3 Free Software Foundation, Inc.
5 Originally developed by Eric Youngdale <eric@andante.jic.com>
6 Modifications by Nick Clifton <nickc@redhat.com>
8 This file is part of GNU Binutils.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 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. */
45 #include <sys/types.h>
51 /* Define BFD64 here, even if our default architecture is 32 bit ELF
52 as this will allow us to read in and parse 64bit and 32bit ELF files.
53 Only do this if we believe that the compiler can support a 64 bit
54 data type. For now we only rely on GCC being able to do this. */
60 #include "elf/common.h"
61 #include "elf/external.h"
62 #include "elf/internal.h"
64 /* The following headers use the elf/reloc-macros.h file to
65 automatically generate relocation recognition functions
66 such as elf_mips_reloc_type() */
68 #define RELOC_MACROS_GEN_FUNC
70 #include "elf/alpha.h"
92 #include "elf/m68hc11.h"
93 #include "elf/mcore.h"
96 #include "elf/mn10200.h"
97 #include "elf/mn10300.h"
99 #include "elf/msp430.h"
100 #include "elf/or32.h"
103 #include "elf/ppc64.h"
104 #include "elf/s390.h"
106 #include "elf/sparc.h"
107 #include "elf/v850.h"
109 #include "elf/x86-64.h"
110 #include "elf/xstormy16.h"
112 #include "elf/iq2000.h"
113 #include "elf/xtensa.h"
119 #include "libiberty.h"
121 char *program_name
= "readelf";
122 static long archive_file_offset
;
123 static unsigned long archive_file_size
;
124 static unsigned long dynamic_addr
;
125 static bfd_size_type dynamic_size
;
126 static unsigned int dynamic_nent
;
127 static char *dynamic_strings
;
128 static unsigned long dynamic_strings_length
;
129 static char *string_table
;
130 static unsigned long string_table_length
;
131 static unsigned long num_dynamic_syms
;
132 static Elf_Internal_Sym
*dynamic_symbols
;
133 static Elf_Internal_Syminfo
*dynamic_syminfo
;
134 static unsigned long dynamic_syminfo_offset
;
135 static unsigned int dynamic_syminfo_nent
;
136 static char program_interpreter
[64];
137 static bfd_vma dynamic_info
[DT_JMPREL
+ 1];
138 static bfd_vma version_info
[16];
139 static Elf_Internal_Ehdr elf_header
;
140 static Elf_Internal_Shdr
*section_headers
;
141 static Elf_Internal_Phdr
*program_headers
;
142 static Elf_Internal_Dyn
*dynamic_section
;
143 static Elf_Internal_Shdr
*symtab_shndx_hdr
;
144 static int show_name
;
145 static int do_dynamic
;
148 static int do_sections
;
149 static int do_section_groups
;
150 static int do_section_details
;
151 static int do_segments
;
152 static int do_unwind
;
153 static int do_using_dynamic
;
154 static int do_header
;
156 static int do_version
;
158 static int do_histogram
;
159 static int do_debugging
;
162 static int is_32bit_elf
;
166 struct group_list
*next
;
167 unsigned int section_index
;
172 struct group_list
*root
;
173 unsigned int group_index
;
176 static size_t group_count
;
177 static struct group
*section_groups
;
178 static struct group
**section_headers_groups
;
180 /* A linked list of the section names for which dumps were requested
182 struct dump_list_entry
186 struct dump_list_entry
*next
;
188 static struct dump_list_entry
*dump_sects_byname
;
190 /* A dynamic array of flags indicating for which sections a hex dump
191 has been requested (via the -x switch) and/or a disassembly dump
192 (via the -i switch). */
193 char *cmdline_dump_sects
= NULL
;
194 unsigned num_cmdline_dump_sects
= 0;
196 /* A dynamic array of flags indicating for which sections a dump of
197 some kind has been requested. It is reset on a per-object file
198 basis and then initialised from the cmdline_dump_sects array,
199 the results of interpreting the -w switch, and the
200 dump_sects_byname list. */
201 char *dump_sects
= NULL
;
202 unsigned int num_dump_sects
= 0;
204 #define HEX_DUMP (1 << 0)
205 #define DISASS_DUMP (1 << 1)
206 #define DEBUG_DUMP (1 << 2)
208 /* How to print a vma value. */
209 typedef enum print_mode
221 static void (*byte_put
) (unsigned char *, bfd_vma
, int);
225 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
226 ((X)->sh_name >= string_table_length \
227 ? "<corrupt>" : string_table + (X)->sh_name))
229 /* Given st_shndx I, map to section_headers index. */
230 #define SECTION_HEADER_INDEX(I) \
231 ((I) < SHN_LORESERVE \
233 : ((I) <= SHN_HIRESERVE \
235 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
237 /* Reverse of the above. */
238 #define SECTION_HEADER_NUM(N) \
239 ((N) < SHN_LORESERVE \
241 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
243 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
245 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
247 #define BYTE_GET(field) byte_get (field, sizeof (field))
249 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
251 #define GET_ELF_SYMBOLS(file, section) \
252 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
253 : get_64bit_elf_symbols (file, section))
255 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
256 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
257 already been called and verified that the string exists. */
258 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
260 /* This is just a bit of syntatic sugar. */
261 #define streq(a,b) (strcmp ((a), (b)) == 0)
262 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
265 get_data (void *var
, FILE *file
, long offset
, size_t size
, size_t nmemb
,
270 if (size
== 0 || nmemb
== 0)
273 if (fseek (file
, archive_file_offset
+ offset
, SEEK_SET
))
275 error (_("Unable to seek to 0x%lx for %s\n"),
276 archive_file_offset
+ offset
, reason
);
283 /* Check for overflow. */
284 if (nmemb
< (~(size_t) 0 - 1) / size
)
285 /* + 1 so that we can '\0' terminate invalid string table sections. */
286 mvar
= malloc (size
* nmemb
+ 1);
290 error (_("Out of memory allocating 0x%lx bytes for %s\n"),
291 (unsigned long)(size
* nmemb
), reason
);
295 ((char *) mvar
)[size
* nmemb
] = '\0';
298 if (fread (mvar
, size
, nmemb
, file
) != nmemb
)
300 error (_("Unable to read in 0x%lx bytes of %s\n"),
301 (unsigned long)(size
* nmemb
), reason
);
311 byte_put_little_endian (unsigned char *field
, bfd_vma value
, int size
)
316 field
[7] = (((value
>> 24) >> 24) >> 8) & 0xff;
317 field
[6] = ((value
>> 24) >> 24) & 0xff;
318 field
[5] = ((value
>> 24) >> 16) & 0xff;
319 field
[4] = ((value
>> 24) >> 8) & 0xff;
322 field
[3] = (value
>> 24) & 0xff;
323 field
[2] = (value
>> 16) & 0xff;
326 field
[1] = (value
>> 8) & 0xff;
329 field
[0] = value
& 0xff;
333 error (_("Unhandled data length: %d\n"), size
);
338 #if defined BFD64 && !BFD_HOST_64BIT_LONG
340 print_dec_vma (bfd_vma vma
, int is_signed
)
346 if (is_signed
&& (bfd_signed_vma
) vma
< 0)
355 *bufp
++ = '0' + vma
% 10;
367 print_hex_vma (bfd_vma vma
)
375 char digit
= '0' + (vma
& 0x0f);
377 digit
+= 'a' - '0' - 10;
390 /* Print a VMA value. */
392 print_vma (bfd_vma vma
, print_mode mode
)
401 return printf ("0x%8.8lx", (unsigned long) vma
);
404 return printf ("%8.8lx", (unsigned long) vma
);
408 return printf ("%5ld", (long) vma
);
412 return printf ("0x%lx", (unsigned long) vma
);
415 return printf ("%lx", (unsigned long) vma
);
418 return printf ("%ld", (unsigned long) vma
);
421 return printf ("%lu", (unsigned long) vma
);
444 #if BFD_HOST_64BIT_LONG
445 return nc
+ printf ("%lx", vma
);
447 return nc
+ print_hex_vma (vma
);
451 #if BFD_HOST_64BIT_LONG
452 return printf ("%ld", vma
);
454 return print_dec_vma (vma
, 1);
458 #if BFD_HOST_64BIT_LONG
460 return printf ("%5ld", vma
);
462 return printf ("%#lx", vma
);
465 return printf ("%5ld", _bfd_int64_low (vma
));
467 return print_hex_vma (vma
);
471 #if BFD_HOST_64BIT_LONG
472 return printf ("%lu", vma
);
474 return print_dec_vma (vma
, 0);
482 /* Display a symbol on stdout. If do_wide is not true then
483 format the symbol to be at most WIDTH characters,
484 truncating as necessary. If WIDTH is negative then
485 format the string to be exactly - WIDTH characters,
486 truncating or padding as necessary. */
489 print_symbol (int width
, const char *symbol
)
492 printf ("%s", symbol
);
494 printf ("%-*.*s", width
, width
, symbol
);
496 printf ("%-.*s", width
, symbol
);
500 byte_put_big_endian (unsigned char *field
, bfd_vma value
, int size
)
505 field
[7] = value
& 0xff;
506 field
[6] = (value
>> 8) & 0xff;
507 field
[5] = (value
>> 16) & 0xff;
508 field
[4] = (value
>> 24) & 0xff;
513 field
[3] = value
& 0xff;
514 field
[2] = (value
>> 8) & 0xff;
518 field
[1] = value
& 0xff;
522 field
[0] = value
& 0xff;
526 error (_("Unhandled data length: %d\n"), size
);
531 /* Return a pointer to section NAME, or NULL if no such section exists. */
533 static Elf_Internal_Shdr
*
534 find_section (const char *name
)
538 for (i
= 0; i
< elf_header
.e_shnum
; i
++)
539 if (streq (SECTION_NAME (section_headers
+ i
), name
))
540 return section_headers
+ i
;
545 /* Guess the relocation size commonly used by the specific machines. */
548 guess_is_rela (unsigned long e_machine
)
552 /* Targets that use REL relocations. */
567 /* Targets that use RELA relocations. */
582 case EM_CYGNUS_MN10200
:
584 case EM_CYGNUS_MN10300
:
615 case EM_ALTERA_NIOS2
:
636 warn (_("Don't know about relocations on this machine architecture\n"));
642 slurp_rela_relocs (FILE *file
,
643 unsigned long rel_offset
,
644 unsigned long rel_size
,
645 Elf_Internal_Rela
**relasp
,
646 unsigned long *nrelasp
)
648 Elf_Internal_Rela
*relas
;
649 unsigned long nrelas
;
654 Elf32_External_Rela
*erelas
;
656 erelas
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
660 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
662 relas
= cmalloc (nrelas
, sizeof (Elf_Internal_Rela
));
667 error (_("out of memory parsing relocs"));
671 for (i
= 0; i
< nrelas
; i
++)
673 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
674 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
675 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
682 Elf64_External_Rela
*erelas
;
684 erelas
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
688 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
690 relas
= cmalloc (nrelas
, sizeof (Elf_Internal_Rela
));
695 error (_("out of memory parsing relocs"));
699 for (i
= 0; i
< nrelas
; i
++)
701 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
702 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
703 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
714 slurp_rel_relocs (FILE *file
,
715 unsigned long rel_offset
,
716 unsigned long rel_size
,
717 Elf_Internal_Rela
**relsp
,
718 unsigned long *nrelsp
)
720 Elf_Internal_Rela
*rels
;
726 Elf32_External_Rel
*erels
;
728 erels
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
732 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
734 rels
= cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
739 error (_("out of memory parsing relocs"));
743 for (i
= 0; i
< nrels
; i
++)
745 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
746 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
747 rels
[i
].r_addend
= 0;
754 Elf64_External_Rel
*erels
;
756 erels
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
760 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
762 rels
= cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
767 error (_("out of memory parsing relocs"));
771 for (i
= 0; i
< nrels
; i
++)
773 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
774 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
775 rels
[i
].r_addend
= 0;
785 /* Display the contents of the relocation data found at the specified
789 dump_relocations (FILE *file
,
790 unsigned long rel_offset
,
791 unsigned long rel_size
,
792 Elf_Internal_Sym
*symtab
,
795 unsigned long strtablen
,
799 Elf_Internal_Rela
*rels
;
802 if (is_rela
== UNKNOWN
)
803 is_rela
= guess_is_rela (elf_header
.e_machine
);
807 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
812 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
821 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
823 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
828 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
830 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
838 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
840 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
845 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
847 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
851 for (i
= 0; i
< rel_size
; i
++)
854 const char *rtype2
= NULL
;
855 const char *rtype3
= NULL
;
858 bfd_vma symtab_index
;
863 offset
= rels
[i
].r_offset
;
864 info
= rels
[i
].r_info
;
868 type
= ELF32_R_TYPE (info
);
869 symtab_index
= ELF32_R_SYM (info
);
873 /* The #ifdef BFD64 below is to prevent a compile time warning.
874 We know that if we do not have a 64 bit data type that we
875 will never execute this code anyway. */
877 if (elf_header
.e_machine
== EM_MIPS
)
879 /* In little-endian objects, r_info isn't really a 64-bit
880 little-endian value: it has a 32-bit little-endian
881 symbol index followed by four individual byte fields.
882 Reorder INFO accordingly. */
883 if (elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
884 info
= (((info
& 0xffffffff) << 32)
885 | ((info
>> 56) & 0xff)
886 | ((info
>> 40) & 0xff00)
887 | ((info
>> 24) & 0xff0000)
888 | ((info
>> 8) & 0xff000000));
889 type
= ELF64_MIPS_R_TYPE (info
);
890 type2
= ELF64_MIPS_R_TYPE2 (info
);
891 type3
= ELF64_MIPS_R_TYPE3 (info
);
893 else if (elf_header
.e_machine
== EM_SPARCV9
)
894 type
= ELF64_R_TYPE_ID (info
);
896 type
= ELF64_R_TYPE (info
);
898 symtab_index
= ELF64_R_SYM (info
);
904 #ifdef _bfd_int64_low
905 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
907 printf ("%8.8lx %8.8lx ", offset
, info
);
912 #ifdef _bfd_int64_low
914 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
915 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
916 _bfd_int64_high (offset
),
917 _bfd_int64_low (offset
),
918 _bfd_int64_high (info
),
919 _bfd_int64_low (info
));
922 ? "%16.16lx %16.16lx "
923 : "%12.12lx %12.12lx ",
928 switch (elf_header
.e_machine
)
936 rtype
= elf_m32r_reloc_type (type
);
941 rtype
= elf_i386_reloc_type (type
);
946 rtype
= elf_m68hc11_reloc_type (type
);
950 rtype
= elf_m68k_reloc_type (type
);
954 rtype
= elf_i960_reloc_type (type
);
959 rtype
= elf_avr_reloc_type (type
);
966 rtype
= elf_sparc_reloc_type (type
);
971 rtype
= v850_reloc_type (type
);
976 rtype
= elf_d10v_reloc_type (type
);
981 rtype
= elf_d30v_reloc_type (type
);
985 rtype
= elf_dlx_reloc_type (type
);
989 rtype
= elf_sh_reloc_type (type
);
993 case EM_CYGNUS_MN10300
:
994 rtype
= elf_mn10300_reloc_type (type
);
998 case EM_CYGNUS_MN10200
:
999 rtype
= elf_mn10200_reloc_type (type
);
1003 case EM_CYGNUS_FR30
:
1004 rtype
= elf_fr30_reloc_type (type
);
1008 rtype
= elf_frv_reloc_type (type
);
1012 rtype
= elf_mcore_reloc_type (type
);
1016 rtype
= elf_mmix_reloc_type (type
);
1021 rtype
= elf_msp430_reloc_type (type
);
1025 rtype
= elf_ppc_reloc_type (type
);
1029 rtype
= elf_ppc64_reloc_type (type
);
1033 case EM_MIPS_RS3_LE
:
1034 rtype
= elf_mips_reloc_type (type
);
1037 rtype2
= elf_mips_reloc_type (type2
);
1038 rtype3
= elf_mips_reloc_type (type3
);
1043 rtype
= elf_alpha_reloc_type (type
);
1047 rtype
= elf_arm_reloc_type (type
);
1051 rtype
= elf_arc_reloc_type (type
);
1055 rtype
= elf_hppa_reloc_type (type
);
1061 rtype
= elf_h8_reloc_type (type
);
1066 rtype
= elf_or32_reloc_type (type
);
1071 rtype
= elf_pj_reloc_type (type
);
1074 rtype
= elf_ia64_reloc_type (type
);
1078 rtype
= elf_cris_reloc_type (type
);
1082 rtype
= elf_i860_reloc_type (type
);
1086 rtype
= elf_x86_64_reloc_type (type
);
1090 rtype
= i370_reloc_type (type
);
1095 rtype
= elf_s390_reloc_type (type
);
1099 rtype
= elf_xstormy16_reloc_type (type
);
1103 rtype
= elf_crx_reloc_type (type
);
1107 rtype
= elf_vax_reloc_type (type
);
1112 rtype
= elf_ip2k_reloc_type (type
);
1116 rtype
= elf_iq2000_reloc_type (type
);
1121 rtype
= elf_xtensa_reloc_type (type
);
1125 rtype
= elf_m32c_reloc_type (type
);
1129 rtype
= elf_mt_reloc_type (type
);
1133 rtype
= elf_bfin_reloc_type (type
);
1139 #ifdef _bfd_int64_low
1140 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type
));
1142 printf (_("unrecognized: %-7lx"), type
);
1145 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1147 if (elf_header
.e_machine
== EM_ALPHA
1148 && streq (rtype
, "R_ALPHA_LITUSE")
1151 switch (rels
[i
].r_addend
)
1153 case LITUSE_ALPHA_ADDR
: rtype
= "ADDR"; break;
1154 case LITUSE_ALPHA_BASE
: rtype
= "BASE"; break;
1155 case LITUSE_ALPHA_BYTOFF
: rtype
= "BYTOFF"; break;
1156 case LITUSE_ALPHA_JSR
: rtype
= "JSR"; break;
1157 case LITUSE_ALPHA_TLSGD
: rtype
= "TLSGD"; break;
1158 case LITUSE_ALPHA_TLSLDM
: rtype
= "TLSLDM"; break;
1159 case LITUSE_ALPHA_JSRDIRECT
: rtype
= "JSRDIRECT"; break;
1160 default: rtype
= NULL
;
1163 printf (" (%s)", rtype
);
1167 printf (_("<unknown addend: %lx>"),
1168 (unsigned long) rels
[i
].r_addend
);
1171 else if (symtab_index
)
1173 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1174 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1177 Elf_Internal_Sym
*psym
;
1179 psym
= symtab
+ symtab_index
;
1182 print_vma (psym
->st_value
, LONG_HEX
);
1183 printf (is_32bit_elf
? " " : " ");
1185 if (psym
->st_name
== 0)
1187 const char *sec_name
= "<null>";
1190 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1192 bfd_vma sec_index
= (bfd_vma
) -1;
1194 if (psym
->st_shndx
< SHN_LORESERVE
)
1195 sec_index
= psym
->st_shndx
;
1196 else if (psym
->st_shndx
> SHN_HIRESERVE
)
1197 sec_index
= psym
->st_shndx
- (SHN_HIRESERVE
+ 1
1200 if (sec_index
!= (bfd_vma
) -1)
1201 sec_name
= SECTION_NAME (section_headers
+ sec_index
);
1202 else if (psym
->st_shndx
== SHN_ABS
)
1204 else if (psym
->st_shndx
== SHN_COMMON
)
1205 sec_name
= "COMMON";
1206 else if (elf_header
.e_machine
== EM_X86_64
1207 && psym
->st_shndx
== SHN_X86_64_LCOMMON
)
1208 sec_name
= "LARGE_COMMON";
1209 else if (elf_header
.e_machine
== EM_IA_64
1210 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1211 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1212 sec_name
= "ANSI_COM";
1215 sprintf (name_buf
, "<section 0x%x>",
1216 (unsigned int) psym
->st_shndx
);
1217 sec_name
= name_buf
;
1220 print_symbol (22, sec_name
);
1222 else if (strtab
== NULL
)
1223 printf (_("<string table index: %3ld>"), psym
->st_name
);
1224 else if (psym
->st_name
>= strtablen
)
1225 printf (_("<corrupt string table index: %3ld>"), psym
->st_name
);
1227 print_symbol (22, strtab
+ psym
->st_name
);
1230 printf (" + %lx", (unsigned long) rels
[i
].r_addend
);
1235 printf ("%*c", is_32bit_elf
?
1236 (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1237 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1240 if (elf_header
.e_machine
== EM_SPARCV9
&& streq (rtype
, "R_SPARC_OLO10"))
1241 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1245 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1247 printf (" Type2: ");
1250 #ifdef _bfd_int64_low
1251 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2
));
1253 printf (_("unrecognized: %-7lx"), type2
);
1256 printf ("%-17.17s", rtype2
);
1258 printf ("\n Type3: ");
1261 #ifdef _bfd_int64_low
1262 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3
));
1264 printf (_("unrecognized: %-7lx"), type3
);
1267 printf ("%-17.17s", rtype3
);
1279 get_mips_dynamic_type (unsigned long type
)
1283 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1284 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1285 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1286 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1287 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1288 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1289 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1290 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1291 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1292 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1293 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1294 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1295 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1296 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1297 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1298 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1299 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1300 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1301 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1302 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1303 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1304 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1305 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1306 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1307 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1308 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1309 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1310 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1311 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1312 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1313 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1314 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1315 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1316 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1317 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1318 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1319 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1320 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1321 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1322 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1323 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1324 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1325 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1332 get_sparc64_dynamic_type (unsigned long type
)
1336 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1343 get_ppc_dynamic_type (unsigned long type
)
1347 case DT_PPC_GOT
: return "PPC_GOT";
1354 get_ppc64_dynamic_type (unsigned long type
)
1358 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1359 case DT_PPC64_OPD
: return "PPC64_OPD";
1360 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1367 get_parisc_dynamic_type (unsigned long type
)
1371 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1372 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1373 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1374 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1375 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1376 case DT_HP_PREINIT
: return "HP_PREINIT";
1377 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1378 case DT_HP_NEEDED
: return "HP_NEEDED";
1379 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1380 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1381 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1382 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1383 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1384 case DT_HP_EPLTREL
: return "HP_GST_EPLTREL";
1385 case DT_HP_EPLTRELSZ
: return "HP_GST_EPLTRELSZ";
1386 case DT_HP_FILTERED
: return "HP_FILTERED";
1387 case DT_HP_FILTER_TLS
: return "HP_FILTER_TLS";
1388 case DT_HP_COMPAT_FILTERED
: return "HP_COMPAT_FILTERED";
1389 case DT_HP_LAZYLOAD
: return "HP_LAZYLOAD";
1390 case DT_HP_BIND_NOW_COUNT
: return "HP_BIND_NOW_COUNT";
1391 case DT_PLT
: return "PLT";
1392 case DT_PLT_SIZE
: return "PLT_SIZE";
1393 case DT_DLT
: return "DLT";
1394 case DT_DLT_SIZE
: return "DLT_SIZE";
1401 get_ia64_dynamic_type (unsigned long type
)
1405 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1412 get_alpha_dynamic_type (unsigned long type
)
1416 case DT_ALPHA_PLTRO
: return "ALPHA_PLTRO";
1423 get_dynamic_type (unsigned long type
)
1425 static char buff
[64];
1429 case DT_NULL
: return "NULL";
1430 case DT_NEEDED
: return "NEEDED";
1431 case DT_PLTRELSZ
: return "PLTRELSZ";
1432 case DT_PLTGOT
: return "PLTGOT";
1433 case DT_HASH
: return "HASH";
1434 case DT_STRTAB
: return "STRTAB";
1435 case DT_SYMTAB
: return "SYMTAB";
1436 case DT_RELA
: return "RELA";
1437 case DT_RELASZ
: return "RELASZ";
1438 case DT_RELAENT
: return "RELAENT";
1439 case DT_STRSZ
: return "STRSZ";
1440 case DT_SYMENT
: return "SYMENT";
1441 case DT_INIT
: return "INIT";
1442 case DT_FINI
: return "FINI";
1443 case DT_SONAME
: return "SONAME";
1444 case DT_RPATH
: return "RPATH";
1445 case DT_SYMBOLIC
: return "SYMBOLIC";
1446 case DT_REL
: return "REL";
1447 case DT_RELSZ
: return "RELSZ";
1448 case DT_RELENT
: return "RELENT";
1449 case DT_PLTREL
: return "PLTREL";
1450 case DT_DEBUG
: return "DEBUG";
1451 case DT_TEXTREL
: return "TEXTREL";
1452 case DT_JMPREL
: return "JMPREL";
1453 case DT_BIND_NOW
: return "BIND_NOW";
1454 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1455 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1456 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1457 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1458 case DT_RUNPATH
: return "RUNPATH";
1459 case DT_FLAGS
: return "FLAGS";
1461 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1462 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1464 case DT_CHECKSUM
: return "CHECKSUM";
1465 case DT_PLTPADSZ
: return "PLTPADSZ";
1466 case DT_MOVEENT
: return "MOVEENT";
1467 case DT_MOVESZ
: return "MOVESZ";
1468 case DT_FEATURE
: return "FEATURE";
1469 case DT_POSFLAG_1
: return "POSFLAG_1";
1470 case DT_SYMINSZ
: return "SYMINSZ";
1471 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1473 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1474 case DT_CONFIG
: return "CONFIG";
1475 case DT_DEPAUDIT
: return "DEPAUDIT";
1476 case DT_AUDIT
: return "AUDIT";
1477 case DT_PLTPAD
: return "PLTPAD";
1478 case DT_MOVETAB
: return "MOVETAB";
1479 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1481 case DT_VERSYM
: return "VERSYM";
1483 case DT_TLSDESC_GOT
: return "TLSDESC_GOT";
1484 case DT_TLSDESC_PLT
: return "TLSDESC_PLT";
1485 case DT_RELACOUNT
: return "RELACOUNT";
1486 case DT_RELCOUNT
: return "RELCOUNT";
1487 case DT_FLAGS_1
: return "FLAGS_1";
1488 case DT_VERDEF
: return "VERDEF";
1489 case DT_VERDEFNUM
: return "VERDEFNUM";
1490 case DT_VERNEED
: return "VERNEED";
1491 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1493 case DT_AUXILIARY
: return "AUXILIARY";
1494 case DT_USED
: return "USED";
1495 case DT_FILTER
: return "FILTER";
1497 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1498 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1499 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1500 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1501 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1504 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1508 switch (elf_header
.e_machine
)
1511 case EM_MIPS_RS3_LE
:
1512 result
= get_mips_dynamic_type (type
);
1515 result
= get_sparc64_dynamic_type (type
);
1518 result
= get_ppc_dynamic_type (type
);
1521 result
= get_ppc64_dynamic_type (type
);
1524 result
= get_ia64_dynamic_type (type
);
1527 result
= get_alpha_dynamic_type (type
);
1537 snprintf (buff
, sizeof (buff
), _("Processor Specific: %lx"), type
);
1539 else if (((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1540 || (elf_header
.e_machine
== EM_PARISC
1541 && (type
>= OLD_DT_LOOS
) && (type
<= OLD_DT_HIOS
)))
1545 switch (elf_header
.e_machine
)
1548 result
= get_parisc_dynamic_type (type
);
1558 snprintf (buff
, sizeof (buff
), _("Operating System specific: %lx"),
1562 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), type
);
1569 get_file_type (unsigned e_type
)
1571 static char buff
[32];
1575 case ET_NONE
: return _("NONE (None)");
1576 case ET_REL
: return _("REL (Relocatable file)");
1577 case ET_EXEC
: return _("EXEC (Executable file)");
1578 case ET_DYN
: return _("DYN (Shared object file)");
1579 case ET_CORE
: return _("CORE (Core file)");
1582 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1583 snprintf (buff
, sizeof (buff
), _("Processor Specific: (%x)"), e_type
);
1584 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1585 snprintf (buff
, sizeof (buff
), _("OS Specific: (%x)"), e_type
);
1587 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_type
);
1593 get_machine_name (unsigned e_machine
)
1595 static char buff
[64]; /* XXX */
1599 case EM_NONE
: return _("None");
1600 case EM_M32
: return "WE32100";
1601 case EM_SPARC
: return "Sparc";
1602 case EM_386
: return "Intel 80386";
1603 case EM_68K
: return "MC68000";
1604 case EM_88K
: return "MC88000";
1605 case EM_486
: return "Intel 80486";
1606 case EM_860
: return "Intel 80860";
1607 case EM_MIPS
: return "MIPS R3000";
1608 case EM_S370
: return "IBM System/370";
1609 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1610 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1611 case EM_PARISC
: return "HPPA";
1612 case EM_PPC_OLD
: return "Power PC (old)";
1613 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1614 case EM_960
: return "Intel 90860";
1615 case EM_PPC
: return "PowerPC";
1616 case EM_PPC64
: return "PowerPC64";
1617 case EM_V800
: return "NEC V800";
1618 case EM_FR20
: return "Fujitsu FR20";
1619 case EM_RH32
: return "TRW RH32";
1620 case EM_MCORE
: return "MCORE";
1621 case EM_ARM
: return "ARM";
1622 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1623 case EM_SH
: return "Renesas / SuperH SH";
1624 case EM_SPARCV9
: return "Sparc v9";
1625 case EM_TRICORE
: return "Siemens Tricore";
1626 case EM_ARC
: return "ARC";
1627 case EM_H8_300
: return "Renesas H8/300";
1628 case EM_H8_300H
: return "Renesas H8/300H";
1629 case EM_H8S
: return "Renesas H8S";
1630 case EM_H8_500
: return "Renesas H8/500";
1631 case EM_IA_64
: return "Intel IA-64";
1632 case EM_MIPS_X
: return "Stanford MIPS-X";
1633 case EM_COLDFIRE
: return "Motorola Coldfire";
1634 case EM_68HC12
: return "Motorola M68HC12";
1635 case EM_ALPHA
: return "Alpha";
1636 case EM_CYGNUS_D10V
:
1637 case EM_D10V
: return "d10v";
1638 case EM_CYGNUS_D30V
:
1639 case EM_D30V
: return "d30v";
1640 case EM_CYGNUS_M32R
:
1641 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
1642 case EM_CYGNUS_V850
:
1643 case EM_V850
: return "NEC v850";
1644 case EM_CYGNUS_MN10300
:
1645 case EM_MN10300
: return "mn10300";
1646 case EM_CYGNUS_MN10200
:
1647 case EM_MN10200
: return "mn10200";
1648 case EM_CYGNUS_FR30
:
1649 case EM_FR30
: return "Fujitsu FR30";
1650 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1652 case EM_PJ
: return "picoJava";
1653 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1654 case EM_PCP
: return "Siemens PCP";
1655 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1656 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1657 case EM_STARCORE
: return "Motorola Star*Core processor";
1658 case EM_ME16
: return "Toyota ME16 processor";
1659 case EM_ST100
: return "STMicroelectronics ST100 processor";
1660 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1661 case EM_FX66
: return "Siemens FX66 microcontroller";
1662 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1663 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1664 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1665 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1666 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1667 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1668 case EM_SVX
: return "Silicon Graphics SVx";
1669 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1670 case EM_VAX
: return "Digital VAX";
1672 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1673 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1674 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1675 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1676 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1677 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1678 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1679 case EM_PRISM
: return "Vitesse Prism";
1680 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1682 case EM_S390
: return "IBM S/390";
1683 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1685 case EM_OR32
: return "OpenRISC";
1686 case EM_CRX
: return "National Semiconductor CRX microprocessor";
1687 case EM_DLX
: return "OpenDLX";
1689 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1690 case EM_IQ2000
: return "Vitesse IQ2000";
1692 case EM_XTENSA
: return "Tensilica Xtensa Processor";
1693 case EM_M32C
: return "Renesas M32c";
1694 case EM_MT
: return "Morpho Techologies MT processor";
1695 case EM_BLACKFIN
: return "Analog Devices Blackfin";
1696 case EM_NIOS32
: return "Altera Nios";
1697 case EM_ALTERA_NIOS2
: return "Altera Nios II";
1698 case EM_XC16X
: return "Infineon Technologies xc16x";
1700 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_machine
);
1706 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
1711 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1712 e_flags
&= ~ EF_ARM_EABIMASK
;
1714 /* Handle "generic" ARM flags. */
1715 if (e_flags
& EF_ARM_RELEXEC
)
1717 strcat (buf
, ", relocatable executable");
1718 e_flags
&= ~ EF_ARM_RELEXEC
;
1721 if (e_flags
& EF_ARM_HASENTRY
)
1723 strcat (buf
, ", has entry point");
1724 e_flags
&= ~ EF_ARM_HASENTRY
;
1727 /* Now handle EABI specific flags. */
1731 strcat (buf
, ", <unrecognized EABI>");
1736 case EF_ARM_EABI_VER1
:
1737 strcat (buf
, ", Version1 EABI");
1742 /* Process flags one bit at a time. */
1743 flag
= e_flags
& - e_flags
;
1748 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1749 strcat (buf
, ", sorted symbol tables");
1759 case EF_ARM_EABI_VER2
:
1760 strcat (buf
, ", Version2 EABI");
1765 /* Process flags one bit at a time. */
1766 flag
= e_flags
& - e_flags
;
1771 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1772 strcat (buf
, ", sorted symbol tables");
1775 case EF_ARM_DYNSYMSUSESEGIDX
:
1776 strcat (buf
, ", dynamic symbols use segment index");
1779 case EF_ARM_MAPSYMSFIRST
:
1780 strcat (buf
, ", mapping symbols precede others");
1790 case EF_ARM_EABI_VER3
:
1791 strcat (buf
, ", Version3 EABI");
1794 case EF_ARM_EABI_VER4
:
1795 strcat (buf
, ", Version4 EABI");
1800 /* Process flags one bit at a time. */
1801 flag
= e_flags
& - e_flags
;
1807 strcat (buf
, ", BE8");
1811 strcat (buf
, ", LE8");
1821 case EF_ARM_EABI_UNKNOWN
:
1822 strcat (buf
, ", GNU EABI");
1827 /* Process flags one bit at a time. */
1828 flag
= e_flags
& - e_flags
;
1833 case EF_ARM_INTERWORK
:
1834 strcat (buf
, ", interworking enabled");
1837 case EF_ARM_APCS_26
:
1838 strcat (buf
, ", uses APCS/26");
1841 case EF_ARM_APCS_FLOAT
:
1842 strcat (buf
, ", uses APCS/float");
1846 strcat (buf
, ", position independent");
1850 strcat (buf
, ", 8 bit structure alignment");
1853 case EF_ARM_NEW_ABI
:
1854 strcat (buf
, ", uses new ABI");
1857 case EF_ARM_OLD_ABI
:
1858 strcat (buf
, ", uses old ABI");
1861 case EF_ARM_SOFT_FLOAT
:
1862 strcat (buf
, ", software FP");
1865 case EF_ARM_VFP_FLOAT
:
1866 strcat (buf
, ", VFP");
1869 case EF_ARM_MAVERICK_FLOAT
:
1870 strcat (buf
, ", Maverick FP");
1881 strcat (buf
,", <unknown>");
1885 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
1887 static char buf
[1024];
1899 decode_ARM_machine_flags (e_flags
, buf
);
1903 switch (e_flags
& EF_FRV_CPU_MASK
)
1905 case EF_FRV_CPU_GENERIC
:
1909 strcat (buf
, ", fr???");
1912 case EF_FRV_CPU_FR300
:
1913 strcat (buf
, ", fr300");
1916 case EF_FRV_CPU_FR400
:
1917 strcat (buf
, ", fr400");
1919 case EF_FRV_CPU_FR405
:
1920 strcat (buf
, ", fr405");
1923 case EF_FRV_CPU_FR450
:
1924 strcat (buf
, ", fr450");
1927 case EF_FRV_CPU_FR500
:
1928 strcat (buf
, ", fr500");
1930 case EF_FRV_CPU_FR550
:
1931 strcat (buf
, ", fr550");
1934 case EF_FRV_CPU_SIMPLE
:
1935 strcat (buf
, ", simple");
1937 case EF_FRV_CPU_TOMCAT
:
1938 strcat (buf
, ", tomcat");
1944 if (e_flags
& EF_M68K_CPU32
)
1945 strcat (buf
, ", cpu32");
1946 if (e_flags
& EF_M68K_M68000
)
1947 strcat (buf
, ", m68000");
1948 if (e_flags
& EF_M68K_ISA_MASK
)
1950 char const *isa
= _("unknown");
1951 char const *mac
= _("unknown mac");
1952 char const *additional
= NULL
;
1954 switch (e_flags
& EF_M68K_ISA_MASK
)
1956 case EF_M68K_ISA_A_NODIV
:
1958 additional
= ", nodiv";
1963 case EF_M68K_ISA_A_PLUS
:
1966 case EF_M68K_ISA_B_NOUSP
:
1968 additional
= ", nousp";
1974 strcat (buf
, ", cf, isa ");
1977 strcat (buf
, additional
);
1978 if (e_flags
& EF_M68K_FLOAT
)
1979 strcat (buf
, ", float");
1980 switch (e_flags
& EF_M68K_MAC_MASK
)
2001 if (e_flags
& EF_PPC_EMB
)
2002 strcat (buf
, ", emb");
2004 if (e_flags
& EF_PPC_RELOCATABLE
)
2005 strcat (buf
, ", relocatable");
2007 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
2008 strcat (buf
, ", relocatable-lib");
2012 case EM_CYGNUS_V850
:
2013 switch (e_flags
& EF_V850_ARCH
)
2016 strcat (buf
, ", v850e1");
2019 strcat (buf
, ", v850e");
2022 strcat (buf
, ", v850");
2025 strcat (buf
, ", unknown v850 architecture variant");
2031 case EM_CYGNUS_M32R
:
2032 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
2033 strcat (buf
, ", m32r");
2038 case EM_MIPS_RS3_LE
:
2039 if (e_flags
& EF_MIPS_NOREORDER
)
2040 strcat (buf
, ", noreorder");
2042 if (e_flags
& EF_MIPS_PIC
)
2043 strcat (buf
, ", pic");
2045 if (e_flags
& EF_MIPS_CPIC
)
2046 strcat (buf
, ", cpic");
2048 if (e_flags
& EF_MIPS_UCODE
)
2049 strcat (buf
, ", ugen_reserved");
2051 if (e_flags
& EF_MIPS_ABI2
)
2052 strcat (buf
, ", abi2");
2054 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
2055 strcat (buf
, ", odk first");
2057 if (e_flags
& EF_MIPS_32BITMODE
)
2058 strcat (buf
, ", 32bitmode");
2060 switch ((e_flags
& EF_MIPS_MACH
))
2062 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
2063 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
2064 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
2065 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
2066 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
2067 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
2068 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
2069 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
2070 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
2071 case E_MIPS_MACH_9000
: strcat (buf
, ", 9000"); break;
2073 /* We simply ignore the field in this case to avoid confusion:
2074 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2077 default: strcat (buf
, ", unknown CPU"); break;
2080 switch ((e_flags
& EF_MIPS_ABI
))
2082 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
2083 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
2084 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
2085 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
2087 /* We simply ignore the field in this case to avoid confusion:
2088 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2089 This means it is likely to be an o32 file, but not for
2092 default: strcat (buf
, ", unknown ABI"); break;
2095 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
2096 strcat (buf
, ", mdmx");
2098 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
2099 strcat (buf
, ", mips16");
2101 switch ((e_flags
& EF_MIPS_ARCH
))
2103 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
2104 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
2105 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
2106 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
2107 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
2108 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
2109 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
2110 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
2111 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
2112 default: strcat (buf
, ", unknown ISA"); break;
2118 switch ((e_flags
& EF_SH_MACH_MASK
))
2120 case EF_SH1
: strcat (buf
, ", sh1"); break;
2121 case EF_SH2
: strcat (buf
, ", sh2"); break;
2122 case EF_SH3
: strcat (buf
, ", sh3"); break;
2123 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
2124 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
2125 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
2126 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
2127 case EF_SH4
: strcat (buf
, ", sh4"); break;
2128 case EF_SH5
: strcat (buf
, ", sh5"); break;
2129 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
2130 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
2131 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
2132 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
2133 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
2134 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
2135 case EF_SH3_NOMMU
: strcat (buf
, ", sh3-nommu"); break;
2136 case EF_SH4_NOMMU_NOFPU
: strcat (buf
, ", sh4-nommu-nofpu"); break;
2137 case EF_SH2A_SH4_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2138 case EF_SH2A_SH3_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh3-nommu"); break;
2139 case EF_SH2A_SH4
: strcat (buf
, ", sh2a-or-sh4"); break;
2140 case EF_SH2A_SH3E
: strcat (buf
, ", sh2a-or-sh3e"); break;
2141 default: strcat (buf
, ", unknown ISA"); break;
2147 if (e_flags
& EF_SPARC_32PLUS
)
2148 strcat (buf
, ", v8+");
2150 if (e_flags
& EF_SPARC_SUN_US1
)
2151 strcat (buf
, ", ultrasparcI");
2153 if (e_flags
& EF_SPARC_SUN_US3
)
2154 strcat (buf
, ", ultrasparcIII");
2156 if (e_flags
& EF_SPARC_HAL_R1
)
2157 strcat (buf
, ", halr1");
2159 if (e_flags
& EF_SPARC_LEDATA
)
2160 strcat (buf
, ", ledata");
2162 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2163 strcat (buf
, ", tso");
2165 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2166 strcat (buf
, ", pso");
2168 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2169 strcat (buf
, ", rmo");
2173 switch (e_flags
& EF_PARISC_ARCH
)
2175 case EFA_PARISC_1_0
:
2176 strcpy (buf
, ", PA-RISC 1.0");
2178 case EFA_PARISC_1_1
:
2179 strcpy (buf
, ", PA-RISC 1.1");
2181 case EFA_PARISC_2_0
:
2182 strcpy (buf
, ", PA-RISC 2.0");
2187 if (e_flags
& EF_PARISC_TRAPNIL
)
2188 strcat (buf
, ", trapnil");
2189 if (e_flags
& EF_PARISC_EXT
)
2190 strcat (buf
, ", ext");
2191 if (e_flags
& EF_PARISC_LSB
)
2192 strcat (buf
, ", lsb");
2193 if (e_flags
& EF_PARISC_WIDE
)
2194 strcat (buf
, ", wide");
2195 if (e_flags
& EF_PARISC_NO_KABP
)
2196 strcat (buf
, ", no kabp");
2197 if (e_flags
& EF_PARISC_LAZYSWAP
)
2198 strcat (buf
, ", lazyswap");
2203 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2204 strcat (buf
, ", new calling convention");
2206 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2207 strcat (buf
, ", gnu calling convention");
2211 if ((e_flags
& EF_IA_64_ABI64
))
2212 strcat (buf
, ", 64-bit");
2214 strcat (buf
, ", 32-bit");
2215 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2216 strcat (buf
, ", reduced fp model");
2217 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2218 strcat (buf
, ", no function descriptors, constant gp");
2219 else if ((e_flags
& EF_IA_64_CONS_GP
))
2220 strcat (buf
, ", constant gp");
2221 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2222 strcat (buf
, ", absolute");
2226 if ((e_flags
& EF_VAX_NONPIC
))
2227 strcat (buf
, ", non-PIC");
2228 if ((e_flags
& EF_VAX_DFLOAT
))
2229 strcat (buf
, ", D-Float");
2230 if ((e_flags
& EF_VAX_GFLOAT
))
2231 strcat (buf
, ", G-Float");
2240 get_osabi_name (unsigned int osabi
)
2242 static char buff
[32];
2246 case ELFOSABI_NONE
: return "UNIX - System V";
2247 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2248 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2249 case ELFOSABI_LINUX
: return "UNIX - Linux";
2250 case ELFOSABI_HURD
: return "GNU/Hurd";
2251 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2252 case ELFOSABI_AIX
: return "UNIX - AIX";
2253 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2254 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2255 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2256 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2257 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2258 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2259 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2260 case ELFOSABI_AROS
: return "Amiga Research OS";
2261 case ELFOSABI_STANDALONE
: return _("Standalone App");
2262 case ELFOSABI_ARM
: return "ARM";
2264 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), osabi
);
2270 get_arm_segment_type (unsigned long type
)
2284 get_mips_segment_type (unsigned long type
)
2288 case PT_MIPS_REGINFO
:
2290 case PT_MIPS_RTPROC
:
2292 case PT_MIPS_OPTIONS
:
2302 get_parisc_segment_type (unsigned long type
)
2306 case PT_HP_TLS
: return "HP_TLS";
2307 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2308 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2309 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2310 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2311 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2312 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2313 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2314 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2315 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2316 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2317 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2318 case PT_HP_OPT_ANNOT
: return "HP_OPT_ANNOT";
2319 case PT_HP_HSL_ANNOT
: return "HP_HSL_ANNOT";
2320 case PT_HP_STACK
: return "HP_STACK";
2321 case PT_HP_CORE_UTSNAME
: return "HP_CORE_UTSNAME";
2322 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2323 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2324 case PT_PARISC_WEAKORDER
: return "PARISC_WEAKORDER";
2333 get_ia64_segment_type (unsigned long type
)
2337 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2338 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2339 case PT_HP_TLS
: return "HP_TLS";
2340 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2341 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2342 case PT_IA_64_HP_STACK
: return "HP_STACK";
2351 get_segment_type (unsigned long p_type
)
2353 static char buff
[32];
2357 case PT_NULL
: return "NULL";
2358 case PT_LOAD
: return "LOAD";
2359 case PT_DYNAMIC
: return "DYNAMIC";
2360 case PT_INTERP
: return "INTERP";
2361 case PT_NOTE
: return "NOTE";
2362 case PT_SHLIB
: return "SHLIB";
2363 case PT_PHDR
: return "PHDR";
2364 case PT_TLS
: return "TLS";
2366 case PT_GNU_EH_FRAME
:
2367 return "GNU_EH_FRAME";
2368 case PT_GNU_STACK
: return "GNU_STACK";
2369 case PT_GNU_RELRO
: return "GNU_RELRO";
2372 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2376 switch (elf_header
.e_machine
)
2379 result
= get_arm_segment_type (p_type
);
2382 case EM_MIPS_RS3_LE
:
2383 result
= get_mips_segment_type (p_type
);
2386 result
= get_parisc_segment_type (p_type
);
2389 result
= get_ia64_segment_type (p_type
);
2399 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2401 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2405 switch (elf_header
.e_machine
)
2408 result
= get_parisc_segment_type (p_type
);
2411 result
= get_ia64_segment_type (p_type
);
2421 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2424 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), p_type
);
2431 get_mips_section_type_name (unsigned int sh_type
)
2435 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2436 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2437 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2438 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2439 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2440 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2441 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2442 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2443 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2444 case SHT_MIPS_RELD
: return "MIPS_RELD";
2445 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2446 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2447 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2448 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2449 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2450 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2451 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2452 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2453 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2454 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2455 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2456 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2457 case SHT_MIPS_LINE
: return "MIPS_LINE";
2458 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2459 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2460 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2461 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2462 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2463 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2464 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2465 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2466 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2467 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2468 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2469 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2470 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2471 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2472 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2473 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2481 get_parisc_section_type_name (unsigned int sh_type
)
2485 case SHT_PARISC_EXT
: return "PARISC_EXT";
2486 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2487 case SHT_PARISC_DOC
: return "PARISC_DOC";
2488 case SHT_PARISC_ANNOT
: return "PARISC_ANNOT";
2489 case SHT_PARISC_SYMEXTN
: return "PARISC_SYMEXTN";
2490 case SHT_PARISC_STUBS
: return "PARISC_STUBS";
2491 case SHT_PARISC_DLKM
: return "PARISC_DLKM";
2499 get_ia64_section_type_name (unsigned int sh_type
)
2501 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2502 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2503 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2507 case SHT_IA_64_EXT
: return "IA_64_EXT";
2508 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2509 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2517 get_x86_64_section_type_name (unsigned int sh_type
)
2521 case SHT_X86_64_UNWIND
: return "X86_64_UNWIND";
2529 get_arm_section_type_name (unsigned int sh_type
)
2535 case SHT_ARM_PREEMPTMAP
:
2536 return "ARM_PREEMPTMAP";
2537 case SHT_ARM_ATTRIBUTES
:
2538 return "ARM_ATTRIBUTES";
2546 get_section_type_name (unsigned int sh_type
)
2548 static char buff
[32];
2552 case SHT_NULL
: return "NULL";
2553 case SHT_PROGBITS
: return "PROGBITS";
2554 case SHT_SYMTAB
: return "SYMTAB";
2555 case SHT_STRTAB
: return "STRTAB";
2556 case SHT_RELA
: return "RELA";
2557 case SHT_HASH
: return "HASH";
2558 case SHT_DYNAMIC
: return "DYNAMIC";
2559 case SHT_NOTE
: return "NOTE";
2560 case SHT_NOBITS
: return "NOBITS";
2561 case SHT_REL
: return "REL";
2562 case SHT_SHLIB
: return "SHLIB";
2563 case SHT_DYNSYM
: return "DYNSYM";
2564 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2565 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2566 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2567 case SHT_GROUP
: return "GROUP";
2568 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2569 case SHT_GNU_verdef
: return "VERDEF";
2570 case SHT_GNU_verneed
: return "VERNEED";
2571 case SHT_GNU_versym
: return "VERSYM";
2572 case 0x6ffffff0: return "VERSYM";
2573 case 0x6ffffffc: return "VERDEF";
2574 case 0x7ffffffd: return "AUXILIARY";
2575 case 0x7fffffff: return "FILTER";
2576 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2579 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2583 switch (elf_header
.e_machine
)
2586 case EM_MIPS_RS3_LE
:
2587 result
= get_mips_section_type_name (sh_type
);
2590 result
= get_parisc_section_type_name (sh_type
);
2593 result
= get_ia64_section_type_name (sh_type
);
2596 result
= get_x86_64_section_type_name (sh_type
);
2599 result
= get_arm_section_type_name (sh_type
);
2609 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2611 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2612 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2613 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2614 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2616 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), sh_type
);
2622 #define OPTION_DEBUG_DUMP 512
2624 static struct option options
[] =
2626 {"all", no_argument
, 0, 'a'},
2627 {"file-header", no_argument
, 0, 'h'},
2628 {"program-headers", no_argument
, 0, 'l'},
2629 {"headers", no_argument
, 0, 'e'},
2630 {"histogram", no_argument
, 0, 'I'},
2631 {"segments", no_argument
, 0, 'l'},
2632 {"sections", no_argument
, 0, 'S'},
2633 {"section-headers", no_argument
, 0, 'S'},
2634 {"section-groups", no_argument
, 0, 'g'},
2635 {"section-details", no_argument
, 0, 't'},
2636 {"full-section-name",no_argument
, 0, 'N'},
2637 {"symbols", no_argument
, 0, 's'},
2638 {"syms", no_argument
, 0, 's'},
2639 {"relocs", no_argument
, 0, 'r'},
2640 {"notes", no_argument
, 0, 'n'},
2641 {"dynamic", no_argument
, 0, 'd'},
2642 {"arch-specific", no_argument
, 0, 'A'},
2643 {"version-info", no_argument
, 0, 'V'},
2644 {"use-dynamic", no_argument
, 0, 'D'},
2645 {"hex-dump", required_argument
, 0, 'x'},
2646 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2647 {"unwind", no_argument
, 0, 'u'},
2648 #ifdef SUPPORT_DISASSEMBLY
2649 {"instruction-dump", required_argument
, 0, 'i'},
2652 {"version", no_argument
, 0, 'v'},
2653 {"wide", no_argument
, 0, 'W'},
2654 {"help", no_argument
, 0, 'H'},
2655 {0, no_argument
, 0, 0}
2661 fprintf (stdout
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2662 fprintf (stdout
, _(" Display information about the contents of ELF format files\n"));
2663 fprintf (stdout
, _(" Options are:\n\
2664 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2665 -h --file-header Display the ELF file header\n\
2666 -l --program-headers Display the program headers\n\
2667 --segments An alias for --program-headers\n\
2668 -S --section-headers Display the sections' header\n\
2669 --sections An alias for --section-headers\n\
2670 -g --section-groups Display the section groups\n\
2671 -t --section-details Display the section details\n\
2672 -e --headers Equivalent to: -h -l -S\n\
2673 -s --syms Display the symbol table\n\
2674 --symbols An alias for --syms\n\
2675 -n --notes Display the core notes (if present)\n\
2676 -r --relocs Display the relocations (if present)\n\
2677 -u --unwind Display the unwind info (if present)\n\
2678 -d --dynamic Display the dynamic section (if present)\n\
2679 -V --version-info Display the version sections (if present)\n\
2680 -A --arch-specific Display architecture specific information (if any).\n\
2681 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2682 -x --hex-dump=<number> Dump the contents of section <number>\n\
2683 -w[liaprmfFsoR] or\n\
2684 --debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]\n\
2685 Display the contents of DWARF2 debug sections\n"));
2686 #ifdef SUPPORT_DISASSEMBLY
2687 fprintf (stdout
, _("\
2688 -i --instruction-dump=<number>\n\
2689 Disassemble the contents of section <number>\n"));
2691 fprintf (stdout
, _("\
2692 -I --histogram Display histogram of bucket list lengths\n\
2693 -W --wide Allow output width to exceed 80 characters\n\
2694 @<file> Read options from <file>\n\
2695 -H --help Display this information\n\
2696 -v --version Display the version number of readelf\n"));
2697 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2702 /* Record the fact that the user wants the contents of section number
2703 SECTION to be displayed using the method(s) encoded as flags bits
2704 in TYPE. Note, TYPE can be zero if we are creating the array for
2708 request_dump (unsigned int section
, int type
)
2710 if (section
>= num_dump_sects
)
2712 char *new_dump_sects
;
2714 new_dump_sects
= calloc (section
+ 1, 1);
2716 if (new_dump_sects
== NULL
)
2717 error (_("Out of memory allocating dump request table."));
2720 /* Copy current flag settings. */
2721 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2725 dump_sects
= new_dump_sects
;
2726 num_dump_sects
= section
+ 1;
2731 dump_sects
[section
] |= type
;
2736 /* Request a dump by section name. */
2739 request_dump_byname (const char *section
, int type
)
2741 struct dump_list_entry
*new_request
;
2743 new_request
= malloc (sizeof (struct dump_list_entry
));
2745 error (_("Out of memory allocating dump request table."));
2747 new_request
->name
= strdup (section
);
2748 if (!new_request
->name
)
2749 error (_("Out of memory allocating dump request table."));
2751 new_request
->type
= type
;
2753 new_request
->next
= dump_sects_byname
;
2754 dump_sects_byname
= new_request
;
2758 parse_args (int argc
, char **argv
)
2765 while ((c
= getopt_long
2766 (argc
, argv
, "ersuahnldSDAINtgw::x:i:vVWH", options
, NULL
)) != EOF
)
2787 do_section_groups
++;
2795 do_section_groups
++;
2800 do_section_details
++;
2842 section
= strtoul (optarg
, & cp
, 0);
2843 if (! *cp
&& section
>= 0)
2844 request_dump (section
, HEX_DUMP
);
2846 request_dump_byname (optarg
, HEX_DUMP
);
2854 unsigned int index
= 0;
2858 while (optarg
[index
])
2859 switch (optarg
[index
++])
2868 do_debug_abbrevs
= 1;
2878 do_debug_pubnames
= 1;
2882 do_debug_aranges
= 1;
2886 do_debug_ranges
= 1;
2890 do_debug_frames_interp
= 1;
2892 do_debug_frames
= 1;
2897 do_debug_macinfo
= 1;
2911 warn (_("Unrecognized debug option '%s'\n"), optarg
);
2916 case OPTION_DEBUG_DUMP
:
2924 const char * option
;
2927 debug_dump_long_opts
;
2929 debug_dump_long_opts opts_table
[] =
2931 /* Please keep this table alpha- sorted. */
2932 { "Ranges", & do_debug_ranges
},
2933 { "abbrev", & do_debug_abbrevs
},
2934 { "aranges", & do_debug_aranges
},
2935 { "frames", & do_debug_frames
},
2936 { "frames-interp", & do_debug_frames_interp
},
2937 { "info", & do_debug_info
},
2938 { "line", & do_debug_lines
},
2939 { "loc", & do_debug_loc
},
2940 { "macro", & do_debug_macinfo
},
2941 { "pubnames", & do_debug_pubnames
},
2942 /* This entry is for compatability
2943 with earlier versions of readelf. */
2944 { "ranges", & do_debug_aranges
},
2945 { "str", & do_debug_str
},
2956 debug_dump_long_opts
* entry
;
2958 for (entry
= opts_table
; entry
->option
; entry
++)
2960 size_t len
= strlen (entry
->option
);
2962 if (strneq (p
, entry
->option
, len
)
2963 && (p
[len
] == ',' || p
[len
] == '\0'))
2965 * entry
->variable
= 1;
2967 /* The --debug-dump=frames-interp option also
2968 enables the --debug-dump=frames option. */
2969 if (do_debug_frames_interp
)
2970 do_debug_frames
= 1;
2977 if (entry
->option
== NULL
)
2979 warn (_("Unrecognized debug option '%s'\n"), p
);
2980 p
= strchr (p
, ',');
2990 #ifdef SUPPORT_DISASSEMBLY
2993 section
= strtoul (optarg
, & cp
, 0);
2994 if (! *cp
&& section
>= 0)
2996 request_dump (section
, DISASS_DUMP
);
3002 print_version (program_name
);
3011 #ifdef SUPPORT_DISASSEMBLY
3014 /* xgettext:c-format */
3015 error (_("Invalid option '-%c'\n"), c
);
3022 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
3023 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
3024 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
3025 && !do_section_groups
)
3029 warn (_("Nothing to do.\n"));
3035 get_elf_class (unsigned int elf_class
)
3037 static char buff
[32];
3041 case ELFCLASSNONE
: return _("none");
3042 case ELFCLASS32
: return "ELF32";
3043 case ELFCLASS64
: return "ELF64";
3045 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), elf_class
);
3051 get_data_encoding (unsigned int encoding
)
3053 static char buff
[32];
3057 case ELFDATANONE
: return _("none");
3058 case ELFDATA2LSB
: return _("2's complement, little endian");
3059 case ELFDATA2MSB
: return _("2's complement, big endian");
3061 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), encoding
);
3066 /* Decode the data held in 'elf_header'. */
3069 process_file_header (void)
3071 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
3072 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
3073 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
3074 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
3077 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3085 printf (_("ELF Header:\n"));
3086 printf (_(" Magic: "));
3087 for (i
= 0; i
< EI_NIDENT
; i
++)
3088 printf ("%2.2x ", elf_header
.e_ident
[i
]);
3090 printf (_(" Class: %s\n"),
3091 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
3092 printf (_(" Data: %s\n"),
3093 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
3094 printf (_(" Version: %d %s\n"),
3095 elf_header
.e_ident
[EI_VERSION
],
3096 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
3098 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
3101 printf (_(" OS/ABI: %s\n"),
3102 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
3103 printf (_(" ABI Version: %d\n"),
3104 elf_header
.e_ident
[EI_ABIVERSION
]);
3105 printf (_(" Type: %s\n"),
3106 get_file_type (elf_header
.e_type
));
3107 printf (_(" Machine: %s\n"),
3108 get_machine_name (elf_header
.e_machine
));
3109 printf (_(" Version: 0x%lx\n"),
3110 (unsigned long) elf_header
.e_version
);
3112 printf (_(" Entry point address: "));
3113 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3114 printf (_("\n Start of program headers: "));
3115 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3116 printf (_(" (bytes into file)\n Start of section headers: "));
3117 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
3118 printf (_(" (bytes into file)\n"));
3120 printf (_(" Flags: 0x%lx%s\n"),
3121 (unsigned long) elf_header
.e_flags
,
3122 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
3123 printf (_(" Size of this header: %ld (bytes)\n"),
3124 (long) elf_header
.e_ehsize
);
3125 printf (_(" Size of program headers: %ld (bytes)\n"),
3126 (long) elf_header
.e_phentsize
);
3127 printf (_(" Number of program headers: %ld\n"),
3128 (long) elf_header
.e_phnum
);
3129 printf (_(" Size of section headers: %ld (bytes)\n"),
3130 (long) elf_header
.e_shentsize
);
3131 printf (_(" Number of section headers: %ld"),
3132 (long) elf_header
.e_shnum
);
3133 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
3134 printf (" (%ld)", (long) section_headers
[0].sh_size
);
3135 putc ('\n', stdout
);
3136 printf (_(" Section header string table index: %ld"),
3137 (long) elf_header
.e_shstrndx
);
3138 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
3139 printf (" (%ld)", (long) section_headers
[0].sh_link
);
3140 putc ('\n', stdout
);
3143 if (section_headers
!= NULL
)
3145 if (elf_header
.e_shnum
== 0)
3146 elf_header
.e_shnum
= section_headers
[0].sh_size
;
3147 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
3148 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
3149 free (section_headers
);
3150 section_headers
= NULL
;
3158 get_32bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3160 Elf32_External_Phdr
*phdrs
;
3161 Elf32_External_Phdr
*external
;
3162 Elf_Internal_Phdr
*internal
;
3165 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3166 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3167 _("program headers"));
3171 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3172 i
< elf_header
.e_phnum
;
3173 i
++, internal
++, external
++)
3175 internal
->p_type
= BYTE_GET (external
->p_type
);
3176 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3177 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3178 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3179 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3180 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3181 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3182 internal
->p_align
= BYTE_GET (external
->p_align
);
3191 get_64bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3193 Elf64_External_Phdr
*phdrs
;
3194 Elf64_External_Phdr
*external
;
3195 Elf_Internal_Phdr
*internal
;
3198 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3199 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3200 _("program headers"));
3204 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3205 i
< elf_header
.e_phnum
;
3206 i
++, internal
++, external
++)
3208 internal
->p_type
= BYTE_GET (external
->p_type
);
3209 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3210 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3211 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3212 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3213 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3214 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3215 internal
->p_align
= BYTE_GET (external
->p_align
);
3223 /* Returns 1 if the program headers were read into `program_headers'. */
3226 get_program_headers (FILE *file
)
3228 Elf_Internal_Phdr
*phdrs
;
3230 /* Check cache of prior read. */
3231 if (program_headers
!= NULL
)
3234 phdrs
= cmalloc (elf_header
.e_phnum
, sizeof (Elf_Internal_Phdr
));
3238 error (_("Out of memory\n"));
3243 ? get_32bit_program_headers (file
, phdrs
)
3244 : get_64bit_program_headers (file
, phdrs
))
3246 program_headers
= phdrs
;
3254 /* Returns 1 if the program headers were loaded. */
3257 process_program_headers (FILE *file
)
3259 Elf_Internal_Phdr
*segment
;
3262 if (elf_header
.e_phnum
== 0)
3265 printf (_("\nThere are no program headers in this file.\n"));
3269 if (do_segments
&& !do_header
)
3271 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3272 printf (_("Entry point "));
3273 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3274 printf (_("\nThere are %d program headers, starting at offset "),
3275 elf_header
.e_phnum
);
3276 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3280 if (! get_program_headers (file
))
3285 if (elf_header
.e_phnum
> 1)
3286 printf (_("\nProgram Headers:\n"));
3288 printf (_("\nProgram Headers:\n"));
3292 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3295 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3299 (_(" Type Offset VirtAddr PhysAddr\n"));
3301 (_(" FileSiz MemSiz Flags Align\n"));
3308 for (i
= 0, segment
= program_headers
;
3309 i
< elf_header
.e_phnum
;
3314 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3318 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3319 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3320 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3321 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3322 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3324 (segment
->p_flags
& PF_R
? 'R' : ' '),
3325 (segment
->p_flags
& PF_W
? 'W' : ' '),
3326 (segment
->p_flags
& PF_X
? 'E' : ' '));
3327 printf ("%#lx", (unsigned long) segment
->p_align
);
3331 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3332 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3335 print_vma (segment
->p_offset
, FULL_HEX
);
3339 print_vma (segment
->p_vaddr
, FULL_HEX
);
3341 print_vma (segment
->p_paddr
, FULL_HEX
);
3344 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3345 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3348 print_vma (segment
->p_filesz
, FULL_HEX
);
3352 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3353 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3356 print_vma (segment
->p_offset
, FULL_HEX
);
3360 (segment
->p_flags
& PF_R
? 'R' : ' '),
3361 (segment
->p_flags
& PF_W
? 'W' : ' '),
3362 (segment
->p_flags
& PF_X
? 'E' : ' '));
3364 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3365 printf ("%#lx", (unsigned long) segment
->p_align
);
3368 print_vma (segment
->p_align
, PREFIX_HEX
);
3373 print_vma (segment
->p_offset
, FULL_HEX
);
3375 print_vma (segment
->p_vaddr
, FULL_HEX
);
3377 print_vma (segment
->p_paddr
, FULL_HEX
);
3379 print_vma (segment
->p_filesz
, FULL_HEX
);
3381 print_vma (segment
->p_memsz
, FULL_HEX
);
3383 (segment
->p_flags
& PF_R
? 'R' : ' '),
3384 (segment
->p_flags
& PF_W
? 'W' : ' '),
3385 (segment
->p_flags
& PF_X
? 'E' : ' '));
3386 print_vma (segment
->p_align
, HEX
);
3390 switch (segment
->p_type
)
3394 error (_("more than one dynamic segment\n"));
3396 /* Try to locate the .dynamic section. If there is
3397 a section header table, we can easily locate it. */
3398 if (section_headers
!= NULL
)
3400 Elf_Internal_Shdr
*sec
;
3402 sec
= find_section (".dynamic");
3403 if (sec
== NULL
|| sec
->sh_size
== 0)
3405 error (_("no .dynamic section in the dynamic segment"));
3409 dynamic_addr
= sec
->sh_offset
;
3410 dynamic_size
= sec
->sh_size
;
3412 if (dynamic_addr
< segment
->p_offset
3413 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
3414 warn (_("the .dynamic section is not contained within the dynamic segment"));
3415 else if (dynamic_addr
> segment
->p_offset
)
3416 warn (_("the .dynamic section is not the first section in the dynamic segment."));
3420 /* Otherwise, we can only assume that the .dynamic
3421 section is the first section in the DYNAMIC segment. */
3422 dynamic_addr
= segment
->p_offset
;
3423 dynamic_size
= segment
->p_filesz
;
3428 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3430 error (_("Unable to find program interpreter name\n"));
3433 program_interpreter
[0] = 0;
3434 fscanf (file
, "%63s", program_interpreter
);
3437 printf (_("\n [Requesting program interpreter: %s]"),
3438 program_interpreter
);
3444 putc ('\n', stdout
);
3447 if (do_segments
&& section_headers
!= NULL
&& string_table
!= NULL
)
3449 printf (_("\n Section to Segment mapping:\n"));
3450 printf (_(" Segment Sections...\n"));
3452 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3455 Elf_Internal_Shdr
*section
;
3457 segment
= program_headers
+ i
;
3458 section
= section_headers
;
3460 printf (" %2.2d ", i
);
3462 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3464 if (ELF_IS_SECTION_IN_SEGMENT_MEMORY(section
, segment
))
3465 printf ("%s ", SECTION_NAME (section
));
3476 /* Find the file offset corresponding to VMA by using the program headers. */
3479 offset_from_vma (FILE *file
, bfd_vma vma
, bfd_size_type size
)
3481 Elf_Internal_Phdr
*seg
;
3483 if (! get_program_headers (file
))
3485 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3489 for (seg
= program_headers
;
3490 seg
< program_headers
+ elf_header
.e_phnum
;
3493 if (seg
->p_type
!= PT_LOAD
)
3496 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3497 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3498 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3501 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3508 get_32bit_section_headers (FILE *file
, unsigned int num
)
3510 Elf32_External_Shdr
*shdrs
;
3511 Elf_Internal_Shdr
*internal
;
3514 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3515 elf_header
.e_shentsize
, num
, _("section headers"));
3519 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3521 if (section_headers
== NULL
)
3523 error (_("Out of memory\n"));
3527 for (i
= 0, internal
= section_headers
;
3531 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3532 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3533 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3534 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3535 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3536 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3537 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3538 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3539 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3540 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3549 get_64bit_section_headers (FILE *file
, unsigned int num
)
3551 Elf64_External_Shdr
*shdrs
;
3552 Elf_Internal_Shdr
*internal
;
3555 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3556 elf_header
.e_shentsize
, num
, _("section headers"));
3560 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3562 if (section_headers
== NULL
)
3564 error (_("Out of memory\n"));
3568 for (i
= 0, internal
= section_headers
;
3572 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3573 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3574 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3575 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3576 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3577 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3578 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3579 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3580 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3581 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3589 static Elf_Internal_Sym
*
3590 get_32bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3592 unsigned long number
;
3593 Elf32_External_Sym
*esyms
;
3594 Elf_External_Sym_Shndx
*shndx
;
3595 Elf_Internal_Sym
*isyms
;
3596 Elf_Internal_Sym
*psym
;
3599 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3605 if (symtab_shndx_hdr
!= NULL
3606 && (symtab_shndx_hdr
->sh_link
3607 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3609 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3610 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3618 number
= section
->sh_size
/ section
->sh_entsize
;
3619 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3623 error (_("Out of memory\n"));
3630 for (j
= 0, psym
= isyms
;
3634 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3635 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3636 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3637 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3638 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3640 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3641 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3642 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3652 static Elf_Internal_Sym
*
3653 get_64bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3655 unsigned long number
;
3656 Elf64_External_Sym
*esyms
;
3657 Elf_External_Sym_Shndx
*shndx
;
3658 Elf_Internal_Sym
*isyms
;
3659 Elf_Internal_Sym
*psym
;
3662 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3668 if (symtab_shndx_hdr
!= NULL
3669 && (symtab_shndx_hdr
->sh_link
3670 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3672 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3673 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3681 number
= section
->sh_size
/ section
->sh_entsize
;
3682 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3686 error (_("Out of memory\n"));
3693 for (j
= 0, psym
= isyms
;
3697 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3698 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3699 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3700 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3701 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3703 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3704 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3705 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3716 get_elf_section_flags (bfd_vma sh_flags
)
3718 static char buff
[1024];
3720 int field_size
= is_32bit_elf
? 8 : 16;
3721 int index
, size
= sizeof (buff
) - (field_size
+ 4 + 1);
3722 bfd_vma os_flags
= 0;
3723 bfd_vma proc_flags
= 0;
3724 bfd_vma unknown_flags
= 0;
3738 { "LINK ORDER", 10 },
3739 { "OS NONCONF", 10 },
3744 if (do_section_details
)
3746 sprintf (buff
, "[%*.*lx]: ",
3747 field_size
, field_size
, (unsigned long) sh_flags
);
3748 p
+= field_size
+ 4;
3755 flag
= sh_flags
& - sh_flags
;
3758 if (do_section_details
)
3762 case SHF_WRITE
: index
= 0; break;
3763 case SHF_ALLOC
: index
= 1; break;
3764 case SHF_EXECINSTR
: index
= 2; break;
3765 case SHF_MERGE
: index
= 3; break;
3766 case SHF_STRINGS
: index
= 4; break;
3767 case SHF_INFO_LINK
: index
= 5; break;
3768 case SHF_LINK_ORDER
: index
= 6; break;
3769 case SHF_OS_NONCONFORMING
: index
= 7; break;
3770 case SHF_GROUP
: index
= 8; break;
3771 case SHF_TLS
: index
= 9; break;
3780 if (p
!= buff
+ field_size
+ 4)
3782 if (size
< (10 + 2))
3789 size
-= flags
[index
].len
;
3790 p
= stpcpy (p
, flags
[index
].str
);
3792 else if (flag
& SHF_MASKOS
)
3794 else if (flag
& SHF_MASKPROC
)
3797 unknown_flags
|= flag
;
3803 case SHF_WRITE
: *p
= 'W'; break;
3804 case SHF_ALLOC
: *p
= 'A'; break;
3805 case SHF_EXECINSTR
: *p
= 'X'; break;
3806 case SHF_MERGE
: *p
= 'M'; break;
3807 case SHF_STRINGS
: *p
= 'S'; break;
3808 case SHF_INFO_LINK
: *p
= 'I'; break;
3809 case SHF_LINK_ORDER
: *p
= 'L'; break;
3810 case SHF_OS_NONCONFORMING
: *p
= 'O'; break;
3811 case SHF_GROUP
: *p
= 'G'; break;
3812 case SHF_TLS
: *p
= 'T'; break;
3815 if (elf_header
.e_machine
== EM_X86_64
3816 && flag
== SHF_X86_64_LARGE
)
3818 else if (flag
& SHF_MASKOS
)
3821 sh_flags
&= ~ SHF_MASKOS
;
3823 else if (flag
& SHF_MASKPROC
)
3826 sh_flags
&= ~ SHF_MASKPROC
;
3836 if (do_section_details
)
3840 size
-= 5 + field_size
;
3841 if (p
!= buff
+ field_size
+ 4)
3849 sprintf (p
, "OS (%*.*lx)", field_size
, field_size
,
3850 (unsigned long) os_flags
);
3851 p
+= 5 + field_size
;
3855 size
-= 7 + field_size
;
3856 if (p
!= buff
+ field_size
+ 4)
3864 sprintf (p
, "PROC (%*.*lx)", field_size
, field_size
,
3865 (unsigned long) proc_flags
);
3866 p
+= 7 + field_size
;
3870 size
-= 10 + field_size
;
3871 if (p
!= buff
+ field_size
+ 4)
3879 sprintf (p
, "UNKNOWN (%*.*lx)", field_size
, field_size
,
3880 (unsigned long) unknown_flags
);
3881 p
+= 10 + field_size
;
3890 process_section_headers (FILE *file
)
3892 Elf_Internal_Shdr
*section
;
3895 section_headers
= NULL
;
3897 if (elf_header
.e_shnum
== 0)
3900 printf (_("\nThere are no sections in this file.\n"));
3905 if (do_sections
&& !do_header
)
3906 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3907 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3911 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3914 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3917 /* Read in the string table, so that we have names to display. */
3918 if (SECTION_HEADER_INDEX (elf_header
.e_shstrndx
) < elf_header
.e_shnum
)
3920 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3922 if (section
->sh_size
!= 0)
3924 string_table
= get_data (NULL
, file
, section
->sh_offset
,
3925 1, section
->sh_size
, _("string table"));
3927 string_table_length
= string_table
!= NULL
? section
->sh_size
: 0;
3931 /* Scan the sections for the dynamic symbol table
3932 and dynamic string table and debug sections. */
3933 dynamic_symbols
= NULL
;
3934 dynamic_strings
= NULL
;
3935 dynamic_syminfo
= NULL
;
3936 symtab_shndx_hdr
= NULL
;
3938 eh_addr_size
= is_32bit_elf
? 4 : 8;
3939 switch (elf_header
.e_machine
)
3942 case EM_MIPS_RS3_LE
:
3943 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
3944 FDE addresses. However, the ABI also has a semi-official ILP32
3945 variant for which the normal FDE address size rules apply.
3947 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
3948 section, where XX is the size of longs in bits. Unfortunately,
3949 earlier compilers provided no way of distinguishing ILP32 objects
3950 from LP64 objects, so if there's any doubt, we should assume that
3951 the official LP64 form is being used. */
3952 if ((elf_header
.e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
3953 && find_section (".gcc_compiled_long32") == NULL
)
3958 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
3961 size_t expected_entsize \
3962 = is_32bit_elf ? size32 : size64; \
3963 if (section->sh_entsize != expected_entsize) \
3964 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
3965 i, (unsigned long int) section->sh_entsize, \
3966 (unsigned long int) expected_entsize); \
3967 section->sh_entsize = expected_entsize; \
3970 #define CHECK_ENTSIZE(section, i, type) \
3971 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
3972 sizeof (Elf64_External_##type))
3974 for (i
= 0, section
= section_headers
;
3975 i
< elf_header
.e_shnum
;
3978 char *name
= SECTION_NAME (section
);
3980 if (section
->sh_type
== SHT_DYNSYM
)
3982 if (dynamic_symbols
!= NULL
)
3984 error (_("File contains multiple dynamic symbol tables\n"));
3988 CHECK_ENTSIZE (section
, i
, Sym
);
3989 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3990 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3992 else if (section
->sh_type
== SHT_STRTAB
3993 && streq (name
, ".dynstr"))
3995 if (dynamic_strings
!= NULL
)
3997 error (_("File contains multiple dynamic string tables\n"));
4001 dynamic_strings
= get_data (NULL
, file
, section
->sh_offset
,
4002 1, section
->sh_size
, _("dynamic strings"));
4003 dynamic_strings_length
= section
->sh_size
;
4005 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
4007 if (symtab_shndx_hdr
!= NULL
)
4009 error (_("File contains multiple symtab shndx tables\n"));
4012 symtab_shndx_hdr
= section
;
4014 else if (section
->sh_type
== SHT_SYMTAB
)
4015 CHECK_ENTSIZE (section
, i
, Sym
);
4016 else if (section
->sh_type
== SHT_GROUP
)
4017 CHECK_ENTSIZE_VALUES (section
, i
, GRP_ENTRY_SIZE
, GRP_ENTRY_SIZE
);
4018 else if (section
->sh_type
== SHT_REL
)
4019 CHECK_ENTSIZE (section
, i
, Rel
);
4020 else if (section
->sh_type
== SHT_RELA
)
4021 CHECK_ENTSIZE (section
, i
, Rela
);
4022 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
4023 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
4024 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
4025 || do_debug_loc
|| do_debug_ranges
)
4026 && strneq (name
, ".debug_", 7))
4031 || (do_debug_info
&& streq (name
, "info"))
4032 || (do_debug_abbrevs
&& streq (name
, "abbrev"))
4033 || (do_debug_lines
&& streq (name
, "line"))
4034 || (do_debug_pubnames
&& streq (name
, "pubnames"))
4035 || (do_debug_aranges
&& streq (name
, "aranges"))
4036 || (do_debug_ranges
&& streq (name
, "ranges"))
4037 || (do_debug_frames
&& streq (name
, "frame"))
4038 || (do_debug_macinfo
&& streq (name
, "macinfo"))
4039 || (do_debug_str
&& streq (name
, "str"))
4040 || (do_debug_loc
&& streq (name
, "loc"))
4042 request_dump (i
, DEBUG_DUMP
);
4044 /* linkonce section to be combined with .debug_info at link time. */
4045 else if ((do_debugging
|| do_debug_info
)
4046 && strneq (name
, ".gnu.linkonce.wi.", 17))
4047 request_dump (i
, DEBUG_DUMP
);
4048 else if (do_debug_frames
&& streq (name
, ".eh_frame"))
4049 request_dump (i
, DEBUG_DUMP
);
4055 if (elf_header
.e_shnum
> 1)
4056 printf (_("\nSection Headers:\n"));
4058 printf (_("\nSection Header:\n"));
4062 if (do_section_details
)
4064 printf (_(" [Nr] Name\n"));
4065 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
4069 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4073 if (do_section_details
)
4075 printf (_(" [Nr] Name\n"));
4076 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
4080 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4084 if (do_section_details
)
4086 printf (_(" [Nr] Name\n"));
4087 printf (_(" Type Address Offset Link\n"));
4088 printf (_(" Size EntSize Info Align\n"));
4092 printf (_(" [Nr] Name Type Address Offset\n"));
4093 printf (_(" Size EntSize Flags Link Info Align\n"));
4097 if (do_section_details
)
4098 printf (_(" Flags\n"));
4100 for (i
= 0, section
= section_headers
;
4101 i
< elf_header
.e_shnum
;
4104 if (do_section_details
)
4106 printf (" [%2u] %s\n",
4107 SECTION_HEADER_NUM (i
),
4108 SECTION_NAME (section
));
4109 if (is_32bit_elf
|| do_wide
)
4110 printf (" %-15.15s ",
4111 get_section_type_name (section
->sh_type
));
4114 printf (" [%2u] %-17.17s %-15.15s ",
4115 SECTION_HEADER_NUM (i
),
4116 SECTION_NAME (section
),
4117 get_section_type_name (section
->sh_type
));
4121 print_vma (section
->sh_addr
, LONG_HEX
);
4123 printf ( " %6.6lx %6.6lx %2.2lx",
4124 (unsigned long) section
->sh_offset
,
4125 (unsigned long) section
->sh_size
,
4126 (unsigned long) section
->sh_entsize
);
4128 if (do_section_details
)
4129 fputs (" ", stdout
);
4131 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4133 printf ("%2ld %3lu %2ld\n",
4134 (unsigned long) section
->sh_link
,
4135 (unsigned long) section
->sh_info
,
4136 (unsigned long) section
->sh_addralign
);
4140 print_vma (section
->sh_addr
, LONG_HEX
);
4142 if ((long) section
->sh_offset
== section
->sh_offset
)
4143 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
4147 print_vma (section
->sh_offset
, LONG_HEX
);
4150 if ((unsigned long) section
->sh_size
== section
->sh_size
)
4151 printf (" %6.6lx", (unsigned long) section
->sh_size
);
4155 print_vma (section
->sh_size
, LONG_HEX
);
4158 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
4159 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
4163 print_vma (section
->sh_entsize
, LONG_HEX
);
4166 if (do_section_details
)
4167 fputs (" ", stdout
);
4169 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4171 printf ("%2ld %3lu ",
4172 (unsigned long) section
->sh_link
,
4173 (unsigned long) section
->sh_info
);
4175 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
4176 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
4179 print_vma (section
->sh_addralign
, DEC
);
4183 else if (do_section_details
)
4185 printf (" %-15.15s ",
4186 get_section_type_name (section
->sh_type
));
4187 print_vma (section
->sh_addr
, LONG_HEX
);
4188 if ((long) section
->sh_offset
== section
->sh_offset
)
4189 printf (" %16.16lx", (unsigned long) section
->sh_offset
);
4193 print_vma (section
->sh_offset
, LONG_HEX
);
4195 printf (" %ld\n ", (unsigned long) section
->sh_link
);
4196 print_vma (section
->sh_size
, LONG_HEX
);
4198 print_vma (section
->sh_entsize
, LONG_HEX
);
4200 printf (" %-16lu %ld\n",
4201 (unsigned long) section
->sh_info
,
4202 (unsigned long) section
->sh_addralign
);
4207 print_vma (section
->sh_addr
, LONG_HEX
);
4208 if ((long) section
->sh_offset
== section
->sh_offset
)
4209 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
4213 print_vma (section
->sh_offset
, LONG_HEX
);
4216 print_vma (section
->sh_size
, LONG_HEX
);
4218 print_vma (section
->sh_entsize
, LONG_HEX
);
4220 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4222 printf (" %2ld %3lu %ld\n",
4223 (unsigned long) section
->sh_link
,
4224 (unsigned long) section
->sh_info
,
4225 (unsigned long) section
->sh_addralign
);
4228 if (do_section_details
)
4229 printf (" %s\n", get_elf_section_flags (section
->sh_flags
));
4232 if (!do_section_details
)
4233 printf (_("Key to Flags:\n\
4234 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4235 I (info), L (link order), G (group), x (unknown)\n\
4236 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4242 get_group_flags (unsigned int flags
)
4244 static char buff
[32];
4251 snprintf (buff
, sizeof (buff
), _("[<unknown>: 0x%x]"), flags
);
4258 process_section_groups (FILE *file
)
4260 Elf_Internal_Shdr
*section
;
4262 struct group
*group
;
4263 Elf_Internal_Shdr
*symtab_sec
, *strtab_sec
;
4264 Elf_Internal_Sym
*symtab
;
4268 /* Don't process section groups unless needed. */
4269 if (!do_unwind
&& !do_section_groups
)
4272 if (elf_header
.e_shnum
== 0)
4274 if (do_section_groups
)
4275 printf (_("\nThere are no sections in this file.\n"));
4280 if (section_headers
== NULL
)
4282 error (_("Section headers are not available!\n"));
4286 section_headers_groups
= calloc (elf_header
.e_shnum
,
4287 sizeof (struct group
*));
4289 if (section_headers_groups
== NULL
)
4291 error (_("Out of memory\n"));
4295 /* Scan the sections for the group section. */
4297 for (i
= 0, section
= section_headers
;
4298 i
< elf_header
.e_shnum
;
4300 if (section
->sh_type
== SHT_GROUP
)
4303 if (group_count
== 0)
4305 if (do_section_groups
)
4306 printf (_("\nThere are no section groups in this file.\n"));
4311 section_groups
= calloc (group_count
, sizeof (struct group
));
4313 if (section_groups
== NULL
)
4315 error (_("Out of memory\n"));
4324 for (i
= 0, section
= section_headers
, group
= section_groups
;
4325 i
< elf_header
.e_shnum
;
4328 if (section
->sh_type
== SHT_GROUP
)
4330 char *name
= SECTION_NAME (section
);
4332 unsigned char *start
, *indices
;
4333 unsigned int entry
, j
, size
;
4334 Elf_Internal_Shdr
*sec
;
4335 Elf_Internal_Sym
*sym
;
4337 /* Get the symbol table. */
4338 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
4339 || ((sec
= SECTION_HEADER (section
->sh_link
))->sh_type
4342 error (_("Bad sh_link in group section `%s'\n"), name
);
4346 if (symtab_sec
!= sec
)
4351 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
);
4354 sym
= symtab
+ section
->sh_info
;
4356 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4358 bfd_vma sec_index
= SECTION_HEADER_INDEX (sym
->st_shndx
);
4361 error (_("Bad sh_info in group section `%s'\n"), name
);
4365 group_name
= SECTION_NAME (section_headers
+ sec_index
);
4374 /* Get the string table. */
4375 if (SECTION_HEADER_INDEX (symtab_sec
->sh_link
)
4376 >= elf_header
.e_shnum
)
4385 != (sec
= SECTION_HEADER (symtab_sec
->sh_link
)))
4390 strtab
= get_data (NULL
, file
, strtab_sec
->sh_offset
,
4391 1, strtab_sec
->sh_size
,
4393 strtab_size
= strtab
!= NULL
? strtab_sec
->sh_size
: 0;
4395 group_name
= sym
->st_name
< strtab_size
4396 ? strtab
+ sym
->st_name
: "<corrupt>";
4399 start
= get_data (NULL
, file
, section
->sh_offset
,
4400 1, section
->sh_size
, _("section data"));
4403 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
4404 entry
= byte_get (indices
, 4);
4407 if (do_section_groups
)
4409 printf ("\n%s group section [%5u] `%s' [%s] contains %u sections:\n",
4410 get_group_flags (entry
), i
, name
, group_name
, size
);
4412 printf (_(" [Index] Name\n"));
4415 group
->group_index
= i
;
4417 for (j
= 0; j
< size
; j
++)
4419 struct group_list
*g
;
4421 entry
= byte_get (indices
, 4);
4424 if (SECTION_HEADER_INDEX (entry
) >= elf_header
.e_shnum
)
4426 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
4427 entry
, i
, elf_header
.e_shnum
- 1);
4430 else if (entry
>= SHN_LORESERVE
&& entry
<= SHN_HIRESERVE
)
4432 error (_("invalid section [%5u] in group section [%5u]\n"),
4437 if (section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4442 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
4444 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4449 /* Intel C/C++ compiler may put section 0 in a
4450 section group. We just warn it the first time
4451 and ignore it afterwards. */
4452 static int warned
= 0;
4455 error (_("section 0 in group section [%5u]\n"),
4456 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4462 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4465 if (do_section_groups
)
4467 sec
= SECTION_HEADER (entry
);
4468 printf (" [%5u] %s\n", entry
, SECTION_NAME (sec
));
4471 g
= xmalloc (sizeof (struct group_list
));
4472 g
->section_index
= entry
;
4473 g
->next
= group
->root
;
4497 } dynamic_relocations
[] =
4499 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
4500 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
4501 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
4504 /* Process the reloc section. */
4507 process_relocs (FILE *file
)
4509 unsigned long rel_size
;
4510 unsigned long rel_offset
;
4516 if (do_using_dynamic
)
4520 int has_dynamic_reloc
;
4523 has_dynamic_reloc
= 0;
4525 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
4527 is_rela
= dynamic_relocations
[i
].rela
;
4528 name
= dynamic_relocations
[i
].name
;
4529 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
4530 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
4532 has_dynamic_reloc
|= rel_size
;
4534 if (is_rela
== UNKNOWN
)
4536 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
4537 switch (dynamic_info
[DT_PLTREL
])
4551 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4552 name
, rel_offset
, rel_size
);
4554 dump_relocations (file
,
4555 offset_from_vma (file
, rel_offset
, rel_size
),
4557 dynamic_symbols
, num_dynamic_syms
,
4558 dynamic_strings
, dynamic_strings_length
, is_rela
);
4562 if (! has_dynamic_reloc
)
4563 printf (_("\nThere are no dynamic relocations in this file.\n"));
4567 Elf_Internal_Shdr
*section
;
4571 for (i
= 0, section
= section_headers
;
4572 i
< elf_header
.e_shnum
;
4575 if ( section
->sh_type
!= SHT_RELA
4576 && section
->sh_type
!= SHT_REL
)
4579 rel_offset
= section
->sh_offset
;
4580 rel_size
= section
->sh_size
;
4584 Elf_Internal_Shdr
*strsec
;
4587 printf (_("\nRelocation section "));
4589 if (string_table
== NULL
)
4590 printf ("%d", section
->sh_name
);
4592 printf (_("'%s'"), SECTION_NAME (section
));
4594 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4595 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4597 is_rela
= section
->sh_type
== SHT_RELA
;
4599 if (section
->sh_link
4600 && SECTION_HEADER_INDEX (section
->sh_link
)
4601 < elf_header
.e_shnum
)
4603 Elf_Internal_Shdr
*symsec
;
4604 Elf_Internal_Sym
*symtab
;
4605 unsigned long nsyms
;
4606 unsigned long strtablen
= 0;
4607 char *strtab
= NULL
;
4609 symsec
= SECTION_HEADER (section
->sh_link
);
4610 if (symsec
->sh_type
!= SHT_SYMTAB
4611 && symsec
->sh_type
!= SHT_DYNSYM
)
4614 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4615 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4620 if (SECTION_HEADER_INDEX (symsec
->sh_link
)
4621 < elf_header
.e_shnum
)
4623 strsec
= SECTION_HEADER (symsec
->sh_link
);
4625 strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4628 strtablen
= strtab
== NULL
? 0 : strsec
->sh_size
;
4631 dump_relocations (file
, rel_offset
, rel_size
,
4632 symtab
, nsyms
, strtab
, strtablen
, is_rela
);
4638 dump_relocations (file
, rel_offset
, rel_size
,
4639 NULL
, 0, NULL
, 0, is_rela
);
4646 printf (_("\nThere are no relocations in this file.\n"));
4652 /* Process the unwind section. */
4654 #include "unwind-ia64.h"
4656 /* An absolute address consists of a section and an offset. If the
4657 section is NULL, the offset itself is the address, otherwise, the
4658 address equals to LOAD_ADDRESS(section) + offset. */
4662 unsigned short section
;
4666 #define ABSADDR(a) \
4668 ? section_headers [(a).section].sh_addr + (a).offset \
4671 struct ia64_unw_aux_info
4673 struct ia64_unw_table_entry
4675 struct absaddr start
;
4677 struct absaddr info
;
4679 *table
; /* Unwind table. */
4680 unsigned long table_len
; /* Length of unwind table. */
4681 unsigned char *info
; /* Unwind info. */
4682 unsigned long info_size
; /* Size of unwind info. */
4683 bfd_vma info_addr
; /* starting address of unwind info. */
4684 bfd_vma seg_base
; /* Starting address of segment. */
4685 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4686 unsigned long nsyms
; /* Number of symbols. */
4687 char *strtab
; /* The string table. */
4688 unsigned long strtab_size
; /* Size of string table. */
4692 find_symbol_for_address (Elf_Internal_Sym
*symtab
,
4693 unsigned long nsyms
,
4695 unsigned long strtab_size
,
4696 struct absaddr addr
,
4697 const char **symname
,
4700 bfd_vma dist
= 0x100000;
4701 Elf_Internal_Sym
*sym
, *best
= NULL
;
4704 for (i
= 0, sym
= symtab
; i
< nsyms
; ++i
, ++sym
)
4706 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
4707 && sym
->st_name
!= 0
4708 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
4709 && addr
.offset
>= sym
->st_value
4710 && addr
.offset
- sym
->st_value
< dist
)
4713 dist
= addr
.offset
- sym
->st_value
;
4720 *symname
= (best
->st_name
>= strtab_size
4721 ? "<corrupt>" : strtab
+ best
->st_name
);
4726 *offset
= addr
.offset
;
4730 dump_ia64_unwind (struct ia64_unw_aux_info
*aux
)
4732 struct ia64_unw_table_entry
*tp
;
4735 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4739 const unsigned char *dp
;
4740 const unsigned char *head
;
4741 const char *procname
;
4743 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
4744 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
4746 fputs ("\n<", stdout
);
4750 fputs (procname
, stdout
);
4753 printf ("+%lx", (unsigned long) offset
);
4756 fputs (">: [", stdout
);
4757 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4758 fputc ('-', stdout
);
4759 print_vma (tp
->end
.offset
, PREFIX_HEX
);
4760 printf ("], info at +0x%lx\n",
4761 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
4763 head
= aux
->info
+ (ABSADDR (tp
->info
) - aux
->info_addr
);
4764 stamp
= byte_get ((unsigned char *) head
, sizeof (stamp
));
4766 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4767 (unsigned) UNW_VER (stamp
),
4768 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
4769 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
4770 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
4771 (unsigned long) (eh_addr_size
* UNW_LENGTH (stamp
)));
4773 if (UNW_VER (stamp
) != 1)
4775 printf ("\tUnknown version.\n");
4780 for (dp
= head
+ 8; dp
< head
+ 8 + eh_addr_size
* UNW_LENGTH (stamp
);)
4781 dp
= unw_decode (dp
, in_body
, & in_body
);
4786 slurp_ia64_unwind_table (FILE *file
,
4787 struct ia64_unw_aux_info
*aux
,
4788 Elf_Internal_Shdr
*sec
)
4790 unsigned long size
, nrelas
, i
;
4791 Elf_Internal_Phdr
*seg
;
4792 struct ia64_unw_table_entry
*tep
;
4793 Elf_Internal_Shdr
*relsec
;
4794 Elf_Internal_Rela
*rela
, *rp
;
4795 unsigned char *table
, *tp
;
4796 Elf_Internal_Sym
*sym
;
4797 const char *relname
;
4799 /* First, find the starting address of the segment that includes
4802 if (elf_header
.e_phnum
)
4804 if (! get_program_headers (file
))
4807 for (seg
= program_headers
;
4808 seg
< program_headers
+ elf_header
.e_phnum
;
4811 if (seg
->p_type
!= PT_LOAD
)
4814 if (sec
->sh_addr
>= seg
->p_vaddr
4815 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
4817 aux
->seg_base
= seg
->p_vaddr
;
4823 /* Second, build the unwind table from the contents of the unwind section: */
4824 size
= sec
->sh_size
;
4825 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
4829 aux
->table
= xcmalloc (size
/ (3 * eh_addr_size
), sizeof (aux
->table
[0]));
4831 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * eh_addr_size
, ++tep
)
4833 tep
->start
.section
= SHN_UNDEF
;
4834 tep
->end
.section
= SHN_UNDEF
;
4835 tep
->info
.section
= SHN_UNDEF
;
4838 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
4839 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
4840 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
4844 tep
->start
.offset
= BYTE_GET ((unsigned char *) tp
+ 0);
4845 tep
->end
.offset
= BYTE_GET ((unsigned char *) tp
+ 8);
4846 tep
->info
.offset
= BYTE_GET ((unsigned char *) tp
+ 16);
4848 tep
->start
.offset
+= aux
->seg_base
;
4849 tep
->end
.offset
+= aux
->seg_base
;
4850 tep
->info
.offset
+= aux
->seg_base
;
4854 /* Third, apply any relocations to the unwind table: */
4856 for (relsec
= section_headers
;
4857 relsec
< section_headers
+ elf_header
.e_shnum
;
4860 if (relsec
->sh_type
!= SHT_RELA
4861 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
4862 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4865 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
4869 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
4873 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
4874 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
4878 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
4879 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
4882 if (! strneq (relname
, "R_IA64_SEGREL", 13))
4884 warn (_("Skipping unexpected relocation type %s\n"), relname
);
4888 i
= rp
->r_offset
/ (3 * eh_addr_size
);
4890 switch (rp
->r_offset
/eh_addr_size
% 3)
4893 aux
->table
[i
].start
.section
= sym
->st_shndx
;
4894 aux
->table
[i
].start
.offset
+= rp
->r_addend
+ sym
->st_value
;
4897 aux
->table
[i
].end
.section
= sym
->st_shndx
;
4898 aux
->table
[i
].end
.offset
+= rp
->r_addend
+ sym
->st_value
;
4901 aux
->table
[i
].info
.section
= sym
->st_shndx
;
4902 aux
->table
[i
].info
.offset
+= rp
->r_addend
+ sym
->st_value
;
4912 aux
->table_len
= size
/ (3 * eh_addr_size
);
4917 ia64_process_unwind (FILE *file
)
4919 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
4920 unsigned long i
, unwcount
= 0, unwstart
= 0;
4921 struct ia64_unw_aux_info aux
;
4923 memset (& aux
, 0, sizeof (aux
));
4925 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
4927 if (sec
->sh_type
== SHT_SYMTAB
4928 && SECTION_HEADER_INDEX (sec
->sh_link
) < elf_header
.e_shnum
)
4930 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
4931 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
4933 strsec
= SECTION_HEADER (sec
->sh_link
);
4934 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4935 1, strsec
->sh_size
, _("string table"));
4936 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
4938 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4943 printf (_("\nThere are no unwind sections in this file.\n"));
4945 while (unwcount
-- > 0)
4950 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
4951 i
< elf_header
.e_shnum
; ++i
, ++sec
)
4952 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4959 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
4961 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
4963 /* We need to find which section group it is in. */
4964 struct group_list
*g
= section_headers_groups
[i
]->root
;
4966 for (; g
!= NULL
; g
= g
->next
)
4968 sec
= SECTION_HEADER (g
->section_index
);
4970 if (streq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
))
4975 i
= elf_header
.e_shnum
;
4977 else if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
, len
))
4979 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
4980 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
4981 suffix
= SECTION_NAME (unwsec
) + len
;
4982 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4984 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info_once
, len2
)
4985 && streq (SECTION_NAME (sec
) + len2
, suffix
))
4990 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4991 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
4992 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
4993 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
4995 if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
, len
))
4996 suffix
= SECTION_NAME (unwsec
) + len
;
4997 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4999 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
, len2
)
5000 && streq (SECTION_NAME (sec
) + len2
, suffix
))
5004 if (i
== elf_header
.e_shnum
)
5006 printf (_("\nCould not find unwind info section for "));
5008 if (string_table
== NULL
)
5009 printf ("%d", unwsec
->sh_name
);
5011 printf (_("'%s'"), SECTION_NAME (unwsec
));
5015 aux
.info_size
= sec
->sh_size
;
5016 aux
.info_addr
= sec
->sh_addr
;
5017 aux
.info
= get_data (NULL
, file
, sec
->sh_offset
, 1, aux
.info_size
,
5020 printf (_("\nUnwind section "));
5022 if (string_table
== NULL
)
5023 printf ("%d", unwsec
->sh_name
);
5025 printf (_("'%s'"), SECTION_NAME (unwsec
));
5027 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5028 (unsigned long) unwsec
->sh_offset
,
5029 (unsigned long) (unwsec
->sh_size
/ (3 * eh_addr_size
)));
5031 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
5033 if (aux
.table_len
> 0)
5034 dump_ia64_unwind (& aux
);
5037 free ((char *) aux
.table
);
5039 free ((char *) aux
.info
);
5048 free ((char *) aux
.strtab
);
5053 struct hppa_unw_aux_info
5055 struct hppa_unw_table_entry
5057 struct absaddr start
;
5059 unsigned int Cannot_unwind
:1; /* 0 */
5060 unsigned int Millicode
:1; /* 1 */
5061 unsigned int Millicode_save_sr0
:1; /* 2 */
5062 unsigned int Region_description
:2; /* 3..4 */
5063 unsigned int reserved1
:1; /* 5 */
5064 unsigned int Entry_SR
:1; /* 6 */
5065 unsigned int Entry_FR
:4; /* number saved */ /* 7..10 */
5066 unsigned int Entry_GR
:5; /* number saved */ /* 11..15 */
5067 unsigned int Args_stored
:1; /* 16 */
5068 unsigned int Variable_Frame
:1; /* 17 */
5069 unsigned int Separate_Package_Body
:1; /* 18 */
5070 unsigned int Frame_Extension_Millicode
:1; /* 19 */
5071 unsigned int Stack_Overflow_Check
:1; /* 20 */
5072 unsigned int Two_Instruction_SP_Increment
:1; /* 21 */
5073 unsigned int Ada_Region
:1; /* 22 */
5074 unsigned int cxx_info
:1; /* 23 */
5075 unsigned int cxx_try_catch
:1; /* 24 */
5076 unsigned int sched_entry_seq
:1; /* 25 */
5077 unsigned int reserved2
:1; /* 26 */
5078 unsigned int Save_SP
:1; /* 27 */
5079 unsigned int Save_RP
:1; /* 28 */
5080 unsigned int Save_MRP_in_frame
:1; /* 29 */
5081 unsigned int extn_ptr_defined
:1; /* 30 */
5082 unsigned int Cleanup_defined
:1; /* 31 */
5084 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
5085 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
5086 unsigned int Large_frame
:1; /* 2 */
5087 unsigned int Pseudo_SP_Set
:1; /* 3 */
5088 unsigned int reserved4
:1; /* 4 */
5089 unsigned int Total_frame_size
:27; /* 5..31 */
5091 *table
; /* Unwind table. */
5092 unsigned long table_len
; /* Length of unwind table. */
5093 bfd_vma seg_base
; /* Starting address of segment. */
5094 Elf_Internal_Sym
*symtab
; /* The symbol table. */
5095 unsigned long nsyms
; /* Number of symbols. */
5096 char *strtab
; /* The string table. */
5097 unsigned long strtab_size
; /* Size of string table. */
5101 dump_hppa_unwind (struct hppa_unw_aux_info
*aux
)
5103 struct hppa_unw_table_entry
*tp
;
5105 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
5108 const char *procname
;
5110 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
5111 aux
->strtab_size
, tp
->start
, &procname
,
5114 fputs ("\n<", stdout
);
5118 fputs (procname
, stdout
);
5121 printf ("+%lx", (unsigned long) offset
);
5124 fputs (">: [", stdout
);
5125 print_vma (tp
->start
.offset
, PREFIX_HEX
);
5126 fputc ('-', stdout
);
5127 print_vma (tp
->end
.offset
, PREFIX_HEX
);
5130 #define PF(_m) if (tp->_m) printf (#_m " ");
5131 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5134 PF(Millicode_save_sr0
);
5135 /* PV(Region_description); */
5141 PF(Separate_Package_Body
);
5142 PF(Frame_Extension_Millicode
);
5143 PF(Stack_Overflow_Check
);
5144 PF(Two_Instruction_SP_Increment
);
5148 PF(sched_entry_seq
);
5151 PF(Save_MRP_in_frame
);
5152 PF(extn_ptr_defined
);
5153 PF(Cleanup_defined
);
5154 PF(MPE_XL_interrupt_marker
);
5155 PF(HP_UX_interrupt_marker
);
5158 PV(Total_frame_size
);
5167 slurp_hppa_unwind_table (FILE *file
,
5168 struct hppa_unw_aux_info
*aux
,
5169 Elf_Internal_Shdr
*sec
)
5171 unsigned long size
, unw_ent_size
, nentries
, nrelas
, i
;
5172 Elf_Internal_Phdr
*seg
;
5173 struct hppa_unw_table_entry
*tep
;
5174 Elf_Internal_Shdr
*relsec
;
5175 Elf_Internal_Rela
*rela
, *rp
;
5176 unsigned char *table
, *tp
;
5177 Elf_Internal_Sym
*sym
;
5178 const char *relname
;
5180 /* First, find the starting address of the segment that includes
5183 if (elf_header
.e_phnum
)
5185 if (! get_program_headers (file
))
5188 for (seg
= program_headers
;
5189 seg
< program_headers
+ elf_header
.e_phnum
;
5192 if (seg
->p_type
!= PT_LOAD
)
5195 if (sec
->sh_addr
>= seg
->p_vaddr
5196 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5198 aux
->seg_base
= seg
->p_vaddr
;
5204 /* Second, build the unwind table from the contents of the unwind
5206 size
= sec
->sh_size
;
5207 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
5212 nentries
= size
/ unw_ent_size
;
5213 size
= unw_ent_size
* nentries
;
5215 tep
= aux
->table
= xcmalloc (nentries
, sizeof (aux
->table
[0]));
5217 for (tp
= table
; tp
< table
+ size
; tp
+= unw_ent_size
, ++tep
)
5219 unsigned int tmp1
, tmp2
;
5221 tep
->start
.section
= SHN_UNDEF
;
5222 tep
->end
.section
= SHN_UNDEF
;
5224 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
5225 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
5226 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
5227 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
5229 tep
->start
.offset
+= aux
->seg_base
;
5230 tep
->end
.offset
+= aux
->seg_base
;
5232 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
5233 tep
->Millicode
= (tmp1
>> 30) & 0x1;
5234 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
5235 tep
->Region_description
= (tmp1
>> 27) & 0x3;
5236 tep
->reserved1
= (tmp1
>> 26) & 0x1;
5237 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
5238 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
5239 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
5240 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
5241 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
5242 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
5243 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
5244 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
5245 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
5246 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
5247 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
5248 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
5249 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
5250 tep
->reserved2
= (tmp1
>> 5) & 0x1;
5251 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
5252 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
5253 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
5254 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
5255 tep
->Cleanup_defined
= tmp1
& 0x1;
5257 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
5258 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
5259 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
5260 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
5261 tep
->reserved4
= (tmp2
>> 27) & 0x1;
5262 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
5266 /* Third, apply any relocations to the unwind table. */
5268 for (relsec
= section_headers
;
5269 relsec
< section_headers
+ elf_header
.e_shnum
;
5272 if (relsec
->sh_type
!= SHT_RELA
5273 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
5274 || SECTION_HEADER (relsec
->sh_info
) != sec
)
5277 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5281 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5285 relname
= elf_hppa_reloc_type (ELF32_R_TYPE (rp
->r_info
));
5286 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
5290 relname
= elf_hppa_reloc_type (ELF64_R_TYPE (rp
->r_info
));
5291 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
5294 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
5295 if (strncmp (relname
, "R_PARISC_SEGREL", 15) != 0)
5297 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5301 i
= rp
->r_offset
/ unw_ent_size
;
5303 switch ((rp
->r_offset
% unw_ent_size
) / eh_addr_size
)
5306 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5307 aux
->table
[i
].start
.offset
+= sym
->st_value
+ rp
->r_addend
;
5310 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5311 aux
->table
[i
].end
.offset
+= sym
->st_value
+ rp
->r_addend
;
5321 aux
->table_len
= nentries
;
5327 hppa_process_unwind (FILE *file
)
5329 struct hppa_unw_aux_info aux
;
5330 Elf_Internal_Shdr
*unwsec
= NULL
;
5331 Elf_Internal_Shdr
*strsec
;
5332 Elf_Internal_Shdr
*sec
;
5335 memset (& aux
, 0, sizeof (aux
));
5337 if (string_table
== NULL
)
5340 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5342 if (sec
->sh_type
== SHT_SYMTAB
5343 && SECTION_HEADER_INDEX (sec
->sh_link
) < elf_header
.e_shnum
)
5345 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5346 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5348 strsec
= SECTION_HEADER (sec
->sh_link
);
5349 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
5350 1, strsec
->sh_size
, _("string table"));
5351 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5353 else if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5358 printf (_("\nThere are no unwind sections in this file.\n"));
5360 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5362 if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5364 printf (_("\nUnwind section "));
5365 printf (_("'%s'"), SECTION_NAME (sec
));
5367 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5368 (unsigned long) sec
->sh_offset
,
5369 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
+ 8)));
5371 slurp_hppa_unwind_table (file
, &aux
, sec
);
5372 if (aux
.table_len
> 0)
5373 dump_hppa_unwind (&aux
);
5376 free ((char *) aux
.table
);
5384 free ((char *) aux
.strtab
);
5390 process_unwind (FILE *file
)
5392 struct unwind_handler
{
5394 int (*handler
)(FILE *file
);
5396 { EM_IA_64
, ia64_process_unwind
},
5397 { EM_PARISC
, hppa_process_unwind
},
5405 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
5406 if (elf_header
.e_machine
== handlers
[i
].machtype
)
5407 return handlers
[i
].handler (file
);
5409 printf (_("\nThere are no unwind sections in this file.\n"));
5414 dynamic_section_mips_val (Elf_Internal_Dyn
*entry
)
5416 switch (entry
->d_tag
)
5419 if (entry
->d_un
.d_val
== 0)
5423 static const char * opts
[] =
5425 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5426 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5427 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5428 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5433 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++cnt
)
5434 if (entry
->d_un
.d_val
& (1 << cnt
))
5436 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
5443 case DT_MIPS_IVERSION
:
5444 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5445 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5447 printf ("<corrupt: %ld>\n", (long) entry
->d_un
.d_ptr
);
5450 case DT_MIPS_TIME_STAMP
:
5455 time_t time
= entry
->d_un
.d_val
;
5456 tmp
= gmtime (&time
);
5457 snprintf (timebuf
, sizeof (timebuf
), "%04u-%02u-%02uT%02u:%02u:%02u",
5458 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5459 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5460 printf ("Time Stamp: %s\n", timebuf
);
5464 case DT_MIPS_RLD_VERSION
:
5465 case DT_MIPS_LOCAL_GOTNO
:
5466 case DT_MIPS_CONFLICTNO
:
5467 case DT_MIPS_LIBLISTNO
:
5468 case DT_MIPS_SYMTABNO
:
5469 case DT_MIPS_UNREFEXTNO
:
5470 case DT_MIPS_HIPAGENO
:
5471 case DT_MIPS_DELTA_CLASS_NO
:
5472 case DT_MIPS_DELTA_INSTANCE_NO
:
5473 case DT_MIPS_DELTA_RELOC_NO
:
5474 case DT_MIPS_DELTA_SYM_NO
:
5475 case DT_MIPS_DELTA_CLASSSYM_NO
:
5476 case DT_MIPS_COMPACT_SIZE
:
5477 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
5481 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
5487 dynamic_section_parisc_val (Elf_Internal_Dyn
*entry
)
5489 switch (entry
->d_tag
)
5491 case DT_HP_DLD_FLAGS
:
5500 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
5501 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
5502 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
5503 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
5504 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
5505 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
5506 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
5507 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
5508 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
5509 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
5510 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" },
5511 { DT_HP_GST
, "HP_GST" },
5512 { DT_HP_SHLIB_FIXED
, "HP_SHLIB_FIXED" },
5513 { DT_HP_MERGE_SHLIB_SEG
, "HP_MERGE_SHLIB_SEG" },
5514 { DT_HP_NODELETE
, "HP_NODELETE" },
5515 { DT_HP_GROUP
, "HP_GROUP" },
5516 { DT_HP_PROTECT_LINKAGE_TABLE
, "HP_PROTECT_LINKAGE_TABLE" }
5520 bfd_vma val
= entry
->d_un
.d_val
;
5522 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
5523 if (val
& flags
[cnt
].bit
)
5527 fputs (flags
[cnt
].str
, stdout
);
5529 val
^= flags
[cnt
].bit
;
5532 if (val
!= 0 || first
)
5536 print_vma (val
, HEX
);
5542 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5549 dynamic_section_ia64_val (Elf_Internal_Dyn
*entry
)
5551 switch (entry
->d_tag
)
5553 case DT_IA_64_PLT_RESERVE
:
5554 /* First 3 slots reserved. */
5555 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5557 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
5561 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5568 get_32bit_dynamic_section (FILE *file
)
5570 Elf32_External_Dyn
*edyn
, *ext
;
5571 Elf_Internal_Dyn
*entry
;
5573 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5574 _("dynamic section"));
5578 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5579 might not have the luxury of section headers. Look for the DT_NULL
5580 terminator to determine the number of entries. */
5581 for (ext
= edyn
, dynamic_nent
= 0;
5582 (char *) ext
< (char *) edyn
+ dynamic_size
;
5586 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5590 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5591 if (dynamic_section
== NULL
)
5593 error (_("Out of memory\n"));
5598 for (ext
= edyn
, entry
= dynamic_section
;
5599 entry
< dynamic_section
+ dynamic_nent
;
5602 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5603 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5612 get_64bit_dynamic_section (FILE *file
)
5614 Elf64_External_Dyn
*edyn
, *ext
;
5615 Elf_Internal_Dyn
*entry
;
5617 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5618 _("dynamic section"));
5622 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5623 might not have the luxury of section headers. Look for the DT_NULL
5624 terminator to determine the number of entries. */
5625 for (ext
= edyn
, dynamic_nent
= 0;
5626 (char *) ext
< (char *) edyn
+ dynamic_size
;
5630 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5634 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5635 if (dynamic_section
== NULL
)
5637 error (_("Out of memory\n"));
5642 for (ext
= edyn
, entry
= dynamic_section
;
5643 entry
< dynamic_section
+ dynamic_nent
;
5646 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5647 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5656 print_dynamic_flags (bfd_vma flags
)
5664 flag
= flags
& - flags
;
5674 case DF_ORIGIN
: fputs ("ORIGIN", stdout
); break;
5675 case DF_SYMBOLIC
: fputs ("SYMBOLIC", stdout
); break;
5676 case DF_TEXTREL
: fputs ("TEXTREL", stdout
); break;
5677 case DF_BIND_NOW
: fputs ("BIND_NOW", stdout
); break;
5678 case DF_STATIC_TLS
: fputs ("STATIC_TLS", stdout
); break;
5679 default: fputs ("unknown", stdout
); break;
5685 /* Parse and display the contents of the dynamic section. */
5688 process_dynamic_section (FILE *file
)
5690 Elf_Internal_Dyn
*entry
;
5692 if (dynamic_size
== 0)
5695 printf (_("\nThere is no dynamic section in this file.\n"));
5702 if (! get_32bit_dynamic_section (file
))
5705 else if (! get_64bit_dynamic_section (file
))
5708 /* Find the appropriate symbol table. */
5709 if (dynamic_symbols
== NULL
)
5711 for (entry
= dynamic_section
;
5712 entry
< dynamic_section
+ dynamic_nent
;
5715 Elf_Internal_Shdr section
;
5717 if (entry
->d_tag
!= DT_SYMTAB
)
5720 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
5722 /* Since we do not know how big the symbol table is,
5723 we default to reading in the entire file (!) and
5724 processing that. This is overkill, I know, but it
5726 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5728 if (archive_file_offset
!= 0)
5729 section
.sh_size
= archive_file_size
- section
.sh_offset
;
5732 if (fseek (file
, 0, SEEK_END
))
5733 error (_("Unable to seek to end of file!"));
5735 section
.sh_size
= ftell (file
) - section
.sh_offset
;
5739 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
5741 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
5743 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
5744 if (num_dynamic_syms
< 1)
5746 error (_("Unable to determine the number of symbols to load\n"));
5750 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
5754 /* Similarly find a string table. */
5755 if (dynamic_strings
== NULL
)
5757 for (entry
= dynamic_section
;
5758 entry
< dynamic_section
+ dynamic_nent
;
5761 unsigned long offset
;
5764 if (entry
->d_tag
!= DT_STRTAB
)
5767 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
5769 /* Since we do not know how big the string table is,
5770 we default to reading in the entire file (!) and
5771 processing that. This is overkill, I know, but it
5774 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5776 if (archive_file_offset
!= 0)
5777 str_tab_len
= archive_file_size
- offset
;
5780 if (fseek (file
, 0, SEEK_END
))
5781 error (_("Unable to seek to end of file\n"));
5782 str_tab_len
= ftell (file
) - offset
;
5785 if (str_tab_len
< 1)
5788 (_("Unable to determine the length of the dynamic string table\n"));
5792 dynamic_strings
= get_data (NULL
, file
, offset
, 1, str_tab_len
,
5793 _("dynamic string table"));
5794 dynamic_strings_length
= str_tab_len
;
5799 /* And find the syminfo section if available. */
5800 if (dynamic_syminfo
== NULL
)
5802 unsigned long syminsz
= 0;
5804 for (entry
= dynamic_section
;
5805 entry
< dynamic_section
+ dynamic_nent
;
5808 if (entry
->d_tag
== DT_SYMINENT
)
5810 /* Note: these braces are necessary to avoid a syntax
5811 error from the SunOS4 C compiler. */
5812 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
5814 else if (entry
->d_tag
== DT_SYMINSZ
)
5815 syminsz
= entry
->d_un
.d_val
;
5816 else if (entry
->d_tag
== DT_SYMINFO
)
5817 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
5821 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
5823 Elf_External_Syminfo
*extsyminfo
, *extsym
;
5824 Elf_Internal_Syminfo
*syminfo
;
5826 /* There is a syminfo section. Read the data. */
5827 extsyminfo
= get_data (NULL
, file
, dynamic_syminfo_offset
, 1,
5828 syminsz
, _("symbol information"));
5832 dynamic_syminfo
= malloc (syminsz
);
5833 if (dynamic_syminfo
== NULL
)
5835 error (_("Out of memory\n"));
5839 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
5840 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
5841 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
5842 ++syminfo
, ++extsym
)
5844 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
5845 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
5852 if (do_dynamic
&& dynamic_addr
)
5853 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
5854 dynamic_addr
, dynamic_nent
);
5856 printf (_(" Tag Type Name/Value\n"));
5858 for (entry
= dynamic_section
;
5859 entry
< dynamic_section
+ dynamic_nent
;
5867 print_vma (entry
->d_tag
, FULL_HEX
);
5868 dtype
= get_dynamic_type (entry
->d_tag
);
5869 printf (" (%s)%*s", dtype
,
5870 ((is_32bit_elf
? 27 : 19)
5871 - (int) strlen (dtype
)),
5875 switch (entry
->d_tag
)
5879 print_dynamic_flags (entry
->d_un
.d_val
);
5889 switch (entry
->d_tag
)
5892 printf (_("Auxiliary library"));
5896 printf (_("Filter library"));
5900 printf (_("Configuration file"));
5904 printf (_("Dependency audit library"));
5908 printf (_("Audit library"));
5912 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5913 printf (": [%s]\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5917 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5926 printf (_("Flags:"));
5928 if (entry
->d_un
.d_val
== 0)
5929 printf (_(" None\n"));
5932 unsigned long int val
= entry
->d_un
.d_val
;
5934 if (val
& DTF_1_PARINIT
)
5936 printf (" PARINIT");
5937 val
^= DTF_1_PARINIT
;
5939 if (val
& DTF_1_CONFEXP
)
5941 printf (" CONFEXP");
5942 val
^= DTF_1_CONFEXP
;
5945 printf (" %lx", val
);
5954 printf (_("Flags:"));
5956 if (entry
->d_un
.d_val
== 0)
5957 printf (_(" None\n"));
5960 unsigned long int val
= entry
->d_un
.d_val
;
5962 if (val
& DF_P1_LAZYLOAD
)
5964 printf (" LAZYLOAD");
5965 val
^= DF_P1_LAZYLOAD
;
5967 if (val
& DF_P1_GROUPPERM
)
5969 printf (" GROUPPERM");
5970 val
^= DF_P1_GROUPPERM
;
5973 printf (" %lx", val
);
5982 printf (_("Flags:"));
5983 if (entry
->d_un
.d_val
== 0)
5984 printf (_(" None\n"));
5987 unsigned long int val
= entry
->d_un
.d_val
;
5994 if (val
& DF_1_GLOBAL
)
5999 if (val
& DF_1_GROUP
)
6004 if (val
& DF_1_NODELETE
)
6006 printf (" NODELETE");
6007 val
^= DF_1_NODELETE
;
6009 if (val
& DF_1_LOADFLTR
)
6011 printf (" LOADFLTR");
6012 val
^= DF_1_LOADFLTR
;
6014 if (val
& DF_1_INITFIRST
)
6016 printf (" INITFIRST");
6017 val
^= DF_1_INITFIRST
;
6019 if (val
& DF_1_NOOPEN
)
6024 if (val
& DF_1_ORIGIN
)
6029 if (val
& DF_1_DIRECT
)
6034 if (val
& DF_1_TRANS
)
6039 if (val
& DF_1_INTERPOSE
)
6041 printf (" INTERPOSE");
6042 val
^= DF_1_INTERPOSE
;
6044 if (val
& DF_1_NODEFLIB
)
6046 printf (" NODEFLIB");
6047 val
^= DF_1_NODEFLIB
;
6049 if (val
& DF_1_NODUMP
)
6054 if (val
& DF_1_CONLFAT
)
6056 printf (" CONLFAT");
6057 val
^= DF_1_CONLFAT
;
6060 printf (" %lx", val
);
6067 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6069 puts (get_dynamic_type (entry
->d_un
.d_val
));
6089 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6095 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6096 name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6102 switch (entry
->d_tag
)
6105 printf (_("Shared library: [%s]"), name
);
6107 if (streq (name
, program_interpreter
))
6108 printf (_(" program interpreter"));
6112 printf (_("Library soname: [%s]"), name
);
6116 printf (_("Library rpath: [%s]"), name
);
6120 printf (_("Library runpath: [%s]"), name
);
6124 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6129 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6142 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6146 case DT_INIT_ARRAYSZ
:
6147 case DT_FINI_ARRAYSZ
:
6148 case DT_GNU_CONFLICTSZ
:
6149 case DT_GNU_LIBLISTSZ
:
6152 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6153 printf (" (bytes)\n");
6163 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6176 if (entry
->d_tag
== DT_USED
6177 && VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6179 char *name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6183 printf (_("Not needed object: [%s]\n"), name
);
6188 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6194 /* The value of this entry is ignored. */
6199 case DT_GNU_PRELINKED
:
6203 time_t time
= entry
->d_un
.d_val
;
6205 tmp
= gmtime (&time
);
6206 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
6207 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
6208 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
6214 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
6215 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
6220 switch (elf_header
.e_machine
)
6223 case EM_MIPS_RS3_LE
:
6224 dynamic_section_mips_val (entry
);
6227 dynamic_section_parisc_val (entry
);
6230 dynamic_section_ia64_val (entry
);
6233 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6245 get_ver_flags (unsigned int flags
)
6247 static char buff
[32];
6254 if (flags
& VER_FLG_BASE
)
6255 strcat (buff
, "BASE ");
6257 if (flags
& VER_FLG_WEAK
)
6259 if (flags
& VER_FLG_BASE
)
6260 strcat (buff
, "| ");
6262 strcat (buff
, "WEAK ");
6265 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
6266 strcat (buff
, "| <unknown>");
6271 /* Display the contents of the version sections. */
6273 process_version_sections (FILE *file
)
6275 Elf_Internal_Shdr
*section
;
6282 for (i
= 0, section
= section_headers
;
6283 i
< elf_header
.e_shnum
;
6286 switch (section
->sh_type
)
6288 case SHT_GNU_verdef
:
6290 Elf_External_Verdef
*edefs
;
6297 (_("\nVersion definition section '%s' contains %ld entries:\n"),
6298 SECTION_NAME (section
), section
->sh_info
);
6300 printf (_(" Addr: 0x"));
6301 printf_vma (section
->sh_addr
);
6302 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6303 (unsigned long) section
->sh_offset
, section
->sh_link
,
6304 SECTION_HEADER_INDEX (section
->sh_link
)
6305 < elf_header
.e_shnum
6306 ? SECTION_NAME (SECTION_HEADER (section
->sh_link
))
6309 edefs
= get_data (NULL
, file
, section
->sh_offset
, 1,
6311 _("version definition section"));
6315 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6318 Elf_External_Verdef
*edef
;
6319 Elf_Internal_Verdef ent
;
6320 Elf_External_Verdaux
*eaux
;
6321 Elf_Internal_Verdaux aux
;
6325 vstart
= ((char *) edefs
) + idx
;
6327 edef
= (Elf_External_Verdef
*) vstart
;
6329 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
6330 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
6331 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
6332 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
6333 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
6334 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
6335 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
6337 printf (_(" %#06x: Rev: %d Flags: %s"),
6338 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
6340 printf (_(" Index: %d Cnt: %d "),
6341 ent
.vd_ndx
, ent
.vd_cnt
);
6343 vstart
+= ent
.vd_aux
;
6345 eaux
= (Elf_External_Verdaux
*) vstart
;
6347 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6348 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6350 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6351 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux
.vda_name
));
6353 printf (_("Name index: %ld\n"), aux
.vda_name
);
6355 isum
= idx
+ ent
.vd_aux
;
6357 for (j
= 1; j
< ent
.vd_cnt
; j
++)
6359 isum
+= aux
.vda_next
;
6360 vstart
+= aux
.vda_next
;
6362 eaux
= (Elf_External_Verdaux
*) vstart
;
6364 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6365 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6367 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6368 printf (_(" %#06x: Parent %d: %s\n"),
6369 isum
, j
, GET_DYNAMIC_NAME (aux
.vda_name
));
6371 printf (_(" %#06x: Parent %d, name index: %ld\n"),
6372 isum
, j
, aux
.vda_name
);
6382 case SHT_GNU_verneed
:
6384 Elf_External_Verneed
*eneed
;
6390 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
6391 SECTION_NAME (section
), section
->sh_info
);
6393 printf (_(" Addr: 0x"));
6394 printf_vma (section
->sh_addr
);
6395 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
6396 (unsigned long) section
->sh_offset
, section
->sh_link
,
6397 SECTION_HEADER_INDEX (section
->sh_link
)
6398 < elf_header
.e_shnum
6399 ? SECTION_NAME (SECTION_HEADER (section
->sh_link
))
6402 eneed
= get_data (NULL
, file
, section
->sh_offset
, 1,
6404 _("version need section"));
6408 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6410 Elf_External_Verneed
*entry
;
6411 Elf_Internal_Verneed ent
;
6416 vstart
= ((char *) eneed
) + idx
;
6418 entry
= (Elf_External_Verneed
*) vstart
;
6420 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
6421 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
6422 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
6423 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
6424 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
6426 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
6428 if (VALID_DYNAMIC_NAME (ent
.vn_file
))
6429 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent
.vn_file
));
6431 printf (_(" File: %lx"), ent
.vn_file
);
6433 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
6435 vstart
+= ent
.vn_aux
;
6437 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
6439 Elf_External_Vernaux
*eaux
;
6440 Elf_Internal_Vernaux aux
;
6442 eaux
= (Elf_External_Vernaux
*) vstart
;
6444 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
6445 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
6446 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
6447 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
6448 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
6450 if (VALID_DYNAMIC_NAME (aux
.vna_name
))
6451 printf (_(" %#06x: Name: %s"),
6452 isum
, GET_DYNAMIC_NAME (aux
.vna_name
));
6454 printf (_(" %#06x: Name index: %lx"),
6455 isum
, aux
.vna_name
);
6457 printf (_(" Flags: %s Version: %d\n"),
6458 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
6460 isum
+= aux
.vna_next
;
6461 vstart
+= aux
.vna_next
;
6471 case SHT_GNU_versym
:
6473 Elf_Internal_Shdr
*link_section
;
6476 unsigned char *edata
;
6477 unsigned short *data
;
6479 Elf_Internal_Sym
*symbols
;
6480 Elf_Internal_Shdr
*string_sec
;
6483 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
)
6486 link_section
= SECTION_HEADER (section
->sh_link
);
6487 total
= section
->sh_size
/ sizeof (Elf_External_Versym
);
6489 if (SECTION_HEADER_INDEX (link_section
->sh_link
)
6490 >= elf_header
.e_shnum
)
6495 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
6497 string_sec
= SECTION_HEADER (link_section
->sh_link
);
6499 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
6500 string_sec
->sh_size
, _("version string table"));
6504 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6505 SECTION_NAME (section
), total
);
6507 printf (_(" Addr: "));
6508 printf_vma (section
->sh_addr
);
6509 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6510 (unsigned long) section
->sh_offset
, section
->sh_link
,
6511 SECTION_NAME (link_section
));
6513 off
= offset_from_vma (file
,
6514 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6515 total
* sizeof (short));
6516 edata
= get_data (NULL
, file
, off
, total
, sizeof (short),
6517 _("version symbol data"));
6524 data
= cmalloc (total
, sizeof (short));
6526 for (cnt
= total
; cnt
--;)
6527 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
6532 for (cnt
= 0; cnt
< total
; cnt
+= 4)
6535 int check_def
, check_need
;
6538 printf (" %03x:", cnt
);
6540 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
6541 switch (data
[cnt
+ j
])
6544 fputs (_(" 0 (*local*) "), stdout
);
6548 fputs (_(" 1 (*global*) "), stdout
);
6552 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
6553 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
6557 if (SECTION_HEADER_INDEX (symbols
[cnt
+ j
].st_shndx
)
6558 >= elf_header
.e_shnum
6559 || SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
6562 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
6569 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
6571 Elf_Internal_Verneed ivn
;
6572 unsigned long offset
;
6574 offset
= offset_from_vma
6575 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6576 sizeof (Elf_External_Verneed
));
6580 Elf_Internal_Vernaux ivna
;
6581 Elf_External_Verneed evn
;
6582 Elf_External_Vernaux evna
;
6583 unsigned long a_off
;
6585 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
6588 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6589 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6591 a_off
= offset
+ ivn
.vn_aux
;
6595 get_data (&evna
, file
, a_off
, sizeof (evna
),
6596 1, _("version need aux (2)"));
6598 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6599 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6601 a_off
+= ivna
.vna_next
;
6603 while (ivna
.vna_other
!= data
[cnt
+ j
]
6604 && ivna
.vna_next
!= 0);
6606 if (ivna
.vna_other
== data
[cnt
+ j
])
6608 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6610 name
= strtab
+ ivna
.vna_name
;
6611 nn
+= printf ("(%s%-*s",
6613 12 - (int) strlen (name
),
6619 offset
+= ivn
.vn_next
;
6621 while (ivn
.vn_next
);
6624 if (check_def
&& data
[cnt
+ j
] != 0x8001
6625 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6627 Elf_Internal_Verdef ivd
;
6628 Elf_External_Verdef evd
;
6629 unsigned long offset
;
6631 offset
= offset_from_vma
6632 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6637 get_data (&evd
, file
, offset
, sizeof (evd
), 1,
6640 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6641 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6643 offset
+= ivd
.vd_next
;
6645 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
6646 && ivd
.vd_next
!= 0);
6648 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
6650 Elf_External_Verdaux evda
;
6651 Elf_Internal_Verdaux ivda
;
6653 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6655 get_data (&evda
, file
,
6656 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
6658 _("version def aux"));
6660 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6662 name
= strtab
+ ivda
.vda_name
;
6663 nn
+= printf ("(%s%-*s",
6665 12 - (int) strlen (name
),
6671 printf ("%*c", 18 - nn
, ' ');
6689 printf (_("\nNo version information found in this file.\n"));
6695 get_symbol_binding (unsigned int binding
)
6697 static char buff
[32];
6701 case STB_LOCAL
: return "LOCAL";
6702 case STB_GLOBAL
: return "GLOBAL";
6703 case STB_WEAK
: return "WEAK";
6705 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
6706 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"),
6708 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
6709 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), binding
);
6711 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), binding
);
6717 get_symbol_type (unsigned int type
)
6719 static char buff
[32];
6723 case STT_NOTYPE
: return "NOTYPE";
6724 case STT_OBJECT
: return "OBJECT";
6725 case STT_FUNC
: return "FUNC";
6726 case STT_SECTION
: return "SECTION";
6727 case STT_FILE
: return "FILE";
6728 case STT_COMMON
: return "COMMON";
6729 case STT_TLS
: return "TLS";
6731 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
6733 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
6734 return "THUMB_FUNC";
6736 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
6739 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
6740 return "PARISC_MILLI";
6742 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"), type
);
6744 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
6746 if (elf_header
.e_machine
== EM_PARISC
)
6748 if (type
== STT_HP_OPAQUE
)
6750 if (type
== STT_HP_STUB
)
6754 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), type
);
6757 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), type
);
6763 get_symbol_visibility (unsigned int visibility
)
6767 case STV_DEFAULT
: return "DEFAULT";
6768 case STV_INTERNAL
: return "INTERNAL";
6769 case STV_HIDDEN
: return "HIDDEN";
6770 case STV_PROTECTED
: return "PROTECTED";
6776 get_mips_symbol_other (unsigned int other
)
6780 case STO_OPTIONAL
: return "OPTIONAL";
6781 case STO_MIPS16
: return "MIPS16";
6782 default: return NULL
;
6787 get_symbol_other (unsigned int other
)
6789 const char * result
= NULL
;
6790 static char buff
[32];
6795 switch (elf_header
.e_machine
)
6798 result
= get_mips_symbol_other (other
);
6806 snprintf (buff
, sizeof buff
, _("<other>: %x"), other
);
6811 get_symbol_index_type (unsigned int type
)
6813 static char buff
[32];
6817 case SHN_UNDEF
: return "UND";
6818 case SHN_ABS
: return "ABS";
6819 case SHN_COMMON
: return "COM";
6821 if (type
== SHN_IA_64_ANSI_COMMON
6822 && elf_header
.e_machine
== EM_IA_64
6823 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
6825 else if (elf_header
.e_machine
== EM_X86_64
6826 && type
== SHN_X86_64_LCOMMON
)
6828 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
6829 sprintf (buff
, "PRC[0x%04x]", type
);
6830 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
6831 sprintf (buff
, "OS [0x%04x]", type
);
6832 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
6833 sprintf (buff
, "RSV[0x%04x]", type
);
6835 sprintf (buff
, "%3d", type
);
6843 get_dynamic_data (FILE *file
, unsigned int number
, unsigned int ent_size
)
6845 unsigned char *e_data
;
6848 e_data
= cmalloc (number
, ent_size
);
6852 error (_("Out of memory\n"));
6856 if (fread (e_data
, ent_size
, number
, file
) != number
)
6858 error (_("Unable to read in dynamic data\n"));
6862 i_data
= cmalloc (number
, sizeof (*i_data
));
6866 error (_("Out of memory\n"));
6872 i_data
[number
] = byte_get (e_data
+ number
* ent_size
, ent_size
);
6879 /* Dump the symbol table. */
6881 process_symbol_table (FILE *file
)
6883 Elf_Internal_Shdr
*section
;
6884 bfd_vma nbuckets
= 0;
6885 bfd_vma nchains
= 0;
6886 bfd_vma
*buckets
= NULL
;
6887 bfd_vma
*chains
= NULL
;
6889 if (! do_syms
&& !do_histogram
)
6892 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
6895 unsigned char nb
[8];
6896 unsigned char nc
[8];
6897 int hash_ent_size
= 4;
6899 if ((elf_header
.e_machine
== EM_ALPHA
6900 || elf_header
.e_machine
== EM_S390
6901 || elf_header
.e_machine
== EM_S390_OLD
)
6902 && elf_header
.e_ident
[EI_CLASS
] == ELFCLASS64
)
6906 (archive_file_offset
6907 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
6908 sizeof nb
+ sizeof nc
)),
6911 error (_("Unable to seek to start of dynamic information"));
6915 if (fread (nb
, hash_ent_size
, 1, file
) != 1)
6917 error (_("Failed to read in number of buckets\n"));
6921 if (fread (nc
, hash_ent_size
, 1, file
) != 1)
6923 error (_("Failed to read in number of chains\n"));
6927 nbuckets
= byte_get (nb
, hash_ent_size
);
6928 nchains
= byte_get (nc
, hash_ent_size
);
6930 buckets
= get_dynamic_data (file
, nbuckets
, hash_ent_size
);
6931 chains
= get_dynamic_data (file
, nchains
, hash_ent_size
);
6933 if (buckets
== NULL
|| chains
== NULL
)
6938 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
6943 printf (_("\nSymbol table for image:\n"));
6945 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6947 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6949 for (hn
= 0; hn
< nbuckets
; hn
++)
6954 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
6956 Elf_Internal_Sym
*psym
;
6959 psym
= dynamic_symbols
+ si
;
6961 n
= print_vma (si
, DEC_5
);
6963 fputs (" " + n
, stdout
);
6964 printf (" %3lu: ", hn
);
6965 print_vma (psym
->st_value
, LONG_HEX
);
6967 print_vma (psym
->st_size
, DEC_5
);
6969 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6970 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
6971 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6972 /* Check to see if any other bits in the st_other field are set.
6973 Note - displaying this information disrupts the layout of the
6974 table being generated, but for the moment this case is very rare. */
6975 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
6976 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
6977 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
6978 if (VALID_DYNAMIC_NAME (psym
->st_name
))
6979 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
6981 printf (" <corrupt: %14ld>", psym
->st_name
);
6986 else if (do_syms
&& !do_using_dynamic
)
6990 for (i
= 0, section
= section_headers
;
6991 i
< elf_header
.e_shnum
;
6995 char *strtab
= NULL
;
6996 unsigned long int strtab_size
= 0;
6997 Elf_Internal_Sym
*symtab
;
6998 Elf_Internal_Sym
*psym
;
7001 if ( section
->sh_type
!= SHT_SYMTAB
7002 && section
->sh_type
!= SHT_DYNSYM
)
7005 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
7006 SECTION_NAME (section
),
7007 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
7009 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7011 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7013 symtab
= GET_ELF_SYMBOLS (file
, section
);
7017 if (section
->sh_link
== elf_header
.e_shstrndx
)
7019 strtab
= string_table
;
7020 strtab_size
= string_table_length
;
7022 else if (SECTION_HEADER_INDEX (section
->sh_link
) < elf_header
.e_shnum
)
7024 Elf_Internal_Shdr
*string_sec
;
7026 string_sec
= SECTION_HEADER (section
->sh_link
);
7028 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
7029 1, string_sec
->sh_size
, _("string table"));
7030 strtab_size
= strtab
!= NULL
? string_sec
->sh_size
: 0;
7033 for (si
= 0, psym
= symtab
;
7034 si
< section
->sh_size
/ section
->sh_entsize
;
7037 printf ("%6d: ", si
);
7038 print_vma (psym
->st_value
, LONG_HEX
);
7040 print_vma (psym
->st_size
, DEC_5
);
7041 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
7042 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
7043 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
7044 /* Check to see if any other bits in the st_other field are set.
7045 Note - displaying this information disrupts the layout of the
7046 table being generated, but for the moment this case is very rare. */
7047 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
7048 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
7049 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
7050 print_symbol (25, psym
->st_name
< strtab_size
7051 ? strtab
+ psym
->st_name
: "<corrupt>");
7053 if (section
->sh_type
== SHT_DYNSYM
&&
7054 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
7056 unsigned char data
[2];
7057 unsigned short vers_data
;
7058 unsigned long offset
;
7062 offset
= offset_from_vma
7063 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
7064 sizeof data
+ si
* sizeof (vers_data
));
7066 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
7067 sizeof (data
), 1, _("version data"));
7069 vers_data
= byte_get (data
, 2);
7071 is_nobits
= (SECTION_HEADER_INDEX (psym
->st_shndx
)
7072 < elf_header
.e_shnum
7073 && SECTION_HEADER (psym
->st_shndx
)->sh_type
7076 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
7078 if ((vers_data
& 0x8000) || vers_data
> 1)
7080 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
7081 && (is_nobits
|| ! check_def
))
7083 Elf_External_Verneed evn
;
7084 Elf_Internal_Verneed ivn
;
7085 Elf_Internal_Vernaux ivna
;
7087 /* We must test both. */
7088 offset
= offset_from_vma
7089 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
7094 unsigned long vna_off
;
7096 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
7099 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
7100 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
7102 vna_off
= offset
+ ivn
.vn_aux
;
7106 Elf_External_Vernaux evna
;
7108 get_data (&evna
, file
, vna_off
,
7110 _("version need aux (3)"));
7112 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
7113 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
7114 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
7116 vna_off
+= ivna
.vna_next
;
7118 while (ivna
.vna_other
!= vers_data
7119 && ivna
.vna_next
!= 0);
7121 if (ivna
.vna_other
== vers_data
)
7124 offset
+= ivn
.vn_next
;
7126 while (ivn
.vn_next
!= 0);
7128 if (ivna
.vna_other
== vers_data
)
7131 ivna
.vna_name
< strtab_size
7132 ? strtab
+ ivna
.vna_name
: "<corrupt>",
7136 else if (! is_nobits
)
7137 error (_("bad dynamic symbol"));
7144 if (vers_data
!= 0x8001
7145 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
7147 Elf_Internal_Verdef ivd
;
7148 Elf_Internal_Verdaux ivda
;
7149 Elf_External_Verdaux evda
;
7150 unsigned long offset
;
7152 offset
= offset_from_vma
7154 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
7155 sizeof (Elf_External_Verdef
));
7159 Elf_External_Verdef evd
;
7161 get_data (&evd
, file
, offset
, sizeof (evd
),
7162 1, _("version def"));
7164 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
7165 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
7166 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
7168 offset
+= ivd
.vd_next
;
7170 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
7171 && ivd
.vd_next
!= 0);
7173 offset
-= ivd
.vd_next
;
7174 offset
+= ivd
.vd_aux
;
7176 get_data (&evda
, file
, offset
, sizeof (evda
),
7177 1, _("version def aux"));
7179 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
7181 if (psym
->st_name
!= ivda
.vda_name
)
7182 printf ((vers_data
& 0x8000)
7184 ivda
.vda_name
< strtab_size
7185 ? strtab
+ ivda
.vda_name
: "<corrupt>");
7195 if (strtab
!= string_table
)
7201 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
7203 if (do_histogram
&& buckets
!= NULL
)
7205 unsigned long *lengths
;
7206 unsigned long *counts
;
7209 unsigned long maxlength
= 0;
7210 unsigned long nzero_counts
= 0;
7211 unsigned long nsyms
= 0;
7213 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
7214 (unsigned long) nbuckets
);
7215 printf (_(" Length Number %% of total Coverage\n"));
7217 lengths
= calloc (nbuckets
, sizeof (*lengths
));
7218 if (lengths
== NULL
)
7220 error (_("Out of memory"));
7223 for (hn
= 0; hn
< nbuckets
; ++hn
)
7225 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
7228 if (maxlength
< ++lengths
[hn
])
7233 counts
= calloc (maxlength
+ 1, sizeof (*counts
));
7236 error (_("Out of memory"));
7240 for (hn
= 0; hn
< nbuckets
; ++hn
)
7241 ++counts
[lengths
[hn
]];
7246 printf (" 0 %-10lu (%5.1f%%)\n",
7247 counts
[0], (counts
[0] * 100.0) / nbuckets
);
7248 for (i
= 1; i
<= maxlength
; ++i
)
7250 nzero_counts
+= counts
[i
] * i
;
7251 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7252 i
, counts
[i
], (counts
[i
] * 100.0) / nbuckets
,
7253 (nzero_counts
* 100.0) / nsyms
);
7261 if (buckets
!= NULL
)
7271 process_syminfo (FILE *file ATTRIBUTE_UNUSED
)
7275 if (dynamic_syminfo
== NULL
7277 /* No syminfo, this is ok. */
7280 /* There better should be a dynamic symbol section. */
7281 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
7285 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
7286 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
7288 printf (_(" Num: Name BoundTo Flags\n"));
7289 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
7291 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
7293 printf ("%4d: ", i
);
7294 if (VALID_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
))
7295 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
));
7297 printf ("<corrupt: %19ld>", dynamic_symbols
[i
].st_name
);
7300 switch (dynamic_syminfo
[i
].si_boundto
)
7302 case SYMINFO_BT_SELF
:
7303 fputs ("SELF ", stdout
);
7305 case SYMINFO_BT_PARENT
:
7306 fputs ("PARENT ", stdout
);
7309 if (dynamic_syminfo
[i
].si_boundto
> 0
7310 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
7311 && VALID_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
7313 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
7317 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
7321 if (flags
& SYMINFO_FLG_DIRECT
)
7323 if (flags
& SYMINFO_FLG_PASSTHRU
)
7324 printf (" PASSTHRU");
7325 if (flags
& SYMINFO_FLG_COPY
)
7327 if (flags
& SYMINFO_FLG_LAZYLOAD
)
7328 printf (" LAZYLOAD");
7336 #ifdef SUPPORT_DISASSEMBLY
7338 disassemble_section (Elf_Internal_Shdr
*section
, FILE *file
)
7340 printf (_("\nAssembly dump of section %s\n"),
7341 SECTION_NAME (section
));
7343 /* XXX -- to be done --- XXX */
7350 dump_section (Elf_Internal_Shdr
*section
, FILE *file
)
7352 bfd_size_type bytes
;
7354 unsigned char *data
;
7355 unsigned char *start
;
7357 bytes
= section
->sh_size
;
7359 if (bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
7361 printf (_("\nSection '%s' has no data to dump.\n"),
7362 SECTION_NAME (section
));
7366 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
7368 addr
= section
->sh_addr
;
7370 start
= get_data (NULL
, file
, section
->sh_offset
, 1, bytes
,
7383 lbytes
= (bytes
> 16 ? 16 : bytes
);
7385 printf (" 0x%8.8lx ", (unsigned long) addr
);
7387 switch (elf_header
.e_ident
[EI_DATA
])
7391 for (j
= 15; j
>= 0; j
--)
7394 printf ("%2.2x", data
[j
]);
7404 for (j
= 0; j
< 16; j
++)
7407 printf ("%2.2x", data
[j
]);
7417 for (j
= 0; j
< lbytes
; j
++)
7420 if (k
>= ' ' && k
< 0x7f)
7438 /* Apply addends of RELA relocations. */
7441 debug_apply_rela_addends (void *file
,
7442 Elf_Internal_Shdr
*section
,
7443 unsigned char *start
)
7445 Elf_Internal_Shdr
*relsec
;
7446 unsigned char *end
= start
+ section
->sh_size
;
7447 /* FIXME: The relocation field size is relocation type dependent. */
7448 unsigned int reloc_size
= 4;
7450 if (!is_relocatable
)
7453 if (section
->sh_size
< reloc_size
)
7456 for (relsec
= section_headers
;
7457 relsec
< section_headers
+ elf_header
.e_shnum
;
7460 unsigned long nrelas
;
7461 Elf_Internal_Rela
*rela
, *rp
;
7462 Elf_Internal_Shdr
*symsec
;
7463 Elf_Internal_Sym
*symtab
;
7464 Elf_Internal_Sym
*sym
;
7466 if (relsec
->sh_type
!= SHT_RELA
7467 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
7468 || SECTION_HEADER (relsec
->sh_info
) != section
7469 || relsec
->sh_size
== 0
7470 || SECTION_HEADER_INDEX (relsec
->sh_link
) >= elf_header
.e_shnum
)
7473 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
7477 symsec
= SECTION_HEADER (relsec
->sh_link
);
7478 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
7480 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
7484 loc
= start
+ rp
->r_offset
;
7485 if ((loc
+ reloc_size
) > end
)
7487 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
7488 (unsigned long) rp
->r_offset
,
7489 SECTION_NAME (section
));
7495 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
7497 if (ELF32_R_SYM (rp
->r_info
) != 0
7498 && ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
7499 /* Relocations against object symbols can happen,
7500 eg when referencing a global array. For an
7501 example of this see the _clz.o binary in libgcc.a. */
7502 && ELF32_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
7504 warn (_("skipping unexpected symbol type %s in relocation in section .rela%s\n"),
7505 get_symbol_type (ELF32_ST_TYPE (sym
->st_info
)),
7506 SECTION_NAME (section
));
7512 /* In MIPS little-endian objects, r_info isn't really a
7513 64-bit little-endian value: it has a 32-bit little-endian
7514 symbol index followed by four individual byte fields.
7515 Reorder INFO accordingly. */
7516 if (elf_header
.e_machine
== EM_MIPS
7517 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
7518 rp
->r_info
= (((rp
->r_info
& 0xffffffff) << 32)
7519 | ((rp
->r_info
>> 56) & 0xff)
7520 | ((rp
->r_info
>> 40) & 0xff00)
7521 | ((rp
->r_info
>> 24) & 0xff0000)
7522 | ((rp
->r_info
>> 8) & 0xff000000));
7524 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
7526 if (ELF64_R_SYM (rp
->r_info
) != 0
7527 && ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
7528 && ELF64_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
7530 warn (_("skipping unexpected symbol type %s in relocation in section .rela.%s\n"),
7531 get_symbol_type (ELF64_ST_TYPE (sym
->st_info
)),
7532 SECTION_NAME (section
));
7537 byte_put (loc
, rp
->r_addend
, reloc_size
);
7548 load_debug_section (enum dwarf_section_display_enum debug
, void *file
)
7550 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
7551 Elf_Internal_Shdr
*sec
;
7554 /* If it is already loaded, do nothing. */
7555 if (section
->start
!= NULL
)
7558 /* Locate the debug section. */
7559 sec
= find_section (section
->name
);
7563 snprintf (buf
, sizeof (buf
), _("%s section data"), section
->name
);
7564 section
->address
= sec
->sh_addr
;
7565 section
->size
= sec
->sh_size
;
7566 section
->start
= get_data (NULL
, file
, sec
->sh_offset
, 1,
7569 if (debug_displays
[debug
].relocate
)
7570 debug_apply_rela_addends (file
, sec
, section
->start
);
7572 return section
->start
!= NULL
;
7576 free_debug_section (enum dwarf_section_display_enum debug
)
7578 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
7580 if (section
->start
== NULL
)
7583 free ((char *) section
->start
);
7584 section
->start
= NULL
;
7585 section
->address
= 0;
7590 display_debug_section (Elf_Internal_Shdr
*section
, FILE *file
)
7592 char *name
= SECTION_NAME (section
);
7593 bfd_size_type length
;
7595 enum dwarf_section_display_enum i
;
7597 length
= section
->sh_size
;
7600 printf (_("\nSection '%s' has no debugging data.\n"), name
);
7604 if (strneq (name
, ".gnu.linkonce.wi.", 17))
7605 name
= ".debug_info";
7607 /* See if we know how to display the contents of this section. */
7608 for (i
= 0; i
< max
; i
++)
7609 if (streq (debug_displays
[i
].section
.name
, name
))
7611 struct dwarf_section
*sec
= &debug_displays
[i
].section
;
7613 if (load_debug_section (i
, file
))
7615 result
&= debug_displays
[i
].display (sec
, file
);
7617 if (i
!= info
&& i
!= abbrev
)
7618 free_debug_section (i
);
7626 printf (_("Unrecognized debug section: %s\n"), name
);
7633 /* Set DUMP_SECTS for all sections where dumps were requested
7634 based on section name. */
7637 initialise_dumps_byname (void)
7639 struct dump_list_entry
*cur
;
7641 for (cur
= dump_sects_byname
; cur
; cur
= cur
->next
)
7646 for (i
= 0, any
= 0; i
< elf_header
.e_shnum
; i
++)
7647 if (streq (SECTION_NAME (section_headers
+ i
), cur
->name
))
7649 request_dump (i
, cur
->type
);
7654 warn (_("Section '%s' was not dumped because it does not exist!\n"),
7660 process_section_contents (FILE *file
)
7662 Elf_Internal_Shdr
*section
;
7668 initialise_dumps_byname ();
7670 for (i
= 0, section
= section_headers
;
7671 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
7674 #ifdef SUPPORT_DISASSEMBLY
7675 if (dump_sects
[i
] & DISASS_DUMP
)
7676 disassemble_section (section
, file
);
7678 if (dump_sects
[i
] & HEX_DUMP
)
7679 dump_section (section
, file
);
7681 if (dump_sects
[i
] & DEBUG_DUMP
)
7682 display_debug_section (section
, file
);
7685 /* Check to see if the user requested a
7686 dump of a section that does not exist. */
7687 while (i
++ < num_dump_sects
)
7689 warn (_("Section %d was not dumped because it does not exist!\n"), i
);
7693 process_mips_fpe_exception (int mask
)
7698 if (mask
& OEX_FPU_INEX
)
7699 fputs ("INEX", stdout
), first
= 0;
7700 if (mask
& OEX_FPU_UFLO
)
7701 printf ("%sUFLO", first
? "" : "|"), first
= 0;
7702 if (mask
& OEX_FPU_OFLO
)
7703 printf ("%sOFLO", first
? "" : "|"), first
= 0;
7704 if (mask
& OEX_FPU_DIV0
)
7705 printf ("%sDIV0", first
? "" : "|"), first
= 0;
7706 if (mask
& OEX_FPU_INVAL
)
7707 printf ("%sINVAL", first
? "" : "|");
7710 fputs ("0", stdout
);
7713 /* ARM EABI attributes section. */
7718 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
7721 } arm_attr_public_tag
;
7723 static const char *arm_attr_tag_CPU_arch
[] =
7724 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
7726 static const char *arm_attr_tag_ARM_ISA_use
[] = {"No", "Yes"};
7727 static const char *arm_attr_tag_THUMB_ISA_use
[] =
7728 {"No", "Thumb-1", "Thumb-2"};
7729 static const char *arm_attr_tag_VFP_arch
[] = {"No", "VFPv1", "VFPv2"};
7730 static const char *arm_attr_tag_WMMX_arch
[] = {"No", "WMMXv1"};
7731 static const char *arm_attr_tag_NEON_arch
[] = {"No", "NEONv1"};
7732 static const char *arm_attr_tag_ABI_PCS_config
[] =
7733 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
7734 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
7735 static const char *arm_attr_tag_ABI_PCS_R9_use
[] =
7736 {"V6", "SB", "TLS", "Unused"};
7737 static const char *arm_attr_tag_ABI_PCS_RW_data
[] =
7738 {"Absolute", "PC-relative", "SB-relative", "None"};
7739 static const char *arm_attr_tag_ABI_PCS_RO_DATA
[] =
7740 {"Absolute", "PC-relative", "None"};
7741 static const char *arm_attr_tag_ABI_PCS_GOT_use
[] =
7742 {"None", "direct", "GOT-indirect"};
7743 static const char *arm_attr_tag_ABI_PCS_wchar_t
[] =
7744 {"None", "??? 1", "2", "??? 3", "4"};
7745 static const char *arm_attr_tag_ABI_FP_rounding
[] = {"Unused", "Needed"};
7746 static const char *arm_attr_tag_ABI_FP_denormal
[] = {"Unused", "Needed"};
7747 static const char *arm_attr_tag_ABI_FP_exceptions
[] = {"Unused", "Needed"};
7748 static const char *arm_attr_tag_ABI_FP_user_exceptions
[] = {"Unused", "Needed"};
7749 static const char *arm_attr_tag_ABI_FP_number_model
[] =
7750 {"Unused", "Finite", "RTABI", "IEEE 754"};
7751 static const char *arm_attr_tag_ABI_align8_needed
[] = {"No", "Yes", "4-byte"};
7752 static const char *arm_attr_tag_ABI_align8_preserved
[] =
7753 {"No", "Yes, except leaf SP", "Yes"};
7754 static const char *arm_attr_tag_ABI_enum_size
[] =
7755 {"Unused", "small", "int", "forced to int"};
7756 static const char *arm_attr_tag_ABI_HardFP_use
[] =
7757 {"As Tag_VFP_arch", "SP only", "DP only", "SP and DP"};
7758 static const char *arm_attr_tag_ABI_VFP_args
[] =
7759 {"AAPCS", "VFP registers", "custom"};
7760 static const char *arm_attr_tag_ABI_WMMX_args
[] =
7761 {"AAPCS", "WMMX registers", "custom"};
7762 static const char *arm_attr_tag_ABI_optimization_goals
[] =
7763 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
7764 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
7765 static const char *arm_attr_tag_ABI_FP_optimization_goals
[] =
7766 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
7767 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
7769 #define LOOKUP(id, name) \
7770 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
7771 static arm_attr_public_tag arm_attr_public_tags
[] =
7773 {4, "CPU_raw_name", 1, NULL
},
7774 {5, "CPU_name", 1, NULL
},
7775 LOOKUP(6, CPU_arch
),
7776 {7, "CPU_arch_profile", 0, NULL
},
7777 LOOKUP(8, ARM_ISA_use
),
7778 LOOKUP(9, THUMB_ISA_use
),
7779 LOOKUP(10, VFP_arch
),
7780 LOOKUP(11, WMMX_arch
),
7781 LOOKUP(12, NEON_arch
),
7782 LOOKUP(13, ABI_PCS_config
),
7783 LOOKUP(14, ABI_PCS_R9_use
),
7784 LOOKUP(15, ABI_PCS_RW_data
),
7785 LOOKUP(16, ABI_PCS_RO_DATA
),
7786 LOOKUP(17, ABI_PCS_GOT_use
),
7787 LOOKUP(18, ABI_PCS_wchar_t
),
7788 LOOKUP(19, ABI_FP_rounding
),
7789 LOOKUP(20, ABI_FP_denormal
),
7790 LOOKUP(21, ABI_FP_exceptions
),
7791 LOOKUP(22, ABI_FP_user_exceptions
),
7792 LOOKUP(23, ABI_FP_number_model
),
7793 LOOKUP(24, ABI_align8_needed
),
7794 LOOKUP(25, ABI_align8_preserved
),
7795 LOOKUP(26, ABI_enum_size
),
7796 LOOKUP(27, ABI_HardFP_use
),
7797 LOOKUP(28, ABI_VFP_args
),
7798 LOOKUP(29, ABI_WMMX_args
),
7799 LOOKUP(30, ABI_optimization_goals
),
7800 LOOKUP(31, ABI_FP_optimization_goals
),
7801 {32, "compatibility", 0, NULL
}
7805 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
7808 read_uleb128 (unsigned char *p
, unsigned int *plen
)
7822 val
|= ((unsigned int)c
& 0x7f) << shift
;
7831 static unsigned char *
7832 display_arm_attribute (unsigned char *p
)
7837 arm_attr_public_tag
*attr
;
7841 tag
= read_uleb128 (p
, &len
);
7844 for (i
= 0; i
< ARRAY_SIZE(arm_attr_public_tags
); i
++)
7846 if (arm_attr_public_tags
[i
].tag
== tag
)
7848 attr
= &arm_attr_public_tags
[i
];
7855 printf (" Tag_%s: ", attr
->name
);
7861 case 7: /* Tag_CPU_arch_profile. */
7862 val
= read_uleb128 (p
, &len
);
7866 case 0: printf ("None\n"); break;
7867 case 'A': printf ("Application\n"); break;
7868 case 'R': printf ("Realtime\n"); break;
7869 case 'M': printf ("Microcontroller\n"); break;
7870 default: printf ("??? (%d)\n", val
); break;
7874 case 32: /* Tag_compatibility. */
7875 val
= read_uleb128 (p
, &len
);
7877 printf ("flag = %d, vendor = %s\n", val
, p
);
7878 p
+= strlen((char *)p
) + 1;
7892 assert (attr
->type
& 0x80);
7893 val
= read_uleb128 (p
, &len
);
7895 type
= attr
->type
& 0x7f;
7897 printf ("??? (%d)\n", val
);
7899 printf ("%s\n", attr
->table
[val
]);
7906 type
= 1; /* String. */
7908 type
= 2; /* uleb128. */
7909 printf (" Tag_unknown_%d: ", tag
);
7914 printf ("\"%s\"\n", p
);
7915 p
+= strlen((char *)p
) + 1;
7919 val
= read_uleb128 (p
, &len
);
7921 printf ("%d (0x%x)\n", val
, val
);
7928 process_arm_specific (FILE *file
)
7930 Elf_Internal_Shdr
*sect
;
7931 unsigned char *contents
;
7934 bfd_vma section_len
;
7938 /* Find the section header so that we get the size. */
7939 for (i
= 0, sect
= section_headers
;
7940 i
< elf_header
.e_shnum
;
7943 if (sect
->sh_type
!= SHT_ARM_ATTRIBUTES
)
7946 contents
= get_data (NULL
, file
, sect
->sh_offset
, 1, sect
->sh_size
,
7954 len
= sect
->sh_size
- 1;
7959 bfd_boolean public_section
;
7961 section_len
= byte_get (p
, 4);
7963 if (section_len
> len
)
7965 printf (_("ERROR: Bad section length (%d > %d)\n"),
7966 (int)section_len
, (int)len
);
7970 printf ("Attribute Section: %s\n", p
);
7971 if (strcmp ((char *)p
, "aeabi") == 0)
7972 public_section
= TRUE
;
7974 public_section
= FALSE
;
7975 namelen
= strlen ((char *)p
) + 1;
7977 section_len
-= namelen
+ 4;
7978 while (section_len
> 0)
7983 size
= byte_get (p
, 4);
7984 if (size
> section_len
)
7986 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
7987 (int)size
, (int)section_len
);
7990 section_len
-= size
;
7996 printf ("File Attributes\n");
7999 printf ("Section Attributes:");
8002 printf ("Symbol Attributes:");
8007 val
= read_uleb128 (p
, &i
);
8011 printf (" %d", val
);
8016 printf ("Unknown tag: %d\n", tag
);
8017 public_section
= FALSE
;
8023 p
= display_arm_attribute(p
);
8027 /* ??? Do something sensible, like dump hex. */
8028 printf (" Unknown section contexts\n");
8036 printf (_("Unknown format '%c'\n"), *p
);
8045 process_mips_specific (FILE *file
)
8047 Elf_Internal_Dyn
*entry
;
8048 size_t liblist_offset
= 0;
8049 size_t liblistno
= 0;
8050 size_t conflictsno
= 0;
8051 size_t options_offset
= 0;
8052 size_t conflicts_offset
= 0;
8054 /* We have a lot of special sections. Thanks SGI! */
8055 if (dynamic_section
== NULL
)
8056 /* No information available. */
8059 for (entry
= dynamic_section
; entry
->d_tag
!= DT_NULL
; ++entry
)
8060 switch (entry
->d_tag
)
8062 case DT_MIPS_LIBLIST
:
8064 = offset_from_vma (file
, entry
->d_un
.d_val
,
8065 liblistno
* sizeof (Elf32_External_Lib
));
8067 case DT_MIPS_LIBLISTNO
:
8068 liblistno
= entry
->d_un
.d_val
;
8070 case DT_MIPS_OPTIONS
:
8071 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
8073 case DT_MIPS_CONFLICT
:
8075 = offset_from_vma (file
, entry
->d_un
.d_val
,
8076 conflictsno
* sizeof (Elf32_External_Conflict
));
8078 case DT_MIPS_CONFLICTNO
:
8079 conflictsno
= entry
->d_un
.d_val
;
8085 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
8087 Elf32_External_Lib
*elib
;
8090 elib
= get_data (NULL
, file
, liblist_offset
,
8091 liblistno
, sizeof (Elf32_External_Lib
),
8095 printf ("\nSection '.liblist' contains %lu entries:\n",
8096 (unsigned long) liblistno
);
8097 fputs (" Library Time Stamp Checksum Version Flags\n",
8100 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
8107 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
8108 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
8109 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
8110 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
8111 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
8113 tmp
= gmtime (&time
);
8114 snprintf (timebuf
, sizeof (timebuf
),
8115 "%04u-%02u-%02uT%02u:%02u:%02u",
8116 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
8117 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
8119 printf ("%3lu: ", (unsigned long) cnt
);
8120 if (VALID_DYNAMIC_NAME (liblist
.l_name
))
8121 print_symbol (20, GET_DYNAMIC_NAME (liblist
.l_name
));
8123 printf ("<corrupt: %9ld>", liblist
.l_name
);
8124 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
8127 if (liblist
.l_flags
== 0)
8138 { " EXACT_MATCH", LL_EXACT_MATCH
},
8139 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
8140 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
8141 { " EXPORTS", LL_EXPORTS
},
8142 { " DELAY_LOAD", LL_DELAY_LOAD
},
8143 { " DELTA", LL_DELTA
}
8145 int flags
= liblist
.l_flags
;
8149 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
8151 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
8153 fputs (l_flags_vals
[fcnt
].name
, stdout
);
8154 flags
^= l_flags_vals
[fcnt
].bit
;
8157 printf (" %#x", (unsigned int) flags
);
8167 if (options_offset
!= 0)
8169 Elf_External_Options
*eopt
;
8170 Elf_Internal_Shdr
*sect
= section_headers
;
8171 Elf_Internal_Options
*iopt
;
8172 Elf_Internal_Options
*option
;
8176 /* Find the section header so that we get the size. */
8177 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
8180 eopt
= get_data (NULL
, file
, options_offset
, 1, sect
->sh_size
,
8184 iopt
= cmalloc ((sect
->sh_size
/ sizeof (eopt
)), sizeof (*iopt
));
8187 error (_("Out of memory"));
8194 while (offset
< sect
->sh_size
)
8196 Elf_External_Options
*eoption
;
8198 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
8200 option
->kind
= BYTE_GET (eoption
->kind
);
8201 option
->size
= BYTE_GET (eoption
->size
);
8202 option
->section
= BYTE_GET (eoption
->section
);
8203 option
->info
= BYTE_GET (eoption
->info
);
8205 offset
+= option
->size
;
8211 printf (_("\nSection '%s' contains %d entries:\n"),
8212 SECTION_NAME (sect
), cnt
);
8220 switch (option
->kind
)
8223 /* This shouldn't happen. */
8224 printf (" NULL %d %lx", option
->section
, option
->info
);
8227 printf (" REGINFO ");
8228 if (elf_header
.e_machine
== EM_MIPS
)
8231 Elf32_External_RegInfo
*ereg
;
8232 Elf32_RegInfo reginfo
;
8234 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
8235 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8236 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8237 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8238 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8239 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8240 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
8242 printf ("GPR %08lx GP 0x%lx\n",
8244 (unsigned long) reginfo
.ri_gp_value
);
8245 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8246 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8247 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8252 Elf64_External_RegInfo
*ereg
;
8253 Elf64_Internal_RegInfo reginfo
;
8255 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
8256 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8257 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8258 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8259 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8260 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8261 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
8263 printf ("GPR %08lx GP 0x",
8264 reginfo
.ri_gprmask
);
8265 printf_vma (reginfo
.ri_gp_value
);
8268 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8269 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8270 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8274 case ODK_EXCEPTIONS
:
8275 fputs (" EXCEPTIONS fpe_min(", stdout
);
8276 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
8277 fputs (") fpe_max(", stdout
);
8278 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
8279 fputs (")", stdout
);
8281 if (option
->info
& OEX_PAGE0
)
8282 fputs (" PAGE0", stdout
);
8283 if (option
->info
& OEX_SMM
)
8284 fputs (" SMM", stdout
);
8285 if (option
->info
& OEX_FPDBUG
)
8286 fputs (" FPDBUG", stdout
);
8287 if (option
->info
& OEX_DISMISS
)
8288 fputs (" DISMISS", stdout
);
8291 fputs (" PAD ", stdout
);
8292 if (option
->info
& OPAD_PREFIX
)
8293 fputs (" PREFIX", stdout
);
8294 if (option
->info
& OPAD_POSTFIX
)
8295 fputs (" POSTFIX", stdout
);
8296 if (option
->info
& OPAD_SYMBOL
)
8297 fputs (" SYMBOL", stdout
);
8300 fputs (" HWPATCH ", stdout
);
8301 if (option
->info
& OHW_R4KEOP
)
8302 fputs (" R4KEOP", stdout
);
8303 if (option
->info
& OHW_R8KPFETCH
)
8304 fputs (" R8KPFETCH", stdout
);
8305 if (option
->info
& OHW_R5KEOP
)
8306 fputs (" R5KEOP", stdout
);
8307 if (option
->info
& OHW_R5KCVTL
)
8308 fputs (" R5KCVTL", stdout
);
8311 fputs (" FILL ", stdout
);
8312 /* XXX Print content of info word? */
8315 fputs (" TAGS ", stdout
);
8316 /* XXX Print content of info word? */
8319 fputs (" HWAND ", stdout
);
8320 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8321 fputs (" R4KEOP_CHECKED", stdout
);
8322 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8323 fputs (" R4KEOP_CLEAN", stdout
);
8326 fputs (" HWOR ", stdout
);
8327 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8328 fputs (" R4KEOP_CHECKED", stdout
);
8329 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8330 fputs (" R4KEOP_CLEAN", stdout
);
8333 printf (" GP_GROUP %#06lx self-contained %#06lx",
8334 option
->info
& OGP_GROUP
,
8335 (option
->info
& OGP_SELF
) >> 16);
8338 printf (" IDENT %#06lx self-contained %#06lx",
8339 option
->info
& OGP_GROUP
,
8340 (option
->info
& OGP_SELF
) >> 16);
8343 /* This shouldn't happen. */
8344 printf (" %3d ??? %d %lx",
8345 option
->kind
, option
->section
, option
->info
);
8349 len
= sizeof (*eopt
);
8350 while (len
< option
->size
)
8351 if (((char *) option
)[len
] >= ' '
8352 && ((char *) option
)[len
] < 0x7f)
8353 printf ("%c", ((char *) option
)[len
++]);
8355 printf ("\\%03o", ((char *) option
)[len
++]);
8357 fputs ("\n", stdout
);
8365 if (conflicts_offset
!= 0 && conflictsno
!= 0)
8367 Elf32_Conflict
*iconf
;
8370 if (dynamic_symbols
== NULL
)
8372 error (_("conflict list found without a dynamic symbol table"));
8376 iconf
= cmalloc (conflictsno
, sizeof (*iconf
));
8379 error (_("Out of memory"));
8385 Elf32_External_Conflict
*econf32
;
8387 econf32
= get_data (NULL
, file
, conflicts_offset
,
8388 conflictsno
, sizeof (*econf32
), _("conflict"));
8392 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8393 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
8399 Elf64_External_Conflict
*econf64
;
8401 econf64
= get_data (NULL
, file
, conflicts_offset
,
8402 conflictsno
, sizeof (*econf64
), _("conflict"));
8406 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8407 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
8412 printf (_("\nSection '.conflict' contains %lu entries:\n"),
8413 (unsigned long) conflictsno
);
8414 puts (_(" Num: Index Value Name"));
8416 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8418 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
8420 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
8421 print_vma (psym
->st_value
, FULL_HEX
);
8423 if (VALID_DYNAMIC_NAME (psym
->st_name
))
8424 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
8426 printf ("<corrupt: %14ld>", psym
->st_name
);
8437 process_gnu_liblist (FILE *file
)
8439 Elf_Internal_Shdr
*section
, *string_sec
;
8440 Elf32_External_Lib
*elib
;
8449 for (i
= 0, section
= section_headers
;
8450 i
< elf_header
.e_shnum
;
8453 switch (section
->sh_type
)
8455 case SHT_GNU_LIBLIST
:
8456 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
)
8459 elib
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
8464 string_sec
= SECTION_HEADER (section
->sh_link
);
8466 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
8467 string_sec
->sh_size
, _("liblist string table"));
8468 strtab_size
= string_sec
->sh_size
;
8471 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
8477 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
8478 SECTION_NAME (section
),
8479 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
8481 puts (" Library Time Stamp Checksum Version Flags");
8483 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
8491 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
8492 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
8493 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
8494 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
8495 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
8497 tmp
= gmtime (&time
);
8498 snprintf (timebuf
, sizeof (timebuf
),
8499 "%04u-%02u-%02uT%02u:%02u:%02u",
8500 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
8501 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
8503 printf ("%3lu: ", (unsigned long) cnt
);
8505 printf ("%-20s", liblist
.l_name
< strtab_size
8506 ? strtab
+ liblist
.l_name
: "<corrupt>");
8508 printf ("%-20.20s", liblist
.l_name
< strtab_size
8509 ? strtab
+ liblist
.l_name
: "<corrupt>");
8510 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
8511 liblist
.l_version
, liblist
.l_flags
);
8522 get_note_type (unsigned e_type
)
8524 static char buff
[64];
8526 if (elf_header
.e_type
== ET_CORE
)
8530 return _("NT_AUXV (auxiliary vector)");
8532 return _("NT_PRSTATUS (prstatus structure)");
8534 return _("NT_FPREGSET (floating point registers)");
8536 return _("NT_PRPSINFO (prpsinfo structure)");
8538 return _("NT_TASKSTRUCT (task structure)");
8540 return _("NT_PRXFPREG (user_xfpregs structure)");
8542 return _("NT_PSTATUS (pstatus structure)");
8544 return _("NT_FPREGS (floating point registers)");
8546 return _("NT_PSINFO (psinfo structure)");
8548 return _("NT_LWPSTATUS (lwpstatus_t structure)");
8550 return _("NT_LWPSINFO (lwpsinfo_t structure)");
8551 case NT_WIN32PSTATUS
:
8552 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
8560 return _("NT_VERSION (version)");
8562 return _("NT_ARCH (architecture)");
8567 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
8572 get_netbsd_elfcore_note_type (unsigned e_type
)
8574 static char buff
[64];
8576 if (e_type
== NT_NETBSDCORE_PROCINFO
)
8578 /* NetBSD core "procinfo" structure. */
8579 return _("NetBSD procinfo structure");
8582 /* As of Jan 2002 there are no other machine-independent notes
8583 defined for NetBSD core files. If the note type is less
8584 than the start of the machine-dependent note types, we don't
8587 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
8589 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
8593 switch (elf_header
.e_machine
)
8595 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
8596 and PT_GETFPREGS == mach+2. */
8601 case EM_SPARC32PLUS
:
8605 case NT_NETBSDCORE_FIRSTMACH
+0:
8606 return _("PT_GETREGS (reg structure)");
8607 case NT_NETBSDCORE_FIRSTMACH
+2:
8608 return _("PT_GETFPREGS (fpreg structure)");
8614 /* On all other arch's, PT_GETREGS == mach+1 and
8615 PT_GETFPREGS == mach+3. */
8619 case NT_NETBSDCORE_FIRSTMACH
+1:
8620 return _("PT_GETREGS (reg structure)");
8621 case NT_NETBSDCORE_FIRSTMACH
+3:
8622 return _("PT_GETFPREGS (fpreg structure)");
8628 snprintf (buff
, sizeof (buff
), _("PT_FIRSTMACH+%d"),
8629 e_type
- NT_NETBSDCORE_FIRSTMACH
);
8633 /* Note that by the ELF standard, the name field is already null byte
8634 terminated, and namesz includes the terminating null byte.
8635 I.E. the value of namesz for the name "FSF" is 4.
8637 If the value of namesz is zero, there is no name present. */
8639 process_note (Elf_Internal_Note
*pnote
)
8643 if (pnote
->namesz
== 0)
8644 /* If there is no note name, then use the default set of
8645 note type strings. */
8646 nt
= get_note_type (pnote
->type
);
8648 else if (strneq (pnote
->namedata
, "NetBSD-CORE", 11))
8649 /* NetBSD-specific core file notes. */
8650 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
8653 /* Don't recognize this note name; just use the default set of
8654 note type strings. */
8655 nt
= get_note_type (pnote
->type
);
8657 printf (" %s\t\t0x%08lx\t%s\n",
8658 pnote
->namesz
? pnote
->namedata
: "(NONE)",
8665 process_corefile_note_segment (FILE *file
, bfd_vma offset
, bfd_vma length
)
8667 Elf_External_Note
*pnotes
;
8668 Elf_External_Note
*external
;
8674 pnotes
= get_data (NULL
, file
, offset
, 1, length
, _("notes"));
8680 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
8681 (unsigned long) offset
, (unsigned long) length
);
8682 printf (_(" Owner\t\tData size\tDescription\n"));
8684 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
8686 Elf_External_Note
*next
;
8687 Elf_Internal_Note inote
;
8690 inote
.type
= BYTE_GET (external
->type
);
8691 inote
.namesz
= BYTE_GET (external
->namesz
);
8692 inote
.namedata
= external
->name
;
8693 inote
.descsz
= BYTE_GET (external
->descsz
);
8694 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
8695 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
8697 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
8699 if (((char *) next
) > (((char *) pnotes
) + length
))
8701 warn (_("corrupt note found at offset %lx into core notes\n"),
8702 (long)((char *)external
- (char *)pnotes
));
8703 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
8704 inote
.type
, inote
.namesz
, inote
.descsz
);
8710 /* Verify that name is null terminated. It appears that at least
8711 one version of Linux (RedHat 6.0) generates corefiles that don't
8712 comply with the ELF spec by failing to include the null byte in
8714 if (inote
.namedata
[inote
.namesz
] != '\0')
8716 temp
= malloc (inote
.namesz
+ 1);
8720 error (_("Out of memory\n"));
8725 strncpy (temp
, inote
.namedata
, inote
.namesz
);
8726 temp
[inote
.namesz
] = 0;
8728 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
8729 inote
.namedata
= temp
;
8732 res
&= process_note (& inote
);
8747 process_corefile_note_segments (FILE *file
)
8749 Elf_Internal_Phdr
*segment
;
8753 if (! get_program_headers (file
))
8756 for (i
= 0, segment
= program_headers
;
8757 i
< elf_header
.e_phnum
;
8760 if (segment
->p_type
== PT_NOTE
)
8761 res
&= process_corefile_note_segment (file
,
8762 (bfd_vma
) segment
->p_offset
,
8763 (bfd_vma
) segment
->p_filesz
);
8770 process_note_sections (FILE *file
)
8772 Elf_Internal_Shdr
*section
;
8776 for (i
= 0, section
= section_headers
;
8777 i
< elf_header
.e_shnum
;
8779 if (section
->sh_type
== SHT_NOTE
)
8780 res
&= process_corefile_note_segment (file
,
8781 (bfd_vma
) section
->sh_offset
,
8782 (bfd_vma
) section
->sh_size
);
8788 process_notes (FILE *file
)
8790 /* If we have not been asked to display the notes then do nothing. */
8794 if (elf_header
.e_type
!= ET_CORE
)
8795 return process_note_sections (file
);
8797 /* No program headers means no NOTE segment. */
8798 if (elf_header
.e_phnum
> 0)
8799 return process_corefile_note_segments (file
);
8801 printf (_("No note segments present in the core file.\n"));
8806 process_arch_specific (FILE *file
)
8811 switch (elf_header
.e_machine
)
8814 return process_arm_specific (file
);
8816 case EM_MIPS_RS3_LE
:
8817 return process_mips_specific (file
);
8826 get_file_header (FILE *file
)
8828 /* Read in the identity array. */
8829 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
8832 /* Determine how to read the rest of the header. */
8833 switch (elf_header
.e_ident
[EI_DATA
])
8835 default: /* fall through */
8836 case ELFDATANONE
: /* fall through */
8838 byte_get
= byte_get_little_endian
;
8839 byte_put
= byte_put_little_endian
;
8842 byte_get
= byte_get_big_endian
;
8843 byte_put
= byte_put_big_endian
;
8847 /* For now we only support 32 bit and 64 bit ELF files. */
8848 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
8850 /* Read in the rest of the header. */
8853 Elf32_External_Ehdr ehdr32
;
8855 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
8858 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
8859 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
8860 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
8861 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
8862 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
8863 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
8864 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
8865 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
8866 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
8867 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
8868 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
8869 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
8870 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
8874 Elf64_External_Ehdr ehdr64
;
8876 /* If we have been compiled with sizeof (bfd_vma) == 4, then
8877 we will not be able to cope with the 64bit data found in
8878 64 ELF files. Detect this now and abort before we start
8879 overwriting things. */
8880 if (sizeof (bfd_vma
) < 8)
8882 error (_("This instance of readelf has been built without support for a\n\
8883 64 bit data type and so it cannot read 64 bit ELF files.\n"));
8887 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
8890 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
8891 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
8892 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
8893 elf_header
.e_entry
= BYTE_GET (ehdr64
.e_entry
);
8894 elf_header
.e_phoff
= BYTE_GET (ehdr64
.e_phoff
);
8895 elf_header
.e_shoff
= BYTE_GET (ehdr64
.e_shoff
);
8896 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
8897 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
8898 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
8899 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
8900 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
8901 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
8902 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
8905 if (elf_header
.e_shoff
)
8907 /* There may be some extensions in the first section header. Don't
8908 bomb if we can't read it. */
8910 get_32bit_section_headers (file
, 1);
8912 get_64bit_section_headers (file
, 1);
8915 is_relocatable
= elf_header
.e_type
== ET_REL
;
8920 /* Process one ELF object file according to the command line options.
8921 This file may actually be stored in an archive. The file is
8922 positioned at the start of the ELF object. */
8925 process_object (char *file_name
, FILE *file
)
8929 if (! get_file_header (file
))
8931 error (_("%s: Failed to read file header\n"), file_name
);
8935 /* Initialise per file variables. */
8936 for (i
= NUM_ELEM (version_info
); i
--;)
8937 version_info
[i
] = 0;
8939 for (i
= NUM_ELEM (dynamic_info
); i
--;)
8940 dynamic_info
[i
] = 0;
8942 /* Process the file. */
8944 printf (_("\nFile: %s\n"), file_name
);
8946 /* Initialise the dump_sects array from the cmdline_dump_sects array.
8947 Note we do this even if cmdline_dump_sects is empty because we
8948 must make sure that the dump_sets array is zeroed out before each
8949 object file is processed. */
8950 if (num_dump_sects
> num_cmdline_dump_sects
)
8951 memset (dump_sects
, 0, num_dump_sects
);
8953 if (num_cmdline_dump_sects
> 0)
8955 if (num_dump_sects
== 0)
8956 /* A sneaky way of allocating the dump_sects array. */
8957 request_dump (num_cmdline_dump_sects
, 0);
8959 assert (num_dump_sects
>= num_cmdline_dump_sects
);
8960 memcpy (dump_sects
, cmdline_dump_sects
, num_cmdline_dump_sects
);
8963 if (! process_file_header ())
8966 if (! process_section_headers (file
))
8968 /* Without loaded section headers we cannot process lots of
8970 do_unwind
= do_version
= do_dump
= do_arch
= 0;
8972 if (! do_using_dynamic
)
8973 do_syms
= do_reloc
= 0;
8976 if (! process_section_groups (file
))
8978 /* Without loaded section groups we cannot process unwind. */
8982 if (process_program_headers (file
))
8983 process_dynamic_section (file
);
8985 process_relocs (file
);
8987 process_unwind (file
);
8989 process_symbol_table (file
);
8991 process_syminfo (file
);
8993 process_version_sections (file
);
8995 process_section_contents (file
);
8997 process_notes (file
);
8999 process_gnu_liblist (file
);
9001 process_arch_specific (file
);
9003 if (program_headers
)
9005 free (program_headers
);
9006 program_headers
= NULL
;
9009 if (section_headers
)
9011 free (section_headers
);
9012 section_headers
= NULL
;
9017 free (string_table
);
9018 string_table
= NULL
;
9019 string_table_length
= 0;
9022 if (dynamic_strings
)
9024 free (dynamic_strings
);
9025 dynamic_strings
= NULL
;
9026 dynamic_strings_length
= 0;
9029 if (dynamic_symbols
)
9031 free (dynamic_symbols
);
9032 dynamic_symbols
= NULL
;
9033 num_dynamic_syms
= 0;
9036 if (dynamic_syminfo
)
9038 free (dynamic_syminfo
);
9039 dynamic_syminfo
= NULL
;
9042 if (section_headers_groups
)
9044 free (section_headers_groups
);
9045 section_headers_groups
= NULL
;
9050 struct group_list
*g
, *next
;
9052 for (i
= 0; i
< group_count
; i
++)
9054 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
9061 free (section_groups
);
9062 section_groups
= NULL
;
9065 free_debug_memory ();
9070 /* Process an ELF archive. The file is positioned just after the
9074 process_archive (char *file_name
, FILE *file
)
9076 struct ar_hdr arhdr
;
9079 char *longnames
= NULL
;
9080 unsigned long longnames_size
= 0;
9081 size_t file_name_size
;
9086 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
9087 if (got
!= sizeof arhdr
)
9092 error (_("%s: failed to read archive header\n"), file_name
);
9096 if (memcmp (arhdr
.ar_name
, "/ ", 16) == 0)
9098 /* This is the archive symbol table. Skip it.
9099 FIXME: We should have an option to dump it. */
9100 size
= strtoul (arhdr
.ar_size
, NULL
, 10);
9101 if (fseek (file
, size
+ (size
& 1), SEEK_CUR
) != 0)
9103 error (_("%s: failed to skip archive symbol table\n"), file_name
);
9107 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
9108 if (got
!= sizeof arhdr
)
9113 error (_("%s: failed to read archive header\n"), file_name
);
9118 if (memcmp (arhdr
.ar_name
, "// ", 16) == 0)
9120 /* This is the archive string table holding long member
9123 longnames_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
9125 longnames
= malloc (longnames_size
);
9126 if (longnames
== NULL
)
9128 error (_("Out of memory\n"));
9132 if (fread (longnames
, longnames_size
, 1, file
) != 1)
9135 error (_("%s: failed to read string table\n"), file_name
);
9139 if ((longnames_size
& 1) != 0)
9142 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
9143 if (got
!= sizeof arhdr
)
9150 error (_("%s: failed to read archive header\n"), file_name
);
9155 file_name_size
= strlen (file_name
);
9164 if (arhdr
.ar_name
[0] == '/')
9168 off
= strtoul (arhdr
.ar_name
+ 1, NULL
, 10);
9169 if (off
>= longnames_size
)
9171 error (_("%s: invalid archive string table offset %lu\n"), file_name
, off
);
9176 name
= longnames
+ off
;
9177 nameend
= memchr (name
, '/', longnames_size
- off
);
9181 name
= arhdr
.ar_name
;
9182 nameend
= memchr (name
, '/', 16);
9185 if (nameend
== NULL
)
9187 error (_("%s: bad archive file name\n"), file_name
);
9192 namealc
= malloc (file_name_size
+ (nameend
- name
) + 3);
9193 if (namealc
== NULL
)
9195 error (_("Out of memory\n"));
9200 memcpy (namealc
, file_name
, file_name_size
);
9201 namealc
[file_name_size
] = '(';
9202 memcpy (namealc
+ file_name_size
+ 1, name
, nameend
- name
);
9203 namealc
[file_name_size
+ 1 + (nameend
- name
)] = ')';
9204 namealc
[file_name_size
+ 2 + (nameend
- name
)] = '\0';
9206 archive_file_offset
= ftell (file
);
9207 archive_file_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
9209 ret
|= process_object (namealc
, file
);
9214 (archive_file_offset
9216 + (archive_file_size
& 1)),
9219 error (_("%s: failed to seek to next archive header\n"), file_name
);
9224 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
9225 if (got
!= sizeof arhdr
)
9230 error (_("%s: failed to read archive header\n"), file_name
);
9243 process_file (char *file_name
)
9246 struct stat statbuf
;
9250 if (stat (file_name
, &statbuf
) < 0)
9252 if (errno
== ENOENT
)
9253 error (_("'%s': No such file\n"), file_name
);
9255 error (_("Could not locate '%s'. System error message: %s\n"),
9256 file_name
, strerror (errno
));
9260 if (! S_ISREG (statbuf
.st_mode
))
9262 error (_("'%s' is not an ordinary file\n"), file_name
);
9266 file
= fopen (file_name
, "rb");
9269 error (_("Input file '%s' is not readable.\n"), file_name
);
9273 if (fread (armag
, SARMAG
, 1, file
) != 1)
9275 error (_("%s: Failed to read file header\n"), file_name
);
9280 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
9281 ret
= process_archive (file_name
, file
);
9285 archive_file_size
= archive_file_offset
= 0;
9286 ret
= process_object (file_name
, file
);
9294 #ifdef SUPPORT_DISASSEMBLY
9295 /* Needed by the i386 disassembler. For extra credit, someone could
9296 fix this so that we insert symbolic addresses here, esp for GOT/PLT
9300 print_address (unsigned int addr
, FILE *outfile
)
9302 fprintf (outfile
,"0x%8.8x", addr
);
9305 /* Needed by the i386 disassembler. */
9307 db_task_printsym (unsigned int addr
)
9309 print_address (addr
, stderr
);
9314 main (int argc
, char **argv
)
9318 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9319 setlocale (LC_MESSAGES
, "");
9321 #if defined (HAVE_SETLOCALE)
9322 setlocale (LC_CTYPE
, "");
9324 bindtextdomain (PACKAGE
, LOCALEDIR
);
9325 textdomain (PACKAGE
);
9327 expandargv (&argc
, &argv
);
9329 parse_args (argc
, argv
);
9331 if (num_dump_sects
> 0)
9333 /* Make a copy of the dump_sects array. */
9334 cmdline_dump_sects
= malloc (num_dump_sects
);
9335 if (cmdline_dump_sects
== NULL
)
9336 error (_("Out of memory allocating dump request table."));
9339 memcpy (cmdline_dump_sects
, dump_sects
, num_dump_sects
);
9340 num_cmdline_dump_sects
= num_dump_sects
;
9344 if (optind
< (argc
- 1))
9348 while (optind
< argc
)
9349 err
|= process_file (argv
[optind
++]);
9351 if (dump_sects
!= NULL
)
9353 if (cmdline_dump_sects
!= NULL
)
9354 free (cmdline_dump_sects
);