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";
1699 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_machine
);
1705 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
1710 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1711 e_flags
&= ~ EF_ARM_EABIMASK
;
1713 /* Handle "generic" ARM flags. */
1714 if (e_flags
& EF_ARM_RELEXEC
)
1716 strcat (buf
, ", relocatable executable");
1717 e_flags
&= ~ EF_ARM_RELEXEC
;
1720 if (e_flags
& EF_ARM_HASENTRY
)
1722 strcat (buf
, ", has entry point");
1723 e_flags
&= ~ EF_ARM_HASENTRY
;
1726 /* Now handle EABI specific flags. */
1730 strcat (buf
, ", <unrecognized EABI>");
1735 case EF_ARM_EABI_VER1
:
1736 strcat (buf
, ", Version1 EABI");
1741 /* Process flags one bit at a time. */
1742 flag
= e_flags
& - e_flags
;
1747 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1748 strcat (buf
, ", sorted symbol tables");
1758 case EF_ARM_EABI_VER2
:
1759 strcat (buf
, ", Version2 EABI");
1764 /* Process flags one bit at a time. */
1765 flag
= e_flags
& - e_flags
;
1770 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1771 strcat (buf
, ", sorted symbol tables");
1774 case EF_ARM_DYNSYMSUSESEGIDX
:
1775 strcat (buf
, ", dynamic symbols use segment index");
1778 case EF_ARM_MAPSYMSFIRST
:
1779 strcat (buf
, ", mapping symbols precede others");
1789 case EF_ARM_EABI_VER3
:
1790 strcat (buf
, ", Version3 EABI");
1793 case EF_ARM_EABI_VER4
:
1794 strcat (buf
, ", Version4 EABI");
1799 /* Process flags one bit at a time. */
1800 flag
= e_flags
& - e_flags
;
1806 strcat (buf
, ", BE8");
1810 strcat (buf
, ", LE8");
1820 case EF_ARM_EABI_UNKNOWN
:
1821 strcat (buf
, ", GNU EABI");
1826 /* Process flags one bit at a time. */
1827 flag
= e_flags
& - e_flags
;
1832 case EF_ARM_INTERWORK
:
1833 strcat (buf
, ", interworking enabled");
1836 case EF_ARM_APCS_26
:
1837 strcat (buf
, ", uses APCS/26");
1840 case EF_ARM_APCS_FLOAT
:
1841 strcat (buf
, ", uses APCS/float");
1845 strcat (buf
, ", position independent");
1849 strcat (buf
, ", 8 bit structure alignment");
1852 case EF_ARM_NEW_ABI
:
1853 strcat (buf
, ", uses new ABI");
1856 case EF_ARM_OLD_ABI
:
1857 strcat (buf
, ", uses old ABI");
1860 case EF_ARM_SOFT_FLOAT
:
1861 strcat (buf
, ", software FP");
1864 case EF_ARM_VFP_FLOAT
:
1865 strcat (buf
, ", VFP");
1868 case EF_ARM_MAVERICK_FLOAT
:
1869 strcat (buf
, ", Maverick FP");
1880 strcat (buf
,", <unknown>");
1884 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
1886 static char buf
[1024];
1898 decode_ARM_machine_flags (e_flags
, buf
);
1902 switch (e_flags
& EF_FRV_CPU_MASK
)
1904 case EF_FRV_CPU_GENERIC
:
1908 strcat (buf
, ", fr???");
1911 case EF_FRV_CPU_FR300
:
1912 strcat (buf
, ", fr300");
1915 case EF_FRV_CPU_FR400
:
1916 strcat (buf
, ", fr400");
1918 case EF_FRV_CPU_FR405
:
1919 strcat (buf
, ", fr405");
1922 case EF_FRV_CPU_FR450
:
1923 strcat (buf
, ", fr450");
1926 case EF_FRV_CPU_FR500
:
1927 strcat (buf
, ", fr500");
1929 case EF_FRV_CPU_FR550
:
1930 strcat (buf
, ", fr550");
1933 case EF_FRV_CPU_SIMPLE
:
1934 strcat (buf
, ", simple");
1936 case EF_FRV_CPU_TOMCAT
:
1937 strcat (buf
, ", tomcat");
1943 if (e_flags
& EF_CPU32
)
1944 strcat (buf
, ", cpu32");
1945 if (e_flags
& EF_M68000
)
1946 strcat (buf
, ", m68000");
1950 if (e_flags
& EF_PPC_EMB
)
1951 strcat (buf
, ", emb");
1953 if (e_flags
& EF_PPC_RELOCATABLE
)
1954 strcat (buf
, ", relocatable");
1956 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
1957 strcat (buf
, ", relocatable-lib");
1961 case EM_CYGNUS_V850
:
1962 switch (e_flags
& EF_V850_ARCH
)
1965 strcat (buf
, ", v850e1");
1968 strcat (buf
, ", v850e");
1971 strcat (buf
, ", v850");
1974 strcat (buf
, ", unknown v850 architecture variant");
1980 case EM_CYGNUS_M32R
:
1981 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
1982 strcat (buf
, ", m32r");
1987 case EM_MIPS_RS3_LE
:
1988 if (e_flags
& EF_MIPS_NOREORDER
)
1989 strcat (buf
, ", noreorder");
1991 if (e_flags
& EF_MIPS_PIC
)
1992 strcat (buf
, ", pic");
1994 if (e_flags
& EF_MIPS_CPIC
)
1995 strcat (buf
, ", cpic");
1997 if (e_flags
& EF_MIPS_UCODE
)
1998 strcat (buf
, ", ugen_reserved");
2000 if (e_flags
& EF_MIPS_ABI2
)
2001 strcat (buf
, ", abi2");
2003 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
2004 strcat (buf
, ", odk first");
2006 if (e_flags
& EF_MIPS_32BITMODE
)
2007 strcat (buf
, ", 32bitmode");
2009 switch ((e_flags
& EF_MIPS_MACH
))
2011 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
2012 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
2013 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
2014 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
2015 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
2016 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
2017 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
2018 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
2019 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
2020 case E_MIPS_MACH_9000
: strcat (buf
, ", 9000"); break;
2022 /* We simply ignore the field in this case to avoid confusion:
2023 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2026 default: strcat (buf
, ", unknown CPU"); break;
2029 switch ((e_flags
& EF_MIPS_ABI
))
2031 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
2032 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
2033 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
2034 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
2036 /* We simply ignore the field in this case to avoid confusion:
2037 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2038 This means it is likely to be an o32 file, but not for
2041 default: strcat (buf
, ", unknown ABI"); break;
2044 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
2045 strcat (buf
, ", mdmx");
2047 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
2048 strcat (buf
, ", mips16");
2050 switch ((e_flags
& EF_MIPS_ARCH
))
2052 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
2053 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
2054 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
2055 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
2056 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
2057 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
2058 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
2059 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
2060 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
2061 default: strcat (buf
, ", unknown ISA"); break;
2067 switch ((e_flags
& EF_SH_MACH_MASK
))
2069 case EF_SH1
: strcat (buf
, ", sh1"); break;
2070 case EF_SH2
: strcat (buf
, ", sh2"); break;
2071 case EF_SH3
: strcat (buf
, ", sh3"); break;
2072 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
2073 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
2074 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
2075 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
2076 case EF_SH4
: strcat (buf
, ", sh4"); break;
2077 case EF_SH5
: strcat (buf
, ", sh5"); break;
2078 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
2079 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
2080 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
2081 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
2082 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
2083 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
2084 default: strcat (buf
, ", unknown ISA"); break;
2090 if (e_flags
& EF_SPARC_32PLUS
)
2091 strcat (buf
, ", v8+");
2093 if (e_flags
& EF_SPARC_SUN_US1
)
2094 strcat (buf
, ", ultrasparcI");
2096 if (e_flags
& EF_SPARC_SUN_US3
)
2097 strcat (buf
, ", ultrasparcIII");
2099 if (e_flags
& EF_SPARC_HAL_R1
)
2100 strcat (buf
, ", halr1");
2102 if (e_flags
& EF_SPARC_LEDATA
)
2103 strcat (buf
, ", ledata");
2105 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2106 strcat (buf
, ", tso");
2108 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2109 strcat (buf
, ", pso");
2111 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2112 strcat (buf
, ", rmo");
2116 switch (e_flags
& EF_PARISC_ARCH
)
2118 case EFA_PARISC_1_0
:
2119 strcpy (buf
, ", PA-RISC 1.0");
2121 case EFA_PARISC_1_1
:
2122 strcpy (buf
, ", PA-RISC 1.1");
2124 case EFA_PARISC_2_0
:
2125 strcpy (buf
, ", PA-RISC 2.0");
2130 if (e_flags
& EF_PARISC_TRAPNIL
)
2131 strcat (buf
, ", trapnil");
2132 if (e_flags
& EF_PARISC_EXT
)
2133 strcat (buf
, ", ext");
2134 if (e_flags
& EF_PARISC_LSB
)
2135 strcat (buf
, ", lsb");
2136 if (e_flags
& EF_PARISC_WIDE
)
2137 strcat (buf
, ", wide");
2138 if (e_flags
& EF_PARISC_NO_KABP
)
2139 strcat (buf
, ", no kabp");
2140 if (e_flags
& EF_PARISC_LAZYSWAP
)
2141 strcat (buf
, ", lazyswap");
2146 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2147 strcat (buf
, ", new calling convention");
2149 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2150 strcat (buf
, ", gnu calling convention");
2154 if ((e_flags
& EF_IA_64_ABI64
))
2155 strcat (buf
, ", 64-bit");
2157 strcat (buf
, ", 32-bit");
2158 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2159 strcat (buf
, ", reduced fp model");
2160 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2161 strcat (buf
, ", no function descriptors, constant gp");
2162 else if ((e_flags
& EF_IA_64_CONS_GP
))
2163 strcat (buf
, ", constant gp");
2164 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2165 strcat (buf
, ", absolute");
2169 if ((e_flags
& EF_VAX_NONPIC
))
2170 strcat (buf
, ", non-PIC");
2171 if ((e_flags
& EF_VAX_DFLOAT
))
2172 strcat (buf
, ", D-Float");
2173 if ((e_flags
& EF_VAX_GFLOAT
))
2174 strcat (buf
, ", G-Float");
2183 get_osabi_name (unsigned int osabi
)
2185 static char buff
[32];
2189 case ELFOSABI_NONE
: return "UNIX - System V";
2190 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2191 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2192 case ELFOSABI_LINUX
: return "UNIX - Linux";
2193 case ELFOSABI_HURD
: return "GNU/Hurd";
2194 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2195 case ELFOSABI_AIX
: return "UNIX - AIX";
2196 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2197 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2198 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2199 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2200 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2201 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2202 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2203 case ELFOSABI_AROS
: return "Amiga Research OS";
2204 case ELFOSABI_STANDALONE
: return _("Standalone App");
2205 case ELFOSABI_ARM
: return "ARM";
2207 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), osabi
);
2213 get_arm_segment_type (unsigned long type
)
2227 get_mips_segment_type (unsigned long type
)
2231 case PT_MIPS_REGINFO
:
2233 case PT_MIPS_RTPROC
:
2235 case PT_MIPS_OPTIONS
:
2245 get_parisc_segment_type (unsigned long type
)
2249 case PT_HP_TLS
: return "HP_TLS";
2250 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2251 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2252 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2253 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2254 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2255 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2256 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2257 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2258 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2259 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2260 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2261 case PT_HP_OPT_ANNOT
: return "HP_OPT_ANNOT";
2262 case PT_HP_HSL_ANNOT
: return "HP_HSL_ANNOT";
2263 case PT_HP_STACK
: return "HP_STACK";
2264 case PT_HP_CORE_UTSNAME
: return "HP_CORE_UTSNAME";
2265 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2266 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2267 case PT_PARISC_WEAKORDER
: return "PARISC_WEAKORDER";
2276 get_ia64_segment_type (unsigned long type
)
2280 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2281 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2282 case PT_HP_TLS
: return "HP_TLS";
2283 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2284 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2285 case PT_IA_64_HP_STACK
: return "HP_STACK";
2294 get_segment_type (unsigned long p_type
)
2296 static char buff
[32];
2300 case PT_NULL
: return "NULL";
2301 case PT_LOAD
: return "LOAD";
2302 case PT_DYNAMIC
: return "DYNAMIC";
2303 case PT_INTERP
: return "INTERP";
2304 case PT_NOTE
: return "NOTE";
2305 case PT_SHLIB
: return "SHLIB";
2306 case PT_PHDR
: return "PHDR";
2307 case PT_TLS
: return "TLS";
2309 case PT_GNU_EH_FRAME
:
2310 return "GNU_EH_FRAME";
2311 case PT_GNU_STACK
: return "GNU_STACK";
2312 case PT_GNU_RELRO
: return "GNU_RELRO";
2315 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2319 switch (elf_header
.e_machine
)
2322 result
= get_arm_segment_type (p_type
);
2325 case EM_MIPS_RS3_LE
:
2326 result
= get_mips_segment_type (p_type
);
2329 result
= get_parisc_segment_type (p_type
);
2332 result
= get_ia64_segment_type (p_type
);
2342 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2344 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2348 switch (elf_header
.e_machine
)
2351 result
= get_parisc_segment_type (p_type
);
2354 result
= get_ia64_segment_type (p_type
);
2364 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2367 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), p_type
);
2374 get_mips_section_type_name (unsigned int sh_type
)
2378 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2379 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2380 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2381 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2382 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2383 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2384 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2385 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2386 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2387 case SHT_MIPS_RELD
: return "MIPS_RELD";
2388 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2389 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2390 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2391 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2392 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2393 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2394 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2395 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2396 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2397 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2398 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2399 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2400 case SHT_MIPS_LINE
: return "MIPS_LINE";
2401 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2402 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2403 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2404 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2405 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2406 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2407 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2408 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2409 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2410 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2411 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2412 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2413 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2414 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2415 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2416 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2424 get_parisc_section_type_name (unsigned int sh_type
)
2428 case SHT_PARISC_EXT
: return "PARISC_EXT";
2429 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2430 case SHT_PARISC_DOC
: return "PARISC_DOC";
2431 case SHT_PARISC_ANNOT
: return "PARISC_ANNOT";
2432 case SHT_PARISC_SYMEXTN
: return "PARISC_SYMEXTN";
2433 case SHT_PARISC_STUBS
: return "PARISC_STUBS";
2434 case SHT_PARISC_DLKM
: return "PARISC_DLKM";
2442 get_ia64_section_type_name (unsigned int sh_type
)
2444 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2445 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2446 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2450 case SHT_IA_64_EXT
: return "IA_64_EXT";
2451 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2452 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2460 get_x86_64_section_type_name (unsigned int sh_type
)
2464 case SHT_X86_64_UNWIND
: return "X86_64_UNWIND";
2472 get_arm_section_type_name (unsigned int sh_type
)
2478 case SHT_ARM_PREEMPTMAP
:
2479 return "ARM_PREEMPTMAP";
2480 case SHT_ARM_ATTRIBUTES
:
2481 return "ARM_ATTRIBUTES";
2489 get_section_type_name (unsigned int sh_type
)
2491 static char buff
[32];
2495 case SHT_NULL
: return "NULL";
2496 case SHT_PROGBITS
: return "PROGBITS";
2497 case SHT_SYMTAB
: return "SYMTAB";
2498 case SHT_STRTAB
: return "STRTAB";
2499 case SHT_RELA
: return "RELA";
2500 case SHT_HASH
: return "HASH";
2501 case SHT_DYNAMIC
: return "DYNAMIC";
2502 case SHT_NOTE
: return "NOTE";
2503 case SHT_NOBITS
: return "NOBITS";
2504 case SHT_REL
: return "REL";
2505 case SHT_SHLIB
: return "SHLIB";
2506 case SHT_DYNSYM
: return "DYNSYM";
2507 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2508 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2509 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2510 case SHT_GROUP
: return "GROUP";
2511 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2512 case SHT_GNU_verdef
: return "VERDEF";
2513 case SHT_GNU_verneed
: return "VERNEED";
2514 case SHT_GNU_versym
: return "VERSYM";
2515 case 0x6ffffff0: return "VERSYM";
2516 case 0x6ffffffc: return "VERDEF";
2517 case 0x7ffffffd: return "AUXILIARY";
2518 case 0x7fffffff: return "FILTER";
2519 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2522 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2526 switch (elf_header
.e_machine
)
2529 case EM_MIPS_RS3_LE
:
2530 result
= get_mips_section_type_name (sh_type
);
2533 result
= get_parisc_section_type_name (sh_type
);
2536 result
= get_ia64_section_type_name (sh_type
);
2539 result
= get_x86_64_section_type_name (sh_type
);
2542 result
= get_arm_section_type_name (sh_type
);
2552 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2554 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2555 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2556 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2557 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2559 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), sh_type
);
2565 #define OPTION_DEBUG_DUMP 512
2567 static struct option options
[] =
2569 {"all", no_argument
, 0, 'a'},
2570 {"file-header", no_argument
, 0, 'h'},
2571 {"program-headers", no_argument
, 0, 'l'},
2572 {"headers", no_argument
, 0, 'e'},
2573 {"histogram", no_argument
, 0, 'I'},
2574 {"segments", no_argument
, 0, 'l'},
2575 {"sections", no_argument
, 0, 'S'},
2576 {"section-headers", no_argument
, 0, 'S'},
2577 {"section-groups", no_argument
, 0, 'g'},
2578 {"section-details", no_argument
, 0, 't'},
2579 {"full-section-name",no_argument
, 0, 'N'},
2580 {"symbols", no_argument
, 0, 's'},
2581 {"syms", no_argument
, 0, 's'},
2582 {"relocs", no_argument
, 0, 'r'},
2583 {"notes", no_argument
, 0, 'n'},
2584 {"dynamic", no_argument
, 0, 'd'},
2585 {"arch-specific", no_argument
, 0, 'A'},
2586 {"version-info", no_argument
, 0, 'V'},
2587 {"use-dynamic", no_argument
, 0, 'D'},
2588 {"hex-dump", required_argument
, 0, 'x'},
2589 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2590 {"unwind", no_argument
, 0, 'u'},
2591 #ifdef SUPPORT_DISASSEMBLY
2592 {"instruction-dump", required_argument
, 0, 'i'},
2595 {"version", no_argument
, 0, 'v'},
2596 {"wide", no_argument
, 0, 'W'},
2597 {"help", no_argument
, 0, 'H'},
2598 {0, no_argument
, 0, 0}
2604 fprintf (stdout
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2605 fprintf (stdout
, _(" Display information about the contents of ELF format files\n"));
2606 fprintf (stdout
, _(" Options are:\n\
2607 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2608 -h --file-header Display the ELF file header\n\
2609 -l --program-headers Display the program headers\n\
2610 --segments An alias for --program-headers\n\
2611 -S --section-headers Display the sections' header\n\
2612 --sections An alias for --section-headers\n\
2613 -g --section-groups Display the section groups\n\
2614 -t --section-details Display the section details\n\
2615 -e --headers Equivalent to: -h -l -S\n\
2616 -s --syms Display the symbol table\n\
2617 --symbols An alias for --syms\n\
2618 -n --notes Display the core notes (if present)\n\
2619 -r --relocs Display the relocations (if present)\n\
2620 -u --unwind Display the unwind info (if present)\n\
2621 -d --dynamic Display the dynamic section (if present)\n\
2622 -V --version-info Display the version sections (if present)\n\
2623 -A --arch-specific Display architecture specific information (if any).\n\
2624 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2625 -x --hex-dump=<number> Dump the contents of section <number>\n\
2626 -w[liaprmfFsoR] or\n\
2627 --debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]\n\
2628 Display the contents of DWARF2 debug sections\n"));
2629 #ifdef SUPPORT_DISASSEMBLY
2630 fprintf (stdout
, _("\
2631 -i --instruction-dump=<number>\n\
2632 Disassemble the contents of section <number>\n"));
2634 fprintf (stdout
, _("\
2635 -I --histogram Display histogram of bucket list lengths\n\
2636 -W --wide Allow output width to exceed 80 characters\n\
2637 @<file> Read options from <file>\n\
2638 -H --help Display this information\n\
2639 -v --version Display the version number of readelf\n"));
2640 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2645 /* Record the fact that the user wants the contents of section number
2646 SECTION to be displayed using the method(s) encoded as flags bits
2647 in TYPE. Note, TYPE can be zero if we are creating the array for
2651 request_dump (unsigned int section
, int type
)
2653 if (section
>= num_dump_sects
)
2655 char *new_dump_sects
;
2657 new_dump_sects
= calloc (section
+ 1, 1);
2659 if (new_dump_sects
== NULL
)
2660 error (_("Out of memory allocating dump request table."));
2663 /* Copy current flag settings. */
2664 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2668 dump_sects
= new_dump_sects
;
2669 num_dump_sects
= section
+ 1;
2674 dump_sects
[section
] |= type
;
2679 /* Request a dump by section name. */
2682 request_dump_byname (const char *section
, int type
)
2684 struct dump_list_entry
*new_request
;
2686 new_request
= malloc (sizeof (struct dump_list_entry
));
2688 error (_("Out of memory allocating dump request table."));
2690 new_request
->name
= strdup (section
);
2691 if (!new_request
->name
)
2692 error (_("Out of memory allocating dump request table."));
2694 new_request
->type
= type
;
2696 new_request
->next
= dump_sects_byname
;
2697 dump_sects_byname
= new_request
;
2701 parse_args (int argc
, char **argv
)
2708 while ((c
= getopt_long
2709 (argc
, argv
, "ersuahnldSDAINtgw::x:i:vVWH", options
, NULL
)) != EOF
)
2730 do_section_groups
++;
2738 do_section_groups
++;
2743 do_section_details
++;
2785 section
= strtoul (optarg
, & cp
, 0);
2786 if (! *cp
&& section
>= 0)
2787 request_dump (section
, HEX_DUMP
);
2789 request_dump_byname (optarg
, HEX_DUMP
);
2797 unsigned int index
= 0;
2801 while (optarg
[index
])
2802 switch (optarg
[index
++])
2811 do_debug_abbrevs
= 1;
2821 do_debug_pubnames
= 1;
2825 do_debug_aranges
= 1;
2829 do_debug_ranges
= 1;
2833 do_debug_frames_interp
= 1;
2835 do_debug_frames
= 1;
2840 do_debug_macinfo
= 1;
2854 warn (_("Unrecognized debug option '%s'\n"), optarg
);
2859 case OPTION_DEBUG_DUMP
:
2867 const char * option
;
2870 debug_dump_long_opts
;
2872 debug_dump_long_opts opts_table
[] =
2874 /* Please keep this table alpha- sorted. */
2875 { "Ranges", & do_debug_ranges
},
2876 { "abbrev", & do_debug_abbrevs
},
2877 { "aranges", & do_debug_aranges
},
2878 { "frames", & do_debug_frames
},
2879 { "frames-interp", & do_debug_frames_interp
},
2880 { "info", & do_debug_info
},
2881 { "line", & do_debug_lines
},
2882 { "loc", & do_debug_loc
},
2883 { "macro", & do_debug_macinfo
},
2884 { "pubnames", & do_debug_pubnames
},
2885 /* This entry is for compatability
2886 with earlier versions of readelf. */
2887 { "ranges", & do_debug_aranges
},
2888 { "str", & do_debug_str
},
2899 debug_dump_long_opts
* entry
;
2901 for (entry
= opts_table
; entry
->option
; entry
++)
2903 size_t len
= strlen (entry
->option
);
2905 if (strneq (p
, entry
->option
, len
)
2906 && (p
[len
] == ',' || p
[len
] == '\0'))
2908 * entry
->variable
= 1;
2910 /* The --debug-dump=frames-interp option also
2911 enables the --debug-dump=frames option. */
2912 if (do_debug_frames_interp
)
2913 do_debug_frames
= 1;
2920 if (entry
->option
== NULL
)
2922 warn (_("Unrecognized debug option '%s'\n"), p
);
2923 p
= strchr (p
, ',');
2933 #ifdef SUPPORT_DISASSEMBLY
2936 section
= strtoul (optarg
, & cp
, 0);
2937 if (! *cp
&& section
>= 0)
2939 request_dump (section
, DISASS_DUMP
);
2945 print_version (program_name
);
2954 #ifdef SUPPORT_DISASSEMBLY
2957 /* xgettext:c-format */
2958 error (_("Invalid option '-%c'\n"), c
);
2965 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
2966 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2967 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
2968 && !do_section_groups
)
2972 warn (_("Nothing to do.\n"));
2978 get_elf_class (unsigned int elf_class
)
2980 static char buff
[32];
2984 case ELFCLASSNONE
: return _("none");
2985 case ELFCLASS32
: return "ELF32";
2986 case ELFCLASS64
: return "ELF64";
2988 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), elf_class
);
2994 get_data_encoding (unsigned int encoding
)
2996 static char buff
[32];
3000 case ELFDATANONE
: return _("none");
3001 case ELFDATA2LSB
: return _("2's complement, little endian");
3002 case ELFDATA2MSB
: return _("2's complement, big endian");
3004 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), encoding
);
3009 /* Decode the data held in 'elf_header'. */
3012 process_file_header (void)
3014 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
3015 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
3016 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
3017 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
3020 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3028 printf (_("ELF Header:\n"));
3029 printf (_(" Magic: "));
3030 for (i
= 0; i
< EI_NIDENT
; i
++)
3031 printf ("%2.2x ", elf_header
.e_ident
[i
]);
3033 printf (_(" Class: %s\n"),
3034 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
3035 printf (_(" Data: %s\n"),
3036 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
3037 printf (_(" Version: %d %s\n"),
3038 elf_header
.e_ident
[EI_VERSION
],
3039 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
3041 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
3044 printf (_(" OS/ABI: %s\n"),
3045 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
3046 printf (_(" ABI Version: %d\n"),
3047 elf_header
.e_ident
[EI_ABIVERSION
]);
3048 printf (_(" Type: %s\n"),
3049 get_file_type (elf_header
.e_type
));
3050 printf (_(" Machine: %s\n"),
3051 get_machine_name (elf_header
.e_machine
));
3052 printf (_(" Version: 0x%lx\n"),
3053 (unsigned long) elf_header
.e_version
);
3055 printf (_(" Entry point address: "));
3056 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3057 printf (_("\n Start of program headers: "));
3058 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3059 printf (_(" (bytes into file)\n Start of section headers: "));
3060 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
3061 printf (_(" (bytes into file)\n"));
3063 printf (_(" Flags: 0x%lx%s\n"),
3064 (unsigned long) elf_header
.e_flags
,
3065 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
3066 printf (_(" Size of this header: %ld (bytes)\n"),
3067 (long) elf_header
.e_ehsize
);
3068 printf (_(" Size of program headers: %ld (bytes)\n"),
3069 (long) elf_header
.e_phentsize
);
3070 printf (_(" Number of program headers: %ld\n"),
3071 (long) elf_header
.e_phnum
);
3072 printf (_(" Size of section headers: %ld (bytes)\n"),
3073 (long) elf_header
.e_shentsize
);
3074 printf (_(" Number of section headers: %ld"),
3075 (long) elf_header
.e_shnum
);
3076 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
3077 printf (" (%ld)", (long) section_headers
[0].sh_size
);
3078 putc ('\n', stdout
);
3079 printf (_(" Section header string table index: %ld"),
3080 (long) elf_header
.e_shstrndx
);
3081 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
3082 printf (" (%ld)", (long) section_headers
[0].sh_link
);
3083 putc ('\n', stdout
);
3086 if (section_headers
!= NULL
)
3088 if (elf_header
.e_shnum
== 0)
3089 elf_header
.e_shnum
= section_headers
[0].sh_size
;
3090 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
3091 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
3092 free (section_headers
);
3093 section_headers
= NULL
;
3101 get_32bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3103 Elf32_External_Phdr
*phdrs
;
3104 Elf32_External_Phdr
*external
;
3105 Elf_Internal_Phdr
*internal
;
3108 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3109 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3110 _("program headers"));
3114 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3115 i
< elf_header
.e_phnum
;
3116 i
++, internal
++, external
++)
3118 internal
->p_type
= BYTE_GET (external
->p_type
);
3119 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3120 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3121 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3122 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3123 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3124 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3125 internal
->p_align
= BYTE_GET (external
->p_align
);
3134 get_64bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3136 Elf64_External_Phdr
*phdrs
;
3137 Elf64_External_Phdr
*external
;
3138 Elf_Internal_Phdr
*internal
;
3141 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3142 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3143 _("program headers"));
3147 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3148 i
< elf_header
.e_phnum
;
3149 i
++, internal
++, external
++)
3151 internal
->p_type
= BYTE_GET (external
->p_type
);
3152 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3153 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3154 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3155 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3156 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3157 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3158 internal
->p_align
= BYTE_GET (external
->p_align
);
3166 /* Returns 1 if the program headers were read into `program_headers'. */
3169 get_program_headers (FILE *file
)
3171 Elf_Internal_Phdr
*phdrs
;
3173 /* Check cache of prior read. */
3174 if (program_headers
!= NULL
)
3177 phdrs
= cmalloc (elf_header
.e_phnum
, sizeof (Elf_Internal_Phdr
));
3181 error (_("Out of memory\n"));
3186 ? get_32bit_program_headers (file
, phdrs
)
3187 : get_64bit_program_headers (file
, phdrs
))
3189 program_headers
= phdrs
;
3197 /* Returns 1 if the program headers were loaded. */
3200 process_program_headers (FILE *file
)
3202 Elf_Internal_Phdr
*segment
;
3205 if (elf_header
.e_phnum
== 0)
3208 printf (_("\nThere are no program headers in this file.\n"));
3212 if (do_segments
&& !do_header
)
3214 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3215 printf (_("Entry point "));
3216 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3217 printf (_("\nThere are %d program headers, starting at offset "),
3218 elf_header
.e_phnum
);
3219 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3223 if (! get_program_headers (file
))
3228 if (elf_header
.e_phnum
> 1)
3229 printf (_("\nProgram Headers:\n"));
3231 printf (_("\nProgram Headers:\n"));
3235 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3238 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3242 (_(" Type Offset VirtAddr PhysAddr\n"));
3244 (_(" FileSiz MemSiz Flags Align\n"));
3251 for (i
= 0, segment
= program_headers
;
3252 i
< elf_header
.e_phnum
;
3257 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3261 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3262 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3263 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3264 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3265 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3267 (segment
->p_flags
& PF_R
? 'R' : ' '),
3268 (segment
->p_flags
& PF_W
? 'W' : ' '),
3269 (segment
->p_flags
& PF_X
? 'E' : ' '));
3270 printf ("%#lx", (unsigned long) segment
->p_align
);
3274 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3275 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3278 print_vma (segment
->p_offset
, FULL_HEX
);
3282 print_vma (segment
->p_vaddr
, FULL_HEX
);
3284 print_vma (segment
->p_paddr
, FULL_HEX
);
3287 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3288 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3291 print_vma (segment
->p_filesz
, FULL_HEX
);
3295 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3296 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3299 print_vma (segment
->p_offset
, FULL_HEX
);
3303 (segment
->p_flags
& PF_R
? 'R' : ' '),
3304 (segment
->p_flags
& PF_W
? 'W' : ' '),
3305 (segment
->p_flags
& PF_X
? 'E' : ' '));
3307 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3308 printf ("%#lx", (unsigned long) segment
->p_align
);
3311 print_vma (segment
->p_align
, PREFIX_HEX
);
3316 print_vma (segment
->p_offset
, FULL_HEX
);
3318 print_vma (segment
->p_vaddr
, FULL_HEX
);
3320 print_vma (segment
->p_paddr
, FULL_HEX
);
3322 print_vma (segment
->p_filesz
, FULL_HEX
);
3324 print_vma (segment
->p_memsz
, FULL_HEX
);
3326 (segment
->p_flags
& PF_R
? 'R' : ' '),
3327 (segment
->p_flags
& PF_W
? 'W' : ' '),
3328 (segment
->p_flags
& PF_X
? 'E' : ' '));
3329 print_vma (segment
->p_align
, HEX
);
3333 switch (segment
->p_type
)
3337 error (_("more than one dynamic segment\n"));
3339 /* Try to locate the .dynamic section. If there is
3340 a section header table, we can easily locate it. */
3341 if (section_headers
!= NULL
)
3343 Elf_Internal_Shdr
*sec
;
3345 sec
= find_section (".dynamic");
3346 if (sec
== NULL
|| sec
->sh_size
== 0)
3348 error (_("no .dynamic section in the dynamic segment"));
3352 dynamic_addr
= sec
->sh_offset
;
3353 dynamic_size
= sec
->sh_size
;
3355 if (dynamic_addr
< segment
->p_offset
3356 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
3357 warn (_("the .dynamic section is not contained within the dynamic segment"));
3358 else if (dynamic_addr
> segment
->p_offset
)
3359 warn (_("the .dynamic section is not the first section in the dynamic segment."));
3363 /* Otherwise, we can only assume that the .dynamic
3364 section is the first section in the DYNAMIC segment. */
3365 dynamic_addr
= segment
->p_offset
;
3366 dynamic_size
= segment
->p_filesz
;
3371 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3373 error (_("Unable to find program interpreter name\n"));
3376 program_interpreter
[0] = 0;
3377 fscanf (file
, "%63s", program_interpreter
);
3380 printf (_("\n [Requesting program interpreter: %s]"),
3381 program_interpreter
);
3387 putc ('\n', stdout
);
3390 if (do_segments
&& section_headers
!= NULL
&& string_table
!= NULL
)
3392 printf (_("\n Section to Segment mapping:\n"));
3393 printf (_(" Segment Sections...\n"));
3395 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3398 Elf_Internal_Shdr
*section
;
3400 segment
= program_headers
+ i
;
3401 section
= section_headers
;
3403 printf (" %2.2d ", i
);
3405 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3407 if (section
->sh_size
> 0
3408 /* Compare allocated sections by VMA, unallocated
3409 sections by file offset. */
3410 && (section
->sh_flags
& SHF_ALLOC
3411 ? (section
->sh_addr
>= segment
->p_vaddr
3412 && section
->sh_addr
+ section
->sh_size
3413 <= segment
->p_vaddr
+ segment
->p_memsz
)
3414 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
3415 && (section
->sh_offset
+ section
->sh_size
3416 <= segment
->p_offset
+ segment
->p_filesz
)))
3417 /* .tbss is special. It doesn't contribute memory space
3418 to normal segments. */
3419 && (!((section
->sh_flags
& SHF_TLS
) != 0
3420 && section
->sh_type
== SHT_NOBITS
)
3421 || segment
->p_type
== PT_TLS
))
3422 printf ("%s ", SECTION_NAME (section
));
3433 /* Find the file offset corresponding to VMA by using the program headers. */
3436 offset_from_vma (FILE *file
, bfd_vma vma
, bfd_size_type size
)
3438 Elf_Internal_Phdr
*seg
;
3440 if (! get_program_headers (file
))
3442 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3446 for (seg
= program_headers
;
3447 seg
< program_headers
+ elf_header
.e_phnum
;
3450 if (seg
->p_type
!= PT_LOAD
)
3453 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3454 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3455 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3458 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3465 get_32bit_section_headers (FILE *file
, unsigned int num
)
3467 Elf32_External_Shdr
*shdrs
;
3468 Elf_Internal_Shdr
*internal
;
3471 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3472 elf_header
.e_shentsize
, num
, _("section headers"));
3476 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3478 if (section_headers
== NULL
)
3480 error (_("Out of memory\n"));
3484 for (i
= 0, internal
= section_headers
;
3488 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3489 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3490 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3491 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3492 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3493 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3494 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3495 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3496 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3497 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3506 get_64bit_section_headers (FILE *file
, unsigned int num
)
3508 Elf64_External_Shdr
*shdrs
;
3509 Elf_Internal_Shdr
*internal
;
3512 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3513 elf_header
.e_shentsize
, num
, _("section headers"));
3517 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3519 if (section_headers
== NULL
)
3521 error (_("Out of memory\n"));
3525 for (i
= 0, internal
= section_headers
;
3529 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3530 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3531 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3532 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3533 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3534 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3535 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3536 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3537 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3538 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3546 static Elf_Internal_Sym
*
3547 get_32bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3549 unsigned long number
;
3550 Elf32_External_Sym
*esyms
;
3551 Elf_External_Sym_Shndx
*shndx
;
3552 Elf_Internal_Sym
*isyms
;
3553 Elf_Internal_Sym
*psym
;
3556 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3562 if (symtab_shndx_hdr
!= NULL
3563 && (symtab_shndx_hdr
->sh_link
3564 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3566 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3567 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3575 number
= section
->sh_size
/ section
->sh_entsize
;
3576 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3580 error (_("Out of memory\n"));
3587 for (j
= 0, psym
= isyms
;
3591 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3592 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3593 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3594 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3595 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3597 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3598 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3599 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3609 static Elf_Internal_Sym
*
3610 get_64bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3612 unsigned long number
;
3613 Elf64_External_Sym
*esyms
;
3614 Elf_External_Sym_Shndx
*shndx
;
3615 Elf_Internal_Sym
*isyms
;
3616 Elf_Internal_Sym
*psym
;
3619 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3625 if (symtab_shndx_hdr
!= NULL
3626 && (symtab_shndx_hdr
->sh_link
3627 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3629 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3630 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3638 number
= section
->sh_size
/ section
->sh_entsize
;
3639 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3643 error (_("Out of memory\n"));
3650 for (j
= 0, psym
= isyms
;
3654 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3655 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3656 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3657 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3658 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3660 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3661 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3662 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3673 get_elf_section_flags (bfd_vma sh_flags
)
3675 static char buff
[1024];
3677 int field_size
= is_32bit_elf
? 8 : 16;
3678 int index
, size
= sizeof (buff
) - (field_size
+ 4 + 1);
3679 bfd_vma os_flags
= 0;
3680 bfd_vma proc_flags
= 0;
3681 bfd_vma unknown_flags
= 0;
3695 { "LINK ORDER", 10 },
3696 { "OS NONCONF", 10 },
3701 if (do_section_details
)
3703 sprintf (buff
, "[%*.*lx]: ",
3704 field_size
, field_size
, (unsigned long) sh_flags
);
3705 p
+= field_size
+ 4;
3712 flag
= sh_flags
& - sh_flags
;
3715 if (do_section_details
)
3719 case SHF_WRITE
: index
= 0; break;
3720 case SHF_ALLOC
: index
= 1; break;
3721 case SHF_EXECINSTR
: index
= 2; break;
3722 case SHF_MERGE
: index
= 3; break;
3723 case SHF_STRINGS
: index
= 4; break;
3724 case SHF_INFO_LINK
: index
= 5; break;
3725 case SHF_LINK_ORDER
: index
= 6; break;
3726 case SHF_OS_NONCONFORMING
: index
= 7; break;
3727 case SHF_GROUP
: index
= 8; break;
3728 case SHF_TLS
: index
= 9; break;
3737 if (p
!= buff
+ field_size
+ 4)
3739 if (size
< (10 + 2))
3746 size
-= flags
[index
].len
;
3747 p
= stpcpy (p
, flags
[index
].str
);
3749 else if (flag
& SHF_MASKOS
)
3751 else if (flag
& SHF_MASKPROC
)
3754 unknown_flags
|= flag
;
3760 case SHF_WRITE
: *p
= 'W'; break;
3761 case SHF_ALLOC
: *p
= 'A'; break;
3762 case SHF_EXECINSTR
: *p
= 'X'; break;
3763 case SHF_MERGE
: *p
= 'M'; break;
3764 case SHF_STRINGS
: *p
= 'S'; break;
3765 case SHF_INFO_LINK
: *p
= 'I'; break;
3766 case SHF_LINK_ORDER
: *p
= 'L'; break;
3767 case SHF_OS_NONCONFORMING
: *p
= 'O'; break;
3768 case SHF_GROUP
: *p
= 'G'; break;
3769 case SHF_TLS
: *p
= 'T'; break;
3772 if (elf_header
.e_machine
== EM_X86_64
3773 && flag
== SHF_X86_64_LARGE
)
3775 else if (flag
& SHF_MASKOS
)
3778 sh_flags
&= ~ SHF_MASKOS
;
3780 else if (flag
& SHF_MASKPROC
)
3783 sh_flags
&= ~ SHF_MASKPROC
;
3793 if (do_section_details
)
3797 size
-= 5 + field_size
;
3798 if (p
!= buff
+ field_size
+ 4)
3806 sprintf (p
, "OS (%*.*lx)", field_size
, field_size
,
3807 (unsigned long) os_flags
);
3808 p
+= 5 + field_size
;
3812 size
-= 7 + field_size
;
3813 if (p
!= buff
+ field_size
+ 4)
3821 sprintf (p
, "PROC (%*.*lx)", field_size
, field_size
,
3822 (unsigned long) proc_flags
);
3823 p
+= 7 + field_size
;
3827 size
-= 10 + field_size
;
3828 if (p
!= buff
+ field_size
+ 4)
3836 sprintf (p
, "UNKNOWN (%*.*lx)", field_size
, field_size
,
3837 (unsigned long) unknown_flags
);
3838 p
+= 10 + field_size
;
3847 process_section_headers (FILE *file
)
3849 Elf_Internal_Shdr
*section
;
3852 section_headers
= NULL
;
3854 if (elf_header
.e_shnum
== 0)
3857 printf (_("\nThere are no sections in this file.\n"));
3862 if (do_sections
&& !do_header
)
3863 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3864 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3868 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3871 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3874 /* Read in the string table, so that we have names to display. */
3875 if (SECTION_HEADER_INDEX (elf_header
.e_shstrndx
) < elf_header
.e_shnum
)
3877 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3879 if (section
->sh_size
!= 0)
3881 string_table
= get_data (NULL
, file
, section
->sh_offset
,
3882 1, section
->sh_size
, _("string table"));
3884 string_table_length
= string_table
!= NULL
? section
->sh_size
: 0;
3888 /* Scan the sections for the dynamic symbol table
3889 and dynamic string table and debug sections. */
3890 dynamic_symbols
= NULL
;
3891 dynamic_strings
= NULL
;
3892 dynamic_syminfo
= NULL
;
3893 symtab_shndx_hdr
= NULL
;
3895 eh_addr_size
= is_32bit_elf
? 4 : 8;
3896 switch (elf_header
.e_machine
)
3899 case EM_MIPS_RS3_LE
:
3900 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
3901 FDE addresses. However, the ABI also has a semi-official ILP32
3902 variant for which the normal FDE address size rules apply.
3904 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
3905 section, where XX is the size of longs in bits. Unfortunately,
3906 earlier compilers provided no way of distinguishing ILP32 objects
3907 from LP64 objects, so if there's any doubt, we should assume that
3908 the official LP64 form is being used. */
3909 if ((elf_header
.e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
3910 && find_section (".gcc_compiled_long32") == NULL
)
3915 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
3918 size_t expected_entsize \
3919 = is_32bit_elf ? size32 : size64; \
3920 if (section->sh_entsize != expected_entsize) \
3921 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
3922 i, (unsigned long int) section->sh_entsize, \
3923 (unsigned long int) expected_entsize); \
3924 section->sh_entsize = expected_entsize; \
3927 #define CHECK_ENTSIZE(section, i, type) \
3928 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
3929 sizeof (Elf64_External_##type))
3931 for (i
= 0, section
= section_headers
;
3932 i
< elf_header
.e_shnum
;
3935 char *name
= SECTION_NAME (section
);
3937 if (section
->sh_type
== SHT_DYNSYM
)
3939 if (dynamic_symbols
!= NULL
)
3941 error (_("File contains multiple dynamic symbol tables\n"));
3945 CHECK_ENTSIZE (section
, i
, Sym
);
3946 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3947 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3949 else if (section
->sh_type
== SHT_STRTAB
3950 && streq (name
, ".dynstr"))
3952 if (dynamic_strings
!= NULL
)
3954 error (_("File contains multiple dynamic string tables\n"));
3958 dynamic_strings
= get_data (NULL
, file
, section
->sh_offset
,
3959 1, section
->sh_size
, _("dynamic strings"));
3960 dynamic_strings_length
= section
->sh_size
;
3962 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
3964 if (symtab_shndx_hdr
!= NULL
)
3966 error (_("File contains multiple symtab shndx tables\n"));
3969 symtab_shndx_hdr
= section
;
3971 else if (section
->sh_type
== SHT_SYMTAB
)
3972 CHECK_ENTSIZE (section
, i
, Sym
);
3973 else if (section
->sh_type
== SHT_GROUP
)
3974 CHECK_ENTSIZE_VALUES (section
, i
, GRP_ENTRY_SIZE
, GRP_ENTRY_SIZE
);
3975 else if (section
->sh_type
== SHT_REL
)
3976 CHECK_ENTSIZE (section
, i
, Rel
);
3977 else if (section
->sh_type
== SHT_RELA
)
3978 CHECK_ENTSIZE (section
, i
, Rela
);
3979 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
3980 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
3981 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
3982 || do_debug_loc
|| do_debug_ranges
)
3983 && strneq (name
, ".debug_", 7))
3988 || (do_debug_info
&& streq (name
, "info"))
3989 || (do_debug_abbrevs
&& streq (name
, "abbrev"))
3990 || (do_debug_lines
&& streq (name
, "line"))
3991 || (do_debug_pubnames
&& streq (name
, "pubnames"))
3992 || (do_debug_aranges
&& streq (name
, "aranges"))
3993 || (do_debug_ranges
&& streq (name
, "ranges"))
3994 || (do_debug_frames
&& streq (name
, "frame"))
3995 || (do_debug_macinfo
&& streq (name
, "macinfo"))
3996 || (do_debug_str
&& streq (name
, "str"))
3997 || (do_debug_loc
&& streq (name
, "loc"))
3999 request_dump (i
, DEBUG_DUMP
);
4001 /* linkonce section to be combined with .debug_info at link time. */
4002 else if ((do_debugging
|| do_debug_info
)
4003 && strneq (name
, ".gnu.linkonce.wi.", 17))
4004 request_dump (i
, DEBUG_DUMP
);
4005 else if (do_debug_frames
&& streq (name
, ".eh_frame"))
4006 request_dump (i
, DEBUG_DUMP
);
4012 if (elf_header
.e_shnum
> 1)
4013 printf (_("\nSection Headers:\n"));
4015 printf (_("\nSection Header:\n"));
4019 if (do_section_details
)
4021 printf (_(" [Nr] Name\n"));
4022 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
4026 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4030 if (do_section_details
)
4032 printf (_(" [Nr] Name\n"));
4033 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
4037 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4041 if (do_section_details
)
4043 printf (_(" [Nr] Name\n"));
4044 printf (_(" Type Address Offset Link\n"));
4045 printf (_(" Size EntSize Info Align\n"));
4049 printf (_(" [Nr] Name Type Address Offset\n"));
4050 printf (_(" Size EntSize Flags Link Info Align\n"));
4054 if (do_section_details
)
4055 printf (_(" Flags\n"));
4057 for (i
= 0, section
= section_headers
;
4058 i
< elf_header
.e_shnum
;
4061 if (do_section_details
)
4063 printf (" [%2u] %s\n",
4064 SECTION_HEADER_NUM (i
),
4065 SECTION_NAME (section
));
4066 if (is_32bit_elf
|| do_wide
)
4067 printf (" %-15.15s ",
4068 get_section_type_name (section
->sh_type
));
4071 printf (" [%2u] %-17.17s %-15.15s ",
4072 SECTION_HEADER_NUM (i
),
4073 SECTION_NAME (section
),
4074 get_section_type_name (section
->sh_type
));
4078 print_vma (section
->sh_addr
, LONG_HEX
);
4080 printf ( " %6.6lx %6.6lx %2.2lx",
4081 (unsigned long) section
->sh_offset
,
4082 (unsigned long) section
->sh_size
,
4083 (unsigned long) section
->sh_entsize
);
4085 if (do_section_details
)
4086 fputs (" ", stdout
);
4088 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4090 printf ("%2ld %3lu %2ld\n",
4091 (unsigned long) section
->sh_link
,
4092 (unsigned long) section
->sh_info
,
4093 (unsigned long) section
->sh_addralign
);
4097 print_vma (section
->sh_addr
, LONG_HEX
);
4099 if ((long) section
->sh_offset
== section
->sh_offset
)
4100 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
4104 print_vma (section
->sh_offset
, LONG_HEX
);
4107 if ((unsigned long) section
->sh_size
== section
->sh_size
)
4108 printf (" %6.6lx", (unsigned long) section
->sh_size
);
4112 print_vma (section
->sh_size
, LONG_HEX
);
4115 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
4116 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
4120 print_vma (section
->sh_entsize
, LONG_HEX
);
4123 if (do_section_details
)
4124 fputs (" ", stdout
);
4126 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4128 printf ("%2ld %3lu ",
4129 (unsigned long) section
->sh_link
,
4130 (unsigned long) section
->sh_info
);
4132 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
4133 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
4136 print_vma (section
->sh_addralign
, DEC
);
4140 else if (do_section_details
)
4142 printf (" %-15.15s ",
4143 get_section_type_name (section
->sh_type
));
4144 print_vma (section
->sh_addr
, LONG_HEX
);
4145 if ((long) section
->sh_offset
== section
->sh_offset
)
4146 printf (" %16.16lx", (unsigned long) section
->sh_offset
);
4150 print_vma (section
->sh_offset
, LONG_HEX
);
4152 printf (" %ld\n ", (unsigned long) section
->sh_link
);
4153 print_vma (section
->sh_size
, LONG_HEX
);
4155 print_vma (section
->sh_entsize
, LONG_HEX
);
4157 printf (" %-16lu %ld\n",
4158 (unsigned long) section
->sh_info
,
4159 (unsigned long) section
->sh_addralign
);
4164 print_vma (section
->sh_addr
, LONG_HEX
);
4165 if ((long) section
->sh_offset
== section
->sh_offset
)
4166 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
4170 print_vma (section
->sh_offset
, LONG_HEX
);
4173 print_vma (section
->sh_size
, LONG_HEX
);
4175 print_vma (section
->sh_entsize
, LONG_HEX
);
4177 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4179 printf (" %2ld %3lu %ld\n",
4180 (unsigned long) section
->sh_link
,
4181 (unsigned long) section
->sh_info
,
4182 (unsigned long) section
->sh_addralign
);
4185 if (do_section_details
)
4186 printf (" %s\n", get_elf_section_flags (section
->sh_flags
));
4189 if (!do_section_details
)
4190 printf (_("Key to Flags:\n\
4191 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4192 I (info), L (link order), G (group), x (unknown)\n\
4193 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4199 get_group_flags (unsigned int flags
)
4201 static char buff
[32];
4208 snprintf (buff
, sizeof (buff
), _("[<unknown>: 0x%x]"), flags
);
4215 process_section_groups (FILE *file
)
4217 Elf_Internal_Shdr
*section
;
4219 struct group
*group
;
4220 Elf_Internal_Shdr
*symtab_sec
, *strtab_sec
;
4221 Elf_Internal_Sym
*symtab
;
4225 /* Don't process section groups unless needed. */
4226 if (!do_unwind
&& !do_section_groups
)
4229 if (elf_header
.e_shnum
== 0)
4231 if (do_section_groups
)
4232 printf (_("\nThere are no sections in this file.\n"));
4237 if (section_headers
== NULL
)
4239 error (_("Section headers are not available!\n"));
4243 section_headers_groups
= calloc (elf_header
.e_shnum
,
4244 sizeof (struct group
*));
4246 if (section_headers_groups
== NULL
)
4248 error (_("Out of memory\n"));
4252 /* Scan the sections for the group section. */
4254 for (i
= 0, section
= section_headers
;
4255 i
< elf_header
.e_shnum
;
4257 if (section
->sh_type
== SHT_GROUP
)
4260 if (group_count
== 0)
4262 if (do_section_groups
)
4263 printf (_("\nThere are no section groups in this file.\n"));
4268 section_groups
= calloc (group_count
, sizeof (struct group
));
4270 if (section_groups
== NULL
)
4272 error (_("Out of memory\n"));
4281 for (i
= 0, section
= section_headers
, group
= section_groups
;
4282 i
< elf_header
.e_shnum
;
4285 if (section
->sh_type
== SHT_GROUP
)
4287 char *name
= SECTION_NAME (section
);
4289 unsigned char *start
, *indices
;
4290 unsigned int entry
, j
, size
;
4291 Elf_Internal_Shdr
*sec
;
4292 Elf_Internal_Sym
*sym
;
4294 /* Get the symbol table. */
4295 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
4296 || ((sec
= SECTION_HEADER (section
->sh_link
))->sh_type
4299 error (_("Bad sh_link in group section `%s'\n"), name
);
4303 if (symtab_sec
!= sec
)
4308 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
);
4311 sym
= symtab
+ section
->sh_info
;
4313 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4315 bfd_vma sec_index
= SECTION_HEADER_INDEX (sym
->st_shndx
);
4318 error (_("Bad sh_info in group section `%s'\n"), name
);
4322 group_name
= SECTION_NAME (section_headers
+ sec_index
);
4331 /* Get the string table. */
4332 if (SECTION_HEADER_INDEX (symtab_sec
->sh_link
)
4333 >= elf_header
.e_shnum
)
4342 != (sec
= SECTION_HEADER (symtab_sec
->sh_link
)))
4347 strtab
= get_data (NULL
, file
, strtab_sec
->sh_offset
,
4348 1, strtab_sec
->sh_size
,
4350 strtab_size
= strtab
!= NULL
? strtab_sec
->sh_size
: 0;
4352 group_name
= sym
->st_name
< strtab_size
4353 ? strtab
+ sym
->st_name
: "<corrupt>";
4356 start
= get_data (NULL
, file
, section
->sh_offset
,
4357 1, section
->sh_size
, _("section data"));
4360 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
4361 entry
= byte_get (indices
, 4);
4364 if (do_section_groups
)
4366 printf ("\n%s group section [%5u] `%s' [%s] contains %u sections:\n",
4367 get_group_flags (entry
), i
, name
, group_name
, size
);
4369 printf (_(" [Index] Name\n"));
4372 group
->group_index
= i
;
4374 for (j
= 0; j
< size
; j
++)
4376 struct group_list
*g
;
4378 entry
= byte_get (indices
, 4);
4381 if (SECTION_HEADER_INDEX (entry
) >= elf_header
.e_shnum
)
4383 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
4384 entry
, i
, elf_header
.e_shnum
- 1);
4387 else if (entry
>= SHN_LORESERVE
&& entry
<= SHN_HIRESERVE
)
4389 error (_("invalid section [%5u] in group section [%5u]\n"),
4394 if (section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4399 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
4401 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4406 /* Intel C/C++ compiler may put section 0 in a
4407 section group. We just warn it the first time
4408 and ignore it afterwards. */
4409 static int warned
= 0;
4412 error (_("section 0 in group section [%5u]\n"),
4413 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4419 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4422 if (do_section_groups
)
4424 sec
= SECTION_HEADER (entry
);
4425 printf (" [%5u] %s\n", entry
, SECTION_NAME (sec
));
4428 g
= xmalloc (sizeof (struct group_list
));
4429 g
->section_index
= entry
;
4430 g
->next
= group
->root
;
4454 } dynamic_relocations
[] =
4456 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
4457 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
4458 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
4461 /* Process the reloc section. */
4464 process_relocs (FILE *file
)
4466 unsigned long rel_size
;
4467 unsigned long rel_offset
;
4473 if (do_using_dynamic
)
4477 int has_dynamic_reloc
;
4480 has_dynamic_reloc
= 0;
4482 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
4484 is_rela
= dynamic_relocations
[i
].rela
;
4485 name
= dynamic_relocations
[i
].name
;
4486 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
4487 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
4489 has_dynamic_reloc
|= rel_size
;
4491 if (is_rela
== UNKNOWN
)
4493 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
4494 switch (dynamic_info
[DT_PLTREL
])
4508 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4509 name
, rel_offset
, rel_size
);
4511 dump_relocations (file
,
4512 offset_from_vma (file
, rel_offset
, rel_size
),
4514 dynamic_symbols
, num_dynamic_syms
,
4515 dynamic_strings
, dynamic_strings_length
, is_rela
);
4519 if (! has_dynamic_reloc
)
4520 printf (_("\nThere are no dynamic relocations in this file.\n"));
4524 Elf_Internal_Shdr
*section
;
4528 for (i
= 0, section
= section_headers
;
4529 i
< elf_header
.e_shnum
;
4532 if ( section
->sh_type
!= SHT_RELA
4533 && section
->sh_type
!= SHT_REL
)
4536 rel_offset
= section
->sh_offset
;
4537 rel_size
= section
->sh_size
;
4541 Elf_Internal_Shdr
*strsec
;
4544 printf (_("\nRelocation section "));
4546 if (string_table
== NULL
)
4547 printf ("%d", section
->sh_name
);
4549 printf (_("'%s'"), SECTION_NAME (section
));
4551 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4552 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4554 is_rela
= section
->sh_type
== SHT_RELA
;
4556 if (section
->sh_link
4557 && SECTION_HEADER_INDEX (section
->sh_link
)
4558 < elf_header
.e_shnum
)
4560 Elf_Internal_Shdr
*symsec
;
4561 Elf_Internal_Sym
*symtab
;
4562 unsigned long nsyms
;
4563 unsigned long strtablen
= 0;
4564 char *strtab
= NULL
;
4566 symsec
= SECTION_HEADER (section
->sh_link
);
4567 if (symsec
->sh_type
!= SHT_SYMTAB
4568 && symsec
->sh_type
!= SHT_DYNSYM
)
4571 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4572 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4577 if (SECTION_HEADER_INDEX (symsec
->sh_link
)
4578 < elf_header
.e_shnum
)
4580 strsec
= SECTION_HEADER (symsec
->sh_link
);
4582 strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4585 strtablen
= strtab
== NULL
? 0 : strsec
->sh_size
;
4588 dump_relocations (file
, rel_offset
, rel_size
,
4589 symtab
, nsyms
, strtab
, strtablen
, is_rela
);
4595 dump_relocations (file
, rel_offset
, rel_size
,
4596 NULL
, 0, NULL
, 0, is_rela
);
4603 printf (_("\nThere are no relocations in this file.\n"));
4609 /* Process the unwind section. */
4611 #include "unwind-ia64.h"
4613 /* An absolute address consists of a section and an offset. If the
4614 section is NULL, the offset itself is the address, otherwise, the
4615 address equals to LOAD_ADDRESS(section) + offset. */
4619 unsigned short section
;
4623 #define ABSADDR(a) \
4625 ? section_headers [(a).section].sh_addr + (a).offset \
4628 struct ia64_unw_aux_info
4630 struct ia64_unw_table_entry
4632 struct absaddr start
;
4634 struct absaddr info
;
4636 *table
; /* Unwind table. */
4637 unsigned long table_len
; /* Length of unwind table. */
4638 unsigned char *info
; /* Unwind info. */
4639 unsigned long info_size
; /* Size of unwind info. */
4640 bfd_vma info_addr
; /* starting address of unwind info. */
4641 bfd_vma seg_base
; /* Starting address of segment. */
4642 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4643 unsigned long nsyms
; /* Number of symbols. */
4644 char *strtab
; /* The string table. */
4645 unsigned long strtab_size
; /* Size of string table. */
4649 find_symbol_for_address (Elf_Internal_Sym
*symtab
,
4650 unsigned long nsyms
,
4652 unsigned long strtab_size
,
4653 struct absaddr addr
,
4654 const char **symname
,
4657 bfd_vma dist
= 0x100000;
4658 Elf_Internal_Sym
*sym
, *best
= NULL
;
4661 for (i
= 0, sym
= symtab
; i
< nsyms
; ++i
, ++sym
)
4663 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
4664 && sym
->st_name
!= 0
4665 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
4666 && addr
.offset
>= sym
->st_value
4667 && addr
.offset
- sym
->st_value
< dist
)
4670 dist
= addr
.offset
- sym
->st_value
;
4677 *symname
= (best
->st_name
>= strtab_size
4678 ? "<corrupt>" : strtab
+ best
->st_name
);
4683 *offset
= addr
.offset
;
4687 dump_ia64_unwind (struct ia64_unw_aux_info
*aux
)
4689 struct ia64_unw_table_entry
*tp
;
4692 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4696 const unsigned char *dp
;
4697 const unsigned char *head
;
4698 const char *procname
;
4700 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
4701 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
4703 fputs ("\n<", stdout
);
4707 fputs (procname
, stdout
);
4710 printf ("+%lx", (unsigned long) offset
);
4713 fputs (">: [", stdout
);
4714 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4715 fputc ('-', stdout
);
4716 print_vma (tp
->end
.offset
, PREFIX_HEX
);
4717 printf ("], info at +0x%lx\n",
4718 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
4720 head
= aux
->info
+ (ABSADDR (tp
->info
) - aux
->info_addr
);
4721 stamp
= byte_get ((unsigned char *) head
, sizeof (stamp
));
4723 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4724 (unsigned) UNW_VER (stamp
),
4725 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
4726 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
4727 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
4728 (unsigned long) (eh_addr_size
* UNW_LENGTH (stamp
)));
4730 if (UNW_VER (stamp
) != 1)
4732 printf ("\tUnknown version.\n");
4737 for (dp
= head
+ 8; dp
< head
+ 8 + eh_addr_size
* UNW_LENGTH (stamp
);)
4738 dp
= unw_decode (dp
, in_body
, & in_body
);
4743 slurp_ia64_unwind_table (FILE *file
,
4744 struct ia64_unw_aux_info
*aux
,
4745 Elf_Internal_Shdr
*sec
)
4747 unsigned long size
, nrelas
, i
;
4748 Elf_Internal_Phdr
*seg
;
4749 struct ia64_unw_table_entry
*tep
;
4750 Elf_Internal_Shdr
*relsec
;
4751 Elf_Internal_Rela
*rela
, *rp
;
4752 unsigned char *table
, *tp
;
4753 Elf_Internal_Sym
*sym
;
4754 const char *relname
;
4756 /* First, find the starting address of the segment that includes
4759 if (elf_header
.e_phnum
)
4761 if (! get_program_headers (file
))
4764 for (seg
= program_headers
;
4765 seg
< program_headers
+ elf_header
.e_phnum
;
4768 if (seg
->p_type
!= PT_LOAD
)
4771 if (sec
->sh_addr
>= seg
->p_vaddr
4772 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
4774 aux
->seg_base
= seg
->p_vaddr
;
4780 /* Second, build the unwind table from the contents of the unwind section: */
4781 size
= sec
->sh_size
;
4782 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
4786 aux
->table
= xcmalloc (size
/ (3 * eh_addr_size
), sizeof (aux
->table
[0]));
4788 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * eh_addr_size
, ++tep
)
4790 tep
->start
.section
= SHN_UNDEF
;
4791 tep
->end
.section
= SHN_UNDEF
;
4792 tep
->info
.section
= SHN_UNDEF
;
4795 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
4796 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
4797 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
4801 tep
->start
.offset
= BYTE_GET ((unsigned char *) tp
+ 0);
4802 tep
->end
.offset
= BYTE_GET ((unsigned char *) tp
+ 8);
4803 tep
->info
.offset
= BYTE_GET ((unsigned char *) tp
+ 16);
4805 tep
->start
.offset
+= aux
->seg_base
;
4806 tep
->end
.offset
+= aux
->seg_base
;
4807 tep
->info
.offset
+= aux
->seg_base
;
4811 /* Third, apply any relocations to the unwind table: */
4813 for (relsec
= section_headers
;
4814 relsec
< section_headers
+ elf_header
.e_shnum
;
4817 if (relsec
->sh_type
!= SHT_RELA
4818 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
4819 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4822 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
4826 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
4830 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
4831 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
4835 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
4836 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
4839 if (! strneq (relname
, "R_IA64_SEGREL", 13))
4841 warn (_("Skipping unexpected relocation type %s\n"), relname
);
4845 i
= rp
->r_offset
/ (3 * eh_addr_size
);
4847 switch (rp
->r_offset
/eh_addr_size
% 3)
4850 aux
->table
[i
].start
.section
= sym
->st_shndx
;
4851 aux
->table
[i
].start
.offset
+= rp
->r_addend
+ sym
->st_value
;
4854 aux
->table
[i
].end
.section
= sym
->st_shndx
;
4855 aux
->table
[i
].end
.offset
+= rp
->r_addend
+ sym
->st_value
;
4858 aux
->table
[i
].info
.section
= sym
->st_shndx
;
4859 aux
->table
[i
].info
.offset
+= rp
->r_addend
+ sym
->st_value
;
4869 aux
->table_len
= size
/ (3 * eh_addr_size
);
4874 ia64_process_unwind (FILE *file
)
4876 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
4877 unsigned long i
, unwcount
= 0, unwstart
= 0;
4878 struct ia64_unw_aux_info aux
;
4880 memset (& aux
, 0, sizeof (aux
));
4882 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
4884 if (sec
->sh_type
== SHT_SYMTAB
4885 && SECTION_HEADER_INDEX (sec
->sh_link
) < elf_header
.e_shnum
)
4887 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
4888 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
4890 strsec
= SECTION_HEADER (sec
->sh_link
);
4891 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4892 1, strsec
->sh_size
, _("string table"));
4893 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
4895 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4900 printf (_("\nThere are no unwind sections in this file.\n"));
4902 while (unwcount
-- > 0)
4907 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
4908 i
< elf_header
.e_shnum
; ++i
, ++sec
)
4909 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4916 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
4918 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
4920 /* We need to find which section group it is in. */
4921 struct group_list
*g
= section_headers_groups
[i
]->root
;
4923 for (; g
!= NULL
; g
= g
->next
)
4925 sec
= SECTION_HEADER (g
->section_index
);
4927 if (streq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
))
4932 i
= elf_header
.e_shnum
;
4934 else if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
, len
))
4936 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
4937 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
4938 suffix
= SECTION_NAME (unwsec
) + len
;
4939 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4941 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info_once
, len2
)
4942 && streq (SECTION_NAME (sec
) + len2
, suffix
))
4947 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4948 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
4949 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
4950 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
4952 if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
, len
))
4953 suffix
= SECTION_NAME (unwsec
) + len
;
4954 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4956 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
, len2
)
4957 && streq (SECTION_NAME (sec
) + len2
, suffix
))
4961 if (i
== elf_header
.e_shnum
)
4963 printf (_("\nCould not find unwind info section for "));
4965 if (string_table
== NULL
)
4966 printf ("%d", unwsec
->sh_name
);
4968 printf (_("'%s'"), SECTION_NAME (unwsec
));
4972 aux
.info_size
= sec
->sh_size
;
4973 aux
.info_addr
= sec
->sh_addr
;
4974 aux
.info
= get_data (NULL
, file
, sec
->sh_offset
, 1, aux
.info_size
,
4977 printf (_("\nUnwind section "));
4979 if (string_table
== NULL
)
4980 printf ("%d", unwsec
->sh_name
);
4982 printf (_("'%s'"), SECTION_NAME (unwsec
));
4984 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4985 (unsigned long) unwsec
->sh_offset
,
4986 (unsigned long) (unwsec
->sh_size
/ (3 * eh_addr_size
)));
4988 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
4990 if (aux
.table_len
> 0)
4991 dump_ia64_unwind (& aux
);
4994 free ((char *) aux
.table
);
4996 free ((char *) aux
.info
);
5005 free ((char *) aux
.strtab
);
5010 struct hppa_unw_aux_info
5012 struct hppa_unw_table_entry
5014 struct absaddr start
;
5016 unsigned int Cannot_unwind
:1; /* 0 */
5017 unsigned int Millicode
:1; /* 1 */
5018 unsigned int Millicode_save_sr0
:1; /* 2 */
5019 unsigned int Region_description
:2; /* 3..4 */
5020 unsigned int reserved1
:1; /* 5 */
5021 unsigned int Entry_SR
:1; /* 6 */
5022 unsigned int Entry_FR
:4; /* number saved */ /* 7..10 */
5023 unsigned int Entry_GR
:5; /* number saved */ /* 11..15 */
5024 unsigned int Args_stored
:1; /* 16 */
5025 unsigned int Variable_Frame
:1; /* 17 */
5026 unsigned int Separate_Package_Body
:1; /* 18 */
5027 unsigned int Frame_Extension_Millicode
:1; /* 19 */
5028 unsigned int Stack_Overflow_Check
:1; /* 20 */
5029 unsigned int Two_Instruction_SP_Increment
:1; /* 21 */
5030 unsigned int Ada_Region
:1; /* 22 */
5031 unsigned int cxx_info
:1; /* 23 */
5032 unsigned int cxx_try_catch
:1; /* 24 */
5033 unsigned int sched_entry_seq
:1; /* 25 */
5034 unsigned int reserved2
:1; /* 26 */
5035 unsigned int Save_SP
:1; /* 27 */
5036 unsigned int Save_RP
:1; /* 28 */
5037 unsigned int Save_MRP_in_frame
:1; /* 29 */
5038 unsigned int extn_ptr_defined
:1; /* 30 */
5039 unsigned int Cleanup_defined
:1; /* 31 */
5041 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
5042 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
5043 unsigned int Large_frame
:1; /* 2 */
5044 unsigned int Pseudo_SP_Set
:1; /* 3 */
5045 unsigned int reserved4
:1; /* 4 */
5046 unsigned int Total_frame_size
:27; /* 5..31 */
5048 *table
; /* Unwind table. */
5049 unsigned long table_len
; /* Length of unwind table. */
5050 bfd_vma seg_base
; /* Starting address of segment. */
5051 Elf_Internal_Sym
*symtab
; /* The symbol table. */
5052 unsigned long nsyms
; /* Number of symbols. */
5053 char *strtab
; /* The string table. */
5054 unsigned long strtab_size
; /* Size of string table. */
5058 dump_hppa_unwind (struct hppa_unw_aux_info
*aux
)
5060 struct hppa_unw_table_entry
*tp
;
5062 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
5065 const char *procname
;
5067 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
5068 aux
->strtab_size
, tp
->start
, &procname
,
5071 fputs ("\n<", stdout
);
5075 fputs (procname
, stdout
);
5078 printf ("+%lx", (unsigned long) offset
);
5081 fputs (">: [", stdout
);
5082 print_vma (tp
->start
.offset
, PREFIX_HEX
);
5083 fputc ('-', stdout
);
5084 print_vma (tp
->end
.offset
, PREFIX_HEX
);
5087 #define PF(_m) if (tp->_m) printf (#_m " ");
5088 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5091 PF(Millicode_save_sr0
);
5092 /* PV(Region_description); */
5098 PF(Separate_Package_Body
);
5099 PF(Frame_Extension_Millicode
);
5100 PF(Stack_Overflow_Check
);
5101 PF(Two_Instruction_SP_Increment
);
5105 PF(sched_entry_seq
);
5108 PF(Save_MRP_in_frame
);
5109 PF(extn_ptr_defined
);
5110 PF(Cleanup_defined
);
5111 PF(MPE_XL_interrupt_marker
);
5112 PF(HP_UX_interrupt_marker
);
5115 PV(Total_frame_size
);
5124 slurp_hppa_unwind_table (FILE *file
,
5125 struct hppa_unw_aux_info
*aux
,
5126 Elf_Internal_Shdr
*sec
)
5128 unsigned long size
, unw_ent_size
, nentries
, nrelas
, i
;
5129 Elf_Internal_Phdr
*seg
;
5130 struct hppa_unw_table_entry
*tep
;
5131 Elf_Internal_Shdr
*relsec
;
5132 Elf_Internal_Rela
*rela
, *rp
;
5133 unsigned char *table
, *tp
;
5134 Elf_Internal_Sym
*sym
;
5135 const char *relname
;
5137 /* First, find the starting address of the segment that includes
5140 if (elf_header
.e_phnum
)
5142 if (! get_program_headers (file
))
5145 for (seg
= program_headers
;
5146 seg
< program_headers
+ elf_header
.e_phnum
;
5149 if (seg
->p_type
!= PT_LOAD
)
5152 if (sec
->sh_addr
>= seg
->p_vaddr
5153 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5155 aux
->seg_base
= seg
->p_vaddr
;
5161 /* Second, build the unwind table from the contents of the unwind
5163 size
= sec
->sh_size
;
5164 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
5169 nentries
= size
/ unw_ent_size
;
5170 size
= unw_ent_size
* nentries
;
5172 tep
= aux
->table
= xcmalloc (nentries
, sizeof (aux
->table
[0]));
5174 for (tp
= table
; tp
< table
+ size
; tp
+= unw_ent_size
, ++tep
)
5176 unsigned int tmp1
, tmp2
;
5178 tep
->start
.section
= SHN_UNDEF
;
5179 tep
->end
.section
= SHN_UNDEF
;
5181 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
5182 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
5183 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
5184 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
5186 tep
->start
.offset
+= aux
->seg_base
;
5187 tep
->end
.offset
+= aux
->seg_base
;
5189 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
5190 tep
->Millicode
= (tmp1
>> 30) & 0x1;
5191 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
5192 tep
->Region_description
= (tmp1
>> 27) & 0x3;
5193 tep
->reserved1
= (tmp1
>> 26) & 0x1;
5194 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
5195 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
5196 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
5197 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
5198 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
5199 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
5200 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
5201 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
5202 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
5203 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
5204 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
5205 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
5206 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
5207 tep
->reserved2
= (tmp1
>> 5) & 0x1;
5208 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
5209 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
5210 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
5211 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
5212 tep
->Cleanup_defined
= tmp1
& 0x1;
5214 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
5215 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
5216 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
5217 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
5218 tep
->reserved4
= (tmp2
>> 27) & 0x1;
5219 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
5223 /* Third, apply any relocations to the unwind table. */
5225 for (relsec
= section_headers
;
5226 relsec
< section_headers
+ elf_header
.e_shnum
;
5229 if (relsec
->sh_type
!= SHT_RELA
5230 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
5231 || SECTION_HEADER (relsec
->sh_info
) != sec
)
5234 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5238 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5242 relname
= elf_hppa_reloc_type (ELF32_R_TYPE (rp
->r_info
));
5243 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
5247 relname
= elf_hppa_reloc_type (ELF64_R_TYPE (rp
->r_info
));
5248 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
5251 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
5252 if (strncmp (relname
, "R_PARISC_SEGREL", 15) != 0)
5254 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5258 i
= rp
->r_offset
/ unw_ent_size
;
5260 switch ((rp
->r_offset
% unw_ent_size
) / eh_addr_size
)
5263 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5264 aux
->table
[i
].start
.offset
+= sym
->st_value
+ rp
->r_addend
;
5267 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5268 aux
->table
[i
].end
.offset
+= sym
->st_value
+ rp
->r_addend
;
5278 aux
->table_len
= nentries
;
5284 hppa_process_unwind (FILE *file
)
5286 struct hppa_unw_aux_info aux
;
5287 Elf_Internal_Shdr
*unwsec
= NULL
;
5288 Elf_Internal_Shdr
*strsec
;
5289 Elf_Internal_Shdr
*sec
;
5292 memset (& aux
, 0, sizeof (aux
));
5294 if (string_table
== NULL
)
5297 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5299 if (sec
->sh_type
== SHT_SYMTAB
5300 && SECTION_HEADER_INDEX (sec
->sh_link
) < elf_header
.e_shnum
)
5302 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5303 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5305 strsec
= SECTION_HEADER (sec
->sh_link
);
5306 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
5307 1, strsec
->sh_size
, _("string table"));
5308 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5310 else if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5315 printf (_("\nThere are no unwind sections in this file.\n"));
5317 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5319 if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5321 printf (_("\nUnwind section "));
5322 printf (_("'%s'"), SECTION_NAME (sec
));
5324 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5325 (unsigned long) sec
->sh_offset
,
5326 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
+ 8)));
5328 slurp_hppa_unwind_table (file
, &aux
, sec
);
5329 if (aux
.table_len
> 0)
5330 dump_hppa_unwind (&aux
);
5333 free ((char *) aux
.table
);
5341 free ((char *) aux
.strtab
);
5347 process_unwind (FILE *file
)
5349 struct unwind_handler
{
5351 int (*handler
)(FILE *file
);
5353 { EM_IA_64
, ia64_process_unwind
},
5354 { EM_PARISC
, hppa_process_unwind
},
5362 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
5363 if (elf_header
.e_machine
== handlers
[i
].machtype
)
5364 return handlers
[i
].handler (file
);
5366 printf (_("\nThere are no unwind sections in this file.\n"));
5371 dynamic_section_mips_val (Elf_Internal_Dyn
*entry
)
5373 switch (entry
->d_tag
)
5376 if (entry
->d_un
.d_val
== 0)
5380 static const char * opts
[] =
5382 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5383 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5384 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5385 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5390 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++cnt
)
5391 if (entry
->d_un
.d_val
& (1 << cnt
))
5393 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
5400 case DT_MIPS_IVERSION
:
5401 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5402 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5404 printf ("<corrupt: %ld>\n", (long) entry
->d_un
.d_ptr
);
5407 case DT_MIPS_TIME_STAMP
:
5412 time_t time
= entry
->d_un
.d_val
;
5413 tmp
= gmtime (&time
);
5414 snprintf (timebuf
, sizeof (timebuf
), "%04u-%02u-%02uT%02u:%02u:%02u",
5415 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5416 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5417 printf ("Time Stamp: %s\n", timebuf
);
5421 case DT_MIPS_RLD_VERSION
:
5422 case DT_MIPS_LOCAL_GOTNO
:
5423 case DT_MIPS_CONFLICTNO
:
5424 case DT_MIPS_LIBLISTNO
:
5425 case DT_MIPS_SYMTABNO
:
5426 case DT_MIPS_UNREFEXTNO
:
5427 case DT_MIPS_HIPAGENO
:
5428 case DT_MIPS_DELTA_CLASS_NO
:
5429 case DT_MIPS_DELTA_INSTANCE_NO
:
5430 case DT_MIPS_DELTA_RELOC_NO
:
5431 case DT_MIPS_DELTA_SYM_NO
:
5432 case DT_MIPS_DELTA_CLASSSYM_NO
:
5433 case DT_MIPS_COMPACT_SIZE
:
5434 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
5438 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
5444 dynamic_section_parisc_val (Elf_Internal_Dyn
*entry
)
5446 switch (entry
->d_tag
)
5448 case DT_HP_DLD_FLAGS
:
5457 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
5458 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
5459 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
5460 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
5461 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
5462 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
5463 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
5464 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
5465 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
5466 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
5467 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" },
5468 { DT_HP_GST
, "HP_GST" },
5469 { DT_HP_SHLIB_FIXED
, "HP_SHLIB_FIXED" },
5470 { DT_HP_MERGE_SHLIB_SEG
, "HP_MERGE_SHLIB_SEG" },
5471 { DT_HP_NODELETE
, "HP_NODELETE" },
5472 { DT_HP_GROUP
, "HP_GROUP" },
5473 { DT_HP_PROTECT_LINKAGE_TABLE
, "HP_PROTECT_LINKAGE_TABLE" }
5477 bfd_vma val
= entry
->d_un
.d_val
;
5479 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
5480 if (val
& flags
[cnt
].bit
)
5484 fputs (flags
[cnt
].str
, stdout
);
5486 val
^= flags
[cnt
].bit
;
5489 if (val
!= 0 || first
)
5493 print_vma (val
, HEX
);
5499 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5506 dynamic_section_ia64_val (Elf_Internal_Dyn
*entry
)
5508 switch (entry
->d_tag
)
5510 case DT_IA_64_PLT_RESERVE
:
5511 /* First 3 slots reserved. */
5512 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5514 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
5518 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5525 get_32bit_dynamic_section (FILE *file
)
5527 Elf32_External_Dyn
*edyn
, *ext
;
5528 Elf_Internal_Dyn
*entry
;
5530 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5531 _("dynamic section"));
5535 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5536 might not have the luxury of section headers. Look for the DT_NULL
5537 terminator to determine the number of entries. */
5538 for (ext
= edyn
, dynamic_nent
= 0;
5539 (char *) ext
< (char *) edyn
+ dynamic_size
;
5543 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5547 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5548 if (dynamic_section
== NULL
)
5550 error (_("Out of memory\n"));
5555 for (ext
= edyn
, entry
= dynamic_section
;
5556 entry
< dynamic_section
+ dynamic_nent
;
5559 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5560 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5569 get_64bit_dynamic_section (FILE *file
)
5571 Elf64_External_Dyn
*edyn
, *ext
;
5572 Elf_Internal_Dyn
*entry
;
5574 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5575 _("dynamic section"));
5579 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5580 might not have the luxury of section headers. Look for the DT_NULL
5581 terminator to determine the number of entries. */
5582 for (ext
= edyn
, dynamic_nent
= 0;
5583 (char *) ext
< (char *) edyn
+ dynamic_size
;
5587 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5591 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5592 if (dynamic_section
== NULL
)
5594 error (_("Out of memory\n"));
5599 for (ext
= edyn
, entry
= dynamic_section
;
5600 entry
< dynamic_section
+ dynamic_nent
;
5603 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5604 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5613 print_dynamic_flags (bfd_vma flags
)
5621 flag
= flags
& - flags
;
5631 case DF_ORIGIN
: fputs ("ORIGIN", stdout
); break;
5632 case DF_SYMBOLIC
: fputs ("SYMBOLIC", stdout
); break;
5633 case DF_TEXTREL
: fputs ("TEXTREL", stdout
); break;
5634 case DF_BIND_NOW
: fputs ("BIND_NOW", stdout
); break;
5635 case DF_STATIC_TLS
: fputs ("STATIC_TLS", stdout
); break;
5636 default: fputs ("unknown", stdout
); break;
5642 /* Parse and display the contents of the dynamic section. */
5645 process_dynamic_section (FILE *file
)
5647 Elf_Internal_Dyn
*entry
;
5649 if (dynamic_size
== 0)
5652 printf (_("\nThere is no dynamic section in this file.\n"));
5659 if (! get_32bit_dynamic_section (file
))
5662 else if (! get_64bit_dynamic_section (file
))
5665 /* Find the appropriate symbol table. */
5666 if (dynamic_symbols
== NULL
)
5668 for (entry
= dynamic_section
;
5669 entry
< dynamic_section
+ dynamic_nent
;
5672 Elf_Internal_Shdr section
;
5674 if (entry
->d_tag
!= DT_SYMTAB
)
5677 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
5679 /* Since we do not know how big the symbol table is,
5680 we default to reading in the entire file (!) and
5681 processing that. This is overkill, I know, but it
5683 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5685 if (archive_file_offset
!= 0)
5686 section
.sh_size
= archive_file_size
- section
.sh_offset
;
5689 if (fseek (file
, 0, SEEK_END
))
5690 error (_("Unable to seek to end of file!"));
5692 section
.sh_size
= ftell (file
) - section
.sh_offset
;
5696 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
5698 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
5700 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
5701 if (num_dynamic_syms
< 1)
5703 error (_("Unable to determine the number of symbols to load\n"));
5707 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
5711 /* Similarly find a string table. */
5712 if (dynamic_strings
== NULL
)
5714 for (entry
= dynamic_section
;
5715 entry
< dynamic_section
+ dynamic_nent
;
5718 unsigned long offset
;
5721 if (entry
->d_tag
!= DT_STRTAB
)
5724 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
5726 /* Since we do not know how big the string table is,
5727 we default to reading in the entire file (!) and
5728 processing that. This is overkill, I know, but it
5731 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5733 if (archive_file_offset
!= 0)
5734 str_tab_len
= archive_file_size
- offset
;
5737 if (fseek (file
, 0, SEEK_END
))
5738 error (_("Unable to seek to end of file\n"));
5739 str_tab_len
= ftell (file
) - offset
;
5742 if (str_tab_len
< 1)
5745 (_("Unable to determine the length of the dynamic string table\n"));
5749 dynamic_strings
= get_data (NULL
, file
, offset
, 1, str_tab_len
,
5750 _("dynamic string table"));
5751 dynamic_strings_length
= str_tab_len
;
5756 /* And find the syminfo section if available. */
5757 if (dynamic_syminfo
== NULL
)
5759 unsigned long syminsz
= 0;
5761 for (entry
= dynamic_section
;
5762 entry
< dynamic_section
+ dynamic_nent
;
5765 if (entry
->d_tag
== DT_SYMINENT
)
5767 /* Note: these braces are necessary to avoid a syntax
5768 error from the SunOS4 C compiler. */
5769 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
5771 else if (entry
->d_tag
== DT_SYMINSZ
)
5772 syminsz
= entry
->d_un
.d_val
;
5773 else if (entry
->d_tag
== DT_SYMINFO
)
5774 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
5778 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
5780 Elf_External_Syminfo
*extsyminfo
, *extsym
;
5781 Elf_Internal_Syminfo
*syminfo
;
5783 /* There is a syminfo section. Read the data. */
5784 extsyminfo
= get_data (NULL
, file
, dynamic_syminfo_offset
, 1,
5785 syminsz
, _("symbol information"));
5789 dynamic_syminfo
= malloc (syminsz
);
5790 if (dynamic_syminfo
== NULL
)
5792 error (_("Out of memory\n"));
5796 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
5797 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
5798 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
5799 ++syminfo
, ++extsym
)
5801 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
5802 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
5809 if (do_dynamic
&& dynamic_addr
)
5810 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
5811 dynamic_addr
, dynamic_nent
);
5813 printf (_(" Tag Type Name/Value\n"));
5815 for (entry
= dynamic_section
;
5816 entry
< dynamic_section
+ dynamic_nent
;
5824 print_vma (entry
->d_tag
, FULL_HEX
);
5825 dtype
= get_dynamic_type (entry
->d_tag
);
5826 printf (" (%s)%*s", dtype
,
5827 ((is_32bit_elf
? 27 : 19)
5828 - (int) strlen (dtype
)),
5832 switch (entry
->d_tag
)
5836 print_dynamic_flags (entry
->d_un
.d_val
);
5846 switch (entry
->d_tag
)
5849 printf (_("Auxiliary library"));
5853 printf (_("Filter library"));
5857 printf (_("Configuration file"));
5861 printf (_("Dependency audit library"));
5865 printf (_("Audit library"));
5869 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5870 printf (": [%s]\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5874 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5883 printf (_("Flags:"));
5885 if (entry
->d_un
.d_val
== 0)
5886 printf (_(" None\n"));
5889 unsigned long int val
= entry
->d_un
.d_val
;
5891 if (val
& DTF_1_PARINIT
)
5893 printf (" PARINIT");
5894 val
^= DTF_1_PARINIT
;
5896 if (val
& DTF_1_CONFEXP
)
5898 printf (" CONFEXP");
5899 val
^= DTF_1_CONFEXP
;
5902 printf (" %lx", val
);
5911 printf (_("Flags:"));
5913 if (entry
->d_un
.d_val
== 0)
5914 printf (_(" None\n"));
5917 unsigned long int val
= entry
->d_un
.d_val
;
5919 if (val
& DF_P1_LAZYLOAD
)
5921 printf (" LAZYLOAD");
5922 val
^= DF_P1_LAZYLOAD
;
5924 if (val
& DF_P1_GROUPPERM
)
5926 printf (" GROUPPERM");
5927 val
^= DF_P1_GROUPPERM
;
5930 printf (" %lx", val
);
5939 printf (_("Flags:"));
5940 if (entry
->d_un
.d_val
== 0)
5941 printf (_(" None\n"));
5944 unsigned long int val
= entry
->d_un
.d_val
;
5951 if (val
& DF_1_GLOBAL
)
5956 if (val
& DF_1_GROUP
)
5961 if (val
& DF_1_NODELETE
)
5963 printf (" NODELETE");
5964 val
^= DF_1_NODELETE
;
5966 if (val
& DF_1_LOADFLTR
)
5968 printf (" LOADFLTR");
5969 val
^= DF_1_LOADFLTR
;
5971 if (val
& DF_1_INITFIRST
)
5973 printf (" INITFIRST");
5974 val
^= DF_1_INITFIRST
;
5976 if (val
& DF_1_NOOPEN
)
5981 if (val
& DF_1_ORIGIN
)
5986 if (val
& DF_1_DIRECT
)
5991 if (val
& DF_1_TRANS
)
5996 if (val
& DF_1_INTERPOSE
)
5998 printf (" INTERPOSE");
5999 val
^= DF_1_INTERPOSE
;
6001 if (val
& DF_1_NODEFLIB
)
6003 printf (" NODEFLIB");
6004 val
^= DF_1_NODEFLIB
;
6006 if (val
& DF_1_NODUMP
)
6011 if (val
& DF_1_CONLFAT
)
6013 printf (" CONLFAT");
6014 val
^= DF_1_CONLFAT
;
6017 printf (" %lx", val
);
6024 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6026 puts (get_dynamic_type (entry
->d_un
.d_val
));
6046 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6052 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6053 name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6059 switch (entry
->d_tag
)
6062 printf (_("Shared library: [%s]"), name
);
6064 if (streq (name
, program_interpreter
))
6065 printf (_(" program interpreter"));
6069 printf (_("Library soname: [%s]"), name
);
6073 printf (_("Library rpath: [%s]"), name
);
6077 printf (_("Library runpath: [%s]"), name
);
6081 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6086 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6099 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6103 case DT_INIT_ARRAYSZ
:
6104 case DT_FINI_ARRAYSZ
:
6105 case DT_GNU_CONFLICTSZ
:
6106 case DT_GNU_LIBLISTSZ
:
6109 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6110 printf (" (bytes)\n");
6120 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6133 if (entry
->d_tag
== DT_USED
6134 && VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6136 char *name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6140 printf (_("Not needed object: [%s]\n"), name
);
6145 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6151 /* The value of this entry is ignored. */
6156 case DT_GNU_PRELINKED
:
6160 time_t time
= entry
->d_un
.d_val
;
6162 tmp
= gmtime (&time
);
6163 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
6164 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
6165 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
6171 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
6172 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
6177 switch (elf_header
.e_machine
)
6180 case EM_MIPS_RS3_LE
:
6181 dynamic_section_mips_val (entry
);
6184 dynamic_section_parisc_val (entry
);
6187 dynamic_section_ia64_val (entry
);
6190 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6202 get_ver_flags (unsigned int flags
)
6204 static char buff
[32];
6211 if (flags
& VER_FLG_BASE
)
6212 strcat (buff
, "BASE ");
6214 if (flags
& VER_FLG_WEAK
)
6216 if (flags
& VER_FLG_BASE
)
6217 strcat (buff
, "| ");
6219 strcat (buff
, "WEAK ");
6222 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
6223 strcat (buff
, "| <unknown>");
6228 /* Display the contents of the version sections. */
6230 process_version_sections (FILE *file
)
6232 Elf_Internal_Shdr
*section
;
6239 for (i
= 0, section
= section_headers
;
6240 i
< elf_header
.e_shnum
;
6243 switch (section
->sh_type
)
6245 case SHT_GNU_verdef
:
6247 Elf_External_Verdef
*edefs
;
6254 (_("\nVersion definition section '%s' contains %ld entries:\n"),
6255 SECTION_NAME (section
), section
->sh_info
);
6257 printf (_(" Addr: 0x"));
6258 printf_vma (section
->sh_addr
);
6259 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6260 (unsigned long) section
->sh_offset
, section
->sh_link
,
6261 SECTION_HEADER_INDEX (section
->sh_link
)
6262 < elf_header
.e_shnum
6263 ? SECTION_NAME (SECTION_HEADER (section
->sh_link
))
6266 edefs
= get_data (NULL
, file
, section
->sh_offset
, 1,
6268 _("version definition section"));
6272 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6275 Elf_External_Verdef
*edef
;
6276 Elf_Internal_Verdef ent
;
6277 Elf_External_Verdaux
*eaux
;
6278 Elf_Internal_Verdaux aux
;
6282 vstart
= ((char *) edefs
) + idx
;
6284 edef
= (Elf_External_Verdef
*) vstart
;
6286 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
6287 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
6288 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
6289 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
6290 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
6291 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
6292 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
6294 printf (_(" %#06x: Rev: %d Flags: %s"),
6295 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
6297 printf (_(" Index: %d Cnt: %d "),
6298 ent
.vd_ndx
, ent
.vd_cnt
);
6300 vstart
+= ent
.vd_aux
;
6302 eaux
= (Elf_External_Verdaux
*) vstart
;
6304 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6305 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6307 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6308 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux
.vda_name
));
6310 printf (_("Name index: %ld\n"), aux
.vda_name
);
6312 isum
= idx
+ ent
.vd_aux
;
6314 for (j
= 1; j
< ent
.vd_cnt
; j
++)
6316 isum
+= aux
.vda_next
;
6317 vstart
+= aux
.vda_next
;
6319 eaux
= (Elf_External_Verdaux
*) vstart
;
6321 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6322 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6324 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6325 printf (_(" %#06x: Parent %d: %s\n"),
6326 isum
, j
, GET_DYNAMIC_NAME (aux
.vda_name
));
6328 printf (_(" %#06x: Parent %d, name index: %ld\n"),
6329 isum
, j
, aux
.vda_name
);
6339 case SHT_GNU_verneed
:
6341 Elf_External_Verneed
*eneed
;
6347 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
6348 SECTION_NAME (section
), section
->sh_info
);
6350 printf (_(" Addr: 0x"));
6351 printf_vma (section
->sh_addr
);
6352 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
6353 (unsigned long) section
->sh_offset
, section
->sh_link
,
6354 SECTION_HEADER_INDEX (section
->sh_link
)
6355 < elf_header
.e_shnum
6356 ? SECTION_NAME (SECTION_HEADER (section
->sh_link
))
6359 eneed
= get_data (NULL
, file
, section
->sh_offset
, 1,
6361 _("version need section"));
6365 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6367 Elf_External_Verneed
*entry
;
6368 Elf_Internal_Verneed ent
;
6373 vstart
= ((char *) eneed
) + idx
;
6375 entry
= (Elf_External_Verneed
*) vstart
;
6377 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
6378 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
6379 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
6380 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
6381 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
6383 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
6385 if (VALID_DYNAMIC_NAME (ent
.vn_file
))
6386 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent
.vn_file
));
6388 printf (_(" File: %lx"), ent
.vn_file
);
6390 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
6392 vstart
+= ent
.vn_aux
;
6394 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
6396 Elf_External_Vernaux
*eaux
;
6397 Elf_Internal_Vernaux aux
;
6399 eaux
= (Elf_External_Vernaux
*) vstart
;
6401 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
6402 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
6403 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
6404 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
6405 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
6407 if (VALID_DYNAMIC_NAME (aux
.vna_name
))
6408 printf (_(" %#06x: Name: %s"),
6409 isum
, GET_DYNAMIC_NAME (aux
.vna_name
));
6411 printf (_(" %#06x: Name index: %lx"),
6412 isum
, aux
.vna_name
);
6414 printf (_(" Flags: %s Version: %d\n"),
6415 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
6417 isum
+= aux
.vna_next
;
6418 vstart
+= aux
.vna_next
;
6428 case SHT_GNU_versym
:
6430 Elf_Internal_Shdr
*link_section
;
6433 unsigned char *edata
;
6434 unsigned short *data
;
6436 Elf_Internal_Sym
*symbols
;
6437 Elf_Internal_Shdr
*string_sec
;
6440 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
)
6443 link_section
= SECTION_HEADER (section
->sh_link
);
6444 total
= section
->sh_size
/ sizeof (Elf_External_Versym
);
6446 if (SECTION_HEADER_INDEX (link_section
->sh_link
)
6447 >= elf_header
.e_shnum
)
6452 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
6454 string_sec
= SECTION_HEADER (link_section
->sh_link
);
6456 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
6457 string_sec
->sh_size
, _("version string table"));
6461 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6462 SECTION_NAME (section
), total
);
6464 printf (_(" Addr: "));
6465 printf_vma (section
->sh_addr
);
6466 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6467 (unsigned long) section
->sh_offset
, section
->sh_link
,
6468 SECTION_NAME (link_section
));
6470 off
= offset_from_vma (file
,
6471 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6472 total
* sizeof (short));
6473 edata
= get_data (NULL
, file
, off
, total
, sizeof (short),
6474 _("version symbol data"));
6481 data
= cmalloc (total
, sizeof (short));
6483 for (cnt
= total
; cnt
--;)
6484 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
6489 for (cnt
= 0; cnt
< total
; cnt
+= 4)
6492 int check_def
, check_need
;
6495 printf (" %03x:", cnt
);
6497 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
6498 switch (data
[cnt
+ j
])
6501 fputs (_(" 0 (*local*) "), stdout
);
6505 fputs (_(" 1 (*global*) "), stdout
);
6509 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
6510 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
6514 if (SECTION_HEADER_INDEX (symbols
[cnt
+ j
].st_shndx
)
6515 >= elf_header
.e_shnum
6516 || SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
6519 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
6526 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
6528 Elf_Internal_Verneed ivn
;
6529 unsigned long offset
;
6531 offset
= offset_from_vma
6532 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6533 sizeof (Elf_External_Verneed
));
6537 Elf_Internal_Vernaux ivna
;
6538 Elf_External_Verneed evn
;
6539 Elf_External_Vernaux evna
;
6540 unsigned long a_off
;
6542 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
6545 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6546 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6548 a_off
= offset
+ ivn
.vn_aux
;
6552 get_data (&evna
, file
, a_off
, sizeof (evna
),
6553 1, _("version need aux (2)"));
6555 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6556 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6558 a_off
+= ivna
.vna_next
;
6560 while (ivna
.vna_other
!= data
[cnt
+ j
]
6561 && ivna
.vna_next
!= 0);
6563 if (ivna
.vna_other
== data
[cnt
+ j
])
6565 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6567 name
= strtab
+ ivna
.vna_name
;
6568 nn
+= printf ("(%s%-*s",
6570 12 - (int) strlen (name
),
6576 offset
+= ivn
.vn_next
;
6578 while (ivn
.vn_next
);
6581 if (check_def
&& data
[cnt
+ j
] != 0x8001
6582 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6584 Elf_Internal_Verdef ivd
;
6585 Elf_External_Verdef evd
;
6586 unsigned long offset
;
6588 offset
= offset_from_vma
6589 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6594 get_data (&evd
, file
, offset
, sizeof (evd
), 1,
6597 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6598 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6600 offset
+= ivd
.vd_next
;
6602 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
6603 && ivd
.vd_next
!= 0);
6605 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
6607 Elf_External_Verdaux evda
;
6608 Elf_Internal_Verdaux ivda
;
6610 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6612 get_data (&evda
, file
,
6613 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
6615 _("version def aux"));
6617 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6619 name
= strtab
+ ivda
.vda_name
;
6620 nn
+= printf ("(%s%-*s",
6622 12 - (int) strlen (name
),
6628 printf ("%*c", 18 - nn
, ' ');
6646 printf (_("\nNo version information found in this file.\n"));
6652 get_symbol_binding (unsigned int binding
)
6654 static char buff
[32];
6658 case STB_LOCAL
: return "LOCAL";
6659 case STB_GLOBAL
: return "GLOBAL";
6660 case STB_WEAK
: return "WEAK";
6662 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
6663 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"),
6665 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
6666 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), binding
);
6668 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), binding
);
6674 get_symbol_type (unsigned int type
)
6676 static char buff
[32];
6680 case STT_NOTYPE
: return "NOTYPE";
6681 case STT_OBJECT
: return "OBJECT";
6682 case STT_FUNC
: return "FUNC";
6683 case STT_SECTION
: return "SECTION";
6684 case STT_FILE
: return "FILE";
6685 case STT_COMMON
: return "COMMON";
6686 case STT_TLS
: return "TLS";
6688 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
6690 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
6691 return "THUMB_FUNC";
6693 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
6696 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
6697 return "PARISC_MILLI";
6699 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"), type
);
6701 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
6703 if (elf_header
.e_machine
== EM_PARISC
)
6705 if (type
== STT_HP_OPAQUE
)
6707 if (type
== STT_HP_STUB
)
6711 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), type
);
6714 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), type
);
6720 get_symbol_visibility (unsigned int visibility
)
6724 case STV_DEFAULT
: return "DEFAULT";
6725 case STV_INTERNAL
: return "INTERNAL";
6726 case STV_HIDDEN
: return "HIDDEN";
6727 case STV_PROTECTED
: return "PROTECTED";
6733 get_mips_symbol_other (unsigned int other
)
6737 case STO_OPTIONAL
: return "OPTIONAL";
6738 case STO_MIPS16
: return "MIPS16";
6739 default: return NULL
;
6744 get_symbol_other (unsigned int other
)
6746 const char * result
= NULL
;
6747 static char buff
[32];
6752 switch (elf_header
.e_machine
)
6755 result
= get_mips_symbol_other (other
);
6763 snprintf (buff
, sizeof buff
, _("<other>: %x"), other
);
6768 get_symbol_index_type (unsigned int type
)
6770 static char buff
[32];
6774 case SHN_UNDEF
: return "UND";
6775 case SHN_ABS
: return "ABS";
6776 case SHN_COMMON
: return "COM";
6778 if (type
== SHN_IA_64_ANSI_COMMON
6779 && elf_header
.e_machine
== EM_IA_64
6780 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
6782 else if (elf_header
.e_machine
== EM_X86_64
6783 && type
== SHN_X86_64_LCOMMON
)
6785 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
6786 sprintf (buff
, "PRC[0x%04x]", type
);
6787 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
6788 sprintf (buff
, "OS [0x%04x]", type
);
6789 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
6790 sprintf (buff
, "RSV[0x%04x]", type
);
6792 sprintf (buff
, "%3d", type
);
6800 get_dynamic_data (FILE *file
, unsigned int number
, unsigned int ent_size
)
6802 unsigned char *e_data
;
6805 e_data
= cmalloc (number
, ent_size
);
6809 error (_("Out of memory\n"));
6813 if (fread (e_data
, ent_size
, number
, file
) != number
)
6815 error (_("Unable to read in dynamic data\n"));
6819 i_data
= cmalloc (number
, sizeof (*i_data
));
6823 error (_("Out of memory\n"));
6829 i_data
[number
] = byte_get (e_data
+ number
* ent_size
, ent_size
);
6836 /* Dump the symbol table. */
6838 process_symbol_table (FILE *file
)
6840 Elf_Internal_Shdr
*section
;
6841 bfd_vma nbuckets
= 0;
6842 bfd_vma nchains
= 0;
6843 bfd_vma
*buckets
= NULL
;
6844 bfd_vma
*chains
= NULL
;
6846 if (! do_syms
&& !do_histogram
)
6849 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
6852 unsigned char nb
[8];
6853 unsigned char nc
[8];
6854 int hash_ent_size
= 4;
6856 if ((elf_header
.e_machine
== EM_ALPHA
6857 || elf_header
.e_machine
== EM_S390
6858 || elf_header
.e_machine
== EM_S390_OLD
)
6859 && elf_header
.e_ident
[EI_CLASS
] == ELFCLASS64
)
6863 (archive_file_offset
6864 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
6865 sizeof nb
+ sizeof nc
)),
6868 error (_("Unable to seek to start of dynamic information"));
6872 if (fread (nb
, hash_ent_size
, 1, file
) != 1)
6874 error (_("Failed to read in number of buckets\n"));
6878 if (fread (nc
, hash_ent_size
, 1, file
) != 1)
6880 error (_("Failed to read in number of chains\n"));
6884 nbuckets
= byte_get (nb
, hash_ent_size
);
6885 nchains
= byte_get (nc
, hash_ent_size
);
6887 buckets
= get_dynamic_data (file
, nbuckets
, hash_ent_size
);
6888 chains
= get_dynamic_data (file
, nchains
, hash_ent_size
);
6890 if (buckets
== NULL
|| chains
== NULL
)
6895 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
6900 printf (_("\nSymbol table for image:\n"));
6902 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6904 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6906 for (hn
= 0; hn
< nbuckets
; hn
++)
6911 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
6913 Elf_Internal_Sym
*psym
;
6916 psym
= dynamic_symbols
+ si
;
6918 n
= print_vma (si
, DEC_5
);
6920 fputs (" " + n
, stdout
);
6921 printf (" %3lu: ", hn
);
6922 print_vma (psym
->st_value
, LONG_HEX
);
6924 print_vma (psym
->st_size
, DEC_5
);
6926 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6927 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
6928 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6929 /* Check to see if any other bits in the st_other field are set.
6930 Note - displaying this information disrupts the layout of the
6931 table being generated, but for the moment this case is very rare. */
6932 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
6933 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
6934 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
6935 if (VALID_DYNAMIC_NAME (psym
->st_name
))
6936 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
6938 printf (" <corrupt: %14ld>", psym
->st_name
);
6943 else if (do_syms
&& !do_using_dynamic
)
6947 for (i
= 0, section
= section_headers
;
6948 i
< elf_header
.e_shnum
;
6952 char *strtab
= NULL
;
6953 unsigned long int strtab_size
= 0;
6954 Elf_Internal_Sym
*symtab
;
6955 Elf_Internal_Sym
*psym
;
6958 if ( section
->sh_type
!= SHT_SYMTAB
6959 && section
->sh_type
!= SHT_DYNSYM
)
6962 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
6963 SECTION_NAME (section
),
6964 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
6966 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6968 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6970 symtab
= GET_ELF_SYMBOLS (file
, section
);
6974 if (section
->sh_link
== elf_header
.e_shstrndx
)
6976 strtab
= string_table
;
6977 strtab_size
= string_table_length
;
6979 else if (SECTION_HEADER_INDEX (section
->sh_link
) < elf_header
.e_shnum
)
6981 Elf_Internal_Shdr
*string_sec
;
6983 string_sec
= SECTION_HEADER (section
->sh_link
);
6985 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
6986 1, string_sec
->sh_size
, _("string table"));
6987 strtab_size
= strtab
!= NULL
? string_sec
->sh_size
: 0;
6990 for (si
= 0, psym
= symtab
;
6991 si
< section
->sh_size
/ section
->sh_entsize
;
6994 printf ("%6d: ", si
);
6995 print_vma (psym
->st_value
, LONG_HEX
);
6997 print_vma (psym
->st_size
, DEC_5
);
6998 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6999 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
7000 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
7001 /* Check to see if any other bits in the st_other field are set.
7002 Note - displaying this information disrupts the layout of the
7003 table being generated, but for the moment this case is very rare. */
7004 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
7005 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
7006 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
7007 print_symbol (25, psym
->st_name
< strtab_size
7008 ? strtab
+ psym
->st_name
: "<corrupt>");
7010 if (section
->sh_type
== SHT_DYNSYM
&&
7011 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
7013 unsigned char data
[2];
7014 unsigned short vers_data
;
7015 unsigned long offset
;
7019 offset
= offset_from_vma
7020 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
7021 sizeof data
+ si
* sizeof (vers_data
));
7023 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
7024 sizeof (data
), 1, _("version data"));
7026 vers_data
= byte_get (data
, 2);
7028 is_nobits
= (SECTION_HEADER_INDEX (psym
->st_shndx
)
7029 < elf_header
.e_shnum
7030 && SECTION_HEADER (psym
->st_shndx
)->sh_type
7033 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
7035 if ((vers_data
& 0x8000) || vers_data
> 1)
7037 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
7038 && (is_nobits
|| ! check_def
))
7040 Elf_External_Verneed evn
;
7041 Elf_Internal_Verneed ivn
;
7042 Elf_Internal_Vernaux ivna
;
7044 /* We must test both. */
7045 offset
= offset_from_vma
7046 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
7051 unsigned long vna_off
;
7053 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
7056 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
7057 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
7059 vna_off
= offset
+ ivn
.vn_aux
;
7063 Elf_External_Vernaux evna
;
7065 get_data (&evna
, file
, vna_off
,
7067 _("version need aux (3)"));
7069 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
7070 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
7071 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
7073 vna_off
+= ivna
.vna_next
;
7075 while (ivna
.vna_other
!= vers_data
7076 && ivna
.vna_next
!= 0);
7078 if (ivna
.vna_other
== vers_data
)
7081 offset
+= ivn
.vn_next
;
7083 while (ivn
.vn_next
!= 0);
7085 if (ivna
.vna_other
== vers_data
)
7088 ivna
.vna_name
< strtab_size
7089 ? strtab
+ ivna
.vna_name
: "<corrupt>",
7093 else if (! is_nobits
)
7094 error (_("bad dynamic symbol"));
7101 if (vers_data
!= 0x8001
7102 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
7104 Elf_Internal_Verdef ivd
;
7105 Elf_Internal_Verdaux ivda
;
7106 Elf_External_Verdaux evda
;
7107 unsigned long offset
;
7109 offset
= offset_from_vma
7111 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
7112 sizeof (Elf_External_Verdef
));
7116 Elf_External_Verdef evd
;
7118 get_data (&evd
, file
, offset
, sizeof (evd
),
7119 1, _("version def"));
7121 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
7122 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
7123 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
7125 offset
+= ivd
.vd_next
;
7127 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
7128 && ivd
.vd_next
!= 0);
7130 offset
-= ivd
.vd_next
;
7131 offset
+= ivd
.vd_aux
;
7133 get_data (&evda
, file
, offset
, sizeof (evda
),
7134 1, _("version def aux"));
7136 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
7138 if (psym
->st_name
!= ivda
.vda_name
)
7139 printf ((vers_data
& 0x8000)
7141 ivda
.vda_name
< strtab_size
7142 ? strtab
+ ivda
.vda_name
: "<corrupt>");
7152 if (strtab
!= string_table
)
7158 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
7160 if (do_histogram
&& buckets
!= NULL
)
7162 unsigned long *lengths
;
7163 unsigned long *counts
;
7166 unsigned long maxlength
= 0;
7167 unsigned long nzero_counts
= 0;
7168 unsigned long nsyms
= 0;
7170 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
7171 (unsigned long) nbuckets
);
7172 printf (_(" Length Number %% of total Coverage\n"));
7174 lengths
= calloc (nbuckets
, sizeof (*lengths
));
7175 if (lengths
== NULL
)
7177 error (_("Out of memory"));
7180 for (hn
= 0; hn
< nbuckets
; ++hn
)
7182 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
7185 if (maxlength
< ++lengths
[hn
])
7190 counts
= calloc (maxlength
+ 1, sizeof (*counts
));
7193 error (_("Out of memory"));
7197 for (hn
= 0; hn
< nbuckets
; ++hn
)
7198 ++counts
[lengths
[hn
]];
7203 printf (" 0 %-10lu (%5.1f%%)\n",
7204 counts
[0], (counts
[0] * 100.0) / nbuckets
);
7205 for (i
= 1; i
<= maxlength
; ++i
)
7207 nzero_counts
+= counts
[i
] * i
;
7208 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7209 i
, counts
[i
], (counts
[i
] * 100.0) / nbuckets
,
7210 (nzero_counts
* 100.0) / nsyms
);
7218 if (buckets
!= NULL
)
7228 process_syminfo (FILE *file ATTRIBUTE_UNUSED
)
7232 if (dynamic_syminfo
== NULL
7234 /* No syminfo, this is ok. */
7237 /* There better should be a dynamic symbol section. */
7238 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
7242 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
7243 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
7245 printf (_(" Num: Name BoundTo Flags\n"));
7246 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
7248 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
7250 printf ("%4d: ", i
);
7251 if (VALID_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
))
7252 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
));
7254 printf ("<corrupt: %19ld>", dynamic_symbols
[i
].st_name
);
7257 switch (dynamic_syminfo
[i
].si_boundto
)
7259 case SYMINFO_BT_SELF
:
7260 fputs ("SELF ", stdout
);
7262 case SYMINFO_BT_PARENT
:
7263 fputs ("PARENT ", stdout
);
7266 if (dynamic_syminfo
[i
].si_boundto
> 0
7267 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
7268 && VALID_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
7270 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
7274 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
7278 if (flags
& SYMINFO_FLG_DIRECT
)
7280 if (flags
& SYMINFO_FLG_PASSTHRU
)
7281 printf (" PASSTHRU");
7282 if (flags
& SYMINFO_FLG_COPY
)
7284 if (flags
& SYMINFO_FLG_LAZYLOAD
)
7285 printf (" LAZYLOAD");
7293 #ifdef SUPPORT_DISASSEMBLY
7295 disassemble_section (Elf_Internal_Shdr
*section
, FILE *file
)
7297 printf (_("\nAssembly dump of section %s\n"),
7298 SECTION_NAME (section
));
7300 /* XXX -- to be done --- XXX */
7307 dump_section (Elf_Internal_Shdr
*section
, FILE *file
)
7309 bfd_size_type bytes
;
7311 unsigned char *data
;
7312 unsigned char *start
;
7314 bytes
= section
->sh_size
;
7316 if (bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
7318 printf (_("\nSection '%s' has no data to dump.\n"),
7319 SECTION_NAME (section
));
7323 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
7325 addr
= section
->sh_addr
;
7327 start
= get_data (NULL
, file
, section
->sh_offset
, 1, bytes
,
7340 lbytes
= (bytes
> 16 ? 16 : bytes
);
7342 printf (" 0x%8.8lx ", (unsigned long) addr
);
7344 switch (elf_header
.e_ident
[EI_DATA
])
7348 for (j
= 15; j
>= 0; j
--)
7351 printf ("%2.2x", data
[j
]);
7361 for (j
= 0; j
< 16; j
++)
7364 printf ("%2.2x", data
[j
]);
7374 for (j
= 0; j
< lbytes
; j
++)
7377 if (k
>= ' ' && k
< 0x7f)
7395 /* Apply addends of RELA relocations. */
7398 debug_apply_rela_addends (void *file
,
7399 Elf_Internal_Shdr
*section
,
7400 unsigned char *start
)
7402 Elf_Internal_Shdr
*relsec
;
7403 unsigned char *end
= start
+ section
->sh_size
;
7404 /* FIXME: The relocation field size is relocation type dependent. */
7405 unsigned int reloc_size
= 4;
7407 if (!is_relocatable
)
7410 if (section
->sh_size
< reloc_size
)
7413 for (relsec
= section_headers
;
7414 relsec
< section_headers
+ elf_header
.e_shnum
;
7417 unsigned long nrelas
;
7418 Elf_Internal_Rela
*rela
, *rp
;
7419 Elf_Internal_Shdr
*symsec
;
7420 Elf_Internal_Sym
*symtab
;
7421 Elf_Internal_Sym
*sym
;
7423 if (relsec
->sh_type
!= SHT_RELA
7424 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
7425 || SECTION_HEADER (relsec
->sh_info
) != section
7426 || relsec
->sh_size
== 0
7427 || SECTION_HEADER_INDEX (relsec
->sh_link
) >= elf_header
.e_shnum
)
7430 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
7434 symsec
= SECTION_HEADER (relsec
->sh_link
);
7435 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
7437 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
7441 loc
= start
+ rp
->r_offset
;
7442 if ((loc
+ reloc_size
) > end
)
7444 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
7445 (unsigned long) rp
->r_offset
,
7446 SECTION_NAME (section
));
7452 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
7454 if (ELF32_R_SYM (rp
->r_info
) != 0
7455 && ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
7456 /* Relocations against object symbols can happen,
7457 eg when referencing a global array. For an
7458 example of this see the _clz.o binary in libgcc.a. */
7459 && ELF32_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
7461 warn (_("skipping unexpected symbol type %s in relocation in section .rela%s\n"),
7462 get_symbol_type (ELF32_ST_TYPE (sym
->st_info
)),
7463 SECTION_NAME (section
));
7469 /* In MIPS little-endian objects, r_info isn't really a
7470 64-bit little-endian value: it has a 32-bit little-endian
7471 symbol index followed by four individual byte fields.
7472 Reorder INFO accordingly. */
7473 if (elf_header
.e_machine
== EM_MIPS
7474 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
7475 rp
->r_info
= (((rp
->r_info
& 0xffffffff) << 32)
7476 | ((rp
->r_info
>> 56) & 0xff)
7477 | ((rp
->r_info
>> 40) & 0xff00)
7478 | ((rp
->r_info
>> 24) & 0xff0000)
7479 | ((rp
->r_info
>> 8) & 0xff000000));
7481 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
7483 if (ELF64_R_SYM (rp
->r_info
) != 0
7484 && ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
7485 && ELF64_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
7487 warn (_("skipping unexpected symbol type %s in relocation in section .rela.%s\n"),
7488 get_symbol_type (ELF64_ST_TYPE (sym
->st_info
)),
7489 SECTION_NAME (section
));
7494 byte_put (loc
, rp
->r_addend
, reloc_size
);
7505 load_debug_section (enum dwarf_section_display_enum debug
, void *file
)
7507 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
7508 Elf_Internal_Shdr
*sec
;
7511 /* If it is already loaded, do nothing. */
7512 if (section
->start
!= NULL
)
7515 /* Locate the debug section. */
7516 sec
= find_section (section
->name
);
7520 snprintf (buf
, sizeof (buf
), _("%s section data"), section
->name
);
7521 section
->address
= sec
->sh_addr
;
7522 section
->size
= sec
->sh_size
;
7523 section
->start
= get_data (NULL
, file
, sec
->sh_offset
, 1,
7526 if (debug_displays
[debug
].relocate
)
7527 debug_apply_rela_addends (file
, sec
, section
->start
);
7529 return section
->start
!= NULL
;
7533 free_debug_section (enum dwarf_section_display_enum debug
)
7535 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
7537 if (section
->start
== NULL
)
7540 free ((char *) section
->start
);
7541 section
->start
= NULL
;
7542 section
->address
= 0;
7547 display_debug_section (Elf_Internal_Shdr
*section
, FILE *file
)
7549 char *name
= SECTION_NAME (section
);
7550 bfd_size_type length
;
7552 enum dwarf_section_display_enum i
;
7554 length
= section
->sh_size
;
7557 printf (_("\nSection '%s' has no debugging data.\n"), name
);
7561 if (strneq (name
, ".gnu.linkonce.wi.", 17))
7562 name
= ".debug_info";
7564 /* See if we know how to display the contents of this section. */
7565 for (i
= 0; i
< max
; i
++)
7566 if (streq (debug_displays
[i
].section
.name
, name
))
7568 struct dwarf_section
*sec
= &debug_displays
[i
].section
;
7570 if (load_debug_section (i
, file
))
7572 result
&= debug_displays
[i
].display (sec
, file
);
7574 if (i
!= info
&& i
!= abbrev
)
7575 free_debug_section (i
);
7583 printf (_("Unrecognized debug section: %s\n"), name
);
7590 /* Set DUMP_SECTS for all sections where dumps were requested
7591 based on section name. */
7594 initialise_dumps_byname (void)
7596 struct dump_list_entry
*cur
;
7598 for (cur
= dump_sects_byname
; cur
; cur
= cur
->next
)
7603 for (i
= 0, any
= 0; i
< elf_header
.e_shnum
; i
++)
7604 if (streq (SECTION_NAME (section_headers
+ i
), cur
->name
))
7606 request_dump (i
, cur
->type
);
7611 warn (_("Section '%s' was not dumped because it does not exist!\n"),
7617 process_section_contents (FILE *file
)
7619 Elf_Internal_Shdr
*section
;
7625 initialise_dumps_byname ();
7627 for (i
= 0, section
= section_headers
;
7628 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
7631 #ifdef SUPPORT_DISASSEMBLY
7632 if (dump_sects
[i
] & DISASS_DUMP
)
7633 disassemble_section (section
, file
);
7635 if (dump_sects
[i
] & HEX_DUMP
)
7636 dump_section (section
, file
);
7638 if (dump_sects
[i
] & DEBUG_DUMP
)
7639 display_debug_section (section
, file
);
7642 /* Check to see if the user requested a
7643 dump of a section that does not exist. */
7644 while (i
++ < num_dump_sects
)
7646 warn (_("Section %d was not dumped because it does not exist!\n"), i
);
7650 process_mips_fpe_exception (int mask
)
7655 if (mask
& OEX_FPU_INEX
)
7656 fputs ("INEX", stdout
), first
= 0;
7657 if (mask
& OEX_FPU_UFLO
)
7658 printf ("%sUFLO", first
? "" : "|"), first
= 0;
7659 if (mask
& OEX_FPU_OFLO
)
7660 printf ("%sOFLO", first
? "" : "|"), first
= 0;
7661 if (mask
& OEX_FPU_DIV0
)
7662 printf ("%sDIV0", first
? "" : "|"), first
= 0;
7663 if (mask
& OEX_FPU_INVAL
)
7664 printf ("%sINVAL", first
? "" : "|");
7667 fputs ("0", stdout
);
7670 /* ARM EABI attributes section. */
7675 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
7678 } arm_attr_public_tag
;
7680 static const char *arm_attr_tag_CPU_arch
[] =
7681 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
7683 static const char *arm_attr_tag_ARM_ISA_use
[] = {"No", "Yes"};
7684 static const char *arm_attr_tag_THUMB_ISA_use
[] =
7685 {"No", "Thumb-1", "Thumb-2"};
7686 static const char *arm_attr_tag_VFP_arch
[] = {"No", "VFPv1", "VFPv2"};
7687 static const char *arm_attr_tag_WMMX_arch
[] = {"No", "WMMXv1"};
7688 static const char *arm_attr_tag_NEON_arch
[] = {"No", "NEONv1"};
7689 static const char *arm_attr_tag_ABI_PCS_config
[] =
7690 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
7691 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
7692 static const char *arm_attr_tag_ABI_PCS_R9_use
[] =
7693 {"V6", "SB", "TLS", "Unused"};
7694 static const char *arm_attr_tag_ABI_PCS_RW_data
[] =
7695 {"Absolute", "PC-relative", "SB-relative", "None"};
7696 static const char *arm_attr_tag_ABI_PCS_RO_DATA
[] =
7697 {"Absolute", "PC-relative", "None"};
7698 static const char *arm_attr_tag_ABI_PCS_GOT_use
[] =
7699 {"None", "direct", "GOT-indirect"};
7700 static const char *arm_attr_tag_ABI_PCS_wchar_t
[] =
7701 {"None", "??? 1", "2", "??? 3", "4"};
7702 static const char *arm_attr_tag_ABI_FP_rounding
[] = {"Unused", "Needed"};
7703 static const char *arm_attr_tag_ABI_FP_denormal
[] = {"Unused", "Needed"};
7704 static const char *arm_attr_tag_ABI_FP_exceptions
[] = {"Unused", "Needed"};
7705 static const char *arm_attr_tag_ABI_FP_user_exceptions
[] = {"Unused", "Needed"};
7706 static const char *arm_attr_tag_ABI_FP_number_model
[] =
7707 {"Unused", "Finite", "RTABI", "IEEE 754"};
7708 static const char *arm_attr_tag_ABI_align8_needed
[] = {"No", "Yes", "4-byte"};
7709 static const char *arm_attr_tag_ABI_align8_preserved
[] =
7710 {"No", "Yes, except leaf SP", "Yes"};
7711 static const char *arm_attr_tag_ABI_enum_size
[] =
7712 {"Unused", "small", "int", "forced to int"};
7713 static const char *arm_attr_tag_ABI_HardFP_use
[] =
7714 {"As Tag_VFP_arch", "SP only", "DP only", "SP and DP"};
7715 static const char *arm_attr_tag_ABI_VFP_args
[] =
7716 {"AAPCS", "VFP registers", "custom"};
7717 static const char *arm_attr_tag_ABI_WMMX_args
[] =
7718 {"AAPCS", "WMMX registers", "custom"};
7719 static const char *arm_attr_tag_ABI_optimization_goals
[] =
7720 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
7721 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
7722 static const char *arm_attr_tag_ABI_FP_optimization_goals
[] =
7723 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
7724 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
7726 #define LOOKUP(id, name) \
7727 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
7728 static arm_attr_public_tag arm_attr_public_tags
[] =
7730 {4, "CPU_raw_name", 1, NULL
},
7731 {5, "CPU_name", 1, NULL
},
7732 LOOKUP(6, CPU_arch
),
7733 {7, "CPU_arch_profile", 0, NULL
},
7734 LOOKUP(8, ARM_ISA_use
),
7735 LOOKUP(9, THUMB_ISA_use
),
7736 LOOKUP(10, VFP_arch
),
7737 LOOKUP(11, WMMX_arch
),
7738 LOOKUP(12, NEON_arch
),
7739 LOOKUP(13, ABI_PCS_config
),
7740 LOOKUP(14, ABI_PCS_R9_use
),
7741 LOOKUP(15, ABI_PCS_RW_data
),
7742 LOOKUP(16, ABI_PCS_RO_DATA
),
7743 LOOKUP(17, ABI_PCS_GOT_use
),
7744 LOOKUP(18, ABI_PCS_wchar_t
),
7745 LOOKUP(19, ABI_FP_rounding
),
7746 LOOKUP(20, ABI_FP_denormal
),
7747 LOOKUP(21, ABI_FP_exceptions
),
7748 LOOKUP(22, ABI_FP_user_exceptions
),
7749 LOOKUP(23, ABI_FP_number_model
),
7750 LOOKUP(24, ABI_align8_needed
),
7751 LOOKUP(25, ABI_align8_preserved
),
7752 LOOKUP(26, ABI_enum_size
),
7753 LOOKUP(27, ABI_HardFP_use
),
7754 LOOKUP(28, ABI_VFP_args
),
7755 LOOKUP(29, ABI_WMMX_args
),
7756 LOOKUP(30, ABI_optimization_goals
),
7757 LOOKUP(31, ABI_FP_optimization_goals
),
7758 {32, "compatibility", 0, NULL
}
7762 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
7765 read_uleb128 (unsigned char *p
, unsigned int *plen
)
7779 val
|= ((unsigned int)c
& 0x7f) << shift
;
7788 static unsigned char *
7789 display_arm_attribute (unsigned char *p
)
7794 arm_attr_public_tag
*attr
;
7798 tag
= read_uleb128 (p
, &len
);
7801 for (i
= 0; i
< ARRAY_SIZE(arm_attr_public_tags
); i
++)
7803 if (arm_attr_public_tags
[i
].tag
== tag
)
7805 attr
= &arm_attr_public_tags
[i
];
7812 printf (" Tag_%s: ", attr
->name
);
7818 case 7: /* Tag_CPU_arch_profile. */
7819 val
= read_uleb128 (p
, &len
);
7823 case 0: printf ("None\n"); break;
7824 case 'A': printf ("Application\n"); break;
7825 case 'R': printf ("Realtime\n"); break;
7826 case 'M': printf ("Microcontroller\n"); break;
7827 default: printf ("??? (%d)\n", val
); break;
7831 case 32: /* Tag_compatibility. */
7832 val
= read_uleb128 (p
, &len
);
7834 printf ("flag = %d, vendor = %s\n", val
, p
);
7835 p
+= strlen((char *)p
) + 1;
7849 assert (attr
->type
& 0x80);
7850 val
= read_uleb128 (p
, &len
);
7852 type
= attr
->type
& 0x7f;
7854 printf ("??? (%d)\n", val
);
7856 printf ("%s\n", attr
->table
[val
]);
7863 type
= 1; /* String. */
7865 type
= 2; /* uleb128. */
7866 printf (" Tag_unknown_%d: ", tag
);
7871 printf ("\"%s\"\n", p
);
7872 p
+= strlen((char *)p
) + 1;
7876 val
= read_uleb128 (p
, &len
);
7878 printf ("%d (0x%x)\n", val
, val
);
7885 process_arm_specific (FILE *file
)
7887 Elf_Internal_Shdr
*sect
;
7888 unsigned char *contents
;
7891 bfd_vma section_len
;
7895 /* Find the section header so that we get the size. */
7896 for (i
= 0, sect
= section_headers
;
7897 i
< elf_header
.e_shnum
;
7900 if (sect
->sh_type
!= SHT_ARM_ATTRIBUTES
)
7903 contents
= get_data (NULL
, file
, sect
->sh_offset
, 1, sect
->sh_size
,
7911 len
= sect
->sh_size
- 1;
7916 bfd_boolean public_section
;
7918 section_len
= byte_get (p
, 4);
7920 if (section_len
> len
)
7922 printf (_("ERROR: Bad section length (%d > %d)\n"),
7923 (int)section_len
, (int)len
);
7927 printf ("Attribute Section: %s\n", p
);
7928 if (strcmp ((char *)p
, "aeabi") == 0)
7929 public_section
= TRUE
;
7931 public_section
= FALSE
;
7932 namelen
= strlen ((char *)p
) + 1;
7934 section_len
-= namelen
+ 4;
7935 while (section_len
> 0)
7940 size
= byte_get (p
, 4);
7941 if (size
> section_len
)
7943 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
7944 (int)size
, (int)section_len
);
7947 section_len
-= size
;
7953 printf ("File Attributes\n");
7956 printf ("Section Attributes:");
7959 printf ("Symbol Attributes:");
7964 val
= read_uleb128 (p
, &i
);
7968 printf (" %d", val
);
7973 printf ("Unknown tag: %d\n", tag
);
7974 public_section
= FALSE
;
7980 p
= display_arm_attribute(p
);
7984 /* ??? Do something sensible, like dump hex. */
7985 printf (" Unknown section contexts\n");
7993 printf (_("Unknown format '%c'\n"), *p
);
8002 process_mips_specific (FILE *file
)
8004 Elf_Internal_Dyn
*entry
;
8005 size_t liblist_offset
= 0;
8006 size_t liblistno
= 0;
8007 size_t conflictsno
= 0;
8008 size_t options_offset
= 0;
8009 size_t conflicts_offset
= 0;
8011 /* We have a lot of special sections. Thanks SGI! */
8012 if (dynamic_section
== NULL
)
8013 /* No information available. */
8016 for (entry
= dynamic_section
; entry
->d_tag
!= DT_NULL
; ++entry
)
8017 switch (entry
->d_tag
)
8019 case DT_MIPS_LIBLIST
:
8021 = offset_from_vma (file
, entry
->d_un
.d_val
,
8022 liblistno
* sizeof (Elf32_External_Lib
));
8024 case DT_MIPS_LIBLISTNO
:
8025 liblistno
= entry
->d_un
.d_val
;
8027 case DT_MIPS_OPTIONS
:
8028 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
8030 case DT_MIPS_CONFLICT
:
8032 = offset_from_vma (file
, entry
->d_un
.d_val
,
8033 conflictsno
* sizeof (Elf32_External_Conflict
));
8035 case DT_MIPS_CONFLICTNO
:
8036 conflictsno
= entry
->d_un
.d_val
;
8042 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
8044 Elf32_External_Lib
*elib
;
8047 elib
= get_data (NULL
, file
, liblist_offset
,
8048 liblistno
, sizeof (Elf32_External_Lib
),
8052 printf ("\nSection '.liblist' contains %lu entries:\n",
8053 (unsigned long) liblistno
);
8054 fputs (" Library Time Stamp Checksum Version Flags\n",
8057 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
8064 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
8065 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
8066 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
8067 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
8068 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
8070 tmp
= gmtime (&time
);
8071 snprintf (timebuf
, sizeof (timebuf
),
8072 "%04u-%02u-%02uT%02u:%02u:%02u",
8073 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
8074 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
8076 printf ("%3lu: ", (unsigned long) cnt
);
8077 if (VALID_DYNAMIC_NAME (liblist
.l_name
))
8078 print_symbol (20, GET_DYNAMIC_NAME (liblist
.l_name
));
8080 printf ("<corrupt: %9ld>", liblist
.l_name
);
8081 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
8084 if (liblist
.l_flags
== 0)
8095 { " EXACT_MATCH", LL_EXACT_MATCH
},
8096 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
8097 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
8098 { " EXPORTS", LL_EXPORTS
},
8099 { " DELAY_LOAD", LL_DELAY_LOAD
},
8100 { " DELTA", LL_DELTA
}
8102 int flags
= liblist
.l_flags
;
8106 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
8108 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
8110 fputs (l_flags_vals
[fcnt
].name
, stdout
);
8111 flags
^= l_flags_vals
[fcnt
].bit
;
8114 printf (" %#x", (unsigned int) flags
);
8124 if (options_offset
!= 0)
8126 Elf_External_Options
*eopt
;
8127 Elf_Internal_Shdr
*sect
= section_headers
;
8128 Elf_Internal_Options
*iopt
;
8129 Elf_Internal_Options
*option
;
8133 /* Find the section header so that we get the size. */
8134 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
8137 eopt
= get_data (NULL
, file
, options_offset
, 1, sect
->sh_size
,
8141 iopt
= cmalloc ((sect
->sh_size
/ sizeof (eopt
)), sizeof (*iopt
));
8144 error (_("Out of memory"));
8151 while (offset
< sect
->sh_size
)
8153 Elf_External_Options
*eoption
;
8155 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
8157 option
->kind
= BYTE_GET (eoption
->kind
);
8158 option
->size
= BYTE_GET (eoption
->size
);
8159 option
->section
= BYTE_GET (eoption
->section
);
8160 option
->info
= BYTE_GET (eoption
->info
);
8162 offset
+= option
->size
;
8168 printf (_("\nSection '%s' contains %d entries:\n"),
8169 SECTION_NAME (sect
), cnt
);
8177 switch (option
->kind
)
8180 /* This shouldn't happen. */
8181 printf (" NULL %d %lx", option
->section
, option
->info
);
8184 printf (" REGINFO ");
8185 if (elf_header
.e_machine
== EM_MIPS
)
8188 Elf32_External_RegInfo
*ereg
;
8189 Elf32_RegInfo reginfo
;
8191 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
8192 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8193 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8194 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8195 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8196 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8197 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
8199 printf ("GPR %08lx GP 0x%lx\n",
8201 (unsigned long) reginfo
.ri_gp_value
);
8202 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8203 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8204 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8209 Elf64_External_RegInfo
*ereg
;
8210 Elf64_Internal_RegInfo reginfo
;
8212 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
8213 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8214 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8215 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8216 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8217 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8218 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
8220 printf ("GPR %08lx GP 0x",
8221 reginfo
.ri_gprmask
);
8222 printf_vma (reginfo
.ri_gp_value
);
8225 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8226 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8227 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8231 case ODK_EXCEPTIONS
:
8232 fputs (" EXCEPTIONS fpe_min(", stdout
);
8233 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
8234 fputs (") fpe_max(", stdout
);
8235 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
8236 fputs (")", stdout
);
8238 if (option
->info
& OEX_PAGE0
)
8239 fputs (" PAGE0", stdout
);
8240 if (option
->info
& OEX_SMM
)
8241 fputs (" SMM", stdout
);
8242 if (option
->info
& OEX_FPDBUG
)
8243 fputs (" FPDBUG", stdout
);
8244 if (option
->info
& OEX_DISMISS
)
8245 fputs (" DISMISS", stdout
);
8248 fputs (" PAD ", stdout
);
8249 if (option
->info
& OPAD_PREFIX
)
8250 fputs (" PREFIX", stdout
);
8251 if (option
->info
& OPAD_POSTFIX
)
8252 fputs (" POSTFIX", stdout
);
8253 if (option
->info
& OPAD_SYMBOL
)
8254 fputs (" SYMBOL", stdout
);
8257 fputs (" HWPATCH ", stdout
);
8258 if (option
->info
& OHW_R4KEOP
)
8259 fputs (" R4KEOP", stdout
);
8260 if (option
->info
& OHW_R8KPFETCH
)
8261 fputs (" R8KPFETCH", stdout
);
8262 if (option
->info
& OHW_R5KEOP
)
8263 fputs (" R5KEOP", stdout
);
8264 if (option
->info
& OHW_R5KCVTL
)
8265 fputs (" R5KCVTL", stdout
);
8268 fputs (" FILL ", stdout
);
8269 /* XXX Print content of info word? */
8272 fputs (" TAGS ", stdout
);
8273 /* XXX Print content of info word? */
8276 fputs (" HWAND ", stdout
);
8277 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8278 fputs (" R4KEOP_CHECKED", stdout
);
8279 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8280 fputs (" R4KEOP_CLEAN", stdout
);
8283 fputs (" HWOR ", stdout
);
8284 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8285 fputs (" R4KEOP_CHECKED", stdout
);
8286 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8287 fputs (" R4KEOP_CLEAN", stdout
);
8290 printf (" GP_GROUP %#06lx self-contained %#06lx",
8291 option
->info
& OGP_GROUP
,
8292 (option
->info
& OGP_SELF
) >> 16);
8295 printf (" IDENT %#06lx self-contained %#06lx",
8296 option
->info
& OGP_GROUP
,
8297 (option
->info
& OGP_SELF
) >> 16);
8300 /* This shouldn't happen. */
8301 printf (" %3d ??? %d %lx",
8302 option
->kind
, option
->section
, option
->info
);
8306 len
= sizeof (*eopt
);
8307 while (len
< option
->size
)
8308 if (((char *) option
)[len
] >= ' '
8309 && ((char *) option
)[len
] < 0x7f)
8310 printf ("%c", ((char *) option
)[len
++]);
8312 printf ("\\%03o", ((char *) option
)[len
++]);
8314 fputs ("\n", stdout
);
8322 if (conflicts_offset
!= 0 && conflictsno
!= 0)
8324 Elf32_Conflict
*iconf
;
8327 if (dynamic_symbols
== NULL
)
8329 error (_("conflict list found without a dynamic symbol table"));
8333 iconf
= cmalloc (conflictsno
, sizeof (*iconf
));
8336 error (_("Out of memory"));
8342 Elf32_External_Conflict
*econf32
;
8344 econf32
= get_data (NULL
, file
, conflicts_offset
,
8345 conflictsno
, sizeof (*econf32
), _("conflict"));
8349 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8350 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
8356 Elf64_External_Conflict
*econf64
;
8358 econf64
= get_data (NULL
, file
, conflicts_offset
,
8359 conflictsno
, sizeof (*econf64
), _("conflict"));
8363 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8364 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
8369 printf (_("\nSection '.conflict' contains %lu entries:\n"),
8370 (unsigned long) conflictsno
);
8371 puts (_(" Num: Index Value Name"));
8373 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8375 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
8377 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
8378 print_vma (psym
->st_value
, FULL_HEX
);
8380 if (VALID_DYNAMIC_NAME (psym
->st_name
))
8381 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
8383 printf ("<corrupt: %14ld>", psym
->st_name
);
8394 process_gnu_liblist (FILE *file
)
8396 Elf_Internal_Shdr
*section
, *string_sec
;
8397 Elf32_External_Lib
*elib
;
8406 for (i
= 0, section
= section_headers
;
8407 i
< elf_header
.e_shnum
;
8410 switch (section
->sh_type
)
8412 case SHT_GNU_LIBLIST
:
8413 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
)
8416 elib
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
8421 string_sec
= SECTION_HEADER (section
->sh_link
);
8423 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
8424 string_sec
->sh_size
, _("liblist string table"));
8425 strtab_size
= string_sec
->sh_size
;
8428 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
8434 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
8435 SECTION_NAME (section
),
8436 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
8438 puts (" Library Time Stamp Checksum Version Flags");
8440 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
8448 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
8449 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
8450 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
8451 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
8452 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
8454 tmp
= gmtime (&time
);
8455 snprintf (timebuf
, sizeof (timebuf
),
8456 "%04u-%02u-%02uT%02u:%02u:%02u",
8457 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
8458 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
8460 printf ("%3lu: ", (unsigned long) cnt
);
8462 printf ("%-20s", liblist
.l_name
< strtab_size
8463 ? strtab
+ liblist
.l_name
: "<corrupt>");
8465 printf ("%-20.20s", liblist
.l_name
< strtab_size
8466 ? strtab
+ liblist
.l_name
: "<corrupt>");
8467 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
8468 liblist
.l_version
, liblist
.l_flags
);
8479 get_note_type (unsigned e_type
)
8481 static char buff
[64];
8483 if (elf_header
.e_type
== ET_CORE
)
8487 return _("NT_AUXV (auxiliary vector)");
8489 return _("NT_PRSTATUS (prstatus structure)");
8491 return _("NT_FPREGSET (floating point registers)");
8493 return _("NT_PRPSINFO (prpsinfo structure)");
8495 return _("NT_TASKSTRUCT (task structure)");
8497 return _("NT_PRXFPREG (user_xfpregs structure)");
8499 return _("NT_PSTATUS (pstatus structure)");
8501 return _("NT_FPREGS (floating point registers)");
8503 return _("NT_PSINFO (psinfo structure)");
8505 return _("NT_LWPSTATUS (lwpstatus_t structure)");
8507 return _("NT_LWPSINFO (lwpsinfo_t structure)");
8508 case NT_WIN32PSTATUS
:
8509 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
8517 return _("NT_VERSION (version)");
8519 return _("NT_ARCH (architecture)");
8524 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
8529 get_netbsd_elfcore_note_type (unsigned e_type
)
8531 static char buff
[64];
8533 if (e_type
== NT_NETBSDCORE_PROCINFO
)
8535 /* NetBSD core "procinfo" structure. */
8536 return _("NetBSD procinfo structure");
8539 /* As of Jan 2002 there are no other machine-independent notes
8540 defined for NetBSD core files. If the note type is less
8541 than the start of the machine-dependent note types, we don't
8544 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
8546 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
8550 switch (elf_header
.e_machine
)
8552 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
8553 and PT_GETFPREGS == mach+2. */
8558 case EM_SPARC32PLUS
:
8562 case NT_NETBSDCORE_FIRSTMACH
+0:
8563 return _("PT_GETREGS (reg structure)");
8564 case NT_NETBSDCORE_FIRSTMACH
+2:
8565 return _("PT_GETFPREGS (fpreg structure)");
8571 /* On all other arch's, PT_GETREGS == mach+1 and
8572 PT_GETFPREGS == mach+3. */
8576 case NT_NETBSDCORE_FIRSTMACH
+1:
8577 return _("PT_GETREGS (reg structure)");
8578 case NT_NETBSDCORE_FIRSTMACH
+3:
8579 return _("PT_GETFPREGS (fpreg structure)");
8585 snprintf (buff
, sizeof (buff
), _("PT_FIRSTMACH+%d"),
8586 e_type
- NT_NETBSDCORE_FIRSTMACH
);
8590 /* Note that by the ELF standard, the name field is already null byte
8591 terminated, and namesz includes the terminating null byte.
8592 I.E. the value of namesz for the name "FSF" is 4.
8594 If the value of namesz is zero, there is no name present. */
8596 process_note (Elf_Internal_Note
*pnote
)
8600 if (pnote
->namesz
== 0)
8601 /* If there is no note name, then use the default set of
8602 note type strings. */
8603 nt
= get_note_type (pnote
->type
);
8605 else if (strneq (pnote
->namedata
, "NetBSD-CORE", 11))
8606 /* NetBSD-specific core file notes. */
8607 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
8610 /* Don't recognize this note name; just use the default set of
8611 note type strings. */
8612 nt
= get_note_type (pnote
->type
);
8614 printf (" %s\t\t0x%08lx\t%s\n",
8615 pnote
->namesz
? pnote
->namedata
: "(NONE)",
8622 process_corefile_note_segment (FILE *file
, bfd_vma offset
, bfd_vma length
)
8624 Elf_External_Note
*pnotes
;
8625 Elf_External_Note
*external
;
8631 pnotes
= get_data (NULL
, file
, offset
, 1, length
, _("notes"));
8637 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
8638 (unsigned long) offset
, (unsigned long) length
);
8639 printf (_(" Owner\t\tData size\tDescription\n"));
8641 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
8643 Elf_External_Note
*next
;
8644 Elf_Internal_Note inote
;
8647 inote
.type
= BYTE_GET (external
->type
);
8648 inote
.namesz
= BYTE_GET (external
->namesz
);
8649 inote
.namedata
= external
->name
;
8650 inote
.descsz
= BYTE_GET (external
->descsz
);
8651 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
8652 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
8654 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
8656 if (((char *) next
) > (((char *) pnotes
) + length
))
8658 warn (_("corrupt note found at offset %lx into core notes\n"),
8659 (long)((char *)external
- (char *)pnotes
));
8660 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
8661 inote
.type
, inote
.namesz
, inote
.descsz
);
8667 /* Verify that name is null terminated. It appears that at least
8668 one version of Linux (RedHat 6.0) generates corefiles that don't
8669 comply with the ELF spec by failing to include the null byte in
8671 if (inote
.namedata
[inote
.namesz
] != '\0')
8673 temp
= malloc (inote
.namesz
+ 1);
8677 error (_("Out of memory\n"));
8682 strncpy (temp
, inote
.namedata
, inote
.namesz
);
8683 temp
[inote
.namesz
] = 0;
8685 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
8686 inote
.namedata
= temp
;
8689 res
&= process_note (& inote
);
8704 process_corefile_note_segments (FILE *file
)
8706 Elf_Internal_Phdr
*segment
;
8710 if (! get_program_headers (file
))
8713 for (i
= 0, segment
= program_headers
;
8714 i
< elf_header
.e_phnum
;
8717 if (segment
->p_type
== PT_NOTE
)
8718 res
&= process_corefile_note_segment (file
,
8719 (bfd_vma
) segment
->p_offset
,
8720 (bfd_vma
) segment
->p_filesz
);
8727 process_note_sections (FILE *file
)
8729 Elf_Internal_Shdr
*section
;
8733 for (i
= 0, section
= section_headers
;
8734 i
< elf_header
.e_shnum
;
8736 if (section
->sh_type
== SHT_NOTE
)
8737 res
&= process_corefile_note_segment (file
,
8738 (bfd_vma
) section
->sh_offset
,
8739 (bfd_vma
) section
->sh_size
);
8745 process_notes (FILE *file
)
8747 /* If we have not been asked to display the notes then do nothing. */
8751 if (elf_header
.e_type
!= ET_CORE
)
8752 return process_note_sections (file
);
8754 /* No program headers means no NOTE segment. */
8755 if (elf_header
.e_phnum
> 0)
8756 return process_corefile_note_segments (file
);
8758 printf (_("No note segments present in the core file.\n"));
8763 process_arch_specific (FILE *file
)
8768 switch (elf_header
.e_machine
)
8771 return process_arm_specific (file
);
8773 case EM_MIPS_RS3_LE
:
8774 return process_mips_specific (file
);
8783 get_file_header (FILE *file
)
8785 /* Read in the identity array. */
8786 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
8789 /* Determine how to read the rest of the header. */
8790 switch (elf_header
.e_ident
[EI_DATA
])
8792 default: /* fall through */
8793 case ELFDATANONE
: /* fall through */
8795 byte_get
= byte_get_little_endian
;
8796 byte_put
= byte_put_little_endian
;
8799 byte_get
= byte_get_big_endian
;
8800 byte_put
= byte_put_big_endian
;
8804 /* For now we only support 32 bit and 64 bit ELF files. */
8805 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
8807 /* Read in the rest of the header. */
8810 Elf32_External_Ehdr ehdr32
;
8812 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
8815 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
8816 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
8817 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
8818 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
8819 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
8820 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
8821 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
8822 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
8823 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
8824 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
8825 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
8826 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
8827 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
8831 Elf64_External_Ehdr ehdr64
;
8833 /* If we have been compiled with sizeof (bfd_vma) == 4, then
8834 we will not be able to cope with the 64bit data found in
8835 64 ELF files. Detect this now and abort before we start
8836 overwriting things. */
8837 if (sizeof (bfd_vma
) < 8)
8839 error (_("This instance of readelf has been built without support for a\n\
8840 64 bit data type and so it cannot read 64 bit ELF files.\n"));
8844 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
8847 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
8848 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
8849 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
8850 elf_header
.e_entry
= BYTE_GET (ehdr64
.e_entry
);
8851 elf_header
.e_phoff
= BYTE_GET (ehdr64
.e_phoff
);
8852 elf_header
.e_shoff
= BYTE_GET (ehdr64
.e_shoff
);
8853 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
8854 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
8855 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
8856 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
8857 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
8858 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
8859 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
8862 if (elf_header
.e_shoff
)
8864 /* There may be some extensions in the first section header. Don't
8865 bomb if we can't read it. */
8867 get_32bit_section_headers (file
, 1);
8869 get_64bit_section_headers (file
, 1);
8872 is_relocatable
= elf_header
.e_type
== ET_REL
;
8877 /* Process one ELF object file according to the command line options.
8878 This file may actually be stored in an archive. The file is
8879 positioned at the start of the ELF object. */
8882 process_object (char *file_name
, FILE *file
)
8886 if (! get_file_header (file
))
8888 error (_("%s: Failed to read file header\n"), file_name
);
8892 /* Initialise per file variables. */
8893 for (i
= NUM_ELEM (version_info
); i
--;)
8894 version_info
[i
] = 0;
8896 for (i
= NUM_ELEM (dynamic_info
); i
--;)
8897 dynamic_info
[i
] = 0;
8899 /* Process the file. */
8901 printf (_("\nFile: %s\n"), file_name
);
8903 /* Initialise the dump_sects array from the cmdline_dump_sects array.
8904 Note we do this even if cmdline_dump_sects is empty because we
8905 must make sure that the dump_sets array is zeroed out before each
8906 object file is processed. */
8907 if (num_dump_sects
> num_cmdline_dump_sects
)
8908 memset (dump_sects
, 0, num_dump_sects
);
8910 if (num_cmdline_dump_sects
> 0)
8912 if (num_dump_sects
== 0)
8913 /* A sneaky way of allocating the dump_sects array. */
8914 request_dump (num_cmdline_dump_sects
, 0);
8916 assert (num_dump_sects
>= num_cmdline_dump_sects
);
8917 memcpy (dump_sects
, cmdline_dump_sects
, num_cmdline_dump_sects
);
8920 if (! process_file_header ())
8923 if (! process_section_headers (file
))
8925 /* Without loaded section headers we cannot process lots of
8927 do_unwind
= do_version
= do_dump
= do_arch
= 0;
8929 if (! do_using_dynamic
)
8930 do_syms
= do_reloc
= 0;
8933 if (! process_section_groups (file
))
8935 /* Without loaded section groups we cannot process unwind. */
8939 if (process_program_headers (file
))
8940 process_dynamic_section (file
);
8942 process_relocs (file
);
8944 process_unwind (file
);
8946 process_symbol_table (file
);
8948 process_syminfo (file
);
8950 process_version_sections (file
);
8952 process_section_contents (file
);
8954 process_notes (file
);
8956 process_gnu_liblist (file
);
8958 process_arch_specific (file
);
8960 if (program_headers
)
8962 free (program_headers
);
8963 program_headers
= NULL
;
8966 if (section_headers
)
8968 free (section_headers
);
8969 section_headers
= NULL
;
8974 free (string_table
);
8975 string_table
= NULL
;
8976 string_table_length
= 0;
8979 if (dynamic_strings
)
8981 free (dynamic_strings
);
8982 dynamic_strings
= NULL
;
8983 dynamic_strings_length
= 0;
8986 if (dynamic_symbols
)
8988 free (dynamic_symbols
);
8989 dynamic_symbols
= NULL
;
8990 num_dynamic_syms
= 0;
8993 if (dynamic_syminfo
)
8995 free (dynamic_syminfo
);
8996 dynamic_syminfo
= NULL
;
8999 if (section_headers_groups
)
9001 free (section_headers_groups
);
9002 section_headers_groups
= NULL
;
9007 struct group_list
*g
, *next
;
9009 for (i
= 0; i
< group_count
; i
++)
9011 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
9018 free (section_groups
);
9019 section_groups
= NULL
;
9022 free_debug_memory ();
9027 /* Process an ELF archive. The file is positioned just after the
9031 process_archive (char *file_name
, FILE *file
)
9033 struct ar_hdr arhdr
;
9036 char *longnames
= NULL
;
9037 unsigned long longnames_size
= 0;
9038 size_t file_name_size
;
9043 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
9044 if (got
!= sizeof arhdr
)
9049 error (_("%s: failed to read archive header\n"), file_name
);
9053 if (memcmp (arhdr
.ar_name
, "/ ", 16) == 0)
9055 /* This is the archive symbol table. Skip it.
9056 FIXME: We should have an option to dump it. */
9057 size
= strtoul (arhdr
.ar_size
, NULL
, 10);
9058 if (fseek (file
, size
+ (size
& 1), SEEK_CUR
) != 0)
9060 error (_("%s: failed to skip archive symbol table\n"), file_name
);
9064 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
9065 if (got
!= sizeof arhdr
)
9070 error (_("%s: failed to read archive header\n"), file_name
);
9075 if (memcmp (arhdr
.ar_name
, "// ", 16) == 0)
9077 /* This is the archive string table holding long member
9080 longnames_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
9082 longnames
= malloc (longnames_size
);
9083 if (longnames
== NULL
)
9085 error (_("Out of memory\n"));
9089 if (fread (longnames
, longnames_size
, 1, file
) != 1)
9092 error (_("%s: failed to read string table\n"), file_name
);
9096 if ((longnames_size
& 1) != 0)
9099 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
9100 if (got
!= sizeof arhdr
)
9107 error (_("%s: failed to read archive header\n"), file_name
);
9112 file_name_size
= strlen (file_name
);
9121 if (arhdr
.ar_name
[0] == '/')
9125 off
= strtoul (arhdr
.ar_name
+ 1, NULL
, 10);
9126 if (off
>= longnames_size
)
9128 error (_("%s: invalid archive string table offset %lu\n"), file_name
, off
);
9133 name
= longnames
+ off
;
9134 nameend
= memchr (name
, '/', longnames_size
- off
);
9138 name
= arhdr
.ar_name
;
9139 nameend
= memchr (name
, '/', 16);
9142 if (nameend
== NULL
)
9144 error (_("%s: bad archive file name\n"), file_name
);
9149 namealc
= malloc (file_name_size
+ (nameend
- name
) + 3);
9150 if (namealc
== NULL
)
9152 error (_("Out of memory\n"));
9157 memcpy (namealc
, file_name
, file_name_size
);
9158 namealc
[file_name_size
] = '(';
9159 memcpy (namealc
+ file_name_size
+ 1, name
, nameend
- name
);
9160 namealc
[file_name_size
+ 1 + (nameend
- name
)] = ')';
9161 namealc
[file_name_size
+ 2 + (nameend
- name
)] = '\0';
9163 archive_file_offset
= ftell (file
);
9164 archive_file_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
9166 ret
|= process_object (namealc
, file
);
9171 (archive_file_offset
9173 + (archive_file_size
& 1)),
9176 error (_("%s: failed to seek to next archive header\n"), file_name
);
9181 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
9182 if (got
!= sizeof arhdr
)
9187 error (_("%s: failed to read archive header\n"), file_name
);
9200 process_file (char *file_name
)
9203 struct stat statbuf
;
9207 if (stat (file_name
, &statbuf
) < 0)
9209 if (errno
== ENOENT
)
9210 error (_("'%s': No such file\n"), file_name
);
9212 error (_("Could not locate '%s'. System error message: %s\n"),
9213 file_name
, strerror (errno
));
9217 if (! S_ISREG (statbuf
.st_mode
))
9219 error (_("'%s' is not an ordinary file\n"), file_name
);
9223 file
= fopen (file_name
, "rb");
9226 error (_("Input file '%s' is not readable.\n"), file_name
);
9230 if (fread (armag
, SARMAG
, 1, file
) != 1)
9232 error (_("%s: Failed to read file header\n"), file_name
);
9237 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
9238 ret
= process_archive (file_name
, file
);
9242 archive_file_size
= archive_file_offset
= 0;
9243 ret
= process_object (file_name
, file
);
9251 #ifdef SUPPORT_DISASSEMBLY
9252 /* Needed by the i386 disassembler. For extra credit, someone could
9253 fix this so that we insert symbolic addresses here, esp for GOT/PLT
9257 print_address (unsigned int addr
, FILE *outfile
)
9259 fprintf (outfile
,"0x%8.8x", addr
);
9262 /* Needed by the i386 disassembler. */
9264 db_task_printsym (unsigned int addr
)
9266 print_address (addr
, stderr
);
9271 main (int argc
, char **argv
)
9275 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9276 setlocale (LC_MESSAGES
, "");
9278 #if defined (HAVE_SETLOCALE)
9279 setlocale (LC_CTYPE
, "");
9281 bindtextdomain (PACKAGE
, LOCALEDIR
);
9282 textdomain (PACKAGE
);
9284 expandargv (&argc
, &argv
);
9286 parse_args (argc
, argv
);
9288 if (num_dump_sects
> 0)
9290 /* Make a copy of the dump_sects array. */
9291 cmdline_dump_sects
= malloc (num_dump_sects
);
9292 if (cmdline_dump_sects
== NULL
)
9293 error (_("Out of memory allocating dump request table."));
9296 memcpy (cmdline_dump_sects
, dump_sects
, num_dump_sects
);
9297 num_cmdline_dump_sects
= num_dump_sects
;
9301 if (optind
< (argc
- 1))
9305 while (optind
< argc
)
9306 err
|= process_file (argv
[optind
++]);
9308 if (dump_sects
!= NULL
)
9310 if (cmdline_dump_sects
!= NULL
)
9311 free (cmdline_dump_sects
);