1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
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 dynamic array of flags indicating for which sections a hex dump
181 has been requested (via the -x switch) and/or a disassembly dump
182 (via the -i switch). */
183 char *cmdline_dump_sects
= NULL
;
184 unsigned num_cmdline_dump_sects
= 0;
186 /* A dynamic array of flags indicating for which sections a dump of
187 some kind has been requested. It is reset on a per-object file
188 basis and then initialised from the cmdline_dump_sects array and
189 the results of interpreting the -w switch. */
190 char *dump_sects
= NULL
;
191 unsigned int num_dump_sects
= 0;
193 #define HEX_DUMP (1 << 0)
194 #define DISASS_DUMP (1 << 1)
195 #define DEBUG_DUMP (1 << 2)
197 /* How to print a vma value. */
198 typedef enum print_mode
210 static void (*byte_put
) (unsigned char *, bfd_vma
, int);
214 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
215 ((X)->sh_name >= string_table_length \
216 ? "<corrupt>" : string_table + (X)->sh_name))
218 /* Given st_shndx I, map to section_headers index. */
219 #define SECTION_HEADER_INDEX(I) \
220 ((I) < SHN_LORESERVE \
222 : ((I) <= SHN_HIRESERVE \
224 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
226 /* Reverse of the above. */
227 #define SECTION_HEADER_NUM(N) \
228 ((N) < SHN_LORESERVE \
230 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
232 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
234 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
236 #define BYTE_GET(field) byte_get (field, sizeof (field))
238 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
240 #define GET_ELF_SYMBOLS(file, section) \
241 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
242 : get_64bit_elf_symbols (file, section))
244 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
245 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
246 already been called and verified that the string exists. */
247 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
249 /* This is just a bit of syntatic sugar. */
250 #define streq(a,b) (strcmp ((a), (b)) == 0)
251 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
254 get_data (void *var
, FILE *file
, long offset
, size_t size
, size_t nmemb
,
259 if (size
== 0 || nmemb
== 0)
262 if (fseek (file
, archive_file_offset
+ offset
, SEEK_SET
))
264 error (_("Unable to seek to 0x%lx for %s\n"),
265 archive_file_offset
+ offset
, reason
);
272 /* Check for overflow. */
273 if (nmemb
< (~(size_t) 0 - 1) / size
)
274 /* + 1 so that we can '\0' terminate invalid string table sections. */
275 mvar
= malloc (size
* nmemb
+ 1);
279 error (_("Out of memory allocating 0x%lx bytes for %s\n"),
280 (unsigned long)(size
* nmemb
), reason
);
284 ((char *) mvar
)[size
* nmemb
] = '\0';
287 if (fread (mvar
, size
, nmemb
, file
) != nmemb
)
289 error (_("Unable to read in 0x%lx bytes of %s\n"),
290 (unsigned long)(size
* nmemb
), reason
);
300 byte_put_little_endian (unsigned char *field
, bfd_vma value
, int size
)
305 field
[7] = (((value
>> 24) >> 24) >> 8) & 0xff;
306 field
[6] = ((value
>> 24) >> 24) & 0xff;
307 field
[5] = ((value
>> 24) >> 16) & 0xff;
308 field
[4] = ((value
>> 24) >> 8) & 0xff;
311 field
[3] = (value
>> 24) & 0xff;
312 field
[2] = (value
>> 16) & 0xff;
315 field
[1] = (value
>> 8) & 0xff;
318 field
[0] = value
& 0xff;
322 error (_("Unhandled data length: %d\n"), size
);
327 #if defined BFD64 && !BFD_HOST_64BIT_LONG
329 print_dec_vma (bfd_vma vma
, int is_signed
)
335 if (is_signed
&& (bfd_signed_vma
) vma
< 0)
344 *bufp
++ = '0' + vma
% 10;
356 print_hex_vma (bfd_vma vma
)
364 char digit
= '0' + (vma
& 0x0f);
366 digit
+= 'a' - '0' - 10;
379 /* Print a VMA value. */
381 print_vma (bfd_vma vma
, print_mode mode
)
390 return printf ("0x%8.8lx", (unsigned long) vma
);
393 return printf ("%8.8lx", (unsigned long) vma
);
397 return printf ("%5ld", (long) vma
);
401 return printf ("0x%lx", (unsigned long) vma
);
404 return printf ("%lx", (unsigned long) vma
);
407 return printf ("%ld", (unsigned long) vma
);
410 return printf ("%lu", (unsigned long) vma
);
433 #if BFD_HOST_64BIT_LONG
434 return nc
+ printf ("%lx", vma
);
436 return nc
+ print_hex_vma (vma
);
440 #if BFD_HOST_64BIT_LONG
441 return printf ("%ld", vma
);
443 return print_dec_vma (vma
, 1);
447 #if BFD_HOST_64BIT_LONG
449 return printf ("%5ld", vma
);
451 return printf ("%#lx", vma
);
454 return printf ("%5ld", _bfd_int64_low (vma
));
456 return print_hex_vma (vma
);
460 #if BFD_HOST_64BIT_LONG
461 return printf ("%lu", vma
);
463 return print_dec_vma (vma
, 0);
471 /* Display a symbol on stdout. If do_wide is not true then
472 format the symbol to be at most WIDTH characters,
473 truncating as necessary. If WIDTH is negative then
474 format the string to be exactly - WIDTH characters,
475 truncating or padding as necessary. */
478 print_symbol (int width
, const char *symbol
)
481 printf ("%s", symbol
);
483 printf ("%-*.*s", width
, width
, symbol
);
485 printf ("%-.*s", width
, symbol
);
489 byte_put_big_endian (unsigned char *field
, bfd_vma value
, int size
)
494 field
[7] = value
& 0xff;
495 field
[6] = (value
>> 8) & 0xff;
496 field
[5] = (value
>> 16) & 0xff;
497 field
[4] = (value
>> 24) & 0xff;
502 field
[3] = value
& 0xff;
503 field
[2] = (value
>> 8) & 0xff;
507 field
[1] = value
& 0xff;
511 field
[0] = value
& 0xff;
515 error (_("Unhandled data length: %d\n"), size
);
520 /* Return a pointer to section NAME, or NULL if no such section exists. */
522 static Elf_Internal_Shdr
*
523 find_section (const char *name
)
527 for (i
= 0; i
< elf_header
.e_shnum
; i
++)
528 if (streq (SECTION_NAME (section_headers
+ i
), name
))
529 return section_headers
+ i
;
534 /* Guess the relocation size commonly used by the specific machines. */
537 guess_is_rela (unsigned long e_machine
)
541 /* Targets that use REL relocations. */
556 /* Targets that use RELA relocations. */
571 case EM_CYGNUS_MN10200
:
573 case EM_CYGNUS_MN10300
:
623 warn (_("Don't know about relocations on this machine architecture\n"));
629 slurp_rela_relocs (FILE *file
,
630 unsigned long rel_offset
,
631 unsigned long rel_size
,
632 Elf_Internal_Rela
**relasp
,
633 unsigned long *nrelasp
)
635 Elf_Internal_Rela
*relas
;
636 unsigned long nrelas
;
641 Elf32_External_Rela
*erelas
;
643 erelas
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
647 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
649 relas
= cmalloc (nrelas
, sizeof (Elf_Internal_Rela
));
654 error (_("out of memory parsing relocs"));
658 for (i
= 0; i
< nrelas
; i
++)
660 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
661 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
662 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
669 Elf64_External_Rela
*erelas
;
671 erelas
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
675 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
677 relas
= cmalloc (nrelas
, sizeof (Elf_Internal_Rela
));
682 error (_("out of memory parsing relocs"));
686 for (i
= 0; i
< nrelas
; i
++)
688 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
689 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
690 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
701 slurp_rel_relocs (FILE *file
,
702 unsigned long rel_offset
,
703 unsigned long rel_size
,
704 Elf_Internal_Rela
**relsp
,
705 unsigned long *nrelsp
)
707 Elf_Internal_Rela
*rels
;
713 Elf32_External_Rel
*erels
;
715 erels
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
719 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
721 rels
= cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
726 error (_("out of memory parsing relocs"));
730 for (i
= 0; i
< nrels
; i
++)
732 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
733 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
734 rels
[i
].r_addend
= 0;
741 Elf64_External_Rel
*erels
;
743 erels
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
747 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
749 rels
= cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
754 error (_("out of memory parsing relocs"));
758 for (i
= 0; i
< nrels
; i
++)
760 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
761 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
762 rels
[i
].r_addend
= 0;
772 /* Display the contents of the relocation data found at the specified
776 dump_relocations (FILE *file
,
777 unsigned long rel_offset
,
778 unsigned long rel_size
,
779 Elf_Internal_Sym
*symtab
,
782 unsigned long strtablen
,
786 Elf_Internal_Rela
*rels
;
789 if (is_rela
== UNKNOWN
)
790 is_rela
= guess_is_rela (elf_header
.e_machine
);
794 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
799 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
808 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
810 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
815 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
817 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
825 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
827 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
832 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
834 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
838 for (i
= 0; i
< rel_size
; i
++)
841 const char *rtype2
= NULL
;
842 const char *rtype3
= NULL
;
845 bfd_vma symtab_index
;
850 offset
= rels
[i
].r_offset
;
851 info
= rels
[i
].r_info
;
855 type
= ELF32_R_TYPE (info
);
856 symtab_index
= ELF32_R_SYM (info
);
860 /* The #ifdef BFD64 below is to prevent a compile time warning.
861 We know that if we do not have a 64 bit data type that we
862 will never execute this code anyway. */
864 if (elf_header
.e_machine
== EM_MIPS
)
866 /* In little-endian objects, r_info isn't really a 64-bit
867 little-endian value: it has a 32-bit little-endian
868 symbol index followed by four individual byte fields.
869 Reorder INFO accordingly. */
870 if (elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
871 info
= (((info
& 0xffffffff) << 32)
872 | ((info
>> 56) & 0xff)
873 | ((info
>> 40) & 0xff00)
874 | ((info
>> 24) & 0xff0000)
875 | ((info
>> 8) & 0xff000000));
876 type
= ELF64_MIPS_R_TYPE (info
);
877 type2
= ELF64_MIPS_R_TYPE2 (info
);
878 type3
= ELF64_MIPS_R_TYPE3 (info
);
880 else if (elf_header
.e_machine
== EM_SPARCV9
)
881 type
= ELF64_R_TYPE_ID (info
);
883 type
= ELF64_R_TYPE (info
);
885 symtab_index
= ELF64_R_SYM (info
);
891 #ifdef _bfd_int64_low
892 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
894 printf ("%8.8lx %8.8lx ", offset
, info
);
899 #ifdef _bfd_int64_low
901 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
902 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
903 _bfd_int64_high (offset
),
904 _bfd_int64_low (offset
),
905 _bfd_int64_high (info
),
906 _bfd_int64_low (info
));
909 ? "%16.16lx %16.16lx "
910 : "%12.12lx %12.12lx ",
915 switch (elf_header
.e_machine
)
923 rtype
= elf_m32r_reloc_type (type
);
928 rtype
= elf_i386_reloc_type (type
);
933 rtype
= elf_m68hc11_reloc_type (type
);
937 rtype
= elf_m68k_reloc_type (type
);
941 rtype
= elf_i960_reloc_type (type
);
946 rtype
= elf_avr_reloc_type (type
);
953 rtype
= elf_sparc_reloc_type (type
);
958 rtype
= v850_reloc_type (type
);
963 rtype
= elf_d10v_reloc_type (type
);
968 rtype
= elf_d30v_reloc_type (type
);
972 rtype
= elf_dlx_reloc_type (type
);
976 rtype
= elf_sh_reloc_type (type
);
980 case EM_CYGNUS_MN10300
:
981 rtype
= elf_mn10300_reloc_type (type
);
985 case EM_CYGNUS_MN10200
:
986 rtype
= elf_mn10200_reloc_type (type
);
991 rtype
= elf_fr30_reloc_type (type
);
995 rtype
= elf_frv_reloc_type (type
);
999 rtype
= elf_mcore_reloc_type (type
);
1003 rtype
= elf_mmix_reloc_type (type
);
1008 rtype
= elf_msp430_reloc_type (type
);
1012 rtype
= elf_ppc_reloc_type (type
);
1016 rtype
= elf_ppc64_reloc_type (type
);
1020 case EM_MIPS_RS3_LE
:
1021 rtype
= elf_mips_reloc_type (type
);
1024 rtype2
= elf_mips_reloc_type (type2
);
1025 rtype3
= elf_mips_reloc_type (type3
);
1030 rtype
= elf_alpha_reloc_type (type
);
1034 rtype
= elf_arm_reloc_type (type
);
1038 rtype
= elf_arc_reloc_type (type
);
1042 rtype
= elf_hppa_reloc_type (type
);
1048 rtype
= elf_h8_reloc_type (type
);
1053 rtype
= elf_or32_reloc_type (type
);
1058 rtype
= elf_pj_reloc_type (type
);
1061 rtype
= elf_ia64_reloc_type (type
);
1065 rtype
= elf_cris_reloc_type (type
);
1069 rtype
= elf_i860_reloc_type (type
);
1073 rtype
= elf_x86_64_reloc_type (type
);
1077 rtype
= i370_reloc_type (type
);
1082 rtype
= elf_s390_reloc_type (type
);
1086 rtype
= elf_xstormy16_reloc_type (type
);
1090 rtype
= elf_crx_reloc_type (type
);
1094 rtype
= elf_vax_reloc_type (type
);
1099 rtype
= elf_ip2k_reloc_type (type
);
1103 rtype
= elf_iq2000_reloc_type (type
);
1108 rtype
= elf_xtensa_reloc_type (type
);
1112 rtype
= elf_m32c_reloc_type (type
);
1116 rtype
= elf_ms1_reloc_type (type
);
1120 rtype
= elf_bfin_reloc_type (type
);
1126 #ifdef _bfd_int64_low
1127 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type
));
1129 printf (_("unrecognized: %-7lx"), type
);
1132 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1134 if (elf_header
.e_machine
== EM_ALPHA
1135 && streq (rtype
, "R_ALPHA_LITUSE")
1138 switch (rels
[i
].r_addend
)
1140 case LITUSE_ALPHA_ADDR
: rtype
= "ADDR"; break;
1141 case LITUSE_ALPHA_BASE
: rtype
= "BASE"; break;
1142 case LITUSE_ALPHA_BYTOFF
: rtype
= "BYTOFF"; break;
1143 case LITUSE_ALPHA_JSR
: rtype
= "JSR"; break;
1144 case LITUSE_ALPHA_TLSGD
: rtype
= "TLSGD"; break;
1145 case LITUSE_ALPHA_TLSLDM
: rtype
= "TLSLDM"; break;
1146 case LITUSE_ALPHA_JSRDIRECT
: rtype
= "JSRDIRECT"; break;
1147 default: rtype
= NULL
;
1150 printf (" (%s)", rtype
);
1154 printf (_("<unknown addend: %lx>"),
1155 (unsigned long) rels
[i
].r_addend
);
1158 else if (symtab_index
)
1160 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1161 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1164 Elf_Internal_Sym
*psym
;
1166 psym
= symtab
+ symtab_index
;
1169 print_vma (psym
->st_value
, LONG_HEX
);
1170 printf (is_32bit_elf
? " " : " ");
1172 if (psym
->st_name
== 0)
1174 const char *sec_name
= "<null>";
1177 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1179 bfd_vma sec_index
= (bfd_vma
) -1;
1181 if (psym
->st_shndx
< SHN_LORESERVE
)
1182 sec_index
= psym
->st_shndx
;
1183 else if (psym
->st_shndx
> SHN_HIRESERVE
)
1184 sec_index
= psym
->st_shndx
- (SHN_HIRESERVE
+ 1
1187 if (sec_index
!= (bfd_vma
) -1)
1188 sec_name
= SECTION_NAME (section_headers
+ sec_index
);
1189 else if (psym
->st_shndx
== SHN_ABS
)
1191 else if (psym
->st_shndx
== SHN_COMMON
)
1192 sec_name
= "COMMON";
1193 else if (elf_header
.e_machine
== EM_X86_64
1194 && psym
->st_shndx
== SHN_X86_64_LCOMMON
)
1195 sec_name
= "LARGE_COMMON";
1196 else if (elf_header
.e_machine
== EM_IA_64
1197 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1198 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1199 sec_name
= "ANSI_COM";
1202 sprintf (name_buf
, "<section 0x%x>",
1203 (unsigned int) psym
->st_shndx
);
1204 sec_name
= name_buf
;
1207 print_symbol (22, sec_name
);
1209 else if (strtab
== NULL
)
1210 printf (_("<string table index: %3ld>"), psym
->st_name
);
1211 else if (psym
->st_name
>= strtablen
)
1212 printf (_("<corrupt string table index: %3ld>"), psym
->st_name
);
1214 print_symbol (22, strtab
+ psym
->st_name
);
1217 printf (" + %lx", (unsigned long) rels
[i
].r_addend
);
1222 printf ("%*c", is_32bit_elf
?
1223 (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1224 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1227 if (elf_header
.e_machine
== EM_SPARCV9
&& streq (rtype
, "R_SPARC_OLO10"))
1228 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1232 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1234 printf (" Type2: ");
1237 #ifdef _bfd_int64_low
1238 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2
));
1240 printf (_("unrecognized: %-7lx"), type2
);
1243 printf ("%-17.17s", rtype2
);
1245 printf ("\n Type3: ");
1248 #ifdef _bfd_int64_low
1249 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3
));
1251 printf (_("unrecognized: %-7lx"), type3
);
1254 printf ("%-17.17s", rtype3
);
1266 get_mips_dynamic_type (unsigned long type
)
1270 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1271 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1272 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1273 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1274 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1275 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1276 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1277 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1278 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1279 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1280 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1281 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1282 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1283 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1284 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1285 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1286 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1287 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1288 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1289 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1290 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1291 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1292 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1293 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1294 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1295 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1296 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1297 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1298 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1299 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1300 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1301 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1302 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1303 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1304 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1305 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1306 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1307 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1308 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1309 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1310 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1311 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1312 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1319 get_sparc64_dynamic_type (unsigned long type
)
1323 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1330 get_ppc_dynamic_type (unsigned long type
)
1334 case DT_PPC_GOT
: return "PPC_GOT";
1341 get_ppc64_dynamic_type (unsigned long type
)
1345 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1346 case DT_PPC64_OPD
: return "PPC64_OPD";
1347 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1354 get_parisc_dynamic_type (unsigned long type
)
1358 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1359 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1360 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1361 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1362 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1363 case DT_HP_PREINIT
: return "HP_PREINIT";
1364 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1365 case DT_HP_NEEDED
: return "HP_NEEDED";
1366 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1367 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1368 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1369 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1370 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1371 case DT_HP_EPLTREL
: return "HP_GST_EPLTREL";
1372 case DT_HP_EPLTRELSZ
: return "HP_GST_EPLTRELSZ";
1373 case DT_HP_FILTERED
: return "HP_FILTERED";
1374 case DT_HP_FILTER_TLS
: return "HP_FILTER_TLS";
1375 case DT_HP_COMPAT_FILTERED
: return "HP_COMPAT_FILTERED";
1376 case DT_HP_LAZYLOAD
: return "HP_LAZYLOAD";
1377 case DT_HP_BIND_NOW_COUNT
: return "HP_BIND_NOW_COUNT";
1378 case DT_PLT
: return "PLT";
1379 case DT_PLT_SIZE
: return "PLT_SIZE";
1380 case DT_DLT
: return "DLT";
1381 case DT_DLT_SIZE
: return "DLT_SIZE";
1388 get_ia64_dynamic_type (unsigned long type
)
1392 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1399 get_alpha_dynamic_type (unsigned long type
)
1403 case DT_ALPHA_PLTRO
: return "ALPHA_PLTRO";
1410 get_dynamic_type (unsigned long type
)
1412 static char buff
[64];
1416 case DT_NULL
: return "NULL";
1417 case DT_NEEDED
: return "NEEDED";
1418 case DT_PLTRELSZ
: return "PLTRELSZ";
1419 case DT_PLTGOT
: return "PLTGOT";
1420 case DT_HASH
: return "HASH";
1421 case DT_STRTAB
: return "STRTAB";
1422 case DT_SYMTAB
: return "SYMTAB";
1423 case DT_RELA
: return "RELA";
1424 case DT_RELASZ
: return "RELASZ";
1425 case DT_RELAENT
: return "RELAENT";
1426 case DT_STRSZ
: return "STRSZ";
1427 case DT_SYMENT
: return "SYMENT";
1428 case DT_INIT
: return "INIT";
1429 case DT_FINI
: return "FINI";
1430 case DT_SONAME
: return "SONAME";
1431 case DT_RPATH
: return "RPATH";
1432 case DT_SYMBOLIC
: return "SYMBOLIC";
1433 case DT_REL
: return "REL";
1434 case DT_RELSZ
: return "RELSZ";
1435 case DT_RELENT
: return "RELENT";
1436 case DT_PLTREL
: return "PLTREL";
1437 case DT_DEBUG
: return "DEBUG";
1438 case DT_TEXTREL
: return "TEXTREL";
1439 case DT_JMPREL
: return "JMPREL";
1440 case DT_BIND_NOW
: return "BIND_NOW";
1441 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1442 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1443 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1444 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1445 case DT_RUNPATH
: return "RUNPATH";
1446 case DT_FLAGS
: return "FLAGS";
1448 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1449 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1451 case DT_CHECKSUM
: return "CHECKSUM";
1452 case DT_PLTPADSZ
: return "PLTPADSZ";
1453 case DT_MOVEENT
: return "MOVEENT";
1454 case DT_MOVESZ
: return "MOVESZ";
1455 case DT_FEATURE
: return "FEATURE";
1456 case DT_POSFLAG_1
: return "POSFLAG_1";
1457 case DT_SYMINSZ
: return "SYMINSZ";
1458 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1460 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1461 case DT_CONFIG
: return "CONFIG";
1462 case DT_DEPAUDIT
: return "DEPAUDIT";
1463 case DT_AUDIT
: return "AUDIT";
1464 case DT_PLTPAD
: return "PLTPAD";
1465 case DT_MOVETAB
: return "MOVETAB";
1466 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1468 case DT_VERSYM
: return "VERSYM";
1470 case DT_RELACOUNT
: return "RELACOUNT";
1471 case DT_RELCOUNT
: return "RELCOUNT";
1472 case DT_FLAGS_1
: return "FLAGS_1";
1473 case DT_VERDEF
: return "VERDEF";
1474 case DT_VERDEFNUM
: return "VERDEFNUM";
1475 case DT_VERNEED
: return "VERNEED";
1476 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1478 case DT_AUXILIARY
: return "AUXILIARY";
1479 case DT_USED
: return "USED";
1480 case DT_FILTER
: return "FILTER";
1482 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1483 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1484 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1485 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1486 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1489 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1493 switch (elf_header
.e_machine
)
1496 case EM_MIPS_RS3_LE
:
1497 result
= get_mips_dynamic_type (type
);
1500 result
= get_sparc64_dynamic_type (type
);
1503 result
= get_ppc_dynamic_type (type
);
1506 result
= get_ppc64_dynamic_type (type
);
1509 result
= get_ia64_dynamic_type (type
);
1512 result
= get_alpha_dynamic_type (type
);
1522 snprintf (buff
, sizeof (buff
), _("Processor Specific: %lx"), type
);
1524 else if (((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1525 || (elf_header
.e_machine
== EM_PARISC
1526 && (type
>= OLD_DT_LOOS
) && (type
<= OLD_DT_HIOS
)))
1530 switch (elf_header
.e_machine
)
1533 result
= get_parisc_dynamic_type (type
);
1543 snprintf (buff
, sizeof (buff
), _("Operating System specific: %lx"),
1547 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), type
);
1554 get_file_type (unsigned e_type
)
1556 static char buff
[32];
1560 case ET_NONE
: return _("NONE (None)");
1561 case ET_REL
: return _("REL (Relocatable file)");
1562 case ET_EXEC
: return _("EXEC (Executable file)");
1563 case ET_DYN
: return _("DYN (Shared object file)");
1564 case ET_CORE
: return _("CORE (Core file)");
1567 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1568 snprintf (buff
, sizeof (buff
), _("Processor Specific: (%x)"), e_type
);
1569 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1570 snprintf (buff
, sizeof (buff
), _("OS Specific: (%x)"), e_type
);
1572 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_type
);
1578 get_machine_name (unsigned e_machine
)
1580 static char buff
[64]; /* XXX */
1584 case EM_NONE
: return _("None");
1585 case EM_M32
: return "WE32100";
1586 case EM_SPARC
: return "Sparc";
1587 case EM_386
: return "Intel 80386";
1588 case EM_68K
: return "MC68000";
1589 case EM_88K
: return "MC88000";
1590 case EM_486
: return "Intel 80486";
1591 case EM_860
: return "Intel 80860";
1592 case EM_MIPS
: return "MIPS R3000";
1593 case EM_S370
: return "IBM System/370";
1594 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1595 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1596 case EM_PARISC
: return "HPPA";
1597 case EM_PPC_OLD
: return "Power PC (old)";
1598 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1599 case EM_960
: return "Intel 90860";
1600 case EM_PPC
: return "PowerPC";
1601 case EM_PPC64
: return "PowerPC64";
1602 case EM_V800
: return "NEC V800";
1603 case EM_FR20
: return "Fujitsu FR20";
1604 case EM_RH32
: return "TRW RH32";
1605 case EM_MCORE
: return "MCORE";
1606 case EM_ARM
: return "ARM";
1607 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1608 case EM_SH
: return "Renesas / SuperH SH";
1609 case EM_SPARCV9
: return "Sparc v9";
1610 case EM_TRICORE
: return "Siemens Tricore";
1611 case EM_ARC
: return "ARC";
1612 case EM_H8_300
: return "Renesas H8/300";
1613 case EM_H8_300H
: return "Renesas H8/300H";
1614 case EM_H8S
: return "Renesas H8S";
1615 case EM_H8_500
: return "Renesas H8/500";
1616 case EM_IA_64
: return "Intel IA-64";
1617 case EM_MIPS_X
: return "Stanford MIPS-X";
1618 case EM_COLDFIRE
: return "Motorola Coldfire";
1619 case EM_68HC12
: return "Motorola M68HC12";
1620 case EM_ALPHA
: return "Alpha";
1621 case EM_CYGNUS_D10V
:
1622 case EM_D10V
: return "d10v";
1623 case EM_CYGNUS_D30V
:
1624 case EM_D30V
: return "d30v";
1625 case EM_CYGNUS_M32R
:
1626 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
1627 case EM_CYGNUS_V850
:
1628 case EM_V850
: return "NEC v850";
1629 case EM_CYGNUS_MN10300
:
1630 case EM_MN10300
: return "mn10300";
1631 case EM_CYGNUS_MN10200
:
1632 case EM_MN10200
: return "mn10200";
1633 case EM_CYGNUS_FR30
:
1634 case EM_FR30
: return "Fujitsu FR30";
1635 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1637 case EM_PJ
: return "picoJava";
1638 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1639 case EM_PCP
: return "Siemens PCP";
1640 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1641 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1642 case EM_STARCORE
: return "Motorola Star*Core processor";
1643 case EM_ME16
: return "Toyota ME16 processor";
1644 case EM_ST100
: return "STMicroelectronics ST100 processor";
1645 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1646 case EM_FX66
: return "Siemens FX66 microcontroller";
1647 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1648 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1649 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1650 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1651 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1652 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1653 case EM_SVX
: return "Silicon Graphics SVx";
1654 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1655 case EM_VAX
: return "Digital VAX";
1657 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1658 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1659 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1660 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1661 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1662 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1663 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1664 case EM_PRISM
: return "Vitesse Prism";
1665 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1667 case EM_S390
: return "IBM S/390";
1668 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1670 case EM_OR32
: return "OpenRISC";
1671 case EM_CRX
: return "National Semiconductor CRX microprocessor";
1672 case EM_DLX
: return "OpenDLX";
1674 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1675 case EM_IQ2000
: return "Vitesse IQ2000";
1677 case EM_XTENSA
: return "Tensilica Xtensa Processor";
1678 case EM_M32C
: return "Renesas M32c";
1679 case EM_MS1
: return "Morpho Techologies MS1 processor";
1681 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_machine
);
1687 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
1692 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1693 e_flags
&= ~ EF_ARM_EABIMASK
;
1695 /* Handle "generic" ARM flags. */
1696 if (e_flags
& EF_ARM_RELEXEC
)
1698 strcat (buf
, ", relocatable executable");
1699 e_flags
&= ~ EF_ARM_RELEXEC
;
1702 if (e_flags
& EF_ARM_HASENTRY
)
1704 strcat (buf
, ", has entry point");
1705 e_flags
&= ~ EF_ARM_HASENTRY
;
1708 /* Now handle EABI specific flags. */
1712 strcat (buf
, ", <unrecognized EABI>");
1717 case EF_ARM_EABI_VER1
:
1718 strcat (buf
, ", Version1 EABI");
1723 /* Process flags one bit at a time. */
1724 flag
= e_flags
& - e_flags
;
1729 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1730 strcat (buf
, ", sorted symbol tables");
1740 case EF_ARM_EABI_VER2
:
1741 strcat (buf
, ", Version2 EABI");
1746 /* Process flags one bit at a time. */
1747 flag
= e_flags
& - e_flags
;
1752 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1753 strcat (buf
, ", sorted symbol tables");
1756 case EF_ARM_DYNSYMSUSESEGIDX
:
1757 strcat (buf
, ", dynamic symbols use segment index");
1760 case EF_ARM_MAPSYMSFIRST
:
1761 strcat (buf
, ", mapping symbols precede others");
1771 case EF_ARM_EABI_VER3
:
1772 strcat (buf
, ", Version3 EABI");
1775 case EF_ARM_EABI_VER4
:
1776 strcat (buf
, ", Version4 EABI");
1781 /* Process flags one bit at a time. */
1782 flag
= e_flags
& - e_flags
;
1788 strcat (buf
, ", BE8");
1792 strcat (buf
, ", LE8");
1802 case EF_ARM_EABI_UNKNOWN
:
1803 strcat (buf
, ", GNU EABI");
1808 /* Process flags one bit at a time. */
1809 flag
= e_flags
& - e_flags
;
1814 case EF_ARM_INTERWORK
:
1815 strcat (buf
, ", interworking enabled");
1818 case EF_ARM_APCS_26
:
1819 strcat (buf
, ", uses APCS/26");
1822 case EF_ARM_APCS_FLOAT
:
1823 strcat (buf
, ", uses APCS/float");
1827 strcat (buf
, ", position independent");
1831 strcat (buf
, ", 8 bit structure alignment");
1834 case EF_ARM_NEW_ABI
:
1835 strcat (buf
, ", uses new ABI");
1838 case EF_ARM_OLD_ABI
:
1839 strcat (buf
, ", uses old ABI");
1842 case EF_ARM_SOFT_FLOAT
:
1843 strcat (buf
, ", software FP");
1846 case EF_ARM_VFP_FLOAT
:
1847 strcat (buf
, ", VFP");
1850 case EF_ARM_MAVERICK_FLOAT
:
1851 strcat (buf
, ", Maverick FP");
1862 strcat (buf
,", <unknown>");
1866 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
1868 static char buf
[1024];
1880 decode_ARM_machine_flags (e_flags
, buf
);
1884 switch (e_flags
& EF_FRV_CPU_MASK
)
1886 case EF_FRV_CPU_GENERIC
:
1890 strcat (buf
, ", fr???");
1893 case EF_FRV_CPU_FR300
:
1894 strcat (buf
, ", fr300");
1897 case EF_FRV_CPU_FR400
:
1898 strcat (buf
, ", fr400");
1900 case EF_FRV_CPU_FR405
:
1901 strcat (buf
, ", fr405");
1904 case EF_FRV_CPU_FR450
:
1905 strcat (buf
, ", fr450");
1908 case EF_FRV_CPU_FR500
:
1909 strcat (buf
, ", fr500");
1911 case EF_FRV_CPU_FR550
:
1912 strcat (buf
, ", fr550");
1915 case EF_FRV_CPU_SIMPLE
:
1916 strcat (buf
, ", simple");
1918 case EF_FRV_CPU_TOMCAT
:
1919 strcat (buf
, ", tomcat");
1925 if (e_flags
& EF_CPU32
)
1926 strcat (buf
, ", cpu32");
1927 if (e_flags
& EF_M68000
)
1928 strcat (buf
, ", m68000");
1932 if (e_flags
& EF_PPC_EMB
)
1933 strcat (buf
, ", emb");
1935 if (e_flags
& EF_PPC_RELOCATABLE
)
1936 strcat (buf
, ", relocatable");
1938 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
1939 strcat (buf
, ", relocatable-lib");
1943 case EM_CYGNUS_V850
:
1944 switch (e_flags
& EF_V850_ARCH
)
1947 strcat (buf
, ", v850e1");
1950 strcat (buf
, ", v850e");
1953 strcat (buf
, ", v850");
1956 strcat (buf
, ", unknown v850 architecture variant");
1962 case EM_CYGNUS_M32R
:
1963 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
1964 strcat (buf
, ", m32r");
1969 case EM_MIPS_RS3_LE
:
1970 if (e_flags
& EF_MIPS_NOREORDER
)
1971 strcat (buf
, ", noreorder");
1973 if (e_flags
& EF_MIPS_PIC
)
1974 strcat (buf
, ", pic");
1976 if (e_flags
& EF_MIPS_CPIC
)
1977 strcat (buf
, ", cpic");
1979 if (e_flags
& EF_MIPS_UCODE
)
1980 strcat (buf
, ", ugen_reserved");
1982 if (e_flags
& EF_MIPS_ABI2
)
1983 strcat (buf
, ", abi2");
1985 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
1986 strcat (buf
, ", odk first");
1988 if (e_flags
& EF_MIPS_32BITMODE
)
1989 strcat (buf
, ", 32bitmode");
1991 switch ((e_flags
& EF_MIPS_MACH
))
1993 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
1994 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
1995 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
1996 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
1997 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
1998 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
1999 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
2000 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
2001 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
2002 case E_MIPS_MACH_9000
: strcat (buf
, ", 9000"); break;
2004 /* We simply ignore the field in this case to avoid confusion:
2005 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2008 default: strcat (buf
, ", unknown CPU"); break;
2011 switch ((e_flags
& EF_MIPS_ABI
))
2013 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
2014 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
2015 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
2016 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
2018 /* We simply ignore the field in this case to avoid confusion:
2019 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2020 This means it is likely to be an o32 file, but not for
2023 default: strcat (buf
, ", unknown ABI"); break;
2026 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
2027 strcat (buf
, ", mdmx");
2029 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
2030 strcat (buf
, ", mips16");
2032 switch ((e_flags
& EF_MIPS_ARCH
))
2034 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
2035 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
2036 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
2037 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
2038 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
2039 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
2040 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
2041 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
2042 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
2043 default: strcat (buf
, ", unknown ISA"); break;
2049 switch ((e_flags
& EF_SH_MACH_MASK
))
2051 case EF_SH1
: strcat (buf
, ", sh1"); break;
2052 case EF_SH2
: strcat (buf
, ", sh2"); break;
2053 case EF_SH3
: strcat (buf
, ", sh3"); break;
2054 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
2055 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
2056 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
2057 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
2058 case EF_SH4
: strcat (buf
, ", sh4"); break;
2059 case EF_SH5
: strcat (buf
, ", sh5"); break;
2060 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
2061 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
2062 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
2063 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
2064 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
2065 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
2066 default: strcat (buf
, ", unknown ISA"); break;
2072 if (e_flags
& EF_SPARC_32PLUS
)
2073 strcat (buf
, ", v8+");
2075 if (e_flags
& EF_SPARC_SUN_US1
)
2076 strcat (buf
, ", ultrasparcI");
2078 if (e_flags
& EF_SPARC_SUN_US3
)
2079 strcat (buf
, ", ultrasparcIII");
2081 if (e_flags
& EF_SPARC_HAL_R1
)
2082 strcat (buf
, ", halr1");
2084 if (e_flags
& EF_SPARC_LEDATA
)
2085 strcat (buf
, ", ledata");
2087 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2088 strcat (buf
, ", tso");
2090 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2091 strcat (buf
, ", pso");
2093 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2094 strcat (buf
, ", rmo");
2098 switch (e_flags
& EF_PARISC_ARCH
)
2100 case EFA_PARISC_1_0
:
2101 strcpy (buf
, ", PA-RISC 1.0");
2103 case EFA_PARISC_1_1
:
2104 strcpy (buf
, ", PA-RISC 1.1");
2106 case EFA_PARISC_2_0
:
2107 strcpy (buf
, ", PA-RISC 2.0");
2112 if (e_flags
& EF_PARISC_TRAPNIL
)
2113 strcat (buf
, ", trapnil");
2114 if (e_flags
& EF_PARISC_EXT
)
2115 strcat (buf
, ", ext");
2116 if (e_flags
& EF_PARISC_LSB
)
2117 strcat (buf
, ", lsb");
2118 if (e_flags
& EF_PARISC_WIDE
)
2119 strcat (buf
, ", wide");
2120 if (e_flags
& EF_PARISC_NO_KABP
)
2121 strcat (buf
, ", no kabp");
2122 if (e_flags
& EF_PARISC_LAZYSWAP
)
2123 strcat (buf
, ", lazyswap");
2128 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2129 strcat (buf
, ", new calling convention");
2131 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2132 strcat (buf
, ", gnu calling convention");
2136 if ((e_flags
& EF_IA_64_ABI64
))
2137 strcat (buf
, ", 64-bit");
2139 strcat (buf
, ", 32-bit");
2140 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2141 strcat (buf
, ", reduced fp model");
2142 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2143 strcat (buf
, ", no function descriptors, constant gp");
2144 else if ((e_flags
& EF_IA_64_CONS_GP
))
2145 strcat (buf
, ", constant gp");
2146 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2147 strcat (buf
, ", absolute");
2151 if ((e_flags
& EF_VAX_NONPIC
))
2152 strcat (buf
, ", non-PIC");
2153 if ((e_flags
& EF_VAX_DFLOAT
))
2154 strcat (buf
, ", D-Float");
2155 if ((e_flags
& EF_VAX_GFLOAT
))
2156 strcat (buf
, ", G-Float");
2165 get_osabi_name (unsigned int osabi
)
2167 static char buff
[32];
2171 case ELFOSABI_NONE
: return "UNIX - System V";
2172 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2173 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2174 case ELFOSABI_LINUX
: return "UNIX - Linux";
2175 case ELFOSABI_HURD
: return "GNU/Hurd";
2176 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2177 case ELFOSABI_AIX
: return "UNIX - AIX";
2178 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2179 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2180 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2181 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2182 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2183 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2184 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2185 case ELFOSABI_AROS
: return "Amiga Research OS";
2186 case ELFOSABI_STANDALONE
: return _("Standalone App");
2187 case ELFOSABI_ARM
: return "ARM";
2189 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), osabi
);
2195 get_arm_segment_type (unsigned long type
)
2209 get_mips_segment_type (unsigned long type
)
2213 case PT_MIPS_REGINFO
:
2215 case PT_MIPS_RTPROC
:
2217 case PT_MIPS_OPTIONS
:
2227 get_parisc_segment_type (unsigned long type
)
2231 case PT_HP_TLS
: return "HP_TLS";
2232 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2233 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2234 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2235 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2236 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2237 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2238 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2239 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2240 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2241 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2242 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2243 case PT_HP_OPT_ANNOT
: return "HP_OPT_ANNOT";
2244 case PT_HP_HSL_ANNOT
: return "HP_HSL_ANNOT";
2245 case PT_HP_STACK
: return "HP_STACK";
2246 case PT_HP_CORE_UTSNAME
: return "HP_CORE_UTSNAME";
2247 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2248 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2249 case PT_PARISC_WEAKORDER
: return "PARISC_WEAKORDER";
2258 get_ia64_segment_type (unsigned long type
)
2262 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2263 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2264 case PT_HP_TLS
: return "HP_TLS";
2265 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2266 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2267 case PT_IA_64_HP_STACK
: return "HP_STACK";
2276 get_segment_type (unsigned long p_type
)
2278 static char buff
[32];
2282 case PT_NULL
: return "NULL";
2283 case PT_LOAD
: return "LOAD";
2284 case PT_DYNAMIC
: return "DYNAMIC";
2285 case PT_INTERP
: return "INTERP";
2286 case PT_NOTE
: return "NOTE";
2287 case PT_SHLIB
: return "SHLIB";
2288 case PT_PHDR
: return "PHDR";
2289 case PT_TLS
: return "TLS";
2291 case PT_GNU_EH_FRAME
:
2292 return "GNU_EH_FRAME";
2293 case PT_GNU_STACK
: return "GNU_STACK";
2294 case PT_GNU_RELRO
: return "GNU_RELRO";
2297 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2301 switch (elf_header
.e_machine
)
2304 result
= get_arm_segment_type (p_type
);
2307 case EM_MIPS_RS3_LE
:
2308 result
= get_mips_segment_type (p_type
);
2311 result
= get_parisc_segment_type (p_type
);
2314 result
= get_ia64_segment_type (p_type
);
2324 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2326 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2330 switch (elf_header
.e_machine
)
2333 result
= get_parisc_segment_type (p_type
);
2336 result
= get_ia64_segment_type (p_type
);
2346 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2349 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), p_type
);
2356 get_mips_section_type_name (unsigned int sh_type
)
2360 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2361 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2362 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2363 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2364 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2365 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2366 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2367 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2368 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2369 case SHT_MIPS_RELD
: return "MIPS_RELD";
2370 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2371 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2372 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2373 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2374 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2375 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2376 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2377 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2378 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2379 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2380 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2381 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2382 case SHT_MIPS_LINE
: return "MIPS_LINE";
2383 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2384 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2385 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2386 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2387 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2388 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2389 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2390 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2391 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2392 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2393 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2394 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2395 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2396 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2397 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2398 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2406 get_parisc_section_type_name (unsigned int sh_type
)
2410 case SHT_PARISC_EXT
: return "PARISC_EXT";
2411 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2412 case SHT_PARISC_DOC
: return "PARISC_DOC";
2413 case SHT_PARISC_ANNOT
: return "PARISC_ANNOT";
2414 case SHT_PARISC_SYMEXTN
: return "PARISC_SYMEXTN";
2415 case SHT_PARISC_STUBS
: return "PARISC_STUBS";
2416 case SHT_PARISC_DLKM
: return "PARISC_DLKM";
2424 get_ia64_section_type_name (unsigned int sh_type
)
2426 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2427 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2428 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2432 case SHT_IA_64_EXT
: return "IA_64_EXT";
2433 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2434 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2442 get_x86_64_section_type_name (unsigned int sh_type
)
2446 case SHT_X86_64_UNWIND
: return "X86_64_UNWIND";
2454 get_arm_section_type_name (unsigned int sh_type
)
2460 case SHT_ARM_PREEMPTMAP
:
2461 return "ARM_PREEMPTMAP";
2462 case SHT_ARM_ATTRIBUTES
:
2463 return "ARM_ATTRIBUTES";
2471 get_section_type_name (unsigned int sh_type
)
2473 static char buff
[32];
2477 case SHT_NULL
: return "NULL";
2478 case SHT_PROGBITS
: return "PROGBITS";
2479 case SHT_SYMTAB
: return "SYMTAB";
2480 case SHT_STRTAB
: return "STRTAB";
2481 case SHT_RELA
: return "RELA";
2482 case SHT_HASH
: return "HASH";
2483 case SHT_DYNAMIC
: return "DYNAMIC";
2484 case SHT_NOTE
: return "NOTE";
2485 case SHT_NOBITS
: return "NOBITS";
2486 case SHT_REL
: return "REL";
2487 case SHT_SHLIB
: return "SHLIB";
2488 case SHT_DYNSYM
: return "DYNSYM";
2489 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2490 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2491 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2492 case SHT_GROUP
: return "GROUP";
2493 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2494 case SHT_GNU_verdef
: return "VERDEF";
2495 case SHT_GNU_verneed
: return "VERNEED";
2496 case SHT_GNU_versym
: return "VERSYM";
2497 case 0x6ffffff0: return "VERSYM";
2498 case 0x6ffffffc: return "VERDEF";
2499 case 0x7ffffffd: return "AUXILIARY";
2500 case 0x7fffffff: return "FILTER";
2501 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2504 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2508 switch (elf_header
.e_machine
)
2511 case EM_MIPS_RS3_LE
:
2512 result
= get_mips_section_type_name (sh_type
);
2515 result
= get_parisc_section_type_name (sh_type
);
2518 result
= get_ia64_section_type_name (sh_type
);
2521 result
= get_x86_64_section_type_name (sh_type
);
2524 result
= get_arm_section_type_name (sh_type
);
2534 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2536 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2537 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2538 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2539 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2541 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), sh_type
);
2547 #define OPTION_DEBUG_DUMP 512
2549 static struct option options
[] =
2551 {"all", no_argument
, 0, 'a'},
2552 {"file-header", no_argument
, 0, 'h'},
2553 {"program-headers", no_argument
, 0, 'l'},
2554 {"headers", no_argument
, 0, 'e'},
2555 {"histogram", no_argument
, 0, 'I'},
2556 {"segments", no_argument
, 0, 'l'},
2557 {"sections", no_argument
, 0, 'S'},
2558 {"section-headers", no_argument
, 0, 'S'},
2559 {"section-groups", no_argument
, 0, 'g'},
2560 {"section-details", no_argument
, 0, 't'},
2561 {"full-section-name",no_argument
, 0, 'N'},
2562 {"symbols", no_argument
, 0, 's'},
2563 {"syms", no_argument
, 0, 's'},
2564 {"relocs", no_argument
, 0, 'r'},
2565 {"notes", no_argument
, 0, 'n'},
2566 {"dynamic", no_argument
, 0, 'd'},
2567 {"arch-specific", no_argument
, 0, 'A'},
2568 {"version-info", no_argument
, 0, 'V'},
2569 {"use-dynamic", no_argument
, 0, 'D'},
2570 {"hex-dump", required_argument
, 0, 'x'},
2571 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2572 {"unwind", no_argument
, 0, 'u'},
2573 #ifdef SUPPORT_DISASSEMBLY
2574 {"instruction-dump", required_argument
, 0, 'i'},
2577 {"version", no_argument
, 0, 'v'},
2578 {"wide", no_argument
, 0, 'W'},
2579 {"help", no_argument
, 0, 'H'},
2580 {0, no_argument
, 0, 0}
2586 fprintf (stdout
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2587 fprintf (stdout
, _(" Display information about the contents of ELF format files\n"));
2588 fprintf (stdout
, _(" Options are:\n\
2589 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2590 -h --file-header Display the ELF file header\n\
2591 -l --program-headers Display the program headers\n\
2592 --segments An alias for --program-headers\n\
2593 -S --section-headers Display the sections' header\n\
2594 --sections An alias for --section-headers\n\
2595 -g --section-groups Display the section groups\n\
2596 -t --section-details Display the section details\n\
2597 -e --headers Equivalent to: -h -l -S\n\
2598 -s --syms Display the symbol table\n\
2599 --symbols An alias for --syms\n\
2600 -n --notes Display the core notes (if present)\n\
2601 -r --relocs Display the relocations (if present)\n\
2602 -u --unwind Display the unwind info (if present)\n\
2603 -d --dynamic Display the dynamic section (if present)\n\
2604 -V --version-info Display the version sections (if present)\n\
2605 -A --arch-specific Display architecture specific information (if any).\n\
2606 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2607 -x --hex-dump=<number> Dump the contents of section <number>\n\
2608 -w[liaprmfFsoR] or\n\
2609 --debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]\n\
2610 Display the contents of DWARF2 debug sections\n"));
2611 #ifdef SUPPORT_DISASSEMBLY
2612 fprintf (stdout
, _("\
2613 -i --instruction-dump=<number>\n\
2614 Disassemble the contents of section <number>\n"));
2616 fprintf (stdout
, _("\
2617 -I --histogram Display histogram of bucket list lengths\n\
2618 -W --wide Allow output width to exceed 80 characters\n\
2619 @<file> Read options from <file>\n\
2620 -H --help Display this information\n\
2621 -v --version Display the version number of readelf\n"));
2622 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2627 /* Record the fact that the user wants the contents of section number
2628 SECTION to be displayed using the method(s) encoded as flags bits
2629 in TYPE. Note, TYPE can be zero if we are creating the array for
2633 request_dump (unsigned int section
, int type
)
2635 if (section
>= num_dump_sects
)
2637 char *new_dump_sects
;
2639 new_dump_sects
= calloc (section
+ 1, 1);
2641 if (new_dump_sects
== NULL
)
2642 error (_("Out of memory allocating dump request table."));
2645 /* Copy current flag settings. */
2646 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2650 dump_sects
= new_dump_sects
;
2651 num_dump_sects
= section
+ 1;
2656 dump_sects
[section
] |= type
;
2662 parse_args (int argc
, char **argv
)
2669 while ((c
= getopt_long
2670 (argc
, argv
, "ersuahnldSDAINtgw::x:i:vVWH", options
, NULL
)) != EOF
)
2691 do_section_groups
++;
2699 do_section_groups
++;
2704 do_section_details
++;
2746 section
= strtoul (optarg
, & cp
, 0);
2747 if (! *cp
&& section
>= 0)
2749 request_dump (section
, HEX_DUMP
);
2759 unsigned int index
= 0;
2763 while (optarg
[index
])
2764 switch (optarg
[index
++])
2773 do_debug_abbrevs
= 1;
2783 do_debug_pubnames
= 1;
2787 do_debug_aranges
= 1;
2791 do_debug_ranges
= 1;
2795 do_debug_frames_interp
= 1;
2797 do_debug_frames
= 1;
2802 do_debug_macinfo
= 1;
2816 warn (_("Unrecognized debug option '%s'\n"), optarg
);
2821 case OPTION_DEBUG_DUMP
:
2829 const char * option
;
2832 debug_dump_long_opts
;
2834 debug_dump_long_opts opts_table
[] =
2836 /* Please keep this table alpha- sorted. */
2837 { "Ranges", & do_debug_ranges
},
2838 { "abbrev", & do_debug_abbrevs
},
2839 { "aranges", & do_debug_aranges
},
2840 { "frames", & do_debug_frames
},
2841 { "frames-interp", & do_debug_frames_interp
},
2842 { "info", & do_debug_info
},
2843 { "line", & do_debug_lines
},
2844 { "loc", & do_debug_loc
},
2845 { "macro", & do_debug_macinfo
},
2846 { "pubnames", & do_debug_pubnames
},
2847 /* This entry is for compatability
2848 with earlier versions of readelf. */
2849 { "ranges", & do_debug_aranges
},
2850 { "str", & do_debug_str
},
2861 debug_dump_long_opts
* entry
;
2863 for (entry
= opts_table
; entry
->option
; entry
++)
2865 size_t len
= strlen (entry
->option
);
2867 if (strneq (p
, entry
->option
, len
)
2868 && (p
[len
] == ',' || p
[len
] == '\0'))
2870 * entry
->variable
= 1;
2872 /* The --debug-dump=frames-interp option also
2873 enables the --debug-dump=frames option. */
2874 if (do_debug_frames_interp
)
2875 do_debug_frames
= 1;
2882 if (entry
->option
== NULL
)
2884 warn (_("Unrecognized debug option '%s'\n"), p
);
2885 p
= strchr (p
, ',');
2895 #ifdef SUPPORT_DISASSEMBLY
2898 section
= strtoul (optarg
, & cp
, 0);
2899 if (! *cp
&& section
>= 0)
2901 request_dump (section
, DISASS_DUMP
);
2907 print_version (program_name
);
2917 /* xgettext:c-format */
2918 error (_("Invalid option '-%c'\n"), c
);
2925 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
2926 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2927 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
2928 && !do_section_groups
)
2932 warn (_("Nothing to do.\n"));
2938 get_elf_class (unsigned int elf_class
)
2940 static char buff
[32];
2944 case ELFCLASSNONE
: return _("none");
2945 case ELFCLASS32
: return "ELF32";
2946 case ELFCLASS64
: return "ELF64";
2948 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), elf_class
);
2954 get_data_encoding (unsigned int encoding
)
2956 static char buff
[32];
2960 case ELFDATANONE
: return _("none");
2961 case ELFDATA2LSB
: return _("2's complement, little endian");
2962 case ELFDATA2MSB
: return _("2's complement, big endian");
2964 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), encoding
);
2969 /* Decode the data held in 'elf_header'. */
2972 process_file_header (void)
2974 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2975 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
2976 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
2977 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
2980 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2988 printf (_("ELF Header:\n"));
2989 printf (_(" Magic: "));
2990 for (i
= 0; i
< EI_NIDENT
; i
++)
2991 printf ("%2.2x ", elf_header
.e_ident
[i
]);
2993 printf (_(" Class: %s\n"),
2994 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
2995 printf (_(" Data: %s\n"),
2996 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
2997 printf (_(" Version: %d %s\n"),
2998 elf_header
.e_ident
[EI_VERSION
],
2999 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
3001 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
3004 printf (_(" OS/ABI: %s\n"),
3005 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
3006 printf (_(" ABI Version: %d\n"),
3007 elf_header
.e_ident
[EI_ABIVERSION
]);
3008 printf (_(" Type: %s\n"),
3009 get_file_type (elf_header
.e_type
));
3010 printf (_(" Machine: %s\n"),
3011 get_machine_name (elf_header
.e_machine
));
3012 printf (_(" Version: 0x%lx\n"),
3013 (unsigned long) elf_header
.e_version
);
3015 printf (_(" Entry point address: "));
3016 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3017 printf (_("\n Start of program headers: "));
3018 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3019 printf (_(" (bytes into file)\n Start of section headers: "));
3020 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
3021 printf (_(" (bytes into file)\n"));
3023 printf (_(" Flags: 0x%lx%s\n"),
3024 (unsigned long) elf_header
.e_flags
,
3025 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
3026 printf (_(" Size of this header: %ld (bytes)\n"),
3027 (long) elf_header
.e_ehsize
);
3028 printf (_(" Size of program headers: %ld (bytes)\n"),
3029 (long) elf_header
.e_phentsize
);
3030 printf (_(" Number of program headers: %ld\n"),
3031 (long) elf_header
.e_phnum
);
3032 printf (_(" Size of section headers: %ld (bytes)\n"),
3033 (long) elf_header
.e_shentsize
);
3034 printf (_(" Number of section headers: %ld"),
3035 (long) elf_header
.e_shnum
);
3036 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
3037 printf (" (%ld)", (long) section_headers
[0].sh_size
);
3038 putc ('\n', stdout
);
3039 printf (_(" Section header string table index: %ld"),
3040 (long) elf_header
.e_shstrndx
);
3041 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
3042 printf (" (%ld)", (long) section_headers
[0].sh_link
);
3043 putc ('\n', stdout
);
3046 if (section_headers
!= NULL
)
3048 if (elf_header
.e_shnum
== 0)
3049 elf_header
.e_shnum
= section_headers
[0].sh_size
;
3050 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
3051 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
3052 free (section_headers
);
3053 section_headers
= NULL
;
3061 get_32bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3063 Elf32_External_Phdr
*phdrs
;
3064 Elf32_External_Phdr
*external
;
3065 Elf_Internal_Phdr
*internal
;
3068 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3069 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3070 _("program headers"));
3074 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3075 i
< elf_header
.e_phnum
;
3076 i
++, internal
++, external
++)
3078 internal
->p_type
= BYTE_GET (external
->p_type
);
3079 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3080 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3081 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3082 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3083 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3084 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3085 internal
->p_align
= BYTE_GET (external
->p_align
);
3094 get_64bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3096 Elf64_External_Phdr
*phdrs
;
3097 Elf64_External_Phdr
*external
;
3098 Elf_Internal_Phdr
*internal
;
3101 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3102 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3103 _("program headers"));
3107 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3108 i
< elf_header
.e_phnum
;
3109 i
++, internal
++, external
++)
3111 internal
->p_type
= BYTE_GET (external
->p_type
);
3112 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3113 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3114 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3115 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3116 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3117 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3118 internal
->p_align
= BYTE_GET (external
->p_align
);
3126 /* Returns 1 if the program headers were read into `program_headers'. */
3129 get_program_headers (FILE *file
)
3131 Elf_Internal_Phdr
*phdrs
;
3133 /* Check cache of prior read. */
3134 if (program_headers
!= NULL
)
3137 phdrs
= cmalloc (elf_header
.e_phnum
, sizeof (Elf_Internal_Phdr
));
3141 error (_("Out of memory\n"));
3146 ? get_32bit_program_headers (file
, phdrs
)
3147 : get_64bit_program_headers (file
, phdrs
))
3149 program_headers
= phdrs
;
3157 /* Returns 1 if the program headers were loaded. */
3160 process_program_headers (FILE *file
)
3162 Elf_Internal_Phdr
*segment
;
3165 if (elf_header
.e_phnum
== 0)
3168 printf (_("\nThere are no program headers in this file.\n"));
3172 if (do_segments
&& !do_header
)
3174 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3175 printf (_("Entry point "));
3176 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3177 printf (_("\nThere are %d program headers, starting at offset "),
3178 elf_header
.e_phnum
);
3179 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3183 if (! get_program_headers (file
))
3188 if (elf_header
.e_phnum
> 1)
3189 printf (_("\nProgram Headers:\n"));
3191 printf (_("\nProgram Headers:\n"));
3195 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3198 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3202 (_(" Type Offset VirtAddr PhysAddr\n"));
3204 (_(" FileSiz MemSiz Flags Align\n"));
3211 for (i
= 0, segment
= program_headers
;
3212 i
< elf_header
.e_phnum
;
3217 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3221 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3222 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3223 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3224 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3225 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3227 (segment
->p_flags
& PF_R
? 'R' : ' '),
3228 (segment
->p_flags
& PF_W
? 'W' : ' '),
3229 (segment
->p_flags
& PF_X
? 'E' : ' '));
3230 printf ("%#lx", (unsigned long) segment
->p_align
);
3234 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3235 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3238 print_vma (segment
->p_offset
, FULL_HEX
);
3242 print_vma (segment
->p_vaddr
, FULL_HEX
);
3244 print_vma (segment
->p_paddr
, FULL_HEX
);
3247 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3248 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3251 print_vma (segment
->p_filesz
, FULL_HEX
);
3255 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3256 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3259 print_vma (segment
->p_offset
, FULL_HEX
);
3263 (segment
->p_flags
& PF_R
? 'R' : ' '),
3264 (segment
->p_flags
& PF_W
? 'W' : ' '),
3265 (segment
->p_flags
& PF_X
? 'E' : ' '));
3267 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3268 printf ("%#lx", (unsigned long) segment
->p_align
);
3271 print_vma (segment
->p_align
, PREFIX_HEX
);
3276 print_vma (segment
->p_offset
, FULL_HEX
);
3278 print_vma (segment
->p_vaddr
, FULL_HEX
);
3280 print_vma (segment
->p_paddr
, FULL_HEX
);
3282 print_vma (segment
->p_filesz
, FULL_HEX
);
3284 print_vma (segment
->p_memsz
, FULL_HEX
);
3286 (segment
->p_flags
& PF_R
? 'R' : ' '),
3287 (segment
->p_flags
& PF_W
? 'W' : ' '),
3288 (segment
->p_flags
& PF_X
? 'E' : ' '));
3289 print_vma (segment
->p_align
, HEX
);
3293 switch (segment
->p_type
)
3297 error (_("more than one dynamic segment\n"));
3299 /* Try to locate the .dynamic section. If there is
3300 a section header table, we can easily locate it. */
3301 if (section_headers
!= NULL
)
3303 Elf_Internal_Shdr
*sec
;
3305 sec
= find_section (".dynamic");
3306 if (sec
== NULL
|| sec
->sh_size
== 0)
3308 error (_("no .dynamic section in the dynamic segment"));
3312 dynamic_addr
= sec
->sh_offset
;
3313 dynamic_size
= sec
->sh_size
;
3315 if (dynamic_addr
< segment
->p_offset
3316 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
3317 warn (_("the .dynamic section is not contained within the dynamic segment"));
3318 else if (dynamic_addr
> segment
->p_offset
)
3319 warn (_("the .dynamic section is not the first section in the dynamic segment."));
3323 /* Otherwise, we can only assume that the .dynamic
3324 section is the first section in the DYNAMIC segment. */
3325 dynamic_addr
= segment
->p_offset
;
3326 dynamic_size
= segment
->p_filesz
;
3331 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3333 error (_("Unable to find program interpreter name\n"));
3336 program_interpreter
[0] = 0;
3337 fscanf (file
, "%63s", program_interpreter
);
3340 printf (_("\n [Requesting program interpreter: %s]"),
3341 program_interpreter
);
3347 putc ('\n', stdout
);
3350 if (do_segments
&& section_headers
!= NULL
&& string_table
!= NULL
)
3352 printf (_("\n Section to Segment mapping:\n"));
3353 printf (_(" Segment Sections...\n"));
3355 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3358 Elf_Internal_Shdr
*section
;
3360 segment
= program_headers
+ i
;
3361 section
= section_headers
;
3363 printf (" %2.2d ", i
);
3365 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3367 if (section
->sh_size
> 0
3368 /* Compare allocated sections by VMA, unallocated
3369 sections by file offset. */
3370 && (section
->sh_flags
& SHF_ALLOC
3371 ? (section
->sh_addr
>= segment
->p_vaddr
3372 && section
->sh_addr
+ section
->sh_size
3373 <= segment
->p_vaddr
+ segment
->p_memsz
)
3374 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
3375 && (section
->sh_offset
+ section
->sh_size
3376 <= segment
->p_offset
+ segment
->p_filesz
)))
3377 /* .tbss is special. It doesn't contribute memory space
3378 to normal segments. */
3379 && (!((section
->sh_flags
& SHF_TLS
) != 0
3380 && section
->sh_type
== SHT_NOBITS
)
3381 || segment
->p_type
== PT_TLS
))
3382 printf ("%s ", SECTION_NAME (section
));
3393 /* Find the file offset corresponding to VMA by using the program headers. */
3396 offset_from_vma (FILE *file
, bfd_vma vma
, bfd_size_type size
)
3398 Elf_Internal_Phdr
*seg
;
3400 if (! get_program_headers (file
))
3402 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3406 for (seg
= program_headers
;
3407 seg
< program_headers
+ elf_header
.e_phnum
;
3410 if (seg
->p_type
!= PT_LOAD
)
3413 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3414 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3415 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3418 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3425 get_32bit_section_headers (FILE *file
, unsigned int num
)
3427 Elf32_External_Shdr
*shdrs
;
3428 Elf_Internal_Shdr
*internal
;
3431 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3432 elf_header
.e_shentsize
, num
, _("section headers"));
3436 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3438 if (section_headers
== NULL
)
3440 error (_("Out of memory\n"));
3444 for (i
= 0, internal
= section_headers
;
3448 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3449 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3450 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3451 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3452 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3453 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3454 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3455 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3456 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3457 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3466 get_64bit_section_headers (FILE *file
, unsigned int num
)
3468 Elf64_External_Shdr
*shdrs
;
3469 Elf_Internal_Shdr
*internal
;
3472 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3473 elf_header
.e_shentsize
, num
, _("section headers"));
3477 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3479 if (section_headers
== NULL
)
3481 error (_("Out of memory\n"));
3485 for (i
= 0, internal
= section_headers
;
3489 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3490 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3491 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3492 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3493 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3494 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3495 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3496 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3497 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3498 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3506 static Elf_Internal_Sym
*
3507 get_32bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3509 unsigned long number
;
3510 Elf32_External_Sym
*esyms
;
3511 Elf_External_Sym_Shndx
*shndx
;
3512 Elf_Internal_Sym
*isyms
;
3513 Elf_Internal_Sym
*psym
;
3516 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3522 if (symtab_shndx_hdr
!= NULL
3523 && (symtab_shndx_hdr
->sh_link
3524 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3526 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3527 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3535 number
= section
->sh_size
/ section
->sh_entsize
;
3536 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3540 error (_("Out of memory\n"));
3547 for (j
= 0, psym
= isyms
;
3551 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3552 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3553 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3554 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3555 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3557 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3558 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3559 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3569 static Elf_Internal_Sym
*
3570 get_64bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3572 unsigned long number
;
3573 Elf64_External_Sym
*esyms
;
3574 Elf_External_Sym_Shndx
*shndx
;
3575 Elf_Internal_Sym
*isyms
;
3576 Elf_Internal_Sym
*psym
;
3579 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3585 if (symtab_shndx_hdr
!= NULL
3586 && (symtab_shndx_hdr
->sh_link
3587 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3589 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3590 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3598 number
= section
->sh_size
/ section
->sh_entsize
;
3599 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3603 error (_("Out of memory\n"));
3610 for (j
= 0, psym
= isyms
;
3614 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3615 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3616 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3617 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3618 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3620 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3621 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3622 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3633 get_elf_section_flags (bfd_vma sh_flags
)
3635 static char buff
[1024];
3637 int field_size
= is_32bit_elf
? 8 : 16;
3638 int index
, size
= sizeof (buff
) - (field_size
+ 4 + 1);
3639 bfd_vma os_flags
= 0;
3640 bfd_vma proc_flags
= 0;
3641 bfd_vma unknown_flags
= 0;
3655 { "LINK ORDER", 10 },
3656 { "OS NONCONF", 10 },
3661 if (do_section_details
)
3663 sprintf (buff
, "[%*.*lx]: ",
3664 field_size
, field_size
, (unsigned long) sh_flags
);
3665 p
+= field_size
+ 4;
3672 flag
= sh_flags
& - sh_flags
;
3675 if (do_section_details
)
3679 case SHF_WRITE
: index
= 0; break;
3680 case SHF_ALLOC
: index
= 1; break;
3681 case SHF_EXECINSTR
: index
= 2; break;
3682 case SHF_MERGE
: index
= 3; break;
3683 case SHF_STRINGS
: index
= 4; break;
3684 case SHF_INFO_LINK
: index
= 5; break;
3685 case SHF_LINK_ORDER
: index
= 6; break;
3686 case SHF_OS_NONCONFORMING
: index
= 7; break;
3687 case SHF_GROUP
: index
= 8; break;
3688 case SHF_TLS
: index
= 9; break;
3697 if (p
!= buff
+ field_size
+ 4)
3699 if (size
< (10 + 2))
3706 size
-= flags
[index
].len
;
3707 p
= stpcpy (p
, flags
[index
].str
);
3709 else if (flag
& SHF_MASKOS
)
3711 else if (flag
& SHF_MASKPROC
)
3714 unknown_flags
|= flag
;
3720 case SHF_WRITE
: *p
= 'W'; break;
3721 case SHF_ALLOC
: *p
= 'A'; break;
3722 case SHF_EXECINSTR
: *p
= 'X'; break;
3723 case SHF_MERGE
: *p
= 'M'; break;
3724 case SHF_STRINGS
: *p
= 'S'; break;
3725 case SHF_INFO_LINK
: *p
= 'I'; break;
3726 case SHF_LINK_ORDER
: *p
= 'L'; break;
3727 case SHF_OS_NONCONFORMING
: *p
= 'O'; break;
3728 case SHF_GROUP
: *p
= 'G'; break;
3729 case SHF_TLS
: *p
= 'T'; break;
3732 if (elf_header
.e_machine
== EM_X86_64
3733 && flag
== SHF_X86_64_LARGE
)
3735 else if (flag
& SHF_MASKOS
)
3738 sh_flags
&= ~ SHF_MASKOS
;
3740 else if (flag
& SHF_MASKPROC
)
3743 sh_flags
&= ~ SHF_MASKPROC
;
3753 if (do_section_details
)
3757 size
-= 5 + field_size
;
3758 if (p
!= buff
+ field_size
+ 4)
3766 sprintf (p
, "OS (%*.*lx)", field_size
, field_size
,
3767 (unsigned long) os_flags
);
3768 p
+= 5 + field_size
;
3772 size
-= 7 + field_size
;
3773 if (p
!= buff
+ field_size
+ 4)
3781 sprintf (p
, "PROC (%*.*lx)", field_size
, field_size
,
3782 (unsigned long) proc_flags
);
3783 p
+= 7 + field_size
;
3787 size
-= 10 + field_size
;
3788 if (p
!= buff
+ field_size
+ 4)
3796 sprintf (p
, "UNKNOWN (%*.*lx)", field_size
, field_size
,
3797 (unsigned long) unknown_flags
);
3798 p
+= 10 + field_size
;
3807 process_section_headers (FILE *file
)
3809 Elf_Internal_Shdr
*section
;
3812 section_headers
= NULL
;
3814 if (elf_header
.e_shnum
== 0)
3817 printf (_("\nThere are no sections in this file.\n"));
3822 if (do_sections
&& !do_header
)
3823 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3824 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3828 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3831 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3834 /* Read in the string table, so that we have names to display. */
3835 if (SECTION_HEADER_INDEX (elf_header
.e_shstrndx
) < elf_header
.e_shnum
)
3837 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3839 if (section
->sh_size
!= 0)
3841 string_table
= get_data (NULL
, file
, section
->sh_offset
,
3842 1, section
->sh_size
, _("string table"));
3844 string_table_length
= string_table
!= NULL
? section
->sh_size
: 0;
3848 /* Scan the sections for the dynamic symbol table
3849 and dynamic string table and debug sections. */
3850 dynamic_symbols
= NULL
;
3851 dynamic_strings
= NULL
;
3852 dynamic_syminfo
= NULL
;
3853 symtab_shndx_hdr
= NULL
;
3855 eh_addr_size
= is_32bit_elf
? 4 : 8;
3856 switch (elf_header
.e_machine
)
3859 case EM_MIPS_RS3_LE
:
3860 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
3861 FDE addresses. However, the ABI also has a semi-official ILP32
3862 variant for which the normal FDE address size rules apply.
3864 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
3865 section, where XX is the size of longs in bits. Unfortunately,
3866 earlier compilers provided no way of distinguishing ILP32 objects
3867 from LP64 objects, so if there's any doubt, we should assume that
3868 the official LP64 form is being used. */
3869 if ((elf_header
.e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
3870 && find_section (".gcc_compiled_long32") == NULL
)
3875 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
3878 size_t expected_entsize \
3879 = is_32bit_elf ? size32 : size64; \
3880 if (section->sh_entsize != expected_entsize) \
3881 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
3882 i, (unsigned long int) section->sh_entsize, \
3883 (unsigned long int) expected_entsize); \
3884 section->sh_entsize = expected_entsize; \
3887 #define CHECK_ENTSIZE(section, i, type) \
3888 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
3889 sizeof (Elf64_External_##type))
3891 for (i
= 0, section
= section_headers
;
3892 i
< elf_header
.e_shnum
;
3895 char *name
= SECTION_NAME (section
);
3897 if (section
->sh_type
== SHT_DYNSYM
)
3899 if (dynamic_symbols
!= NULL
)
3901 error (_("File contains multiple dynamic symbol tables\n"));
3905 CHECK_ENTSIZE (section
, i
, Sym
);
3906 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3907 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3909 else if (section
->sh_type
== SHT_STRTAB
3910 && streq (name
, ".dynstr"))
3912 if (dynamic_strings
!= NULL
)
3914 error (_("File contains multiple dynamic string tables\n"));
3918 dynamic_strings
= get_data (NULL
, file
, section
->sh_offset
,
3919 1, section
->sh_size
, _("dynamic strings"));
3920 dynamic_strings_length
= section
->sh_size
;
3922 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
3924 if (symtab_shndx_hdr
!= NULL
)
3926 error (_("File contains multiple symtab shndx tables\n"));
3929 symtab_shndx_hdr
= section
;
3931 else if (section
->sh_type
== SHT_SYMTAB
)
3932 CHECK_ENTSIZE (section
, i
, Sym
);
3933 else if (section
->sh_type
== SHT_GROUP
)
3934 CHECK_ENTSIZE_VALUES (section
, i
, GRP_ENTRY_SIZE
, GRP_ENTRY_SIZE
);
3935 else if (section
->sh_type
== SHT_REL
)
3936 CHECK_ENTSIZE (section
, i
, Rel
);
3937 else if (section
->sh_type
== SHT_RELA
)
3938 CHECK_ENTSIZE (section
, i
, Rela
);
3939 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
3940 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
3941 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
3942 || do_debug_loc
|| do_debug_ranges
)
3943 && strneq (name
, ".debug_", 7))
3948 || (do_debug_info
&& streq (name
, "info"))
3949 || (do_debug_abbrevs
&& streq (name
, "abbrev"))
3950 || (do_debug_lines
&& streq (name
, "line"))
3951 || (do_debug_pubnames
&& streq (name
, "pubnames"))
3952 || (do_debug_aranges
&& streq (name
, "aranges"))
3953 || (do_debug_ranges
&& streq (name
, "ranges"))
3954 || (do_debug_frames
&& streq (name
, "frame"))
3955 || (do_debug_macinfo
&& streq (name
, "macinfo"))
3956 || (do_debug_str
&& streq (name
, "str"))
3957 || (do_debug_loc
&& streq (name
, "loc"))
3959 request_dump (i
, DEBUG_DUMP
);
3961 /* linkonce section to be combined with .debug_info at link time. */
3962 else if ((do_debugging
|| do_debug_info
)
3963 && strneq (name
, ".gnu.linkonce.wi.", 17))
3964 request_dump (i
, DEBUG_DUMP
);
3965 else if (do_debug_frames
&& streq (name
, ".eh_frame"))
3966 request_dump (i
, DEBUG_DUMP
);
3972 if (elf_header
.e_shnum
> 1)
3973 printf (_("\nSection Headers:\n"));
3975 printf (_("\nSection Header:\n"));
3979 if (do_section_details
)
3981 printf (_(" [Nr] Name\n"));
3982 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
3986 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3990 if (do_section_details
)
3992 printf (_(" [Nr] Name\n"));
3993 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
3997 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4001 if (do_section_details
)
4003 printf (_(" [Nr] Name\n"));
4004 printf (_(" Type Address Offset Link\n"));
4005 printf (_(" Size EntSize Info Align\n"));
4009 printf (_(" [Nr] Name Type Address Offset\n"));
4010 printf (_(" Size EntSize Flags Link Info Align\n"));
4014 if (do_section_details
)
4015 printf (_(" Flags\n"));
4017 for (i
= 0, section
= section_headers
;
4018 i
< elf_header
.e_shnum
;
4021 if (do_section_details
)
4023 printf (" [%2u] %s\n",
4024 SECTION_HEADER_NUM (i
),
4025 SECTION_NAME (section
));
4026 if (is_32bit_elf
|| do_wide
)
4027 printf (" %-15.15s ",
4028 get_section_type_name (section
->sh_type
));
4031 printf (" [%2u] %-17.17s %-15.15s ",
4032 SECTION_HEADER_NUM (i
),
4033 SECTION_NAME (section
),
4034 get_section_type_name (section
->sh_type
));
4038 print_vma (section
->sh_addr
, LONG_HEX
);
4040 printf ( " %6.6lx %6.6lx %2.2lx",
4041 (unsigned long) section
->sh_offset
,
4042 (unsigned long) section
->sh_size
,
4043 (unsigned long) section
->sh_entsize
);
4045 if (do_section_details
)
4046 fputs (" ", stdout
);
4048 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4050 printf ("%2ld %3lu %2ld\n",
4051 (unsigned long) section
->sh_link
,
4052 (unsigned long) section
->sh_info
,
4053 (unsigned long) section
->sh_addralign
);
4057 print_vma (section
->sh_addr
, LONG_HEX
);
4059 if ((long) section
->sh_offset
== section
->sh_offset
)
4060 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
4064 print_vma (section
->sh_offset
, LONG_HEX
);
4067 if ((unsigned long) section
->sh_size
== section
->sh_size
)
4068 printf (" %6.6lx", (unsigned long) section
->sh_size
);
4072 print_vma (section
->sh_size
, LONG_HEX
);
4075 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
4076 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
4080 print_vma (section
->sh_entsize
, LONG_HEX
);
4083 if (do_section_details
)
4084 fputs (" ", stdout
);
4086 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4088 printf ("%2ld %3lu ",
4089 (unsigned long) section
->sh_link
,
4090 (unsigned long) section
->sh_info
);
4092 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
4093 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
4096 print_vma (section
->sh_addralign
, DEC
);
4100 else if (do_section_details
)
4102 printf (" %-15.15s ",
4103 get_section_type_name (section
->sh_type
));
4104 print_vma (section
->sh_addr
, LONG_HEX
);
4105 if ((long) section
->sh_offset
== section
->sh_offset
)
4106 printf (" %16.16lx", (unsigned long) section
->sh_offset
);
4110 print_vma (section
->sh_offset
, LONG_HEX
);
4112 printf (" %ld\n ", (unsigned long) section
->sh_link
);
4113 print_vma (section
->sh_size
, LONG_HEX
);
4115 print_vma (section
->sh_entsize
, LONG_HEX
);
4117 printf (" %-16lu %ld\n",
4118 (unsigned long) section
->sh_info
,
4119 (unsigned long) section
->sh_addralign
);
4124 print_vma (section
->sh_addr
, LONG_HEX
);
4125 if ((long) section
->sh_offset
== section
->sh_offset
)
4126 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
4130 print_vma (section
->sh_offset
, LONG_HEX
);
4133 print_vma (section
->sh_size
, LONG_HEX
);
4135 print_vma (section
->sh_entsize
, LONG_HEX
);
4137 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4139 printf (" %2ld %3lu %ld\n",
4140 (unsigned long) section
->sh_link
,
4141 (unsigned long) section
->sh_info
,
4142 (unsigned long) section
->sh_addralign
);
4145 if (do_section_details
)
4146 printf (" %s\n", get_elf_section_flags (section
->sh_flags
));
4149 if (!do_section_details
)
4150 printf (_("Key to Flags:\n\
4151 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4152 I (info), L (link order), G (group), x (unknown)\n\
4153 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4159 get_group_flags (unsigned int flags
)
4161 static char buff
[32];
4168 snprintf (buff
, sizeof (buff
), _("[<unknown>: 0x%x]"), flags
);
4175 process_section_groups (FILE *file
)
4177 Elf_Internal_Shdr
*section
;
4179 struct group
*group
;
4180 Elf_Internal_Shdr
*symtab_sec
, *strtab_sec
;
4181 Elf_Internal_Sym
*symtab
;
4185 /* Don't process section groups unless needed. */
4186 if (!do_unwind
&& !do_section_groups
)
4189 if (elf_header
.e_shnum
== 0)
4191 if (do_section_groups
)
4192 printf (_("\nThere are no sections in this file.\n"));
4197 if (section_headers
== NULL
)
4199 error (_("Section headers are not available!\n"));
4203 section_headers_groups
= calloc (elf_header
.e_shnum
,
4204 sizeof (struct group
*));
4206 if (section_headers_groups
== NULL
)
4208 error (_("Out of memory\n"));
4212 /* Scan the sections for the group section. */
4214 for (i
= 0, section
= section_headers
;
4215 i
< elf_header
.e_shnum
;
4217 if (section
->sh_type
== SHT_GROUP
)
4220 if (group_count
== 0)
4222 if (do_section_groups
)
4223 printf (_("\nThere are no section groups in this file.\n"));
4228 section_groups
= calloc (group_count
, sizeof (struct group
));
4230 if (section_groups
== NULL
)
4232 error (_("Out of memory\n"));
4241 for (i
= 0, section
= section_headers
, group
= section_groups
;
4242 i
< elf_header
.e_shnum
;
4245 if (section
->sh_type
== SHT_GROUP
)
4247 char *name
= SECTION_NAME (section
);
4249 unsigned char *start
, *indices
;
4250 unsigned int entry
, j
, size
;
4251 Elf_Internal_Shdr
*sec
;
4252 Elf_Internal_Sym
*sym
;
4254 /* Get the symbol table. */
4255 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
4256 || ((sec
= SECTION_HEADER (section
->sh_link
))->sh_type
4259 error (_("Bad sh_link in group section `%s'\n"), name
);
4263 if (symtab_sec
!= sec
)
4268 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
);
4271 sym
= symtab
+ section
->sh_info
;
4273 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4275 bfd_vma sec_index
= SECTION_HEADER_INDEX (sym
->st_shndx
);
4278 error (_("Bad sh_info in group section `%s'\n"), name
);
4282 group_name
= SECTION_NAME (section_headers
+ sec_index
);
4291 /* Get the string table. */
4292 if (SECTION_HEADER_INDEX (symtab_sec
->sh_link
)
4293 >= elf_header
.e_shnum
)
4302 != (sec
= SECTION_HEADER (symtab_sec
->sh_link
)))
4307 strtab
= get_data (NULL
, file
, strtab_sec
->sh_offset
,
4308 1, strtab_sec
->sh_size
,
4310 strtab_size
= strtab
!= NULL
? strtab_sec
->sh_size
: 0;
4312 group_name
= sym
->st_name
< strtab_size
4313 ? strtab
+ sym
->st_name
: "<corrupt>";
4316 start
= get_data (NULL
, file
, section
->sh_offset
,
4317 1, section
->sh_size
, _("section data"));
4320 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
4321 entry
= byte_get (indices
, 4);
4324 if (do_section_groups
)
4326 printf ("\n%s group section [%5u] `%s' [%s] contains %u sections:\n",
4327 get_group_flags (entry
), i
, name
, group_name
, size
);
4329 printf (_(" [Index] Name\n"));
4332 group
->group_index
= i
;
4334 for (j
= 0; j
< size
; j
++)
4336 struct group_list
*g
;
4338 entry
= byte_get (indices
, 4);
4341 if (SECTION_HEADER_INDEX (entry
) >= elf_header
.e_shnum
)
4343 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
4344 entry
, i
, elf_header
.e_shnum
- 1);
4347 else if (entry
>= SHN_LORESERVE
&& entry
<= SHN_HIRESERVE
)
4349 error (_("invalid section [%5u] in group section [%5u]\n"),
4354 if (section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4359 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
4361 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4366 /* Intel C/C++ compiler may put section 0 in a
4367 section group. We just warn it the first time
4368 and ignore it afterwards. */
4369 static int warned
= 0;
4372 error (_("section 0 in group section [%5u]\n"),
4373 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4379 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4382 if (do_section_groups
)
4384 sec
= SECTION_HEADER (entry
);
4385 printf (" [%5u] %s\n", entry
, SECTION_NAME (sec
));
4388 g
= xmalloc (sizeof (struct group_list
));
4389 g
->section_index
= entry
;
4390 g
->next
= group
->root
;
4414 } dynamic_relocations
[] =
4416 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
4417 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
4418 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
4421 /* Process the reloc section. */
4424 process_relocs (FILE *file
)
4426 unsigned long rel_size
;
4427 unsigned long rel_offset
;
4433 if (do_using_dynamic
)
4437 int has_dynamic_reloc
;
4440 has_dynamic_reloc
= 0;
4442 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
4444 is_rela
= dynamic_relocations
[i
].rela
;
4445 name
= dynamic_relocations
[i
].name
;
4446 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
4447 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
4449 has_dynamic_reloc
|= rel_size
;
4451 if (is_rela
== UNKNOWN
)
4453 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
4454 switch (dynamic_info
[DT_PLTREL
])
4468 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4469 name
, rel_offset
, rel_size
);
4471 dump_relocations (file
,
4472 offset_from_vma (file
, rel_offset
, rel_size
),
4474 dynamic_symbols
, num_dynamic_syms
,
4475 dynamic_strings
, dynamic_strings_length
, is_rela
);
4479 if (! has_dynamic_reloc
)
4480 printf (_("\nThere are no dynamic relocations in this file.\n"));
4484 Elf_Internal_Shdr
*section
;
4488 for (i
= 0, section
= section_headers
;
4489 i
< elf_header
.e_shnum
;
4492 if ( section
->sh_type
!= SHT_RELA
4493 && section
->sh_type
!= SHT_REL
)
4496 rel_offset
= section
->sh_offset
;
4497 rel_size
= section
->sh_size
;
4501 Elf_Internal_Shdr
*strsec
;
4504 printf (_("\nRelocation section "));
4506 if (string_table
== NULL
)
4507 printf ("%d", section
->sh_name
);
4509 printf (_("'%s'"), SECTION_NAME (section
));
4511 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4512 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4514 is_rela
= section
->sh_type
== SHT_RELA
;
4516 if (section
->sh_link
4517 && SECTION_HEADER_INDEX (section
->sh_link
)
4518 < elf_header
.e_shnum
)
4520 Elf_Internal_Shdr
*symsec
;
4521 Elf_Internal_Sym
*symtab
;
4522 unsigned long nsyms
;
4523 unsigned long strtablen
= 0;
4524 char *strtab
= NULL
;
4526 symsec
= SECTION_HEADER (section
->sh_link
);
4527 if (symsec
->sh_type
!= SHT_SYMTAB
4528 && symsec
->sh_type
!= SHT_DYNSYM
)
4531 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4532 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4537 if (SECTION_HEADER_INDEX (symsec
->sh_link
)
4538 < elf_header
.e_shnum
)
4540 strsec
= SECTION_HEADER (symsec
->sh_link
);
4542 strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4545 strtablen
= strtab
== NULL
? 0 : strsec
->sh_size
;
4548 dump_relocations (file
, rel_offset
, rel_size
,
4549 symtab
, nsyms
, strtab
, strtablen
, is_rela
);
4555 dump_relocations (file
, rel_offset
, rel_size
,
4556 NULL
, 0, NULL
, 0, is_rela
);
4563 printf (_("\nThere are no relocations in this file.\n"));
4569 /* Process the unwind section. */
4571 #include "unwind-ia64.h"
4573 /* An absolute address consists of a section and an offset. If the
4574 section is NULL, the offset itself is the address, otherwise, the
4575 address equals to LOAD_ADDRESS(section) + offset. */
4579 unsigned short section
;
4583 #define ABSADDR(a) \
4585 ? section_headers [(a).section].sh_addr + (a).offset \
4588 struct ia64_unw_aux_info
4590 struct ia64_unw_table_entry
4592 struct absaddr start
;
4594 struct absaddr info
;
4596 *table
; /* Unwind table. */
4597 unsigned long table_len
; /* Length of unwind table. */
4598 unsigned char *info
; /* Unwind info. */
4599 unsigned long info_size
; /* Size of unwind info. */
4600 bfd_vma info_addr
; /* starting address of unwind info. */
4601 bfd_vma seg_base
; /* Starting address of segment. */
4602 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4603 unsigned long nsyms
; /* Number of symbols. */
4604 char *strtab
; /* The string table. */
4605 unsigned long strtab_size
; /* Size of string table. */
4609 find_symbol_for_address (Elf_Internal_Sym
*symtab
,
4610 unsigned long nsyms
,
4612 unsigned long strtab_size
,
4613 struct absaddr addr
,
4614 const char **symname
,
4617 bfd_vma dist
= 0x100000;
4618 Elf_Internal_Sym
*sym
, *best
= NULL
;
4621 for (i
= 0, sym
= symtab
; i
< nsyms
; ++i
, ++sym
)
4623 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
4624 && sym
->st_name
!= 0
4625 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
4626 && addr
.offset
>= sym
->st_value
4627 && addr
.offset
- sym
->st_value
< dist
)
4630 dist
= addr
.offset
- sym
->st_value
;
4637 *symname
= (best
->st_name
>= strtab_size
4638 ? "<corrupt>" : strtab
+ best
->st_name
);
4643 *offset
= addr
.offset
;
4647 dump_ia64_unwind (struct ia64_unw_aux_info
*aux
)
4649 struct ia64_unw_table_entry
*tp
;
4652 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4656 const unsigned char *dp
;
4657 const unsigned char *head
;
4658 const char *procname
;
4660 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
4661 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
4663 fputs ("\n<", stdout
);
4667 fputs (procname
, stdout
);
4670 printf ("+%lx", (unsigned long) offset
);
4673 fputs (">: [", stdout
);
4674 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4675 fputc ('-', stdout
);
4676 print_vma (tp
->end
.offset
, PREFIX_HEX
);
4677 printf ("], info at +0x%lx\n",
4678 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
4680 head
= aux
->info
+ (ABSADDR (tp
->info
) - aux
->info_addr
);
4681 stamp
= byte_get ((unsigned char *) head
, sizeof (stamp
));
4683 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4684 (unsigned) UNW_VER (stamp
),
4685 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
4686 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
4687 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
4688 (unsigned long) (eh_addr_size
* UNW_LENGTH (stamp
)));
4690 if (UNW_VER (stamp
) != 1)
4692 printf ("\tUnknown version.\n");
4697 for (dp
= head
+ 8; dp
< head
+ 8 + eh_addr_size
* UNW_LENGTH (stamp
);)
4698 dp
= unw_decode (dp
, in_body
, & in_body
);
4703 slurp_ia64_unwind_table (FILE *file
,
4704 struct ia64_unw_aux_info
*aux
,
4705 Elf_Internal_Shdr
*sec
)
4707 unsigned long size
, nrelas
, i
;
4708 Elf_Internal_Phdr
*seg
;
4709 struct ia64_unw_table_entry
*tep
;
4710 Elf_Internal_Shdr
*relsec
;
4711 Elf_Internal_Rela
*rela
, *rp
;
4712 unsigned char *table
, *tp
;
4713 Elf_Internal_Sym
*sym
;
4714 const char *relname
;
4716 /* First, find the starting address of the segment that includes
4719 if (elf_header
.e_phnum
)
4721 if (! get_program_headers (file
))
4724 for (seg
= program_headers
;
4725 seg
< program_headers
+ elf_header
.e_phnum
;
4728 if (seg
->p_type
!= PT_LOAD
)
4731 if (sec
->sh_addr
>= seg
->p_vaddr
4732 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
4734 aux
->seg_base
= seg
->p_vaddr
;
4740 /* Second, build the unwind table from the contents of the unwind section: */
4741 size
= sec
->sh_size
;
4742 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
4746 aux
->table
= xcmalloc (size
/ (3 * eh_addr_size
), sizeof (aux
->table
[0]));
4748 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * eh_addr_size
, ++tep
)
4750 tep
->start
.section
= SHN_UNDEF
;
4751 tep
->end
.section
= SHN_UNDEF
;
4752 tep
->info
.section
= SHN_UNDEF
;
4755 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
4756 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
4757 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
4761 tep
->start
.offset
= BYTE_GET ((unsigned char *) tp
+ 0);
4762 tep
->end
.offset
= BYTE_GET ((unsigned char *) tp
+ 8);
4763 tep
->info
.offset
= BYTE_GET ((unsigned char *) tp
+ 16);
4765 tep
->start
.offset
+= aux
->seg_base
;
4766 tep
->end
.offset
+= aux
->seg_base
;
4767 tep
->info
.offset
+= aux
->seg_base
;
4771 /* Third, apply any relocations to the unwind table: */
4773 for (relsec
= section_headers
;
4774 relsec
< section_headers
+ elf_header
.e_shnum
;
4777 if (relsec
->sh_type
!= SHT_RELA
4778 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
4779 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4782 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
4786 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
4790 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
4791 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
4795 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
4796 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
4799 if (! strneq (relname
, "R_IA64_SEGREL", 13))
4801 warn (_("Skipping unexpected relocation type %s\n"), relname
);
4805 i
= rp
->r_offset
/ (3 * eh_addr_size
);
4807 switch (rp
->r_offset
/eh_addr_size
% 3)
4810 aux
->table
[i
].start
.section
= sym
->st_shndx
;
4811 aux
->table
[i
].start
.offset
+= rp
->r_addend
+ sym
->st_value
;
4814 aux
->table
[i
].end
.section
= sym
->st_shndx
;
4815 aux
->table
[i
].end
.offset
+= rp
->r_addend
+ sym
->st_value
;
4818 aux
->table
[i
].info
.section
= sym
->st_shndx
;
4819 aux
->table
[i
].info
.offset
+= rp
->r_addend
+ sym
->st_value
;
4829 aux
->table_len
= size
/ (3 * eh_addr_size
);
4834 ia64_process_unwind (FILE *file
)
4836 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
4837 unsigned long i
, unwcount
= 0, unwstart
= 0;
4838 struct ia64_unw_aux_info aux
;
4840 memset (& aux
, 0, sizeof (aux
));
4842 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
4844 if (sec
->sh_type
== SHT_SYMTAB
4845 && SECTION_HEADER_INDEX (sec
->sh_link
) < elf_header
.e_shnum
)
4847 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
4848 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
4850 strsec
= SECTION_HEADER (sec
->sh_link
);
4851 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4852 1, strsec
->sh_size
, _("string table"));
4853 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
4855 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4860 printf (_("\nThere are no unwind sections in this file.\n"));
4862 while (unwcount
-- > 0)
4867 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
4868 i
< elf_header
.e_shnum
; ++i
, ++sec
)
4869 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4876 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
4878 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
4880 /* We need to find which section group it is in. */
4881 struct group_list
*g
= section_headers_groups
[i
]->root
;
4883 for (; g
!= NULL
; g
= g
->next
)
4885 sec
= SECTION_HEADER (g
->section_index
);
4887 if (streq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
))
4892 i
= elf_header
.e_shnum
;
4894 else if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
, len
))
4896 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
4897 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
4898 suffix
= SECTION_NAME (unwsec
) + len
;
4899 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4901 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info_once
, len2
)
4902 && streq (SECTION_NAME (sec
) + len2
, suffix
))
4907 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4908 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
4909 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
4910 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
4912 if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
, len
))
4913 suffix
= SECTION_NAME (unwsec
) + len
;
4914 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4916 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
, len2
)
4917 && streq (SECTION_NAME (sec
) + len2
, suffix
))
4921 if (i
== elf_header
.e_shnum
)
4923 printf (_("\nCould not find unwind info section for "));
4925 if (string_table
== NULL
)
4926 printf ("%d", unwsec
->sh_name
);
4928 printf (_("'%s'"), SECTION_NAME (unwsec
));
4932 aux
.info_size
= sec
->sh_size
;
4933 aux
.info_addr
= sec
->sh_addr
;
4934 aux
.info
= get_data (NULL
, file
, sec
->sh_offset
, 1, aux
.info_size
,
4937 printf (_("\nUnwind section "));
4939 if (string_table
== NULL
)
4940 printf ("%d", unwsec
->sh_name
);
4942 printf (_("'%s'"), SECTION_NAME (unwsec
));
4944 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4945 (unsigned long) unwsec
->sh_offset
,
4946 (unsigned long) (unwsec
->sh_size
/ (3 * eh_addr_size
)));
4948 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
4950 if (aux
.table_len
> 0)
4951 dump_ia64_unwind (& aux
);
4954 free ((char *) aux
.table
);
4956 free ((char *) aux
.info
);
4965 free ((char *) aux
.strtab
);
4970 struct hppa_unw_aux_info
4972 struct hppa_unw_table_entry
4974 struct absaddr start
;
4976 unsigned int Cannot_unwind
:1; /* 0 */
4977 unsigned int Millicode
:1; /* 1 */
4978 unsigned int Millicode_save_sr0
:1; /* 2 */
4979 unsigned int Region_description
:2; /* 3..4 */
4980 unsigned int reserved1
:1; /* 5 */
4981 unsigned int Entry_SR
:1; /* 6 */
4982 unsigned int Entry_FR
:4; /* number saved */ /* 7..10 */
4983 unsigned int Entry_GR
:5; /* number saved */ /* 11..15 */
4984 unsigned int Args_stored
:1; /* 16 */
4985 unsigned int Variable_Frame
:1; /* 17 */
4986 unsigned int Separate_Package_Body
:1; /* 18 */
4987 unsigned int Frame_Extension_Millicode
:1; /* 19 */
4988 unsigned int Stack_Overflow_Check
:1; /* 20 */
4989 unsigned int Two_Instruction_SP_Increment
:1; /* 21 */
4990 unsigned int Ada_Region
:1; /* 22 */
4991 unsigned int cxx_info
:1; /* 23 */
4992 unsigned int cxx_try_catch
:1; /* 24 */
4993 unsigned int sched_entry_seq
:1; /* 25 */
4994 unsigned int reserved2
:1; /* 26 */
4995 unsigned int Save_SP
:1; /* 27 */
4996 unsigned int Save_RP
:1; /* 28 */
4997 unsigned int Save_MRP_in_frame
:1; /* 29 */
4998 unsigned int extn_ptr_defined
:1; /* 30 */
4999 unsigned int Cleanup_defined
:1; /* 31 */
5001 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
5002 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
5003 unsigned int Large_frame
:1; /* 2 */
5004 unsigned int Pseudo_SP_Set
:1; /* 3 */
5005 unsigned int reserved4
:1; /* 4 */
5006 unsigned int Total_frame_size
:27; /* 5..31 */
5008 *table
; /* Unwind table. */
5009 unsigned long table_len
; /* Length of unwind table. */
5010 bfd_vma seg_base
; /* Starting address of segment. */
5011 Elf_Internal_Sym
*symtab
; /* The symbol table. */
5012 unsigned long nsyms
; /* Number of symbols. */
5013 char *strtab
; /* The string table. */
5014 unsigned long strtab_size
; /* Size of string table. */
5018 dump_hppa_unwind (struct hppa_unw_aux_info
*aux
)
5020 struct hppa_unw_table_entry
*tp
;
5022 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
5025 const char *procname
;
5027 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
5028 aux
->strtab_size
, tp
->start
, &procname
,
5031 fputs ("\n<", stdout
);
5035 fputs (procname
, stdout
);
5038 printf ("+%lx", (unsigned long) offset
);
5041 fputs (">: [", stdout
);
5042 print_vma (tp
->start
.offset
, PREFIX_HEX
);
5043 fputc ('-', stdout
);
5044 print_vma (tp
->end
.offset
, PREFIX_HEX
);
5047 #define PF(_m) if (tp->_m) printf (#_m " ");
5048 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5051 PF(Millicode_save_sr0
);
5052 /* PV(Region_description); */
5058 PF(Separate_Package_Body
);
5059 PF(Frame_Extension_Millicode
);
5060 PF(Stack_Overflow_Check
);
5061 PF(Two_Instruction_SP_Increment
);
5065 PF(sched_entry_seq
);
5068 PF(Save_MRP_in_frame
);
5069 PF(extn_ptr_defined
);
5070 PF(Cleanup_defined
);
5071 PF(MPE_XL_interrupt_marker
);
5072 PF(HP_UX_interrupt_marker
);
5075 PV(Total_frame_size
);
5084 slurp_hppa_unwind_table (FILE *file
,
5085 struct hppa_unw_aux_info
*aux
,
5086 Elf_Internal_Shdr
*sec
)
5088 unsigned long size
, unw_ent_size
, nentries
, nrelas
, i
;
5089 Elf_Internal_Phdr
*seg
;
5090 struct hppa_unw_table_entry
*tep
;
5091 Elf_Internal_Shdr
*relsec
;
5092 Elf_Internal_Rela
*rela
, *rp
;
5093 unsigned char *table
, *tp
;
5094 Elf_Internal_Sym
*sym
;
5095 const char *relname
;
5097 /* First, find the starting address of the segment that includes
5100 if (elf_header
.e_phnum
)
5102 if (! get_program_headers (file
))
5105 for (seg
= program_headers
;
5106 seg
< program_headers
+ elf_header
.e_phnum
;
5109 if (seg
->p_type
!= PT_LOAD
)
5112 if (sec
->sh_addr
>= seg
->p_vaddr
5113 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5115 aux
->seg_base
= seg
->p_vaddr
;
5121 /* Second, build the unwind table from the contents of the unwind
5123 size
= sec
->sh_size
;
5124 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
5129 nentries
= size
/ unw_ent_size
;
5130 size
= unw_ent_size
* nentries
;
5132 tep
= aux
->table
= xcmalloc (nentries
, sizeof (aux
->table
[0]));
5134 for (tp
= table
; tp
< table
+ size
; tp
+= unw_ent_size
, ++tep
)
5136 unsigned int tmp1
, tmp2
;
5138 tep
->start
.section
= SHN_UNDEF
;
5139 tep
->end
.section
= SHN_UNDEF
;
5141 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
5142 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
5143 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
5144 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
5146 tep
->start
.offset
+= aux
->seg_base
;
5147 tep
->end
.offset
+= aux
->seg_base
;
5149 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
5150 tep
->Millicode
= (tmp1
>> 30) & 0x1;
5151 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
5152 tep
->Region_description
= (tmp1
>> 27) & 0x3;
5153 tep
->reserved1
= (tmp1
>> 26) & 0x1;
5154 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
5155 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
5156 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
5157 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
5158 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
5159 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
5160 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
5161 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
5162 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
5163 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
5164 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
5165 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
5166 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
5167 tep
->reserved2
= (tmp1
>> 5) & 0x1;
5168 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
5169 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
5170 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
5171 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
5172 tep
->Cleanup_defined
= tmp1
& 0x1;
5174 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
5175 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
5176 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
5177 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
5178 tep
->reserved4
= (tmp2
>> 27) & 0x1;
5179 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
5183 /* Third, apply any relocations to the unwind table. */
5185 for (relsec
= section_headers
;
5186 relsec
< section_headers
+ elf_header
.e_shnum
;
5189 if (relsec
->sh_type
!= SHT_RELA
5190 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
5191 || SECTION_HEADER (relsec
->sh_info
) != sec
)
5194 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5198 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5202 relname
= elf_hppa_reloc_type (ELF32_R_TYPE (rp
->r_info
));
5203 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
5207 relname
= elf_hppa_reloc_type (ELF64_R_TYPE (rp
->r_info
));
5208 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
5211 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
5212 if (strncmp (relname
, "R_PARISC_SEGREL", 15) != 0)
5214 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5218 i
= rp
->r_offset
/ unw_ent_size
;
5220 switch ((rp
->r_offset
% unw_ent_size
) / eh_addr_size
)
5223 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5224 aux
->table
[i
].start
.offset
+= sym
->st_value
+ rp
->r_addend
;
5227 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5228 aux
->table
[i
].end
.offset
+= sym
->st_value
+ rp
->r_addend
;
5238 aux
->table_len
= nentries
;
5244 hppa_process_unwind (FILE *file
)
5246 struct hppa_unw_aux_info aux
;
5247 Elf_Internal_Shdr
*unwsec
= NULL
;
5248 Elf_Internal_Shdr
*strsec
;
5249 Elf_Internal_Shdr
*sec
;
5252 memset (& aux
, 0, sizeof (aux
));
5254 if (string_table
== NULL
)
5257 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5259 if (sec
->sh_type
== SHT_SYMTAB
5260 && SECTION_HEADER_INDEX (sec
->sh_link
) < elf_header
.e_shnum
)
5262 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5263 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5265 strsec
= SECTION_HEADER (sec
->sh_link
);
5266 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
5267 1, strsec
->sh_size
, _("string table"));
5268 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5270 else if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5275 printf (_("\nThere are no unwind sections in this file.\n"));
5277 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5279 if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5281 printf (_("\nUnwind section "));
5282 printf (_("'%s'"), SECTION_NAME (sec
));
5284 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5285 (unsigned long) sec
->sh_offset
,
5286 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
+ 8)));
5288 slurp_hppa_unwind_table (file
, &aux
, sec
);
5289 if (aux
.table_len
> 0)
5290 dump_hppa_unwind (&aux
);
5293 free ((char *) aux
.table
);
5301 free ((char *) aux
.strtab
);
5307 process_unwind (FILE *file
)
5309 struct unwind_handler
{
5311 int (*handler
)(FILE *file
);
5313 { EM_IA_64
, ia64_process_unwind
},
5314 { EM_PARISC
, hppa_process_unwind
},
5322 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
5323 if (elf_header
.e_machine
== handlers
[i
].machtype
)
5324 return handlers
[i
].handler (file
);
5326 printf (_("\nThere are no unwind sections in this file.\n"));
5331 dynamic_section_mips_val (Elf_Internal_Dyn
*entry
)
5333 switch (entry
->d_tag
)
5336 if (entry
->d_un
.d_val
== 0)
5340 static const char * opts
[] =
5342 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5343 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5344 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5345 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5350 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++cnt
)
5351 if (entry
->d_un
.d_val
& (1 << cnt
))
5353 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
5360 case DT_MIPS_IVERSION
:
5361 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5362 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5364 printf ("<corrupt: %ld>\n", (long) entry
->d_un
.d_ptr
);
5367 case DT_MIPS_TIME_STAMP
:
5372 time_t time
= entry
->d_un
.d_val
;
5373 tmp
= gmtime (&time
);
5374 snprintf (timebuf
, sizeof (timebuf
), "%04u-%02u-%02uT%02u:%02u:%02u",
5375 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5376 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5377 printf ("Time Stamp: %s\n", timebuf
);
5381 case DT_MIPS_RLD_VERSION
:
5382 case DT_MIPS_LOCAL_GOTNO
:
5383 case DT_MIPS_CONFLICTNO
:
5384 case DT_MIPS_LIBLISTNO
:
5385 case DT_MIPS_SYMTABNO
:
5386 case DT_MIPS_UNREFEXTNO
:
5387 case DT_MIPS_HIPAGENO
:
5388 case DT_MIPS_DELTA_CLASS_NO
:
5389 case DT_MIPS_DELTA_INSTANCE_NO
:
5390 case DT_MIPS_DELTA_RELOC_NO
:
5391 case DT_MIPS_DELTA_SYM_NO
:
5392 case DT_MIPS_DELTA_CLASSSYM_NO
:
5393 case DT_MIPS_COMPACT_SIZE
:
5394 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
5398 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
5404 dynamic_section_parisc_val (Elf_Internal_Dyn
*entry
)
5406 switch (entry
->d_tag
)
5408 case DT_HP_DLD_FLAGS
:
5417 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
5418 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
5419 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
5420 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
5421 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
5422 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
5423 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
5424 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
5425 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
5426 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
5427 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" },
5428 { DT_HP_GST
, "HP_GST" },
5429 { DT_HP_SHLIB_FIXED
, "HP_SHLIB_FIXED" },
5430 { DT_HP_MERGE_SHLIB_SEG
, "HP_MERGE_SHLIB_SEG" },
5431 { DT_HP_NODELETE
, "HP_NODELETE" },
5432 { DT_HP_GROUP
, "HP_GROUP" },
5433 { DT_HP_PROTECT_LINKAGE_TABLE
, "HP_PROTECT_LINKAGE_TABLE" }
5437 bfd_vma val
= entry
->d_un
.d_val
;
5439 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
5440 if (val
& flags
[cnt
].bit
)
5444 fputs (flags
[cnt
].str
, stdout
);
5446 val
^= flags
[cnt
].bit
;
5449 if (val
!= 0 || first
)
5453 print_vma (val
, HEX
);
5459 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5466 dynamic_section_ia64_val (Elf_Internal_Dyn
*entry
)
5468 switch (entry
->d_tag
)
5470 case DT_IA_64_PLT_RESERVE
:
5471 /* First 3 slots reserved. */
5472 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5474 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
5478 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5485 get_32bit_dynamic_section (FILE *file
)
5487 Elf32_External_Dyn
*edyn
, *ext
;
5488 Elf_Internal_Dyn
*entry
;
5490 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5491 _("dynamic section"));
5495 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5496 might not have the luxury of section headers. Look for the DT_NULL
5497 terminator to determine the number of entries. */
5498 for (ext
= edyn
, dynamic_nent
= 0;
5499 (char *) ext
< (char *) edyn
+ dynamic_size
;
5503 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5507 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5508 if (dynamic_section
== NULL
)
5510 error (_("Out of memory\n"));
5515 for (ext
= edyn
, entry
= dynamic_section
;
5516 entry
< dynamic_section
+ dynamic_nent
;
5519 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5520 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5529 get_64bit_dynamic_section (FILE *file
)
5531 Elf64_External_Dyn
*edyn
, *ext
;
5532 Elf_Internal_Dyn
*entry
;
5534 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5535 _("dynamic section"));
5539 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5540 might not have the luxury of section headers. Look for the DT_NULL
5541 terminator to determine the number of entries. */
5542 for (ext
= edyn
, dynamic_nent
= 0;
5543 (char *) ext
< (char *) edyn
+ dynamic_size
;
5547 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5551 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5552 if (dynamic_section
== NULL
)
5554 error (_("Out of memory\n"));
5559 for (ext
= edyn
, entry
= dynamic_section
;
5560 entry
< dynamic_section
+ dynamic_nent
;
5563 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5564 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5573 print_dynamic_flags (bfd_vma flags
)
5581 flag
= flags
& - flags
;
5591 case DF_ORIGIN
: fputs ("ORIGIN", stdout
); break;
5592 case DF_SYMBOLIC
: fputs ("SYMBOLIC", stdout
); break;
5593 case DF_TEXTREL
: fputs ("TEXTREL", stdout
); break;
5594 case DF_BIND_NOW
: fputs ("BIND_NOW", stdout
); break;
5595 case DF_STATIC_TLS
: fputs ("STATIC_TLS", stdout
); break;
5596 default: fputs ("unknown", stdout
); break;
5602 /* Parse and display the contents of the dynamic section. */
5605 process_dynamic_section (FILE *file
)
5607 Elf_Internal_Dyn
*entry
;
5609 if (dynamic_size
== 0)
5612 printf (_("\nThere is no dynamic section in this file.\n"));
5619 if (! get_32bit_dynamic_section (file
))
5622 else if (! get_64bit_dynamic_section (file
))
5625 /* Find the appropriate symbol table. */
5626 if (dynamic_symbols
== NULL
)
5628 for (entry
= dynamic_section
;
5629 entry
< dynamic_section
+ dynamic_nent
;
5632 Elf_Internal_Shdr section
;
5634 if (entry
->d_tag
!= DT_SYMTAB
)
5637 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
5639 /* Since we do not know how big the symbol table is,
5640 we default to reading in the entire file (!) and
5641 processing that. This is overkill, I know, but it
5643 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5645 if (archive_file_offset
!= 0)
5646 section
.sh_size
= archive_file_size
- section
.sh_offset
;
5649 if (fseek (file
, 0, SEEK_END
))
5650 error (_("Unable to seek to end of file!"));
5652 section
.sh_size
= ftell (file
) - section
.sh_offset
;
5656 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
5658 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
5660 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
5661 if (num_dynamic_syms
< 1)
5663 error (_("Unable to determine the number of symbols to load\n"));
5667 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
5671 /* Similarly find a string table. */
5672 if (dynamic_strings
== NULL
)
5674 for (entry
= dynamic_section
;
5675 entry
< dynamic_section
+ dynamic_nent
;
5678 unsigned long offset
;
5681 if (entry
->d_tag
!= DT_STRTAB
)
5684 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
5686 /* Since we do not know how big the string table is,
5687 we default to reading in the entire file (!) and
5688 processing that. This is overkill, I know, but it
5691 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5693 if (archive_file_offset
!= 0)
5694 str_tab_len
= archive_file_size
- offset
;
5697 if (fseek (file
, 0, SEEK_END
))
5698 error (_("Unable to seek to end of file\n"));
5699 str_tab_len
= ftell (file
) - offset
;
5702 if (str_tab_len
< 1)
5705 (_("Unable to determine the length of the dynamic string table\n"));
5709 dynamic_strings
= get_data (NULL
, file
, offset
, 1, str_tab_len
,
5710 _("dynamic string table"));
5711 dynamic_strings_length
= str_tab_len
;
5716 /* And find the syminfo section if available. */
5717 if (dynamic_syminfo
== NULL
)
5719 unsigned long syminsz
= 0;
5721 for (entry
= dynamic_section
;
5722 entry
< dynamic_section
+ dynamic_nent
;
5725 if (entry
->d_tag
== DT_SYMINENT
)
5727 /* Note: these braces are necessary to avoid a syntax
5728 error from the SunOS4 C compiler. */
5729 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
5731 else if (entry
->d_tag
== DT_SYMINSZ
)
5732 syminsz
= entry
->d_un
.d_val
;
5733 else if (entry
->d_tag
== DT_SYMINFO
)
5734 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
5738 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
5740 Elf_External_Syminfo
*extsyminfo
, *extsym
;
5741 Elf_Internal_Syminfo
*syminfo
;
5743 /* There is a syminfo section. Read the data. */
5744 extsyminfo
= get_data (NULL
, file
, dynamic_syminfo_offset
, 1,
5745 syminsz
, _("symbol information"));
5749 dynamic_syminfo
= malloc (syminsz
);
5750 if (dynamic_syminfo
== NULL
)
5752 error (_("Out of memory\n"));
5756 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
5757 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
5758 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
5759 ++syminfo
, ++extsym
)
5761 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
5762 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
5769 if (do_dynamic
&& dynamic_addr
)
5770 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
5771 dynamic_addr
, dynamic_nent
);
5773 printf (_(" Tag Type Name/Value\n"));
5775 for (entry
= dynamic_section
;
5776 entry
< dynamic_section
+ dynamic_nent
;
5784 print_vma (entry
->d_tag
, FULL_HEX
);
5785 dtype
= get_dynamic_type (entry
->d_tag
);
5786 printf (" (%s)%*s", dtype
,
5787 ((is_32bit_elf
? 27 : 19)
5788 - (int) strlen (dtype
)),
5792 switch (entry
->d_tag
)
5796 print_dynamic_flags (entry
->d_un
.d_val
);
5806 switch (entry
->d_tag
)
5809 printf (_("Auxiliary library"));
5813 printf (_("Filter library"));
5817 printf (_("Configuration file"));
5821 printf (_("Dependency audit library"));
5825 printf (_("Audit library"));
5829 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5830 printf (": [%s]\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5834 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5843 printf (_("Flags:"));
5845 if (entry
->d_un
.d_val
== 0)
5846 printf (_(" None\n"));
5849 unsigned long int val
= entry
->d_un
.d_val
;
5851 if (val
& DTF_1_PARINIT
)
5853 printf (" PARINIT");
5854 val
^= DTF_1_PARINIT
;
5856 if (val
& DTF_1_CONFEXP
)
5858 printf (" CONFEXP");
5859 val
^= DTF_1_CONFEXP
;
5862 printf (" %lx", val
);
5871 printf (_("Flags:"));
5873 if (entry
->d_un
.d_val
== 0)
5874 printf (_(" None\n"));
5877 unsigned long int val
= entry
->d_un
.d_val
;
5879 if (val
& DF_P1_LAZYLOAD
)
5881 printf (" LAZYLOAD");
5882 val
^= DF_P1_LAZYLOAD
;
5884 if (val
& DF_P1_GROUPPERM
)
5886 printf (" GROUPPERM");
5887 val
^= DF_P1_GROUPPERM
;
5890 printf (" %lx", val
);
5899 printf (_("Flags:"));
5900 if (entry
->d_un
.d_val
== 0)
5901 printf (_(" None\n"));
5904 unsigned long int val
= entry
->d_un
.d_val
;
5911 if (val
& DF_1_GLOBAL
)
5916 if (val
& DF_1_GROUP
)
5921 if (val
& DF_1_NODELETE
)
5923 printf (" NODELETE");
5924 val
^= DF_1_NODELETE
;
5926 if (val
& DF_1_LOADFLTR
)
5928 printf (" LOADFLTR");
5929 val
^= DF_1_LOADFLTR
;
5931 if (val
& DF_1_INITFIRST
)
5933 printf (" INITFIRST");
5934 val
^= DF_1_INITFIRST
;
5936 if (val
& DF_1_NOOPEN
)
5941 if (val
& DF_1_ORIGIN
)
5946 if (val
& DF_1_DIRECT
)
5951 if (val
& DF_1_TRANS
)
5956 if (val
& DF_1_INTERPOSE
)
5958 printf (" INTERPOSE");
5959 val
^= DF_1_INTERPOSE
;
5961 if (val
& DF_1_NODEFLIB
)
5963 printf (" NODEFLIB");
5964 val
^= DF_1_NODEFLIB
;
5966 if (val
& DF_1_NODUMP
)
5971 if (val
& DF_1_CONLFAT
)
5973 printf (" CONLFAT");
5974 val
^= DF_1_CONLFAT
;
5977 printf (" %lx", val
);
5984 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5986 puts (get_dynamic_type (entry
->d_un
.d_val
));
6006 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6012 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6013 name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6019 switch (entry
->d_tag
)
6022 printf (_("Shared library: [%s]"), name
);
6024 if (streq (name
, program_interpreter
))
6025 printf (_(" program interpreter"));
6029 printf (_("Library soname: [%s]"), name
);
6033 printf (_("Library rpath: [%s]"), name
);
6037 printf (_("Library runpath: [%s]"), name
);
6041 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6046 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6059 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6063 case DT_INIT_ARRAYSZ
:
6064 case DT_FINI_ARRAYSZ
:
6065 case DT_GNU_CONFLICTSZ
:
6066 case DT_GNU_LIBLISTSZ
:
6069 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6070 printf (" (bytes)\n");
6080 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6093 if (entry
->d_tag
== DT_USED
6094 && VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6096 char *name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6100 printf (_("Not needed object: [%s]\n"), name
);
6105 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6111 /* The value of this entry is ignored. */
6116 case DT_GNU_PRELINKED
:
6120 time_t time
= entry
->d_un
.d_val
;
6122 tmp
= gmtime (&time
);
6123 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
6124 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
6125 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
6131 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
6132 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
6137 switch (elf_header
.e_machine
)
6140 case EM_MIPS_RS3_LE
:
6141 dynamic_section_mips_val (entry
);
6144 dynamic_section_parisc_val (entry
);
6147 dynamic_section_ia64_val (entry
);
6150 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6162 get_ver_flags (unsigned int flags
)
6164 static char buff
[32];
6171 if (flags
& VER_FLG_BASE
)
6172 strcat (buff
, "BASE ");
6174 if (flags
& VER_FLG_WEAK
)
6176 if (flags
& VER_FLG_BASE
)
6177 strcat (buff
, "| ");
6179 strcat (buff
, "WEAK ");
6182 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
6183 strcat (buff
, "| <unknown>");
6188 /* Display the contents of the version sections. */
6190 process_version_sections (FILE *file
)
6192 Elf_Internal_Shdr
*section
;
6199 for (i
= 0, section
= section_headers
;
6200 i
< elf_header
.e_shnum
;
6203 switch (section
->sh_type
)
6205 case SHT_GNU_verdef
:
6207 Elf_External_Verdef
*edefs
;
6214 (_("\nVersion definition section '%s' contains %ld entries:\n"),
6215 SECTION_NAME (section
), section
->sh_info
);
6217 printf (_(" Addr: 0x"));
6218 printf_vma (section
->sh_addr
);
6219 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6220 (unsigned long) section
->sh_offset
, section
->sh_link
,
6221 SECTION_HEADER_INDEX (section
->sh_link
)
6222 < elf_header
.e_shnum
6223 ? SECTION_NAME (SECTION_HEADER (section
->sh_link
))
6226 edefs
= get_data (NULL
, file
, section
->sh_offset
, 1,
6228 _("version definition section"));
6232 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6235 Elf_External_Verdef
*edef
;
6236 Elf_Internal_Verdef ent
;
6237 Elf_External_Verdaux
*eaux
;
6238 Elf_Internal_Verdaux aux
;
6242 vstart
= ((char *) edefs
) + idx
;
6244 edef
= (Elf_External_Verdef
*) vstart
;
6246 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
6247 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
6248 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
6249 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
6250 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
6251 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
6252 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
6254 printf (_(" %#06x: Rev: %d Flags: %s"),
6255 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
6257 printf (_(" Index: %d Cnt: %d "),
6258 ent
.vd_ndx
, ent
.vd_cnt
);
6260 vstart
+= ent
.vd_aux
;
6262 eaux
= (Elf_External_Verdaux
*) vstart
;
6264 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6265 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6267 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6268 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux
.vda_name
));
6270 printf (_("Name index: %ld\n"), aux
.vda_name
);
6272 isum
= idx
+ ent
.vd_aux
;
6274 for (j
= 1; j
< ent
.vd_cnt
; j
++)
6276 isum
+= aux
.vda_next
;
6277 vstart
+= aux
.vda_next
;
6279 eaux
= (Elf_External_Verdaux
*) vstart
;
6281 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6282 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6284 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6285 printf (_(" %#06x: Parent %d: %s\n"),
6286 isum
, j
, GET_DYNAMIC_NAME (aux
.vda_name
));
6288 printf (_(" %#06x: Parent %d, name index: %ld\n"),
6289 isum
, j
, aux
.vda_name
);
6299 case SHT_GNU_verneed
:
6301 Elf_External_Verneed
*eneed
;
6307 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
6308 SECTION_NAME (section
), section
->sh_info
);
6310 printf (_(" Addr: 0x"));
6311 printf_vma (section
->sh_addr
);
6312 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
6313 (unsigned long) section
->sh_offset
, section
->sh_link
,
6314 SECTION_HEADER_INDEX (section
->sh_link
)
6315 < elf_header
.e_shnum
6316 ? SECTION_NAME (SECTION_HEADER (section
->sh_link
))
6319 eneed
= get_data (NULL
, file
, section
->sh_offset
, 1,
6321 _("version need section"));
6325 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6327 Elf_External_Verneed
*entry
;
6328 Elf_Internal_Verneed ent
;
6333 vstart
= ((char *) eneed
) + idx
;
6335 entry
= (Elf_External_Verneed
*) vstart
;
6337 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
6338 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
6339 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
6340 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
6341 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
6343 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
6345 if (VALID_DYNAMIC_NAME (ent
.vn_file
))
6346 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent
.vn_file
));
6348 printf (_(" File: %lx"), ent
.vn_file
);
6350 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
6352 vstart
+= ent
.vn_aux
;
6354 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
6356 Elf_External_Vernaux
*eaux
;
6357 Elf_Internal_Vernaux aux
;
6359 eaux
= (Elf_External_Vernaux
*) vstart
;
6361 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
6362 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
6363 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
6364 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
6365 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
6367 if (VALID_DYNAMIC_NAME (aux
.vna_name
))
6368 printf (_(" %#06x: Name: %s"),
6369 isum
, GET_DYNAMIC_NAME (aux
.vna_name
));
6371 printf (_(" %#06x: Name index: %lx"),
6372 isum
, aux
.vna_name
);
6374 printf (_(" Flags: %s Version: %d\n"),
6375 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
6377 isum
+= aux
.vna_next
;
6378 vstart
+= aux
.vna_next
;
6388 case SHT_GNU_versym
:
6390 Elf_Internal_Shdr
*link_section
;
6393 unsigned char *edata
;
6394 unsigned short *data
;
6396 Elf_Internal_Sym
*symbols
;
6397 Elf_Internal_Shdr
*string_sec
;
6400 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
)
6403 link_section
= SECTION_HEADER (section
->sh_link
);
6404 total
= section
->sh_size
/ sizeof (Elf_External_Versym
);
6406 if (SECTION_HEADER_INDEX (link_section
->sh_link
)
6407 >= elf_header
.e_shnum
)
6412 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
6414 string_sec
= SECTION_HEADER (link_section
->sh_link
);
6416 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
6417 string_sec
->sh_size
, _("version string table"));
6421 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6422 SECTION_NAME (section
), total
);
6424 printf (_(" Addr: "));
6425 printf_vma (section
->sh_addr
);
6426 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6427 (unsigned long) section
->sh_offset
, section
->sh_link
,
6428 SECTION_NAME (link_section
));
6430 off
= offset_from_vma (file
,
6431 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6432 total
* sizeof (short));
6433 edata
= get_data (NULL
, file
, off
, total
, sizeof (short),
6434 _("version symbol data"));
6441 data
= cmalloc (total
, sizeof (short));
6443 for (cnt
= total
; cnt
--;)
6444 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
6449 for (cnt
= 0; cnt
< total
; cnt
+= 4)
6452 int check_def
, check_need
;
6455 printf (" %03x:", cnt
);
6457 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
6458 switch (data
[cnt
+ j
])
6461 fputs (_(" 0 (*local*) "), stdout
);
6465 fputs (_(" 1 (*global*) "), stdout
);
6469 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
6470 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
6474 if (SECTION_HEADER_INDEX (symbols
[cnt
+ j
].st_shndx
)
6475 >= elf_header
.e_shnum
6476 || SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
6479 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
6486 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
6488 Elf_Internal_Verneed ivn
;
6489 unsigned long offset
;
6491 offset
= offset_from_vma
6492 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6493 sizeof (Elf_External_Verneed
));
6497 Elf_Internal_Vernaux ivna
;
6498 Elf_External_Verneed evn
;
6499 Elf_External_Vernaux evna
;
6500 unsigned long a_off
;
6502 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
6505 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6506 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6508 a_off
= offset
+ ivn
.vn_aux
;
6512 get_data (&evna
, file
, a_off
, sizeof (evna
),
6513 1, _("version need aux (2)"));
6515 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6516 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6518 a_off
+= ivna
.vna_next
;
6520 while (ivna
.vna_other
!= data
[cnt
+ j
]
6521 && ivna
.vna_next
!= 0);
6523 if (ivna
.vna_other
== data
[cnt
+ j
])
6525 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6527 name
= strtab
+ ivna
.vna_name
;
6528 nn
+= printf ("(%s%-*s",
6530 12 - (int) strlen (name
),
6536 offset
+= ivn
.vn_next
;
6538 while (ivn
.vn_next
);
6541 if (check_def
&& data
[cnt
+ j
] != 0x8001
6542 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6544 Elf_Internal_Verdef ivd
;
6545 Elf_External_Verdef evd
;
6546 unsigned long offset
;
6548 offset
= offset_from_vma
6549 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6554 get_data (&evd
, file
, offset
, sizeof (evd
), 1,
6557 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6558 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6560 offset
+= ivd
.vd_next
;
6562 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
6563 && ivd
.vd_next
!= 0);
6565 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
6567 Elf_External_Verdaux evda
;
6568 Elf_Internal_Verdaux ivda
;
6570 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6572 get_data (&evda
, file
,
6573 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
6575 _("version def aux"));
6577 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6579 name
= strtab
+ ivda
.vda_name
;
6580 nn
+= printf ("(%s%-*s",
6582 12 - (int) strlen (name
),
6588 printf ("%*c", 18 - nn
, ' ');
6606 printf (_("\nNo version information found in this file.\n"));
6612 get_symbol_binding (unsigned int binding
)
6614 static char buff
[32];
6618 case STB_LOCAL
: return "LOCAL";
6619 case STB_GLOBAL
: return "GLOBAL";
6620 case STB_WEAK
: return "WEAK";
6622 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
6623 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"),
6625 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
6626 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), binding
);
6628 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), binding
);
6634 get_symbol_type (unsigned int type
)
6636 static char buff
[32];
6640 case STT_NOTYPE
: return "NOTYPE";
6641 case STT_OBJECT
: return "OBJECT";
6642 case STT_FUNC
: return "FUNC";
6643 case STT_SECTION
: return "SECTION";
6644 case STT_FILE
: return "FILE";
6645 case STT_COMMON
: return "COMMON";
6646 case STT_TLS
: return "TLS";
6648 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
6650 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
6651 return "THUMB_FUNC";
6653 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
6656 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
6657 return "PARISC_MILLI";
6659 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"), type
);
6661 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
6663 if (elf_header
.e_machine
== EM_PARISC
)
6665 if (type
== STT_HP_OPAQUE
)
6667 if (type
== STT_HP_STUB
)
6671 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), type
);
6674 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), type
);
6680 get_symbol_visibility (unsigned int visibility
)
6684 case STV_DEFAULT
: return "DEFAULT";
6685 case STV_INTERNAL
: return "INTERNAL";
6686 case STV_HIDDEN
: return "HIDDEN";
6687 case STV_PROTECTED
: return "PROTECTED";
6693 get_symbol_index_type (unsigned int type
)
6695 static char buff
[32];
6699 case SHN_UNDEF
: return "UND";
6700 case SHN_ABS
: return "ABS";
6701 case SHN_COMMON
: return "COM";
6703 if (type
== SHN_IA_64_ANSI_COMMON
6704 && elf_header
.e_machine
== EM_IA_64
6705 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
6707 else if (elf_header
.e_machine
== EM_X86_64
6708 && type
== SHN_X86_64_LCOMMON
)
6710 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
6711 sprintf (buff
, "PRC[0x%04x]", type
);
6712 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
6713 sprintf (buff
, "OS [0x%04x]", type
);
6714 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
6715 sprintf (buff
, "RSV[0x%04x]", type
);
6717 sprintf (buff
, "%3d", type
);
6725 get_dynamic_data (FILE *file
, unsigned int number
, unsigned int ent_size
)
6727 unsigned char *e_data
;
6730 e_data
= cmalloc (number
, ent_size
);
6734 error (_("Out of memory\n"));
6738 if (fread (e_data
, ent_size
, number
, file
) != number
)
6740 error (_("Unable to read in dynamic data\n"));
6744 i_data
= cmalloc (number
, sizeof (*i_data
));
6748 error (_("Out of memory\n"));
6754 i_data
[number
] = byte_get (e_data
+ number
* ent_size
, ent_size
);
6761 /* Dump the symbol table. */
6763 process_symbol_table (FILE *file
)
6765 Elf_Internal_Shdr
*section
;
6766 bfd_vma nbuckets
= 0;
6767 bfd_vma nchains
= 0;
6768 bfd_vma
*buckets
= NULL
;
6769 bfd_vma
*chains
= NULL
;
6771 if (! do_syms
&& !do_histogram
)
6774 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
6777 unsigned char nb
[8];
6778 unsigned char nc
[8];
6779 int hash_ent_size
= 4;
6781 if ((elf_header
.e_machine
== EM_ALPHA
6782 || elf_header
.e_machine
== EM_S390
6783 || elf_header
.e_machine
== EM_S390_OLD
)
6784 && elf_header
.e_ident
[EI_CLASS
] == ELFCLASS64
)
6788 (archive_file_offset
6789 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
6790 sizeof nb
+ sizeof nc
)),
6793 error (_("Unable to seek to start of dynamic information"));
6797 if (fread (nb
, hash_ent_size
, 1, file
) != 1)
6799 error (_("Failed to read in number of buckets\n"));
6803 if (fread (nc
, hash_ent_size
, 1, file
) != 1)
6805 error (_("Failed to read in number of chains\n"));
6809 nbuckets
= byte_get (nb
, hash_ent_size
);
6810 nchains
= byte_get (nc
, hash_ent_size
);
6812 buckets
= get_dynamic_data (file
, nbuckets
, hash_ent_size
);
6813 chains
= get_dynamic_data (file
, nchains
, hash_ent_size
);
6815 if (buckets
== NULL
|| chains
== NULL
)
6820 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
6825 printf (_("\nSymbol table for image:\n"));
6827 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6829 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6831 for (hn
= 0; hn
< nbuckets
; hn
++)
6836 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
6838 Elf_Internal_Sym
*psym
;
6841 psym
= dynamic_symbols
+ si
;
6843 n
= print_vma (si
, DEC_5
);
6845 fputs (" " + n
, stdout
);
6846 printf (" %3lu: ", hn
);
6847 print_vma (psym
->st_value
, LONG_HEX
);
6849 print_vma (psym
->st_size
, DEC_5
);
6851 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6852 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
6853 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6854 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
6855 if (VALID_DYNAMIC_NAME (psym
->st_name
))
6856 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
6858 printf (" <corrupt: %14ld>", psym
->st_name
);
6863 else if (do_syms
&& !do_using_dynamic
)
6867 for (i
= 0, section
= section_headers
;
6868 i
< elf_header
.e_shnum
;
6872 char *strtab
= NULL
;
6873 unsigned long int strtab_size
= 0;
6874 Elf_Internal_Sym
*symtab
;
6875 Elf_Internal_Sym
*psym
;
6878 if ( section
->sh_type
!= SHT_SYMTAB
6879 && section
->sh_type
!= SHT_DYNSYM
)
6882 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
6883 SECTION_NAME (section
),
6884 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
6886 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6888 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6890 symtab
= GET_ELF_SYMBOLS (file
, section
);
6894 if (section
->sh_link
== elf_header
.e_shstrndx
)
6896 strtab
= string_table
;
6897 strtab_size
= string_table_length
;
6899 else if (SECTION_HEADER_INDEX (section
->sh_link
) < elf_header
.e_shnum
)
6901 Elf_Internal_Shdr
*string_sec
;
6903 string_sec
= SECTION_HEADER (section
->sh_link
);
6905 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
6906 1, string_sec
->sh_size
, _("string table"));
6907 strtab_size
= strtab
!= NULL
? string_sec
->sh_size
: 0;
6910 for (si
= 0, psym
= symtab
;
6911 si
< section
->sh_size
/ section
->sh_entsize
;
6914 printf ("%6d: ", si
);
6915 print_vma (psym
->st_value
, LONG_HEX
);
6917 print_vma (psym
->st_size
, DEC_5
);
6918 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6919 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
6920 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6921 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
6922 print_symbol (25, psym
->st_name
< strtab_size
6923 ? strtab
+ psym
->st_name
: "<corrupt>");
6925 if (section
->sh_type
== SHT_DYNSYM
&&
6926 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
6928 unsigned char data
[2];
6929 unsigned short vers_data
;
6930 unsigned long offset
;
6934 offset
= offset_from_vma
6935 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6936 sizeof data
+ si
* sizeof (vers_data
));
6938 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
6939 sizeof (data
), 1, _("version data"));
6941 vers_data
= byte_get (data
, 2);
6943 is_nobits
= (SECTION_HEADER_INDEX (psym
->st_shndx
)
6944 < elf_header
.e_shnum
6945 && SECTION_HEADER (psym
->st_shndx
)->sh_type
6948 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
6950 if ((vers_data
& 0x8000) || vers_data
> 1)
6952 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
6953 && (is_nobits
|| ! check_def
))
6955 Elf_External_Verneed evn
;
6956 Elf_Internal_Verneed ivn
;
6957 Elf_Internal_Vernaux ivna
;
6959 /* We must test both. */
6960 offset
= offset_from_vma
6961 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6966 unsigned long vna_off
;
6968 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
6971 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6972 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6974 vna_off
= offset
+ ivn
.vn_aux
;
6978 Elf_External_Vernaux evna
;
6980 get_data (&evna
, file
, vna_off
,
6982 _("version need aux (3)"));
6984 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6985 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6986 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6988 vna_off
+= ivna
.vna_next
;
6990 while (ivna
.vna_other
!= vers_data
6991 && ivna
.vna_next
!= 0);
6993 if (ivna
.vna_other
== vers_data
)
6996 offset
+= ivn
.vn_next
;
6998 while (ivn
.vn_next
!= 0);
7000 if (ivna
.vna_other
== vers_data
)
7003 ivna
.vna_name
< strtab_size
7004 ? strtab
+ ivna
.vna_name
: "<corrupt>",
7008 else if (! is_nobits
)
7009 error (_("bad dynamic symbol"));
7016 if (vers_data
!= 0x8001
7017 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
7019 Elf_Internal_Verdef ivd
;
7020 Elf_Internal_Verdaux ivda
;
7021 Elf_External_Verdaux evda
;
7022 unsigned long offset
;
7024 offset
= offset_from_vma
7026 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
7027 sizeof (Elf_External_Verdef
));
7031 Elf_External_Verdef evd
;
7033 get_data (&evd
, file
, offset
, sizeof (evd
),
7034 1, _("version def"));
7036 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
7037 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
7038 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
7040 offset
+= ivd
.vd_next
;
7042 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
7043 && ivd
.vd_next
!= 0);
7045 offset
-= ivd
.vd_next
;
7046 offset
+= ivd
.vd_aux
;
7048 get_data (&evda
, file
, offset
, sizeof (evda
),
7049 1, _("version def aux"));
7051 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
7053 if (psym
->st_name
!= ivda
.vda_name
)
7054 printf ((vers_data
& 0x8000)
7056 ivda
.vda_name
< strtab_size
7057 ? strtab
+ ivda
.vda_name
: "<corrupt>");
7067 if (strtab
!= string_table
)
7073 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
7075 if (do_histogram
&& buckets
!= NULL
)
7077 unsigned long *lengths
;
7078 unsigned long *counts
;
7081 unsigned long maxlength
= 0;
7082 unsigned long nzero_counts
= 0;
7083 unsigned long nsyms
= 0;
7085 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
7086 (unsigned long) nbuckets
);
7087 printf (_(" Length Number %% of total Coverage\n"));
7089 lengths
= calloc (nbuckets
, sizeof (*lengths
));
7090 if (lengths
== NULL
)
7092 error (_("Out of memory"));
7095 for (hn
= 0; hn
< nbuckets
; ++hn
)
7097 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
7100 if (maxlength
< ++lengths
[hn
])
7105 counts
= calloc (maxlength
+ 1, sizeof (*counts
));
7108 error (_("Out of memory"));
7112 for (hn
= 0; hn
< nbuckets
; ++hn
)
7113 ++counts
[lengths
[hn
]];
7118 printf (" 0 %-10lu (%5.1f%%)\n",
7119 counts
[0], (counts
[0] * 100.0) / nbuckets
);
7120 for (i
= 1; i
<= maxlength
; ++i
)
7122 nzero_counts
+= counts
[i
] * i
;
7123 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7124 i
, counts
[i
], (counts
[i
] * 100.0) / nbuckets
,
7125 (nzero_counts
* 100.0) / nsyms
);
7133 if (buckets
!= NULL
)
7143 process_syminfo (FILE *file ATTRIBUTE_UNUSED
)
7147 if (dynamic_syminfo
== NULL
7149 /* No syminfo, this is ok. */
7152 /* There better should be a dynamic symbol section. */
7153 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
7157 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
7158 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
7160 printf (_(" Num: Name BoundTo Flags\n"));
7161 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
7163 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
7165 printf ("%4d: ", i
);
7166 if (VALID_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
))
7167 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
));
7169 printf ("<corrupt: %19ld>", dynamic_symbols
[i
].st_name
);
7172 switch (dynamic_syminfo
[i
].si_boundto
)
7174 case SYMINFO_BT_SELF
:
7175 fputs ("SELF ", stdout
);
7177 case SYMINFO_BT_PARENT
:
7178 fputs ("PARENT ", stdout
);
7181 if (dynamic_syminfo
[i
].si_boundto
> 0
7182 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
7183 && VALID_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
7185 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
7189 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
7193 if (flags
& SYMINFO_FLG_DIRECT
)
7195 if (flags
& SYMINFO_FLG_PASSTHRU
)
7196 printf (" PASSTHRU");
7197 if (flags
& SYMINFO_FLG_COPY
)
7199 if (flags
& SYMINFO_FLG_LAZYLOAD
)
7200 printf (" LAZYLOAD");
7208 #ifdef SUPPORT_DISASSEMBLY
7210 disassemble_section (Elf_Internal_Shdr
*section
, FILE *file
)
7212 printf (_("\nAssembly dump of section %s\n"),
7213 SECTION_NAME (section
));
7215 /* XXX -- to be done --- XXX */
7222 dump_section (Elf_Internal_Shdr
*section
, FILE *file
)
7224 bfd_size_type bytes
;
7226 unsigned char *data
;
7227 unsigned char *start
;
7229 bytes
= section
->sh_size
;
7231 if (bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
7233 printf (_("\nSection '%s' has no data to dump.\n"),
7234 SECTION_NAME (section
));
7238 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
7240 addr
= section
->sh_addr
;
7242 start
= get_data (NULL
, file
, section
->sh_offset
, 1, bytes
,
7255 lbytes
= (bytes
> 16 ? 16 : bytes
);
7257 printf (" 0x%8.8lx ", (unsigned long) addr
);
7259 switch (elf_header
.e_ident
[EI_DATA
])
7263 for (j
= 15; j
>= 0; j
--)
7266 printf ("%2.2x", data
[j
]);
7276 for (j
= 0; j
< 16; j
++)
7279 printf ("%2.2x", data
[j
]);
7289 for (j
= 0; j
< lbytes
; j
++)
7292 if (k
>= ' ' && k
< 0x7f)
7310 /* Apply addends of RELA relocations. */
7313 debug_apply_rela_addends (void *file
,
7314 Elf_Internal_Shdr
*section
,
7315 unsigned char *start
)
7317 Elf_Internal_Shdr
*relsec
;
7318 unsigned char *end
= start
+ section
->sh_size
;
7319 /* FIXME: The relocation field size is relocation type dependent. */
7320 unsigned int reloc_size
= 4;
7322 if (!is_relocatable
)
7325 if (section
->sh_size
< reloc_size
)
7328 for (relsec
= section_headers
;
7329 relsec
< section_headers
+ elf_header
.e_shnum
;
7332 unsigned long nrelas
;
7333 Elf_Internal_Rela
*rela
, *rp
;
7334 Elf_Internal_Shdr
*symsec
;
7335 Elf_Internal_Sym
*symtab
;
7336 Elf_Internal_Sym
*sym
;
7338 if (relsec
->sh_type
!= SHT_RELA
7339 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
7340 || SECTION_HEADER (relsec
->sh_info
) != section
7341 || relsec
->sh_size
== 0
7342 || SECTION_HEADER_INDEX (relsec
->sh_link
) >= elf_header
.e_shnum
)
7345 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
7349 symsec
= SECTION_HEADER (relsec
->sh_link
);
7350 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
7352 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
7356 loc
= start
+ rp
->r_offset
;
7357 if ((loc
+ reloc_size
) > end
)
7359 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
7360 (unsigned long) rp
->r_offset
,
7361 SECTION_NAME (section
));
7367 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
7369 if (ELF32_R_SYM (rp
->r_info
) != 0
7370 && ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
7371 /* Relocations against object symbols can happen,
7372 eg when referencing a global array. For an
7373 example of this see the _clz.o binary in libgcc.a. */
7374 && ELF32_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
7376 warn (_("skipping unexpected symbol type %s in relocation in section .rela%s\n"),
7377 get_symbol_type (ELF32_ST_TYPE (sym
->st_info
)),
7378 SECTION_NAME (section
));
7384 /* In MIPS little-endian objects, r_info isn't really a
7385 64-bit little-endian value: it has a 32-bit little-endian
7386 symbol index followed by four individual byte fields.
7387 Reorder INFO accordingly. */
7388 if (elf_header
.e_machine
== EM_MIPS
7389 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
7390 rp
->r_info
= (((rp
->r_info
& 0xffffffff) << 32)
7391 | ((rp
->r_info
>> 56) & 0xff)
7392 | ((rp
->r_info
>> 40) & 0xff00)
7393 | ((rp
->r_info
>> 24) & 0xff0000)
7394 | ((rp
->r_info
>> 8) & 0xff000000));
7396 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
7398 if (ELF64_R_SYM (rp
->r_info
) != 0
7399 && ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
7400 && ELF64_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
7402 warn (_("skipping unexpected symbol type %s in relocation in section .rela.%s\n"),
7403 get_symbol_type (ELF64_ST_TYPE (sym
->st_info
)),
7404 SECTION_NAME (section
));
7409 byte_put (loc
, rp
->r_addend
, reloc_size
);
7420 load_debug_section (enum dwarf_section_display_enum debug
, void *file
)
7422 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
7423 Elf_Internal_Shdr
*sec
;
7426 /* If it is already loaded, do nothing. */
7427 if (section
->start
!= NULL
)
7430 /* Locate the debug section. */
7431 sec
= find_section (section
->name
);
7435 snprintf (buf
, sizeof (buf
), _("%s section data"), section
->name
);
7436 section
->address
= sec
->sh_addr
;
7437 section
->size
= sec
->sh_size
;
7438 section
->start
= get_data (NULL
, file
, sec
->sh_offset
, 1,
7441 if (debug_displays
[debug
].relocate
)
7442 debug_apply_rela_addends (file
, sec
, section
->start
);
7444 return section
->start
!= NULL
;
7448 free_debug_section (enum dwarf_section_display_enum debug
)
7450 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
7452 if (section
->start
== NULL
)
7455 free ((char *) section
->start
);
7456 section
->start
= NULL
;
7457 section
->address
= 0;
7462 display_debug_section (Elf_Internal_Shdr
*section
, FILE *file
)
7464 char *name
= SECTION_NAME (section
);
7465 bfd_size_type length
;
7467 enum dwarf_section_display_enum i
;
7469 length
= section
->sh_size
;
7472 printf (_("\nSection '%s' has no debugging data.\n"), name
);
7476 if (strneq (name
, ".gnu.linkonce.wi.", 17))
7477 name
= ".debug_info";
7479 /* See if we know how to display the contents of this section. */
7480 for (i
= 0; i
< max
; i
++)
7481 if (streq (debug_displays
[i
].section
.name
, name
))
7483 struct dwarf_section
*sec
= &debug_displays
[i
].section
;
7485 if (load_debug_section (i
, file
))
7487 result
&= debug_displays
[i
].display (sec
, file
);
7489 if (i
!= info
&& i
!= abbrev
)
7490 free_debug_section (i
);
7498 printf (_("Unrecognized debug section: %s\n"), name
);
7506 process_section_contents (FILE *file
)
7508 Elf_Internal_Shdr
*section
;
7514 for (i
= 0, section
= section_headers
;
7515 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
7518 #ifdef SUPPORT_DISASSEMBLY
7519 if (dump_sects
[i
] & DISASS_DUMP
)
7520 disassemble_section (section
, file
);
7522 if (dump_sects
[i
] & HEX_DUMP
)
7523 dump_section (section
, file
);
7525 if (dump_sects
[i
] & DEBUG_DUMP
)
7526 display_debug_section (section
, file
);
7529 /* Check to see if the user requested a
7530 dump of a section that does not exist. */
7531 while (i
++ < num_dump_sects
)
7533 warn (_("Section %d was not dumped because it does not exist!\n"), i
);
7537 process_mips_fpe_exception (int mask
)
7542 if (mask
& OEX_FPU_INEX
)
7543 fputs ("INEX", stdout
), first
= 0;
7544 if (mask
& OEX_FPU_UFLO
)
7545 printf ("%sUFLO", first
? "" : "|"), first
= 0;
7546 if (mask
& OEX_FPU_OFLO
)
7547 printf ("%sOFLO", first
? "" : "|"), first
= 0;
7548 if (mask
& OEX_FPU_DIV0
)
7549 printf ("%sDIV0", first
? "" : "|"), first
= 0;
7550 if (mask
& OEX_FPU_INVAL
)
7551 printf ("%sINVAL", first
? "" : "|");
7554 fputs ("0", stdout
);
7557 /* ARM EABI attributes section. */
7562 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
7565 } arm_attr_public_tag
;
7567 static const char *arm_attr_tag_CPU_arch
[] =
7568 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
7570 static const char *arm_attr_tag_ARM_ISA_use
[] = {"No", "Yes"};
7571 static const char *arm_attr_tag_THUMB_ISA_use
[] =
7572 {"No", "Thumb-1", "Thumb-2"};
7573 static const char *arm_attr_tag_VFP_arch
[] = {"No", "VFPv1", "VFPv2"};
7574 static const char *arm_attr_tag_WMMX_arch
[] = {"No", "WMMXv1"};
7575 static const char *arm_attr_tag_NEON_arch
[] = {"No", "NEONv1"};
7576 static const char *arm_attr_tag_ABI_PCS_config
[] =
7577 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
7578 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
7579 static const char *arm_attr_tag_ABI_PCS_R9_use
[] =
7580 {"V6", "SB", "TLS", "Unused"};
7581 static const char *arm_attr_tag_ABI_PCS_RW_data
[] =
7582 {"Absolute", "PC-relative", "SB-relative", "None"};
7583 static const char *arm_attr_tag_ABI_PCS_RO_DATA
[] =
7584 {"Absolute", "PC-relative", "None"};
7585 static const char *arm_attr_tag_ABI_PCS_GOT_use
[] =
7586 {"None", "direct", "GOT-indirect"};
7587 static const char *arm_attr_tag_ABI_PCS_wchar_t
[] =
7588 {"None", "??? 1", "2", "??? 3", "4"};
7589 static const char *arm_attr_tag_ABI_FP_rounding
[] = {"Unused", "Needed"};
7590 static const char *arm_attr_tag_ABI_FP_denormal
[] = {"Unused", "Needed"};
7591 static const char *arm_attr_tag_ABI_FP_exceptions
[] = {"Unused", "Needed"};
7592 static const char *arm_attr_tag_ABI_FP_user_exceptions
[] = {"Unused", "Needed"};
7593 static const char *arm_attr_tag_ABI_FP_number_model
[] =
7594 {"Unused", "Finite", "RTABI", "IEEE 754"};
7595 static const char *arm_attr_tag_ABI_align8_needed
[] = {"No", "Yes", "4-byte"};
7596 static const char *arm_attr_tag_ABI_align8_preserved
[] =
7597 {"No", "Yes, except leaf SP", "Yes"};
7598 static const char *arm_attr_tag_ABI_enum_size
[] =
7599 {"Unused", "small", "int", "forced to int"};
7600 static const char *arm_attr_tag_ABI_HardFP_use
[] =
7601 {"As Tag_VFP_arch", "SP only", "DP only", "SP and DP"};
7602 static const char *arm_attr_tag_ABI_VFP_args
[] =
7603 {"AAPCS", "VFP registers", "custom"};
7604 static const char *arm_attr_tag_ABI_WMMX_args
[] =
7605 {"AAPCS", "WMMX registers", "custom"};
7606 static const char *arm_attr_tag_ABI_optimization_goals
[] =
7607 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
7608 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
7609 static const char *arm_attr_tag_ABI_FP_optimization_goals
[] =
7610 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
7611 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
7613 #define LOOKUP(id, name) \
7614 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
7615 static arm_attr_public_tag arm_attr_public_tags
[] =
7617 {4, "CPU_raw_name", 1, NULL
},
7618 {5, "CPU_name", 1, NULL
},
7619 LOOKUP(6, CPU_arch
),
7620 {7, "CPU_arch_profile", 0, NULL
},
7621 LOOKUP(8, ARM_ISA_use
),
7622 LOOKUP(9, THUMB_ISA_use
),
7623 LOOKUP(10, VFP_arch
),
7624 LOOKUP(11, WMMX_arch
),
7625 LOOKUP(12, NEON_arch
),
7626 LOOKUP(13, ABI_PCS_config
),
7627 LOOKUP(14, ABI_PCS_R9_use
),
7628 LOOKUP(15, ABI_PCS_RW_data
),
7629 LOOKUP(16, ABI_PCS_RO_DATA
),
7630 LOOKUP(17, ABI_PCS_GOT_use
),
7631 LOOKUP(18, ABI_PCS_wchar_t
),
7632 LOOKUP(19, ABI_FP_rounding
),
7633 LOOKUP(20, ABI_FP_denormal
),
7634 LOOKUP(21, ABI_FP_exceptions
),
7635 LOOKUP(22, ABI_FP_user_exceptions
),
7636 LOOKUP(23, ABI_FP_number_model
),
7637 LOOKUP(24, ABI_align8_needed
),
7638 LOOKUP(25, ABI_align8_preserved
),
7639 LOOKUP(26, ABI_enum_size
),
7640 LOOKUP(27, ABI_HardFP_use
),
7641 LOOKUP(28, ABI_VFP_args
),
7642 LOOKUP(29, ABI_WMMX_args
),
7643 LOOKUP(30, ABI_optimization_goals
),
7644 LOOKUP(31, ABI_FP_optimization_goals
),
7645 {32, "compatibility", 0, NULL
}
7649 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
7652 read_uleb128 (unsigned char *p
, unsigned int *plen
)
7666 val
|= ((unsigned int)c
& 0x7f) << shift
;
7675 static unsigned char *
7676 display_arm_attribute (unsigned char *p
)
7681 arm_attr_public_tag
*attr
;
7685 tag
= read_uleb128 (p
, &len
);
7688 for (i
= 0; i
< ARRAY_SIZE(arm_attr_public_tags
); i
++)
7690 if (arm_attr_public_tags
[i
].tag
== tag
)
7692 attr
= &arm_attr_public_tags
[i
];
7699 printf (" Tag_%s: ", attr
->name
);
7705 case 7: /* Tag_CPU_arch_profile. */
7706 val
= read_uleb128 (p
, &len
);
7710 case 0: printf ("None\n"); break;
7711 case 'A': printf ("Application\n"); break;
7712 case 'R': printf ("Realtime\n"); break;
7713 case 'M': printf ("Microcontroller\n"); break;
7714 default: printf ("??? (%d)\n", val
); break;
7718 case 32: /* Tag_compatibility. */
7719 val
= read_uleb128 (p
, &len
);
7721 printf ("flag = %d, vendor = %s\n", val
, p
);
7722 p
+= strlen((char *)p
) + 1;
7736 assert (attr
->type
& 0x80);
7737 val
= read_uleb128 (p
, &len
);
7739 type
= attr
->type
& 0x7f;
7741 printf ("??? (%d)\n", val
);
7743 printf ("%s\n", attr
->table
[val
]);
7750 type
= 1; /* String. */
7752 type
= 2; /* uleb128. */
7753 printf (" Tag_unknown_%d: ", tag
);
7758 printf ("\"%s\"\n", p
);
7759 p
+= strlen((char *)p
) + 1;
7763 val
= read_uleb128 (p
, &len
);
7765 printf ("%d (0x%x)\n", val
, val
);
7772 process_arm_specific (FILE *file
)
7774 Elf_Internal_Shdr
*sect
;
7775 unsigned char *contents
;
7778 bfd_vma section_len
;
7782 /* Find the section header so that we get the size. */
7783 for (i
= 0, sect
= section_headers
;
7784 i
< elf_header
.e_shnum
;
7787 if (sect
->sh_type
!= SHT_ARM_ATTRIBUTES
)
7790 contents
= get_data (NULL
, file
, sect
->sh_offset
, 1, sect
->sh_size
,
7798 len
= sect
->sh_size
- 1;
7803 bfd_boolean public_section
;
7805 section_len
= byte_get (p
, 4);
7807 if (section_len
> len
)
7809 printf (_("ERROR: Bad section length (%d > %d)\n"),
7810 (int)section_len
, (int)len
);
7814 printf ("Attribute Section: %s\n", p
);
7815 if (strcmp ((char *)p
, "aeabi") == 0)
7816 public_section
= TRUE
;
7818 public_section
= FALSE
;
7819 namelen
= strlen ((char *)p
) + 1;
7821 section_len
-= namelen
+ 4;
7822 while (section_len
> 0)
7827 size
= byte_get (p
, 4);
7828 if (size
> section_len
)
7830 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
7831 (int)size
, (int)section_len
);
7834 section_len
-= size
;
7840 printf ("File Attributes\n");
7843 printf ("Section Attributes:");
7846 printf ("Symbol Attributes:");
7851 val
= read_uleb128 (p
, &i
);
7855 printf (" %d", val
);
7860 printf ("Unknown tag: %d\n", tag
);
7861 public_section
= FALSE
;
7867 p
= display_arm_attribute(p
);
7871 /* ??? Do something sensible, like dump hex. */
7872 printf (" Unknown section contexts\n");
7880 printf (_("Unknown format '%c'\n"), *p
);
7889 process_mips_specific (FILE *file
)
7891 Elf_Internal_Dyn
*entry
;
7892 size_t liblist_offset
= 0;
7893 size_t liblistno
= 0;
7894 size_t conflictsno
= 0;
7895 size_t options_offset
= 0;
7896 size_t conflicts_offset
= 0;
7898 /* We have a lot of special sections. Thanks SGI! */
7899 if (dynamic_section
== NULL
)
7900 /* No information available. */
7903 for (entry
= dynamic_section
; entry
->d_tag
!= DT_NULL
; ++entry
)
7904 switch (entry
->d_tag
)
7906 case DT_MIPS_LIBLIST
:
7908 = offset_from_vma (file
, entry
->d_un
.d_val
,
7909 liblistno
* sizeof (Elf32_External_Lib
));
7911 case DT_MIPS_LIBLISTNO
:
7912 liblistno
= entry
->d_un
.d_val
;
7914 case DT_MIPS_OPTIONS
:
7915 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
7917 case DT_MIPS_CONFLICT
:
7919 = offset_from_vma (file
, entry
->d_un
.d_val
,
7920 conflictsno
* sizeof (Elf32_External_Conflict
));
7922 case DT_MIPS_CONFLICTNO
:
7923 conflictsno
= entry
->d_un
.d_val
;
7929 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
7931 Elf32_External_Lib
*elib
;
7934 elib
= get_data (NULL
, file
, liblist_offset
,
7935 liblistno
, sizeof (Elf32_External_Lib
),
7939 printf ("\nSection '.liblist' contains %lu entries:\n",
7940 (unsigned long) liblistno
);
7941 fputs (" Library Time Stamp Checksum Version Flags\n",
7944 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
7951 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
7952 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
7953 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
7954 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
7955 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
7957 tmp
= gmtime (&time
);
7958 snprintf (timebuf
, sizeof (timebuf
),
7959 "%04u-%02u-%02uT%02u:%02u:%02u",
7960 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
7961 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
7963 printf ("%3lu: ", (unsigned long) cnt
);
7964 if (VALID_DYNAMIC_NAME (liblist
.l_name
))
7965 print_symbol (20, GET_DYNAMIC_NAME (liblist
.l_name
));
7967 printf ("<corrupt: %9ld>", liblist
.l_name
);
7968 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
7971 if (liblist
.l_flags
== 0)
7982 { " EXACT_MATCH", LL_EXACT_MATCH
},
7983 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
7984 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
7985 { " EXPORTS", LL_EXPORTS
},
7986 { " DELAY_LOAD", LL_DELAY_LOAD
},
7987 { " DELTA", LL_DELTA
}
7989 int flags
= liblist
.l_flags
;
7993 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
7995 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
7997 fputs (l_flags_vals
[fcnt
].name
, stdout
);
7998 flags
^= l_flags_vals
[fcnt
].bit
;
8001 printf (" %#x", (unsigned int) flags
);
8011 if (options_offset
!= 0)
8013 Elf_External_Options
*eopt
;
8014 Elf_Internal_Shdr
*sect
= section_headers
;
8015 Elf_Internal_Options
*iopt
;
8016 Elf_Internal_Options
*option
;
8020 /* Find the section header so that we get the size. */
8021 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
8024 eopt
= get_data (NULL
, file
, options_offset
, 1, sect
->sh_size
,
8028 iopt
= cmalloc ((sect
->sh_size
/ sizeof (eopt
)), sizeof (*iopt
));
8031 error (_("Out of memory"));
8038 while (offset
< sect
->sh_size
)
8040 Elf_External_Options
*eoption
;
8042 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
8044 option
->kind
= BYTE_GET (eoption
->kind
);
8045 option
->size
= BYTE_GET (eoption
->size
);
8046 option
->section
= BYTE_GET (eoption
->section
);
8047 option
->info
= BYTE_GET (eoption
->info
);
8049 offset
+= option
->size
;
8055 printf (_("\nSection '%s' contains %d entries:\n"),
8056 SECTION_NAME (sect
), cnt
);
8064 switch (option
->kind
)
8067 /* This shouldn't happen. */
8068 printf (" NULL %d %lx", option
->section
, option
->info
);
8071 printf (" REGINFO ");
8072 if (elf_header
.e_machine
== EM_MIPS
)
8075 Elf32_External_RegInfo
*ereg
;
8076 Elf32_RegInfo reginfo
;
8078 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
8079 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8080 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8081 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8082 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8083 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8084 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
8086 printf ("GPR %08lx GP 0x%lx\n",
8088 (unsigned long) reginfo
.ri_gp_value
);
8089 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8090 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8091 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8096 Elf64_External_RegInfo
*ereg
;
8097 Elf64_Internal_RegInfo reginfo
;
8099 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
8100 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8101 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8102 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8103 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8104 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8105 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
8107 printf ("GPR %08lx GP 0x",
8108 reginfo
.ri_gprmask
);
8109 printf_vma (reginfo
.ri_gp_value
);
8112 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8113 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8114 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8118 case ODK_EXCEPTIONS
:
8119 fputs (" EXCEPTIONS fpe_min(", stdout
);
8120 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
8121 fputs (") fpe_max(", stdout
);
8122 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
8123 fputs (")", stdout
);
8125 if (option
->info
& OEX_PAGE0
)
8126 fputs (" PAGE0", stdout
);
8127 if (option
->info
& OEX_SMM
)
8128 fputs (" SMM", stdout
);
8129 if (option
->info
& OEX_FPDBUG
)
8130 fputs (" FPDBUG", stdout
);
8131 if (option
->info
& OEX_DISMISS
)
8132 fputs (" DISMISS", stdout
);
8135 fputs (" PAD ", stdout
);
8136 if (option
->info
& OPAD_PREFIX
)
8137 fputs (" PREFIX", stdout
);
8138 if (option
->info
& OPAD_POSTFIX
)
8139 fputs (" POSTFIX", stdout
);
8140 if (option
->info
& OPAD_SYMBOL
)
8141 fputs (" SYMBOL", stdout
);
8144 fputs (" HWPATCH ", stdout
);
8145 if (option
->info
& OHW_R4KEOP
)
8146 fputs (" R4KEOP", stdout
);
8147 if (option
->info
& OHW_R8KPFETCH
)
8148 fputs (" R8KPFETCH", stdout
);
8149 if (option
->info
& OHW_R5KEOP
)
8150 fputs (" R5KEOP", stdout
);
8151 if (option
->info
& OHW_R5KCVTL
)
8152 fputs (" R5KCVTL", stdout
);
8155 fputs (" FILL ", stdout
);
8156 /* XXX Print content of info word? */
8159 fputs (" TAGS ", stdout
);
8160 /* XXX Print content of info word? */
8163 fputs (" HWAND ", stdout
);
8164 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8165 fputs (" R4KEOP_CHECKED", stdout
);
8166 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8167 fputs (" R4KEOP_CLEAN", stdout
);
8170 fputs (" HWOR ", stdout
);
8171 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8172 fputs (" R4KEOP_CHECKED", stdout
);
8173 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8174 fputs (" R4KEOP_CLEAN", stdout
);
8177 printf (" GP_GROUP %#06lx self-contained %#06lx",
8178 option
->info
& OGP_GROUP
,
8179 (option
->info
& OGP_SELF
) >> 16);
8182 printf (" IDENT %#06lx self-contained %#06lx",
8183 option
->info
& OGP_GROUP
,
8184 (option
->info
& OGP_SELF
) >> 16);
8187 /* This shouldn't happen. */
8188 printf (" %3d ??? %d %lx",
8189 option
->kind
, option
->section
, option
->info
);
8193 len
= sizeof (*eopt
);
8194 while (len
< option
->size
)
8195 if (((char *) option
)[len
] >= ' '
8196 && ((char *) option
)[len
] < 0x7f)
8197 printf ("%c", ((char *) option
)[len
++]);
8199 printf ("\\%03o", ((char *) option
)[len
++]);
8201 fputs ("\n", stdout
);
8209 if (conflicts_offset
!= 0 && conflictsno
!= 0)
8211 Elf32_Conflict
*iconf
;
8214 if (dynamic_symbols
== NULL
)
8216 error (_("conflict list found without a dynamic symbol table"));
8220 iconf
= cmalloc (conflictsno
, sizeof (*iconf
));
8223 error (_("Out of memory"));
8229 Elf32_External_Conflict
*econf32
;
8231 econf32
= get_data (NULL
, file
, conflicts_offset
,
8232 conflictsno
, sizeof (*econf32
), _("conflict"));
8236 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8237 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
8243 Elf64_External_Conflict
*econf64
;
8245 econf64
= get_data (NULL
, file
, conflicts_offset
,
8246 conflictsno
, sizeof (*econf64
), _("conflict"));
8250 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8251 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
8256 printf (_("\nSection '.conflict' contains %lu entries:\n"),
8257 (unsigned long) conflictsno
);
8258 puts (_(" Num: Index Value Name"));
8260 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8262 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
8264 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
8265 print_vma (psym
->st_value
, FULL_HEX
);
8267 if (VALID_DYNAMIC_NAME (psym
->st_name
))
8268 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
8270 printf ("<corrupt: %14ld>", psym
->st_name
);
8281 process_gnu_liblist (FILE *file
)
8283 Elf_Internal_Shdr
*section
, *string_sec
;
8284 Elf32_External_Lib
*elib
;
8293 for (i
= 0, section
= section_headers
;
8294 i
< elf_header
.e_shnum
;
8297 switch (section
->sh_type
)
8299 case SHT_GNU_LIBLIST
:
8300 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
)
8303 elib
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
8308 string_sec
= SECTION_HEADER (section
->sh_link
);
8310 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
8311 string_sec
->sh_size
, _("liblist string table"));
8312 strtab_size
= string_sec
->sh_size
;
8315 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
8321 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
8322 SECTION_NAME (section
),
8323 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
8325 puts (" Library Time Stamp Checksum Version Flags");
8327 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
8335 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
8336 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
8337 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
8338 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
8339 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
8341 tmp
= gmtime (&time
);
8342 snprintf (timebuf
, sizeof (timebuf
),
8343 "%04u-%02u-%02uT%02u:%02u:%02u",
8344 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
8345 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
8347 printf ("%3lu: ", (unsigned long) cnt
);
8349 printf ("%-20s", liblist
.l_name
< strtab_size
8350 ? strtab
+ liblist
.l_name
: "<corrupt>");
8352 printf ("%-20.20s", liblist
.l_name
< strtab_size
8353 ? strtab
+ liblist
.l_name
: "<corrupt>");
8354 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
8355 liblist
.l_version
, liblist
.l_flags
);
8366 get_note_type (unsigned e_type
)
8368 static char buff
[64];
8370 if (elf_header
.e_type
== ET_CORE
)
8374 return _("NT_AUXV (auxiliary vector)");
8376 return _("NT_PRSTATUS (prstatus structure)");
8378 return _("NT_FPREGSET (floating point registers)");
8380 return _("NT_PRPSINFO (prpsinfo structure)");
8382 return _("NT_TASKSTRUCT (task structure)");
8384 return _("NT_PRXFPREG (user_xfpregs structure)");
8386 return _("NT_PSTATUS (pstatus structure)");
8388 return _("NT_FPREGS (floating point registers)");
8390 return _("NT_PSINFO (psinfo structure)");
8392 return _("NT_LWPSTATUS (lwpstatus_t structure)");
8394 return _("NT_LWPSINFO (lwpsinfo_t structure)");
8395 case NT_WIN32PSTATUS
:
8396 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
8404 return _("NT_VERSION (version)");
8406 return _("NT_ARCH (architecture)");
8411 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
8416 get_netbsd_elfcore_note_type (unsigned e_type
)
8418 static char buff
[64];
8420 if (e_type
== NT_NETBSDCORE_PROCINFO
)
8422 /* NetBSD core "procinfo" structure. */
8423 return _("NetBSD procinfo structure");
8426 /* As of Jan 2002 there are no other machine-independent notes
8427 defined for NetBSD core files. If the note type is less
8428 than the start of the machine-dependent note types, we don't
8431 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
8433 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
8437 switch (elf_header
.e_machine
)
8439 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
8440 and PT_GETFPREGS == mach+2. */
8445 case EM_SPARC32PLUS
:
8449 case NT_NETBSDCORE_FIRSTMACH
+0:
8450 return _("PT_GETREGS (reg structure)");
8451 case NT_NETBSDCORE_FIRSTMACH
+2:
8452 return _("PT_GETFPREGS (fpreg structure)");
8458 /* On all other arch's, PT_GETREGS == mach+1 and
8459 PT_GETFPREGS == mach+3. */
8463 case NT_NETBSDCORE_FIRSTMACH
+1:
8464 return _("PT_GETREGS (reg structure)");
8465 case NT_NETBSDCORE_FIRSTMACH
+3:
8466 return _("PT_GETFPREGS (fpreg structure)");
8472 snprintf (buff
, sizeof (buff
), _("PT_FIRSTMACH+%d"),
8473 e_type
- NT_NETBSDCORE_FIRSTMACH
);
8477 /* Note that by the ELF standard, the name field is already null byte
8478 terminated, and namesz includes the terminating null byte.
8479 I.E. the value of namesz for the name "FSF" is 4.
8481 If the value of namesz is zero, there is no name present. */
8483 process_note (Elf_Internal_Note
*pnote
)
8487 if (pnote
->namesz
== 0)
8488 /* If there is no note name, then use the default set of
8489 note type strings. */
8490 nt
= get_note_type (pnote
->type
);
8492 else if (strneq (pnote
->namedata
, "NetBSD-CORE", 11))
8493 /* NetBSD-specific core file notes. */
8494 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
8497 /* Don't recognize this note name; just use the default set of
8498 note type strings. */
8499 nt
= get_note_type (pnote
->type
);
8501 printf (" %s\t\t0x%08lx\t%s\n",
8502 pnote
->namesz
? pnote
->namedata
: "(NONE)",
8509 process_corefile_note_segment (FILE *file
, bfd_vma offset
, bfd_vma length
)
8511 Elf_External_Note
*pnotes
;
8512 Elf_External_Note
*external
;
8518 pnotes
= get_data (NULL
, file
, offset
, 1, length
, _("notes"));
8524 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
8525 (unsigned long) offset
, (unsigned long) length
);
8526 printf (_(" Owner\t\tData size\tDescription\n"));
8528 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
8530 Elf_External_Note
*next
;
8531 Elf_Internal_Note inote
;
8534 inote
.type
= BYTE_GET (external
->type
);
8535 inote
.namesz
= BYTE_GET (external
->namesz
);
8536 inote
.namedata
= external
->name
;
8537 inote
.descsz
= BYTE_GET (external
->descsz
);
8538 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
8539 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
8541 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
8543 if (((char *) next
) > (((char *) pnotes
) + length
))
8545 warn (_("corrupt note found at offset %lx into core notes\n"),
8546 (long)((char *)external
- (char *)pnotes
));
8547 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
8548 inote
.type
, inote
.namesz
, inote
.descsz
);
8554 /* Verify that name is null terminated. It appears that at least
8555 one version of Linux (RedHat 6.0) generates corefiles that don't
8556 comply with the ELF spec by failing to include the null byte in
8558 if (inote
.namedata
[inote
.namesz
] != '\0')
8560 temp
= malloc (inote
.namesz
+ 1);
8564 error (_("Out of memory\n"));
8569 strncpy (temp
, inote
.namedata
, inote
.namesz
);
8570 temp
[inote
.namesz
] = 0;
8572 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
8573 inote
.namedata
= temp
;
8576 res
&= process_note (& inote
);
8591 process_corefile_note_segments (FILE *file
)
8593 Elf_Internal_Phdr
*segment
;
8597 if (! get_program_headers (file
))
8600 for (i
= 0, segment
= program_headers
;
8601 i
< elf_header
.e_phnum
;
8604 if (segment
->p_type
== PT_NOTE
)
8605 res
&= process_corefile_note_segment (file
,
8606 (bfd_vma
) segment
->p_offset
,
8607 (bfd_vma
) segment
->p_filesz
);
8614 process_note_sections (FILE *file
)
8616 Elf_Internal_Shdr
*section
;
8620 for (i
= 0, section
= section_headers
;
8621 i
< elf_header
.e_shnum
;
8623 if (section
->sh_type
== SHT_NOTE
)
8624 res
&= process_corefile_note_segment (file
,
8625 (bfd_vma
) section
->sh_offset
,
8626 (bfd_vma
) section
->sh_size
);
8632 process_notes (FILE *file
)
8634 /* If we have not been asked to display the notes then do nothing. */
8638 if (elf_header
.e_type
!= ET_CORE
)
8639 return process_note_sections (file
);
8641 /* No program headers means no NOTE segment. */
8642 if (elf_header
.e_phnum
> 0)
8643 return process_corefile_note_segments (file
);
8645 printf (_("No note segments present in the core file.\n"));
8650 process_arch_specific (FILE *file
)
8655 switch (elf_header
.e_machine
)
8658 return process_arm_specific (file
);
8660 case EM_MIPS_RS3_LE
:
8661 return process_mips_specific (file
);
8670 get_file_header (FILE *file
)
8672 /* Read in the identity array. */
8673 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
8676 /* Determine how to read the rest of the header. */
8677 switch (elf_header
.e_ident
[EI_DATA
])
8679 default: /* fall through */
8680 case ELFDATANONE
: /* fall through */
8682 byte_get
= byte_get_little_endian
;
8683 byte_put
= byte_put_little_endian
;
8686 byte_get
= byte_get_big_endian
;
8687 byte_put
= byte_put_big_endian
;
8691 /* For now we only support 32 bit and 64 bit ELF files. */
8692 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
8694 /* Read in the rest of the header. */
8697 Elf32_External_Ehdr ehdr32
;
8699 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
8702 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
8703 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
8704 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
8705 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
8706 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
8707 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
8708 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
8709 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
8710 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
8711 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
8712 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
8713 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
8714 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
8718 Elf64_External_Ehdr ehdr64
;
8720 /* If we have been compiled with sizeof (bfd_vma) == 4, then
8721 we will not be able to cope with the 64bit data found in
8722 64 ELF files. Detect this now and abort before we start
8723 overwriting things. */
8724 if (sizeof (bfd_vma
) < 8)
8726 error (_("This instance of readelf has been built without support for a\n\
8727 64 bit data type and so it cannot read 64 bit ELF files.\n"));
8731 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
8734 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
8735 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
8736 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
8737 elf_header
.e_entry
= BYTE_GET (ehdr64
.e_entry
);
8738 elf_header
.e_phoff
= BYTE_GET (ehdr64
.e_phoff
);
8739 elf_header
.e_shoff
= BYTE_GET (ehdr64
.e_shoff
);
8740 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
8741 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
8742 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
8743 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
8744 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
8745 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
8746 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
8749 if (elf_header
.e_shoff
)
8751 /* There may be some extensions in the first section header. Don't
8752 bomb if we can't read it. */
8754 get_32bit_section_headers (file
, 1);
8756 get_64bit_section_headers (file
, 1);
8759 is_relocatable
= elf_header
.e_type
== ET_REL
;
8764 /* Process one ELF object file according to the command line options.
8765 This file may actually be stored in an archive. The file is
8766 positioned at the start of the ELF object. */
8769 process_object (char *file_name
, FILE *file
)
8773 if (! get_file_header (file
))
8775 error (_("%s: Failed to read file header\n"), file_name
);
8779 /* Initialise per file variables. */
8780 for (i
= NUM_ELEM (version_info
); i
--;)
8781 version_info
[i
] = 0;
8783 for (i
= NUM_ELEM (dynamic_info
); i
--;)
8784 dynamic_info
[i
] = 0;
8786 /* Process the file. */
8788 printf (_("\nFile: %s\n"), file_name
);
8790 /* Initialise the dump_sects array from the cmdline_dump_sects array.
8791 Note we do this even if cmdline_dump_sects is empty because we
8792 must make sure that the dump_sets array is zeroed out before each
8793 object file is processed. */
8794 if (num_dump_sects
> num_cmdline_dump_sects
)
8795 memset (dump_sects
, 0, num_dump_sects
);
8797 if (num_cmdline_dump_sects
> 0)
8799 if (num_dump_sects
== 0)
8800 /* A sneaky way of allocating the dump_sects array. */
8801 request_dump (num_cmdline_dump_sects
, 0);
8803 assert (num_dump_sects
>= num_cmdline_dump_sects
);
8804 memcpy (dump_sects
, cmdline_dump_sects
, num_cmdline_dump_sects
);
8807 if (! process_file_header ())
8810 if (! process_section_headers (file
))
8812 /* Without loaded section headers we cannot process lots of
8814 do_unwind
= do_version
= do_dump
= do_arch
= 0;
8816 if (! do_using_dynamic
)
8817 do_syms
= do_reloc
= 0;
8820 if (! process_section_groups (file
))
8822 /* Without loaded section groups we cannot process unwind. */
8826 if (process_program_headers (file
))
8827 process_dynamic_section (file
);
8829 process_relocs (file
);
8831 process_unwind (file
);
8833 process_symbol_table (file
);
8835 process_syminfo (file
);
8837 process_version_sections (file
);
8839 process_section_contents (file
);
8841 process_notes (file
);
8843 process_gnu_liblist (file
);
8845 process_arch_specific (file
);
8847 if (program_headers
)
8849 free (program_headers
);
8850 program_headers
= NULL
;
8853 if (section_headers
)
8855 free (section_headers
);
8856 section_headers
= NULL
;
8861 free (string_table
);
8862 string_table
= NULL
;
8863 string_table_length
= 0;
8866 if (dynamic_strings
)
8868 free (dynamic_strings
);
8869 dynamic_strings
= NULL
;
8870 dynamic_strings_length
= 0;
8873 if (dynamic_symbols
)
8875 free (dynamic_symbols
);
8876 dynamic_symbols
= NULL
;
8877 num_dynamic_syms
= 0;
8880 if (dynamic_syminfo
)
8882 free (dynamic_syminfo
);
8883 dynamic_syminfo
= NULL
;
8886 if (section_headers_groups
)
8888 free (section_headers_groups
);
8889 section_headers_groups
= NULL
;
8894 struct group_list
*g
, *next
;
8896 for (i
= 0; i
< group_count
; i
++)
8898 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
8905 free (section_groups
);
8906 section_groups
= NULL
;
8909 free_debug_memory ();
8914 /* Process an ELF archive. The file is positioned just after the
8918 process_archive (char *file_name
, FILE *file
)
8920 struct ar_hdr arhdr
;
8923 char *longnames
= NULL
;
8924 unsigned long longnames_size
= 0;
8925 size_t file_name_size
;
8930 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
8931 if (got
!= sizeof arhdr
)
8936 error (_("%s: failed to read archive header\n"), file_name
);
8940 if (memcmp (arhdr
.ar_name
, "/ ", 16) == 0)
8942 /* This is the archive symbol table. Skip it.
8943 FIXME: We should have an option to dump it. */
8944 size
= strtoul (arhdr
.ar_size
, NULL
, 10);
8945 if (fseek (file
, size
+ (size
& 1), SEEK_CUR
) != 0)
8947 error (_("%s: failed to skip archive symbol table\n"), file_name
);
8951 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
8952 if (got
!= sizeof arhdr
)
8957 error (_("%s: failed to read archive header\n"), file_name
);
8962 if (memcmp (arhdr
.ar_name
, "// ", 16) == 0)
8964 /* This is the archive string table holding long member
8967 longnames_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
8969 longnames
= malloc (longnames_size
);
8970 if (longnames
== NULL
)
8972 error (_("Out of memory\n"));
8976 if (fread (longnames
, longnames_size
, 1, file
) != 1)
8979 error (_("%s: failed to read string table\n"), file_name
);
8983 if ((longnames_size
& 1) != 0)
8986 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
8987 if (got
!= sizeof arhdr
)
8994 error (_("%s: failed to read archive header\n"), file_name
);
8999 file_name_size
= strlen (file_name
);
9008 if (arhdr
.ar_name
[0] == '/')
9012 off
= strtoul (arhdr
.ar_name
+ 1, NULL
, 10);
9013 if (off
>= longnames_size
)
9015 error (_("%s: invalid archive string table offset %lu\n"), file_name
, off
);
9020 name
= longnames
+ off
;
9021 nameend
= memchr (name
, '/', longnames_size
- off
);
9025 name
= arhdr
.ar_name
;
9026 nameend
= memchr (name
, '/', 16);
9029 if (nameend
== NULL
)
9031 error (_("%s: bad archive file name\n"), file_name
);
9036 namealc
= malloc (file_name_size
+ (nameend
- name
) + 3);
9037 if (namealc
== NULL
)
9039 error (_("Out of memory\n"));
9044 memcpy (namealc
, file_name
, file_name_size
);
9045 namealc
[file_name_size
] = '(';
9046 memcpy (namealc
+ file_name_size
+ 1, name
, nameend
- name
);
9047 namealc
[file_name_size
+ 1 + (nameend
- name
)] = ')';
9048 namealc
[file_name_size
+ 2 + (nameend
- name
)] = '\0';
9050 archive_file_offset
= ftell (file
);
9051 archive_file_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
9053 ret
|= process_object (namealc
, file
);
9058 (archive_file_offset
9060 + (archive_file_size
& 1)),
9063 error (_("%s: failed to seek to next archive header\n"), file_name
);
9068 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
9069 if (got
!= sizeof arhdr
)
9074 error (_("%s: failed to read archive header\n"), file_name
);
9087 process_file (char *file_name
)
9090 struct stat statbuf
;
9094 if (stat (file_name
, &statbuf
) < 0)
9096 if (errno
== ENOENT
)
9097 error (_("'%s': No such file\n"), file_name
);
9099 error (_("Could not locate '%s'. System error message: %s\n"),
9100 file_name
, strerror (errno
));
9104 if (! S_ISREG (statbuf
.st_mode
))
9106 error (_("'%s' is not an ordinary file\n"), file_name
);
9110 file
= fopen (file_name
, "rb");
9113 error (_("Input file '%s' is not readable.\n"), file_name
);
9117 if (fread (armag
, SARMAG
, 1, file
) != 1)
9119 error (_("%s: Failed to read file header\n"), file_name
);
9124 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
9125 ret
= process_archive (file_name
, file
);
9129 archive_file_size
= archive_file_offset
= 0;
9130 ret
= process_object (file_name
, file
);
9138 #ifdef SUPPORT_DISASSEMBLY
9139 /* Needed by the i386 disassembler. For extra credit, someone could
9140 fix this so that we insert symbolic addresses here, esp for GOT/PLT
9144 print_address (unsigned int addr
, FILE *outfile
)
9146 fprintf (outfile
,"0x%8.8x", addr
);
9149 /* Needed by the i386 disassembler. */
9151 db_task_printsym (unsigned int addr
)
9153 print_address (addr
, stderr
);
9158 main (int argc
, char **argv
)
9162 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9163 setlocale (LC_MESSAGES
, "");
9165 #if defined (HAVE_SETLOCALE)
9166 setlocale (LC_CTYPE
, "");
9168 bindtextdomain (PACKAGE
, LOCALEDIR
);
9169 textdomain (PACKAGE
);
9171 expandargv (&argc
, &argv
);
9173 parse_args (argc
, argv
);
9175 if (num_dump_sects
> 0)
9177 /* Make a copy of the dump_sects array. */
9178 cmdline_dump_sects
= malloc (num_dump_sects
);
9179 if (cmdline_dump_sects
== NULL
)
9180 error (_("Out of memory allocating dump request table."));
9183 memcpy (cmdline_dump_sects
, dump_sects
, num_dump_sects
);
9184 num_cmdline_dump_sects
= num_dump_sects
;
9188 if (optind
< (argc
- 1))
9192 while (optind
< argc
)
9193 err
|= process_file (argv
[optind
++]);
9195 if (dump_sects
!= NULL
)
9197 if (cmdline_dump_sects
!= NULL
)
9198 free (cmdline_dump_sects
);