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");
1953 switch (e_flags
& EF_M68K_ISA_MASK
)
1958 case EF_M68K_ISA_A_PLUS
:
1965 strcat (buf
, ", cf, isa ");
1967 if (e_flags
& EF_M68K_HW_DIV
)
1968 strcat (buf
, ", hwdiv");
1969 switch (e_flags
& EF_M68K_MAC_MASK
)
1986 if (e_flags
& EF_M68K_USP
)
1987 strcat (buf
, ", usp");
1988 if (e_flags
& EF_M68K_FLOAT
)
1989 strcat (buf
, ", float");
1994 if (e_flags
& EF_PPC_EMB
)
1995 strcat (buf
, ", emb");
1997 if (e_flags
& EF_PPC_RELOCATABLE
)
1998 strcat (buf
, ", relocatable");
2000 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
2001 strcat (buf
, ", relocatable-lib");
2005 case EM_CYGNUS_V850
:
2006 switch (e_flags
& EF_V850_ARCH
)
2009 strcat (buf
, ", v850e1");
2012 strcat (buf
, ", v850e");
2015 strcat (buf
, ", v850");
2018 strcat (buf
, ", unknown v850 architecture variant");
2024 case EM_CYGNUS_M32R
:
2025 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
2026 strcat (buf
, ", m32r");
2031 case EM_MIPS_RS3_LE
:
2032 if (e_flags
& EF_MIPS_NOREORDER
)
2033 strcat (buf
, ", noreorder");
2035 if (e_flags
& EF_MIPS_PIC
)
2036 strcat (buf
, ", pic");
2038 if (e_flags
& EF_MIPS_CPIC
)
2039 strcat (buf
, ", cpic");
2041 if (e_flags
& EF_MIPS_UCODE
)
2042 strcat (buf
, ", ugen_reserved");
2044 if (e_flags
& EF_MIPS_ABI2
)
2045 strcat (buf
, ", abi2");
2047 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
2048 strcat (buf
, ", odk first");
2050 if (e_flags
& EF_MIPS_32BITMODE
)
2051 strcat (buf
, ", 32bitmode");
2053 switch ((e_flags
& EF_MIPS_MACH
))
2055 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
2056 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
2057 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
2058 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
2059 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
2060 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
2061 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
2062 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
2063 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
2064 case E_MIPS_MACH_9000
: strcat (buf
, ", 9000"); break;
2066 /* We simply ignore the field in this case to avoid confusion:
2067 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2070 default: strcat (buf
, ", unknown CPU"); break;
2073 switch ((e_flags
& EF_MIPS_ABI
))
2075 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
2076 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
2077 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
2078 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
2080 /* We simply ignore the field in this case to avoid confusion:
2081 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2082 This means it is likely to be an o32 file, but not for
2085 default: strcat (buf
, ", unknown ABI"); break;
2088 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
2089 strcat (buf
, ", mdmx");
2091 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
2092 strcat (buf
, ", mips16");
2094 switch ((e_flags
& EF_MIPS_ARCH
))
2096 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
2097 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
2098 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
2099 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
2100 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
2101 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
2102 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
2103 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
2104 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
2105 default: strcat (buf
, ", unknown ISA"); break;
2111 switch ((e_flags
& EF_SH_MACH_MASK
))
2113 case EF_SH1
: strcat (buf
, ", sh1"); break;
2114 case EF_SH2
: strcat (buf
, ", sh2"); break;
2115 case EF_SH3
: strcat (buf
, ", sh3"); break;
2116 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
2117 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
2118 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
2119 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
2120 case EF_SH4
: strcat (buf
, ", sh4"); break;
2121 case EF_SH5
: strcat (buf
, ", sh5"); break;
2122 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
2123 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
2124 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
2125 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
2126 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
2127 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
2128 case EF_SH3_NOMMU
: strcat (buf
, ", sh3-nommu"); break;
2129 case EF_SH4_NOMMU_NOFPU
: strcat (buf
, ", sh4-nommu-nofpu"); break;
2130 case EF_SH2A_SH4_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2131 case EF_SH2A_SH3_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh3-nommu"); break;
2132 case EF_SH2A_SH4
: strcat (buf
, ", sh2a-or-sh4"); break;
2133 case EF_SH2A_SH3E
: strcat (buf
, ", sh2a-or-sh3e"); break;
2134 default: strcat (buf
, ", unknown ISA"); break;
2140 if (e_flags
& EF_SPARC_32PLUS
)
2141 strcat (buf
, ", v8+");
2143 if (e_flags
& EF_SPARC_SUN_US1
)
2144 strcat (buf
, ", ultrasparcI");
2146 if (e_flags
& EF_SPARC_SUN_US3
)
2147 strcat (buf
, ", ultrasparcIII");
2149 if (e_flags
& EF_SPARC_HAL_R1
)
2150 strcat (buf
, ", halr1");
2152 if (e_flags
& EF_SPARC_LEDATA
)
2153 strcat (buf
, ", ledata");
2155 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2156 strcat (buf
, ", tso");
2158 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2159 strcat (buf
, ", pso");
2161 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2162 strcat (buf
, ", rmo");
2166 switch (e_flags
& EF_PARISC_ARCH
)
2168 case EFA_PARISC_1_0
:
2169 strcpy (buf
, ", PA-RISC 1.0");
2171 case EFA_PARISC_1_1
:
2172 strcpy (buf
, ", PA-RISC 1.1");
2174 case EFA_PARISC_2_0
:
2175 strcpy (buf
, ", PA-RISC 2.0");
2180 if (e_flags
& EF_PARISC_TRAPNIL
)
2181 strcat (buf
, ", trapnil");
2182 if (e_flags
& EF_PARISC_EXT
)
2183 strcat (buf
, ", ext");
2184 if (e_flags
& EF_PARISC_LSB
)
2185 strcat (buf
, ", lsb");
2186 if (e_flags
& EF_PARISC_WIDE
)
2187 strcat (buf
, ", wide");
2188 if (e_flags
& EF_PARISC_NO_KABP
)
2189 strcat (buf
, ", no kabp");
2190 if (e_flags
& EF_PARISC_LAZYSWAP
)
2191 strcat (buf
, ", lazyswap");
2196 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2197 strcat (buf
, ", new calling convention");
2199 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2200 strcat (buf
, ", gnu calling convention");
2204 if ((e_flags
& EF_IA_64_ABI64
))
2205 strcat (buf
, ", 64-bit");
2207 strcat (buf
, ", 32-bit");
2208 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2209 strcat (buf
, ", reduced fp model");
2210 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2211 strcat (buf
, ", no function descriptors, constant gp");
2212 else if ((e_flags
& EF_IA_64_CONS_GP
))
2213 strcat (buf
, ", constant gp");
2214 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2215 strcat (buf
, ", absolute");
2219 if ((e_flags
& EF_VAX_NONPIC
))
2220 strcat (buf
, ", non-PIC");
2221 if ((e_flags
& EF_VAX_DFLOAT
))
2222 strcat (buf
, ", D-Float");
2223 if ((e_flags
& EF_VAX_GFLOAT
))
2224 strcat (buf
, ", G-Float");
2233 get_osabi_name (unsigned int osabi
)
2235 static char buff
[32];
2239 case ELFOSABI_NONE
: return "UNIX - System V";
2240 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2241 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2242 case ELFOSABI_LINUX
: return "UNIX - Linux";
2243 case ELFOSABI_HURD
: return "GNU/Hurd";
2244 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2245 case ELFOSABI_AIX
: return "UNIX - AIX";
2246 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2247 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2248 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2249 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2250 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2251 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2252 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2253 case ELFOSABI_AROS
: return "Amiga Research OS";
2254 case ELFOSABI_STANDALONE
: return _("Standalone App");
2255 case ELFOSABI_ARM
: return "ARM";
2257 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), osabi
);
2263 get_arm_segment_type (unsigned long type
)
2277 get_mips_segment_type (unsigned long type
)
2281 case PT_MIPS_REGINFO
:
2283 case PT_MIPS_RTPROC
:
2285 case PT_MIPS_OPTIONS
:
2295 get_parisc_segment_type (unsigned long type
)
2299 case PT_HP_TLS
: return "HP_TLS";
2300 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2301 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2302 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2303 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2304 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2305 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2306 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2307 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2308 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2309 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2310 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2311 case PT_HP_OPT_ANNOT
: return "HP_OPT_ANNOT";
2312 case PT_HP_HSL_ANNOT
: return "HP_HSL_ANNOT";
2313 case PT_HP_STACK
: return "HP_STACK";
2314 case PT_HP_CORE_UTSNAME
: return "HP_CORE_UTSNAME";
2315 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2316 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2317 case PT_PARISC_WEAKORDER
: return "PARISC_WEAKORDER";
2326 get_ia64_segment_type (unsigned long type
)
2330 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2331 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2332 case PT_HP_TLS
: return "HP_TLS";
2333 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2334 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2335 case PT_IA_64_HP_STACK
: return "HP_STACK";
2344 get_segment_type (unsigned long p_type
)
2346 static char buff
[32];
2350 case PT_NULL
: return "NULL";
2351 case PT_LOAD
: return "LOAD";
2352 case PT_DYNAMIC
: return "DYNAMIC";
2353 case PT_INTERP
: return "INTERP";
2354 case PT_NOTE
: return "NOTE";
2355 case PT_SHLIB
: return "SHLIB";
2356 case PT_PHDR
: return "PHDR";
2357 case PT_TLS
: return "TLS";
2359 case PT_GNU_EH_FRAME
:
2360 return "GNU_EH_FRAME";
2361 case PT_GNU_STACK
: return "GNU_STACK";
2362 case PT_GNU_RELRO
: return "GNU_RELRO";
2365 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2369 switch (elf_header
.e_machine
)
2372 result
= get_arm_segment_type (p_type
);
2375 case EM_MIPS_RS3_LE
:
2376 result
= get_mips_segment_type (p_type
);
2379 result
= get_parisc_segment_type (p_type
);
2382 result
= get_ia64_segment_type (p_type
);
2392 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2394 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2398 switch (elf_header
.e_machine
)
2401 result
= get_parisc_segment_type (p_type
);
2404 result
= get_ia64_segment_type (p_type
);
2414 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2417 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), p_type
);
2424 get_mips_section_type_name (unsigned int sh_type
)
2428 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2429 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2430 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2431 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2432 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2433 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2434 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2435 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2436 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2437 case SHT_MIPS_RELD
: return "MIPS_RELD";
2438 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2439 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2440 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2441 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2442 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2443 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2444 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2445 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2446 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2447 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2448 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2449 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2450 case SHT_MIPS_LINE
: return "MIPS_LINE";
2451 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2452 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2453 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2454 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2455 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2456 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2457 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2458 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2459 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2460 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2461 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2462 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2463 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2464 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2465 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2466 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2474 get_parisc_section_type_name (unsigned int sh_type
)
2478 case SHT_PARISC_EXT
: return "PARISC_EXT";
2479 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2480 case SHT_PARISC_DOC
: return "PARISC_DOC";
2481 case SHT_PARISC_ANNOT
: return "PARISC_ANNOT";
2482 case SHT_PARISC_SYMEXTN
: return "PARISC_SYMEXTN";
2483 case SHT_PARISC_STUBS
: return "PARISC_STUBS";
2484 case SHT_PARISC_DLKM
: return "PARISC_DLKM";
2492 get_ia64_section_type_name (unsigned int sh_type
)
2494 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2495 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2496 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2500 case SHT_IA_64_EXT
: return "IA_64_EXT";
2501 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2502 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2510 get_x86_64_section_type_name (unsigned int sh_type
)
2514 case SHT_X86_64_UNWIND
: return "X86_64_UNWIND";
2522 get_arm_section_type_name (unsigned int sh_type
)
2528 case SHT_ARM_PREEMPTMAP
:
2529 return "ARM_PREEMPTMAP";
2530 case SHT_ARM_ATTRIBUTES
:
2531 return "ARM_ATTRIBUTES";
2539 get_section_type_name (unsigned int sh_type
)
2541 static char buff
[32];
2545 case SHT_NULL
: return "NULL";
2546 case SHT_PROGBITS
: return "PROGBITS";
2547 case SHT_SYMTAB
: return "SYMTAB";
2548 case SHT_STRTAB
: return "STRTAB";
2549 case SHT_RELA
: return "RELA";
2550 case SHT_HASH
: return "HASH";
2551 case SHT_DYNAMIC
: return "DYNAMIC";
2552 case SHT_NOTE
: return "NOTE";
2553 case SHT_NOBITS
: return "NOBITS";
2554 case SHT_REL
: return "REL";
2555 case SHT_SHLIB
: return "SHLIB";
2556 case SHT_DYNSYM
: return "DYNSYM";
2557 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2558 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2559 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2560 case SHT_GROUP
: return "GROUP";
2561 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2562 case SHT_GNU_verdef
: return "VERDEF";
2563 case SHT_GNU_verneed
: return "VERNEED";
2564 case SHT_GNU_versym
: return "VERSYM";
2565 case 0x6ffffff0: return "VERSYM";
2566 case 0x6ffffffc: return "VERDEF";
2567 case 0x7ffffffd: return "AUXILIARY";
2568 case 0x7fffffff: return "FILTER";
2569 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2572 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2576 switch (elf_header
.e_machine
)
2579 case EM_MIPS_RS3_LE
:
2580 result
= get_mips_section_type_name (sh_type
);
2583 result
= get_parisc_section_type_name (sh_type
);
2586 result
= get_ia64_section_type_name (sh_type
);
2589 result
= get_x86_64_section_type_name (sh_type
);
2592 result
= get_arm_section_type_name (sh_type
);
2602 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2604 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2605 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2606 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2607 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2609 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), sh_type
);
2615 #define OPTION_DEBUG_DUMP 512
2617 static struct option options
[] =
2619 {"all", no_argument
, 0, 'a'},
2620 {"file-header", no_argument
, 0, 'h'},
2621 {"program-headers", no_argument
, 0, 'l'},
2622 {"headers", no_argument
, 0, 'e'},
2623 {"histogram", no_argument
, 0, 'I'},
2624 {"segments", no_argument
, 0, 'l'},
2625 {"sections", no_argument
, 0, 'S'},
2626 {"section-headers", no_argument
, 0, 'S'},
2627 {"section-groups", no_argument
, 0, 'g'},
2628 {"section-details", no_argument
, 0, 't'},
2629 {"full-section-name",no_argument
, 0, 'N'},
2630 {"symbols", no_argument
, 0, 's'},
2631 {"syms", no_argument
, 0, 's'},
2632 {"relocs", no_argument
, 0, 'r'},
2633 {"notes", no_argument
, 0, 'n'},
2634 {"dynamic", no_argument
, 0, 'd'},
2635 {"arch-specific", no_argument
, 0, 'A'},
2636 {"version-info", no_argument
, 0, 'V'},
2637 {"use-dynamic", no_argument
, 0, 'D'},
2638 {"hex-dump", required_argument
, 0, 'x'},
2639 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2640 {"unwind", no_argument
, 0, 'u'},
2641 #ifdef SUPPORT_DISASSEMBLY
2642 {"instruction-dump", required_argument
, 0, 'i'},
2645 {"version", no_argument
, 0, 'v'},
2646 {"wide", no_argument
, 0, 'W'},
2647 {"help", no_argument
, 0, 'H'},
2648 {0, no_argument
, 0, 0}
2654 fprintf (stdout
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2655 fprintf (stdout
, _(" Display information about the contents of ELF format files\n"));
2656 fprintf (stdout
, _(" Options are:\n\
2657 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2658 -h --file-header Display the ELF file header\n\
2659 -l --program-headers Display the program headers\n\
2660 --segments An alias for --program-headers\n\
2661 -S --section-headers Display the sections' header\n\
2662 --sections An alias for --section-headers\n\
2663 -g --section-groups Display the section groups\n\
2664 -t --section-details Display the section details\n\
2665 -e --headers Equivalent to: -h -l -S\n\
2666 -s --syms Display the symbol table\n\
2667 --symbols An alias for --syms\n\
2668 -n --notes Display the core notes (if present)\n\
2669 -r --relocs Display the relocations (if present)\n\
2670 -u --unwind Display the unwind info (if present)\n\
2671 -d --dynamic Display the dynamic section (if present)\n\
2672 -V --version-info Display the version sections (if present)\n\
2673 -A --arch-specific Display architecture specific information (if any).\n\
2674 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2675 -x --hex-dump=<number> Dump the contents of section <number>\n\
2676 -w[liaprmfFsoR] or\n\
2677 --debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]\n\
2678 Display the contents of DWARF2 debug sections\n"));
2679 #ifdef SUPPORT_DISASSEMBLY
2680 fprintf (stdout
, _("\
2681 -i --instruction-dump=<number>\n\
2682 Disassemble the contents of section <number>\n"));
2684 fprintf (stdout
, _("\
2685 -I --histogram Display histogram of bucket list lengths\n\
2686 -W --wide Allow output width to exceed 80 characters\n\
2687 @<file> Read options from <file>\n\
2688 -H --help Display this information\n\
2689 -v --version Display the version number of readelf\n"));
2690 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2695 /* Record the fact that the user wants the contents of section number
2696 SECTION to be displayed using the method(s) encoded as flags bits
2697 in TYPE. Note, TYPE can be zero if we are creating the array for
2701 request_dump (unsigned int section
, int type
)
2703 if (section
>= num_dump_sects
)
2705 char *new_dump_sects
;
2707 new_dump_sects
= calloc (section
+ 1, 1);
2709 if (new_dump_sects
== NULL
)
2710 error (_("Out of memory allocating dump request table."));
2713 /* Copy current flag settings. */
2714 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2718 dump_sects
= new_dump_sects
;
2719 num_dump_sects
= section
+ 1;
2724 dump_sects
[section
] |= type
;
2729 /* Request a dump by section name. */
2732 request_dump_byname (const char *section
, int type
)
2734 struct dump_list_entry
*new_request
;
2736 new_request
= malloc (sizeof (struct dump_list_entry
));
2738 error (_("Out of memory allocating dump request table."));
2740 new_request
->name
= strdup (section
);
2741 if (!new_request
->name
)
2742 error (_("Out of memory allocating dump request table."));
2744 new_request
->type
= type
;
2746 new_request
->next
= dump_sects_byname
;
2747 dump_sects_byname
= new_request
;
2751 parse_args (int argc
, char **argv
)
2758 while ((c
= getopt_long
2759 (argc
, argv
, "ersuahnldSDAINtgw::x:i:vVWH", options
, NULL
)) != EOF
)
2780 do_section_groups
++;
2788 do_section_groups
++;
2793 do_section_details
++;
2835 section
= strtoul (optarg
, & cp
, 0);
2836 if (! *cp
&& section
>= 0)
2837 request_dump (section
, HEX_DUMP
);
2839 request_dump_byname (optarg
, HEX_DUMP
);
2847 unsigned int index
= 0;
2851 while (optarg
[index
])
2852 switch (optarg
[index
++])
2861 do_debug_abbrevs
= 1;
2871 do_debug_pubnames
= 1;
2875 do_debug_aranges
= 1;
2879 do_debug_ranges
= 1;
2883 do_debug_frames_interp
= 1;
2885 do_debug_frames
= 1;
2890 do_debug_macinfo
= 1;
2904 warn (_("Unrecognized debug option '%s'\n"), optarg
);
2909 case OPTION_DEBUG_DUMP
:
2917 const char * option
;
2920 debug_dump_long_opts
;
2922 debug_dump_long_opts opts_table
[] =
2924 /* Please keep this table alpha- sorted. */
2925 { "Ranges", & do_debug_ranges
},
2926 { "abbrev", & do_debug_abbrevs
},
2927 { "aranges", & do_debug_aranges
},
2928 { "frames", & do_debug_frames
},
2929 { "frames-interp", & do_debug_frames_interp
},
2930 { "info", & do_debug_info
},
2931 { "line", & do_debug_lines
},
2932 { "loc", & do_debug_loc
},
2933 { "macro", & do_debug_macinfo
},
2934 { "pubnames", & do_debug_pubnames
},
2935 /* This entry is for compatability
2936 with earlier versions of readelf. */
2937 { "ranges", & do_debug_aranges
},
2938 { "str", & do_debug_str
},
2949 debug_dump_long_opts
* entry
;
2951 for (entry
= opts_table
; entry
->option
; entry
++)
2953 size_t len
= strlen (entry
->option
);
2955 if (strneq (p
, entry
->option
, len
)
2956 && (p
[len
] == ',' || p
[len
] == '\0'))
2958 * entry
->variable
= 1;
2960 /* The --debug-dump=frames-interp option also
2961 enables the --debug-dump=frames option. */
2962 if (do_debug_frames_interp
)
2963 do_debug_frames
= 1;
2970 if (entry
->option
== NULL
)
2972 warn (_("Unrecognized debug option '%s'\n"), p
);
2973 p
= strchr (p
, ',');
2983 #ifdef SUPPORT_DISASSEMBLY
2986 section
= strtoul (optarg
, & cp
, 0);
2987 if (! *cp
&& section
>= 0)
2989 request_dump (section
, DISASS_DUMP
);
2995 print_version (program_name
);
3004 #ifdef SUPPORT_DISASSEMBLY
3007 /* xgettext:c-format */
3008 error (_("Invalid option '-%c'\n"), c
);
3015 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
3016 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
3017 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
3018 && !do_section_groups
)
3022 warn (_("Nothing to do.\n"));
3028 get_elf_class (unsigned int elf_class
)
3030 static char buff
[32];
3034 case ELFCLASSNONE
: return _("none");
3035 case ELFCLASS32
: return "ELF32";
3036 case ELFCLASS64
: return "ELF64";
3038 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), elf_class
);
3044 get_data_encoding (unsigned int encoding
)
3046 static char buff
[32];
3050 case ELFDATANONE
: return _("none");
3051 case ELFDATA2LSB
: return _("2's complement, little endian");
3052 case ELFDATA2MSB
: return _("2's complement, big endian");
3054 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), encoding
);
3059 /* Decode the data held in 'elf_header'. */
3062 process_file_header (void)
3064 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
3065 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
3066 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
3067 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
3070 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3078 printf (_("ELF Header:\n"));
3079 printf (_(" Magic: "));
3080 for (i
= 0; i
< EI_NIDENT
; i
++)
3081 printf ("%2.2x ", elf_header
.e_ident
[i
]);
3083 printf (_(" Class: %s\n"),
3084 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
3085 printf (_(" Data: %s\n"),
3086 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
3087 printf (_(" Version: %d %s\n"),
3088 elf_header
.e_ident
[EI_VERSION
],
3089 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
3091 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
3094 printf (_(" OS/ABI: %s\n"),
3095 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
3096 printf (_(" ABI Version: %d\n"),
3097 elf_header
.e_ident
[EI_ABIVERSION
]);
3098 printf (_(" Type: %s\n"),
3099 get_file_type (elf_header
.e_type
));
3100 printf (_(" Machine: %s\n"),
3101 get_machine_name (elf_header
.e_machine
));
3102 printf (_(" Version: 0x%lx\n"),
3103 (unsigned long) elf_header
.e_version
);
3105 printf (_(" Entry point address: "));
3106 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3107 printf (_("\n Start of program headers: "));
3108 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3109 printf (_(" (bytes into file)\n Start of section headers: "));
3110 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
3111 printf (_(" (bytes into file)\n"));
3113 printf (_(" Flags: 0x%lx%s\n"),
3114 (unsigned long) elf_header
.e_flags
,
3115 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
3116 printf (_(" Size of this header: %ld (bytes)\n"),
3117 (long) elf_header
.e_ehsize
);
3118 printf (_(" Size of program headers: %ld (bytes)\n"),
3119 (long) elf_header
.e_phentsize
);
3120 printf (_(" Number of program headers: %ld\n"),
3121 (long) elf_header
.e_phnum
);
3122 printf (_(" Size of section headers: %ld (bytes)\n"),
3123 (long) elf_header
.e_shentsize
);
3124 printf (_(" Number of section headers: %ld"),
3125 (long) elf_header
.e_shnum
);
3126 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
3127 printf (" (%ld)", (long) section_headers
[0].sh_size
);
3128 putc ('\n', stdout
);
3129 printf (_(" Section header string table index: %ld"),
3130 (long) elf_header
.e_shstrndx
);
3131 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
3132 printf (" (%ld)", (long) section_headers
[0].sh_link
);
3133 putc ('\n', stdout
);
3136 if (section_headers
!= NULL
)
3138 if (elf_header
.e_shnum
== 0)
3139 elf_header
.e_shnum
= section_headers
[0].sh_size
;
3140 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
3141 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
3142 free (section_headers
);
3143 section_headers
= NULL
;
3151 get_32bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3153 Elf32_External_Phdr
*phdrs
;
3154 Elf32_External_Phdr
*external
;
3155 Elf_Internal_Phdr
*internal
;
3158 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3159 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3160 _("program headers"));
3164 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3165 i
< elf_header
.e_phnum
;
3166 i
++, internal
++, external
++)
3168 internal
->p_type
= BYTE_GET (external
->p_type
);
3169 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3170 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3171 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3172 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3173 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3174 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3175 internal
->p_align
= BYTE_GET (external
->p_align
);
3184 get_64bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3186 Elf64_External_Phdr
*phdrs
;
3187 Elf64_External_Phdr
*external
;
3188 Elf_Internal_Phdr
*internal
;
3191 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3192 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3193 _("program headers"));
3197 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3198 i
< elf_header
.e_phnum
;
3199 i
++, internal
++, external
++)
3201 internal
->p_type
= BYTE_GET (external
->p_type
);
3202 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3203 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3204 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3205 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3206 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3207 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3208 internal
->p_align
= BYTE_GET (external
->p_align
);
3216 /* Returns 1 if the program headers were read into `program_headers'. */
3219 get_program_headers (FILE *file
)
3221 Elf_Internal_Phdr
*phdrs
;
3223 /* Check cache of prior read. */
3224 if (program_headers
!= NULL
)
3227 phdrs
= cmalloc (elf_header
.e_phnum
, sizeof (Elf_Internal_Phdr
));
3231 error (_("Out of memory\n"));
3236 ? get_32bit_program_headers (file
, phdrs
)
3237 : get_64bit_program_headers (file
, phdrs
))
3239 program_headers
= phdrs
;
3247 /* Returns 1 if the program headers were loaded. */
3250 process_program_headers (FILE *file
)
3252 Elf_Internal_Phdr
*segment
;
3255 if (elf_header
.e_phnum
== 0)
3258 printf (_("\nThere are no program headers in this file.\n"));
3262 if (do_segments
&& !do_header
)
3264 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3265 printf (_("Entry point "));
3266 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3267 printf (_("\nThere are %d program headers, starting at offset "),
3268 elf_header
.e_phnum
);
3269 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3273 if (! get_program_headers (file
))
3278 if (elf_header
.e_phnum
> 1)
3279 printf (_("\nProgram Headers:\n"));
3281 printf (_("\nProgram Headers:\n"));
3285 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3288 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3292 (_(" Type Offset VirtAddr PhysAddr\n"));
3294 (_(" FileSiz MemSiz Flags Align\n"));
3301 for (i
= 0, segment
= program_headers
;
3302 i
< elf_header
.e_phnum
;
3307 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3311 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3312 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3313 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3314 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3315 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3317 (segment
->p_flags
& PF_R
? 'R' : ' '),
3318 (segment
->p_flags
& PF_W
? 'W' : ' '),
3319 (segment
->p_flags
& PF_X
? 'E' : ' '));
3320 printf ("%#lx", (unsigned long) segment
->p_align
);
3324 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3325 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3328 print_vma (segment
->p_offset
, FULL_HEX
);
3332 print_vma (segment
->p_vaddr
, FULL_HEX
);
3334 print_vma (segment
->p_paddr
, FULL_HEX
);
3337 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3338 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3341 print_vma (segment
->p_filesz
, FULL_HEX
);
3345 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3346 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3349 print_vma (segment
->p_offset
, FULL_HEX
);
3353 (segment
->p_flags
& PF_R
? 'R' : ' '),
3354 (segment
->p_flags
& PF_W
? 'W' : ' '),
3355 (segment
->p_flags
& PF_X
? 'E' : ' '));
3357 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3358 printf ("%#lx", (unsigned long) segment
->p_align
);
3361 print_vma (segment
->p_align
, PREFIX_HEX
);
3366 print_vma (segment
->p_offset
, FULL_HEX
);
3368 print_vma (segment
->p_vaddr
, FULL_HEX
);
3370 print_vma (segment
->p_paddr
, FULL_HEX
);
3372 print_vma (segment
->p_filesz
, FULL_HEX
);
3374 print_vma (segment
->p_memsz
, FULL_HEX
);
3376 (segment
->p_flags
& PF_R
? 'R' : ' '),
3377 (segment
->p_flags
& PF_W
? 'W' : ' '),
3378 (segment
->p_flags
& PF_X
? 'E' : ' '));
3379 print_vma (segment
->p_align
, HEX
);
3383 switch (segment
->p_type
)
3387 error (_("more than one dynamic segment\n"));
3389 /* Try to locate the .dynamic section. If there is
3390 a section header table, we can easily locate it. */
3391 if (section_headers
!= NULL
)
3393 Elf_Internal_Shdr
*sec
;
3395 sec
= find_section (".dynamic");
3396 if (sec
== NULL
|| sec
->sh_size
== 0)
3398 error (_("no .dynamic section in the dynamic segment"));
3402 dynamic_addr
= sec
->sh_offset
;
3403 dynamic_size
= sec
->sh_size
;
3405 if (dynamic_addr
< segment
->p_offset
3406 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
3407 warn (_("the .dynamic section is not contained within the dynamic segment"));
3408 else if (dynamic_addr
> segment
->p_offset
)
3409 warn (_("the .dynamic section is not the first section in the dynamic segment."));
3413 /* Otherwise, we can only assume that the .dynamic
3414 section is the first section in the DYNAMIC segment. */
3415 dynamic_addr
= segment
->p_offset
;
3416 dynamic_size
= segment
->p_filesz
;
3421 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3423 error (_("Unable to find program interpreter name\n"));
3426 program_interpreter
[0] = 0;
3427 fscanf (file
, "%63s", program_interpreter
);
3430 printf (_("\n [Requesting program interpreter: %s]"),
3431 program_interpreter
);
3437 putc ('\n', stdout
);
3440 if (do_segments
&& section_headers
!= NULL
&& string_table
!= NULL
)
3442 printf (_("\n Section to Segment mapping:\n"));
3443 printf (_(" Segment Sections...\n"));
3445 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3448 Elf_Internal_Shdr
*section
;
3450 segment
= program_headers
+ i
;
3451 section
= section_headers
;
3453 printf (" %2.2d ", i
);
3455 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3457 if (ELF_IS_SECTION_IN_SEGMENT_MEMORY(section
, segment
))
3458 printf ("%s ", SECTION_NAME (section
));
3469 /* Find the file offset corresponding to VMA by using the program headers. */
3472 offset_from_vma (FILE *file
, bfd_vma vma
, bfd_size_type size
)
3474 Elf_Internal_Phdr
*seg
;
3476 if (! get_program_headers (file
))
3478 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3482 for (seg
= program_headers
;
3483 seg
< program_headers
+ elf_header
.e_phnum
;
3486 if (seg
->p_type
!= PT_LOAD
)
3489 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3490 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3491 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3494 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3501 get_32bit_section_headers (FILE *file
, unsigned int num
)
3503 Elf32_External_Shdr
*shdrs
;
3504 Elf_Internal_Shdr
*internal
;
3507 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3508 elf_header
.e_shentsize
, num
, _("section headers"));
3512 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3514 if (section_headers
== NULL
)
3516 error (_("Out of memory\n"));
3520 for (i
= 0, internal
= section_headers
;
3524 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3525 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3526 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3527 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3528 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3529 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3530 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3531 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3532 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3533 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3542 get_64bit_section_headers (FILE *file
, unsigned int num
)
3544 Elf64_External_Shdr
*shdrs
;
3545 Elf_Internal_Shdr
*internal
;
3548 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3549 elf_header
.e_shentsize
, num
, _("section headers"));
3553 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3555 if (section_headers
== NULL
)
3557 error (_("Out of memory\n"));
3561 for (i
= 0, internal
= section_headers
;
3565 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3566 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3567 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3568 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3569 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3570 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3571 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3572 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3573 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3574 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3582 static Elf_Internal_Sym
*
3583 get_32bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3585 unsigned long number
;
3586 Elf32_External_Sym
*esyms
;
3587 Elf_External_Sym_Shndx
*shndx
;
3588 Elf_Internal_Sym
*isyms
;
3589 Elf_Internal_Sym
*psym
;
3592 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3598 if (symtab_shndx_hdr
!= NULL
3599 && (symtab_shndx_hdr
->sh_link
3600 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3602 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3603 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3611 number
= section
->sh_size
/ section
->sh_entsize
;
3612 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3616 error (_("Out of memory\n"));
3623 for (j
= 0, psym
= isyms
;
3627 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3628 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3629 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3630 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3631 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3633 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3634 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3635 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3645 static Elf_Internal_Sym
*
3646 get_64bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3648 unsigned long number
;
3649 Elf64_External_Sym
*esyms
;
3650 Elf_External_Sym_Shndx
*shndx
;
3651 Elf_Internal_Sym
*isyms
;
3652 Elf_Internal_Sym
*psym
;
3655 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3661 if (symtab_shndx_hdr
!= NULL
3662 && (symtab_shndx_hdr
->sh_link
3663 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3665 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3666 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3674 number
= section
->sh_size
/ section
->sh_entsize
;
3675 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3679 error (_("Out of memory\n"));
3686 for (j
= 0, psym
= isyms
;
3690 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3691 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3692 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3693 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3694 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3696 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3697 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3698 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3709 get_elf_section_flags (bfd_vma sh_flags
)
3711 static char buff
[1024];
3713 int field_size
= is_32bit_elf
? 8 : 16;
3714 int index
, size
= sizeof (buff
) - (field_size
+ 4 + 1);
3715 bfd_vma os_flags
= 0;
3716 bfd_vma proc_flags
= 0;
3717 bfd_vma unknown_flags
= 0;
3731 { "LINK ORDER", 10 },
3732 { "OS NONCONF", 10 },
3737 if (do_section_details
)
3739 sprintf (buff
, "[%*.*lx]: ",
3740 field_size
, field_size
, (unsigned long) sh_flags
);
3741 p
+= field_size
+ 4;
3748 flag
= sh_flags
& - sh_flags
;
3751 if (do_section_details
)
3755 case SHF_WRITE
: index
= 0; break;
3756 case SHF_ALLOC
: index
= 1; break;
3757 case SHF_EXECINSTR
: index
= 2; break;
3758 case SHF_MERGE
: index
= 3; break;
3759 case SHF_STRINGS
: index
= 4; break;
3760 case SHF_INFO_LINK
: index
= 5; break;
3761 case SHF_LINK_ORDER
: index
= 6; break;
3762 case SHF_OS_NONCONFORMING
: index
= 7; break;
3763 case SHF_GROUP
: index
= 8; break;
3764 case SHF_TLS
: index
= 9; break;
3773 if (p
!= buff
+ field_size
+ 4)
3775 if (size
< (10 + 2))
3782 size
-= flags
[index
].len
;
3783 p
= stpcpy (p
, flags
[index
].str
);
3785 else if (flag
& SHF_MASKOS
)
3787 else if (flag
& SHF_MASKPROC
)
3790 unknown_flags
|= flag
;
3796 case SHF_WRITE
: *p
= 'W'; break;
3797 case SHF_ALLOC
: *p
= 'A'; break;
3798 case SHF_EXECINSTR
: *p
= 'X'; break;
3799 case SHF_MERGE
: *p
= 'M'; break;
3800 case SHF_STRINGS
: *p
= 'S'; break;
3801 case SHF_INFO_LINK
: *p
= 'I'; break;
3802 case SHF_LINK_ORDER
: *p
= 'L'; break;
3803 case SHF_OS_NONCONFORMING
: *p
= 'O'; break;
3804 case SHF_GROUP
: *p
= 'G'; break;
3805 case SHF_TLS
: *p
= 'T'; break;
3808 if (elf_header
.e_machine
== EM_X86_64
3809 && flag
== SHF_X86_64_LARGE
)
3811 else if (flag
& SHF_MASKOS
)
3814 sh_flags
&= ~ SHF_MASKOS
;
3816 else if (flag
& SHF_MASKPROC
)
3819 sh_flags
&= ~ SHF_MASKPROC
;
3829 if (do_section_details
)
3833 size
-= 5 + field_size
;
3834 if (p
!= buff
+ field_size
+ 4)
3842 sprintf (p
, "OS (%*.*lx)", field_size
, field_size
,
3843 (unsigned long) os_flags
);
3844 p
+= 5 + field_size
;
3848 size
-= 7 + field_size
;
3849 if (p
!= buff
+ field_size
+ 4)
3857 sprintf (p
, "PROC (%*.*lx)", field_size
, field_size
,
3858 (unsigned long) proc_flags
);
3859 p
+= 7 + field_size
;
3863 size
-= 10 + field_size
;
3864 if (p
!= buff
+ field_size
+ 4)
3872 sprintf (p
, "UNKNOWN (%*.*lx)", field_size
, field_size
,
3873 (unsigned long) unknown_flags
);
3874 p
+= 10 + field_size
;
3883 process_section_headers (FILE *file
)
3885 Elf_Internal_Shdr
*section
;
3888 section_headers
= NULL
;
3890 if (elf_header
.e_shnum
== 0)
3893 printf (_("\nThere are no sections in this file.\n"));
3898 if (do_sections
&& !do_header
)
3899 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3900 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3904 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3907 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3910 /* Read in the string table, so that we have names to display. */
3911 if (SECTION_HEADER_INDEX (elf_header
.e_shstrndx
) < elf_header
.e_shnum
)
3913 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3915 if (section
->sh_size
!= 0)
3917 string_table
= get_data (NULL
, file
, section
->sh_offset
,
3918 1, section
->sh_size
, _("string table"));
3920 string_table_length
= string_table
!= NULL
? section
->sh_size
: 0;
3924 /* Scan the sections for the dynamic symbol table
3925 and dynamic string table and debug sections. */
3926 dynamic_symbols
= NULL
;
3927 dynamic_strings
= NULL
;
3928 dynamic_syminfo
= NULL
;
3929 symtab_shndx_hdr
= NULL
;
3931 eh_addr_size
= is_32bit_elf
? 4 : 8;
3932 switch (elf_header
.e_machine
)
3935 case EM_MIPS_RS3_LE
:
3936 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
3937 FDE addresses. However, the ABI also has a semi-official ILP32
3938 variant for which the normal FDE address size rules apply.
3940 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
3941 section, where XX is the size of longs in bits. Unfortunately,
3942 earlier compilers provided no way of distinguishing ILP32 objects
3943 from LP64 objects, so if there's any doubt, we should assume that
3944 the official LP64 form is being used. */
3945 if ((elf_header
.e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
3946 && find_section (".gcc_compiled_long32") == NULL
)
3951 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
3954 size_t expected_entsize \
3955 = is_32bit_elf ? size32 : size64; \
3956 if (section->sh_entsize != expected_entsize) \
3957 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
3958 i, (unsigned long int) section->sh_entsize, \
3959 (unsigned long int) expected_entsize); \
3960 section->sh_entsize = expected_entsize; \
3963 #define CHECK_ENTSIZE(section, i, type) \
3964 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
3965 sizeof (Elf64_External_##type))
3967 for (i
= 0, section
= section_headers
;
3968 i
< elf_header
.e_shnum
;
3971 char *name
= SECTION_NAME (section
);
3973 if (section
->sh_type
== SHT_DYNSYM
)
3975 if (dynamic_symbols
!= NULL
)
3977 error (_("File contains multiple dynamic symbol tables\n"));
3981 CHECK_ENTSIZE (section
, i
, Sym
);
3982 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3983 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3985 else if (section
->sh_type
== SHT_STRTAB
3986 && streq (name
, ".dynstr"))
3988 if (dynamic_strings
!= NULL
)
3990 error (_("File contains multiple dynamic string tables\n"));
3994 dynamic_strings
= get_data (NULL
, file
, section
->sh_offset
,
3995 1, section
->sh_size
, _("dynamic strings"));
3996 dynamic_strings_length
= section
->sh_size
;
3998 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
4000 if (symtab_shndx_hdr
!= NULL
)
4002 error (_("File contains multiple symtab shndx tables\n"));
4005 symtab_shndx_hdr
= section
;
4007 else if (section
->sh_type
== SHT_SYMTAB
)
4008 CHECK_ENTSIZE (section
, i
, Sym
);
4009 else if (section
->sh_type
== SHT_GROUP
)
4010 CHECK_ENTSIZE_VALUES (section
, i
, GRP_ENTRY_SIZE
, GRP_ENTRY_SIZE
);
4011 else if (section
->sh_type
== SHT_REL
)
4012 CHECK_ENTSIZE (section
, i
, Rel
);
4013 else if (section
->sh_type
== SHT_RELA
)
4014 CHECK_ENTSIZE (section
, i
, Rela
);
4015 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
4016 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
4017 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
4018 || do_debug_loc
|| do_debug_ranges
)
4019 && strneq (name
, ".debug_", 7))
4024 || (do_debug_info
&& streq (name
, "info"))
4025 || (do_debug_abbrevs
&& streq (name
, "abbrev"))
4026 || (do_debug_lines
&& streq (name
, "line"))
4027 || (do_debug_pubnames
&& streq (name
, "pubnames"))
4028 || (do_debug_aranges
&& streq (name
, "aranges"))
4029 || (do_debug_ranges
&& streq (name
, "ranges"))
4030 || (do_debug_frames
&& streq (name
, "frame"))
4031 || (do_debug_macinfo
&& streq (name
, "macinfo"))
4032 || (do_debug_str
&& streq (name
, "str"))
4033 || (do_debug_loc
&& streq (name
, "loc"))
4035 request_dump (i
, DEBUG_DUMP
);
4037 /* linkonce section to be combined with .debug_info at link time. */
4038 else if ((do_debugging
|| do_debug_info
)
4039 && strneq (name
, ".gnu.linkonce.wi.", 17))
4040 request_dump (i
, DEBUG_DUMP
);
4041 else if (do_debug_frames
&& streq (name
, ".eh_frame"))
4042 request_dump (i
, DEBUG_DUMP
);
4048 if (elf_header
.e_shnum
> 1)
4049 printf (_("\nSection Headers:\n"));
4051 printf (_("\nSection Header:\n"));
4055 if (do_section_details
)
4057 printf (_(" [Nr] Name\n"));
4058 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
4062 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4066 if (do_section_details
)
4068 printf (_(" [Nr] Name\n"));
4069 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
4073 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4077 if (do_section_details
)
4079 printf (_(" [Nr] Name\n"));
4080 printf (_(" Type Address Offset Link\n"));
4081 printf (_(" Size EntSize Info Align\n"));
4085 printf (_(" [Nr] Name Type Address Offset\n"));
4086 printf (_(" Size EntSize Flags Link Info Align\n"));
4090 if (do_section_details
)
4091 printf (_(" Flags\n"));
4093 for (i
= 0, section
= section_headers
;
4094 i
< elf_header
.e_shnum
;
4097 if (do_section_details
)
4099 printf (" [%2u] %s\n",
4100 SECTION_HEADER_NUM (i
),
4101 SECTION_NAME (section
));
4102 if (is_32bit_elf
|| do_wide
)
4103 printf (" %-15.15s ",
4104 get_section_type_name (section
->sh_type
));
4107 printf (" [%2u] %-17.17s %-15.15s ",
4108 SECTION_HEADER_NUM (i
),
4109 SECTION_NAME (section
),
4110 get_section_type_name (section
->sh_type
));
4114 print_vma (section
->sh_addr
, LONG_HEX
);
4116 printf ( " %6.6lx %6.6lx %2.2lx",
4117 (unsigned long) section
->sh_offset
,
4118 (unsigned long) section
->sh_size
,
4119 (unsigned long) section
->sh_entsize
);
4121 if (do_section_details
)
4122 fputs (" ", stdout
);
4124 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4126 printf ("%2ld %3lu %2ld\n",
4127 (unsigned long) section
->sh_link
,
4128 (unsigned long) section
->sh_info
,
4129 (unsigned long) section
->sh_addralign
);
4133 print_vma (section
->sh_addr
, LONG_HEX
);
4135 if ((long) section
->sh_offset
== section
->sh_offset
)
4136 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
4140 print_vma (section
->sh_offset
, LONG_HEX
);
4143 if ((unsigned long) section
->sh_size
== section
->sh_size
)
4144 printf (" %6.6lx", (unsigned long) section
->sh_size
);
4148 print_vma (section
->sh_size
, LONG_HEX
);
4151 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
4152 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
4156 print_vma (section
->sh_entsize
, LONG_HEX
);
4159 if (do_section_details
)
4160 fputs (" ", stdout
);
4162 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4164 printf ("%2ld %3lu ",
4165 (unsigned long) section
->sh_link
,
4166 (unsigned long) section
->sh_info
);
4168 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
4169 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
4172 print_vma (section
->sh_addralign
, DEC
);
4176 else if (do_section_details
)
4178 printf (" %-15.15s ",
4179 get_section_type_name (section
->sh_type
));
4180 print_vma (section
->sh_addr
, LONG_HEX
);
4181 if ((long) section
->sh_offset
== section
->sh_offset
)
4182 printf (" %16.16lx", (unsigned long) section
->sh_offset
);
4186 print_vma (section
->sh_offset
, LONG_HEX
);
4188 printf (" %ld\n ", (unsigned long) section
->sh_link
);
4189 print_vma (section
->sh_size
, LONG_HEX
);
4191 print_vma (section
->sh_entsize
, LONG_HEX
);
4193 printf (" %-16lu %ld\n",
4194 (unsigned long) section
->sh_info
,
4195 (unsigned long) section
->sh_addralign
);
4200 print_vma (section
->sh_addr
, LONG_HEX
);
4201 if ((long) section
->sh_offset
== section
->sh_offset
)
4202 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
4206 print_vma (section
->sh_offset
, LONG_HEX
);
4209 print_vma (section
->sh_size
, LONG_HEX
);
4211 print_vma (section
->sh_entsize
, LONG_HEX
);
4213 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4215 printf (" %2ld %3lu %ld\n",
4216 (unsigned long) section
->sh_link
,
4217 (unsigned long) section
->sh_info
,
4218 (unsigned long) section
->sh_addralign
);
4221 if (do_section_details
)
4222 printf (" %s\n", get_elf_section_flags (section
->sh_flags
));
4225 if (!do_section_details
)
4226 printf (_("Key to Flags:\n\
4227 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4228 I (info), L (link order), G (group), x (unknown)\n\
4229 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4235 get_group_flags (unsigned int flags
)
4237 static char buff
[32];
4244 snprintf (buff
, sizeof (buff
), _("[<unknown>: 0x%x]"), flags
);
4251 process_section_groups (FILE *file
)
4253 Elf_Internal_Shdr
*section
;
4255 struct group
*group
;
4256 Elf_Internal_Shdr
*symtab_sec
, *strtab_sec
;
4257 Elf_Internal_Sym
*symtab
;
4261 /* Don't process section groups unless needed. */
4262 if (!do_unwind
&& !do_section_groups
)
4265 if (elf_header
.e_shnum
== 0)
4267 if (do_section_groups
)
4268 printf (_("\nThere are no sections in this file.\n"));
4273 if (section_headers
== NULL
)
4275 error (_("Section headers are not available!\n"));
4279 section_headers_groups
= calloc (elf_header
.e_shnum
,
4280 sizeof (struct group
*));
4282 if (section_headers_groups
== NULL
)
4284 error (_("Out of memory\n"));
4288 /* Scan the sections for the group section. */
4290 for (i
= 0, section
= section_headers
;
4291 i
< elf_header
.e_shnum
;
4293 if (section
->sh_type
== SHT_GROUP
)
4296 if (group_count
== 0)
4298 if (do_section_groups
)
4299 printf (_("\nThere are no section groups in this file.\n"));
4304 section_groups
= calloc (group_count
, sizeof (struct group
));
4306 if (section_groups
== NULL
)
4308 error (_("Out of memory\n"));
4317 for (i
= 0, section
= section_headers
, group
= section_groups
;
4318 i
< elf_header
.e_shnum
;
4321 if (section
->sh_type
== SHT_GROUP
)
4323 char *name
= SECTION_NAME (section
);
4325 unsigned char *start
, *indices
;
4326 unsigned int entry
, j
, size
;
4327 Elf_Internal_Shdr
*sec
;
4328 Elf_Internal_Sym
*sym
;
4330 /* Get the symbol table. */
4331 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
4332 || ((sec
= SECTION_HEADER (section
->sh_link
))->sh_type
4335 error (_("Bad sh_link in group section `%s'\n"), name
);
4339 if (symtab_sec
!= sec
)
4344 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
);
4347 sym
= symtab
+ section
->sh_info
;
4349 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4351 bfd_vma sec_index
= SECTION_HEADER_INDEX (sym
->st_shndx
);
4354 error (_("Bad sh_info in group section `%s'\n"), name
);
4358 group_name
= SECTION_NAME (section_headers
+ sec_index
);
4367 /* Get the string table. */
4368 if (SECTION_HEADER_INDEX (symtab_sec
->sh_link
)
4369 >= elf_header
.e_shnum
)
4378 != (sec
= SECTION_HEADER (symtab_sec
->sh_link
)))
4383 strtab
= get_data (NULL
, file
, strtab_sec
->sh_offset
,
4384 1, strtab_sec
->sh_size
,
4386 strtab_size
= strtab
!= NULL
? strtab_sec
->sh_size
: 0;
4388 group_name
= sym
->st_name
< strtab_size
4389 ? strtab
+ sym
->st_name
: "<corrupt>";
4392 start
= get_data (NULL
, file
, section
->sh_offset
,
4393 1, section
->sh_size
, _("section data"));
4396 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
4397 entry
= byte_get (indices
, 4);
4400 if (do_section_groups
)
4402 printf ("\n%s group section [%5u] `%s' [%s] contains %u sections:\n",
4403 get_group_flags (entry
), i
, name
, group_name
, size
);
4405 printf (_(" [Index] Name\n"));
4408 group
->group_index
= i
;
4410 for (j
= 0; j
< size
; j
++)
4412 struct group_list
*g
;
4414 entry
= byte_get (indices
, 4);
4417 if (SECTION_HEADER_INDEX (entry
) >= elf_header
.e_shnum
)
4419 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
4420 entry
, i
, elf_header
.e_shnum
- 1);
4423 else if (entry
>= SHN_LORESERVE
&& entry
<= SHN_HIRESERVE
)
4425 error (_("invalid section [%5u] in group section [%5u]\n"),
4430 if (section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4435 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
4437 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4442 /* Intel C/C++ compiler may put section 0 in a
4443 section group. We just warn it the first time
4444 and ignore it afterwards. */
4445 static int warned
= 0;
4448 error (_("section 0 in group section [%5u]\n"),
4449 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4455 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4458 if (do_section_groups
)
4460 sec
= SECTION_HEADER (entry
);
4461 printf (" [%5u] %s\n", entry
, SECTION_NAME (sec
));
4464 g
= xmalloc (sizeof (struct group_list
));
4465 g
->section_index
= entry
;
4466 g
->next
= group
->root
;
4490 } dynamic_relocations
[] =
4492 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
4493 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
4494 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
4497 /* Process the reloc section. */
4500 process_relocs (FILE *file
)
4502 unsigned long rel_size
;
4503 unsigned long rel_offset
;
4509 if (do_using_dynamic
)
4513 int has_dynamic_reloc
;
4516 has_dynamic_reloc
= 0;
4518 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
4520 is_rela
= dynamic_relocations
[i
].rela
;
4521 name
= dynamic_relocations
[i
].name
;
4522 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
4523 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
4525 has_dynamic_reloc
|= rel_size
;
4527 if (is_rela
== UNKNOWN
)
4529 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
4530 switch (dynamic_info
[DT_PLTREL
])
4544 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4545 name
, rel_offset
, rel_size
);
4547 dump_relocations (file
,
4548 offset_from_vma (file
, rel_offset
, rel_size
),
4550 dynamic_symbols
, num_dynamic_syms
,
4551 dynamic_strings
, dynamic_strings_length
, is_rela
);
4555 if (! has_dynamic_reloc
)
4556 printf (_("\nThere are no dynamic relocations in this file.\n"));
4560 Elf_Internal_Shdr
*section
;
4564 for (i
= 0, section
= section_headers
;
4565 i
< elf_header
.e_shnum
;
4568 if ( section
->sh_type
!= SHT_RELA
4569 && section
->sh_type
!= SHT_REL
)
4572 rel_offset
= section
->sh_offset
;
4573 rel_size
= section
->sh_size
;
4577 Elf_Internal_Shdr
*strsec
;
4580 printf (_("\nRelocation section "));
4582 if (string_table
== NULL
)
4583 printf ("%d", section
->sh_name
);
4585 printf (_("'%s'"), SECTION_NAME (section
));
4587 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4588 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4590 is_rela
= section
->sh_type
== SHT_RELA
;
4592 if (section
->sh_link
4593 && SECTION_HEADER_INDEX (section
->sh_link
)
4594 < elf_header
.e_shnum
)
4596 Elf_Internal_Shdr
*symsec
;
4597 Elf_Internal_Sym
*symtab
;
4598 unsigned long nsyms
;
4599 unsigned long strtablen
= 0;
4600 char *strtab
= NULL
;
4602 symsec
= SECTION_HEADER (section
->sh_link
);
4603 if (symsec
->sh_type
!= SHT_SYMTAB
4604 && symsec
->sh_type
!= SHT_DYNSYM
)
4607 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4608 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4613 if (SECTION_HEADER_INDEX (symsec
->sh_link
)
4614 < elf_header
.e_shnum
)
4616 strsec
= SECTION_HEADER (symsec
->sh_link
);
4618 strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4621 strtablen
= strtab
== NULL
? 0 : strsec
->sh_size
;
4624 dump_relocations (file
, rel_offset
, rel_size
,
4625 symtab
, nsyms
, strtab
, strtablen
, is_rela
);
4631 dump_relocations (file
, rel_offset
, rel_size
,
4632 NULL
, 0, NULL
, 0, is_rela
);
4639 printf (_("\nThere are no relocations in this file.\n"));
4645 /* Process the unwind section. */
4647 #include "unwind-ia64.h"
4649 /* An absolute address consists of a section and an offset. If the
4650 section is NULL, the offset itself is the address, otherwise, the
4651 address equals to LOAD_ADDRESS(section) + offset. */
4655 unsigned short section
;
4659 #define ABSADDR(a) \
4661 ? section_headers [(a).section].sh_addr + (a).offset \
4664 struct ia64_unw_aux_info
4666 struct ia64_unw_table_entry
4668 struct absaddr start
;
4670 struct absaddr info
;
4672 *table
; /* Unwind table. */
4673 unsigned long table_len
; /* Length of unwind table. */
4674 unsigned char *info
; /* Unwind info. */
4675 unsigned long info_size
; /* Size of unwind info. */
4676 bfd_vma info_addr
; /* starting address of unwind info. */
4677 bfd_vma seg_base
; /* Starting address of segment. */
4678 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4679 unsigned long nsyms
; /* Number of symbols. */
4680 char *strtab
; /* The string table. */
4681 unsigned long strtab_size
; /* Size of string table. */
4685 find_symbol_for_address (Elf_Internal_Sym
*symtab
,
4686 unsigned long nsyms
,
4688 unsigned long strtab_size
,
4689 struct absaddr addr
,
4690 const char **symname
,
4693 bfd_vma dist
= 0x100000;
4694 Elf_Internal_Sym
*sym
, *best
= NULL
;
4697 for (i
= 0, sym
= symtab
; i
< nsyms
; ++i
, ++sym
)
4699 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
4700 && sym
->st_name
!= 0
4701 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
4702 && addr
.offset
>= sym
->st_value
4703 && addr
.offset
- sym
->st_value
< dist
)
4706 dist
= addr
.offset
- sym
->st_value
;
4713 *symname
= (best
->st_name
>= strtab_size
4714 ? "<corrupt>" : strtab
+ best
->st_name
);
4719 *offset
= addr
.offset
;
4723 dump_ia64_unwind (struct ia64_unw_aux_info
*aux
)
4725 struct ia64_unw_table_entry
*tp
;
4728 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4732 const unsigned char *dp
;
4733 const unsigned char *head
;
4734 const char *procname
;
4736 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
4737 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
4739 fputs ("\n<", stdout
);
4743 fputs (procname
, stdout
);
4746 printf ("+%lx", (unsigned long) offset
);
4749 fputs (">: [", stdout
);
4750 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4751 fputc ('-', stdout
);
4752 print_vma (tp
->end
.offset
, PREFIX_HEX
);
4753 printf ("], info at +0x%lx\n",
4754 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
4756 head
= aux
->info
+ (ABSADDR (tp
->info
) - aux
->info_addr
);
4757 stamp
= byte_get ((unsigned char *) head
, sizeof (stamp
));
4759 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4760 (unsigned) UNW_VER (stamp
),
4761 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
4762 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
4763 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
4764 (unsigned long) (eh_addr_size
* UNW_LENGTH (stamp
)));
4766 if (UNW_VER (stamp
) != 1)
4768 printf ("\tUnknown version.\n");
4773 for (dp
= head
+ 8; dp
< head
+ 8 + eh_addr_size
* UNW_LENGTH (stamp
);)
4774 dp
= unw_decode (dp
, in_body
, & in_body
);
4779 slurp_ia64_unwind_table (FILE *file
,
4780 struct ia64_unw_aux_info
*aux
,
4781 Elf_Internal_Shdr
*sec
)
4783 unsigned long size
, nrelas
, i
;
4784 Elf_Internal_Phdr
*seg
;
4785 struct ia64_unw_table_entry
*tep
;
4786 Elf_Internal_Shdr
*relsec
;
4787 Elf_Internal_Rela
*rela
, *rp
;
4788 unsigned char *table
, *tp
;
4789 Elf_Internal_Sym
*sym
;
4790 const char *relname
;
4792 /* First, find the starting address of the segment that includes
4795 if (elf_header
.e_phnum
)
4797 if (! get_program_headers (file
))
4800 for (seg
= program_headers
;
4801 seg
< program_headers
+ elf_header
.e_phnum
;
4804 if (seg
->p_type
!= PT_LOAD
)
4807 if (sec
->sh_addr
>= seg
->p_vaddr
4808 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
4810 aux
->seg_base
= seg
->p_vaddr
;
4816 /* Second, build the unwind table from the contents of the unwind section: */
4817 size
= sec
->sh_size
;
4818 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
4822 aux
->table
= xcmalloc (size
/ (3 * eh_addr_size
), sizeof (aux
->table
[0]));
4824 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * eh_addr_size
, ++tep
)
4826 tep
->start
.section
= SHN_UNDEF
;
4827 tep
->end
.section
= SHN_UNDEF
;
4828 tep
->info
.section
= SHN_UNDEF
;
4831 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
4832 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
4833 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
4837 tep
->start
.offset
= BYTE_GET ((unsigned char *) tp
+ 0);
4838 tep
->end
.offset
= BYTE_GET ((unsigned char *) tp
+ 8);
4839 tep
->info
.offset
= BYTE_GET ((unsigned char *) tp
+ 16);
4841 tep
->start
.offset
+= aux
->seg_base
;
4842 tep
->end
.offset
+= aux
->seg_base
;
4843 tep
->info
.offset
+= aux
->seg_base
;
4847 /* Third, apply any relocations to the unwind table: */
4849 for (relsec
= section_headers
;
4850 relsec
< section_headers
+ elf_header
.e_shnum
;
4853 if (relsec
->sh_type
!= SHT_RELA
4854 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
4855 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4858 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
4862 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
4866 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
4867 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
4871 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
4872 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
4875 if (! strneq (relname
, "R_IA64_SEGREL", 13))
4877 warn (_("Skipping unexpected relocation type %s\n"), relname
);
4881 i
= rp
->r_offset
/ (3 * eh_addr_size
);
4883 switch (rp
->r_offset
/eh_addr_size
% 3)
4886 aux
->table
[i
].start
.section
= sym
->st_shndx
;
4887 aux
->table
[i
].start
.offset
+= rp
->r_addend
+ sym
->st_value
;
4890 aux
->table
[i
].end
.section
= sym
->st_shndx
;
4891 aux
->table
[i
].end
.offset
+= rp
->r_addend
+ sym
->st_value
;
4894 aux
->table
[i
].info
.section
= sym
->st_shndx
;
4895 aux
->table
[i
].info
.offset
+= rp
->r_addend
+ sym
->st_value
;
4905 aux
->table_len
= size
/ (3 * eh_addr_size
);
4910 ia64_process_unwind (FILE *file
)
4912 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
4913 unsigned long i
, unwcount
= 0, unwstart
= 0;
4914 struct ia64_unw_aux_info aux
;
4916 memset (& aux
, 0, sizeof (aux
));
4918 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
4920 if (sec
->sh_type
== SHT_SYMTAB
4921 && SECTION_HEADER_INDEX (sec
->sh_link
) < elf_header
.e_shnum
)
4923 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
4924 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
4926 strsec
= SECTION_HEADER (sec
->sh_link
);
4927 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4928 1, strsec
->sh_size
, _("string table"));
4929 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
4931 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4936 printf (_("\nThere are no unwind sections in this file.\n"));
4938 while (unwcount
-- > 0)
4943 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
4944 i
< elf_header
.e_shnum
; ++i
, ++sec
)
4945 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4952 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
4954 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
4956 /* We need to find which section group it is in. */
4957 struct group_list
*g
= section_headers_groups
[i
]->root
;
4959 for (; g
!= NULL
; g
= g
->next
)
4961 sec
= SECTION_HEADER (g
->section_index
);
4963 if (streq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
))
4968 i
= elf_header
.e_shnum
;
4970 else if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
, len
))
4972 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
4973 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
4974 suffix
= SECTION_NAME (unwsec
) + len
;
4975 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4977 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info_once
, len2
)
4978 && streq (SECTION_NAME (sec
) + len2
, suffix
))
4983 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4984 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
4985 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
4986 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
4988 if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
, len
))
4989 suffix
= SECTION_NAME (unwsec
) + len
;
4990 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4992 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
, len2
)
4993 && streq (SECTION_NAME (sec
) + len2
, suffix
))
4997 if (i
== elf_header
.e_shnum
)
4999 printf (_("\nCould not find unwind info section for "));
5001 if (string_table
== NULL
)
5002 printf ("%d", unwsec
->sh_name
);
5004 printf (_("'%s'"), SECTION_NAME (unwsec
));
5008 aux
.info_size
= sec
->sh_size
;
5009 aux
.info_addr
= sec
->sh_addr
;
5010 aux
.info
= get_data (NULL
, file
, sec
->sh_offset
, 1, aux
.info_size
,
5013 printf (_("\nUnwind section "));
5015 if (string_table
== NULL
)
5016 printf ("%d", unwsec
->sh_name
);
5018 printf (_("'%s'"), SECTION_NAME (unwsec
));
5020 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5021 (unsigned long) unwsec
->sh_offset
,
5022 (unsigned long) (unwsec
->sh_size
/ (3 * eh_addr_size
)));
5024 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
5026 if (aux
.table_len
> 0)
5027 dump_ia64_unwind (& aux
);
5030 free ((char *) aux
.table
);
5032 free ((char *) aux
.info
);
5041 free ((char *) aux
.strtab
);
5046 struct hppa_unw_aux_info
5048 struct hppa_unw_table_entry
5050 struct absaddr start
;
5052 unsigned int Cannot_unwind
:1; /* 0 */
5053 unsigned int Millicode
:1; /* 1 */
5054 unsigned int Millicode_save_sr0
:1; /* 2 */
5055 unsigned int Region_description
:2; /* 3..4 */
5056 unsigned int reserved1
:1; /* 5 */
5057 unsigned int Entry_SR
:1; /* 6 */
5058 unsigned int Entry_FR
:4; /* number saved */ /* 7..10 */
5059 unsigned int Entry_GR
:5; /* number saved */ /* 11..15 */
5060 unsigned int Args_stored
:1; /* 16 */
5061 unsigned int Variable_Frame
:1; /* 17 */
5062 unsigned int Separate_Package_Body
:1; /* 18 */
5063 unsigned int Frame_Extension_Millicode
:1; /* 19 */
5064 unsigned int Stack_Overflow_Check
:1; /* 20 */
5065 unsigned int Two_Instruction_SP_Increment
:1; /* 21 */
5066 unsigned int Ada_Region
:1; /* 22 */
5067 unsigned int cxx_info
:1; /* 23 */
5068 unsigned int cxx_try_catch
:1; /* 24 */
5069 unsigned int sched_entry_seq
:1; /* 25 */
5070 unsigned int reserved2
:1; /* 26 */
5071 unsigned int Save_SP
:1; /* 27 */
5072 unsigned int Save_RP
:1; /* 28 */
5073 unsigned int Save_MRP_in_frame
:1; /* 29 */
5074 unsigned int extn_ptr_defined
:1; /* 30 */
5075 unsigned int Cleanup_defined
:1; /* 31 */
5077 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
5078 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
5079 unsigned int Large_frame
:1; /* 2 */
5080 unsigned int Pseudo_SP_Set
:1; /* 3 */
5081 unsigned int reserved4
:1; /* 4 */
5082 unsigned int Total_frame_size
:27; /* 5..31 */
5084 *table
; /* Unwind table. */
5085 unsigned long table_len
; /* Length of unwind table. */
5086 bfd_vma seg_base
; /* Starting address of segment. */
5087 Elf_Internal_Sym
*symtab
; /* The symbol table. */
5088 unsigned long nsyms
; /* Number of symbols. */
5089 char *strtab
; /* The string table. */
5090 unsigned long strtab_size
; /* Size of string table. */
5094 dump_hppa_unwind (struct hppa_unw_aux_info
*aux
)
5096 struct hppa_unw_table_entry
*tp
;
5098 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
5101 const char *procname
;
5103 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
5104 aux
->strtab_size
, tp
->start
, &procname
,
5107 fputs ("\n<", stdout
);
5111 fputs (procname
, stdout
);
5114 printf ("+%lx", (unsigned long) offset
);
5117 fputs (">: [", stdout
);
5118 print_vma (tp
->start
.offset
, PREFIX_HEX
);
5119 fputc ('-', stdout
);
5120 print_vma (tp
->end
.offset
, PREFIX_HEX
);
5123 #define PF(_m) if (tp->_m) printf (#_m " ");
5124 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5127 PF(Millicode_save_sr0
);
5128 /* PV(Region_description); */
5134 PF(Separate_Package_Body
);
5135 PF(Frame_Extension_Millicode
);
5136 PF(Stack_Overflow_Check
);
5137 PF(Two_Instruction_SP_Increment
);
5141 PF(sched_entry_seq
);
5144 PF(Save_MRP_in_frame
);
5145 PF(extn_ptr_defined
);
5146 PF(Cleanup_defined
);
5147 PF(MPE_XL_interrupt_marker
);
5148 PF(HP_UX_interrupt_marker
);
5151 PV(Total_frame_size
);
5160 slurp_hppa_unwind_table (FILE *file
,
5161 struct hppa_unw_aux_info
*aux
,
5162 Elf_Internal_Shdr
*sec
)
5164 unsigned long size
, unw_ent_size
, nentries
, nrelas
, i
;
5165 Elf_Internal_Phdr
*seg
;
5166 struct hppa_unw_table_entry
*tep
;
5167 Elf_Internal_Shdr
*relsec
;
5168 Elf_Internal_Rela
*rela
, *rp
;
5169 unsigned char *table
, *tp
;
5170 Elf_Internal_Sym
*sym
;
5171 const char *relname
;
5173 /* First, find the starting address of the segment that includes
5176 if (elf_header
.e_phnum
)
5178 if (! get_program_headers (file
))
5181 for (seg
= program_headers
;
5182 seg
< program_headers
+ elf_header
.e_phnum
;
5185 if (seg
->p_type
!= PT_LOAD
)
5188 if (sec
->sh_addr
>= seg
->p_vaddr
5189 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5191 aux
->seg_base
= seg
->p_vaddr
;
5197 /* Second, build the unwind table from the contents of the unwind
5199 size
= sec
->sh_size
;
5200 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
5205 nentries
= size
/ unw_ent_size
;
5206 size
= unw_ent_size
* nentries
;
5208 tep
= aux
->table
= xcmalloc (nentries
, sizeof (aux
->table
[0]));
5210 for (tp
= table
; tp
< table
+ size
; tp
+= unw_ent_size
, ++tep
)
5212 unsigned int tmp1
, tmp2
;
5214 tep
->start
.section
= SHN_UNDEF
;
5215 tep
->end
.section
= SHN_UNDEF
;
5217 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
5218 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
5219 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
5220 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
5222 tep
->start
.offset
+= aux
->seg_base
;
5223 tep
->end
.offset
+= aux
->seg_base
;
5225 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
5226 tep
->Millicode
= (tmp1
>> 30) & 0x1;
5227 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
5228 tep
->Region_description
= (tmp1
>> 27) & 0x3;
5229 tep
->reserved1
= (tmp1
>> 26) & 0x1;
5230 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
5231 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
5232 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
5233 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
5234 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
5235 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
5236 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
5237 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
5238 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
5239 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
5240 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
5241 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
5242 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
5243 tep
->reserved2
= (tmp1
>> 5) & 0x1;
5244 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
5245 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
5246 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
5247 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
5248 tep
->Cleanup_defined
= tmp1
& 0x1;
5250 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
5251 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
5252 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
5253 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
5254 tep
->reserved4
= (tmp2
>> 27) & 0x1;
5255 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
5259 /* Third, apply any relocations to the unwind table. */
5261 for (relsec
= section_headers
;
5262 relsec
< section_headers
+ elf_header
.e_shnum
;
5265 if (relsec
->sh_type
!= SHT_RELA
5266 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
5267 || SECTION_HEADER (relsec
->sh_info
) != sec
)
5270 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5274 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5278 relname
= elf_hppa_reloc_type (ELF32_R_TYPE (rp
->r_info
));
5279 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
5283 relname
= elf_hppa_reloc_type (ELF64_R_TYPE (rp
->r_info
));
5284 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
5287 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
5288 if (strncmp (relname
, "R_PARISC_SEGREL", 15) != 0)
5290 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5294 i
= rp
->r_offset
/ unw_ent_size
;
5296 switch ((rp
->r_offset
% unw_ent_size
) / eh_addr_size
)
5299 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5300 aux
->table
[i
].start
.offset
+= sym
->st_value
+ rp
->r_addend
;
5303 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5304 aux
->table
[i
].end
.offset
+= sym
->st_value
+ rp
->r_addend
;
5314 aux
->table_len
= nentries
;
5320 hppa_process_unwind (FILE *file
)
5322 struct hppa_unw_aux_info aux
;
5323 Elf_Internal_Shdr
*unwsec
= NULL
;
5324 Elf_Internal_Shdr
*strsec
;
5325 Elf_Internal_Shdr
*sec
;
5328 memset (& aux
, 0, sizeof (aux
));
5330 if (string_table
== NULL
)
5333 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5335 if (sec
->sh_type
== SHT_SYMTAB
5336 && SECTION_HEADER_INDEX (sec
->sh_link
) < elf_header
.e_shnum
)
5338 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5339 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5341 strsec
= SECTION_HEADER (sec
->sh_link
);
5342 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
5343 1, strsec
->sh_size
, _("string table"));
5344 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5346 else if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5351 printf (_("\nThere are no unwind sections in this file.\n"));
5353 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5355 if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5357 printf (_("\nUnwind section "));
5358 printf (_("'%s'"), SECTION_NAME (sec
));
5360 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5361 (unsigned long) sec
->sh_offset
,
5362 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
+ 8)));
5364 slurp_hppa_unwind_table (file
, &aux
, sec
);
5365 if (aux
.table_len
> 0)
5366 dump_hppa_unwind (&aux
);
5369 free ((char *) aux
.table
);
5377 free ((char *) aux
.strtab
);
5383 process_unwind (FILE *file
)
5385 struct unwind_handler
{
5387 int (*handler
)(FILE *file
);
5389 { EM_IA_64
, ia64_process_unwind
},
5390 { EM_PARISC
, hppa_process_unwind
},
5398 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
5399 if (elf_header
.e_machine
== handlers
[i
].machtype
)
5400 return handlers
[i
].handler (file
);
5402 printf (_("\nThere are no unwind sections in this file.\n"));
5407 dynamic_section_mips_val (Elf_Internal_Dyn
*entry
)
5409 switch (entry
->d_tag
)
5412 if (entry
->d_un
.d_val
== 0)
5416 static const char * opts
[] =
5418 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5419 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5420 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5421 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5426 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++cnt
)
5427 if (entry
->d_un
.d_val
& (1 << cnt
))
5429 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
5436 case DT_MIPS_IVERSION
:
5437 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5438 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5440 printf ("<corrupt: %ld>\n", (long) entry
->d_un
.d_ptr
);
5443 case DT_MIPS_TIME_STAMP
:
5448 time_t time
= entry
->d_un
.d_val
;
5449 tmp
= gmtime (&time
);
5450 snprintf (timebuf
, sizeof (timebuf
), "%04u-%02u-%02uT%02u:%02u:%02u",
5451 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5452 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5453 printf ("Time Stamp: %s\n", timebuf
);
5457 case DT_MIPS_RLD_VERSION
:
5458 case DT_MIPS_LOCAL_GOTNO
:
5459 case DT_MIPS_CONFLICTNO
:
5460 case DT_MIPS_LIBLISTNO
:
5461 case DT_MIPS_SYMTABNO
:
5462 case DT_MIPS_UNREFEXTNO
:
5463 case DT_MIPS_HIPAGENO
:
5464 case DT_MIPS_DELTA_CLASS_NO
:
5465 case DT_MIPS_DELTA_INSTANCE_NO
:
5466 case DT_MIPS_DELTA_RELOC_NO
:
5467 case DT_MIPS_DELTA_SYM_NO
:
5468 case DT_MIPS_DELTA_CLASSSYM_NO
:
5469 case DT_MIPS_COMPACT_SIZE
:
5470 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
5474 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
5480 dynamic_section_parisc_val (Elf_Internal_Dyn
*entry
)
5482 switch (entry
->d_tag
)
5484 case DT_HP_DLD_FLAGS
:
5493 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
5494 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
5495 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
5496 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
5497 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
5498 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
5499 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
5500 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
5501 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
5502 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
5503 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" },
5504 { DT_HP_GST
, "HP_GST" },
5505 { DT_HP_SHLIB_FIXED
, "HP_SHLIB_FIXED" },
5506 { DT_HP_MERGE_SHLIB_SEG
, "HP_MERGE_SHLIB_SEG" },
5507 { DT_HP_NODELETE
, "HP_NODELETE" },
5508 { DT_HP_GROUP
, "HP_GROUP" },
5509 { DT_HP_PROTECT_LINKAGE_TABLE
, "HP_PROTECT_LINKAGE_TABLE" }
5513 bfd_vma val
= entry
->d_un
.d_val
;
5515 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
5516 if (val
& flags
[cnt
].bit
)
5520 fputs (flags
[cnt
].str
, stdout
);
5522 val
^= flags
[cnt
].bit
;
5525 if (val
!= 0 || first
)
5529 print_vma (val
, HEX
);
5535 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5542 dynamic_section_ia64_val (Elf_Internal_Dyn
*entry
)
5544 switch (entry
->d_tag
)
5546 case DT_IA_64_PLT_RESERVE
:
5547 /* First 3 slots reserved. */
5548 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5550 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
5554 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5561 get_32bit_dynamic_section (FILE *file
)
5563 Elf32_External_Dyn
*edyn
, *ext
;
5564 Elf_Internal_Dyn
*entry
;
5566 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5567 _("dynamic section"));
5571 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5572 might not have the luxury of section headers. Look for the DT_NULL
5573 terminator to determine the number of entries. */
5574 for (ext
= edyn
, dynamic_nent
= 0;
5575 (char *) ext
< (char *) edyn
+ dynamic_size
;
5579 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5583 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5584 if (dynamic_section
== NULL
)
5586 error (_("Out of memory\n"));
5591 for (ext
= edyn
, entry
= dynamic_section
;
5592 entry
< dynamic_section
+ dynamic_nent
;
5595 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5596 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5605 get_64bit_dynamic_section (FILE *file
)
5607 Elf64_External_Dyn
*edyn
, *ext
;
5608 Elf_Internal_Dyn
*entry
;
5610 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5611 _("dynamic section"));
5615 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5616 might not have the luxury of section headers. Look for the DT_NULL
5617 terminator to determine the number of entries. */
5618 for (ext
= edyn
, dynamic_nent
= 0;
5619 (char *) ext
< (char *) edyn
+ dynamic_size
;
5623 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5627 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5628 if (dynamic_section
== NULL
)
5630 error (_("Out of memory\n"));
5635 for (ext
= edyn
, entry
= dynamic_section
;
5636 entry
< dynamic_section
+ dynamic_nent
;
5639 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5640 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5649 print_dynamic_flags (bfd_vma flags
)
5657 flag
= flags
& - flags
;
5667 case DF_ORIGIN
: fputs ("ORIGIN", stdout
); break;
5668 case DF_SYMBOLIC
: fputs ("SYMBOLIC", stdout
); break;
5669 case DF_TEXTREL
: fputs ("TEXTREL", stdout
); break;
5670 case DF_BIND_NOW
: fputs ("BIND_NOW", stdout
); break;
5671 case DF_STATIC_TLS
: fputs ("STATIC_TLS", stdout
); break;
5672 default: fputs ("unknown", stdout
); break;
5678 /* Parse and display the contents of the dynamic section. */
5681 process_dynamic_section (FILE *file
)
5683 Elf_Internal_Dyn
*entry
;
5685 if (dynamic_size
== 0)
5688 printf (_("\nThere is no dynamic section in this file.\n"));
5695 if (! get_32bit_dynamic_section (file
))
5698 else if (! get_64bit_dynamic_section (file
))
5701 /* Find the appropriate symbol table. */
5702 if (dynamic_symbols
== NULL
)
5704 for (entry
= dynamic_section
;
5705 entry
< dynamic_section
+ dynamic_nent
;
5708 Elf_Internal_Shdr section
;
5710 if (entry
->d_tag
!= DT_SYMTAB
)
5713 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
5715 /* Since we do not know how big the symbol table is,
5716 we default to reading in the entire file (!) and
5717 processing that. This is overkill, I know, but it
5719 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5721 if (archive_file_offset
!= 0)
5722 section
.sh_size
= archive_file_size
- section
.sh_offset
;
5725 if (fseek (file
, 0, SEEK_END
))
5726 error (_("Unable to seek to end of file!"));
5728 section
.sh_size
= ftell (file
) - section
.sh_offset
;
5732 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
5734 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
5736 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
5737 if (num_dynamic_syms
< 1)
5739 error (_("Unable to determine the number of symbols to load\n"));
5743 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
5747 /* Similarly find a string table. */
5748 if (dynamic_strings
== NULL
)
5750 for (entry
= dynamic_section
;
5751 entry
< dynamic_section
+ dynamic_nent
;
5754 unsigned long offset
;
5757 if (entry
->d_tag
!= DT_STRTAB
)
5760 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
5762 /* Since we do not know how big the string table is,
5763 we default to reading in the entire file (!) and
5764 processing that. This is overkill, I know, but it
5767 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5769 if (archive_file_offset
!= 0)
5770 str_tab_len
= archive_file_size
- offset
;
5773 if (fseek (file
, 0, SEEK_END
))
5774 error (_("Unable to seek to end of file\n"));
5775 str_tab_len
= ftell (file
) - offset
;
5778 if (str_tab_len
< 1)
5781 (_("Unable to determine the length of the dynamic string table\n"));
5785 dynamic_strings
= get_data (NULL
, file
, offset
, 1, str_tab_len
,
5786 _("dynamic string table"));
5787 dynamic_strings_length
= str_tab_len
;
5792 /* And find the syminfo section if available. */
5793 if (dynamic_syminfo
== NULL
)
5795 unsigned long syminsz
= 0;
5797 for (entry
= dynamic_section
;
5798 entry
< dynamic_section
+ dynamic_nent
;
5801 if (entry
->d_tag
== DT_SYMINENT
)
5803 /* Note: these braces are necessary to avoid a syntax
5804 error from the SunOS4 C compiler. */
5805 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
5807 else if (entry
->d_tag
== DT_SYMINSZ
)
5808 syminsz
= entry
->d_un
.d_val
;
5809 else if (entry
->d_tag
== DT_SYMINFO
)
5810 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
5814 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
5816 Elf_External_Syminfo
*extsyminfo
, *extsym
;
5817 Elf_Internal_Syminfo
*syminfo
;
5819 /* There is a syminfo section. Read the data. */
5820 extsyminfo
= get_data (NULL
, file
, dynamic_syminfo_offset
, 1,
5821 syminsz
, _("symbol information"));
5825 dynamic_syminfo
= malloc (syminsz
);
5826 if (dynamic_syminfo
== NULL
)
5828 error (_("Out of memory\n"));
5832 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
5833 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
5834 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
5835 ++syminfo
, ++extsym
)
5837 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
5838 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
5845 if (do_dynamic
&& dynamic_addr
)
5846 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
5847 dynamic_addr
, dynamic_nent
);
5849 printf (_(" Tag Type Name/Value\n"));
5851 for (entry
= dynamic_section
;
5852 entry
< dynamic_section
+ dynamic_nent
;
5860 print_vma (entry
->d_tag
, FULL_HEX
);
5861 dtype
= get_dynamic_type (entry
->d_tag
);
5862 printf (" (%s)%*s", dtype
,
5863 ((is_32bit_elf
? 27 : 19)
5864 - (int) strlen (dtype
)),
5868 switch (entry
->d_tag
)
5872 print_dynamic_flags (entry
->d_un
.d_val
);
5882 switch (entry
->d_tag
)
5885 printf (_("Auxiliary library"));
5889 printf (_("Filter library"));
5893 printf (_("Configuration file"));
5897 printf (_("Dependency audit library"));
5901 printf (_("Audit library"));
5905 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5906 printf (": [%s]\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5910 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5919 printf (_("Flags:"));
5921 if (entry
->d_un
.d_val
== 0)
5922 printf (_(" None\n"));
5925 unsigned long int val
= entry
->d_un
.d_val
;
5927 if (val
& DTF_1_PARINIT
)
5929 printf (" PARINIT");
5930 val
^= DTF_1_PARINIT
;
5932 if (val
& DTF_1_CONFEXP
)
5934 printf (" CONFEXP");
5935 val
^= DTF_1_CONFEXP
;
5938 printf (" %lx", val
);
5947 printf (_("Flags:"));
5949 if (entry
->d_un
.d_val
== 0)
5950 printf (_(" None\n"));
5953 unsigned long int val
= entry
->d_un
.d_val
;
5955 if (val
& DF_P1_LAZYLOAD
)
5957 printf (" LAZYLOAD");
5958 val
^= DF_P1_LAZYLOAD
;
5960 if (val
& DF_P1_GROUPPERM
)
5962 printf (" GROUPPERM");
5963 val
^= DF_P1_GROUPPERM
;
5966 printf (" %lx", val
);
5975 printf (_("Flags:"));
5976 if (entry
->d_un
.d_val
== 0)
5977 printf (_(" None\n"));
5980 unsigned long int val
= entry
->d_un
.d_val
;
5987 if (val
& DF_1_GLOBAL
)
5992 if (val
& DF_1_GROUP
)
5997 if (val
& DF_1_NODELETE
)
5999 printf (" NODELETE");
6000 val
^= DF_1_NODELETE
;
6002 if (val
& DF_1_LOADFLTR
)
6004 printf (" LOADFLTR");
6005 val
^= DF_1_LOADFLTR
;
6007 if (val
& DF_1_INITFIRST
)
6009 printf (" INITFIRST");
6010 val
^= DF_1_INITFIRST
;
6012 if (val
& DF_1_NOOPEN
)
6017 if (val
& DF_1_ORIGIN
)
6022 if (val
& DF_1_DIRECT
)
6027 if (val
& DF_1_TRANS
)
6032 if (val
& DF_1_INTERPOSE
)
6034 printf (" INTERPOSE");
6035 val
^= DF_1_INTERPOSE
;
6037 if (val
& DF_1_NODEFLIB
)
6039 printf (" NODEFLIB");
6040 val
^= DF_1_NODEFLIB
;
6042 if (val
& DF_1_NODUMP
)
6047 if (val
& DF_1_CONLFAT
)
6049 printf (" CONLFAT");
6050 val
^= DF_1_CONLFAT
;
6053 printf (" %lx", val
);
6060 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6062 puts (get_dynamic_type (entry
->d_un
.d_val
));
6082 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6088 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6089 name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6095 switch (entry
->d_tag
)
6098 printf (_("Shared library: [%s]"), name
);
6100 if (streq (name
, program_interpreter
))
6101 printf (_(" program interpreter"));
6105 printf (_("Library soname: [%s]"), name
);
6109 printf (_("Library rpath: [%s]"), name
);
6113 printf (_("Library runpath: [%s]"), name
);
6117 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6122 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6135 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6139 case DT_INIT_ARRAYSZ
:
6140 case DT_FINI_ARRAYSZ
:
6141 case DT_GNU_CONFLICTSZ
:
6142 case DT_GNU_LIBLISTSZ
:
6145 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6146 printf (" (bytes)\n");
6156 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6169 if (entry
->d_tag
== DT_USED
6170 && VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6172 char *name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6176 printf (_("Not needed object: [%s]\n"), name
);
6181 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6187 /* The value of this entry is ignored. */
6192 case DT_GNU_PRELINKED
:
6196 time_t time
= entry
->d_un
.d_val
;
6198 tmp
= gmtime (&time
);
6199 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
6200 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
6201 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
6207 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
6208 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
6213 switch (elf_header
.e_machine
)
6216 case EM_MIPS_RS3_LE
:
6217 dynamic_section_mips_val (entry
);
6220 dynamic_section_parisc_val (entry
);
6223 dynamic_section_ia64_val (entry
);
6226 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6238 get_ver_flags (unsigned int flags
)
6240 static char buff
[32];
6247 if (flags
& VER_FLG_BASE
)
6248 strcat (buff
, "BASE ");
6250 if (flags
& VER_FLG_WEAK
)
6252 if (flags
& VER_FLG_BASE
)
6253 strcat (buff
, "| ");
6255 strcat (buff
, "WEAK ");
6258 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
6259 strcat (buff
, "| <unknown>");
6264 /* Display the contents of the version sections. */
6266 process_version_sections (FILE *file
)
6268 Elf_Internal_Shdr
*section
;
6275 for (i
= 0, section
= section_headers
;
6276 i
< elf_header
.e_shnum
;
6279 switch (section
->sh_type
)
6281 case SHT_GNU_verdef
:
6283 Elf_External_Verdef
*edefs
;
6290 (_("\nVersion definition section '%s' contains %ld entries:\n"),
6291 SECTION_NAME (section
), section
->sh_info
);
6293 printf (_(" Addr: 0x"));
6294 printf_vma (section
->sh_addr
);
6295 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6296 (unsigned long) section
->sh_offset
, section
->sh_link
,
6297 SECTION_HEADER_INDEX (section
->sh_link
)
6298 < elf_header
.e_shnum
6299 ? SECTION_NAME (SECTION_HEADER (section
->sh_link
))
6302 edefs
= get_data (NULL
, file
, section
->sh_offset
, 1,
6304 _("version definition section"));
6308 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6311 Elf_External_Verdef
*edef
;
6312 Elf_Internal_Verdef ent
;
6313 Elf_External_Verdaux
*eaux
;
6314 Elf_Internal_Verdaux aux
;
6318 vstart
= ((char *) edefs
) + idx
;
6320 edef
= (Elf_External_Verdef
*) vstart
;
6322 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
6323 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
6324 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
6325 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
6326 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
6327 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
6328 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
6330 printf (_(" %#06x: Rev: %d Flags: %s"),
6331 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
6333 printf (_(" Index: %d Cnt: %d "),
6334 ent
.vd_ndx
, ent
.vd_cnt
);
6336 vstart
+= ent
.vd_aux
;
6338 eaux
= (Elf_External_Verdaux
*) vstart
;
6340 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6341 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6343 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6344 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux
.vda_name
));
6346 printf (_("Name index: %ld\n"), aux
.vda_name
);
6348 isum
= idx
+ ent
.vd_aux
;
6350 for (j
= 1; j
< ent
.vd_cnt
; j
++)
6352 isum
+= aux
.vda_next
;
6353 vstart
+= aux
.vda_next
;
6355 eaux
= (Elf_External_Verdaux
*) vstart
;
6357 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6358 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6360 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6361 printf (_(" %#06x: Parent %d: %s\n"),
6362 isum
, j
, GET_DYNAMIC_NAME (aux
.vda_name
));
6364 printf (_(" %#06x: Parent %d, name index: %ld\n"),
6365 isum
, j
, aux
.vda_name
);
6375 case SHT_GNU_verneed
:
6377 Elf_External_Verneed
*eneed
;
6383 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
6384 SECTION_NAME (section
), section
->sh_info
);
6386 printf (_(" Addr: 0x"));
6387 printf_vma (section
->sh_addr
);
6388 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
6389 (unsigned long) section
->sh_offset
, section
->sh_link
,
6390 SECTION_HEADER_INDEX (section
->sh_link
)
6391 < elf_header
.e_shnum
6392 ? SECTION_NAME (SECTION_HEADER (section
->sh_link
))
6395 eneed
= get_data (NULL
, file
, section
->sh_offset
, 1,
6397 _("version need section"));
6401 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6403 Elf_External_Verneed
*entry
;
6404 Elf_Internal_Verneed ent
;
6409 vstart
= ((char *) eneed
) + idx
;
6411 entry
= (Elf_External_Verneed
*) vstart
;
6413 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
6414 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
6415 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
6416 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
6417 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
6419 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
6421 if (VALID_DYNAMIC_NAME (ent
.vn_file
))
6422 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent
.vn_file
));
6424 printf (_(" File: %lx"), ent
.vn_file
);
6426 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
6428 vstart
+= ent
.vn_aux
;
6430 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
6432 Elf_External_Vernaux
*eaux
;
6433 Elf_Internal_Vernaux aux
;
6435 eaux
= (Elf_External_Vernaux
*) vstart
;
6437 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
6438 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
6439 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
6440 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
6441 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
6443 if (VALID_DYNAMIC_NAME (aux
.vna_name
))
6444 printf (_(" %#06x: Name: %s"),
6445 isum
, GET_DYNAMIC_NAME (aux
.vna_name
));
6447 printf (_(" %#06x: Name index: %lx"),
6448 isum
, aux
.vna_name
);
6450 printf (_(" Flags: %s Version: %d\n"),
6451 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
6453 isum
+= aux
.vna_next
;
6454 vstart
+= aux
.vna_next
;
6464 case SHT_GNU_versym
:
6466 Elf_Internal_Shdr
*link_section
;
6469 unsigned char *edata
;
6470 unsigned short *data
;
6472 Elf_Internal_Sym
*symbols
;
6473 Elf_Internal_Shdr
*string_sec
;
6476 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
)
6479 link_section
= SECTION_HEADER (section
->sh_link
);
6480 total
= section
->sh_size
/ sizeof (Elf_External_Versym
);
6482 if (SECTION_HEADER_INDEX (link_section
->sh_link
)
6483 >= elf_header
.e_shnum
)
6488 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
6490 string_sec
= SECTION_HEADER (link_section
->sh_link
);
6492 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
6493 string_sec
->sh_size
, _("version string table"));
6497 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6498 SECTION_NAME (section
), total
);
6500 printf (_(" Addr: "));
6501 printf_vma (section
->sh_addr
);
6502 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6503 (unsigned long) section
->sh_offset
, section
->sh_link
,
6504 SECTION_NAME (link_section
));
6506 off
= offset_from_vma (file
,
6507 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6508 total
* sizeof (short));
6509 edata
= get_data (NULL
, file
, off
, total
, sizeof (short),
6510 _("version symbol data"));
6517 data
= cmalloc (total
, sizeof (short));
6519 for (cnt
= total
; cnt
--;)
6520 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
6525 for (cnt
= 0; cnt
< total
; cnt
+= 4)
6528 int check_def
, check_need
;
6531 printf (" %03x:", cnt
);
6533 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
6534 switch (data
[cnt
+ j
])
6537 fputs (_(" 0 (*local*) "), stdout
);
6541 fputs (_(" 1 (*global*) "), stdout
);
6545 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
6546 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
6550 if (SECTION_HEADER_INDEX (symbols
[cnt
+ j
].st_shndx
)
6551 >= elf_header
.e_shnum
6552 || SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
6555 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
6562 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
6564 Elf_Internal_Verneed ivn
;
6565 unsigned long offset
;
6567 offset
= offset_from_vma
6568 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6569 sizeof (Elf_External_Verneed
));
6573 Elf_Internal_Vernaux ivna
;
6574 Elf_External_Verneed evn
;
6575 Elf_External_Vernaux evna
;
6576 unsigned long a_off
;
6578 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
6581 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6582 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6584 a_off
= offset
+ ivn
.vn_aux
;
6588 get_data (&evna
, file
, a_off
, sizeof (evna
),
6589 1, _("version need aux (2)"));
6591 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6592 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6594 a_off
+= ivna
.vna_next
;
6596 while (ivna
.vna_other
!= data
[cnt
+ j
]
6597 && ivna
.vna_next
!= 0);
6599 if (ivna
.vna_other
== data
[cnt
+ j
])
6601 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6603 name
= strtab
+ ivna
.vna_name
;
6604 nn
+= printf ("(%s%-*s",
6606 12 - (int) strlen (name
),
6612 offset
+= ivn
.vn_next
;
6614 while (ivn
.vn_next
);
6617 if (check_def
&& data
[cnt
+ j
] != 0x8001
6618 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6620 Elf_Internal_Verdef ivd
;
6621 Elf_External_Verdef evd
;
6622 unsigned long offset
;
6624 offset
= offset_from_vma
6625 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6630 get_data (&evd
, file
, offset
, sizeof (evd
), 1,
6633 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6634 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6636 offset
+= ivd
.vd_next
;
6638 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
6639 && ivd
.vd_next
!= 0);
6641 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
6643 Elf_External_Verdaux evda
;
6644 Elf_Internal_Verdaux ivda
;
6646 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6648 get_data (&evda
, file
,
6649 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
6651 _("version def aux"));
6653 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6655 name
= strtab
+ ivda
.vda_name
;
6656 nn
+= printf ("(%s%-*s",
6658 12 - (int) strlen (name
),
6664 printf ("%*c", 18 - nn
, ' ');
6682 printf (_("\nNo version information found in this file.\n"));
6688 get_symbol_binding (unsigned int binding
)
6690 static char buff
[32];
6694 case STB_LOCAL
: return "LOCAL";
6695 case STB_GLOBAL
: return "GLOBAL";
6696 case STB_WEAK
: return "WEAK";
6698 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
6699 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"),
6701 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
6702 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), binding
);
6704 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), binding
);
6710 get_symbol_type (unsigned int type
)
6712 static char buff
[32];
6716 case STT_NOTYPE
: return "NOTYPE";
6717 case STT_OBJECT
: return "OBJECT";
6718 case STT_FUNC
: return "FUNC";
6719 case STT_SECTION
: return "SECTION";
6720 case STT_FILE
: return "FILE";
6721 case STT_COMMON
: return "COMMON";
6722 case STT_TLS
: return "TLS";
6724 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
6726 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
6727 return "THUMB_FUNC";
6729 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
6732 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
6733 return "PARISC_MILLI";
6735 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"), type
);
6737 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
6739 if (elf_header
.e_machine
== EM_PARISC
)
6741 if (type
== STT_HP_OPAQUE
)
6743 if (type
== STT_HP_STUB
)
6747 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), type
);
6750 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), type
);
6756 get_symbol_visibility (unsigned int visibility
)
6760 case STV_DEFAULT
: return "DEFAULT";
6761 case STV_INTERNAL
: return "INTERNAL";
6762 case STV_HIDDEN
: return "HIDDEN";
6763 case STV_PROTECTED
: return "PROTECTED";
6769 get_mips_symbol_other (unsigned int other
)
6773 case STO_OPTIONAL
: return "OPTIONAL";
6774 case STO_MIPS16
: return "MIPS16";
6775 default: return NULL
;
6780 get_symbol_other (unsigned int other
)
6782 const char * result
= NULL
;
6783 static char buff
[32];
6788 switch (elf_header
.e_machine
)
6791 result
= get_mips_symbol_other (other
);
6799 snprintf (buff
, sizeof buff
, _("<other>: %x"), other
);
6804 get_symbol_index_type (unsigned int type
)
6806 static char buff
[32];
6810 case SHN_UNDEF
: return "UND";
6811 case SHN_ABS
: return "ABS";
6812 case SHN_COMMON
: return "COM";
6814 if (type
== SHN_IA_64_ANSI_COMMON
6815 && elf_header
.e_machine
== EM_IA_64
6816 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
6818 else if (elf_header
.e_machine
== EM_X86_64
6819 && type
== SHN_X86_64_LCOMMON
)
6821 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
6822 sprintf (buff
, "PRC[0x%04x]", type
);
6823 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
6824 sprintf (buff
, "OS [0x%04x]", type
);
6825 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
6826 sprintf (buff
, "RSV[0x%04x]", type
);
6828 sprintf (buff
, "%3d", type
);
6836 get_dynamic_data (FILE *file
, unsigned int number
, unsigned int ent_size
)
6838 unsigned char *e_data
;
6841 e_data
= cmalloc (number
, ent_size
);
6845 error (_("Out of memory\n"));
6849 if (fread (e_data
, ent_size
, number
, file
) != number
)
6851 error (_("Unable to read in dynamic data\n"));
6855 i_data
= cmalloc (number
, sizeof (*i_data
));
6859 error (_("Out of memory\n"));
6865 i_data
[number
] = byte_get (e_data
+ number
* ent_size
, ent_size
);
6872 /* Dump the symbol table. */
6874 process_symbol_table (FILE *file
)
6876 Elf_Internal_Shdr
*section
;
6877 bfd_vma nbuckets
= 0;
6878 bfd_vma nchains
= 0;
6879 bfd_vma
*buckets
= NULL
;
6880 bfd_vma
*chains
= NULL
;
6882 if (! do_syms
&& !do_histogram
)
6885 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
6888 unsigned char nb
[8];
6889 unsigned char nc
[8];
6890 int hash_ent_size
= 4;
6892 if ((elf_header
.e_machine
== EM_ALPHA
6893 || elf_header
.e_machine
== EM_S390
6894 || elf_header
.e_machine
== EM_S390_OLD
)
6895 && elf_header
.e_ident
[EI_CLASS
] == ELFCLASS64
)
6899 (archive_file_offset
6900 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
6901 sizeof nb
+ sizeof nc
)),
6904 error (_("Unable to seek to start of dynamic information"));
6908 if (fread (nb
, hash_ent_size
, 1, file
) != 1)
6910 error (_("Failed to read in number of buckets\n"));
6914 if (fread (nc
, hash_ent_size
, 1, file
) != 1)
6916 error (_("Failed to read in number of chains\n"));
6920 nbuckets
= byte_get (nb
, hash_ent_size
);
6921 nchains
= byte_get (nc
, hash_ent_size
);
6923 buckets
= get_dynamic_data (file
, nbuckets
, hash_ent_size
);
6924 chains
= get_dynamic_data (file
, nchains
, hash_ent_size
);
6926 if (buckets
== NULL
|| chains
== NULL
)
6931 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
6936 printf (_("\nSymbol table for image:\n"));
6938 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6940 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6942 for (hn
= 0; hn
< nbuckets
; hn
++)
6947 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
6949 Elf_Internal_Sym
*psym
;
6952 psym
= dynamic_symbols
+ si
;
6954 n
= print_vma (si
, DEC_5
);
6956 fputs (" " + n
, stdout
);
6957 printf (" %3lu: ", hn
);
6958 print_vma (psym
->st_value
, LONG_HEX
);
6960 print_vma (psym
->st_size
, DEC_5
);
6962 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6963 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
6964 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6965 /* Check to see if any other bits in the st_other field are set.
6966 Note - displaying this information disrupts the layout of the
6967 table being generated, but for the moment this case is very rare. */
6968 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
6969 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
6970 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
6971 if (VALID_DYNAMIC_NAME (psym
->st_name
))
6972 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
6974 printf (" <corrupt: %14ld>", psym
->st_name
);
6979 else if (do_syms
&& !do_using_dynamic
)
6983 for (i
= 0, section
= section_headers
;
6984 i
< elf_header
.e_shnum
;
6988 char *strtab
= NULL
;
6989 unsigned long int strtab_size
= 0;
6990 Elf_Internal_Sym
*symtab
;
6991 Elf_Internal_Sym
*psym
;
6994 if ( section
->sh_type
!= SHT_SYMTAB
6995 && section
->sh_type
!= SHT_DYNSYM
)
6998 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
6999 SECTION_NAME (section
),
7000 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
7002 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7004 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7006 symtab
= GET_ELF_SYMBOLS (file
, section
);
7010 if (section
->sh_link
== elf_header
.e_shstrndx
)
7012 strtab
= string_table
;
7013 strtab_size
= string_table_length
;
7015 else if (SECTION_HEADER_INDEX (section
->sh_link
) < elf_header
.e_shnum
)
7017 Elf_Internal_Shdr
*string_sec
;
7019 string_sec
= SECTION_HEADER (section
->sh_link
);
7021 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
7022 1, string_sec
->sh_size
, _("string table"));
7023 strtab_size
= strtab
!= NULL
? string_sec
->sh_size
: 0;
7026 for (si
= 0, psym
= symtab
;
7027 si
< section
->sh_size
/ section
->sh_entsize
;
7030 printf ("%6d: ", si
);
7031 print_vma (psym
->st_value
, LONG_HEX
);
7033 print_vma (psym
->st_size
, DEC_5
);
7034 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
7035 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
7036 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
7037 /* Check to see if any other bits in the st_other field are set.
7038 Note - displaying this information disrupts the layout of the
7039 table being generated, but for the moment this case is very rare. */
7040 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
7041 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
7042 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
7043 print_symbol (25, psym
->st_name
< strtab_size
7044 ? strtab
+ psym
->st_name
: "<corrupt>");
7046 if (section
->sh_type
== SHT_DYNSYM
&&
7047 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
7049 unsigned char data
[2];
7050 unsigned short vers_data
;
7051 unsigned long offset
;
7055 offset
= offset_from_vma
7056 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
7057 sizeof data
+ si
* sizeof (vers_data
));
7059 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
7060 sizeof (data
), 1, _("version data"));
7062 vers_data
= byte_get (data
, 2);
7064 is_nobits
= (SECTION_HEADER_INDEX (psym
->st_shndx
)
7065 < elf_header
.e_shnum
7066 && SECTION_HEADER (psym
->st_shndx
)->sh_type
7069 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
7071 if ((vers_data
& 0x8000) || vers_data
> 1)
7073 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
7074 && (is_nobits
|| ! check_def
))
7076 Elf_External_Verneed evn
;
7077 Elf_Internal_Verneed ivn
;
7078 Elf_Internal_Vernaux ivna
;
7080 /* We must test both. */
7081 offset
= offset_from_vma
7082 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
7087 unsigned long vna_off
;
7089 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
7092 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
7093 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
7095 vna_off
= offset
+ ivn
.vn_aux
;
7099 Elf_External_Vernaux evna
;
7101 get_data (&evna
, file
, vna_off
,
7103 _("version need aux (3)"));
7105 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
7106 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
7107 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
7109 vna_off
+= ivna
.vna_next
;
7111 while (ivna
.vna_other
!= vers_data
7112 && ivna
.vna_next
!= 0);
7114 if (ivna
.vna_other
== vers_data
)
7117 offset
+= ivn
.vn_next
;
7119 while (ivn
.vn_next
!= 0);
7121 if (ivna
.vna_other
== vers_data
)
7124 ivna
.vna_name
< strtab_size
7125 ? strtab
+ ivna
.vna_name
: "<corrupt>",
7129 else if (! is_nobits
)
7130 error (_("bad dynamic symbol"));
7137 if (vers_data
!= 0x8001
7138 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
7140 Elf_Internal_Verdef ivd
;
7141 Elf_Internal_Verdaux ivda
;
7142 Elf_External_Verdaux evda
;
7143 unsigned long offset
;
7145 offset
= offset_from_vma
7147 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
7148 sizeof (Elf_External_Verdef
));
7152 Elf_External_Verdef evd
;
7154 get_data (&evd
, file
, offset
, sizeof (evd
),
7155 1, _("version def"));
7157 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
7158 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
7159 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
7161 offset
+= ivd
.vd_next
;
7163 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
7164 && ivd
.vd_next
!= 0);
7166 offset
-= ivd
.vd_next
;
7167 offset
+= ivd
.vd_aux
;
7169 get_data (&evda
, file
, offset
, sizeof (evda
),
7170 1, _("version def aux"));
7172 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
7174 if (psym
->st_name
!= ivda
.vda_name
)
7175 printf ((vers_data
& 0x8000)
7177 ivda
.vda_name
< strtab_size
7178 ? strtab
+ ivda
.vda_name
: "<corrupt>");
7188 if (strtab
!= string_table
)
7194 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
7196 if (do_histogram
&& buckets
!= NULL
)
7198 unsigned long *lengths
;
7199 unsigned long *counts
;
7202 unsigned long maxlength
= 0;
7203 unsigned long nzero_counts
= 0;
7204 unsigned long nsyms
= 0;
7206 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
7207 (unsigned long) nbuckets
);
7208 printf (_(" Length Number %% of total Coverage\n"));
7210 lengths
= calloc (nbuckets
, sizeof (*lengths
));
7211 if (lengths
== NULL
)
7213 error (_("Out of memory"));
7216 for (hn
= 0; hn
< nbuckets
; ++hn
)
7218 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
7221 if (maxlength
< ++lengths
[hn
])
7226 counts
= calloc (maxlength
+ 1, sizeof (*counts
));
7229 error (_("Out of memory"));
7233 for (hn
= 0; hn
< nbuckets
; ++hn
)
7234 ++counts
[lengths
[hn
]];
7239 printf (" 0 %-10lu (%5.1f%%)\n",
7240 counts
[0], (counts
[0] * 100.0) / nbuckets
);
7241 for (i
= 1; i
<= maxlength
; ++i
)
7243 nzero_counts
+= counts
[i
] * i
;
7244 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7245 i
, counts
[i
], (counts
[i
] * 100.0) / nbuckets
,
7246 (nzero_counts
* 100.0) / nsyms
);
7254 if (buckets
!= NULL
)
7264 process_syminfo (FILE *file ATTRIBUTE_UNUSED
)
7268 if (dynamic_syminfo
== NULL
7270 /* No syminfo, this is ok. */
7273 /* There better should be a dynamic symbol section. */
7274 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
7278 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
7279 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
7281 printf (_(" Num: Name BoundTo Flags\n"));
7282 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
7284 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
7286 printf ("%4d: ", i
);
7287 if (VALID_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
))
7288 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
));
7290 printf ("<corrupt: %19ld>", dynamic_symbols
[i
].st_name
);
7293 switch (dynamic_syminfo
[i
].si_boundto
)
7295 case SYMINFO_BT_SELF
:
7296 fputs ("SELF ", stdout
);
7298 case SYMINFO_BT_PARENT
:
7299 fputs ("PARENT ", stdout
);
7302 if (dynamic_syminfo
[i
].si_boundto
> 0
7303 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
7304 && VALID_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
7306 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
7310 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
7314 if (flags
& SYMINFO_FLG_DIRECT
)
7316 if (flags
& SYMINFO_FLG_PASSTHRU
)
7317 printf (" PASSTHRU");
7318 if (flags
& SYMINFO_FLG_COPY
)
7320 if (flags
& SYMINFO_FLG_LAZYLOAD
)
7321 printf (" LAZYLOAD");
7329 #ifdef SUPPORT_DISASSEMBLY
7331 disassemble_section (Elf_Internal_Shdr
*section
, FILE *file
)
7333 printf (_("\nAssembly dump of section %s\n"),
7334 SECTION_NAME (section
));
7336 /* XXX -- to be done --- XXX */
7343 dump_section (Elf_Internal_Shdr
*section
, FILE *file
)
7345 bfd_size_type bytes
;
7347 unsigned char *data
;
7348 unsigned char *start
;
7350 bytes
= section
->sh_size
;
7352 if (bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
7354 printf (_("\nSection '%s' has no data to dump.\n"),
7355 SECTION_NAME (section
));
7359 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
7361 addr
= section
->sh_addr
;
7363 start
= get_data (NULL
, file
, section
->sh_offset
, 1, bytes
,
7376 lbytes
= (bytes
> 16 ? 16 : bytes
);
7378 printf (" 0x%8.8lx ", (unsigned long) addr
);
7380 switch (elf_header
.e_ident
[EI_DATA
])
7384 for (j
= 15; j
>= 0; j
--)
7387 printf ("%2.2x", data
[j
]);
7397 for (j
= 0; j
< 16; j
++)
7400 printf ("%2.2x", data
[j
]);
7410 for (j
= 0; j
< lbytes
; j
++)
7413 if (k
>= ' ' && k
< 0x7f)
7431 /* Apply addends of RELA relocations. */
7434 debug_apply_rela_addends (void *file
,
7435 Elf_Internal_Shdr
*section
,
7436 unsigned char *start
)
7438 Elf_Internal_Shdr
*relsec
;
7439 unsigned char *end
= start
+ section
->sh_size
;
7440 /* FIXME: The relocation field size is relocation type dependent. */
7441 unsigned int reloc_size
= 4;
7443 if (!is_relocatable
)
7446 if (section
->sh_size
< reloc_size
)
7449 for (relsec
= section_headers
;
7450 relsec
< section_headers
+ elf_header
.e_shnum
;
7453 unsigned long nrelas
;
7454 Elf_Internal_Rela
*rela
, *rp
;
7455 Elf_Internal_Shdr
*symsec
;
7456 Elf_Internal_Sym
*symtab
;
7457 Elf_Internal_Sym
*sym
;
7459 if (relsec
->sh_type
!= SHT_RELA
7460 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
7461 || SECTION_HEADER (relsec
->sh_info
) != section
7462 || relsec
->sh_size
== 0
7463 || SECTION_HEADER_INDEX (relsec
->sh_link
) >= elf_header
.e_shnum
)
7466 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
7470 symsec
= SECTION_HEADER (relsec
->sh_link
);
7471 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
7473 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
7477 loc
= start
+ rp
->r_offset
;
7478 if ((loc
+ reloc_size
) > end
)
7480 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
7481 (unsigned long) rp
->r_offset
,
7482 SECTION_NAME (section
));
7488 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
7490 if (ELF32_R_SYM (rp
->r_info
) != 0
7491 && ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
7492 /* Relocations against object symbols can happen,
7493 eg when referencing a global array. For an
7494 example of this see the _clz.o binary in libgcc.a. */
7495 && ELF32_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
7497 warn (_("skipping unexpected symbol type %s in relocation in section .rela%s\n"),
7498 get_symbol_type (ELF32_ST_TYPE (sym
->st_info
)),
7499 SECTION_NAME (section
));
7505 /* In MIPS little-endian objects, r_info isn't really a
7506 64-bit little-endian value: it has a 32-bit little-endian
7507 symbol index followed by four individual byte fields.
7508 Reorder INFO accordingly. */
7509 if (elf_header
.e_machine
== EM_MIPS
7510 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
7511 rp
->r_info
= (((rp
->r_info
& 0xffffffff) << 32)
7512 | ((rp
->r_info
>> 56) & 0xff)
7513 | ((rp
->r_info
>> 40) & 0xff00)
7514 | ((rp
->r_info
>> 24) & 0xff0000)
7515 | ((rp
->r_info
>> 8) & 0xff000000));
7517 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
7519 if (ELF64_R_SYM (rp
->r_info
) != 0
7520 && ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
7521 && ELF64_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
7523 warn (_("skipping unexpected symbol type %s in relocation in section .rela.%s\n"),
7524 get_symbol_type (ELF64_ST_TYPE (sym
->st_info
)),
7525 SECTION_NAME (section
));
7530 byte_put (loc
, rp
->r_addend
, reloc_size
);
7541 load_debug_section (enum dwarf_section_display_enum debug
, void *file
)
7543 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
7544 Elf_Internal_Shdr
*sec
;
7547 /* If it is already loaded, do nothing. */
7548 if (section
->start
!= NULL
)
7551 /* Locate the debug section. */
7552 sec
= find_section (section
->name
);
7556 snprintf (buf
, sizeof (buf
), _("%s section data"), section
->name
);
7557 section
->address
= sec
->sh_addr
;
7558 section
->size
= sec
->sh_size
;
7559 section
->start
= get_data (NULL
, file
, sec
->sh_offset
, 1,
7562 if (debug_displays
[debug
].relocate
)
7563 debug_apply_rela_addends (file
, sec
, section
->start
);
7565 return section
->start
!= NULL
;
7569 free_debug_section (enum dwarf_section_display_enum debug
)
7571 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
7573 if (section
->start
== NULL
)
7576 free ((char *) section
->start
);
7577 section
->start
= NULL
;
7578 section
->address
= 0;
7583 display_debug_section (Elf_Internal_Shdr
*section
, FILE *file
)
7585 char *name
= SECTION_NAME (section
);
7586 bfd_size_type length
;
7588 enum dwarf_section_display_enum i
;
7590 length
= section
->sh_size
;
7593 printf (_("\nSection '%s' has no debugging data.\n"), name
);
7597 if (strneq (name
, ".gnu.linkonce.wi.", 17))
7598 name
= ".debug_info";
7600 /* See if we know how to display the contents of this section. */
7601 for (i
= 0; i
< max
; i
++)
7602 if (streq (debug_displays
[i
].section
.name
, name
))
7604 struct dwarf_section
*sec
= &debug_displays
[i
].section
;
7606 if (load_debug_section (i
, file
))
7608 result
&= debug_displays
[i
].display (sec
, file
);
7610 if (i
!= info
&& i
!= abbrev
)
7611 free_debug_section (i
);
7619 printf (_("Unrecognized debug section: %s\n"), name
);
7626 /* Set DUMP_SECTS for all sections where dumps were requested
7627 based on section name. */
7630 initialise_dumps_byname (void)
7632 struct dump_list_entry
*cur
;
7634 for (cur
= dump_sects_byname
; cur
; cur
= cur
->next
)
7639 for (i
= 0, any
= 0; i
< elf_header
.e_shnum
; i
++)
7640 if (streq (SECTION_NAME (section_headers
+ i
), cur
->name
))
7642 request_dump (i
, cur
->type
);
7647 warn (_("Section '%s' was not dumped because it does not exist!\n"),
7653 process_section_contents (FILE *file
)
7655 Elf_Internal_Shdr
*section
;
7661 initialise_dumps_byname ();
7663 for (i
= 0, section
= section_headers
;
7664 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
7667 #ifdef SUPPORT_DISASSEMBLY
7668 if (dump_sects
[i
] & DISASS_DUMP
)
7669 disassemble_section (section
, file
);
7671 if (dump_sects
[i
] & HEX_DUMP
)
7672 dump_section (section
, file
);
7674 if (dump_sects
[i
] & DEBUG_DUMP
)
7675 display_debug_section (section
, file
);
7678 /* Check to see if the user requested a
7679 dump of a section that does not exist. */
7680 while (i
++ < num_dump_sects
)
7682 warn (_("Section %d was not dumped because it does not exist!\n"), i
);
7686 process_mips_fpe_exception (int mask
)
7691 if (mask
& OEX_FPU_INEX
)
7692 fputs ("INEX", stdout
), first
= 0;
7693 if (mask
& OEX_FPU_UFLO
)
7694 printf ("%sUFLO", first
? "" : "|"), first
= 0;
7695 if (mask
& OEX_FPU_OFLO
)
7696 printf ("%sOFLO", first
? "" : "|"), first
= 0;
7697 if (mask
& OEX_FPU_DIV0
)
7698 printf ("%sDIV0", first
? "" : "|"), first
= 0;
7699 if (mask
& OEX_FPU_INVAL
)
7700 printf ("%sINVAL", first
? "" : "|");
7703 fputs ("0", stdout
);
7706 /* ARM EABI attributes section. */
7711 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
7714 } arm_attr_public_tag
;
7716 static const char *arm_attr_tag_CPU_arch
[] =
7717 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
7719 static const char *arm_attr_tag_ARM_ISA_use
[] = {"No", "Yes"};
7720 static const char *arm_attr_tag_THUMB_ISA_use
[] =
7721 {"No", "Thumb-1", "Thumb-2"};
7722 static const char *arm_attr_tag_VFP_arch
[] = {"No", "VFPv1", "VFPv2"};
7723 static const char *arm_attr_tag_WMMX_arch
[] = {"No", "WMMXv1"};
7724 static const char *arm_attr_tag_NEON_arch
[] = {"No", "NEONv1"};
7725 static const char *arm_attr_tag_ABI_PCS_config
[] =
7726 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
7727 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
7728 static const char *arm_attr_tag_ABI_PCS_R9_use
[] =
7729 {"V6", "SB", "TLS", "Unused"};
7730 static const char *arm_attr_tag_ABI_PCS_RW_data
[] =
7731 {"Absolute", "PC-relative", "SB-relative", "None"};
7732 static const char *arm_attr_tag_ABI_PCS_RO_DATA
[] =
7733 {"Absolute", "PC-relative", "None"};
7734 static const char *arm_attr_tag_ABI_PCS_GOT_use
[] =
7735 {"None", "direct", "GOT-indirect"};
7736 static const char *arm_attr_tag_ABI_PCS_wchar_t
[] =
7737 {"None", "??? 1", "2", "??? 3", "4"};
7738 static const char *arm_attr_tag_ABI_FP_rounding
[] = {"Unused", "Needed"};
7739 static const char *arm_attr_tag_ABI_FP_denormal
[] = {"Unused", "Needed"};
7740 static const char *arm_attr_tag_ABI_FP_exceptions
[] = {"Unused", "Needed"};
7741 static const char *arm_attr_tag_ABI_FP_user_exceptions
[] = {"Unused", "Needed"};
7742 static const char *arm_attr_tag_ABI_FP_number_model
[] =
7743 {"Unused", "Finite", "RTABI", "IEEE 754"};
7744 static const char *arm_attr_tag_ABI_align8_needed
[] = {"No", "Yes", "4-byte"};
7745 static const char *arm_attr_tag_ABI_align8_preserved
[] =
7746 {"No", "Yes, except leaf SP", "Yes"};
7747 static const char *arm_attr_tag_ABI_enum_size
[] =
7748 {"Unused", "small", "int", "forced to int"};
7749 static const char *arm_attr_tag_ABI_HardFP_use
[] =
7750 {"As Tag_VFP_arch", "SP only", "DP only", "SP and DP"};
7751 static const char *arm_attr_tag_ABI_VFP_args
[] =
7752 {"AAPCS", "VFP registers", "custom"};
7753 static const char *arm_attr_tag_ABI_WMMX_args
[] =
7754 {"AAPCS", "WMMX registers", "custom"};
7755 static const char *arm_attr_tag_ABI_optimization_goals
[] =
7756 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
7757 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
7758 static const char *arm_attr_tag_ABI_FP_optimization_goals
[] =
7759 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
7760 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
7762 #define LOOKUP(id, name) \
7763 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
7764 static arm_attr_public_tag arm_attr_public_tags
[] =
7766 {4, "CPU_raw_name", 1, NULL
},
7767 {5, "CPU_name", 1, NULL
},
7768 LOOKUP(6, CPU_arch
),
7769 {7, "CPU_arch_profile", 0, NULL
},
7770 LOOKUP(8, ARM_ISA_use
),
7771 LOOKUP(9, THUMB_ISA_use
),
7772 LOOKUP(10, VFP_arch
),
7773 LOOKUP(11, WMMX_arch
),
7774 LOOKUP(12, NEON_arch
),
7775 LOOKUP(13, ABI_PCS_config
),
7776 LOOKUP(14, ABI_PCS_R9_use
),
7777 LOOKUP(15, ABI_PCS_RW_data
),
7778 LOOKUP(16, ABI_PCS_RO_DATA
),
7779 LOOKUP(17, ABI_PCS_GOT_use
),
7780 LOOKUP(18, ABI_PCS_wchar_t
),
7781 LOOKUP(19, ABI_FP_rounding
),
7782 LOOKUP(20, ABI_FP_denormal
),
7783 LOOKUP(21, ABI_FP_exceptions
),
7784 LOOKUP(22, ABI_FP_user_exceptions
),
7785 LOOKUP(23, ABI_FP_number_model
),
7786 LOOKUP(24, ABI_align8_needed
),
7787 LOOKUP(25, ABI_align8_preserved
),
7788 LOOKUP(26, ABI_enum_size
),
7789 LOOKUP(27, ABI_HardFP_use
),
7790 LOOKUP(28, ABI_VFP_args
),
7791 LOOKUP(29, ABI_WMMX_args
),
7792 LOOKUP(30, ABI_optimization_goals
),
7793 LOOKUP(31, ABI_FP_optimization_goals
),
7794 {32, "compatibility", 0, NULL
}
7798 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
7801 read_uleb128 (unsigned char *p
, unsigned int *plen
)
7815 val
|= ((unsigned int)c
& 0x7f) << shift
;
7824 static unsigned char *
7825 display_arm_attribute (unsigned char *p
)
7830 arm_attr_public_tag
*attr
;
7834 tag
= read_uleb128 (p
, &len
);
7837 for (i
= 0; i
< ARRAY_SIZE(arm_attr_public_tags
); i
++)
7839 if (arm_attr_public_tags
[i
].tag
== tag
)
7841 attr
= &arm_attr_public_tags
[i
];
7848 printf (" Tag_%s: ", attr
->name
);
7854 case 7: /* Tag_CPU_arch_profile. */
7855 val
= read_uleb128 (p
, &len
);
7859 case 0: printf ("None\n"); break;
7860 case 'A': printf ("Application\n"); break;
7861 case 'R': printf ("Realtime\n"); break;
7862 case 'M': printf ("Microcontroller\n"); break;
7863 default: printf ("??? (%d)\n", val
); break;
7867 case 32: /* Tag_compatibility. */
7868 val
= read_uleb128 (p
, &len
);
7870 printf ("flag = %d, vendor = %s\n", val
, p
);
7871 p
+= strlen((char *)p
) + 1;
7885 assert (attr
->type
& 0x80);
7886 val
= read_uleb128 (p
, &len
);
7888 type
= attr
->type
& 0x7f;
7890 printf ("??? (%d)\n", val
);
7892 printf ("%s\n", attr
->table
[val
]);
7899 type
= 1; /* String. */
7901 type
= 2; /* uleb128. */
7902 printf (" Tag_unknown_%d: ", tag
);
7907 printf ("\"%s\"\n", p
);
7908 p
+= strlen((char *)p
) + 1;
7912 val
= read_uleb128 (p
, &len
);
7914 printf ("%d (0x%x)\n", val
, val
);
7921 process_arm_specific (FILE *file
)
7923 Elf_Internal_Shdr
*sect
;
7924 unsigned char *contents
;
7927 bfd_vma section_len
;
7931 /* Find the section header so that we get the size. */
7932 for (i
= 0, sect
= section_headers
;
7933 i
< elf_header
.e_shnum
;
7936 if (sect
->sh_type
!= SHT_ARM_ATTRIBUTES
)
7939 contents
= get_data (NULL
, file
, sect
->sh_offset
, 1, sect
->sh_size
,
7947 len
= sect
->sh_size
- 1;
7952 bfd_boolean public_section
;
7954 section_len
= byte_get (p
, 4);
7956 if (section_len
> len
)
7958 printf (_("ERROR: Bad section length (%d > %d)\n"),
7959 (int)section_len
, (int)len
);
7963 printf ("Attribute Section: %s\n", p
);
7964 if (strcmp ((char *)p
, "aeabi") == 0)
7965 public_section
= TRUE
;
7967 public_section
= FALSE
;
7968 namelen
= strlen ((char *)p
) + 1;
7970 section_len
-= namelen
+ 4;
7971 while (section_len
> 0)
7976 size
= byte_get (p
, 4);
7977 if (size
> section_len
)
7979 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
7980 (int)size
, (int)section_len
);
7983 section_len
-= size
;
7989 printf ("File Attributes\n");
7992 printf ("Section Attributes:");
7995 printf ("Symbol Attributes:");
8000 val
= read_uleb128 (p
, &i
);
8004 printf (" %d", val
);
8009 printf ("Unknown tag: %d\n", tag
);
8010 public_section
= FALSE
;
8016 p
= display_arm_attribute(p
);
8020 /* ??? Do something sensible, like dump hex. */
8021 printf (" Unknown section contexts\n");
8029 printf (_("Unknown format '%c'\n"), *p
);
8038 process_mips_specific (FILE *file
)
8040 Elf_Internal_Dyn
*entry
;
8041 size_t liblist_offset
= 0;
8042 size_t liblistno
= 0;
8043 size_t conflictsno
= 0;
8044 size_t options_offset
= 0;
8045 size_t conflicts_offset
= 0;
8047 /* We have a lot of special sections. Thanks SGI! */
8048 if (dynamic_section
== NULL
)
8049 /* No information available. */
8052 for (entry
= dynamic_section
; entry
->d_tag
!= DT_NULL
; ++entry
)
8053 switch (entry
->d_tag
)
8055 case DT_MIPS_LIBLIST
:
8057 = offset_from_vma (file
, entry
->d_un
.d_val
,
8058 liblistno
* sizeof (Elf32_External_Lib
));
8060 case DT_MIPS_LIBLISTNO
:
8061 liblistno
= entry
->d_un
.d_val
;
8063 case DT_MIPS_OPTIONS
:
8064 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
8066 case DT_MIPS_CONFLICT
:
8068 = offset_from_vma (file
, entry
->d_un
.d_val
,
8069 conflictsno
* sizeof (Elf32_External_Conflict
));
8071 case DT_MIPS_CONFLICTNO
:
8072 conflictsno
= entry
->d_un
.d_val
;
8078 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
8080 Elf32_External_Lib
*elib
;
8083 elib
= get_data (NULL
, file
, liblist_offset
,
8084 liblistno
, sizeof (Elf32_External_Lib
),
8088 printf ("\nSection '.liblist' contains %lu entries:\n",
8089 (unsigned long) liblistno
);
8090 fputs (" Library Time Stamp Checksum Version Flags\n",
8093 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
8100 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
8101 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
8102 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
8103 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
8104 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
8106 tmp
= gmtime (&time
);
8107 snprintf (timebuf
, sizeof (timebuf
),
8108 "%04u-%02u-%02uT%02u:%02u:%02u",
8109 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
8110 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
8112 printf ("%3lu: ", (unsigned long) cnt
);
8113 if (VALID_DYNAMIC_NAME (liblist
.l_name
))
8114 print_symbol (20, GET_DYNAMIC_NAME (liblist
.l_name
));
8116 printf ("<corrupt: %9ld>", liblist
.l_name
);
8117 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
8120 if (liblist
.l_flags
== 0)
8131 { " EXACT_MATCH", LL_EXACT_MATCH
},
8132 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
8133 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
8134 { " EXPORTS", LL_EXPORTS
},
8135 { " DELAY_LOAD", LL_DELAY_LOAD
},
8136 { " DELTA", LL_DELTA
}
8138 int flags
= liblist
.l_flags
;
8142 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
8144 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
8146 fputs (l_flags_vals
[fcnt
].name
, stdout
);
8147 flags
^= l_flags_vals
[fcnt
].bit
;
8150 printf (" %#x", (unsigned int) flags
);
8160 if (options_offset
!= 0)
8162 Elf_External_Options
*eopt
;
8163 Elf_Internal_Shdr
*sect
= section_headers
;
8164 Elf_Internal_Options
*iopt
;
8165 Elf_Internal_Options
*option
;
8169 /* Find the section header so that we get the size. */
8170 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
8173 eopt
= get_data (NULL
, file
, options_offset
, 1, sect
->sh_size
,
8177 iopt
= cmalloc ((sect
->sh_size
/ sizeof (eopt
)), sizeof (*iopt
));
8180 error (_("Out of memory"));
8187 while (offset
< sect
->sh_size
)
8189 Elf_External_Options
*eoption
;
8191 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
8193 option
->kind
= BYTE_GET (eoption
->kind
);
8194 option
->size
= BYTE_GET (eoption
->size
);
8195 option
->section
= BYTE_GET (eoption
->section
);
8196 option
->info
= BYTE_GET (eoption
->info
);
8198 offset
+= option
->size
;
8204 printf (_("\nSection '%s' contains %d entries:\n"),
8205 SECTION_NAME (sect
), cnt
);
8213 switch (option
->kind
)
8216 /* This shouldn't happen. */
8217 printf (" NULL %d %lx", option
->section
, option
->info
);
8220 printf (" REGINFO ");
8221 if (elf_header
.e_machine
== EM_MIPS
)
8224 Elf32_External_RegInfo
*ereg
;
8225 Elf32_RegInfo reginfo
;
8227 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
8228 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8229 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8230 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8231 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8232 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8233 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
8235 printf ("GPR %08lx GP 0x%lx\n",
8237 (unsigned long) reginfo
.ri_gp_value
);
8238 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8239 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8240 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8245 Elf64_External_RegInfo
*ereg
;
8246 Elf64_Internal_RegInfo reginfo
;
8248 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
8249 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8250 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8251 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8252 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8253 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8254 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
8256 printf ("GPR %08lx GP 0x",
8257 reginfo
.ri_gprmask
);
8258 printf_vma (reginfo
.ri_gp_value
);
8261 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8262 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8263 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8267 case ODK_EXCEPTIONS
:
8268 fputs (" EXCEPTIONS fpe_min(", stdout
);
8269 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
8270 fputs (") fpe_max(", stdout
);
8271 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
8272 fputs (")", stdout
);
8274 if (option
->info
& OEX_PAGE0
)
8275 fputs (" PAGE0", stdout
);
8276 if (option
->info
& OEX_SMM
)
8277 fputs (" SMM", stdout
);
8278 if (option
->info
& OEX_FPDBUG
)
8279 fputs (" FPDBUG", stdout
);
8280 if (option
->info
& OEX_DISMISS
)
8281 fputs (" DISMISS", stdout
);
8284 fputs (" PAD ", stdout
);
8285 if (option
->info
& OPAD_PREFIX
)
8286 fputs (" PREFIX", stdout
);
8287 if (option
->info
& OPAD_POSTFIX
)
8288 fputs (" POSTFIX", stdout
);
8289 if (option
->info
& OPAD_SYMBOL
)
8290 fputs (" SYMBOL", stdout
);
8293 fputs (" HWPATCH ", stdout
);
8294 if (option
->info
& OHW_R4KEOP
)
8295 fputs (" R4KEOP", stdout
);
8296 if (option
->info
& OHW_R8KPFETCH
)
8297 fputs (" R8KPFETCH", stdout
);
8298 if (option
->info
& OHW_R5KEOP
)
8299 fputs (" R5KEOP", stdout
);
8300 if (option
->info
& OHW_R5KCVTL
)
8301 fputs (" R5KCVTL", stdout
);
8304 fputs (" FILL ", stdout
);
8305 /* XXX Print content of info word? */
8308 fputs (" TAGS ", stdout
);
8309 /* XXX Print content of info word? */
8312 fputs (" HWAND ", stdout
);
8313 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8314 fputs (" R4KEOP_CHECKED", stdout
);
8315 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8316 fputs (" R4KEOP_CLEAN", stdout
);
8319 fputs (" HWOR ", 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 printf (" GP_GROUP %#06lx self-contained %#06lx",
8327 option
->info
& OGP_GROUP
,
8328 (option
->info
& OGP_SELF
) >> 16);
8331 printf (" IDENT %#06lx self-contained %#06lx",
8332 option
->info
& OGP_GROUP
,
8333 (option
->info
& OGP_SELF
) >> 16);
8336 /* This shouldn't happen. */
8337 printf (" %3d ??? %d %lx",
8338 option
->kind
, option
->section
, option
->info
);
8342 len
= sizeof (*eopt
);
8343 while (len
< option
->size
)
8344 if (((char *) option
)[len
] >= ' '
8345 && ((char *) option
)[len
] < 0x7f)
8346 printf ("%c", ((char *) option
)[len
++]);
8348 printf ("\\%03o", ((char *) option
)[len
++]);
8350 fputs ("\n", stdout
);
8358 if (conflicts_offset
!= 0 && conflictsno
!= 0)
8360 Elf32_Conflict
*iconf
;
8363 if (dynamic_symbols
== NULL
)
8365 error (_("conflict list found without a dynamic symbol table"));
8369 iconf
= cmalloc (conflictsno
, sizeof (*iconf
));
8372 error (_("Out of memory"));
8378 Elf32_External_Conflict
*econf32
;
8380 econf32
= get_data (NULL
, file
, conflicts_offset
,
8381 conflictsno
, sizeof (*econf32
), _("conflict"));
8385 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8386 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
8392 Elf64_External_Conflict
*econf64
;
8394 econf64
= get_data (NULL
, file
, conflicts_offset
,
8395 conflictsno
, sizeof (*econf64
), _("conflict"));
8399 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8400 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
8405 printf (_("\nSection '.conflict' contains %lu entries:\n"),
8406 (unsigned long) conflictsno
);
8407 puts (_(" Num: Index Value Name"));
8409 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8411 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
8413 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
8414 print_vma (psym
->st_value
, FULL_HEX
);
8416 if (VALID_DYNAMIC_NAME (psym
->st_name
))
8417 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
8419 printf ("<corrupt: %14ld>", psym
->st_name
);
8430 process_gnu_liblist (FILE *file
)
8432 Elf_Internal_Shdr
*section
, *string_sec
;
8433 Elf32_External_Lib
*elib
;
8442 for (i
= 0, section
= section_headers
;
8443 i
< elf_header
.e_shnum
;
8446 switch (section
->sh_type
)
8448 case SHT_GNU_LIBLIST
:
8449 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
)
8452 elib
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
8457 string_sec
= SECTION_HEADER (section
->sh_link
);
8459 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
8460 string_sec
->sh_size
, _("liblist string table"));
8461 strtab_size
= string_sec
->sh_size
;
8464 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
8470 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
8471 SECTION_NAME (section
),
8472 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
8474 puts (" Library Time Stamp Checksum Version Flags");
8476 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
8484 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
8485 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
8486 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
8487 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
8488 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
8490 tmp
= gmtime (&time
);
8491 snprintf (timebuf
, sizeof (timebuf
),
8492 "%04u-%02u-%02uT%02u:%02u:%02u",
8493 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
8494 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
8496 printf ("%3lu: ", (unsigned long) cnt
);
8498 printf ("%-20s", liblist
.l_name
< strtab_size
8499 ? strtab
+ liblist
.l_name
: "<corrupt>");
8501 printf ("%-20.20s", liblist
.l_name
< strtab_size
8502 ? strtab
+ liblist
.l_name
: "<corrupt>");
8503 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
8504 liblist
.l_version
, liblist
.l_flags
);
8515 get_note_type (unsigned e_type
)
8517 static char buff
[64];
8519 if (elf_header
.e_type
== ET_CORE
)
8523 return _("NT_AUXV (auxiliary vector)");
8525 return _("NT_PRSTATUS (prstatus structure)");
8527 return _("NT_FPREGSET (floating point registers)");
8529 return _("NT_PRPSINFO (prpsinfo structure)");
8531 return _("NT_TASKSTRUCT (task structure)");
8533 return _("NT_PRXFPREG (user_xfpregs structure)");
8535 return _("NT_PSTATUS (pstatus structure)");
8537 return _("NT_FPREGS (floating point registers)");
8539 return _("NT_PSINFO (psinfo structure)");
8541 return _("NT_LWPSTATUS (lwpstatus_t structure)");
8543 return _("NT_LWPSINFO (lwpsinfo_t structure)");
8544 case NT_WIN32PSTATUS
:
8545 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
8553 return _("NT_VERSION (version)");
8555 return _("NT_ARCH (architecture)");
8560 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
8565 get_netbsd_elfcore_note_type (unsigned e_type
)
8567 static char buff
[64];
8569 if (e_type
== NT_NETBSDCORE_PROCINFO
)
8571 /* NetBSD core "procinfo" structure. */
8572 return _("NetBSD procinfo structure");
8575 /* As of Jan 2002 there are no other machine-independent notes
8576 defined for NetBSD core files. If the note type is less
8577 than the start of the machine-dependent note types, we don't
8580 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
8582 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
8586 switch (elf_header
.e_machine
)
8588 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
8589 and PT_GETFPREGS == mach+2. */
8594 case EM_SPARC32PLUS
:
8598 case NT_NETBSDCORE_FIRSTMACH
+0:
8599 return _("PT_GETREGS (reg structure)");
8600 case NT_NETBSDCORE_FIRSTMACH
+2:
8601 return _("PT_GETFPREGS (fpreg structure)");
8607 /* On all other arch's, PT_GETREGS == mach+1 and
8608 PT_GETFPREGS == mach+3. */
8612 case NT_NETBSDCORE_FIRSTMACH
+1:
8613 return _("PT_GETREGS (reg structure)");
8614 case NT_NETBSDCORE_FIRSTMACH
+3:
8615 return _("PT_GETFPREGS (fpreg structure)");
8621 snprintf (buff
, sizeof (buff
), _("PT_FIRSTMACH+%d"),
8622 e_type
- NT_NETBSDCORE_FIRSTMACH
);
8626 /* Note that by the ELF standard, the name field is already null byte
8627 terminated, and namesz includes the terminating null byte.
8628 I.E. the value of namesz for the name "FSF" is 4.
8630 If the value of namesz is zero, there is no name present. */
8632 process_note (Elf_Internal_Note
*pnote
)
8636 if (pnote
->namesz
== 0)
8637 /* If there is no note name, then use the default set of
8638 note type strings. */
8639 nt
= get_note_type (pnote
->type
);
8641 else if (strneq (pnote
->namedata
, "NetBSD-CORE", 11))
8642 /* NetBSD-specific core file notes. */
8643 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
8646 /* Don't recognize this note name; just use the default set of
8647 note type strings. */
8648 nt
= get_note_type (pnote
->type
);
8650 printf (" %s\t\t0x%08lx\t%s\n",
8651 pnote
->namesz
? pnote
->namedata
: "(NONE)",
8658 process_corefile_note_segment (FILE *file
, bfd_vma offset
, bfd_vma length
)
8660 Elf_External_Note
*pnotes
;
8661 Elf_External_Note
*external
;
8667 pnotes
= get_data (NULL
, file
, offset
, 1, length
, _("notes"));
8673 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
8674 (unsigned long) offset
, (unsigned long) length
);
8675 printf (_(" Owner\t\tData size\tDescription\n"));
8677 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
8679 Elf_External_Note
*next
;
8680 Elf_Internal_Note inote
;
8683 inote
.type
= BYTE_GET (external
->type
);
8684 inote
.namesz
= BYTE_GET (external
->namesz
);
8685 inote
.namedata
= external
->name
;
8686 inote
.descsz
= BYTE_GET (external
->descsz
);
8687 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
8688 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
8690 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
8692 if (((char *) next
) > (((char *) pnotes
) + length
))
8694 warn (_("corrupt note found at offset %lx into core notes\n"),
8695 (long)((char *)external
- (char *)pnotes
));
8696 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
8697 inote
.type
, inote
.namesz
, inote
.descsz
);
8703 /* Verify that name is null terminated. It appears that at least
8704 one version of Linux (RedHat 6.0) generates corefiles that don't
8705 comply with the ELF spec by failing to include the null byte in
8707 if (inote
.namedata
[inote
.namesz
] != '\0')
8709 temp
= malloc (inote
.namesz
+ 1);
8713 error (_("Out of memory\n"));
8718 strncpy (temp
, inote
.namedata
, inote
.namesz
);
8719 temp
[inote
.namesz
] = 0;
8721 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
8722 inote
.namedata
= temp
;
8725 res
&= process_note (& inote
);
8740 process_corefile_note_segments (FILE *file
)
8742 Elf_Internal_Phdr
*segment
;
8746 if (! get_program_headers (file
))
8749 for (i
= 0, segment
= program_headers
;
8750 i
< elf_header
.e_phnum
;
8753 if (segment
->p_type
== PT_NOTE
)
8754 res
&= process_corefile_note_segment (file
,
8755 (bfd_vma
) segment
->p_offset
,
8756 (bfd_vma
) segment
->p_filesz
);
8763 process_note_sections (FILE *file
)
8765 Elf_Internal_Shdr
*section
;
8769 for (i
= 0, section
= section_headers
;
8770 i
< elf_header
.e_shnum
;
8772 if (section
->sh_type
== SHT_NOTE
)
8773 res
&= process_corefile_note_segment (file
,
8774 (bfd_vma
) section
->sh_offset
,
8775 (bfd_vma
) section
->sh_size
);
8781 process_notes (FILE *file
)
8783 /* If we have not been asked to display the notes then do nothing. */
8787 if (elf_header
.e_type
!= ET_CORE
)
8788 return process_note_sections (file
);
8790 /* No program headers means no NOTE segment. */
8791 if (elf_header
.e_phnum
> 0)
8792 return process_corefile_note_segments (file
);
8794 printf (_("No note segments present in the core file.\n"));
8799 process_arch_specific (FILE *file
)
8804 switch (elf_header
.e_machine
)
8807 return process_arm_specific (file
);
8809 case EM_MIPS_RS3_LE
:
8810 return process_mips_specific (file
);
8819 get_file_header (FILE *file
)
8821 /* Read in the identity array. */
8822 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
8825 /* Determine how to read the rest of the header. */
8826 switch (elf_header
.e_ident
[EI_DATA
])
8828 default: /* fall through */
8829 case ELFDATANONE
: /* fall through */
8831 byte_get
= byte_get_little_endian
;
8832 byte_put
= byte_put_little_endian
;
8835 byte_get
= byte_get_big_endian
;
8836 byte_put
= byte_put_big_endian
;
8840 /* For now we only support 32 bit and 64 bit ELF files. */
8841 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
8843 /* Read in the rest of the header. */
8846 Elf32_External_Ehdr ehdr32
;
8848 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
8851 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
8852 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
8853 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
8854 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
8855 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
8856 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
8857 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
8858 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
8859 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
8860 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
8861 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
8862 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
8863 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
8867 Elf64_External_Ehdr ehdr64
;
8869 /* If we have been compiled with sizeof (bfd_vma) == 4, then
8870 we will not be able to cope with the 64bit data found in
8871 64 ELF files. Detect this now and abort before we start
8872 overwriting things. */
8873 if (sizeof (bfd_vma
) < 8)
8875 error (_("This instance of readelf has been built without support for a\n\
8876 64 bit data type and so it cannot read 64 bit ELF files.\n"));
8880 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
8883 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
8884 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
8885 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
8886 elf_header
.e_entry
= BYTE_GET (ehdr64
.e_entry
);
8887 elf_header
.e_phoff
= BYTE_GET (ehdr64
.e_phoff
);
8888 elf_header
.e_shoff
= BYTE_GET (ehdr64
.e_shoff
);
8889 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
8890 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
8891 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
8892 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
8893 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
8894 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
8895 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
8898 if (elf_header
.e_shoff
)
8900 /* There may be some extensions in the first section header. Don't
8901 bomb if we can't read it. */
8903 get_32bit_section_headers (file
, 1);
8905 get_64bit_section_headers (file
, 1);
8908 is_relocatable
= elf_header
.e_type
== ET_REL
;
8913 /* Process one ELF object file according to the command line options.
8914 This file may actually be stored in an archive. The file is
8915 positioned at the start of the ELF object. */
8918 process_object (char *file_name
, FILE *file
)
8922 if (! get_file_header (file
))
8924 error (_("%s: Failed to read file header\n"), file_name
);
8928 /* Initialise per file variables. */
8929 for (i
= NUM_ELEM (version_info
); i
--;)
8930 version_info
[i
] = 0;
8932 for (i
= NUM_ELEM (dynamic_info
); i
--;)
8933 dynamic_info
[i
] = 0;
8935 /* Process the file. */
8937 printf (_("\nFile: %s\n"), file_name
);
8939 /* Initialise the dump_sects array from the cmdline_dump_sects array.
8940 Note we do this even if cmdline_dump_sects is empty because we
8941 must make sure that the dump_sets array is zeroed out before each
8942 object file is processed. */
8943 if (num_dump_sects
> num_cmdline_dump_sects
)
8944 memset (dump_sects
, 0, num_dump_sects
);
8946 if (num_cmdline_dump_sects
> 0)
8948 if (num_dump_sects
== 0)
8949 /* A sneaky way of allocating the dump_sects array. */
8950 request_dump (num_cmdline_dump_sects
, 0);
8952 assert (num_dump_sects
>= num_cmdline_dump_sects
);
8953 memcpy (dump_sects
, cmdline_dump_sects
, num_cmdline_dump_sects
);
8956 if (! process_file_header ())
8959 if (! process_section_headers (file
))
8961 /* Without loaded section headers we cannot process lots of
8963 do_unwind
= do_version
= do_dump
= do_arch
= 0;
8965 if (! do_using_dynamic
)
8966 do_syms
= do_reloc
= 0;
8969 if (! process_section_groups (file
))
8971 /* Without loaded section groups we cannot process unwind. */
8975 if (process_program_headers (file
))
8976 process_dynamic_section (file
);
8978 process_relocs (file
);
8980 process_unwind (file
);
8982 process_symbol_table (file
);
8984 process_syminfo (file
);
8986 process_version_sections (file
);
8988 process_section_contents (file
);
8990 process_notes (file
);
8992 process_gnu_liblist (file
);
8994 process_arch_specific (file
);
8996 if (program_headers
)
8998 free (program_headers
);
8999 program_headers
= NULL
;
9002 if (section_headers
)
9004 free (section_headers
);
9005 section_headers
= NULL
;
9010 free (string_table
);
9011 string_table
= NULL
;
9012 string_table_length
= 0;
9015 if (dynamic_strings
)
9017 free (dynamic_strings
);
9018 dynamic_strings
= NULL
;
9019 dynamic_strings_length
= 0;
9022 if (dynamic_symbols
)
9024 free (dynamic_symbols
);
9025 dynamic_symbols
= NULL
;
9026 num_dynamic_syms
= 0;
9029 if (dynamic_syminfo
)
9031 free (dynamic_syminfo
);
9032 dynamic_syminfo
= NULL
;
9035 if (section_headers_groups
)
9037 free (section_headers_groups
);
9038 section_headers_groups
= NULL
;
9043 struct group_list
*g
, *next
;
9045 for (i
= 0; i
< group_count
; i
++)
9047 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
9054 free (section_groups
);
9055 section_groups
= NULL
;
9058 free_debug_memory ();
9063 /* Process an ELF archive. The file is positioned just after the
9067 process_archive (char *file_name
, FILE *file
)
9069 struct ar_hdr arhdr
;
9072 char *longnames
= NULL
;
9073 unsigned long longnames_size
= 0;
9074 size_t file_name_size
;
9079 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
9080 if (got
!= sizeof arhdr
)
9085 error (_("%s: failed to read archive header\n"), file_name
);
9089 if (memcmp (arhdr
.ar_name
, "/ ", 16) == 0)
9091 /* This is the archive symbol table. Skip it.
9092 FIXME: We should have an option to dump it. */
9093 size
= strtoul (arhdr
.ar_size
, NULL
, 10);
9094 if (fseek (file
, size
+ (size
& 1), SEEK_CUR
) != 0)
9096 error (_("%s: failed to skip archive symbol table\n"), file_name
);
9100 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
9101 if (got
!= sizeof arhdr
)
9106 error (_("%s: failed to read archive header\n"), file_name
);
9111 if (memcmp (arhdr
.ar_name
, "// ", 16) == 0)
9113 /* This is the archive string table holding long member
9116 longnames_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
9118 longnames
= malloc (longnames_size
);
9119 if (longnames
== NULL
)
9121 error (_("Out of memory\n"));
9125 if (fread (longnames
, longnames_size
, 1, file
) != 1)
9128 error (_("%s: failed to read string table\n"), file_name
);
9132 if ((longnames_size
& 1) != 0)
9135 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
9136 if (got
!= sizeof arhdr
)
9143 error (_("%s: failed to read archive header\n"), file_name
);
9148 file_name_size
= strlen (file_name
);
9157 if (arhdr
.ar_name
[0] == '/')
9161 off
= strtoul (arhdr
.ar_name
+ 1, NULL
, 10);
9162 if (off
>= longnames_size
)
9164 error (_("%s: invalid archive string table offset %lu\n"), file_name
, off
);
9169 name
= longnames
+ off
;
9170 nameend
= memchr (name
, '/', longnames_size
- off
);
9174 name
= arhdr
.ar_name
;
9175 nameend
= memchr (name
, '/', 16);
9178 if (nameend
== NULL
)
9180 error (_("%s: bad archive file name\n"), file_name
);
9185 namealc
= malloc (file_name_size
+ (nameend
- name
) + 3);
9186 if (namealc
== NULL
)
9188 error (_("Out of memory\n"));
9193 memcpy (namealc
, file_name
, file_name_size
);
9194 namealc
[file_name_size
] = '(';
9195 memcpy (namealc
+ file_name_size
+ 1, name
, nameend
- name
);
9196 namealc
[file_name_size
+ 1 + (nameend
- name
)] = ')';
9197 namealc
[file_name_size
+ 2 + (nameend
- name
)] = '\0';
9199 archive_file_offset
= ftell (file
);
9200 archive_file_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
9202 ret
|= process_object (namealc
, file
);
9207 (archive_file_offset
9209 + (archive_file_size
& 1)),
9212 error (_("%s: failed to seek to next archive header\n"), file_name
);
9217 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
9218 if (got
!= sizeof arhdr
)
9223 error (_("%s: failed to read archive header\n"), file_name
);
9236 process_file (char *file_name
)
9239 struct stat statbuf
;
9243 if (stat (file_name
, &statbuf
) < 0)
9245 if (errno
== ENOENT
)
9246 error (_("'%s': No such file\n"), file_name
);
9248 error (_("Could not locate '%s'. System error message: %s\n"),
9249 file_name
, strerror (errno
));
9253 if (! S_ISREG (statbuf
.st_mode
))
9255 error (_("'%s' is not an ordinary file\n"), file_name
);
9259 file
= fopen (file_name
, "rb");
9262 error (_("Input file '%s' is not readable.\n"), file_name
);
9266 if (fread (armag
, SARMAG
, 1, file
) != 1)
9268 error (_("%s: Failed to read file header\n"), file_name
);
9273 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
9274 ret
= process_archive (file_name
, file
);
9278 archive_file_size
= archive_file_offset
= 0;
9279 ret
= process_object (file_name
, file
);
9287 #ifdef SUPPORT_DISASSEMBLY
9288 /* Needed by the i386 disassembler. For extra credit, someone could
9289 fix this so that we insert symbolic addresses here, esp for GOT/PLT
9293 print_address (unsigned int addr
, FILE *outfile
)
9295 fprintf (outfile
,"0x%8.8x", addr
);
9298 /* Needed by the i386 disassembler. */
9300 db_task_printsym (unsigned int addr
)
9302 print_address (addr
, stderr
);
9307 main (int argc
, char **argv
)
9311 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9312 setlocale (LC_MESSAGES
, "");
9314 #if defined (HAVE_SETLOCALE)
9315 setlocale (LC_CTYPE
, "");
9317 bindtextdomain (PACKAGE
, LOCALEDIR
);
9318 textdomain (PACKAGE
);
9320 expandargv (&argc
, &argv
);
9322 parse_args (argc
, argv
);
9324 if (num_dump_sects
> 0)
9326 /* Make a copy of the dump_sects array. */
9327 cmdline_dump_sects
= malloc (num_dump_sects
);
9328 if (cmdline_dump_sects
== NULL
)
9329 error (_("Out of memory allocating dump request table."));
9332 memcpy (cmdline_dump_sects
, dump_sects
, num_dump_sects
);
9333 num_cmdline_dump_sects
= num_dump_sects
;
9337 if (optind
< (argc
- 1))
9341 while (optind
< argc
)
9342 err
|= process_file (argv
[optind
++]);
9344 if (dump_sects
!= NULL
)
9346 if (cmdline_dump_sects
!= NULL
)
9347 free (cmdline_dump_sects
);