1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
3 Free Software Foundation, Inc.
5 Originally developed by Eric Youngdale <eric@andante.jic.com>
6 Modifications by Nick Clifton <nickc@redhat.com>
8 This file is part of GNU Binutils.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
25 /* The difference between readelf and objdump:
27 Both programs are capable of displaying the contents of ELF format files,
28 so why does the binutils project have two file dumpers ?
30 The reason is that objdump sees an ELF file through a BFD filter of the
31 world; if BFD has a bug where, say, it disagrees about a machine constant
32 in e_flags, then the odds are good that it will remain internally
33 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
34 GAS sees it the BFD way. There was need for a tool to go find out what
35 the file actually says.
37 This is why the readelf program does not link against the BFD library - it
38 exists as an independent program to help verify the correct working of BFD.
40 There is also the case that readelf can provide more information about an
41 ELF file than is provided by objdump. In particular it can display DWARF
42 debugging information which (at the moment) objdump cannot. */
45 #include <sys/types.h>
51 /* Define BFD64 here, even if our default architecture is 32 bit ELF
52 as this will allow us to read in and parse 64bit and 32bit ELF files.
53 Only do this if we believe that the compiler can support a 64 bit
54 data type. For now we only rely on GCC being able to do this. */
60 #include "elf/common.h"
61 #include "elf/external.h"
62 #include "elf/internal.h"
64 /* The following headers use the elf/reloc-macros.h file to
65 automatically generate relocation recognition functions
66 such as elf_mips_reloc_type() */
68 #define RELOC_MACROS_GEN_FUNC
70 #include "elf/alpha.h"
92 #include "elf/m68hc11.h"
93 #include "elf/mcore.h"
96 #include "elf/mn10200.h"
97 #include "elf/mn10300.h"
99 #include "elf/msp430.h"
100 #include "elf/or32.h"
103 #include "elf/ppc64.h"
104 #include "elf/s390.h"
106 #include "elf/sparc.h"
107 #include "elf/v850.h"
109 #include "elf/x86-64.h"
110 #include "elf/xstormy16.h"
112 #include "elf/iq2000.h"
113 #include "elf/xtensa.h"
119 #include "libiberty.h"
121 char *program_name
= "readelf";
122 static long archive_file_offset
;
123 static unsigned long archive_file_size
;
124 static unsigned long dynamic_addr
;
125 static bfd_size_type dynamic_size
;
126 static unsigned int dynamic_nent
;
127 static char *dynamic_strings
;
128 static unsigned long dynamic_strings_length
;
129 static char *string_table
;
130 static unsigned long string_table_length
;
131 static unsigned long num_dynamic_syms
;
132 static Elf_Internal_Sym
*dynamic_symbols
;
133 static Elf_Internal_Syminfo
*dynamic_syminfo
;
134 static unsigned long dynamic_syminfo_offset
;
135 static unsigned int dynamic_syminfo_nent
;
136 static char program_interpreter
[64];
137 static bfd_vma dynamic_info
[DT_JMPREL
+ 1];
138 static bfd_vma version_info
[16];
139 static Elf_Internal_Ehdr elf_header
;
140 static Elf_Internal_Shdr
*section_headers
;
141 static Elf_Internal_Phdr
*program_headers
;
142 static Elf_Internal_Dyn
*dynamic_section
;
143 static Elf_Internal_Shdr
*symtab_shndx_hdr
;
144 static int show_name
;
145 static int do_dynamic
;
148 static int do_sections
;
149 static int do_section_groups
;
150 static int do_section_details
;
151 static int do_segments
;
152 static int do_unwind
;
153 static int do_using_dynamic
;
154 static int do_header
;
156 static int do_version
;
158 static int do_histogram
;
159 static int do_debugging
;
162 static int is_32bit_elf
;
166 struct group_list
*next
;
167 unsigned int section_index
;
172 struct group_list
*root
;
173 unsigned int group_index
;
176 static size_t group_count
;
177 static struct group
*section_groups
;
178 static struct group
**section_headers_groups
;
180 /* A linked list of the section names for which dumps were requested
182 struct dump_list_entry
186 struct dump_list_entry
*next
;
188 static struct dump_list_entry
*dump_sects_byname
;
190 /* A dynamic array of flags indicating for which sections a hex dump
191 has been requested (via the -x switch) and/or a disassembly dump
192 (via the -i switch). */
193 char *cmdline_dump_sects
= NULL
;
194 unsigned num_cmdline_dump_sects
= 0;
196 /* A dynamic array of flags indicating for which sections a dump of
197 some kind has been requested. It is reset on a per-object file
198 basis and then initialised from the cmdline_dump_sects array,
199 the results of interpreting the -w switch, and the
200 dump_sects_byname list. */
201 char *dump_sects
= NULL
;
202 unsigned int num_dump_sects
= 0;
204 #define HEX_DUMP (1 << 0)
205 #define DISASS_DUMP (1 << 1)
206 #define DEBUG_DUMP (1 << 2)
208 /* How to print a vma value. */
209 typedef enum print_mode
221 static void (*byte_put
) (unsigned char *, bfd_vma
, int);
225 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
226 ((X)->sh_name >= string_table_length \
227 ? "<corrupt>" : string_table + (X)->sh_name))
229 /* Given st_shndx I, map to section_headers index. */
230 #define SECTION_HEADER_INDEX(I) \
231 ((I) < SHN_LORESERVE \
233 : ((I) <= SHN_HIRESERVE \
235 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
237 /* Reverse of the above. */
238 #define SECTION_HEADER_NUM(N) \
239 ((N) < SHN_LORESERVE \
241 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
243 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
245 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
247 #define BYTE_GET(field) byte_get (field, sizeof (field))
249 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
251 #define GET_ELF_SYMBOLS(file, section) \
252 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
253 : get_64bit_elf_symbols (file, section))
255 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
256 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
257 already been called and verified that the string exists. */
258 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
260 /* This is just a bit of syntatic sugar. */
261 #define streq(a,b) (strcmp ((a), (b)) == 0)
262 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
265 get_data (void *var
, FILE *file
, long offset
, size_t size
, size_t nmemb
,
270 if (size
== 0 || nmemb
== 0)
273 if (fseek (file
, archive_file_offset
+ offset
, SEEK_SET
))
275 error (_("Unable to seek to 0x%lx for %s\n"),
276 archive_file_offset
+ offset
, reason
);
283 /* Check for overflow. */
284 if (nmemb
< (~(size_t) 0 - 1) / size
)
285 /* + 1 so that we can '\0' terminate invalid string table sections. */
286 mvar
= malloc (size
* nmemb
+ 1);
290 error (_("Out of memory allocating 0x%lx bytes for %s\n"),
291 (unsigned long)(size
* nmemb
), reason
);
295 ((char *) mvar
)[size
* nmemb
] = '\0';
298 if (fread (mvar
, size
, nmemb
, file
) != nmemb
)
300 error (_("Unable to read in 0x%lx bytes of %s\n"),
301 (unsigned long)(size
* nmemb
), reason
);
311 byte_put_little_endian (unsigned char *field
, bfd_vma value
, int size
)
316 field
[7] = (((value
>> 24) >> 24) >> 8) & 0xff;
317 field
[6] = ((value
>> 24) >> 24) & 0xff;
318 field
[5] = ((value
>> 24) >> 16) & 0xff;
319 field
[4] = ((value
>> 24) >> 8) & 0xff;
322 field
[3] = (value
>> 24) & 0xff;
323 field
[2] = (value
>> 16) & 0xff;
326 field
[1] = (value
>> 8) & 0xff;
329 field
[0] = value
& 0xff;
333 error (_("Unhandled data length: %d\n"), size
);
338 #if defined BFD64 && !BFD_HOST_64BIT_LONG
340 print_dec_vma (bfd_vma vma
, int is_signed
)
346 if (is_signed
&& (bfd_signed_vma
) vma
< 0)
355 *bufp
++ = '0' + vma
% 10;
367 print_hex_vma (bfd_vma vma
)
375 char digit
= '0' + (vma
& 0x0f);
377 digit
+= 'a' - '0' - 10;
390 /* Print a VMA value. */
392 print_vma (bfd_vma vma
, print_mode mode
)
401 return printf ("0x%8.8lx", (unsigned long) vma
);
404 return printf ("%8.8lx", (unsigned long) vma
);
408 return printf ("%5ld", (long) vma
);
412 return printf ("0x%lx", (unsigned long) vma
);
415 return printf ("%lx", (unsigned long) vma
);
418 return printf ("%ld", (unsigned long) vma
);
421 return printf ("%lu", (unsigned long) vma
);
444 #if BFD_HOST_64BIT_LONG
445 return nc
+ printf ("%lx", vma
);
447 return nc
+ print_hex_vma (vma
);
451 #if BFD_HOST_64BIT_LONG
452 return printf ("%ld", vma
);
454 return print_dec_vma (vma
, 1);
458 #if BFD_HOST_64BIT_LONG
460 return printf ("%5ld", vma
);
462 return printf ("%#lx", vma
);
465 return printf ("%5ld", _bfd_int64_low (vma
));
467 return print_hex_vma (vma
);
471 #if BFD_HOST_64BIT_LONG
472 return printf ("%lu", vma
);
474 return print_dec_vma (vma
, 0);
482 /* Display a symbol on stdout. If do_wide is not true then
483 format the symbol to be at most WIDTH characters,
484 truncating as necessary. If WIDTH is negative then
485 format the string to be exactly - WIDTH characters,
486 truncating or padding as necessary. */
489 print_symbol (int width
, const char *symbol
)
492 printf ("%s", symbol
);
494 printf ("%-*.*s", width
, width
, symbol
);
496 printf ("%-.*s", width
, symbol
);
500 byte_put_big_endian (unsigned char *field
, bfd_vma value
, int size
)
505 field
[7] = value
& 0xff;
506 field
[6] = (value
>> 8) & 0xff;
507 field
[5] = (value
>> 16) & 0xff;
508 field
[4] = (value
>> 24) & 0xff;
513 field
[3] = value
& 0xff;
514 field
[2] = (value
>> 8) & 0xff;
518 field
[1] = value
& 0xff;
522 field
[0] = value
& 0xff;
526 error (_("Unhandled data length: %d\n"), size
);
531 /* Return a pointer to section NAME, or NULL if no such section exists. */
533 static Elf_Internal_Shdr
*
534 find_section (const char *name
)
538 for (i
= 0; i
< elf_header
.e_shnum
; i
++)
539 if (streq (SECTION_NAME (section_headers
+ i
), name
))
540 return section_headers
+ i
;
545 /* Guess the relocation size commonly used by the specific machines. */
548 guess_is_rela (unsigned long e_machine
)
552 /* Targets that use REL relocations. */
567 /* Targets that use RELA relocations. */
582 case EM_CYGNUS_MN10200
:
584 case EM_CYGNUS_MN10300
:
615 case EM_ALTERA_NIOS2
:
636 warn (_("Don't know about relocations on this machine architecture\n"));
642 slurp_rela_relocs (FILE *file
,
643 unsigned long rel_offset
,
644 unsigned long rel_size
,
645 Elf_Internal_Rela
**relasp
,
646 unsigned long *nrelasp
)
648 Elf_Internal_Rela
*relas
;
649 unsigned long nrelas
;
654 Elf32_External_Rela
*erelas
;
656 erelas
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
660 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
662 relas
= cmalloc (nrelas
, sizeof (Elf_Internal_Rela
));
667 error (_("out of memory parsing relocs"));
671 for (i
= 0; i
< nrelas
; i
++)
673 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
674 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
675 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
682 Elf64_External_Rela
*erelas
;
684 erelas
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
688 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
690 relas
= cmalloc (nrelas
, sizeof (Elf_Internal_Rela
));
695 error (_("out of memory parsing relocs"));
699 for (i
= 0; i
< nrelas
; i
++)
701 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
702 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
703 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
714 slurp_rel_relocs (FILE *file
,
715 unsigned long rel_offset
,
716 unsigned long rel_size
,
717 Elf_Internal_Rela
**relsp
,
718 unsigned long *nrelsp
)
720 Elf_Internal_Rela
*rels
;
726 Elf32_External_Rel
*erels
;
728 erels
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
732 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
734 rels
= cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
739 error (_("out of memory parsing relocs"));
743 for (i
= 0; i
< nrels
; i
++)
745 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
746 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
747 rels
[i
].r_addend
= 0;
754 Elf64_External_Rel
*erels
;
756 erels
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
760 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
762 rels
= cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
767 error (_("out of memory parsing relocs"));
771 for (i
= 0; i
< nrels
; i
++)
773 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
774 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
775 rels
[i
].r_addend
= 0;
785 /* Display the contents of the relocation data found at the specified
789 dump_relocations (FILE *file
,
790 unsigned long rel_offset
,
791 unsigned long rel_size
,
792 Elf_Internal_Sym
*symtab
,
795 unsigned long strtablen
,
799 Elf_Internal_Rela
*rels
;
802 if (is_rela
== UNKNOWN
)
803 is_rela
= guess_is_rela (elf_header
.e_machine
);
807 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
812 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
821 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
823 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
828 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
830 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
838 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
840 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
845 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
847 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
851 for (i
= 0; i
< rel_size
; i
++)
854 const char *rtype2
= NULL
;
855 const char *rtype3
= NULL
;
858 bfd_vma symtab_index
;
863 offset
= rels
[i
].r_offset
;
864 info
= rels
[i
].r_info
;
868 type
= ELF32_R_TYPE (info
);
869 symtab_index
= ELF32_R_SYM (info
);
873 /* The #ifdef BFD64 below is to prevent a compile time warning.
874 We know that if we do not have a 64 bit data type that we
875 will never execute this code anyway. */
877 if (elf_header
.e_machine
== EM_MIPS
)
879 /* In little-endian objects, r_info isn't really a 64-bit
880 little-endian value: it has a 32-bit little-endian
881 symbol index followed by four individual byte fields.
882 Reorder INFO accordingly. */
883 if (elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
884 info
= (((info
& 0xffffffff) << 32)
885 | ((info
>> 56) & 0xff)
886 | ((info
>> 40) & 0xff00)
887 | ((info
>> 24) & 0xff0000)
888 | ((info
>> 8) & 0xff000000));
889 type
= ELF64_MIPS_R_TYPE (info
);
890 type2
= ELF64_MIPS_R_TYPE2 (info
);
891 type3
= ELF64_MIPS_R_TYPE3 (info
);
893 else if (elf_header
.e_machine
== EM_SPARCV9
)
894 type
= ELF64_R_TYPE_ID (info
);
896 type
= ELF64_R_TYPE (info
);
898 symtab_index
= ELF64_R_SYM (info
);
904 #ifdef _bfd_int64_low
905 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
907 printf ("%8.8lx %8.8lx ", offset
, info
);
912 #ifdef _bfd_int64_low
914 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
915 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
916 _bfd_int64_high (offset
),
917 _bfd_int64_low (offset
),
918 _bfd_int64_high (info
),
919 _bfd_int64_low (info
));
922 ? "%16.16lx %16.16lx "
923 : "%12.12lx %12.12lx ",
928 switch (elf_header
.e_machine
)
936 rtype
= elf_m32r_reloc_type (type
);
941 rtype
= elf_i386_reloc_type (type
);
946 rtype
= elf_m68hc11_reloc_type (type
);
950 rtype
= elf_m68k_reloc_type (type
);
954 rtype
= elf_i960_reloc_type (type
);
959 rtype
= elf_avr_reloc_type (type
);
966 rtype
= elf_sparc_reloc_type (type
);
971 rtype
= v850_reloc_type (type
);
976 rtype
= elf_d10v_reloc_type (type
);
981 rtype
= elf_d30v_reloc_type (type
);
985 rtype
= elf_dlx_reloc_type (type
);
989 rtype
= elf_sh_reloc_type (type
);
993 case EM_CYGNUS_MN10300
:
994 rtype
= elf_mn10300_reloc_type (type
);
998 case EM_CYGNUS_MN10200
:
999 rtype
= elf_mn10200_reloc_type (type
);
1003 case EM_CYGNUS_FR30
:
1004 rtype
= elf_fr30_reloc_type (type
);
1008 rtype
= elf_frv_reloc_type (type
);
1012 rtype
= elf_mcore_reloc_type (type
);
1016 rtype
= elf_mmix_reloc_type (type
);
1021 rtype
= elf_msp430_reloc_type (type
);
1025 rtype
= elf_ppc_reloc_type (type
);
1029 rtype
= elf_ppc64_reloc_type (type
);
1033 case EM_MIPS_RS3_LE
:
1034 rtype
= elf_mips_reloc_type (type
);
1037 rtype2
= elf_mips_reloc_type (type2
);
1038 rtype3
= elf_mips_reloc_type (type3
);
1043 rtype
= elf_alpha_reloc_type (type
);
1047 rtype
= elf_arm_reloc_type (type
);
1051 rtype
= elf_arc_reloc_type (type
);
1055 rtype
= elf_hppa_reloc_type (type
);
1061 rtype
= elf_h8_reloc_type (type
);
1066 rtype
= elf_or32_reloc_type (type
);
1071 rtype
= elf_pj_reloc_type (type
);
1074 rtype
= elf_ia64_reloc_type (type
);
1078 rtype
= elf_cris_reloc_type (type
);
1082 rtype
= elf_i860_reloc_type (type
);
1086 rtype
= elf_x86_64_reloc_type (type
);
1090 rtype
= i370_reloc_type (type
);
1095 rtype
= elf_s390_reloc_type (type
);
1099 rtype
= elf_xstormy16_reloc_type (type
);
1103 rtype
= elf_crx_reloc_type (type
);
1107 rtype
= elf_vax_reloc_type (type
);
1112 rtype
= elf_ip2k_reloc_type (type
);
1116 rtype
= elf_iq2000_reloc_type (type
);
1121 rtype
= elf_xtensa_reloc_type (type
);
1125 rtype
= elf_m32c_reloc_type (type
);
1129 rtype
= elf_mt_reloc_type (type
);
1133 rtype
= elf_bfin_reloc_type (type
);
1139 #ifdef _bfd_int64_low
1140 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type
));
1142 printf (_("unrecognized: %-7lx"), type
);
1145 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1147 if (elf_header
.e_machine
== EM_ALPHA
1148 && streq (rtype
, "R_ALPHA_LITUSE")
1151 switch (rels
[i
].r_addend
)
1153 case LITUSE_ALPHA_ADDR
: rtype
= "ADDR"; break;
1154 case LITUSE_ALPHA_BASE
: rtype
= "BASE"; break;
1155 case LITUSE_ALPHA_BYTOFF
: rtype
= "BYTOFF"; break;
1156 case LITUSE_ALPHA_JSR
: rtype
= "JSR"; break;
1157 case LITUSE_ALPHA_TLSGD
: rtype
= "TLSGD"; break;
1158 case LITUSE_ALPHA_TLSLDM
: rtype
= "TLSLDM"; break;
1159 case LITUSE_ALPHA_JSRDIRECT
: rtype
= "JSRDIRECT"; break;
1160 default: rtype
= NULL
;
1163 printf (" (%s)", rtype
);
1167 printf (_("<unknown addend: %lx>"),
1168 (unsigned long) rels
[i
].r_addend
);
1171 else if (symtab_index
)
1173 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1174 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1177 Elf_Internal_Sym
*psym
;
1179 psym
= symtab
+ symtab_index
;
1182 print_vma (psym
->st_value
, LONG_HEX
);
1183 printf (is_32bit_elf
? " " : " ");
1185 if (psym
->st_name
== 0)
1187 const char *sec_name
= "<null>";
1190 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1192 bfd_vma sec_index
= (bfd_vma
) -1;
1194 if (psym
->st_shndx
< SHN_LORESERVE
)
1195 sec_index
= psym
->st_shndx
;
1196 else if (psym
->st_shndx
> SHN_HIRESERVE
)
1197 sec_index
= psym
->st_shndx
- (SHN_HIRESERVE
+ 1
1200 if (sec_index
!= (bfd_vma
) -1)
1201 sec_name
= SECTION_NAME (section_headers
+ sec_index
);
1202 else if (psym
->st_shndx
== SHN_ABS
)
1204 else if (psym
->st_shndx
== SHN_COMMON
)
1205 sec_name
= "COMMON";
1206 else if (elf_header
.e_machine
== EM_X86_64
1207 && psym
->st_shndx
== SHN_X86_64_LCOMMON
)
1208 sec_name
= "LARGE_COMMON";
1209 else if (elf_header
.e_machine
== EM_IA_64
1210 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1211 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1212 sec_name
= "ANSI_COM";
1215 sprintf (name_buf
, "<section 0x%x>",
1216 (unsigned int) psym
->st_shndx
);
1217 sec_name
= name_buf
;
1220 print_symbol (22, sec_name
);
1222 else if (strtab
== NULL
)
1223 printf (_("<string table index: %3ld>"), psym
->st_name
);
1224 else if (psym
->st_name
>= strtablen
)
1225 printf (_("<corrupt string table index: %3ld>"), psym
->st_name
);
1227 print_symbol (22, strtab
+ psym
->st_name
);
1230 printf (" + %lx", (unsigned long) rels
[i
].r_addend
);
1235 printf ("%*c", is_32bit_elf
?
1236 (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1237 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1240 if (elf_header
.e_machine
== EM_SPARCV9
&& streq (rtype
, "R_SPARC_OLO10"))
1241 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1245 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1247 printf (" Type2: ");
1250 #ifdef _bfd_int64_low
1251 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2
));
1253 printf (_("unrecognized: %-7lx"), type2
);
1256 printf ("%-17.17s", rtype2
);
1258 printf ("\n Type3: ");
1261 #ifdef _bfd_int64_low
1262 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3
));
1264 printf (_("unrecognized: %-7lx"), type3
);
1267 printf ("%-17.17s", rtype3
);
1279 get_mips_dynamic_type (unsigned long type
)
1283 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1284 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1285 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1286 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1287 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1288 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1289 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1290 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1291 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1292 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1293 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1294 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1295 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1296 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1297 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1298 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1299 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1300 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1301 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1302 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1303 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1304 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1305 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1306 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1307 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1308 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1309 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1310 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1311 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1312 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1313 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1314 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1315 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1316 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1317 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1318 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1319 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1320 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1321 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1322 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1323 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1324 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1325 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1332 get_sparc64_dynamic_type (unsigned long type
)
1336 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1343 get_ppc_dynamic_type (unsigned long type
)
1347 case DT_PPC_GOT
: return "PPC_GOT";
1354 get_ppc64_dynamic_type (unsigned long type
)
1358 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1359 case DT_PPC64_OPD
: return "PPC64_OPD";
1360 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1367 get_parisc_dynamic_type (unsigned long type
)
1371 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1372 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1373 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1374 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1375 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1376 case DT_HP_PREINIT
: return "HP_PREINIT";
1377 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1378 case DT_HP_NEEDED
: return "HP_NEEDED";
1379 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1380 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1381 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1382 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1383 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1384 case DT_HP_EPLTREL
: return "HP_GST_EPLTREL";
1385 case DT_HP_EPLTRELSZ
: return "HP_GST_EPLTRELSZ";
1386 case DT_HP_FILTERED
: return "HP_FILTERED";
1387 case DT_HP_FILTER_TLS
: return "HP_FILTER_TLS";
1388 case DT_HP_COMPAT_FILTERED
: return "HP_COMPAT_FILTERED";
1389 case DT_HP_LAZYLOAD
: return "HP_LAZYLOAD";
1390 case DT_HP_BIND_NOW_COUNT
: return "HP_BIND_NOW_COUNT";
1391 case DT_PLT
: return "PLT";
1392 case DT_PLT_SIZE
: return "PLT_SIZE";
1393 case DT_DLT
: return "DLT";
1394 case DT_DLT_SIZE
: return "DLT_SIZE";
1401 get_ia64_dynamic_type (unsigned long type
)
1405 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1412 get_alpha_dynamic_type (unsigned long type
)
1416 case DT_ALPHA_PLTRO
: return "ALPHA_PLTRO";
1423 get_dynamic_type (unsigned long type
)
1425 static char buff
[64];
1429 case DT_NULL
: return "NULL";
1430 case DT_NEEDED
: return "NEEDED";
1431 case DT_PLTRELSZ
: return "PLTRELSZ";
1432 case DT_PLTGOT
: return "PLTGOT";
1433 case DT_HASH
: return "HASH";
1434 case DT_STRTAB
: return "STRTAB";
1435 case DT_SYMTAB
: return "SYMTAB";
1436 case DT_RELA
: return "RELA";
1437 case DT_RELASZ
: return "RELASZ";
1438 case DT_RELAENT
: return "RELAENT";
1439 case DT_STRSZ
: return "STRSZ";
1440 case DT_SYMENT
: return "SYMENT";
1441 case DT_INIT
: return "INIT";
1442 case DT_FINI
: return "FINI";
1443 case DT_SONAME
: return "SONAME";
1444 case DT_RPATH
: return "RPATH";
1445 case DT_SYMBOLIC
: return "SYMBOLIC";
1446 case DT_REL
: return "REL";
1447 case DT_RELSZ
: return "RELSZ";
1448 case DT_RELENT
: return "RELENT";
1449 case DT_PLTREL
: return "PLTREL";
1450 case DT_DEBUG
: return "DEBUG";
1451 case DT_TEXTREL
: return "TEXTREL";
1452 case DT_JMPREL
: return "JMPREL";
1453 case DT_BIND_NOW
: return "BIND_NOW";
1454 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1455 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1456 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1457 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1458 case DT_RUNPATH
: return "RUNPATH";
1459 case DT_FLAGS
: return "FLAGS";
1461 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1462 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1464 case DT_CHECKSUM
: return "CHECKSUM";
1465 case DT_PLTPADSZ
: return "PLTPADSZ";
1466 case DT_MOVEENT
: return "MOVEENT";
1467 case DT_MOVESZ
: return "MOVESZ";
1468 case DT_FEATURE
: return "FEATURE";
1469 case DT_POSFLAG_1
: return "POSFLAG_1";
1470 case DT_SYMINSZ
: return "SYMINSZ";
1471 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1473 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1474 case DT_CONFIG
: return "CONFIG";
1475 case DT_DEPAUDIT
: return "DEPAUDIT";
1476 case DT_AUDIT
: return "AUDIT";
1477 case DT_PLTPAD
: return "PLTPAD";
1478 case DT_MOVETAB
: return "MOVETAB";
1479 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1481 case DT_VERSYM
: return "VERSYM";
1483 case DT_TLSDESC_GOT
: return "TLSDESC_GOT";
1484 case DT_TLSDESC_PLT
: return "TLSDESC_PLT";
1485 case DT_RELACOUNT
: return "RELACOUNT";
1486 case DT_RELCOUNT
: return "RELCOUNT";
1487 case DT_FLAGS_1
: return "FLAGS_1";
1488 case DT_VERDEF
: return "VERDEF";
1489 case DT_VERDEFNUM
: return "VERDEFNUM";
1490 case DT_VERNEED
: return "VERNEED";
1491 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1493 case DT_AUXILIARY
: return "AUXILIARY";
1494 case DT_USED
: return "USED";
1495 case DT_FILTER
: return "FILTER";
1497 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1498 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1499 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1500 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1501 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1504 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1508 switch (elf_header
.e_machine
)
1511 case EM_MIPS_RS3_LE
:
1512 result
= get_mips_dynamic_type (type
);
1515 result
= get_sparc64_dynamic_type (type
);
1518 result
= get_ppc_dynamic_type (type
);
1521 result
= get_ppc64_dynamic_type (type
);
1524 result
= get_ia64_dynamic_type (type
);
1527 result
= get_alpha_dynamic_type (type
);
1537 snprintf (buff
, sizeof (buff
), _("Processor Specific: %lx"), type
);
1539 else if (((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1540 || (elf_header
.e_machine
== EM_PARISC
1541 && (type
>= OLD_DT_LOOS
) && (type
<= OLD_DT_HIOS
)))
1545 switch (elf_header
.e_machine
)
1548 result
= get_parisc_dynamic_type (type
);
1558 snprintf (buff
, sizeof (buff
), _("Operating System specific: %lx"),
1562 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), type
);
1569 get_file_type (unsigned e_type
)
1571 static char buff
[32];
1575 case ET_NONE
: return _("NONE (None)");
1576 case ET_REL
: return _("REL (Relocatable file)");
1577 case ET_EXEC
: return _("EXEC (Executable file)");
1578 case ET_DYN
: return _("DYN (Shared object file)");
1579 case ET_CORE
: return _("CORE (Core file)");
1582 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1583 snprintf (buff
, sizeof (buff
), _("Processor Specific: (%x)"), e_type
);
1584 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1585 snprintf (buff
, sizeof (buff
), _("OS Specific: (%x)"), e_type
);
1587 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_type
);
1593 get_machine_name (unsigned e_machine
)
1595 static char buff
[64]; /* XXX */
1599 case EM_NONE
: return _("None");
1600 case EM_M32
: return "WE32100";
1601 case EM_SPARC
: return "Sparc";
1602 case EM_386
: return "Intel 80386";
1603 case EM_68K
: return "MC68000";
1604 case EM_88K
: return "MC88000";
1605 case EM_486
: return "Intel 80486";
1606 case EM_860
: return "Intel 80860";
1607 case EM_MIPS
: return "MIPS R3000";
1608 case EM_S370
: return "IBM System/370";
1609 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1610 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1611 case EM_PARISC
: return "HPPA";
1612 case EM_PPC_OLD
: return "Power PC (old)";
1613 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1614 case EM_960
: return "Intel 90860";
1615 case EM_PPC
: return "PowerPC";
1616 case EM_PPC64
: return "PowerPC64";
1617 case EM_V800
: return "NEC V800";
1618 case EM_FR20
: return "Fujitsu FR20";
1619 case EM_RH32
: return "TRW RH32";
1620 case EM_MCORE
: return "MCORE";
1621 case EM_ARM
: return "ARM";
1622 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1623 case EM_SH
: return "Renesas / SuperH SH";
1624 case EM_SPARCV9
: return "Sparc v9";
1625 case EM_TRICORE
: return "Siemens Tricore";
1626 case EM_ARC
: return "ARC";
1627 case EM_H8_300
: return "Renesas H8/300";
1628 case EM_H8_300H
: return "Renesas H8/300H";
1629 case EM_H8S
: return "Renesas H8S";
1630 case EM_H8_500
: return "Renesas H8/500";
1631 case EM_IA_64
: return "Intel IA-64";
1632 case EM_MIPS_X
: return "Stanford MIPS-X";
1633 case EM_COLDFIRE
: return "Motorola Coldfire";
1634 case EM_68HC12
: return "Motorola M68HC12";
1635 case EM_ALPHA
: return "Alpha";
1636 case EM_CYGNUS_D10V
:
1637 case EM_D10V
: return "d10v";
1638 case EM_CYGNUS_D30V
:
1639 case EM_D30V
: return "d30v";
1640 case EM_CYGNUS_M32R
:
1641 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
1642 case EM_CYGNUS_V850
:
1643 case EM_V850
: return "NEC v850";
1644 case EM_CYGNUS_MN10300
:
1645 case EM_MN10300
: return "mn10300";
1646 case EM_CYGNUS_MN10200
:
1647 case EM_MN10200
: return "mn10200";
1648 case EM_CYGNUS_FR30
:
1649 case EM_FR30
: return "Fujitsu FR30";
1650 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1652 case EM_PJ
: return "picoJava";
1653 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1654 case EM_PCP
: return "Siemens PCP";
1655 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1656 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1657 case EM_STARCORE
: return "Motorola Star*Core processor";
1658 case EM_ME16
: return "Toyota ME16 processor";
1659 case EM_ST100
: return "STMicroelectronics ST100 processor";
1660 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1661 case EM_FX66
: return "Siemens FX66 microcontroller";
1662 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1663 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1664 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1665 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1666 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1667 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1668 case EM_SVX
: return "Silicon Graphics SVx";
1669 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1670 case EM_VAX
: return "Digital VAX";
1672 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1673 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1674 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1675 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1676 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1677 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1678 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1679 case EM_PRISM
: return "Vitesse Prism";
1680 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1682 case EM_S390
: return "IBM S/390";
1683 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1685 case EM_OR32
: return "OpenRISC";
1686 case EM_CRX
: return "National Semiconductor CRX microprocessor";
1687 case EM_DLX
: return "OpenDLX";
1689 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1690 case EM_IQ2000
: return "Vitesse IQ2000";
1692 case EM_XTENSA
: return "Tensilica Xtensa Processor";
1693 case EM_M32C
: return "Renesas M32c";
1694 case EM_MT
: return "Morpho Techologies MT processor";
1695 case EM_BLACKFIN
: return "Analog Devices Blackfin";
1696 case EM_NIOS32
: return "Altera Nios";
1697 case EM_ALTERA_NIOS2
: return "Altera Nios II";
1698 case EM_XC16X
: return "Infineon Technologies xc16x";
1700 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_machine
);
1706 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
1711 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1712 e_flags
&= ~ EF_ARM_EABIMASK
;
1714 /* Handle "generic" ARM flags. */
1715 if (e_flags
& EF_ARM_RELEXEC
)
1717 strcat (buf
, ", relocatable executable");
1718 e_flags
&= ~ EF_ARM_RELEXEC
;
1721 if (e_flags
& EF_ARM_HASENTRY
)
1723 strcat (buf
, ", has entry point");
1724 e_flags
&= ~ EF_ARM_HASENTRY
;
1727 /* Now handle EABI specific flags. */
1731 strcat (buf
, ", <unrecognized EABI>");
1736 case EF_ARM_EABI_VER1
:
1737 strcat (buf
, ", Version1 EABI");
1742 /* Process flags one bit at a time. */
1743 flag
= e_flags
& - e_flags
;
1748 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1749 strcat (buf
, ", sorted symbol tables");
1759 case EF_ARM_EABI_VER2
:
1760 strcat (buf
, ", Version2 EABI");
1765 /* Process flags one bit at a time. */
1766 flag
= e_flags
& - e_flags
;
1771 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1772 strcat (buf
, ", sorted symbol tables");
1775 case EF_ARM_DYNSYMSUSESEGIDX
:
1776 strcat (buf
, ", dynamic symbols use segment index");
1779 case EF_ARM_MAPSYMSFIRST
:
1780 strcat (buf
, ", mapping symbols precede others");
1790 case EF_ARM_EABI_VER3
:
1791 strcat (buf
, ", Version3 EABI");
1794 case EF_ARM_EABI_VER4
:
1795 strcat (buf
, ", Version4 EABI");
1798 case EF_ARM_EABI_VER5
:
1799 strcat (buf
, ", Version5 EABI");
1805 /* Process flags one bit at a time. */
1806 flag
= e_flags
& - e_flags
;
1812 strcat (buf
, ", BE8");
1816 strcat (buf
, ", LE8");
1826 case EF_ARM_EABI_UNKNOWN
:
1827 strcat (buf
, ", GNU EABI");
1832 /* Process flags one bit at a time. */
1833 flag
= e_flags
& - e_flags
;
1838 case EF_ARM_INTERWORK
:
1839 strcat (buf
, ", interworking enabled");
1842 case EF_ARM_APCS_26
:
1843 strcat (buf
, ", uses APCS/26");
1846 case EF_ARM_APCS_FLOAT
:
1847 strcat (buf
, ", uses APCS/float");
1851 strcat (buf
, ", position independent");
1855 strcat (buf
, ", 8 bit structure alignment");
1858 case EF_ARM_NEW_ABI
:
1859 strcat (buf
, ", uses new ABI");
1862 case EF_ARM_OLD_ABI
:
1863 strcat (buf
, ", uses old ABI");
1866 case EF_ARM_SOFT_FLOAT
:
1867 strcat (buf
, ", software FP");
1870 case EF_ARM_VFP_FLOAT
:
1871 strcat (buf
, ", VFP");
1874 case EF_ARM_MAVERICK_FLOAT
:
1875 strcat (buf
, ", Maverick FP");
1886 strcat (buf
,", <unknown>");
1890 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
1892 static char buf
[1024];
1904 decode_ARM_machine_flags (e_flags
, buf
);
1908 switch (e_flags
& EF_FRV_CPU_MASK
)
1910 case EF_FRV_CPU_GENERIC
:
1914 strcat (buf
, ", fr???");
1917 case EF_FRV_CPU_FR300
:
1918 strcat (buf
, ", fr300");
1921 case EF_FRV_CPU_FR400
:
1922 strcat (buf
, ", fr400");
1924 case EF_FRV_CPU_FR405
:
1925 strcat (buf
, ", fr405");
1928 case EF_FRV_CPU_FR450
:
1929 strcat (buf
, ", fr450");
1932 case EF_FRV_CPU_FR500
:
1933 strcat (buf
, ", fr500");
1935 case EF_FRV_CPU_FR550
:
1936 strcat (buf
, ", fr550");
1939 case EF_FRV_CPU_SIMPLE
:
1940 strcat (buf
, ", simple");
1942 case EF_FRV_CPU_TOMCAT
:
1943 strcat (buf
, ", tomcat");
1949 if (e_flags
& EF_M68K_CPU32
)
1950 strcat (buf
, ", cpu32");
1951 if (e_flags
& EF_M68K_M68000
)
1952 strcat (buf
, ", m68000");
1953 if (e_flags
& EF_M68K_ISA_MASK
)
1955 char const *isa
= _("unknown");
1956 char const *mac
= _("unknown mac");
1957 char const *additional
= NULL
;
1959 switch (e_flags
& EF_M68K_ISA_MASK
)
1961 case EF_M68K_ISA_A_NODIV
:
1963 additional
= ", nodiv";
1968 case EF_M68K_ISA_A_PLUS
:
1971 case EF_M68K_ISA_B_NOUSP
:
1973 additional
= ", nousp";
1979 strcat (buf
, ", cf, isa ");
1982 strcat (buf
, additional
);
1983 if (e_flags
& EF_M68K_FLOAT
)
1984 strcat (buf
, ", float");
1985 switch (e_flags
& EF_M68K_MAC_MASK
)
2006 if (e_flags
& EF_PPC_EMB
)
2007 strcat (buf
, ", emb");
2009 if (e_flags
& EF_PPC_RELOCATABLE
)
2010 strcat (buf
, ", relocatable");
2012 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
2013 strcat (buf
, ", relocatable-lib");
2017 case EM_CYGNUS_V850
:
2018 switch (e_flags
& EF_V850_ARCH
)
2021 strcat (buf
, ", v850e1");
2024 strcat (buf
, ", v850e");
2027 strcat (buf
, ", v850");
2030 strcat (buf
, ", unknown v850 architecture variant");
2036 case EM_CYGNUS_M32R
:
2037 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
2038 strcat (buf
, ", m32r");
2043 case EM_MIPS_RS3_LE
:
2044 if (e_flags
& EF_MIPS_NOREORDER
)
2045 strcat (buf
, ", noreorder");
2047 if (e_flags
& EF_MIPS_PIC
)
2048 strcat (buf
, ", pic");
2050 if (e_flags
& EF_MIPS_CPIC
)
2051 strcat (buf
, ", cpic");
2053 if (e_flags
& EF_MIPS_UCODE
)
2054 strcat (buf
, ", ugen_reserved");
2056 if (e_flags
& EF_MIPS_ABI2
)
2057 strcat (buf
, ", abi2");
2059 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
2060 strcat (buf
, ", odk first");
2062 if (e_flags
& EF_MIPS_32BITMODE
)
2063 strcat (buf
, ", 32bitmode");
2065 switch ((e_flags
& EF_MIPS_MACH
))
2067 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
2068 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
2069 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
2070 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
2071 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
2072 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
2073 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
2074 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
2075 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
2076 case E_MIPS_MACH_9000
: strcat (buf
, ", 9000"); break;
2078 /* We simply ignore the field in this case to avoid confusion:
2079 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2082 default: strcat (buf
, ", unknown CPU"); break;
2085 switch ((e_flags
& EF_MIPS_ABI
))
2087 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
2088 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
2089 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
2090 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
2092 /* We simply ignore the field in this case to avoid confusion:
2093 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2094 This means it is likely to be an o32 file, but not for
2097 default: strcat (buf
, ", unknown ABI"); break;
2100 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
2101 strcat (buf
, ", mdmx");
2103 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
2104 strcat (buf
, ", mips16");
2106 switch ((e_flags
& EF_MIPS_ARCH
))
2108 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
2109 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
2110 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
2111 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
2112 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
2113 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
2114 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
2115 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
2116 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
2117 default: strcat (buf
, ", unknown ISA"); break;
2123 switch ((e_flags
& EF_SH_MACH_MASK
))
2125 case EF_SH1
: strcat (buf
, ", sh1"); break;
2126 case EF_SH2
: strcat (buf
, ", sh2"); break;
2127 case EF_SH3
: strcat (buf
, ", sh3"); break;
2128 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
2129 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
2130 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
2131 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
2132 case EF_SH4
: strcat (buf
, ", sh4"); break;
2133 case EF_SH5
: strcat (buf
, ", sh5"); break;
2134 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
2135 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
2136 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
2137 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
2138 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
2139 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
2140 case EF_SH3_NOMMU
: strcat (buf
, ", sh3-nommu"); break;
2141 case EF_SH4_NOMMU_NOFPU
: strcat (buf
, ", sh4-nommu-nofpu"); break;
2142 case EF_SH2A_SH4_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2143 case EF_SH2A_SH3_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh3-nommu"); break;
2144 case EF_SH2A_SH4
: strcat (buf
, ", sh2a-or-sh4"); break;
2145 case EF_SH2A_SH3E
: strcat (buf
, ", sh2a-or-sh3e"); break;
2146 default: strcat (buf
, ", unknown ISA"); break;
2152 if (e_flags
& EF_SPARC_32PLUS
)
2153 strcat (buf
, ", v8+");
2155 if (e_flags
& EF_SPARC_SUN_US1
)
2156 strcat (buf
, ", ultrasparcI");
2158 if (e_flags
& EF_SPARC_SUN_US3
)
2159 strcat (buf
, ", ultrasparcIII");
2161 if (e_flags
& EF_SPARC_HAL_R1
)
2162 strcat (buf
, ", halr1");
2164 if (e_flags
& EF_SPARC_LEDATA
)
2165 strcat (buf
, ", ledata");
2167 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2168 strcat (buf
, ", tso");
2170 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2171 strcat (buf
, ", pso");
2173 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2174 strcat (buf
, ", rmo");
2178 switch (e_flags
& EF_PARISC_ARCH
)
2180 case EFA_PARISC_1_0
:
2181 strcpy (buf
, ", PA-RISC 1.0");
2183 case EFA_PARISC_1_1
:
2184 strcpy (buf
, ", PA-RISC 1.1");
2186 case EFA_PARISC_2_0
:
2187 strcpy (buf
, ", PA-RISC 2.0");
2192 if (e_flags
& EF_PARISC_TRAPNIL
)
2193 strcat (buf
, ", trapnil");
2194 if (e_flags
& EF_PARISC_EXT
)
2195 strcat (buf
, ", ext");
2196 if (e_flags
& EF_PARISC_LSB
)
2197 strcat (buf
, ", lsb");
2198 if (e_flags
& EF_PARISC_WIDE
)
2199 strcat (buf
, ", wide");
2200 if (e_flags
& EF_PARISC_NO_KABP
)
2201 strcat (buf
, ", no kabp");
2202 if (e_flags
& EF_PARISC_LAZYSWAP
)
2203 strcat (buf
, ", lazyswap");
2208 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2209 strcat (buf
, ", new calling convention");
2211 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2212 strcat (buf
, ", gnu calling convention");
2216 if ((e_flags
& EF_IA_64_ABI64
))
2217 strcat (buf
, ", 64-bit");
2219 strcat (buf
, ", 32-bit");
2220 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2221 strcat (buf
, ", reduced fp model");
2222 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2223 strcat (buf
, ", no function descriptors, constant gp");
2224 else if ((e_flags
& EF_IA_64_CONS_GP
))
2225 strcat (buf
, ", constant gp");
2226 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2227 strcat (buf
, ", absolute");
2231 if ((e_flags
& EF_VAX_NONPIC
))
2232 strcat (buf
, ", non-PIC");
2233 if ((e_flags
& EF_VAX_DFLOAT
))
2234 strcat (buf
, ", D-Float");
2235 if ((e_flags
& EF_VAX_GFLOAT
))
2236 strcat (buf
, ", G-Float");
2245 get_osabi_name (unsigned int osabi
)
2247 static char buff
[32];
2251 case ELFOSABI_NONE
: return "UNIX - System V";
2252 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2253 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2254 case ELFOSABI_LINUX
: return "UNIX - Linux";
2255 case ELFOSABI_HURD
: return "GNU/Hurd";
2256 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2257 case ELFOSABI_AIX
: return "UNIX - AIX";
2258 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2259 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2260 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2261 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2262 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2263 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2264 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2265 case ELFOSABI_AROS
: return "Amiga Research OS";
2266 case ELFOSABI_STANDALONE
: return _("Standalone App");
2267 case ELFOSABI_ARM
: return "ARM";
2269 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), osabi
);
2275 get_arm_segment_type (unsigned long type
)
2289 get_mips_segment_type (unsigned long type
)
2293 case PT_MIPS_REGINFO
:
2295 case PT_MIPS_RTPROC
:
2297 case PT_MIPS_OPTIONS
:
2307 get_parisc_segment_type (unsigned long type
)
2311 case PT_HP_TLS
: return "HP_TLS";
2312 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2313 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2314 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2315 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2316 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2317 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2318 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2319 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2320 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2321 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2322 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2323 case PT_HP_OPT_ANNOT
: return "HP_OPT_ANNOT";
2324 case PT_HP_HSL_ANNOT
: return "HP_HSL_ANNOT";
2325 case PT_HP_STACK
: return "HP_STACK";
2326 case PT_HP_CORE_UTSNAME
: return "HP_CORE_UTSNAME";
2327 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2328 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2329 case PT_PARISC_WEAKORDER
: return "PARISC_WEAKORDER";
2338 get_ia64_segment_type (unsigned long type
)
2342 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2343 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2344 case PT_HP_TLS
: return "HP_TLS";
2345 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2346 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2347 case PT_IA_64_HP_STACK
: return "HP_STACK";
2356 get_segment_type (unsigned long p_type
)
2358 static char buff
[32];
2362 case PT_NULL
: return "NULL";
2363 case PT_LOAD
: return "LOAD";
2364 case PT_DYNAMIC
: return "DYNAMIC";
2365 case PT_INTERP
: return "INTERP";
2366 case PT_NOTE
: return "NOTE";
2367 case PT_SHLIB
: return "SHLIB";
2368 case PT_PHDR
: return "PHDR";
2369 case PT_TLS
: return "TLS";
2371 case PT_GNU_EH_FRAME
:
2372 return "GNU_EH_FRAME";
2373 case PT_GNU_STACK
: return "GNU_STACK";
2374 case PT_GNU_RELRO
: return "GNU_RELRO";
2377 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2381 switch (elf_header
.e_machine
)
2384 result
= get_arm_segment_type (p_type
);
2387 case EM_MIPS_RS3_LE
:
2388 result
= get_mips_segment_type (p_type
);
2391 result
= get_parisc_segment_type (p_type
);
2394 result
= get_ia64_segment_type (p_type
);
2404 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2406 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2410 switch (elf_header
.e_machine
)
2413 result
= get_parisc_segment_type (p_type
);
2416 result
= get_ia64_segment_type (p_type
);
2426 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2429 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), p_type
);
2436 get_mips_section_type_name (unsigned int sh_type
)
2440 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2441 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2442 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2443 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2444 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2445 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2446 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2447 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2448 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2449 case SHT_MIPS_RELD
: return "MIPS_RELD";
2450 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2451 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2452 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2453 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2454 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2455 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2456 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2457 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2458 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2459 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2460 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2461 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2462 case SHT_MIPS_LINE
: return "MIPS_LINE";
2463 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2464 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2465 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2466 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2467 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2468 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2469 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2470 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2471 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2472 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2473 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2474 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2475 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2476 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2477 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2478 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2486 get_parisc_section_type_name (unsigned int sh_type
)
2490 case SHT_PARISC_EXT
: return "PARISC_EXT";
2491 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2492 case SHT_PARISC_DOC
: return "PARISC_DOC";
2493 case SHT_PARISC_ANNOT
: return "PARISC_ANNOT";
2494 case SHT_PARISC_SYMEXTN
: return "PARISC_SYMEXTN";
2495 case SHT_PARISC_STUBS
: return "PARISC_STUBS";
2496 case SHT_PARISC_DLKM
: return "PARISC_DLKM";
2504 get_ia64_section_type_name (unsigned int sh_type
)
2506 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2507 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2508 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2512 case SHT_IA_64_EXT
: return "IA_64_EXT";
2513 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2514 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2522 get_x86_64_section_type_name (unsigned int sh_type
)
2526 case SHT_X86_64_UNWIND
: return "X86_64_UNWIND";
2534 get_arm_section_type_name (unsigned int sh_type
)
2540 case SHT_ARM_PREEMPTMAP
:
2541 return "ARM_PREEMPTMAP";
2542 case SHT_ARM_ATTRIBUTES
:
2543 return "ARM_ATTRIBUTES";
2551 get_section_type_name (unsigned int sh_type
)
2553 static char buff
[32];
2557 case SHT_NULL
: return "NULL";
2558 case SHT_PROGBITS
: return "PROGBITS";
2559 case SHT_SYMTAB
: return "SYMTAB";
2560 case SHT_STRTAB
: return "STRTAB";
2561 case SHT_RELA
: return "RELA";
2562 case SHT_HASH
: return "HASH";
2563 case SHT_DYNAMIC
: return "DYNAMIC";
2564 case SHT_NOTE
: return "NOTE";
2565 case SHT_NOBITS
: return "NOBITS";
2566 case SHT_REL
: return "REL";
2567 case SHT_SHLIB
: return "SHLIB";
2568 case SHT_DYNSYM
: return "DYNSYM";
2569 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2570 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2571 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2572 case SHT_GROUP
: return "GROUP";
2573 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2574 case SHT_GNU_verdef
: return "VERDEF";
2575 case SHT_GNU_verneed
: return "VERNEED";
2576 case SHT_GNU_versym
: return "VERSYM";
2577 case 0x6ffffff0: return "VERSYM";
2578 case 0x6ffffffc: return "VERDEF";
2579 case 0x7ffffffd: return "AUXILIARY";
2580 case 0x7fffffff: return "FILTER";
2581 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2584 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2588 switch (elf_header
.e_machine
)
2591 case EM_MIPS_RS3_LE
:
2592 result
= get_mips_section_type_name (sh_type
);
2595 result
= get_parisc_section_type_name (sh_type
);
2598 result
= get_ia64_section_type_name (sh_type
);
2601 result
= get_x86_64_section_type_name (sh_type
);
2604 result
= get_arm_section_type_name (sh_type
);
2614 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2616 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2617 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2618 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2619 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2621 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), sh_type
);
2627 #define OPTION_DEBUG_DUMP 512
2629 static struct option options
[] =
2631 {"all", no_argument
, 0, 'a'},
2632 {"file-header", no_argument
, 0, 'h'},
2633 {"program-headers", no_argument
, 0, 'l'},
2634 {"headers", no_argument
, 0, 'e'},
2635 {"histogram", no_argument
, 0, 'I'},
2636 {"segments", no_argument
, 0, 'l'},
2637 {"sections", no_argument
, 0, 'S'},
2638 {"section-headers", no_argument
, 0, 'S'},
2639 {"section-groups", no_argument
, 0, 'g'},
2640 {"section-details", no_argument
, 0, 't'},
2641 {"full-section-name",no_argument
, 0, 'N'},
2642 {"symbols", no_argument
, 0, 's'},
2643 {"syms", no_argument
, 0, 's'},
2644 {"relocs", no_argument
, 0, 'r'},
2645 {"notes", no_argument
, 0, 'n'},
2646 {"dynamic", no_argument
, 0, 'd'},
2647 {"arch-specific", no_argument
, 0, 'A'},
2648 {"version-info", no_argument
, 0, 'V'},
2649 {"use-dynamic", no_argument
, 0, 'D'},
2650 {"hex-dump", required_argument
, 0, 'x'},
2651 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2652 {"unwind", no_argument
, 0, 'u'},
2653 #ifdef SUPPORT_DISASSEMBLY
2654 {"instruction-dump", required_argument
, 0, 'i'},
2657 {"version", no_argument
, 0, 'v'},
2658 {"wide", no_argument
, 0, 'W'},
2659 {"help", no_argument
, 0, 'H'},
2660 {0, no_argument
, 0, 0}
2666 fprintf (stdout
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2667 fprintf (stdout
, _(" Display information about the contents of ELF format files\n"));
2668 fprintf (stdout
, _(" Options are:\n\
2669 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2670 -h --file-header Display the ELF file header\n\
2671 -l --program-headers Display the program headers\n\
2672 --segments An alias for --program-headers\n\
2673 -S --section-headers Display the sections' header\n\
2674 --sections An alias for --section-headers\n\
2675 -g --section-groups Display the section groups\n\
2676 -t --section-details Display the section details\n\
2677 -e --headers Equivalent to: -h -l -S\n\
2678 -s --syms Display the symbol table\n\
2679 --symbols An alias for --syms\n\
2680 -n --notes Display the core notes (if present)\n\
2681 -r --relocs Display the relocations (if present)\n\
2682 -u --unwind Display the unwind info (if present)\n\
2683 -d --dynamic Display the dynamic section (if present)\n\
2684 -V --version-info Display the version sections (if present)\n\
2685 -A --arch-specific Display architecture specific information (if any).\n\
2686 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2687 -x --hex-dump=<number> Dump the contents of section <number>\n\
2688 -w[liaprmfFsoR] or\n\
2689 --debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]\n\
2690 Display the contents of DWARF2 debug sections\n"));
2691 #ifdef SUPPORT_DISASSEMBLY
2692 fprintf (stdout
, _("\
2693 -i --instruction-dump=<number>\n\
2694 Disassemble the contents of section <number>\n"));
2696 fprintf (stdout
, _("\
2697 -I --histogram Display histogram of bucket list lengths\n\
2698 -W --wide Allow output width to exceed 80 characters\n\
2699 @<file> Read options from <file>\n\
2700 -H --help Display this information\n\
2701 -v --version Display the version number of readelf\n"));
2702 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2707 /* Record the fact that the user wants the contents of section number
2708 SECTION to be displayed using the method(s) encoded as flags bits
2709 in TYPE. Note, TYPE can be zero if we are creating the array for
2713 request_dump (unsigned int section
, int type
)
2715 if (section
>= num_dump_sects
)
2717 char *new_dump_sects
;
2719 new_dump_sects
= calloc (section
+ 1, 1);
2721 if (new_dump_sects
== NULL
)
2722 error (_("Out of memory allocating dump request table."));
2725 /* Copy current flag settings. */
2726 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2730 dump_sects
= new_dump_sects
;
2731 num_dump_sects
= section
+ 1;
2736 dump_sects
[section
] |= type
;
2741 /* Request a dump by section name. */
2744 request_dump_byname (const char *section
, int type
)
2746 struct dump_list_entry
*new_request
;
2748 new_request
= malloc (sizeof (struct dump_list_entry
));
2750 error (_("Out of memory allocating dump request table."));
2752 new_request
->name
= strdup (section
);
2753 if (!new_request
->name
)
2754 error (_("Out of memory allocating dump request table."));
2756 new_request
->type
= type
;
2758 new_request
->next
= dump_sects_byname
;
2759 dump_sects_byname
= new_request
;
2763 parse_args (int argc
, char **argv
)
2770 while ((c
= getopt_long
2771 (argc
, argv
, "ersuahnldSDAINtgw::x:i:vVWH", options
, NULL
)) != EOF
)
2792 do_section_groups
++;
2800 do_section_groups
++;
2805 do_section_details
++;
2847 section
= strtoul (optarg
, & cp
, 0);
2848 if (! *cp
&& section
>= 0)
2849 request_dump (section
, HEX_DUMP
);
2851 request_dump_byname (optarg
, HEX_DUMP
);
2859 unsigned int index
= 0;
2863 while (optarg
[index
])
2864 switch (optarg
[index
++])
2873 do_debug_abbrevs
= 1;
2883 do_debug_pubnames
= 1;
2887 do_debug_aranges
= 1;
2891 do_debug_ranges
= 1;
2895 do_debug_frames_interp
= 1;
2897 do_debug_frames
= 1;
2902 do_debug_macinfo
= 1;
2916 warn (_("Unrecognized debug option '%s'\n"), optarg
);
2921 case OPTION_DEBUG_DUMP
:
2929 const char * option
;
2932 debug_dump_long_opts
;
2934 debug_dump_long_opts opts_table
[] =
2936 /* Please keep this table alpha- sorted. */
2937 { "Ranges", & do_debug_ranges
},
2938 { "abbrev", & do_debug_abbrevs
},
2939 { "aranges", & do_debug_aranges
},
2940 { "frames", & do_debug_frames
},
2941 { "frames-interp", & do_debug_frames_interp
},
2942 { "info", & do_debug_info
},
2943 { "line", & do_debug_lines
},
2944 { "loc", & do_debug_loc
},
2945 { "macro", & do_debug_macinfo
},
2946 { "pubnames", & do_debug_pubnames
},
2947 /* This entry is for compatability
2948 with earlier versions of readelf. */
2949 { "ranges", & do_debug_aranges
},
2950 { "str", & do_debug_str
},
2961 debug_dump_long_opts
* entry
;
2963 for (entry
= opts_table
; entry
->option
; entry
++)
2965 size_t len
= strlen (entry
->option
);
2967 if (strneq (p
, entry
->option
, len
)
2968 && (p
[len
] == ',' || p
[len
] == '\0'))
2970 * entry
->variable
= 1;
2972 /* The --debug-dump=frames-interp option also
2973 enables the --debug-dump=frames option. */
2974 if (do_debug_frames_interp
)
2975 do_debug_frames
= 1;
2982 if (entry
->option
== NULL
)
2984 warn (_("Unrecognized debug option '%s'\n"), p
);
2985 p
= strchr (p
, ',');
2995 #ifdef SUPPORT_DISASSEMBLY
2998 section
= strtoul (optarg
, & cp
, 0);
2999 if (! *cp
&& section
>= 0)
3001 request_dump (section
, DISASS_DUMP
);
3007 print_version (program_name
);
3016 #ifdef SUPPORT_DISASSEMBLY
3019 /* xgettext:c-format */
3020 error (_("Invalid option '-%c'\n"), c
);
3027 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
3028 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
3029 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
3030 && !do_section_groups
)
3034 warn (_("Nothing to do.\n"));
3040 get_elf_class (unsigned int elf_class
)
3042 static char buff
[32];
3046 case ELFCLASSNONE
: return _("none");
3047 case ELFCLASS32
: return "ELF32";
3048 case ELFCLASS64
: return "ELF64";
3050 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), elf_class
);
3056 get_data_encoding (unsigned int encoding
)
3058 static char buff
[32];
3062 case ELFDATANONE
: return _("none");
3063 case ELFDATA2LSB
: return _("2's complement, little endian");
3064 case ELFDATA2MSB
: return _("2's complement, big endian");
3066 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), encoding
);
3071 /* Decode the data held in 'elf_header'. */
3074 process_file_header (void)
3076 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
3077 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
3078 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
3079 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
3082 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3090 printf (_("ELF Header:\n"));
3091 printf (_(" Magic: "));
3092 for (i
= 0; i
< EI_NIDENT
; i
++)
3093 printf ("%2.2x ", elf_header
.e_ident
[i
]);
3095 printf (_(" Class: %s\n"),
3096 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
3097 printf (_(" Data: %s\n"),
3098 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
3099 printf (_(" Version: %d %s\n"),
3100 elf_header
.e_ident
[EI_VERSION
],
3101 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
3103 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
3106 printf (_(" OS/ABI: %s\n"),
3107 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
3108 printf (_(" ABI Version: %d\n"),
3109 elf_header
.e_ident
[EI_ABIVERSION
]);
3110 printf (_(" Type: %s\n"),
3111 get_file_type (elf_header
.e_type
));
3112 printf (_(" Machine: %s\n"),
3113 get_machine_name (elf_header
.e_machine
));
3114 printf (_(" Version: 0x%lx\n"),
3115 (unsigned long) elf_header
.e_version
);
3117 printf (_(" Entry point address: "));
3118 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3119 printf (_("\n Start of program headers: "));
3120 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3121 printf (_(" (bytes into file)\n Start of section headers: "));
3122 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
3123 printf (_(" (bytes into file)\n"));
3125 printf (_(" Flags: 0x%lx%s\n"),
3126 (unsigned long) elf_header
.e_flags
,
3127 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
3128 printf (_(" Size of this header: %ld (bytes)\n"),
3129 (long) elf_header
.e_ehsize
);
3130 printf (_(" Size of program headers: %ld (bytes)\n"),
3131 (long) elf_header
.e_phentsize
);
3132 printf (_(" Number of program headers: %ld\n"),
3133 (long) elf_header
.e_phnum
);
3134 printf (_(" Size of section headers: %ld (bytes)\n"),
3135 (long) elf_header
.e_shentsize
);
3136 printf (_(" Number of section headers: %ld"),
3137 (long) elf_header
.e_shnum
);
3138 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
3139 printf (" (%ld)", (long) section_headers
[0].sh_size
);
3140 putc ('\n', stdout
);
3141 printf (_(" Section header string table index: %ld"),
3142 (long) elf_header
.e_shstrndx
);
3143 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
3144 printf (" (%ld)", (long) section_headers
[0].sh_link
);
3145 putc ('\n', stdout
);
3148 if (section_headers
!= NULL
)
3150 if (elf_header
.e_shnum
== 0)
3151 elf_header
.e_shnum
= section_headers
[0].sh_size
;
3152 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
3153 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
3154 free (section_headers
);
3155 section_headers
= NULL
;
3163 get_32bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3165 Elf32_External_Phdr
*phdrs
;
3166 Elf32_External_Phdr
*external
;
3167 Elf_Internal_Phdr
*internal
;
3170 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3171 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3172 _("program headers"));
3176 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3177 i
< elf_header
.e_phnum
;
3178 i
++, internal
++, external
++)
3180 internal
->p_type
= BYTE_GET (external
->p_type
);
3181 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3182 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3183 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3184 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3185 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3186 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3187 internal
->p_align
= BYTE_GET (external
->p_align
);
3196 get_64bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3198 Elf64_External_Phdr
*phdrs
;
3199 Elf64_External_Phdr
*external
;
3200 Elf_Internal_Phdr
*internal
;
3203 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3204 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3205 _("program headers"));
3209 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3210 i
< elf_header
.e_phnum
;
3211 i
++, internal
++, external
++)
3213 internal
->p_type
= BYTE_GET (external
->p_type
);
3214 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3215 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3216 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3217 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3218 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3219 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3220 internal
->p_align
= BYTE_GET (external
->p_align
);
3228 /* Returns 1 if the program headers were read into `program_headers'. */
3231 get_program_headers (FILE *file
)
3233 Elf_Internal_Phdr
*phdrs
;
3235 /* Check cache of prior read. */
3236 if (program_headers
!= NULL
)
3239 phdrs
= cmalloc (elf_header
.e_phnum
, sizeof (Elf_Internal_Phdr
));
3243 error (_("Out of memory\n"));
3248 ? get_32bit_program_headers (file
, phdrs
)
3249 : get_64bit_program_headers (file
, phdrs
))
3251 program_headers
= phdrs
;
3259 /* Returns 1 if the program headers were loaded. */
3262 process_program_headers (FILE *file
)
3264 Elf_Internal_Phdr
*segment
;
3267 if (elf_header
.e_phnum
== 0)
3270 printf (_("\nThere are no program headers in this file.\n"));
3274 if (do_segments
&& !do_header
)
3276 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3277 printf (_("Entry point "));
3278 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3279 printf (_("\nThere are %d program headers, starting at offset "),
3280 elf_header
.e_phnum
);
3281 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3285 if (! get_program_headers (file
))
3290 if (elf_header
.e_phnum
> 1)
3291 printf (_("\nProgram Headers:\n"));
3293 printf (_("\nProgram Headers:\n"));
3297 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3300 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3304 (_(" Type Offset VirtAddr PhysAddr\n"));
3306 (_(" FileSiz MemSiz Flags Align\n"));
3313 for (i
= 0, segment
= program_headers
;
3314 i
< elf_header
.e_phnum
;
3319 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3323 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3324 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3325 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3326 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3327 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3329 (segment
->p_flags
& PF_R
? 'R' : ' '),
3330 (segment
->p_flags
& PF_W
? 'W' : ' '),
3331 (segment
->p_flags
& PF_X
? 'E' : ' '));
3332 printf ("%#lx", (unsigned long) segment
->p_align
);
3336 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3337 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3340 print_vma (segment
->p_offset
, FULL_HEX
);
3344 print_vma (segment
->p_vaddr
, FULL_HEX
);
3346 print_vma (segment
->p_paddr
, FULL_HEX
);
3349 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3350 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3353 print_vma (segment
->p_filesz
, FULL_HEX
);
3357 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3358 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3361 print_vma (segment
->p_offset
, FULL_HEX
);
3365 (segment
->p_flags
& PF_R
? 'R' : ' '),
3366 (segment
->p_flags
& PF_W
? 'W' : ' '),
3367 (segment
->p_flags
& PF_X
? 'E' : ' '));
3369 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3370 printf ("%#lx", (unsigned long) segment
->p_align
);
3373 print_vma (segment
->p_align
, PREFIX_HEX
);
3378 print_vma (segment
->p_offset
, FULL_HEX
);
3380 print_vma (segment
->p_vaddr
, FULL_HEX
);
3382 print_vma (segment
->p_paddr
, FULL_HEX
);
3384 print_vma (segment
->p_filesz
, FULL_HEX
);
3386 print_vma (segment
->p_memsz
, FULL_HEX
);
3388 (segment
->p_flags
& PF_R
? 'R' : ' '),
3389 (segment
->p_flags
& PF_W
? 'W' : ' '),
3390 (segment
->p_flags
& PF_X
? 'E' : ' '));
3391 print_vma (segment
->p_align
, HEX
);
3395 switch (segment
->p_type
)
3399 error (_("more than one dynamic segment\n"));
3401 /* Try to locate the .dynamic section. If there is
3402 a section header table, we can easily locate it. */
3403 if (section_headers
!= NULL
)
3405 Elf_Internal_Shdr
*sec
;
3407 sec
= find_section (".dynamic");
3408 if (sec
== NULL
|| sec
->sh_size
== 0)
3410 error (_("no .dynamic section in the dynamic segment"));
3414 dynamic_addr
= sec
->sh_offset
;
3415 dynamic_size
= sec
->sh_size
;
3417 if (dynamic_addr
< segment
->p_offset
3418 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
3419 warn (_("the .dynamic section is not contained within the dynamic segment"));
3420 else if (dynamic_addr
> segment
->p_offset
)
3421 warn (_("the .dynamic section is not the first section in the dynamic segment."));
3425 /* Otherwise, we can only assume that the .dynamic
3426 section is the first section in the DYNAMIC segment. */
3427 dynamic_addr
= segment
->p_offset
;
3428 dynamic_size
= segment
->p_filesz
;
3433 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3435 error (_("Unable to find program interpreter name\n"));
3438 program_interpreter
[0] = 0;
3439 fscanf (file
, "%63s", program_interpreter
);
3442 printf (_("\n [Requesting program interpreter: %s]"),
3443 program_interpreter
);
3449 putc ('\n', stdout
);
3452 if (do_segments
&& section_headers
!= NULL
&& string_table
!= NULL
)
3454 printf (_("\n Section to Segment mapping:\n"));
3455 printf (_(" Segment Sections...\n"));
3457 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3460 Elf_Internal_Shdr
*section
;
3462 segment
= program_headers
+ i
;
3463 section
= section_headers
;
3465 printf (" %2.2d ", i
);
3467 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3469 if (ELF_IS_SECTION_IN_SEGMENT_MEMORY(section
, segment
))
3470 printf ("%s ", SECTION_NAME (section
));
3481 /* Find the file offset corresponding to VMA by using the program headers. */
3484 offset_from_vma (FILE *file
, bfd_vma vma
, bfd_size_type size
)
3486 Elf_Internal_Phdr
*seg
;
3488 if (! get_program_headers (file
))
3490 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3494 for (seg
= program_headers
;
3495 seg
< program_headers
+ elf_header
.e_phnum
;
3498 if (seg
->p_type
!= PT_LOAD
)
3501 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3502 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3503 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3506 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3513 get_32bit_section_headers (FILE *file
, unsigned int num
)
3515 Elf32_External_Shdr
*shdrs
;
3516 Elf_Internal_Shdr
*internal
;
3519 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3520 elf_header
.e_shentsize
, num
, _("section headers"));
3524 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3526 if (section_headers
== NULL
)
3528 error (_("Out of memory\n"));
3532 for (i
= 0, internal
= section_headers
;
3536 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3537 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3538 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3539 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3540 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3541 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3542 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3543 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3544 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3545 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3554 get_64bit_section_headers (FILE *file
, unsigned int num
)
3556 Elf64_External_Shdr
*shdrs
;
3557 Elf_Internal_Shdr
*internal
;
3560 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3561 elf_header
.e_shentsize
, num
, _("section headers"));
3565 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3567 if (section_headers
== NULL
)
3569 error (_("Out of memory\n"));
3573 for (i
= 0, internal
= section_headers
;
3577 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3578 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3579 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3580 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3581 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3582 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3583 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3584 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3585 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3586 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3594 static Elf_Internal_Sym
*
3595 get_32bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3597 unsigned long number
;
3598 Elf32_External_Sym
*esyms
;
3599 Elf_External_Sym_Shndx
*shndx
;
3600 Elf_Internal_Sym
*isyms
;
3601 Elf_Internal_Sym
*psym
;
3604 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3610 if (symtab_shndx_hdr
!= NULL
3611 && (symtab_shndx_hdr
->sh_link
3612 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3614 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3615 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3623 number
= section
->sh_size
/ section
->sh_entsize
;
3624 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3628 error (_("Out of memory\n"));
3635 for (j
= 0, psym
= isyms
;
3639 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3640 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3641 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3642 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3643 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3645 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3646 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3647 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3657 static Elf_Internal_Sym
*
3658 get_64bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3660 unsigned long number
;
3661 Elf64_External_Sym
*esyms
;
3662 Elf_External_Sym_Shndx
*shndx
;
3663 Elf_Internal_Sym
*isyms
;
3664 Elf_Internal_Sym
*psym
;
3667 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3673 if (symtab_shndx_hdr
!= NULL
3674 && (symtab_shndx_hdr
->sh_link
3675 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3677 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3678 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3686 number
= section
->sh_size
/ section
->sh_entsize
;
3687 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3691 error (_("Out of memory\n"));
3698 for (j
= 0, psym
= isyms
;
3702 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3703 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3704 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3705 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3706 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3708 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3709 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3710 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3721 get_elf_section_flags (bfd_vma sh_flags
)
3723 static char buff
[1024];
3725 int field_size
= is_32bit_elf
? 8 : 16;
3726 int index
, size
= sizeof (buff
) - (field_size
+ 4 + 1);
3727 bfd_vma os_flags
= 0;
3728 bfd_vma proc_flags
= 0;
3729 bfd_vma unknown_flags
= 0;
3743 { "LINK ORDER", 10 },
3744 { "OS NONCONF", 10 },
3749 if (do_section_details
)
3751 sprintf (buff
, "[%*.*lx]: ",
3752 field_size
, field_size
, (unsigned long) sh_flags
);
3753 p
+= field_size
+ 4;
3760 flag
= sh_flags
& - sh_flags
;
3763 if (do_section_details
)
3767 case SHF_WRITE
: index
= 0; break;
3768 case SHF_ALLOC
: index
= 1; break;
3769 case SHF_EXECINSTR
: index
= 2; break;
3770 case SHF_MERGE
: index
= 3; break;
3771 case SHF_STRINGS
: index
= 4; break;
3772 case SHF_INFO_LINK
: index
= 5; break;
3773 case SHF_LINK_ORDER
: index
= 6; break;
3774 case SHF_OS_NONCONFORMING
: index
= 7; break;
3775 case SHF_GROUP
: index
= 8; break;
3776 case SHF_TLS
: index
= 9; break;
3785 if (p
!= buff
+ field_size
+ 4)
3787 if (size
< (10 + 2))
3794 size
-= flags
[index
].len
;
3795 p
= stpcpy (p
, flags
[index
].str
);
3797 else if (flag
& SHF_MASKOS
)
3799 else if (flag
& SHF_MASKPROC
)
3802 unknown_flags
|= flag
;
3808 case SHF_WRITE
: *p
= 'W'; break;
3809 case SHF_ALLOC
: *p
= 'A'; break;
3810 case SHF_EXECINSTR
: *p
= 'X'; break;
3811 case SHF_MERGE
: *p
= 'M'; break;
3812 case SHF_STRINGS
: *p
= 'S'; break;
3813 case SHF_INFO_LINK
: *p
= 'I'; break;
3814 case SHF_LINK_ORDER
: *p
= 'L'; break;
3815 case SHF_OS_NONCONFORMING
: *p
= 'O'; break;
3816 case SHF_GROUP
: *p
= 'G'; break;
3817 case SHF_TLS
: *p
= 'T'; break;
3820 if (elf_header
.e_machine
== EM_X86_64
3821 && flag
== SHF_X86_64_LARGE
)
3823 else if (flag
& SHF_MASKOS
)
3826 sh_flags
&= ~ SHF_MASKOS
;
3828 else if (flag
& SHF_MASKPROC
)
3831 sh_flags
&= ~ SHF_MASKPROC
;
3841 if (do_section_details
)
3845 size
-= 5 + field_size
;
3846 if (p
!= buff
+ field_size
+ 4)
3854 sprintf (p
, "OS (%*.*lx)", field_size
, field_size
,
3855 (unsigned long) os_flags
);
3856 p
+= 5 + field_size
;
3860 size
-= 7 + field_size
;
3861 if (p
!= buff
+ field_size
+ 4)
3869 sprintf (p
, "PROC (%*.*lx)", field_size
, field_size
,
3870 (unsigned long) proc_flags
);
3871 p
+= 7 + field_size
;
3875 size
-= 10 + field_size
;
3876 if (p
!= buff
+ field_size
+ 4)
3884 sprintf (p
, "UNKNOWN (%*.*lx)", field_size
, field_size
,
3885 (unsigned long) unknown_flags
);
3886 p
+= 10 + field_size
;
3895 process_section_headers (FILE *file
)
3897 Elf_Internal_Shdr
*section
;
3900 section_headers
= NULL
;
3902 if (elf_header
.e_shnum
== 0)
3905 printf (_("\nThere are no sections in this file.\n"));
3910 if (do_sections
&& !do_header
)
3911 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3912 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3916 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3919 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3922 /* Read in the string table, so that we have names to display. */
3923 if (SECTION_HEADER_INDEX (elf_header
.e_shstrndx
) < elf_header
.e_shnum
)
3925 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3927 if (section
->sh_size
!= 0)
3929 string_table
= get_data (NULL
, file
, section
->sh_offset
,
3930 1, section
->sh_size
, _("string table"));
3932 string_table_length
= string_table
!= NULL
? section
->sh_size
: 0;
3936 /* Scan the sections for the dynamic symbol table
3937 and dynamic string table and debug sections. */
3938 dynamic_symbols
= NULL
;
3939 dynamic_strings
= NULL
;
3940 dynamic_syminfo
= NULL
;
3941 symtab_shndx_hdr
= NULL
;
3943 eh_addr_size
= is_32bit_elf
? 4 : 8;
3944 switch (elf_header
.e_machine
)
3947 case EM_MIPS_RS3_LE
:
3948 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
3949 FDE addresses. However, the ABI also has a semi-official ILP32
3950 variant for which the normal FDE address size rules apply.
3952 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
3953 section, where XX is the size of longs in bits. Unfortunately,
3954 earlier compilers provided no way of distinguishing ILP32 objects
3955 from LP64 objects, so if there's any doubt, we should assume that
3956 the official LP64 form is being used. */
3957 if ((elf_header
.e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
3958 && find_section (".gcc_compiled_long32") == NULL
)
3963 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
3966 size_t expected_entsize \
3967 = is_32bit_elf ? size32 : size64; \
3968 if (section->sh_entsize != expected_entsize) \
3969 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
3970 i, (unsigned long int) section->sh_entsize, \
3971 (unsigned long int) expected_entsize); \
3972 section->sh_entsize = expected_entsize; \
3975 #define CHECK_ENTSIZE(section, i, type) \
3976 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
3977 sizeof (Elf64_External_##type))
3979 for (i
= 0, section
= section_headers
;
3980 i
< elf_header
.e_shnum
;
3983 char *name
= SECTION_NAME (section
);
3985 if (section
->sh_type
== SHT_DYNSYM
)
3987 if (dynamic_symbols
!= NULL
)
3989 error (_("File contains multiple dynamic symbol tables\n"));
3993 CHECK_ENTSIZE (section
, i
, Sym
);
3994 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3995 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3997 else if (section
->sh_type
== SHT_STRTAB
3998 && streq (name
, ".dynstr"))
4000 if (dynamic_strings
!= NULL
)
4002 error (_("File contains multiple dynamic string tables\n"));
4006 dynamic_strings
= get_data (NULL
, file
, section
->sh_offset
,
4007 1, section
->sh_size
, _("dynamic strings"));
4008 dynamic_strings_length
= section
->sh_size
;
4010 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
4012 if (symtab_shndx_hdr
!= NULL
)
4014 error (_("File contains multiple symtab shndx tables\n"));
4017 symtab_shndx_hdr
= section
;
4019 else if (section
->sh_type
== SHT_SYMTAB
)
4020 CHECK_ENTSIZE (section
, i
, Sym
);
4021 else if (section
->sh_type
== SHT_GROUP
)
4022 CHECK_ENTSIZE_VALUES (section
, i
, GRP_ENTRY_SIZE
, GRP_ENTRY_SIZE
);
4023 else if (section
->sh_type
== SHT_REL
)
4024 CHECK_ENTSIZE (section
, i
, Rel
);
4025 else if (section
->sh_type
== SHT_RELA
)
4026 CHECK_ENTSIZE (section
, i
, Rela
);
4027 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
4028 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
4029 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
4030 || do_debug_loc
|| do_debug_ranges
)
4031 && strneq (name
, ".debug_", 7))
4036 || (do_debug_info
&& streq (name
, "info"))
4037 || (do_debug_abbrevs
&& streq (name
, "abbrev"))
4038 || (do_debug_lines
&& streq (name
, "line"))
4039 || (do_debug_pubnames
&& streq (name
, "pubnames"))
4040 || (do_debug_aranges
&& streq (name
, "aranges"))
4041 || (do_debug_ranges
&& streq (name
, "ranges"))
4042 || (do_debug_frames
&& streq (name
, "frame"))
4043 || (do_debug_macinfo
&& streq (name
, "macinfo"))
4044 || (do_debug_str
&& streq (name
, "str"))
4045 || (do_debug_loc
&& streq (name
, "loc"))
4047 request_dump (i
, DEBUG_DUMP
);
4049 /* linkonce section to be combined with .debug_info at link time. */
4050 else if ((do_debugging
|| do_debug_info
)
4051 && strneq (name
, ".gnu.linkonce.wi.", 17))
4052 request_dump (i
, DEBUG_DUMP
);
4053 else if (do_debug_frames
&& streq (name
, ".eh_frame"))
4054 request_dump (i
, DEBUG_DUMP
);
4060 if (elf_header
.e_shnum
> 1)
4061 printf (_("\nSection Headers:\n"));
4063 printf (_("\nSection Header:\n"));
4067 if (do_section_details
)
4069 printf (_(" [Nr] Name\n"));
4070 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
4074 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4078 if (do_section_details
)
4080 printf (_(" [Nr] Name\n"));
4081 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
4085 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4089 if (do_section_details
)
4091 printf (_(" [Nr] Name\n"));
4092 printf (_(" Type Address Offset Link\n"));
4093 printf (_(" Size EntSize Info Align\n"));
4097 printf (_(" [Nr] Name Type Address Offset\n"));
4098 printf (_(" Size EntSize Flags Link Info Align\n"));
4102 if (do_section_details
)
4103 printf (_(" Flags\n"));
4105 for (i
= 0, section
= section_headers
;
4106 i
< elf_header
.e_shnum
;
4109 if (do_section_details
)
4111 printf (" [%2u] %s\n",
4112 SECTION_HEADER_NUM (i
),
4113 SECTION_NAME (section
));
4114 if (is_32bit_elf
|| do_wide
)
4115 printf (" %-15.15s ",
4116 get_section_type_name (section
->sh_type
));
4119 printf (" [%2u] %-17.17s %-15.15s ",
4120 SECTION_HEADER_NUM (i
),
4121 SECTION_NAME (section
),
4122 get_section_type_name (section
->sh_type
));
4126 print_vma (section
->sh_addr
, LONG_HEX
);
4128 printf ( " %6.6lx %6.6lx %2.2lx",
4129 (unsigned long) section
->sh_offset
,
4130 (unsigned long) section
->sh_size
,
4131 (unsigned long) section
->sh_entsize
);
4133 if (do_section_details
)
4134 fputs (" ", stdout
);
4136 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4138 printf ("%2ld %3lu %2ld\n",
4139 (unsigned long) section
->sh_link
,
4140 (unsigned long) section
->sh_info
,
4141 (unsigned long) section
->sh_addralign
);
4145 print_vma (section
->sh_addr
, LONG_HEX
);
4147 if ((long) section
->sh_offset
== section
->sh_offset
)
4148 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
4152 print_vma (section
->sh_offset
, LONG_HEX
);
4155 if ((unsigned long) section
->sh_size
== section
->sh_size
)
4156 printf (" %6.6lx", (unsigned long) section
->sh_size
);
4160 print_vma (section
->sh_size
, LONG_HEX
);
4163 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
4164 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
4168 print_vma (section
->sh_entsize
, LONG_HEX
);
4171 if (do_section_details
)
4172 fputs (" ", stdout
);
4174 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4176 printf ("%2ld %3lu ",
4177 (unsigned long) section
->sh_link
,
4178 (unsigned long) section
->sh_info
);
4180 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
4181 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
4184 print_vma (section
->sh_addralign
, DEC
);
4188 else if (do_section_details
)
4190 printf (" %-15.15s ",
4191 get_section_type_name (section
->sh_type
));
4192 print_vma (section
->sh_addr
, LONG_HEX
);
4193 if ((long) section
->sh_offset
== section
->sh_offset
)
4194 printf (" %16.16lx", (unsigned long) section
->sh_offset
);
4198 print_vma (section
->sh_offset
, LONG_HEX
);
4200 printf (" %ld\n ", (unsigned long) section
->sh_link
);
4201 print_vma (section
->sh_size
, LONG_HEX
);
4203 print_vma (section
->sh_entsize
, LONG_HEX
);
4205 printf (" %-16lu %ld\n",
4206 (unsigned long) section
->sh_info
,
4207 (unsigned long) section
->sh_addralign
);
4212 print_vma (section
->sh_addr
, LONG_HEX
);
4213 if ((long) section
->sh_offset
== section
->sh_offset
)
4214 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
4218 print_vma (section
->sh_offset
, LONG_HEX
);
4221 print_vma (section
->sh_size
, LONG_HEX
);
4223 print_vma (section
->sh_entsize
, LONG_HEX
);
4225 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4227 printf (" %2ld %3lu %ld\n",
4228 (unsigned long) section
->sh_link
,
4229 (unsigned long) section
->sh_info
,
4230 (unsigned long) section
->sh_addralign
);
4233 if (do_section_details
)
4234 printf (" %s\n", get_elf_section_flags (section
->sh_flags
));
4237 if (!do_section_details
)
4238 printf (_("Key to Flags:\n\
4239 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4240 I (info), L (link order), G (group), x (unknown)\n\
4241 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4247 get_group_flags (unsigned int flags
)
4249 static char buff
[32];
4256 snprintf (buff
, sizeof (buff
), _("[<unknown>: 0x%x]"), flags
);
4263 process_section_groups (FILE *file
)
4265 Elf_Internal_Shdr
*section
;
4267 struct group
*group
;
4268 Elf_Internal_Shdr
*symtab_sec
, *strtab_sec
;
4269 Elf_Internal_Sym
*symtab
;
4273 /* Don't process section groups unless needed. */
4274 if (!do_unwind
&& !do_section_groups
)
4277 if (elf_header
.e_shnum
== 0)
4279 if (do_section_groups
)
4280 printf (_("\nThere are no sections in this file.\n"));
4285 if (section_headers
== NULL
)
4287 error (_("Section headers are not available!\n"));
4291 section_headers_groups
= calloc (elf_header
.e_shnum
,
4292 sizeof (struct group
*));
4294 if (section_headers_groups
== NULL
)
4296 error (_("Out of memory\n"));
4300 /* Scan the sections for the group section. */
4302 for (i
= 0, section
= section_headers
;
4303 i
< elf_header
.e_shnum
;
4305 if (section
->sh_type
== SHT_GROUP
)
4308 if (group_count
== 0)
4310 if (do_section_groups
)
4311 printf (_("\nThere are no section groups in this file.\n"));
4316 section_groups
= calloc (group_count
, sizeof (struct group
));
4318 if (section_groups
== NULL
)
4320 error (_("Out of memory\n"));
4329 for (i
= 0, section
= section_headers
, group
= section_groups
;
4330 i
< elf_header
.e_shnum
;
4333 if (section
->sh_type
== SHT_GROUP
)
4335 char *name
= SECTION_NAME (section
);
4337 unsigned char *start
, *indices
;
4338 unsigned int entry
, j
, size
;
4339 Elf_Internal_Shdr
*sec
;
4340 Elf_Internal_Sym
*sym
;
4342 /* Get the symbol table. */
4343 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
4344 || ((sec
= SECTION_HEADER (section
->sh_link
))->sh_type
4347 error (_("Bad sh_link in group section `%s'\n"), name
);
4351 if (symtab_sec
!= sec
)
4356 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
);
4359 sym
= symtab
+ section
->sh_info
;
4361 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4363 bfd_vma sec_index
= SECTION_HEADER_INDEX (sym
->st_shndx
);
4366 error (_("Bad sh_info in group section `%s'\n"), name
);
4370 group_name
= SECTION_NAME (section_headers
+ sec_index
);
4379 /* Get the string table. */
4380 if (SECTION_HEADER_INDEX (symtab_sec
->sh_link
)
4381 >= elf_header
.e_shnum
)
4390 != (sec
= SECTION_HEADER (symtab_sec
->sh_link
)))
4395 strtab
= get_data (NULL
, file
, strtab_sec
->sh_offset
,
4396 1, strtab_sec
->sh_size
,
4398 strtab_size
= strtab
!= NULL
? strtab_sec
->sh_size
: 0;
4400 group_name
= sym
->st_name
< strtab_size
4401 ? strtab
+ sym
->st_name
: "<corrupt>";
4404 start
= get_data (NULL
, file
, section
->sh_offset
,
4405 1, section
->sh_size
, _("section data"));
4408 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
4409 entry
= byte_get (indices
, 4);
4412 if (do_section_groups
)
4414 printf ("\n%s group section [%5u] `%s' [%s] contains %u sections:\n",
4415 get_group_flags (entry
), i
, name
, group_name
, size
);
4417 printf (_(" [Index] Name\n"));
4420 group
->group_index
= i
;
4422 for (j
= 0; j
< size
; j
++)
4424 struct group_list
*g
;
4426 entry
= byte_get (indices
, 4);
4429 if (SECTION_HEADER_INDEX (entry
) >= elf_header
.e_shnum
)
4431 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
4432 entry
, i
, elf_header
.e_shnum
- 1);
4435 else if (entry
>= SHN_LORESERVE
&& entry
<= SHN_HIRESERVE
)
4437 error (_("invalid section [%5u] in group section [%5u]\n"),
4442 if (section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4447 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
4449 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4454 /* Intel C/C++ compiler may put section 0 in a
4455 section group. We just warn it the first time
4456 and ignore it afterwards. */
4457 static int warned
= 0;
4460 error (_("section 0 in group section [%5u]\n"),
4461 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4467 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4470 if (do_section_groups
)
4472 sec
= SECTION_HEADER (entry
);
4473 printf (" [%5u] %s\n", entry
, SECTION_NAME (sec
));
4476 g
= xmalloc (sizeof (struct group_list
));
4477 g
->section_index
= entry
;
4478 g
->next
= group
->root
;
4502 } dynamic_relocations
[] =
4504 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
4505 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
4506 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
4509 /* Process the reloc section. */
4512 process_relocs (FILE *file
)
4514 unsigned long rel_size
;
4515 unsigned long rel_offset
;
4521 if (do_using_dynamic
)
4525 int has_dynamic_reloc
;
4528 has_dynamic_reloc
= 0;
4530 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
4532 is_rela
= dynamic_relocations
[i
].rela
;
4533 name
= dynamic_relocations
[i
].name
;
4534 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
4535 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
4537 has_dynamic_reloc
|= rel_size
;
4539 if (is_rela
== UNKNOWN
)
4541 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
4542 switch (dynamic_info
[DT_PLTREL
])
4556 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4557 name
, rel_offset
, rel_size
);
4559 dump_relocations (file
,
4560 offset_from_vma (file
, rel_offset
, rel_size
),
4562 dynamic_symbols
, num_dynamic_syms
,
4563 dynamic_strings
, dynamic_strings_length
, is_rela
);
4567 if (! has_dynamic_reloc
)
4568 printf (_("\nThere are no dynamic relocations in this file.\n"));
4572 Elf_Internal_Shdr
*section
;
4576 for (i
= 0, section
= section_headers
;
4577 i
< elf_header
.e_shnum
;
4580 if ( section
->sh_type
!= SHT_RELA
4581 && section
->sh_type
!= SHT_REL
)
4584 rel_offset
= section
->sh_offset
;
4585 rel_size
= section
->sh_size
;
4589 Elf_Internal_Shdr
*strsec
;
4592 printf (_("\nRelocation section "));
4594 if (string_table
== NULL
)
4595 printf ("%d", section
->sh_name
);
4597 printf (_("'%s'"), SECTION_NAME (section
));
4599 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4600 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4602 is_rela
= section
->sh_type
== SHT_RELA
;
4604 if (section
->sh_link
4605 && SECTION_HEADER_INDEX (section
->sh_link
)
4606 < elf_header
.e_shnum
)
4608 Elf_Internal_Shdr
*symsec
;
4609 Elf_Internal_Sym
*symtab
;
4610 unsigned long nsyms
;
4611 unsigned long strtablen
= 0;
4612 char *strtab
= NULL
;
4614 symsec
= SECTION_HEADER (section
->sh_link
);
4615 if (symsec
->sh_type
!= SHT_SYMTAB
4616 && symsec
->sh_type
!= SHT_DYNSYM
)
4619 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4620 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4625 if (SECTION_HEADER_INDEX (symsec
->sh_link
)
4626 < elf_header
.e_shnum
)
4628 strsec
= SECTION_HEADER (symsec
->sh_link
);
4630 strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4633 strtablen
= strtab
== NULL
? 0 : strsec
->sh_size
;
4636 dump_relocations (file
, rel_offset
, rel_size
,
4637 symtab
, nsyms
, strtab
, strtablen
, is_rela
);
4643 dump_relocations (file
, rel_offset
, rel_size
,
4644 NULL
, 0, NULL
, 0, is_rela
);
4651 printf (_("\nThere are no relocations in this file.\n"));
4657 /* Process the unwind section. */
4659 #include "unwind-ia64.h"
4661 /* An absolute address consists of a section and an offset. If the
4662 section is NULL, the offset itself is the address, otherwise, the
4663 address equals to LOAD_ADDRESS(section) + offset. */
4667 unsigned short section
;
4671 #define ABSADDR(a) \
4673 ? section_headers [(a).section].sh_addr + (a).offset \
4676 struct ia64_unw_aux_info
4678 struct ia64_unw_table_entry
4680 struct absaddr start
;
4682 struct absaddr info
;
4684 *table
; /* Unwind table. */
4685 unsigned long table_len
; /* Length of unwind table. */
4686 unsigned char *info
; /* Unwind info. */
4687 unsigned long info_size
; /* Size of unwind info. */
4688 bfd_vma info_addr
; /* starting address of unwind info. */
4689 bfd_vma seg_base
; /* Starting address of segment. */
4690 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4691 unsigned long nsyms
; /* Number of symbols. */
4692 char *strtab
; /* The string table. */
4693 unsigned long strtab_size
; /* Size of string table. */
4697 find_symbol_for_address (Elf_Internal_Sym
*symtab
,
4698 unsigned long nsyms
,
4700 unsigned long strtab_size
,
4701 struct absaddr addr
,
4702 const char **symname
,
4705 bfd_vma dist
= 0x100000;
4706 Elf_Internal_Sym
*sym
, *best
= NULL
;
4709 for (i
= 0, sym
= symtab
; i
< nsyms
; ++i
, ++sym
)
4711 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
4712 && sym
->st_name
!= 0
4713 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
4714 && addr
.offset
>= sym
->st_value
4715 && addr
.offset
- sym
->st_value
< dist
)
4718 dist
= addr
.offset
- sym
->st_value
;
4725 *symname
= (best
->st_name
>= strtab_size
4726 ? "<corrupt>" : strtab
+ best
->st_name
);
4731 *offset
= addr
.offset
;
4735 dump_ia64_unwind (struct ia64_unw_aux_info
*aux
)
4737 struct ia64_unw_table_entry
*tp
;
4740 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4744 const unsigned char *dp
;
4745 const unsigned char *head
;
4746 const char *procname
;
4748 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
4749 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
4751 fputs ("\n<", stdout
);
4755 fputs (procname
, stdout
);
4758 printf ("+%lx", (unsigned long) offset
);
4761 fputs (">: [", stdout
);
4762 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4763 fputc ('-', stdout
);
4764 print_vma (tp
->end
.offset
, PREFIX_HEX
);
4765 printf ("], info at +0x%lx\n",
4766 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
4768 head
= aux
->info
+ (ABSADDR (tp
->info
) - aux
->info_addr
);
4769 stamp
= byte_get ((unsigned char *) head
, sizeof (stamp
));
4771 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4772 (unsigned) UNW_VER (stamp
),
4773 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
4774 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
4775 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
4776 (unsigned long) (eh_addr_size
* UNW_LENGTH (stamp
)));
4778 if (UNW_VER (stamp
) != 1)
4780 printf ("\tUnknown version.\n");
4785 for (dp
= head
+ 8; dp
< head
+ 8 + eh_addr_size
* UNW_LENGTH (stamp
);)
4786 dp
= unw_decode (dp
, in_body
, & in_body
);
4791 slurp_ia64_unwind_table (FILE *file
,
4792 struct ia64_unw_aux_info
*aux
,
4793 Elf_Internal_Shdr
*sec
)
4795 unsigned long size
, nrelas
, i
;
4796 Elf_Internal_Phdr
*seg
;
4797 struct ia64_unw_table_entry
*tep
;
4798 Elf_Internal_Shdr
*relsec
;
4799 Elf_Internal_Rela
*rela
, *rp
;
4800 unsigned char *table
, *tp
;
4801 Elf_Internal_Sym
*sym
;
4802 const char *relname
;
4804 /* First, find the starting address of the segment that includes
4807 if (elf_header
.e_phnum
)
4809 if (! get_program_headers (file
))
4812 for (seg
= program_headers
;
4813 seg
< program_headers
+ elf_header
.e_phnum
;
4816 if (seg
->p_type
!= PT_LOAD
)
4819 if (sec
->sh_addr
>= seg
->p_vaddr
4820 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
4822 aux
->seg_base
= seg
->p_vaddr
;
4828 /* Second, build the unwind table from the contents of the unwind section: */
4829 size
= sec
->sh_size
;
4830 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
4834 aux
->table
= xcmalloc (size
/ (3 * eh_addr_size
), sizeof (aux
->table
[0]));
4836 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * eh_addr_size
, ++tep
)
4838 tep
->start
.section
= SHN_UNDEF
;
4839 tep
->end
.section
= SHN_UNDEF
;
4840 tep
->info
.section
= SHN_UNDEF
;
4843 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
4844 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
4845 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
4849 tep
->start
.offset
= BYTE_GET ((unsigned char *) tp
+ 0);
4850 tep
->end
.offset
= BYTE_GET ((unsigned char *) tp
+ 8);
4851 tep
->info
.offset
= BYTE_GET ((unsigned char *) tp
+ 16);
4853 tep
->start
.offset
+= aux
->seg_base
;
4854 tep
->end
.offset
+= aux
->seg_base
;
4855 tep
->info
.offset
+= aux
->seg_base
;
4859 /* Third, apply any relocations to the unwind table: */
4861 for (relsec
= section_headers
;
4862 relsec
< section_headers
+ elf_header
.e_shnum
;
4865 if (relsec
->sh_type
!= SHT_RELA
4866 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
4867 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4870 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
4874 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
4878 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
4879 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
4883 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
4884 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
4887 if (! strneq (relname
, "R_IA64_SEGREL", 13))
4889 warn (_("Skipping unexpected relocation type %s\n"), relname
);
4893 i
= rp
->r_offset
/ (3 * eh_addr_size
);
4895 switch (rp
->r_offset
/eh_addr_size
% 3)
4898 aux
->table
[i
].start
.section
= sym
->st_shndx
;
4899 aux
->table
[i
].start
.offset
+= rp
->r_addend
+ sym
->st_value
;
4902 aux
->table
[i
].end
.section
= sym
->st_shndx
;
4903 aux
->table
[i
].end
.offset
+= rp
->r_addend
+ sym
->st_value
;
4906 aux
->table
[i
].info
.section
= sym
->st_shndx
;
4907 aux
->table
[i
].info
.offset
+= rp
->r_addend
+ sym
->st_value
;
4917 aux
->table_len
= size
/ (3 * eh_addr_size
);
4922 ia64_process_unwind (FILE *file
)
4924 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
4925 unsigned long i
, unwcount
= 0, unwstart
= 0;
4926 struct ia64_unw_aux_info aux
;
4928 memset (& aux
, 0, sizeof (aux
));
4930 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
4932 if (sec
->sh_type
== SHT_SYMTAB
4933 && SECTION_HEADER_INDEX (sec
->sh_link
) < elf_header
.e_shnum
)
4935 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
4936 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
4938 strsec
= SECTION_HEADER (sec
->sh_link
);
4939 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4940 1, strsec
->sh_size
, _("string table"));
4941 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
4943 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4948 printf (_("\nThere are no unwind sections in this file.\n"));
4950 while (unwcount
-- > 0)
4955 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
4956 i
< elf_header
.e_shnum
; ++i
, ++sec
)
4957 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4964 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
4966 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
4968 /* We need to find which section group it is in. */
4969 struct group_list
*g
= section_headers_groups
[i
]->root
;
4971 for (; g
!= NULL
; g
= g
->next
)
4973 sec
= SECTION_HEADER (g
->section_index
);
4975 if (streq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
))
4980 i
= elf_header
.e_shnum
;
4982 else if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
, len
))
4984 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
4985 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
4986 suffix
= SECTION_NAME (unwsec
) + len
;
4987 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4989 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info_once
, len2
)
4990 && streq (SECTION_NAME (sec
) + len2
, suffix
))
4995 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4996 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
4997 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
4998 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
5000 if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
, len
))
5001 suffix
= SECTION_NAME (unwsec
) + len
;
5002 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
5004 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
, len2
)
5005 && streq (SECTION_NAME (sec
) + len2
, suffix
))
5009 if (i
== elf_header
.e_shnum
)
5011 printf (_("\nCould not find unwind info section for "));
5013 if (string_table
== NULL
)
5014 printf ("%d", unwsec
->sh_name
);
5016 printf (_("'%s'"), SECTION_NAME (unwsec
));
5020 aux
.info_size
= sec
->sh_size
;
5021 aux
.info_addr
= sec
->sh_addr
;
5022 aux
.info
= get_data (NULL
, file
, sec
->sh_offset
, 1, aux
.info_size
,
5025 printf (_("\nUnwind section "));
5027 if (string_table
== NULL
)
5028 printf ("%d", unwsec
->sh_name
);
5030 printf (_("'%s'"), SECTION_NAME (unwsec
));
5032 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5033 (unsigned long) unwsec
->sh_offset
,
5034 (unsigned long) (unwsec
->sh_size
/ (3 * eh_addr_size
)));
5036 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
5038 if (aux
.table_len
> 0)
5039 dump_ia64_unwind (& aux
);
5042 free ((char *) aux
.table
);
5044 free ((char *) aux
.info
);
5053 free ((char *) aux
.strtab
);
5058 struct hppa_unw_aux_info
5060 struct hppa_unw_table_entry
5062 struct absaddr start
;
5064 unsigned int Cannot_unwind
:1; /* 0 */
5065 unsigned int Millicode
:1; /* 1 */
5066 unsigned int Millicode_save_sr0
:1; /* 2 */
5067 unsigned int Region_description
:2; /* 3..4 */
5068 unsigned int reserved1
:1; /* 5 */
5069 unsigned int Entry_SR
:1; /* 6 */
5070 unsigned int Entry_FR
:4; /* number saved */ /* 7..10 */
5071 unsigned int Entry_GR
:5; /* number saved */ /* 11..15 */
5072 unsigned int Args_stored
:1; /* 16 */
5073 unsigned int Variable_Frame
:1; /* 17 */
5074 unsigned int Separate_Package_Body
:1; /* 18 */
5075 unsigned int Frame_Extension_Millicode
:1; /* 19 */
5076 unsigned int Stack_Overflow_Check
:1; /* 20 */
5077 unsigned int Two_Instruction_SP_Increment
:1; /* 21 */
5078 unsigned int Ada_Region
:1; /* 22 */
5079 unsigned int cxx_info
:1; /* 23 */
5080 unsigned int cxx_try_catch
:1; /* 24 */
5081 unsigned int sched_entry_seq
:1; /* 25 */
5082 unsigned int reserved2
:1; /* 26 */
5083 unsigned int Save_SP
:1; /* 27 */
5084 unsigned int Save_RP
:1; /* 28 */
5085 unsigned int Save_MRP_in_frame
:1; /* 29 */
5086 unsigned int extn_ptr_defined
:1; /* 30 */
5087 unsigned int Cleanup_defined
:1; /* 31 */
5089 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
5090 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
5091 unsigned int Large_frame
:1; /* 2 */
5092 unsigned int Pseudo_SP_Set
:1; /* 3 */
5093 unsigned int reserved4
:1; /* 4 */
5094 unsigned int Total_frame_size
:27; /* 5..31 */
5096 *table
; /* Unwind table. */
5097 unsigned long table_len
; /* Length of unwind table. */
5098 bfd_vma seg_base
; /* Starting address of segment. */
5099 Elf_Internal_Sym
*symtab
; /* The symbol table. */
5100 unsigned long nsyms
; /* Number of symbols. */
5101 char *strtab
; /* The string table. */
5102 unsigned long strtab_size
; /* Size of string table. */
5106 dump_hppa_unwind (struct hppa_unw_aux_info
*aux
)
5108 struct hppa_unw_table_entry
*tp
;
5110 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
5113 const char *procname
;
5115 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
5116 aux
->strtab_size
, tp
->start
, &procname
,
5119 fputs ("\n<", stdout
);
5123 fputs (procname
, stdout
);
5126 printf ("+%lx", (unsigned long) offset
);
5129 fputs (">: [", stdout
);
5130 print_vma (tp
->start
.offset
, PREFIX_HEX
);
5131 fputc ('-', stdout
);
5132 print_vma (tp
->end
.offset
, PREFIX_HEX
);
5135 #define PF(_m) if (tp->_m) printf (#_m " ");
5136 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5139 PF(Millicode_save_sr0
);
5140 /* PV(Region_description); */
5146 PF(Separate_Package_Body
);
5147 PF(Frame_Extension_Millicode
);
5148 PF(Stack_Overflow_Check
);
5149 PF(Two_Instruction_SP_Increment
);
5153 PF(sched_entry_seq
);
5156 PF(Save_MRP_in_frame
);
5157 PF(extn_ptr_defined
);
5158 PF(Cleanup_defined
);
5159 PF(MPE_XL_interrupt_marker
);
5160 PF(HP_UX_interrupt_marker
);
5163 PV(Total_frame_size
);
5172 slurp_hppa_unwind_table (FILE *file
,
5173 struct hppa_unw_aux_info
*aux
,
5174 Elf_Internal_Shdr
*sec
)
5176 unsigned long size
, unw_ent_size
, nentries
, nrelas
, i
;
5177 Elf_Internal_Phdr
*seg
;
5178 struct hppa_unw_table_entry
*tep
;
5179 Elf_Internal_Shdr
*relsec
;
5180 Elf_Internal_Rela
*rela
, *rp
;
5181 unsigned char *table
, *tp
;
5182 Elf_Internal_Sym
*sym
;
5183 const char *relname
;
5185 /* First, find the starting address of the segment that includes
5188 if (elf_header
.e_phnum
)
5190 if (! get_program_headers (file
))
5193 for (seg
= program_headers
;
5194 seg
< program_headers
+ elf_header
.e_phnum
;
5197 if (seg
->p_type
!= PT_LOAD
)
5200 if (sec
->sh_addr
>= seg
->p_vaddr
5201 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5203 aux
->seg_base
= seg
->p_vaddr
;
5209 /* Second, build the unwind table from the contents of the unwind
5211 size
= sec
->sh_size
;
5212 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
5217 nentries
= size
/ unw_ent_size
;
5218 size
= unw_ent_size
* nentries
;
5220 tep
= aux
->table
= xcmalloc (nentries
, sizeof (aux
->table
[0]));
5222 for (tp
= table
; tp
< table
+ size
; tp
+= unw_ent_size
, ++tep
)
5224 unsigned int tmp1
, tmp2
;
5226 tep
->start
.section
= SHN_UNDEF
;
5227 tep
->end
.section
= SHN_UNDEF
;
5229 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
5230 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
5231 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
5232 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
5234 tep
->start
.offset
+= aux
->seg_base
;
5235 tep
->end
.offset
+= aux
->seg_base
;
5237 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
5238 tep
->Millicode
= (tmp1
>> 30) & 0x1;
5239 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
5240 tep
->Region_description
= (tmp1
>> 27) & 0x3;
5241 tep
->reserved1
= (tmp1
>> 26) & 0x1;
5242 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
5243 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
5244 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
5245 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
5246 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
5247 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
5248 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
5249 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
5250 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
5251 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
5252 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
5253 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
5254 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
5255 tep
->reserved2
= (tmp1
>> 5) & 0x1;
5256 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
5257 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
5258 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
5259 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
5260 tep
->Cleanup_defined
= tmp1
& 0x1;
5262 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
5263 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
5264 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
5265 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
5266 tep
->reserved4
= (tmp2
>> 27) & 0x1;
5267 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
5271 /* Third, apply any relocations to the unwind table. */
5273 for (relsec
= section_headers
;
5274 relsec
< section_headers
+ elf_header
.e_shnum
;
5277 if (relsec
->sh_type
!= SHT_RELA
5278 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
5279 || SECTION_HEADER (relsec
->sh_info
) != sec
)
5282 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5286 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5290 relname
= elf_hppa_reloc_type (ELF32_R_TYPE (rp
->r_info
));
5291 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
5295 relname
= elf_hppa_reloc_type (ELF64_R_TYPE (rp
->r_info
));
5296 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
5299 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
5300 if (strncmp (relname
, "R_PARISC_SEGREL", 15) != 0)
5302 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5306 i
= rp
->r_offset
/ unw_ent_size
;
5308 switch ((rp
->r_offset
% unw_ent_size
) / eh_addr_size
)
5311 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5312 aux
->table
[i
].start
.offset
+= sym
->st_value
+ rp
->r_addend
;
5315 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5316 aux
->table
[i
].end
.offset
+= sym
->st_value
+ rp
->r_addend
;
5326 aux
->table_len
= nentries
;
5332 hppa_process_unwind (FILE *file
)
5334 struct hppa_unw_aux_info aux
;
5335 Elf_Internal_Shdr
*unwsec
= NULL
;
5336 Elf_Internal_Shdr
*strsec
;
5337 Elf_Internal_Shdr
*sec
;
5340 memset (& aux
, 0, sizeof (aux
));
5342 if (string_table
== NULL
)
5345 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5347 if (sec
->sh_type
== SHT_SYMTAB
5348 && SECTION_HEADER_INDEX (sec
->sh_link
) < elf_header
.e_shnum
)
5350 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5351 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5353 strsec
= SECTION_HEADER (sec
->sh_link
);
5354 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
5355 1, strsec
->sh_size
, _("string table"));
5356 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5358 else if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5363 printf (_("\nThere are no unwind sections in this file.\n"));
5365 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5367 if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5369 printf (_("\nUnwind section "));
5370 printf (_("'%s'"), SECTION_NAME (sec
));
5372 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5373 (unsigned long) sec
->sh_offset
,
5374 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
+ 8)));
5376 slurp_hppa_unwind_table (file
, &aux
, sec
);
5377 if (aux
.table_len
> 0)
5378 dump_hppa_unwind (&aux
);
5381 free ((char *) aux
.table
);
5389 free ((char *) aux
.strtab
);
5395 process_unwind (FILE *file
)
5397 struct unwind_handler
{
5399 int (*handler
)(FILE *file
);
5401 { EM_IA_64
, ia64_process_unwind
},
5402 { EM_PARISC
, hppa_process_unwind
},
5410 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
5411 if (elf_header
.e_machine
== handlers
[i
].machtype
)
5412 return handlers
[i
].handler (file
);
5414 printf (_("\nThere are no unwind sections in this file.\n"));
5419 dynamic_section_mips_val (Elf_Internal_Dyn
*entry
)
5421 switch (entry
->d_tag
)
5424 if (entry
->d_un
.d_val
== 0)
5428 static const char * opts
[] =
5430 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5431 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5432 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5433 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5438 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++cnt
)
5439 if (entry
->d_un
.d_val
& (1 << cnt
))
5441 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
5448 case DT_MIPS_IVERSION
:
5449 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5450 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5452 printf ("<corrupt: %ld>\n", (long) entry
->d_un
.d_ptr
);
5455 case DT_MIPS_TIME_STAMP
:
5460 time_t time
= entry
->d_un
.d_val
;
5461 tmp
= gmtime (&time
);
5462 snprintf (timebuf
, sizeof (timebuf
), "%04u-%02u-%02uT%02u:%02u:%02u",
5463 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5464 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5465 printf ("Time Stamp: %s\n", timebuf
);
5469 case DT_MIPS_RLD_VERSION
:
5470 case DT_MIPS_LOCAL_GOTNO
:
5471 case DT_MIPS_CONFLICTNO
:
5472 case DT_MIPS_LIBLISTNO
:
5473 case DT_MIPS_SYMTABNO
:
5474 case DT_MIPS_UNREFEXTNO
:
5475 case DT_MIPS_HIPAGENO
:
5476 case DT_MIPS_DELTA_CLASS_NO
:
5477 case DT_MIPS_DELTA_INSTANCE_NO
:
5478 case DT_MIPS_DELTA_RELOC_NO
:
5479 case DT_MIPS_DELTA_SYM_NO
:
5480 case DT_MIPS_DELTA_CLASSSYM_NO
:
5481 case DT_MIPS_COMPACT_SIZE
:
5482 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
5486 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
5492 dynamic_section_parisc_val (Elf_Internal_Dyn
*entry
)
5494 switch (entry
->d_tag
)
5496 case DT_HP_DLD_FLAGS
:
5505 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
5506 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
5507 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
5508 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
5509 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
5510 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
5511 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
5512 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
5513 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
5514 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
5515 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" },
5516 { DT_HP_GST
, "HP_GST" },
5517 { DT_HP_SHLIB_FIXED
, "HP_SHLIB_FIXED" },
5518 { DT_HP_MERGE_SHLIB_SEG
, "HP_MERGE_SHLIB_SEG" },
5519 { DT_HP_NODELETE
, "HP_NODELETE" },
5520 { DT_HP_GROUP
, "HP_GROUP" },
5521 { DT_HP_PROTECT_LINKAGE_TABLE
, "HP_PROTECT_LINKAGE_TABLE" }
5525 bfd_vma val
= entry
->d_un
.d_val
;
5527 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
5528 if (val
& flags
[cnt
].bit
)
5532 fputs (flags
[cnt
].str
, stdout
);
5534 val
^= flags
[cnt
].bit
;
5537 if (val
!= 0 || first
)
5541 print_vma (val
, HEX
);
5547 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5554 dynamic_section_ia64_val (Elf_Internal_Dyn
*entry
)
5556 switch (entry
->d_tag
)
5558 case DT_IA_64_PLT_RESERVE
:
5559 /* First 3 slots reserved. */
5560 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5562 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
5566 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5573 get_32bit_dynamic_section (FILE *file
)
5575 Elf32_External_Dyn
*edyn
, *ext
;
5576 Elf_Internal_Dyn
*entry
;
5578 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5579 _("dynamic section"));
5583 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5584 might not have the luxury of section headers. Look for the DT_NULL
5585 terminator to determine the number of entries. */
5586 for (ext
= edyn
, dynamic_nent
= 0;
5587 (char *) ext
< (char *) edyn
+ dynamic_size
;
5591 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5595 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5596 if (dynamic_section
== NULL
)
5598 error (_("Out of memory\n"));
5603 for (ext
= edyn
, entry
= dynamic_section
;
5604 entry
< dynamic_section
+ dynamic_nent
;
5607 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5608 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5617 get_64bit_dynamic_section (FILE *file
)
5619 Elf64_External_Dyn
*edyn
, *ext
;
5620 Elf_Internal_Dyn
*entry
;
5622 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5623 _("dynamic section"));
5627 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5628 might not have the luxury of section headers. Look for the DT_NULL
5629 terminator to determine the number of entries. */
5630 for (ext
= edyn
, dynamic_nent
= 0;
5631 (char *) ext
< (char *) edyn
+ dynamic_size
;
5635 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5639 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5640 if (dynamic_section
== NULL
)
5642 error (_("Out of memory\n"));
5647 for (ext
= edyn
, entry
= dynamic_section
;
5648 entry
< dynamic_section
+ dynamic_nent
;
5651 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5652 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5661 print_dynamic_flags (bfd_vma flags
)
5669 flag
= flags
& - flags
;
5679 case DF_ORIGIN
: fputs ("ORIGIN", stdout
); break;
5680 case DF_SYMBOLIC
: fputs ("SYMBOLIC", stdout
); break;
5681 case DF_TEXTREL
: fputs ("TEXTREL", stdout
); break;
5682 case DF_BIND_NOW
: fputs ("BIND_NOW", stdout
); break;
5683 case DF_STATIC_TLS
: fputs ("STATIC_TLS", stdout
); break;
5684 default: fputs ("unknown", stdout
); break;
5690 /* Parse and display the contents of the dynamic section. */
5693 process_dynamic_section (FILE *file
)
5695 Elf_Internal_Dyn
*entry
;
5697 if (dynamic_size
== 0)
5700 printf (_("\nThere is no dynamic section in this file.\n"));
5707 if (! get_32bit_dynamic_section (file
))
5710 else if (! get_64bit_dynamic_section (file
))
5713 /* Find the appropriate symbol table. */
5714 if (dynamic_symbols
== NULL
)
5716 for (entry
= dynamic_section
;
5717 entry
< dynamic_section
+ dynamic_nent
;
5720 Elf_Internal_Shdr section
;
5722 if (entry
->d_tag
!= DT_SYMTAB
)
5725 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
5727 /* Since we do not know how big the symbol table is,
5728 we default to reading in the entire file (!) and
5729 processing that. This is overkill, I know, but it
5731 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5733 if (archive_file_offset
!= 0)
5734 section
.sh_size
= archive_file_size
- section
.sh_offset
;
5737 if (fseek (file
, 0, SEEK_END
))
5738 error (_("Unable to seek to end of file!"));
5740 section
.sh_size
= ftell (file
) - section
.sh_offset
;
5744 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
5746 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
5748 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
5749 if (num_dynamic_syms
< 1)
5751 error (_("Unable to determine the number of symbols to load\n"));
5755 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
5759 /* Similarly find a string table. */
5760 if (dynamic_strings
== NULL
)
5762 for (entry
= dynamic_section
;
5763 entry
< dynamic_section
+ dynamic_nent
;
5766 unsigned long offset
;
5769 if (entry
->d_tag
!= DT_STRTAB
)
5772 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
5774 /* Since we do not know how big the string table is,
5775 we default to reading in the entire file (!) and
5776 processing that. This is overkill, I know, but it
5779 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5781 if (archive_file_offset
!= 0)
5782 str_tab_len
= archive_file_size
- offset
;
5785 if (fseek (file
, 0, SEEK_END
))
5786 error (_("Unable to seek to end of file\n"));
5787 str_tab_len
= ftell (file
) - offset
;
5790 if (str_tab_len
< 1)
5793 (_("Unable to determine the length of the dynamic string table\n"));
5797 dynamic_strings
= get_data (NULL
, file
, offset
, 1, str_tab_len
,
5798 _("dynamic string table"));
5799 dynamic_strings_length
= str_tab_len
;
5804 /* And find the syminfo section if available. */
5805 if (dynamic_syminfo
== NULL
)
5807 unsigned long syminsz
= 0;
5809 for (entry
= dynamic_section
;
5810 entry
< dynamic_section
+ dynamic_nent
;
5813 if (entry
->d_tag
== DT_SYMINENT
)
5815 /* Note: these braces are necessary to avoid a syntax
5816 error from the SunOS4 C compiler. */
5817 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
5819 else if (entry
->d_tag
== DT_SYMINSZ
)
5820 syminsz
= entry
->d_un
.d_val
;
5821 else if (entry
->d_tag
== DT_SYMINFO
)
5822 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
5826 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
5828 Elf_External_Syminfo
*extsyminfo
, *extsym
;
5829 Elf_Internal_Syminfo
*syminfo
;
5831 /* There is a syminfo section. Read the data. */
5832 extsyminfo
= get_data (NULL
, file
, dynamic_syminfo_offset
, 1,
5833 syminsz
, _("symbol information"));
5837 dynamic_syminfo
= malloc (syminsz
);
5838 if (dynamic_syminfo
== NULL
)
5840 error (_("Out of memory\n"));
5844 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
5845 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
5846 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
5847 ++syminfo
, ++extsym
)
5849 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
5850 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
5857 if (do_dynamic
&& dynamic_addr
)
5858 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
5859 dynamic_addr
, dynamic_nent
);
5861 printf (_(" Tag Type Name/Value\n"));
5863 for (entry
= dynamic_section
;
5864 entry
< dynamic_section
+ dynamic_nent
;
5872 print_vma (entry
->d_tag
, FULL_HEX
);
5873 dtype
= get_dynamic_type (entry
->d_tag
);
5874 printf (" (%s)%*s", dtype
,
5875 ((is_32bit_elf
? 27 : 19)
5876 - (int) strlen (dtype
)),
5880 switch (entry
->d_tag
)
5884 print_dynamic_flags (entry
->d_un
.d_val
);
5894 switch (entry
->d_tag
)
5897 printf (_("Auxiliary library"));
5901 printf (_("Filter library"));
5905 printf (_("Configuration file"));
5909 printf (_("Dependency audit library"));
5913 printf (_("Audit library"));
5917 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5918 printf (": [%s]\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5922 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5931 printf (_("Flags:"));
5933 if (entry
->d_un
.d_val
== 0)
5934 printf (_(" None\n"));
5937 unsigned long int val
= entry
->d_un
.d_val
;
5939 if (val
& DTF_1_PARINIT
)
5941 printf (" PARINIT");
5942 val
^= DTF_1_PARINIT
;
5944 if (val
& DTF_1_CONFEXP
)
5946 printf (" CONFEXP");
5947 val
^= DTF_1_CONFEXP
;
5950 printf (" %lx", val
);
5959 printf (_("Flags:"));
5961 if (entry
->d_un
.d_val
== 0)
5962 printf (_(" None\n"));
5965 unsigned long int val
= entry
->d_un
.d_val
;
5967 if (val
& DF_P1_LAZYLOAD
)
5969 printf (" LAZYLOAD");
5970 val
^= DF_P1_LAZYLOAD
;
5972 if (val
& DF_P1_GROUPPERM
)
5974 printf (" GROUPPERM");
5975 val
^= DF_P1_GROUPPERM
;
5978 printf (" %lx", val
);
5987 printf (_("Flags:"));
5988 if (entry
->d_un
.d_val
== 0)
5989 printf (_(" None\n"));
5992 unsigned long int val
= entry
->d_un
.d_val
;
5999 if (val
& DF_1_GLOBAL
)
6004 if (val
& DF_1_GROUP
)
6009 if (val
& DF_1_NODELETE
)
6011 printf (" NODELETE");
6012 val
^= DF_1_NODELETE
;
6014 if (val
& DF_1_LOADFLTR
)
6016 printf (" LOADFLTR");
6017 val
^= DF_1_LOADFLTR
;
6019 if (val
& DF_1_INITFIRST
)
6021 printf (" INITFIRST");
6022 val
^= DF_1_INITFIRST
;
6024 if (val
& DF_1_NOOPEN
)
6029 if (val
& DF_1_ORIGIN
)
6034 if (val
& DF_1_DIRECT
)
6039 if (val
& DF_1_TRANS
)
6044 if (val
& DF_1_INTERPOSE
)
6046 printf (" INTERPOSE");
6047 val
^= DF_1_INTERPOSE
;
6049 if (val
& DF_1_NODEFLIB
)
6051 printf (" NODEFLIB");
6052 val
^= DF_1_NODEFLIB
;
6054 if (val
& DF_1_NODUMP
)
6059 if (val
& DF_1_CONLFAT
)
6061 printf (" CONLFAT");
6062 val
^= DF_1_CONLFAT
;
6065 printf (" %lx", val
);
6072 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6074 puts (get_dynamic_type (entry
->d_un
.d_val
));
6094 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6100 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6101 name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6107 switch (entry
->d_tag
)
6110 printf (_("Shared library: [%s]"), name
);
6112 if (streq (name
, program_interpreter
))
6113 printf (_(" program interpreter"));
6117 printf (_("Library soname: [%s]"), name
);
6121 printf (_("Library rpath: [%s]"), name
);
6125 printf (_("Library runpath: [%s]"), name
);
6129 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6134 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6147 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6151 case DT_INIT_ARRAYSZ
:
6152 case DT_FINI_ARRAYSZ
:
6153 case DT_GNU_CONFLICTSZ
:
6154 case DT_GNU_LIBLISTSZ
:
6157 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6158 printf (" (bytes)\n");
6168 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6181 if (entry
->d_tag
== DT_USED
6182 && VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6184 char *name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6188 printf (_("Not needed object: [%s]\n"), name
);
6193 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6199 /* The value of this entry is ignored. */
6204 case DT_GNU_PRELINKED
:
6208 time_t time
= entry
->d_un
.d_val
;
6210 tmp
= gmtime (&time
);
6211 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
6212 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
6213 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
6219 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
6220 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
6225 switch (elf_header
.e_machine
)
6228 case EM_MIPS_RS3_LE
:
6229 dynamic_section_mips_val (entry
);
6232 dynamic_section_parisc_val (entry
);
6235 dynamic_section_ia64_val (entry
);
6238 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6250 get_ver_flags (unsigned int flags
)
6252 static char buff
[32];
6259 if (flags
& VER_FLG_BASE
)
6260 strcat (buff
, "BASE ");
6262 if (flags
& VER_FLG_WEAK
)
6264 if (flags
& VER_FLG_BASE
)
6265 strcat (buff
, "| ");
6267 strcat (buff
, "WEAK ");
6270 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
6271 strcat (buff
, "| <unknown>");
6276 /* Display the contents of the version sections. */
6278 process_version_sections (FILE *file
)
6280 Elf_Internal_Shdr
*section
;
6287 for (i
= 0, section
= section_headers
;
6288 i
< elf_header
.e_shnum
;
6291 switch (section
->sh_type
)
6293 case SHT_GNU_verdef
:
6295 Elf_External_Verdef
*edefs
;
6302 (_("\nVersion definition section '%s' contains %ld entries:\n"),
6303 SECTION_NAME (section
), section
->sh_info
);
6305 printf (_(" Addr: 0x"));
6306 printf_vma (section
->sh_addr
);
6307 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6308 (unsigned long) section
->sh_offset
, section
->sh_link
,
6309 SECTION_HEADER_INDEX (section
->sh_link
)
6310 < elf_header
.e_shnum
6311 ? SECTION_NAME (SECTION_HEADER (section
->sh_link
))
6314 edefs
= get_data (NULL
, file
, section
->sh_offset
, 1,
6316 _("version definition section"));
6320 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6323 Elf_External_Verdef
*edef
;
6324 Elf_Internal_Verdef ent
;
6325 Elf_External_Verdaux
*eaux
;
6326 Elf_Internal_Verdaux aux
;
6330 vstart
= ((char *) edefs
) + idx
;
6332 edef
= (Elf_External_Verdef
*) vstart
;
6334 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
6335 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
6336 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
6337 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
6338 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
6339 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
6340 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
6342 printf (_(" %#06x: Rev: %d Flags: %s"),
6343 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
6345 printf (_(" Index: %d Cnt: %d "),
6346 ent
.vd_ndx
, ent
.vd_cnt
);
6348 vstart
+= ent
.vd_aux
;
6350 eaux
= (Elf_External_Verdaux
*) vstart
;
6352 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6353 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6355 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6356 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux
.vda_name
));
6358 printf (_("Name index: %ld\n"), aux
.vda_name
);
6360 isum
= idx
+ ent
.vd_aux
;
6362 for (j
= 1; j
< ent
.vd_cnt
; j
++)
6364 isum
+= aux
.vda_next
;
6365 vstart
+= aux
.vda_next
;
6367 eaux
= (Elf_External_Verdaux
*) vstart
;
6369 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6370 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6372 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6373 printf (_(" %#06x: Parent %d: %s\n"),
6374 isum
, j
, GET_DYNAMIC_NAME (aux
.vda_name
));
6376 printf (_(" %#06x: Parent %d, name index: %ld\n"),
6377 isum
, j
, aux
.vda_name
);
6387 case SHT_GNU_verneed
:
6389 Elf_External_Verneed
*eneed
;
6395 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
6396 SECTION_NAME (section
), section
->sh_info
);
6398 printf (_(" Addr: 0x"));
6399 printf_vma (section
->sh_addr
);
6400 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
6401 (unsigned long) section
->sh_offset
, section
->sh_link
,
6402 SECTION_HEADER_INDEX (section
->sh_link
)
6403 < elf_header
.e_shnum
6404 ? SECTION_NAME (SECTION_HEADER (section
->sh_link
))
6407 eneed
= get_data (NULL
, file
, section
->sh_offset
, 1,
6409 _("version need section"));
6413 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6415 Elf_External_Verneed
*entry
;
6416 Elf_Internal_Verneed ent
;
6421 vstart
= ((char *) eneed
) + idx
;
6423 entry
= (Elf_External_Verneed
*) vstart
;
6425 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
6426 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
6427 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
6428 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
6429 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
6431 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
6433 if (VALID_DYNAMIC_NAME (ent
.vn_file
))
6434 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent
.vn_file
));
6436 printf (_(" File: %lx"), ent
.vn_file
);
6438 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
6440 vstart
+= ent
.vn_aux
;
6442 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
6444 Elf_External_Vernaux
*eaux
;
6445 Elf_Internal_Vernaux aux
;
6447 eaux
= (Elf_External_Vernaux
*) vstart
;
6449 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
6450 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
6451 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
6452 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
6453 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
6455 if (VALID_DYNAMIC_NAME (aux
.vna_name
))
6456 printf (_(" %#06x: Name: %s"),
6457 isum
, GET_DYNAMIC_NAME (aux
.vna_name
));
6459 printf (_(" %#06x: Name index: %lx"),
6460 isum
, aux
.vna_name
);
6462 printf (_(" Flags: %s Version: %d\n"),
6463 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
6465 isum
+= aux
.vna_next
;
6466 vstart
+= aux
.vna_next
;
6476 case SHT_GNU_versym
:
6478 Elf_Internal_Shdr
*link_section
;
6481 unsigned char *edata
;
6482 unsigned short *data
;
6484 Elf_Internal_Sym
*symbols
;
6485 Elf_Internal_Shdr
*string_sec
;
6488 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
)
6491 link_section
= SECTION_HEADER (section
->sh_link
);
6492 total
= section
->sh_size
/ sizeof (Elf_External_Versym
);
6494 if (SECTION_HEADER_INDEX (link_section
->sh_link
)
6495 >= elf_header
.e_shnum
)
6500 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
6502 string_sec
= SECTION_HEADER (link_section
->sh_link
);
6504 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
6505 string_sec
->sh_size
, _("version string table"));
6509 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6510 SECTION_NAME (section
), total
);
6512 printf (_(" Addr: "));
6513 printf_vma (section
->sh_addr
);
6514 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6515 (unsigned long) section
->sh_offset
, section
->sh_link
,
6516 SECTION_NAME (link_section
));
6518 off
= offset_from_vma (file
,
6519 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6520 total
* sizeof (short));
6521 edata
= get_data (NULL
, file
, off
, total
, sizeof (short),
6522 _("version symbol data"));
6529 data
= cmalloc (total
, sizeof (short));
6531 for (cnt
= total
; cnt
--;)
6532 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
6537 for (cnt
= 0; cnt
< total
; cnt
+= 4)
6540 int check_def
, check_need
;
6543 printf (" %03x:", cnt
);
6545 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
6546 switch (data
[cnt
+ j
])
6549 fputs (_(" 0 (*local*) "), stdout
);
6553 fputs (_(" 1 (*global*) "), stdout
);
6557 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
6558 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
6562 if (SECTION_HEADER_INDEX (symbols
[cnt
+ j
].st_shndx
)
6563 >= elf_header
.e_shnum
6564 || SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
6567 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
6574 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
6576 Elf_Internal_Verneed ivn
;
6577 unsigned long offset
;
6579 offset
= offset_from_vma
6580 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6581 sizeof (Elf_External_Verneed
));
6585 Elf_Internal_Vernaux ivna
;
6586 Elf_External_Verneed evn
;
6587 Elf_External_Vernaux evna
;
6588 unsigned long a_off
;
6590 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
6593 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6594 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6596 a_off
= offset
+ ivn
.vn_aux
;
6600 get_data (&evna
, file
, a_off
, sizeof (evna
),
6601 1, _("version need aux (2)"));
6603 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6604 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6606 a_off
+= ivna
.vna_next
;
6608 while (ivna
.vna_other
!= data
[cnt
+ j
]
6609 && ivna
.vna_next
!= 0);
6611 if (ivna
.vna_other
== data
[cnt
+ j
])
6613 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6615 name
= strtab
+ ivna
.vna_name
;
6616 nn
+= printf ("(%s%-*s",
6618 12 - (int) strlen (name
),
6624 offset
+= ivn
.vn_next
;
6626 while (ivn
.vn_next
);
6629 if (check_def
&& data
[cnt
+ j
] != 0x8001
6630 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6632 Elf_Internal_Verdef ivd
;
6633 Elf_External_Verdef evd
;
6634 unsigned long offset
;
6636 offset
= offset_from_vma
6637 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6642 get_data (&evd
, file
, offset
, sizeof (evd
), 1,
6645 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6646 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6648 offset
+= ivd
.vd_next
;
6650 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
6651 && ivd
.vd_next
!= 0);
6653 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
6655 Elf_External_Verdaux evda
;
6656 Elf_Internal_Verdaux ivda
;
6658 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6660 get_data (&evda
, file
,
6661 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
6663 _("version def aux"));
6665 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6667 name
= strtab
+ ivda
.vda_name
;
6668 nn
+= printf ("(%s%-*s",
6670 12 - (int) strlen (name
),
6676 printf ("%*c", 18 - nn
, ' ');
6694 printf (_("\nNo version information found in this file.\n"));
6700 get_symbol_binding (unsigned int binding
)
6702 static char buff
[32];
6706 case STB_LOCAL
: return "LOCAL";
6707 case STB_GLOBAL
: return "GLOBAL";
6708 case STB_WEAK
: return "WEAK";
6710 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
6711 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"),
6713 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
6714 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), binding
);
6716 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), binding
);
6722 get_symbol_type (unsigned int type
)
6724 static char buff
[32];
6728 case STT_NOTYPE
: return "NOTYPE";
6729 case STT_OBJECT
: return "OBJECT";
6730 case STT_FUNC
: return "FUNC";
6731 case STT_SECTION
: return "SECTION";
6732 case STT_FILE
: return "FILE";
6733 case STT_COMMON
: return "COMMON";
6734 case STT_TLS
: return "TLS";
6736 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
6738 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
6739 return "THUMB_FUNC";
6741 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
6744 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
6745 return "PARISC_MILLI";
6747 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"), type
);
6749 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
6751 if (elf_header
.e_machine
== EM_PARISC
)
6753 if (type
== STT_HP_OPAQUE
)
6755 if (type
== STT_HP_STUB
)
6759 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), type
);
6762 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), type
);
6768 get_symbol_visibility (unsigned int visibility
)
6772 case STV_DEFAULT
: return "DEFAULT";
6773 case STV_INTERNAL
: return "INTERNAL";
6774 case STV_HIDDEN
: return "HIDDEN";
6775 case STV_PROTECTED
: return "PROTECTED";
6781 get_mips_symbol_other (unsigned int other
)
6785 case STO_OPTIONAL
: return "OPTIONAL";
6786 case STO_MIPS16
: return "MIPS16";
6787 default: return NULL
;
6792 get_symbol_other (unsigned int other
)
6794 const char * result
= NULL
;
6795 static char buff
[32];
6800 switch (elf_header
.e_machine
)
6803 result
= get_mips_symbol_other (other
);
6811 snprintf (buff
, sizeof buff
, _("<other>: %x"), other
);
6816 get_symbol_index_type (unsigned int type
)
6818 static char buff
[32];
6822 case SHN_UNDEF
: return "UND";
6823 case SHN_ABS
: return "ABS";
6824 case SHN_COMMON
: return "COM";
6826 if (type
== SHN_IA_64_ANSI_COMMON
6827 && elf_header
.e_machine
== EM_IA_64
6828 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
6830 else if (elf_header
.e_machine
== EM_X86_64
6831 && type
== SHN_X86_64_LCOMMON
)
6833 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
6834 sprintf (buff
, "PRC[0x%04x]", type
);
6835 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
6836 sprintf (buff
, "OS [0x%04x]", type
);
6837 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
6838 sprintf (buff
, "RSV[0x%04x]", type
);
6840 sprintf (buff
, "%3d", type
);
6848 get_dynamic_data (FILE *file
, unsigned int number
, unsigned int ent_size
)
6850 unsigned char *e_data
;
6853 e_data
= cmalloc (number
, ent_size
);
6857 error (_("Out of memory\n"));
6861 if (fread (e_data
, ent_size
, number
, file
) != number
)
6863 error (_("Unable to read in dynamic data\n"));
6867 i_data
= cmalloc (number
, sizeof (*i_data
));
6871 error (_("Out of memory\n"));
6877 i_data
[number
] = byte_get (e_data
+ number
* ent_size
, ent_size
);
6884 /* Dump the symbol table. */
6886 process_symbol_table (FILE *file
)
6888 Elf_Internal_Shdr
*section
;
6889 bfd_vma nbuckets
= 0;
6890 bfd_vma nchains
= 0;
6891 bfd_vma
*buckets
= NULL
;
6892 bfd_vma
*chains
= NULL
;
6894 if (! do_syms
&& !do_histogram
)
6897 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
6900 unsigned char nb
[8];
6901 unsigned char nc
[8];
6902 int hash_ent_size
= 4;
6904 if ((elf_header
.e_machine
== EM_ALPHA
6905 || elf_header
.e_machine
== EM_S390
6906 || elf_header
.e_machine
== EM_S390_OLD
)
6907 && elf_header
.e_ident
[EI_CLASS
] == ELFCLASS64
)
6911 (archive_file_offset
6912 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
6913 sizeof nb
+ sizeof nc
)),
6916 error (_("Unable to seek to start of dynamic information"));
6920 if (fread (nb
, hash_ent_size
, 1, file
) != 1)
6922 error (_("Failed to read in number of buckets\n"));
6926 if (fread (nc
, hash_ent_size
, 1, file
) != 1)
6928 error (_("Failed to read in number of chains\n"));
6932 nbuckets
= byte_get (nb
, hash_ent_size
);
6933 nchains
= byte_get (nc
, hash_ent_size
);
6935 buckets
= get_dynamic_data (file
, nbuckets
, hash_ent_size
);
6936 chains
= get_dynamic_data (file
, nchains
, hash_ent_size
);
6938 if (buckets
== NULL
|| chains
== NULL
)
6943 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
6948 printf (_("\nSymbol table for image:\n"));
6950 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6952 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6954 for (hn
= 0; hn
< nbuckets
; hn
++)
6959 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
6961 Elf_Internal_Sym
*psym
;
6964 psym
= dynamic_symbols
+ si
;
6966 n
= print_vma (si
, DEC_5
);
6968 fputs (" " + n
, stdout
);
6969 printf (" %3lu: ", hn
);
6970 print_vma (psym
->st_value
, LONG_HEX
);
6972 print_vma (psym
->st_size
, DEC_5
);
6974 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6975 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
6976 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6977 /* Check to see if any other bits in the st_other field are set.
6978 Note - displaying this information disrupts the layout of the
6979 table being generated, but for the moment this case is very rare. */
6980 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
6981 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
6982 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
6983 if (VALID_DYNAMIC_NAME (psym
->st_name
))
6984 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
6986 printf (" <corrupt: %14ld>", psym
->st_name
);
6991 else if (do_syms
&& !do_using_dynamic
)
6995 for (i
= 0, section
= section_headers
;
6996 i
< elf_header
.e_shnum
;
7000 char *strtab
= NULL
;
7001 unsigned long int strtab_size
= 0;
7002 Elf_Internal_Sym
*symtab
;
7003 Elf_Internal_Sym
*psym
;
7006 if ( section
->sh_type
!= SHT_SYMTAB
7007 && section
->sh_type
!= SHT_DYNSYM
)
7010 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
7011 SECTION_NAME (section
),
7012 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
7014 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7016 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7018 symtab
= GET_ELF_SYMBOLS (file
, section
);
7022 if (section
->sh_link
== elf_header
.e_shstrndx
)
7024 strtab
= string_table
;
7025 strtab_size
= string_table_length
;
7027 else if (SECTION_HEADER_INDEX (section
->sh_link
) < elf_header
.e_shnum
)
7029 Elf_Internal_Shdr
*string_sec
;
7031 string_sec
= SECTION_HEADER (section
->sh_link
);
7033 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
7034 1, string_sec
->sh_size
, _("string table"));
7035 strtab_size
= strtab
!= NULL
? string_sec
->sh_size
: 0;
7038 for (si
= 0, psym
= symtab
;
7039 si
< section
->sh_size
/ section
->sh_entsize
;
7042 printf ("%6d: ", si
);
7043 print_vma (psym
->st_value
, LONG_HEX
);
7045 print_vma (psym
->st_size
, DEC_5
);
7046 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
7047 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
7048 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
7049 /* Check to see if any other bits in the st_other field are set.
7050 Note - displaying this information disrupts the layout of the
7051 table being generated, but for the moment this case is very rare. */
7052 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
7053 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
7054 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
7055 print_symbol (25, psym
->st_name
< strtab_size
7056 ? strtab
+ psym
->st_name
: "<corrupt>");
7058 if (section
->sh_type
== SHT_DYNSYM
&&
7059 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
7061 unsigned char data
[2];
7062 unsigned short vers_data
;
7063 unsigned long offset
;
7067 offset
= offset_from_vma
7068 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
7069 sizeof data
+ si
* sizeof (vers_data
));
7071 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
7072 sizeof (data
), 1, _("version data"));
7074 vers_data
= byte_get (data
, 2);
7076 is_nobits
= (SECTION_HEADER_INDEX (psym
->st_shndx
)
7077 < elf_header
.e_shnum
7078 && SECTION_HEADER (psym
->st_shndx
)->sh_type
7081 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
7083 if ((vers_data
& 0x8000) || vers_data
> 1)
7085 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
7086 && (is_nobits
|| ! check_def
))
7088 Elf_External_Verneed evn
;
7089 Elf_Internal_Verneed ivn
;
7090 Elf_Internal_Vernaux ivna
;
7092 /* We must test both. */
7093 offset
= offset_from_vma
7094 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
7099 unsigned long vna_off
;
7101 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
7104 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
7105 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
7107 vna_off
= offset
+ ivn
.vn_aux
;
7111 Elf_External_Vernaux evna
;
7113 get_data (&evna
, file
, vna_off
,
7115 _("version need aux (3)"));
7117 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
7118 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
7119 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
7121 vna_off
+= ivna
.vna_next
;
7123 while (ivna
.vna_other
!= vers_data
7124 && ivna
.vna_next
!= 0);
7126 if (ivna
.vna_other
== vers_data
)
7129 offset
+= ivn
.vn_next
;
7131 while (ivn
.vn_next
!= 0);
7133 if (ivna
.vna_other
== vers_data
)
7136 ivna
.vna_name
< strtab_size
7137 ? strtab
+ ivna
.vna_name
: "<corrupt>",
7141 else if (! is_nobits
)
7142 error (_("bad dynamic symbol"));
7149 if (vers_data
!= 0x8001
7150 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
7152 Elf_Internal_Verdef ivd
;
7153 Elf_Internal_Verdaux ivda
;
7154 Elf_External_Verdaux evda
;
7155 unsigned long offset
;
7157 offset
= offset_from_vma
7159 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
7160 sizeof (Elf_External_Verdef
));
7164 Elf_External_Verdef evd
;
7166 get_data (&evd
, file
, offset
, sizeof (evd
),
7167 1, _("version def"));
7169 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
7170 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
7171 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
7173 offset
+= ivd
.vd_next
;
7175 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
7176 && ivd
.vd_next
!= 0);
7178 offset
-= ivd
.vd_next
;
7179 offset
+= ivd
.vd_aux
;
7181 get_data (&evda
, file
, offset
, sizeof (evda
),
7182 1, _("version def aux"));
7184 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
7186 if (psym
->st_name
!= ivda
.vda_name
)
7187 printf ((vers_data
& 0x8000)
7189 ivda
.vda_name
< strtab_size
7190 ? strtab
+ ivda
.vda_name
: "<corrupt>");
7200 if (strtab
!= string_table
)
7206 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
7208 if (do_histogram
&& buckets
!= NULL
)
7210 unsigned long *lengths
;
7211 unsigned long *counts
;
7214 unsigned long maxlength
= 0;
7215 unsigned long nzero_counts
= 0;
7216 unsigned long nsyms
= 0;
7218 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
7219 (unsigned long) nbuckets
);
7220 printf (_(" Length Number %% of total Coverage\n"));
7222 lengths
= calloc (nbuckets
, sizeof (*lengths
));
7223 if (lengths
== NULL
)
7225 error (_("Out of memory"));
7228 for (hn
= 0; hn
< nbuckets
; ++hn
)
7230 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
7233 if (maxlength
< ++lengths
[hn
])
7238 counts
= calloc (maxlength
+ 1, sizeof (*counts
));
7241 error (_("Out of memory"));
7245 for (hn
= 0; hn
< nbuckets
; ++hn
)
7246 ++counts
[lengths
[hn
]];
7251 printf (" 0 %-10lu (%5.1f%%)\n",
7252 counts
[0], (counts
[0] * 100.0) / nbuckets
);
7253 for (i
= 1; i
<= maxlength
; ++i
)
7255 nzero_counts
+= counts
[i
] * i
;
7256 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7257 i
, counts
[i
], (counts
[i
] * 100.0) / nbuckets
,
7258 (nzero_counts
* 100.0) / nsyms
);
7266 if (buckets
!= NULL
)
7276 process_syminfo (FILE *file ATTRIBUTE_UNUSED
)
7280 if (dynamic_syminfo
== NULL
7282 /* No syminfo, this is ok. */
7285 /* There better should be a dynamic symbol section. */
7286 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
7290 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
7291 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
7293 printf (_(" Num: Name BoundTo Flags\n"));
7294 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
7296 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
7298 printf ("%4d: ", i
);
7299 if (VALID_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
))
7300 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
));
7302 printf ("<corrupt: %19ld>", dynamic_symbols
[i
].st_name
);
7305 switch (dynamic_syminfo
[i
].si_boundto
)
7307 case SYMINFO_BT_SELF
:
7308 fputs ("SELF ", stdout
);
7310 case SYMINFO_BT_PARENT
:
7311 fputs ("PARENT ", stdout
);
7314 if (dynamic_syminfo
[i
].si_boundto
> 0
7315 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
7316 && VALID_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
7318 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
7322 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
7326 if (flags
& SYMINFO_FLG_DIRECT
)
7328 if (flags
& SYMINFO_FLG_PASSTHRU
)
7329 printf (" PASSTHRU");
7330 if (flags
& SYMINFO_FLG_COPY
)
7332 if (flags
& SYMINFO_FLG_LAZYLOAD
)
7333 printf (" LAZYLOAD");
7341 #ifdef SUPPORT_DISASSEMBLY
7343 disassemble_section (Elf_Internal_Shdr
*section
, FILE *file
)
7345 printf (_("\nAssembly dump of section %s\n"),
7346 SECTION_NAME (section
));
7348 /* XXX -- to be done --- XXX */
7355 dump_section (Elf_Internal_Shdr
*section
, FILE *file
)
7357 bfd_size_type bytes
;
7359 unsigned char *data
;
7360 unsigned char *start
;
7362 bytes
= section
->sh_size
;
7364 if (bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
7366 printf (_("\nSection '%s' has no data to dump.\n"),
7367 SECTION_NAME (section
));
7371 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
7373 addr
= section
->sh_addr
;
7375 start
= get_data (NULL
, file
, section
->sh_offset
, 1, bytes
,
7388 lbytes
= (bytes
> 16 ? 16 : bytes
);
7390 printf (" 0x%8.8lx ", (unsigned long) addr
);
7392 switch (elf_header
.e_ident
[EI_DATA
])
7396 for (j
= 15; j
>= 0; j
--)
7399 printf ("%2.2x", data
[j
]);
7409 for (j
= 0; j
< 16; j
++)
7412 printf ("%2.2x", data
[j
]);
7422 for (j
= 0; j
< lbytes
; j
++)
7425 if (k
>= ' ' && k
< 0x7f)
7443 /* Apply addends of RELA relocations. */
7446 debug_apply_rela_addends (void *file
,
7447 Elf_Internal_Shdr
*section
,
7448 unsigned char *start
)
7450 Elf_Internal_Shdr
*relsec
;
7451 unsigned char *end
= start
+ section
->sh_size
;
7452 /* FIXME: The relocation field size is relocation type dependent. */
7453 unsigned int reloc_size
= 4;
7455 if (!is_relocatable
)
7458 if (section
->sh_size
< reloc_size
)
7461 for (relsec
= section_headers
;
7462 relsec
< section_headers
+ elf_header
.e_shnum
;
7465 unsigned long nrelas
;
7466 Elf_Internal_Rela
*rela
, *rp
;
7467 Elf_Internal_Shdr
*symsec
;
7468 Elf_Internal_Sym
*symtab
;
7469 Elf_Internal_Sym
*sym
;
7471 if (relsec
->sh_type
!= SHT_RELA
7472 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
7473 || SECTION_HEADER (relsec
->sh_info
) != section
7474 || relsec
->sh_size
== 0
7475 || SECTION_HEADER_INDEX (relsec
->sh_link
) >= elf_header
.e_shnum
)
7478 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
7482 symsec
= SECTION_HEADER (relsec
->sh_link
);
7483 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
7485 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
7489 loc
= start
+ rp
->r_offset
;
7490 if ((loc
+ reloc_size
) > end
)
7492 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
7493 (unsigned long) rp
->r_offset
,
7494 SECTION_NAME (section
));
7500 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
7502 if (ELF32_R_SYM (rp
->r_info
) != 0
7503 && ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
7504 /* Relocations against object symbols can happen,
7505 eg when referencing a global array. For an
7506 example of this see the _clz.o binary in libgcc.a. */
7507 && ELF32_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
7509 warn (_("skipping unexpected symbol type %s in relocation in section .rela%s\n"),
7510 get_symbol_type (ELF32_ST_TYPE (sym
->st_info
)),
7511 SECTION_NAME (section
));
7517 /* In MIPS little-endian objects, r_info isn't really a
7518 64-bit little-endian value: it has a 32-bit little-endian
7519 symbol index followed by four individual byte fields.
7520 Reorder INFO accordingly. */
7521 if (elf_header
.e_machine
== EM_MIPS
7522 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
7523 rp
->r_info
= (((rp
->r_info
& 0xffffffff) << 32)
7524 | ((rp
->r_info
>> 56) & 0xff)
7525 | ((rp
->r_info
>> 40) & 0xff00)
7526 | ((rp
->r_info
>> 24) & 0xff0000)
7527 | ((rp
->r_info
>> 8) & 0xff000000));
7529 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
7531 if (ELF64_R_SYM (rp
->r_info
) != 0
7532 && ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
7533 && ELF64_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
7535 warn (_("skipping unexpected symbol type %s in relocation in section .rela.%s\n"),
7536 get_symbol_type (ELF64_ST_TYPE (sym
->st_info
)),
7537 SECTION_NAME (section
));
7542 byte_put (loc
, rp
->r_addend
, reloc_size
);
7553 load_debug_section (enum dwarf_section_display_enum debug
, void *file
)
7555 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
7556 Elf_Internal_Shdr
*sec
;
7559 /* If it is already loaded, do nothing. */
7560 if (section
->start
!= NULL
)
7563 /* Locate the debug section. */
7564 sec
= find_section (section
->name
);
7568 snprintf (buf
, sizeof (buf
), _("%s section data"), section
->name
);
7569 section
->address
= sec
->sh_addr
;
7570 section
->size
= sec
->sh_size
;
7571 section
->start
= get_data (NULL
, file
, sec
->sh_offset
, 1,
7574 if (debug_displays
[debug
].relocate
)
7575 debug_apply_rela_addends (file
, sec
, section
->start
);
7577 return section
->start
!= NULL
;
7581 free_debug_section (enum dwarf_section_display_enum debug
)
7583 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
7585 if (section
->start
== NULL
)
7588 free ((char *) section
->start
);
7589 section
->start
= NULL
;
7590 section
->address
= 0;
7595 display_debug_section (Elf_Internal_Shdr
*section
, FILE *file
)
7597 char *name
= SECTION_NAME (section
);
7598 bfd_size_type length
;
7600 enum dwarf_section_display_enum i
;
7602 length
= section
->sh_size
;
7605 printf (_("\nSection '%s' has no debugging data.\n"), name
);
7609 if (strneq (name
, ".gnu.linkonce.wi.", 17))
7610 name
= ".debug_info";
7612 /* See if we know how to display the contents of this section. */
7613 for (i
= 0; i
< max
; i
++)
7614 if (streq (debug_displays
[i
].section
.name
, name
))
7616 struct dwarf_section
*sec
= &debug_displays
[i
].section
;
7618 if (load_debug_section (i
, file
))
7620 result
&= debug_displays
[i
].display (sec
, file
);
7622 if (i
!= info
&& i
!= abbrev
)
7623 free_debug_section (i
);
7631 printf (_("Unrecognized debug section: %s\n"), name
);
7638 /* Set DUMP_SECTS for all sections where dumps were requested
7639 based on section name. */
7642 initialise_dumps_byname (void)
7644 struct dump_list_entry
*cur
;
7646 for (cur
= dump_sects_byname
; cur
; cur
= cur
->next
)
7651 for (i
= 0, any
= 0; i
< elf_header
.e_shnum
; i
++)
7652 if (streq (SECTION_NAME (section_headers
+ i
), cur
->name
))
7654 request_dump (i
, cur
->type
);
7659 warn (_("Section '%s' was not dumped because it does not exist!\n"),
7665 process_section_contents (FILE *file
)
7667 Elf_Internal_Shdr
*section
;
7673 initialise_dumps_byname ();
7675 for (i
= 0, section
= section_headers
;
7676 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
7679 #ifdef SUPPORT_DISASSEMBLY
7680 if (dump_sects
[i
] & DISASS_DUMP
)
7681 disassemble_section (section
, file
);
7683 if (dump_sects
[i
] & HEX_DUMP
)
7684 dump_section (section
, file
);
7686 if (dump_sects
[i
] & DEBUG_DUMP
)
7687 display_debug_section (section
, file
);
7690 /* Check to see if the user requested a
7691 dump of a section that does not exist. */
7692 while (i
++ < num_dump_sects
)
7694 warn (_("Section %d was not dumped because it does not exist!\n"), i
);
7698 process_mips_fpe_exception (int mask
)
7703 if (mask
& OEX_FPU_INEX
)
7704 fputs ("INEX", stdout
), first
= 0;
7705 if (mask
& OEX_FPU_UFLO
)
7706 printf ("%sUFLO", first
? "" : "|"), first
= 0;
7707 if (mask
& OEX_FPU_OFLO
)
7708 printf ("%sOFLO", first
? "" : "|"), first
= 0;
7709 if (mask
& OEX_FPU_DIV0
)
7710 printf ("%sDIV0", first
? "" : "|"), first
= 0;
7711 if (mask
& OEX_FPU_INVAL
)
7712 printf ("%sINVAL", first
? "" : "|");
7715 fputs ("0", stdout
);
7718 /* ARM EABI attributes section. */
7723 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
7726 } arm_attr_public_tag
;
7728 static const char *arm_attr_tag_CPU_arch
[] =
7729 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
7731 static const char *arm_attr_tag_ARM_ISA_use
[] = {"No", "Yes"};
7732 static const char *arm_attr_tag_THUMB_ISA_use
[] =
7733 {"No", "Thumb-1", "Thumb-2"};
7734 /* FIXME: VFPv3 encoding was extrapolated! */
7735 static const char *arm_attr_tag_VFP_arch
[] = {"No", "VFPv1", "VFPv2", "VFPv3"};
7736 static const char *arm_attr_tag_WMMX_arch
[] = {"No", "WMMXv1"};
7737 static const char *arm_attr_tag_NEON_arch
[] = {"No", "NEONv1"};
7738 static const char *arm_attr_tag_ABI_PCS_config
[] =
7739 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
7740 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
7741 static const char *arm_attr_tag_ABI_PCS_R9_use
[] =
7742 {"V6", "SB", "TLS", "Unused"};
7743 static const char *arm_attr_tag_ABI_PCS_RW_data
[] =
7744 {"Absolute", "PC-relative", "SB-relative", "None"};
7745 static const char *arm_attr_tag_ABI_PCS_RO_DATA
[] =
7746 {"Absolute", "PC-relative", "None"};
7747 static const char *arm_attr_tag_ABI_PCS_GOT_use
[] =
7748 {"None", "direct", "GOT-indirect"};
7749 static const char *arm_attr_tag_ABI_PCS_wchar_t
[] =
7750 {"None", "??? 1", "2", "??? 3", "4"};
7751 static const char *arm_attr_tag_ABI_FP_rounding
[] = {"Unused", "Needed"};
7752 static const char *arm_attr_tag_ABI_FP_denormal
[] = {"Unused", "Needed"};
7753 static const char *arm_attr_tag_ABI_FP_exceptions
[] = {"Unused", "Needed"};
7754 static const char *arm_attr_tag_ABI_FP_user_exceptions
[] = {"Unused", "Needed"};
7755 static const char *arm_attr_tag_ABI_FP_number_model
[] =
7756 {"Unused", "Finite", "RTABI", "IEEE 754"};
7757 static const char *arm_attr_tag_ABI_align8_needed
[] = {"No", "Yes", "4-byte"};
7758 static const char *arm_attr_tag_ABI_align8_preserved
[] =
7759 {"No", "Yes, except leaf SP", "Yes"};
7760 static const char *arm_attr_tag_ABI_enum_size
[] =
7761 {"Unused", "small", "int", "forced to int"};
7762 static const char *arm_attr_tag_ABI_HardFP_use
[] =
7763 {"As Tag_VFP_arch", "SP only", "DP only", "SP and DP"};
7764 static const char *arm_attr_tag_ABI_VFP_args
[] =
7765 {"AAPCS", "VFP registers", "custom"};
7766 static const char *arm_attr_tag_ABI_WMMX_args
[] =
7767 {"AAPCS", "WMMX registers", "custom"};
7768 static const char *arm_attr_tag_ABI_optimization_goals
[] =
7769 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
7770 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
7771 static const char *arm_attr_tag_ABI_FP_optimization_goals
[] =
7772 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
7773 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
7775 #define LOOKUP(id, name) \
7776 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
7777 static arm_attr_public_tag arm_attr_public_tags
[] =
7779 {4, "CPU_raw_name", 1, NULL
},
7780 {5, "CPU_name", 1, NULL
},
7781 LOOKUP(6, CPU_arch
),
7782 {7, "CPU_arch_profile", 0, NULL
},
7783 LOOKUP(8, ARM_ISA_use
),
7784 LOOKUP(9, THUMB_ISA_use
),
7785 LOOKUP(10, VFP_arch
),
7786 LOOKUP(11, WMMX_arch
),
7787 LOOKUP(12, NEON_arch
),
7788 LOOKUP(13, ABI_PCS_config
),
7789 LOOKUP(14, ABI_PCS_R9_use
),
7790 LOOKUP(15, ABI_PCS_RW_data
),
7791 LOOKUP(16, ABI_PCS_RO_DATA
),
7792 LOOKUP(17, ABI_PCS_GOT_use
),
7793 LOOKUP(18, ABI_PCS_wchar_t
),
7794 LOOKUP(19, ABI_FP_rounding
),
7795 LOOKUP(20, ABI_FP_denormal
),
7796 LOOKUP(21, ABI_FP_exceptions
),
7797 LOOKUP(22, ABI_FP_user_exceptions
),
7798 LOOKUP(23, ABI_FP_number_model
),
7799 LOOKUP(24, ABI_align8_needed
),
7800 LOOKUP(25, ABI_align8_preserved
),
7801 LOOKUP(26, ABI_enum_size
),
7802 LOOKUP(27, ABI_HardFP_use
),
7803 LOOKUP(28, ABI_VFP_args
),
7804 LOOKUP(29, ABI_WMMX_args
),
7805 LOOKUP(30, ABI_optimization_goals
),
7806 LOOKUP(31, ABI_FP_optimization_goals
),
7807 {32, "compatibility", 0, NULL
}
7811 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
7814 read_uleb128 (unsigned char *p
, unsigned int *plen
)
7828 val
|= ((unsigned int)c
& 0x7f) << shift
;
7837 static unsigned char *
7838 display_arm_attribute (unsigned char *p
)
7843 arm_attr_public_tag
*attr
;
7847 tag
= read_uleb128 (p
, &len
);
7850 for (i
= 0; i
< ARRAY_SIZE(arm_attr_public_tags
); i
++)
7852 if (arm_attr_public_tags
[i
].tag
== tag
)
7854 attr
= &arm_attr_public_tags
[i
];
7861 printf (" Tag_%s: ", attr
->name
);
7867 case 7: /* Tag_CPU_arch_profile. */
7868 val
= read_uleb128 (p
, &len
);
7872 case 0: printf ("None\n"); break;
7873 case 'A': printf ("Application\n"); break;
7874 case 'R': printf ("Realtime\n"); break;
7875 case 'M': printf ("Microcontroller\n"); break;
7876 default: printf ("??? (%d)\n", val
); break;
7880 case 32: /* Tag_compatibility. */
7881 val
= read_uleb128 (p
, &len
);
7883 printf ("flag = %d, vendor = %s\n", val
, p
);
7884 p
+= strlen((char *)p
) + 1;
7898 assert (attr
->type
& 0x80);
7899 val
= read_uleb128 (p
, &len
);
7901 type
= attr
->type
& 0x7f;
7903 printf ("??? (%d)\n", val
);
7905 printf ("%s\n", attr
->table
[val
]);
7912 type
= 1; /* String. */
7914 type
= 2; /* uleb128. */
7915 printf (" Tag_unknown_%d: ", tag
);
7920 printf ("\"%s\"\n", p
);
7921 p
+= strlen((char *)p
) + 1;
7925 val
= read_uleb128 (p
, &len
);
7927 printf ("%d (0x%x)\n", val
, val
);
7934 process_arm_specific (FILE *file
)
7936 Elf_Internal_Shdr
*sect
;
7937 unsigned char *contents
;
7940 bfd_vma section_len
;
7944 /* Find the section header so that we get the size. */
7945 for (i
= 0, sect
= section_headers
;
7946 i
< elf_header
.e_shnum
;
7949 if (sect
->sh_type
!= SHT_ARM_ATTRIBUTES
)
7952 contents
= get_data (NULL
, file
, sect
->sh_offset
, 1, sect
->sh_size
,
7960 len
= sect
->sh_size
- 1;
7965 bfd_boolean public_section
;
7967 section_len
= byte_get (p
, 4);
7969 if (section_len
> len
)
7971 printf (_("ERROR: Bad section length (%d > %d)\n"),
7972 (int)section_len
, (int)len
);
7976 printf ("Attribute Section: %s\n", p
);
7977 if (strcmp ((char *)p
, "aeabi") == 0)
7978 public_section
= TRUE
;
7980 public_section
= FALSE
;
7981 namelen
= strlen ((char *)p
) + 1;
7983 section_len
-= namelen
+ 4;
7984 while (section_len
> 0)
7989 size
= byte_get (p
, 4);
7990 if (size
> section_len
)
7992 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
7993 (int)size
, (int)section_len
);
7996 section_len
-= size
;
8002 printf ("File Attributes\n");
8005 printf ("Section Attributes:");
8008 printf ("Symbol Attributes:");
8013 val
= read_uleb128 (p
, &i
);
8017 printf (" %d", val
);
8022 printf ("Unknown tag: %d\n", tag
);
8023 public_section
= FALSE
;
8029 p
= display_arm_attribute(p
);
8033 /* ??? Do something sensible, like dump hex. */
8034 printf (" Unknown section contexts\n");
8042 printf (_("Unknown format '%c'\n"), *p
);
8051 process_mips_specific (FILE *file
)
8053 Elf_Internal_Dyn
*entry
;
8054 size_t liblist_offset
= 0;
8055 size_t liblistno
= 0;
8056 size_t conflictsno
= 0;
8057 size_t options_offset
= 0;
8058 size_t conflicts_offset
= 0;
8060 /* We have a lot of special sections. Thanks SGI! */
8061 if (dynamic_section
== NULL
)
8062 /* No information available. */
8065 for (entry
= dynamic_section
; entry
->d_tag
!= DT_NULL
; ++entry
)
8066 switch (entry
->d_tag
)
8068 case DT_MIPS_LIBLIST
:
8070 = offset_from_vma (file
, entry
->d_un
.d_val
,
8071 liblistno
* sizeof (Elf32_External_Lib
));
8073 case DT_MIPS_LIBLISTNO
:
8074 liblistno
= entry
->d_un
.d_val
;
8076 case DT_MIPS_OPTIONS
:
8077 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
8079 case DT_MIPS_CONFLICT
:
8081 = offset_from_vma (file
, entry
->d_un
.d_val
,
8082 conflictsno
* sizeof (Elf32_External_Conflict
));
8084 case DT_MIPS_CONFLICTNO
:
8085 conflictsno
= entry
->d_un
.d_val
;
8091 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
8093 Elf32_External_Lib
*elib
;
8096 elib
= get_data (NULL
, file
, liblist_offset
,
8097 liblistno
, sizeof (Elf32_External_Lib
),
8101 printf ("\nSection '.liblist' contains %lu entries:\n",
8102 (unsigned long) liblistno
);
8103 fputs (" Library Time Stamp Checksum Version Flags\n",
8106 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
8113 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
8114 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
8115 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
8116 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
8117 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
8119 tmp
= gmtime (&time
);
8120 snprintf (timebuf
, sizeof (timebuf
),
8121 "%04u-%02u-%02uT%02u:%02u:%02u",
8122 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
8123 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
8125 printf ("%3lu: ", (unsigned long) cnt
);
8126 if (VALID_DYNAMIC_NAME (liblist
.l_name
))
8127 print_symbol (20, GET_DYNAMIC_NAME (liblist
.l_name
));
8129 printf ("<corrupt: %9ld>", liblist
.l_name
);
8130 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
8133 if (liblist
.l_flags
== 0)
8144 { " EXACT_MATCH", LL_EXACT_MATCH
},
8145 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
8146 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
8147 { " EXPORTS", LL_EXPORTS
},
8148 { " DELAY_LOAD", LL_DELAY_LOAD
},
8149 { " DELTA", LL_DELTA
}
8151 int flags
= liblist
.l_flags
;
8155 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
8157 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
8159 fputs (l_flags_vals
[fcnt
].name
, stdout
);
8160 flags
^= l_flags_vals
[fcnt
].bit
;
8163 printf (" %#x", (unsigned int) flags
);
8173 if (options_offset
!= 0)
8175 Elf_External_Options
*eopt
;
8176 Elf_Internal_Shdr
*sect
= section_headers
;
8177 Elf_Internal_Options
*iopt
;
8178 Elf_Internal_Options
*option
;
8182 /* Find the section header so that we get the size. */
8183 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
8186 eopt
= get_data (NULL
, file
, options_offset
, 1, sect
->sh_size
,
8190 iopt
= cmalloc ((sect
->sh_size
/ sizeof (eopt
)), sizeof (*iopt
));
8193 error (_("Out of memory"));
8200 while (offset
< sect
->sh_size
)
8202 Elf_External_Options
*eoption
;
8204 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
8206 option
->kind
= BYTE_GET (eoption
->kind
);
8207 option
->size
= BYTE_GET (eoption
->size
);
8208 option
->section
= BYTE_GET (eoption
->section
);
8209 option
->info
= BYTE_GET (eoption
->info
);
8211 offset
+= option
->size
;
8217 printf (_("\nSection '%s' contains %d entries:\n"),
8218 SECTION_NAME (sect
), cnt
);
8226 switch (option
->kind
)
8229 /* This shouldn't happen. */
8230 printf (" NULL %d %lx", option
->section
, option
->info
);
8233 printf (" REGINFO ");
8234 if (elf_header
.e_machine
== EM_MIPS
)
8237 Elf32_External_RegInfo
*ereg
;
8238 Elf32_RegInfo reginfo
;
8240 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
8241 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8242 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8243 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8244 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8245 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8246 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
8248 printf ("GPR %08lx GP 0x%lx\n",
8250 (unsigned long) reginfo
.ri_gp_value
);
8251 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8252 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8253 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8258 Elf64_External_RegInfo
*ereg
;
8259 Elf64_Internal_RegInfo reginfo
;
8261 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
8262 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8263 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8264 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8265 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8266 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8267 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
8269 printf ("GPR %08lx GP 0x",
8270 reginfo
.ri_gprmask
);
8271 printf_vma (reginfo
.ri_gp_value
);
8274 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8275 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8276 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8280 case ODK_EXCEPTIONS
:
8281 fputs (" EXCEPTIONS fpe_min(", stdout
);
8282 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
8283 fputs (") fpe_max(", stdout
);
8284 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
8285 fputs (")", stdout
);
8287 if (option
->info
& OEX_PAGE0
)
8288 fputs (" PAGE0", stdout
);
8289 if (option
->info
& OEX_SMM
)
8290 fputs (" SMM", stdout
);
8291 if (option
->info
& OEX_FPDBUG
)
8292 fputs (" FPDBUG", stdout
);
8293 if (option
->info
& OEX_DISMISS
)
8294 fputs (" DISMISS", stdout
);
8297 fputs (" PAD ", stdout
);
8298 if (option
->info
& OPAD_PREFIX
)
8299 fputs (" PREFIX", stdout
);
8300 if (option
->info
& OPAD_POSTFIX
)
8301 fputs (" POSTFIX", stdout
);
8302 if (option
->info
& OPAD_SYMBOL
)
8303 fputs (" SYMBOL", stdout
);
8306 fputs (" HWPATCH ", stdout
);
8307 if (option
->info
& OHW_R4KEOP
)
8308 fputs (" R4KEOP", stdout
);
8309 if (option
->info
& OHW_R8KPFETCH
)
8310 fputs (" R8KPFETCH", stdout
);
8311 if (option
->info
& OHW_R5KEOP
)
8312 fputs (" R5KEOP", stdout
);
8313 if (option
->info
& OHW_R5KCVTL
)
8314 fputs (" R5KCVTL", stdout
);
8317 fputs (" FILL ", stdout
);
8318 /* XXX Print content of info word? */
8321 fputs (" TAGS ", stdout
);
8322 /* XXX Print content of info word? */
8325 fputs (" HWAND ", stdout
);
8326 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8327 fputs (" R4KEOP_CHECKED", stdout
);
8328 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8329 fputs (" R4KEOP_CLEAN", stdout
);
8332 fputs (" HWOR ", stdout
);
8333 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8334 fputs (" R4KEOP_CHECKED", stdout
);
8335 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8336 fputs (" R4KEOP_CLEAN", stdout
);
8339 printf (" GP_GROUP %#06lx self-contained %#06lx",
8340 option
->info
& OGP_GROUP
,
8341 (option
->info
& OGP_SELF
) >> 16);
8344 printf (" IDENT %#06lx self-contained %#06lx",
8345 option
->info
& OGP_GROUP
,
8346 (option
->info
& OGP_SELF
) >> 16);
8349 /* This shouldn't happen. */
8350 printf (" %3d ??? %d %lx",
8351 option
->kind
, option
->section
, option
->info
);
8355 len
= sizeof (*eopt
);
8356 while (len
< option
->size
)
8357 if (((char *) option
)[len
] >= ' '
8358 && ((char *) option
)[len
] < 0x7f)
8359 printf ("%c", ((char *) option
)[len
++]);
8361 printf ("\\%03o", ((char *) option
)[len
++]);
8363 fputs ("\n", stdout
);
8371 if (conflicts_offset
!= 0 && conflictsno
!= 0)
8373 Elf32_Conflict
*iconf
;
8376 if (dynamic_symbols
== NULL
)
8378 error (_("conflict list found without a dynamic symbol table"));
8382 iconf
= cmalloc (conflictsno
, sizeof (*iconf
));
8385 error (_("Out of memory"));
8391 Elf32_External_Conflict
*econf32
;
8393 econf32
= get_data (NULL
, file
, conflicts_offset
,
8394 conflictsno
, sizeof (*econf32
), _("conflict"));
8398 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8399 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
8405 Elf64_External_Conflict
*econf64
;
8407 econf64
= get_data (NULL
, file
, conflicts_offset
,
8408 conflictsno
, sizeof (*econf64
), _("conflict"));
8412 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8413 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
8418 printf (_("\nSection '.conflict' contains %lu entries:\n"),
8419 (unsigned long) conflictsno
);
8420 puts (_(" Num: Index Value Name"));
8422 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8424 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
8426 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
8427 print_vma (psym
->st_value
, FULL_HEX
);
8429 if (VALID_DYNAMIC_NAME (psym
->st_name
))
8430 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
8432 printf ("<corrupt: %14ld>", psym
->st_name
);
8443 process_gnu_liblist (FILE *file
)
8445 Elf_Internal_Shdr
*section
, *string_sec
;
8446 Elf32_External_Lib
*elib
;
8455 for (i
= 0, section
= section_headers
;
8456 i
< elf_header
.e_shnum
;
8459 switch (section
->sh_type
)
8461 case SHT_GNU_LIBLIST
:
8462 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
)
8465 elib
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
8470 string_sec
= SECTION_HEADER (section
->sh_link
);
8472 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
8473 string_sec
->sh_size
, _("liblist string table"));
8474 strtab_size
= string_sec
->sh_size
;
8477 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
8483 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
8484 SECTION_NAME (section
),
8485 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
8487 puts (" Library Time Stamp Checksum Version Flags");
8489 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
8497 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
8498 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
8499 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
8500 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
8501 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
8503 tmp
= gmtime (&time
);
8504 snprintf (timebuf
, sizeof (timebuf
),
8505 "%04u-%02u-%02uT%02u:%02u:%02u",
8506 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
8507 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
8509 printf ("%3lu: ", (unsigned long) cnt
);
8511 printf ("%-20s", liblist
.l_name
< strtab_size
8512 ? strtab
+ liblist
.l_name
: "<corrupt>");
8514 printf ("%-20.20s", liblist
.l_name
< strtab_size
8515 ? strtab
+ liblist
.l_name
: "<corrupt>");
8516 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
8517 liblist
.l_version
, liblist
.l_flags
);
8528 get_note_type (unsigned e_type
)
8530 static char buff
[64];
8532 if (elf_header
.e_type
== ET_CORE
)
8536 return _("NT_AUXV (auxiliary vector)");
8538 return _("NT_PRSTATUS (prstatus structure)");
8540 return _("NT_FPREGSET (floating point registers)");
8542 return _("NT_PRPSINFO (prpsinfo structure)");
8544 return _("NT_TASKSTRUCT (task structure)");
8546 return _("NT_PRXFPREG (user_xfpregs structure)");
8548 return _("NT_PSTATUS (pstatus structure)");
8550 return _("NT_FPREGS (floating point registers)");
8552 return _("NT_PSINFO (psinfo structure)");
8554 return _("NT_LWPSTATUS (lwpstatus_t structure)");
8556 return _("NT_LWPSINFO (lwpsinfo_t structure)");
8557 case NT_WIN32PSTATUS
:
8558 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
8566 return _("NT_VERSION (version)");
8568 return _("NT_ARCH (architecture)");
8573 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
8578 get_netbsd_elfcore_note_type (unsigned e_type
)
8580 static char buff
[64];
8582 if (e_type
== NT_NETBSDCORE_PROCINFO
)
8584 /* NetBSD core "procinfo" structure. */
8585 return _("NetBSD procinfo structure");
8588 /* As of Jan 2002 there are no other machine-independent notes
8589 defined for NetBSD core files. If the note type is less
8590 than the start of the machine-dependent note types, we don't
8593 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
8595 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
8599 switch (elf_header
.e_machine
)
8601 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
8602 and PT_GETFPREGS == mach+2. */
8607 case EM_SPARC32PLUS
:
8611 case NT_NETBSDCORE_FIRSTMACH
+0:
8612 return _("PT_GETREGS (reg structure)");
8613 case NT_NETBSDCORE_FIRSTMACH
+2:
8614 return _("PT_GETFPREGS (fpreg structure)");
8620 /* On all other arch's, PT_GETREGS == mach+1 and
8621 PT_GETFPREGS == mach+3. */
8625 case NT_NETBSDCORE_FIRSTMACH
+1:
8626 return _("PT_GETREGS (reg structure)");
8627 case NT_NETBSDCORE_FIRSTMACH
+3:
8628 return _("PT_GETFPREGS (fpreg structure)");
8634 snprintf (buff
, sizeof (buff
), _("PT_FIRSTMACH+%d"),
8635 e_type
- NT_NETBSDCORE_FIRSTMACH
);
8639 /* Note that by the ELF standard, the name field is already null byte
8640 terminated, and namesz includes the terminating null byte.
8641 I.E. the value of namesz for the name "FSF" is 4.
8643 If the value of namesz is zero, there is no name present. */
8645 process_note (Elf_Internal_Note
*pnote
)
8649 if (pnote
->namesz
== 0)
8650 /* If there is no note name, then use the default set of
8651 note type strings. */
8652 nt
= get_note_type (pnote
->type
);
8654 else if (strneq (pnote
->namedata
, "NetBSD-CORE", 11))
8655 /* NetBSD-specific core file notes. */
8656 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
8659 /* Don't recognize this note name; just use the default set of
8660 note type strings. */
8661 nt
= get_note_type (pnote
->type
);
8663 printf (" %s\t\t0x%08lx\t%s\n",
8664 pnote
->namesz
? pnote
->namedata
: "(NONE)",
8671 process_corefile_note_segment (FILE *file
, bfd_vma offset
, bfd_vma length
)
8673 Elf_External_Note
*pnotes
;
8674 Elf_External_Note
*external
;
8680 pnotes
= get_data (NULL
, file
, offset
, 1, length
, _("notes"));
8686 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
8687 (unsigned long) offset
, (unsigned long) length
);
8688 printf (_(" Owner\t\tData size\tDescription\n"));
8690 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
8692 Elf_External_Note
*next
;
8693 Elf_Internal_Note inote
;
8696 inote
.type
= BYTE_GET (external
->type
);
8697 inote
.namesz
= BYTE_GET (external
->namesz
);
8698 inote
.namedata
= external
->name
;
8699 inote
.descsz
= BYTE_GET (external
->descsz
);
8700 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
8701 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
8703 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
8705 if (((char *) next
) > (((char *) pnotes
) + length
))
8707 warn (_("corrupt note found at offset %lx into core notes\n"),
8708 (long)((char *)external
- (char *)pnotes
));
8709 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
8710 inote
.type
, inote
.namesz
, inote
.descsz
);
8716 /* Verify that name is null terminated. It appears that at least
8717 one version of Linux (RedHat 6.0) generates corefiles that don't
8718 comply with the ELF spec by failing to include the null byte in
8720 if (inote
.namedata
[inote
.namesz
] != '\0')
8722 temp
= malloc (inote
.namesz
+ 1);
8726 error (_("Out of memory\n"));
8731 strncpy (temp
, inote
.namedata
, inote
.namesz
);
8732 temp
[inote
.namesz
] = 0;
8734 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
8735 inote
.namedata
= temp
;
8738 res
&= process_note (& inote
);
8753 process_corefile_note_segments (FILE *file
)
8755 Elf_Internal_Phdr
*segment
;
8759 if (! get_program_headers (file
))
8762 for (i
= 0, segment
= program_headers
;
8763 i
< elf_header
.e_phnum
;
8766 if (segment
->p_type
== PT_NOTE
)
8767 res
&= process_corefile_note_segment (file
,
8768 (bfd_vma
) segment
->p_offset
,
8769 (bfd_vma
) segment
->p_filesz
);
8776 process_note_sections (FILE *file
)
8778 Elf_Internal_Shdr
*section
;
8782 for (i
= 0, section
= section_headers
;
8783 i
< elf_header
.e_shnum
;
8785 if (section
->sh_type
== SHT_NOTE
)
8786 res
&= process_corefile_note_segment (file
,
8787 (bfd_vma
) section
->sh_offset
,
8788 (bfd_vma
) section
->sh_size
);
8794 process_notes (FILE *file
)
8796 /* If we have not been asked to display the notes then do nothing. */
8800 if (elf_header
.e_type
!= ET_CORE
)
8801 return process_note_sections (file
);
8803 /* No program headers means no NOTE segment. */
8804 if (elf_header
.e_phnum
> 0)
8805 return process_corefile_note_segments (file
);
8807 printf (_("No note segments present in the core file.\n"));
8812 process_arch_specific (FILE *file
)
8817 switch (elf_header
.e_machine
)
8820 return process_arm_specific (file
);
8822 case EM_MIPS_RS3_LE
:
8823 return process_mips_specific (file
);
8832 get_file_header (FILE *file
)
8834 /* Read in the identity array. */
8835 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
8838 /* Determine how to read the rest of the header. */
8839 switch (elf_header
.e_ident
[EI_DATA
])
8841 default: /* fall through */
8842 case ELFDATANONE
: /* fall through */
8844 byte_get
= byte_get_little_endian
;
8845 byte_put
= byte_put_little_endian
;
8848 byte_get
= byte_get_big_endian
;
8849 byte_put
= byte_put_big_endian
;
8853 /* For now we only support 32 bit and 64 bit ELF files. */
8854 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
8856 /* Read in the rest of the header. */
8859 Elf32_External_Ehdr ehdr32
;
8861 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
8864 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
8865 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
8866 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
8867 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
8868 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
8869 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
8870 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
8871 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
8872 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
8873 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
8874 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
8875 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
8876 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
8880 Elf64_External_Ehdr ehdr64
;
8882 /* If we have been compiled with sizeof (bfd_vma) == 4, then
8883 we will not be able to cope with the 64bit data found in
8884 64 ELF files. Detect this now and abort before we start
8885 overwriting things. */
8886 if (sizeof (bfd_vma
) < 8)
8888 error (_("This instance of readelf has been built without support for a\n\
8889 64 bit data type and so it cannot read 64 bit ELF files.\n"));
8893 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
8896 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
8897 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
8898 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
8899 elf_header
.e_entry
= BYTE_GET (ehdr64
.e_entry
);
8900 elf_header
.e_phoff
= BYTE_GET (ehdr64
.e_phoff
);
8901 elf_header
.e_shoff
= BYTE_GET (ehdr64
.e_shoff
);
8902 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
8903 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
8904 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
8905 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
8906 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
8907 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
8908 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
8911 if (elf_header
.e_shoff
)
8913 /* There may be some extensions in the first section header. Don't
8914 bomb if we can't read it. */
8916 get_32bit_section_headers (file
, 1);
8918 get_64bit_section_headers (file
, 1);
8921 is_relocatable
= elf_header
.e_type
== ET_REL
;
8926 /* Process one ELF object file according to the command line options.
8927 This file may actually be stored in an archive. The file is
8928 positioned at the start of the ELF object. */
8931 process_object (char *file_name
, FILE *file
)
8935 if (! get_file_header (file
))
8937 error (_("%s: Failed to read file header\n"), file_name
);
8941 /* Initialise per file variables. */
8942 for (i
= NUM_ELEM (version_info
); i
--;)
8943 version_info
[i
] = 0;
8945 for (i
= NUM_ELEM (dynamic_info
); i
--;)
8946 dynamic_info
[i
] = 0;
8948 /* Process the file. */
8950 printf (_("\nFile: %s\n"), file_name
);
8952 /* Initialise the dump_sects array from the cmdline_dump_sects array.
8953 Note we do this even if cmdline_dump_sects is empty because we
8954 must make sure that the dump_sets array is zeroed out before each
8955 object file is processed. */
8956 if (num_dump_sects
> num_cmdline_dump_sects
)
8957 memset (dump_sects
, 0, num_dump_sects
);
8959 if (num_cmdline_dump_sects
> 0)
8961 if (num_dump_sects
== 0)
8962 /* A sneaky way of allocating the dump_sects array. */
8963 request_dump (num_cmdline_dump_sects
, 0);
8965 assert (num_dump_sects
>= num_cmdline_dump_sects
);
8966 memcpy (dump_sects
, cmdline_dump_sects
, num_cmdline_dump_sects
);
8969 if (! process_file_header ())
8972 if (! process_section_headers (file
))
8974 /* Without loaded section headers we cannot process lots of
8976 do_unwind
= do_version
= do_dump
= do_arch
= 0;
8978 if (! do_using_dynamic
)
8979 do_syms
= do_reloc
= 0;
8982 if (! process_section_groups (file
))
8984 /* Without loaded section groups we cannot process unwind. */
8988 if (process_program_headers (file
))
8989 process_dynamic_section (file
);
8991 process_relocs (file
);
8993 process_unwind (file
);
8995 process_symbol_table (file
);
8997 process_syminfo (file
);
8999 process_version_sections (file
);
9001 process_section_contents (file
);
9003 process_notes (file
);
9005 process_gnu_liblist (file
);
9007 process_arch_specific (file
);
9009 if (program_headers
)
9011 free (program_headers
);
9012 program_headers
= NULL
;
9015 if (section_headers
)
9017 free (section_headers
);
9018 section_headers
= NULL
;
9023 free (string_table
);
9024 string_table
= NULL
;
9025 string_table_length
= 0;
9028 if (dynamic_strings
)
9030 free (dynamic_strings
);
9031 dynamic_strings
= NULL
;
9032 dynamic_strings_length
= 0;
9035 if (dynamic_symbols
)
9037 free (dynamic_symbols
);
9038 dynamic_symbols
= NULL
;
9039 num_dynamic_syms
= 0;
9042 if (dynamic_syminfo
)
9044 free (dynamic_syminfo
);
9045 dynamic_syminfo
= NULL
;
9048 if (section_headers_groups
)
9050 free (section_headers_groups
);
9051 section_headers_groups
= NULL
;
9056 struct group_list
*g
, *next
;
9058 for (i
= 0; i
< group_count
; i
++)
9060 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
9067 free (section_groups
);
9068 section_groups
= NULL
;
9071 free_debug_memory ();
9076 /* Process an ELF archive. The file is positioned just after the
9080 process_archive (char *file_name
, FILE *file
)
9082 struct ar_hdr arhdr
;
9085 char *longnames
= NULL
;
9086 unsigned long longnames_size
= 0;
9087 size_t file_name_size
;
9092 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
9093 if (got
!= sizeof arhdr
)
9098 error (_("%s: failed to read archive header\n"), file_name
);
9102 if (memcmp (arhdr
.ar_name
, "/ ", 16) == 0)
9104 /* This is the archive symbol table. Skip it.
9105 FIXME: We should have an option to dump it. */
9106 size
= strtoul (arhdr
.ar_size
, NULL
, 10);
9107 if (fseek (file
, size
+ (size
& 1), SEEK_CUR
) != 0)
9109 error (_("%s: failed to skip archive symbol table\n"), file_name
);
9113 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
9114 if (got
!= sizeof arhdr
)
9119 error (_("%s: failed to read archive header\n"), file_name
);
9124 if (memcmp (arhdr
.ar_name
, "// ", 16) == 0)
9126 /* This is the archive string table holding long member
9129 longnames_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
9131 longnames
= malloc (longnames_size
);
9132 if (longnames
== NULL
)
9134 error (_("Out of memory\n"));
9138 if (fread (longnames
, longnames_size
, 1, file
) != 1)
9141 error (_("%s: failed to read string table\n"), file_name
);
9145 if ((longnames_size
& 1) != 0)
9148 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
9149 if (got
!= sizeof arhdr
)
9156 error (_("%s: failed to read archive header\n"), file_name
);
9161 file_name_size
= strlen (file_name
);
9170 if (arhdr
.ar_name
[0] == '/')
9174 off
= strtoul (arhdr
.ar_name
+ 1, NULL
, 10);
9175 if (off
>= longnames_size
)
9177 error (_("%s: invalid archive string table offset %lu\n"), file_name
, off
);
9182 name
= longnames
+ off
;
9183 nameend
= memchr (name
, '/', longnames_size
- off
);
9187 name
= arhdr
.ar_name
;
9188 nameend
= memchr (name
, '/', 16);
9191 if (nameend
== NULL
)
9193 error (_("%s: bad archive file name\n"), file_name
);
9198 namealc
= malloc (file_name_size
+ (nameend
- name
) + 3);
9199 if (namealc
== NULL
)
9201 error (_("Out of memory\n"));
9206 memcpy (namealc
, file_name
, file_name_size
);
9207 namealc
[file_name_size
] = '(';
9208 memcpy (namealc
+ file_name_size
+ 1, name
, nameend
- name
);
9209 namealc
[file_name_size
+ 1 + (nameend
- name
)] = ')';
9210 namealc
[file_name_size
+ 2 + (nameend
- name
)] = '\0';
9212 archive_file_offset
= ftell (file
);
9213 archive_file_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
9215 ret
|= process_object (namealc
, file
);
9220 (archive_file_offset
9222 + (archive_file_size
& 1)),
9225 error (_("%s: failed to seek to next archive header\n"), file_name
);
9230 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
9231 if (got
!= sizeof arhdr
)
9236 error (_("%s: failed to read archive header\n"), file_name
);
9249 process_file (char *file_name
)
9252 struct stat statbuf
;
9256 if (stat (file_name
, &statbuf
) < 0)
9258 if (errno
== ENOENT
)
9259 error (_("'%s': No such file\n"), file_name
);
9261 error (_("Could not locate '%s'. System error message: %s\n"),
9262 file_name
, strerror (errno
));
9266 if (! S_ISREG (statbuf
.st_mode
))
9268 error (_("'%s' is not an ordinary file\n"), file_name
);
9272 file
= fopen (file_name
, "rb");
9275 error (_("Input file '%s' is not readable.\n"), file_name
);
9279 if (fread (armag
, SARMAG
, 1, file
) != 1)
9281 error (_("%s: Failed to read file header\n"), file_name
);
9286 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
9287 ret
= process_archive (file_name
, file
);
9291 archive_file_size
= archive_file_offset
= 0;
9292 ret
= process_object (file_name
, file
);
9300 #ifdef SUPPORT_DISASSEMBLY
9301 /* Needed by the i386 disassembler. For extra credit, someone could
9302 fix this so that we insert symbolic addresses here, esp for GOT/PLT
9306 print_address (unsigned int addr
, FILE *outfile
)
9308 fprintf (outfile
,"0x%8.8x", addr
);
9311 /* Needed by the i386 disassembler. */
9313 db_task_printsym (unsigned int addr
)
9315 print_address (addr
, stderr
);
9320 main (int argc
, char **argv
)
9324 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9325 setlocale (LC_MESSAGES
, "");
9327 #if defined (HAVE_SETLOCALE)
9328 setlocale (LC_CTYPE
, "");
9330 bindtextdomain (PACKAGE
, LOCALEDIR
);
9331 textdomain (PACKAGE
);
9333 expandargv (&argc
, &argv
);
9335 parse_args (argc
, argv
);
9337 if (num_dump_sects
> 0)
9339 /* Make a copy of the dump_sects array. */
9340 cmdline_dump_sects
= malloc (num_dump_sects
);
9341 if (cmdline_dump_sects
== NULL
)
9342 error (_("Out of memory allocating dump request table."));
9345 memcpy (cmdline_dump_sects
, dump_sects
, num_dump_sects
);
9346 num_cmdline_dump_sects
= num_dump_sects
;
9350 if (optind
< (argc
- 1))
9354 while (optind
< argc
)
9355 err
|= process_file (argv
[optind
++]);
9357 if (dump_sects
!= NULL
)
9359 if (cmdline_dump_sects
!= NULL
)
9360 free (cmdline_dump_sects
);