1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3 2008 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 3 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. */
60 # ifdef HAVE_SYS_PARAM_H
61 # include <sys/param.h>
65 # define PATH_MAX MAXPATHLEN
67 # define PATH_MAX 1024
73 /* Define BFD64 here, even if our default architecture is 32 bit ELF
74 as this will allow us to read in and parse 64bit and 32bit ELF files.
75 Only do this if we believe that the compiler can support a 64 bit
76 data type. For now we only rely on GCC being able to do this. */
84 #include "elf/common.h"
85 #include "elf/external.h"
86 #include "elf/internal.h"
89 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
90 we can obtain the H8 reloc numbers. We need these for the
91 get_reloc_size() function. We include h8.h again after defining
92 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
97 /* Undo the effects of #including reloc-macros.h. */
99 #undef START_RELOC_NUMBERS
103 #undef END_RELOC_NUMBERS
104 #undef _RELOC_MACROS_H
106 /* The following headers use the elf/reloc-macros.h file to
107 automatically generate relocation recognition functions
108 such as elf_mips_reloc_type() */
110 #define RELOC_MACROS_GEN_FUNC
112 #include "elf/alpha.h"
116 #include "elf/bfin.h"
117 #include "elf/cr16.h"
118 #include "elf/cris.h"
120 #include "elf/d10v.h"
121 #include "elf/d30v.h"
123 #include "elf/fr30.h"
126 #include "elf/hppa.h"
127 #include "elf/i386.h"
128 #include "elf/i370.h"
129 #include "elf/i860.h"
130 #include "elf/i960.h"
131 #include "elf/ia64.h"
132 #include "elf/ip2k.h"
133 #include "elf/iq2000.h"
134 #include "elf/m32c.h"
135 #include "elf/m32r.h"
136 #include "elf/m68k.h"
137 #include "elf/m68hc11.h"
138 #include "elf/mcore.h"
140 #include "elf/mips.h"
141 #include "elf/mmix.h"
142 #include "elf/mn10200.h"
143 #include "elf/mn10300.h"
145 #include "elf/msp430.h"
146 #include "elf/or32.h"
149 #include "elf/ppc64.h"
150 #include "elf/s390.h"
151 #include "elf/score.h"
153 #include "elf/sparc.h"
155 #include "elf/v850.h"
157 #include "elf/x86-64.h"
158 #include "elf/xstormy16.h"
159 #include "elf/xtensa.h"
164 #include "libiberty.h"
165 #include "safe-ctype.h"
167 char *program_name
= "readelf";
169 static long archive_file_offset
;
170 static unsigned long archive_file_size
;
171 static unsigned long dynamic_addr
;
172 static bfd_size_type dynamic_size
;
173 static unsigned int dynamic_nent
;
174 static char *dynamic_strings
;
175 static unsigned long dynamic_strings_length
;
176 static char *string_table
;
177 static unsigned long string_table_length
;
178 static unsigned long num_dynamic_syms
;
179 static Elf_Internal_Sym
*dynamic_symbols
;
180 static Elf_Internal_Syminfo
*dynamic_syminfo
;
181 static unsigned long dynamic_syminfo_offset
;
182 static unsigned int dynamic_syminfo_nent
;
183 static char program_interpreter
[PATH_MAX
];
184 static bfd_vma dynamic_info
[DT_JMPREL
+ 1];
185 static bfd_vma dynamic_info_DT_GNU_HASH
;
186 static bfd_vma version_info
[16];
187 static Elf_Internal_Ehdr elf_header
;
188 static Elf_Internal_Shdr
*section_headers
;
189 static Elf_Internal_Phdr
*program_headers
;
190 static Elf_Internal_Dyn
*dynamic_section
;
191 static Elf_Internal_Shdr
*symtab_shndx_hdr
;
192 static int show_name
;
193 static int do_dynamic
;
196 static int do_sections
;
197 static int do_section_groups
;
198 static int do_section_details
;
199 static int do_segments
;
200 static int do_unwind
;
201 static int do_using_dynamic
;
202 static int do_header
;
204 static int do_version
;
205 static int do_histogram
;
206 static int do_debugging
;
209 static int do_archive_index
;
210 static int is_32bit_elf
;
214 struct group_list
*next
;
215 unsigned int section_index
;
220 struct group_list
*root
;
221 unsigned int group_index
;
224 static size_t group_count
;
225 static struct group
*section_groups
;
226 static struct group
**section_headers_groups
;
229 /* Flag bits indicating particular types of dump. */
230 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
231 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
232 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
233 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
235 typedef unsigned char dump_type
;
237 /* A linked list of the section names for which dumps were requested. */
238 struct dump_list_entry
242 struct dump_list_entry
*next
;
244 static struct dump_list_entry
*dump_sects_byname
;
246 /* A dynamic array of flags indicating for which sections a dump
247 has been requested via command line switches. */
248 static dump_type
* cmdline_dump_sects
= NULL
;
249 static unsigned int num_cmdline_dump_sects
= 0;
251 /* A dynamic array of flags indicating for which sections a dump of
252 some kind has been requested. It is reset on a per-object file
253 basis and then initialised from the cmdline_dump_sects array,
254 the results of interpreting the -w switch, and the
255 dump_sects_byname list. */
256 static dump_type
* dump_sects
= NULL
;
257 static unsigned int num_dump_sects
= 0;
260 /* How to print a vma value. */
261 typedef enum print_mode
273 static void (*byte_put
) (unsigned char *, bfd_vma
, int);
277 #define SECTION_NAME(X) \
278 ((X) == NULL ? "<none>" \
279 : string_table == NULL ? "<no-name>" \
280 : ((X)->sh_name >= string_table_length ? "<corrupt>" \
281 : string_table + (X)->sh_name))
283 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
285 #define BYTE_GET(field) byte_get (field, sizeof (field))
287 #define GET_ELF_SYMBOLS(file, section) \
288 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
289 : get_64bit_elf_symbols (file, section))
291 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
292 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
293 already been called and verified that the string exists. */
294 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
296 /* This is just a bit of syntatic sugar. */
297 #define streq(a,b) (strcmp ((a), (b)) == 0)
298 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
299 #define const_strneq(a,b) (strncmp ((a), (b), sizeof (b) - 1) == 0)
302 get_data (void *var
, FILE *file
, long offset
, size_t size
, size_t nmemb
,
307 if (size
== 0 || nmemb
== 0)
310 if (fseek (file
, archive_file_offset
+ offset
, SEEK_SET
))
312 error (_("Unable to seek to 0x%lx for %s\n"),
313 (unsigned long) archive_file_offset
+ offset
, reason
);
320 /* Check for overflow. */
321 if (nmemb
< (~(size_t) 0 - 1) / size
)
322 /* + 1 so that we can '\0' terminate invalid string table sections. */
323 mvar
= malloc (size
* nmemb
+ 1);
327 error (_("Out of memory allocating 0x%lx bytes for %s\n"),
328 (unsigned long)(size
* nmemb
), reason
);
332 ((char *) mvar
)[size
* nmemb
] = '\0';
335 if (fread (mvar
, size
, nmemb
, file
) != nmemb
)
337 error (_("Unable to read in 0x%lx bytes of %s\n"),
338 (unsigned long)(size
* nmemb
), reason
);
348 byte_put_little_endian (unsigned char *field
, bfd_vma value
, int size
)
353 field
[7] = (((value
>> 24) >> 24) >> 8) & 0xff;
354 field
[6] = ((value
>> 24) >> 24) & 0xff;
355 field
[5] = ((value
>> 24) >> 16) & 0xff;
356 field
[4] = ((value
>> 24) >> 8) & 0xff;
359 field
[3] = (value
>> 24) & 0xff;
360 field
[2] = (value
>> 16) & 0xff;
363 field
[1] = (value
>> 8) & 0xff;
366 field
[0] = value
& 0xff;
370 error (_("Unhandled data length: %d\n"), size
);
375 /* Print a VMA value. */
377 print_vma (bfd_vma vma
, print_mode mode
)
390 return nc
+ printf ("%8.8" BFD_VMA_FMT
"x", vma
);
397 return printf ("%5" BFD_VMA_FMT
"d", vma
);
405 return nc
+ printf ("%" BFD_VMA_FMT
"x", vma
);
408 return printf ("%" BFD_VMA_FMT
"d", vma
);
411 return printf ("%" BFD_VMA_FMT
"u", vma
);
416 /* Display a symbol on stdout. Handles the display of
417 non-printing characters.
418 If DO_WIDE is not true then format the symbol to be
419 at most WIDTH characters, truncating as necessary.
420 If WIDTH is negative then format the string to be
421 exactly - WIDTH characters, truncating or padding
425 print_symbol (int width
, const char *symbol
)
427 const char * format_string
;
432 format_string
= "%.*s";
433 /* Set the width to a very large value. This simplifies the code below. */
438 format_string
= "%-*.*2s";
439 /* Keep the width positive. This also helps. */
444 format_string
= "%-.*s";
453 /* Look for non-printing symbols inside the symbol's name.
454 This test is triggered in particular by the names generated
455 by the assembler for local labels. */
456 while (ISPRINT (* c
))
466 printf (format_string
, len
, symbol
);
471 if (* c
== 0 || width
== 0)
474 /* Now display the non-printing character, if
475 there is room left in which to dipslay it. */
481 printf ("^%c", *c
+ 0x40);
490 printf ("<0x%.2x>", *c
);
500 byte_put_big_endian (unsigned char *field
, bfd_vma value
, int size
)
505 field
[7] = value
& 0xff;
506 field
[6] = (value
>> 8) & 0xff;
507 field
[5] = (value
>> 16) & 0xff;
508 field
[4] = (value
>> 24) & 0xff;
513 field
[3] = value
& 0xff;
514 field
[2] = (value
>> 8) & 0xff;
518 field
[1] = value
& 0xff;
522 field
[0] = value
& 0xff;
526 error (_("Unhandled data length: %d\n"), size
);
531 /* Return a pointer to section NAME, or NULL if no such section exists. */
533 static Elf_Internal_Shdr
*
534 find_section (const char *name
)
538 for (i
= 0; i
< elf_header
.e_shnum
; i
++)
539 if (streq (SECTION_NAME (section_headers
+ i
), name
))
540 return section_headers
+ i
;
545 /* Guess the relocation size commonly used by the specific machines. */
548 guess_is_rela (unsigned int e_machine
)
552 /* Targets that use REL relocations. */
568 /* Targets that use RELA relocations. */
572 case EM_ALTERA_NIOS2
:
599 case EM_CYGNUS_MN10200
:
601 case EM_CYGNUS_MN10300
:
642 warn (_("Don't know about relocations on this machine architecture\n"));
648 slurp_rela_relocs (FILE *file
,
649 unsigned long rel_offset
,
650 unsigned long rel_size
,
651 Elf_Internal_Rela
**relasp
,
652 unsigned long *nrelasp
)
654 Elf_Internal_Rela
*relas
;
655 unsigned long nrelas
;
660 Elf32_External_Rela
*erelas
;
662 erelas
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
666 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
668 relas
= cmalloc (nrelas
, sizeof (Elf_Internal_Rela
));
673 error (_("out of memory parsing relocs\n"));
677 for (i
= 0; i
< nrelas
; i
++)
679 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
680 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
681 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
688 Elf64_External_Rela
*erelas
;
690 erelas
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
694 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
696 relas
= cmalloc (nrelas
, sizeof (Elf_Internal_Rela
));
701 error (_("out of memory parsing relocs\n"));
705 for (i
= 0; i
< nrelas
; i
++)
707 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
708 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
709 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
720 slurp_rel_relocs (FILE *file
,
721 unsigned long rel_offset
,
722 unsigned long rel_size
,
723 Elf_Internal_Rela
**relsp
,
724 unsigned long *nrelsp
)
726 Elf_Internal_Rela
*rels
;
732 Elf32_External_Rel
*erels
;
734 erels
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
738 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
740 rels
= cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
745 error (_("out of memory parsing relocs\n"));
749 for (i
= 0; i
< nrels
; i
++)
751 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
752 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
753 rels
[i
].r_addend
= 0;
760 Elf64_External_Rel
*erels
;
762 erels
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
766 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
768 rels
= cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
773 error (_("out of memory parsing relocs\n"));
777 for (i
= 0; i
< nrels
; i
++)
779 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
780 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
781 rels
[i
].r_addend
= 0;
791 /* Returns the reloc type extracted from the reloc info field. */
794 get_reloc_type (bfd_vma reloc_info
)
797 return ELF32_R_TYPE (reloc_info
);
799 switch (elf_header
.e_machine
)
802 /* Note: We assume that reloc_info has already been adjusted for us. */
803 return ELF64_MIPS_R_TYPE (reloc_info
);
806 return ELF64_R_TYPE_ID (reloc_info
);
809 return ELF64_R_TYPE (reloc_info
);
813 /* Return the symbol index extracted from the reloc info field. */
816 get_reloc_symindex (bfd_vma reloc_info
)
818 return is_32bit_elf
? ELF32_R_SYM (reloc_info
) : ELF64_R_SYM (reloc_info
);
821 /* Display the contents of the relocation data found at the specified
825 dump_relocations (FILE *file
,
826 unsigned long rel_offset
,
827 unsigned long rel_size
,
828 Elf_Internal_Sym
*symtab
,
831 unsigned long strtablen
,
835 Elf_Internal_Rela
*rels
;
838 if (is_rela
== UNKNOWN
)
839 is_rela
= guess_is_rela (elf_header
.e_machine
);
843 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
848 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
857 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
859 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
864 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
866 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
874 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
876 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
881 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
883 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
887 for (i
= 0; i
< rel_size
; i
++)
892 bfd_vma symtab_index
;
895 offset
= rels
[i
].r_offset
;
896 info
= rels
[i
].r_info
;
898 /* The #ifdef BFD64 below is to prevent a compile time warning.
899 We know that if we do not have a 64 bit data type that we
900 will never execute this code anyway. */
903 && elf_header
.e_machine
== EM_MIPS
904 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
906 /* In little-endian objects, r_info isn't really a 64-bit
907 little-endian value: it has a 32-bit little-endian
908 symbol index followed by four individual byte fields.
909 Reorder INFO accordingly. */
910 info
= (((info
& 0xffffffff) << 32)
911 | ((info
>> 56) & 0xff)
912 | ((info
>> 40) & 0xff00)
913 | ((info
>> 24) & 0xff0000)
914 | ((info
>> 8) & 0xff000000));
918 type
= get_reloc_type (info
);
919 symtab_index
= get_reloc_symindex (info
);
923 printf ("%8.8lx %8.8lx ",
924 (unsigned long) offset
& 0xffffffff,
925 (unsigned long) info
& 0xffffffff);
929 #if BFD_HOST_64BIT_LONG
931 ? "%16.16lx %16.16lx "
932 : "%12.12lx %12.12lx ",
934 #elif BFD_HOST_64BIT_LONG_LONG
937 ? "%16.16llx %16.16llx "
938 : "%12.12llx %12.12llx ",
942 ? "%16.16I64x %16.16I64x "
943 : "%12.12I64x %12.12I64x ",
948 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
949 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
950 _bfd_int64_high (offset
),
951 _bfd_int64_low (offset
),
952 _bfd_int64_high (info
),
953 _bfd_int64_low (info
));
957 switch (elf_header
.e_machine
)
965 rtype
= elf_m32r_reloc_type (type
);
970 rtype
= elf_i386_reloc_type (type
);
975 rtype
= elf_m68hc11_reloc_type (type
);
979 rtype
= elf_m68k_reloc_type (type
);
983 rtype
= elf_i960_reloc_type (type
);
988 rtype
= elf_avr_reloc_type (type
);
995 rtype
= elf_sparc_reloc_type (type
);
999 rtype
= elf_spu_reloc_type (type
);
1003 case EM_CYGNUS_V850
:
1004 rtype
= v850_reloc_type (type
);
1008 case EM_CYGNUS_D10V
:
1009 rtype
= elf_d10v_reloc_type (type
);
1013 case EM_CYGNUS_D30V
:
1014 rtype
= elf_d30v_reloc_type (type
);
1018 rtype
= elf_dlx_reloc_type (type
);
1022 rtype
= elf_sh_reloc_type (type
);
1026 case EM_CYGNUS_MN10300
:
1027 rtype
= elf_mn10300_reloc_type (type
);
1031 case EM_CYGNUS_MN10200
:
1032 rtype
= elf_mn10200_reloc_type (type
);
1036 case EM_CYGNUS_FR30
:
1037 rtype
= elf_fr30_reloc_type (type
);
1041 rtype
= elf_frv_reloc_type (type
);
1045 rtype
= elf_mcore_reloc_type (type
);
1049 rtype
= elf_mmix_reloc_type (type
);
1054 rtype
= elf_msp430_reloc_type (type
);
1058 rtype
= elf_ppc_reloc_type (type
);
1062 rtype
= elf_ppc64_reloc_type (type
);
1066 case EM_MIPS_RS3_LE
:
1067 rtype
= elf_mips_reloc_type (type
);
1071 rtype
= elf_alpha_reloc_type (type
);
1075 rtype
= elf_arm_reloc_type (type
);
1079 rtype
= elf_arc_reloc_type (type
);
1083 rtype
= elf_hppa_reloc_type (type
);
1089 rtype
= elf_h8_reloc_type (type
);
1094 rtype
= elf_or32_reloc_type (type
);
1099 rtype
= elf_pj_reloc_type (type
);
1102 rtype
= elf_ia64_reloc_type (type
);
1106 rtype
= elf_cris_reloc_type (type
);
1110 rtype
= elf_i860_reloc_type (type
);
1114 rtype
= elf_x86_64_reloc_type (type
);
1118 rtype
= i370_reloc_type (type
);
1123 rtype
= elf_s390_reloc_type (type
);
1127 rtype
= elf_score_reloc_type (type
);
1131 rtype
= elf_xstormy16_reloc_type (type
);
1135 rtype
= elf_crx_reloc_type (type
);
1139 rtype
= elf_vax_reloc_type (type
);
1144 rtype
= elf_ip2k_reloc_type (type
);
1148 rtype
= elf_iq2000_reloc_type (type
);
1153 rtype
= elf_xtensa_reloc_type (type
);
1158 rtype
= elf_m32c_reloc_type (type
);
1162 rtype
= elf_mt_reloc_type (type
);
1166 rtype
= elf_bfin_reloc_type (type
);
1170 rtype
= elf_mep_reloc_type (type
);
1175 rtype
= elf_cr16_reloc_type (type
);
1180 printf (_("unrecognized: %-7lx"), (unsigned long) type
& 0xffffffff);
1182 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1184 if (elf_header
.e_machine
== EM_ALPHA
1186 && streq (rtype
, "R_ALPHA_LITUSE")
1189 switch (rels
[i
].r_addend
)
1191 case LITUSE_ALPHA_ADDR
: rtype
= "ADDR"; break;
1192 case LITUSE_ALPHA_BASE
: rtype
= "BASE"; break;
1193 case LITUSE_ALPHA_BYTOFF
: rtype
= "BYTOFF"; break;
1194 case LITUSE_ALPHA_JSR
: rtype
= "JSR"; break;
1195 case LITUSE_ALPHA_TLSGD
: rtype
= "TLSGD"; break;
1196 case LITUSE_ALPHA_TLSLDM
: rtype
= "TLSLDM"; break;
1197 case LITUSE_ALPHA_JSRDIRECT
: rtype
= "JSRDIRECT"; break;
1198 default: rtype
= NULL
;
1201 printf (" (%s)", rtype
);
1205 printf (_("<unknown addend: %lx>"),
1206 (unsigned long) rels
[i
].r_addend
);
1209 else if (symtab_index
)
1211 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1212 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1215 Elf_Internal_Sym
*psym
;
1217 psym
= symtab
+ symtab_index
;
1220 print_vma (psym
->st_value
, LONG_HEX
);
1221 printf (is_32bit_elf
? " " : " ");
1223 if (psym
->st_name
== 0)
1225 const char *sec_name
= "<null>";
1228 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1230 if (psym
->st_shndx
< elf_header
.e_shnum
)
1232 = SECTION_NAME (section_headers
+ psym
->st_shndx
);
1233 else if (psym
->st_shndx
== SHN_ABS
)
1235 else if (psym
->st_shndx
== SHN_COMMON
)
1236 sec_name
= "COMMON";
1237 else if (elf_header
.e_machine
== EM_MIPS
1238 && psym
->st_shndx
== SHN_MIPS_SCOMMON
)
1239 sec_name
= "SCOMMON";
1240 else if (elf_header
.e_machine
== EM_MIPS
1241 && psym
->st_shndx
== SHN_MIPS_SUNDEFINED
)
1242 sec_name
= "SUNDEF";
1243 else if (elf_header
.e_machine
== EM_X86_64
1244 && psym
->st_shndx
== SHN_X86_64_LCOMMON
)
1245 sec_name
= "LARGE_COMMON";
1246 else if (elf_header
.e_machine
== EM_IA_64
1247 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1248 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1249 sec_name
= "ANSI_COM";
1250 else if (elf_header
.e_machine
== EM_IA_64
1251 && (elf_header
.e_ident
[EI_OSABI
]
1252 == ELFOSABI_OPENVMS
)
1253 && psym
->st_shndx
== SHN_IA_64_VMS_SYMVEC
)
1254 sec_name
= "VMS_SYMVEC";
1257 sprintf (name_buf
, "<section 0x%x>",
1258 (unsigned int) psym
->st_shndx
);
1259 sec_name
= name_buf
;
1262 print_symbol (22, sec_name
);
1264 else if (strtab
== NULL
)
1265 printf (_("<string table index: %3ld>"), psym
->st_name
);
1266 else if (psym
->st_name
>= strtablen
)
1267 printf (_("<corrupt string table index: %3ld>"), psym
->st_name
);
1269 print_symbol (22, strtab
+ psym
->st_name
);
1272 printf (" + %lx", (unsigned long) rels
[i
].r_addend
);
1277 printf ("%*c", is_32bit_elf
?
1278 (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1279 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1282 if (elf_header
.e_machine
== EM_SPARCV9
1284 && streq (rtype
, "R_SPARC_OLO10"))
1285 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1290 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1292 bfd_vma type2
= ELF64_MIPS_R_TYPE2 (info
);
1293 bfd_vma type3
= ELF64_MIPS_R_TYPE3 (info
);
1294 const char *rtype2
= elf_mips_reloc_type (type2
);
1295 const char *rtype3
= elf_mips_reloc_type (type3
);
1297 printf (" Type2: ");
1300 printf (_("unrecognized: %-7lx"),
1301 (unsigned long) type2
& 0xffffffff);
1303 printf ("%-17.17s", rtype2
);
1305 printf ("\n Type3: ");
1308 printf (_("unrecognized: %-7lx"),
1309 (unsigned long) type3
& 0xffffffff);
1311 printf ("%-17.17s", rtype3
);
1322 get_mips_dynamic_type (unsigned long type
)
1326 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1327 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1328 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1329 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1330 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1331 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1332 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1333 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1334 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1335 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1336 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1337 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1338 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1339 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1340 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1341 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1342 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1343 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1344 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1345 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1346 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1347 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1348 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1349 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1350 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1351 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1352 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1353 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1354 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1355 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1356 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1357 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1358 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1359 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1360 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1361 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1362 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1363 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1364 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1365 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1366 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1367 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1368 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1375 get_sparc64_dynamic_type (unsigned long type
)
1379 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1386 get_ppc_dynamic_type (unsigned long type
)
1390 case DT_PPC_GOT
: return "PPC_GOT";
1397 get_ppc64_dynamic_type (unsigned long type
)
1401 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1402 case DT_PPC64_OPD
: return "PPC64_OPD";
1403 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1410 get_parisc_dynamic_type (unsigned long type
)
1414 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1415 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1416 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1417 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1418 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1419 case DT_HP_PREINIT
: return "HP_PREINIT";
1420 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1421 case DT_HP_NEEDED
: return "HP_NEEDED";
1422 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1423 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1424 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1425 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1426 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1427 case DT_HP_EPLTREL
: return "HP_GST_EPLTREL";
1428 case DT_HP_EPLTRELSZ
: return "HP_GST_EPLTRELSZ";
1429 case DT_HP_FILTERED
: return "HP_FILTERED";
1430 case DT_HP_FILTER_TLS
: return "HP_FILTER_TLS";
1431 case DT_HP_COMPAT_FILTERED
: return "HP_COMPAT_FILTERED";
1432 case DT_HP_LAZYLOAD
: return "HP_LAZYLOAD";
1433 case DT_HP_BIND_NOW_COUNT
: return "HP_BIND_NOW_COUNT";
1434 case DT_PLT
: return "PLT";
1435 case DT_PLT_SIZE
: return "PLT_SIZE";
1436 case DT_DLT
: return "DLT";
1437 case DT_DLT_SIZE
: return "DLT_SIZE";
1444 get_ia64_dynamic_type (unsigned long type
)
1448 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1449 case DT_IA_64_VMS_SUBTYPE
: return "VMS_SUBTYPE";
1450 case DT_IA_64_VMS_IMGIOCNT
: return "VMS_IMGIOCNT";
1451 case DT_IA_64_VMS_LNKFLAGS
: return "VMS_LNKFLAGS";
1452 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ
: return "VMS_VIR_MEM_BLK_SIZ";
1453 case DT_IA_64_VMS_IDENT
: return "VMS_IDENT";
1454 case DT_IA_64_VMS_NEEDED_IDENT
: return "VMS_NEEDED_IDENT";
1455 case DT_IA_64_VMS_IMG_RELA_CNT
: return "VMS_IMG_RELA_CNT";
1456 case DT_IA_64_VMS_SEG_RELA_CNT
: return "VMS_SEG_RELA_CNT";
1457 case DT_IA_64_VMS_FIXUP_RELA_CNT
: return "VMS_FIXUP_RELA_CNT";
1458 case DT_IA_64_VMS_FIXUP_NEEDED
: return "VMS_FIXUP_NEEDED";
1459 case DT_IA_64_VMS_SYMVEC_CNT
: return "VMS_SYMVEC_CNT";
1460 case DT_IA_64_VMS_XLATED
: return "VMS_XLATED";
1461 case DT_IA_64_VMS_STACKSIZE
: return "VMS_STACKSIZE";
1462 case DT_IA_64_VMS_UNWINDSZ
: return "VMS_UNWINDSZ";
1463 case DT_IA_64_VMS_UNWIND_CODSEG
: return "VMS_UNWIND_CODSEG";
1464 case DT_IA_64_VMS_UNWIND_INFOSEG
: return "VMS_UNWIND_INFOSEG";
1465 case DT_IA_64_VMS_LINKTIME
: return "VMS_LINKTIME";
1466 case DT_IA_64_VMS_SEG_NO
: return "VMS_SEG_NO";
1467 case DT_IA_64_VMS_SYMVEC_OFFSET
: return "VMS_SYMVEC_OFFSET";
1468 case DT_IA_64_VMS_SYMVEC_SEG
: return "VMS_SYMVEC_SEG";
1469 case DT_IA_64_VMS_UNWIND_OFFSET
: return "VMS_UNWIND_OFFSET";
1470 case DT_IA_64_VMS_UNWIND_SEG
: return "VMS_UNWIND_SEG";
1471 case DT_IA_64_VMS_STRTAB_OFFSET
: return "VMS_STRTAB_OFFSET";
1472 case DT_IA_64_VMS_SYSVER_OFFSET
: return "VMS_SYSVER_OFFSET";
1473 case DT_IA_64_VMS_IMG_RELA_OFF
: return "VMS_IMG_RELA_OFF";
1474 case DT_IA_64_VMS_SEG_RELA_OFF
: return "VMS_SEG_RELA_OFF";
1475 case DT_IA_64_VMS_FIXUP_RELA_OFF
: return "VMS_FIXUP_RELA_OFF";
1476 case DT_IA_64_VMS_PLTGOT_OFFSET
: return "VMS_PLTGOT_OFFSET";
1477 case DT_IA_64_VMS_PLTGOT_SEG
: return "VMS_PLTGOT_SEG";
1478 case DT_IA_64_VMS_FPMODE
: return "VMS_FPMODE";
1485 get_alpha_dynamic_type (unsigned long type
)
1489 case DT_ALPHA_PLTRO
: return "ALPHA_PLTRO";
1496 get_score_dynamic_type (unsigned long type
)
1500 case DT_SCORE_BASE_ADDRESS
: return "SCORE_BASE_ADDRESS";
1501 case DT_SCORE_LOCAL_GOTNO
: return "SCORE_LOCAL_GOTNO";
1502 case DT_SCORE_SYMTABNO
: return "SCORE_SYMTABNO";
1503 case DT_SCORE_GOTSYM
: return "SCORE_GOTSYM";
1504 case DT_SCORE_UNREFEXTNO
: return "SCORE_UNREFEXTNO";
1505 case DT_SCORE_HIPAGENO
: return "SCORE_HIPAGENO";
1513 get_dynamic_type (unsigned long type
)
1515 static char buff
[64];
1519 case DT_NULL
: return "NULL";
1520 case DT_NEEDED
: return "NEEDED";
1521 case DT_PLTRELSZ
: return "PLTRELSZ";
1522 case DT_PLTGOT
: return "PLTGOT";
1523 case DT_HASH
: return "HASH";
1524 case DT_STRTAB
: return "STRTAB";
1525 case DT_SYMTAB
: return "SYMTAB";
1526 case DT_RELA
: return "RELA";
1527 case DT_RELASZ
: return "RELASZ";
1528 case DT_RELAENT
: return "RELAENT";
1529 case DT_STRSZ
: return "STRSZ";
1530 case DT_SYMENT
: return "SYMENT";
1531 case DT_INIT
: return "INIT";
1532 case DT_FINI
: return "FINI";
1533 case DT_SONAME
: return "SONAME";
1534 case DT_RPATH
: return "RPATH";
1535 case DT_SYMBOLIC
: return "SYMBOLIC";
1536 case DT_REL
: return "REL";
1537 case DT_RELSZ
: return "RELSZ";
1538 case DT_RELENT
: return "RELENT";
1539 case DT_PLTREL
: return "PLTREL";
1540 case DT_DEBUG
: return "DEBUG";
1541 case DT_TEXTREL
: return "TEXTREL";
1542 case DT_JMPREL
: return "JMPREL";
1543 case DT_BIND_NOW
: return "BIND_NOW";
1544 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1545 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1546 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1547 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1548 case DT_RUNPATH
: return "RUNPATH";
1549 case DT_FLAGS
: return "FLAGS";
1551 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1552 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1554 case DT_CHECKSUM
: return "CHECKSUM";
1555 case DT_PLTPADSZ
: return "PLTPADSZ";
1556 case DT_MOVEENT
: return "MOVEENT";
1557 case DT_MOVESZ
: return "MOVESZ";
1558 case DT_FEATURE
: return "FEATURE";
1559 case DT_POSFLAG_1
: return "POSFLAG_1";
1560 case DT_SYMINSZ
: return "SYMINSZ";
1561 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1563 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1564 case DT_CONFIG
: return "CONFIG";
1565 case DT_DEPAUDIT
: return "DEPAUDIT";
1566 case DT_AUDIT
: return "AUDIT";
1567 case DT_PLTPAD
: return "PLTPAD";
1568 case DT_MOVETAB
: return "MOVETAB";
1569 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1571 case DT_VERSYM
: return "VERSYM";
1573 case DT_TLSDESC_GOT
: return "TLSDESC_GOT";
1574 case DT_TLSDESC_PLT
: return "TLSDESC_PLT";
1575 case DT_RELACOUNT
: return "RELACOUNT";
1576 case DT_RELCOUNT
: return "RELCOUNT";
1577 case DT_FLAGS_1
: return "FLAGS_1";
1578 case DT_VERDEF
: return "VERDEF";
1579 case DT_VERDEFNUM
: return "VERDEFNUM";
1580 case DT_VERNEED
: return "VERNEED";
1581 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1583 case DT_AUXILIARY
: return "AUXILIARY";
1584 case DT_USED
: return "USED";
1585 case DT_FILTER
: return "FILTER";
1587 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1588 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1589 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1590 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1591 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1592 case DT_GNU_HASH
: return "GNU_HASH";
1595 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1599 switch (elf_header
.e_machine
)
1602 case EM_MIPS_RS3_LE
:
1603 result
= get_mips_dynamic_type (type
);
1606 result
= get_sparc64_dynamic_type (type
);
1609 result
= get_ppc_dynamic_type (type
);
1612 result
= get_ppc64_dynamic_type (type
);
1615 result
= get_ia64_dynamic_type (type
);
1618 result
= get_alpha_dynamic_type (type
);
1621 result
= get_score_dynamic_type (type
);
1631 snprintf (buff
, sizeof (buff
), _("Processor Specific: %lx"), type
);
1633 else if (((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1634 || (elf_header
.e_machine
== EM_PARISC
1635 && (type
>= OLD_DT_LOOS
) && (type
<= OLD_DT_HIOS
)))
1639 switch (elf_header
.e_machine
)
1642 result
= get_parisc_dynamic_type (type
);
1645 result
= get_ia64_dynamic_type (type
);
1655 snprintf (buff
, sizeof (buff
), _("Operating System specific: %lx"),
1659 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), type
);
1666 get_file_type (unsigned e_type
)
1668 static char buff
[32];
1672 case ET_NONE
: return _("NONE (None)");
1673 case ET_REL
: return _("REL (Relocatable file)");
1674 case ET_EXEC
: return _("EXEC (Executable file)");
1675 case ET_DYN
: return _("DYN (Shared object file)");
1676 case ET_CORE
: return _("CORE (Core file)");
1679 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1680 snprintf (buff
, sizeof (buff
), _("Processor Specific: (%x)"), e_type
);
1681 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1682 snprintf (buff
, sizeof (buff
), _("OS Specific: (%x)"), e_type
);
1684 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_type
);
1690 get_machine_name (unsigned e_machine
)
1692 static char buff
[64]; /* XXX */
1696 case EM_NONE
: return _("None");
1697 case EM_M32
: return "WE32100";
1698 case EM_SPARC
: return "Sparc";
1699 case EM_SPU
: return "SPU";
1700 case EM_386
: return "Intel 80386";
1701 case EM_68K
: return "MC68000";
1702 case EM_88K
: return "MC88000";
1703 case EM_486
: return "Intel 80486";
1704 case EM_860
: return "Intel 80860";
1705 case EM_MIPS
: return "MIPS R3000";
1706 case EM_S370
: return "IBM System/370";
1707 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1708 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1709 case EM_PARISC
: return "HPPA";
1710 case EM_PPC_OLD
: return "Power PC (old)";
1711 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1712 case EM_960
: return "Intel 90860";
1713 case EM_PPC
: return "PowerPC";
1714 case EM_PPC64
: return "PowerPC64";
1715 case EM_V800
: return "NEC V800";
1716 case EM_FR20
: return "Fujitsu FR20";
1717 case EM_RH32
: return "TRW RH32";
1718 case EM_MCORE
: return "MCORE";
1719 case EM_ARM
: return "ARM";
1720 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1721 case EM_SH
: return "Renesas / SuperH SH";
1722 case EM_SPARCV9
: return "Sparc v9";
1723 case EM_TRICORE
: return "Siemens Tricore";
1724 case EM_ARC
: return "ARC";
1725 case EM_H8_300
: return "Renesas H8/300";
1726 case EM_H8_300H
: return "Renesas H8/300H";
1727 case EM_H8S
: return "Renesas H8S";
1728 case EM_H8_500
: return "Renesas H8/500";
1729 case EM_IA_64
: return "Intel IA-64";
1730 case EM_MIPS_X
: return "Stanford MIPS-X";
1731 case EM_COLDFIRE
: return "Motorola Coldfire";
1732 case EM_68HC12
: return "Motorola M68HC12";
1733 case EM_ALPHA
: return "Alpha";
1734 case EM_CYGNUS_D10V
:
1735 case EM_D10V
: return "d10v";
1736 case EM_CYGNUS_D30V
:
1737 case EM_D30V
: return "d30v";
1738 case EM_CYGNUS_M32R
:
1739 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
1740 case EM_CYGNUS_V850
:
1741 case EM_V850
: return "NEC v850";
1742 case EM_CYGNUS_MN10300
:
1743 case EM_MN10300
: return "mn10300";
1744 case EM_CYGNUS_MN10200
:
1745 case EM_MN10200
: return "mn10200";
1746 case EM_CYGNUS_FR30
:
1747 case EM_FR30
: return "Fujitsu FR30";
1748 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1750 case EM_PJ
: return "picoJava";
1751 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1752 case EM_PCP
: return "Siemens PCP";
1753 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1754 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1755 case EM_STARCORE
: return "Motorola Star*Core processor";
1756 case EM_ME16
: return "Toyota ME16 processor";
1757 case EM_ST100
: return "STMicroelectronics ST100 processor";
1758 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1759 case EM_FX66
: return "Siemens FX66 microcontroller";
1760 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1761 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1762 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1763 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1764 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1765 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1766 case EM_SVX
: return "Silicon Graphics SVx";
1767 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1768 case EM_VAX
: return "Digital VAX";
1770 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1771 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1772 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1773 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1774 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1775 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1776 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1777 case EM_PRISM
: return "Vitesse Prism";
1778 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1780 case EM_S390
: return "IBM S/390";
1781 case EM_SCORE
: return "SUNPLUS S+Core";
1782 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1784 case EM_OR32
: return "OpenRISC";
1785 case EM_CRX
: return "National Semiconductor CRX microprocessor";
1786 case EM_DLX
: return "OpenDLX";
1788 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1789 case EM_IQ2000
: return "Vitesse IQ2000";
1791 case EM_XTENSA
: return "Tensilica Xtensa Processor";
1793 case EM_M32C
: return "Renesas M32c";
1794 case EM_MT
: return "Morpho Techologies MT processor";
1795 case EM_BLACKFIN
: return "Analog Devices Blackfin";
1796 case EM_NIOS32
: return "Altera Nios";
1797 case EM_ALTERA_NIOS2
: return "Altera Nios II";
1798 case EM_XC16X
: return "Infineon Technologies xc16x";
1799 case EM_CYGNUS_MEP
: return "Toshiba MeP Media Engine";
1801 case EM_CR16_OLD
: return "National Semiconductor's CR16";
1803 snprintf (buff
, sizeof (buff
), _("<unknown>: 0x%x"), e_machine
);
1809 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
1814 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1815 e_flags
&= ~ EF_ARM_EABIMASK
;
1817 /* Handle "generic" ARM flags. */
1818 if (e_flags
& EF_ARM_RELEXEC
)
1820 strcat (buf
, ", relocatable executable");
1821 e_flags
&= ~ EF_ARM_RELEXEC
;
1824 if (e_flags
& EF_ARM_HASENTRY
)
1826 strcat (buf
, ", has entry point");
1827 e_flags
&= ~ EF_ARM_HASENTRY
;
1830 /* Now handle EABI specific flags. */
1834 strcat (buf
, ", <unrecognized EABI>");
1839 case EF_ARM_EABI_VER1
:
1840 strcat (buf
, ", Version1 EABI");
1845 /* Process flags one bit at a time. */
1846 flag
= e_flags
& - e_flags
;
1851 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1852 strcat (buf
, ", sorted symbol tables");
1862 case EF_ARM_EABI_VER2
:
1863 strcat (buf
, ", Version2 EABI");
1868 /* Process flags one bit at a time. */
1869 flag
= e_flags
& - e_flags
;
1874 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1875 strcat (buf
, ", sorted symbol tables");
1878 case EF_ARM_DYNSYMSUSESEGIDX
:
1879 strcat (buf
, ", dynamic symbols use segment index");
1882 case EF_ARM_MAPSYMSFIRST
:
1883 strcat (buf
, ", mapping symbols precede others");
1893 case EF_ARM_EABI_VER3
:
1894 strcat (buf
, ", Version3 EABI");
1897 case EF_ARM_EABI_VER4
:
1898 strcat (buf
, ", Version4 EABI");
1901 case EF_ARM_EABI_VER5
:
1902 strcat (buf
, ", Version5 EABI");
1908 /* Process flags one bit at a time. */
1909 flag
= e_flags
& - e_flags
;
1915 strcat (buf
, ", BE8");
1919 strcat (buf
, ", LE8");
1929 case EF_ARM_EABI_UNKNOWN
:
1930 strcat (buf
, ", GNU EABI");
1935 /* Process flags one bit at a time. */
1936 flag
= e_flags
& - e_flags
;
1941 case EF_ARM_INTERWORK
:
1942 strcat (buf
, ", interworking enabled");
1945 case EF_ARM_APCS_26
:
1946 strcat (buf
, ", uses APCS/26");
1949 case EF_ARM_APCS_FLOAT
:
1950 strcat (buf
, ", uses APCS/float");
1954 strcat (buf
, ", position independent");
1958 strcat (buf
, ", 8 bit structure alignment");
1961 case EF_ARM_NEW_ABI
:
1962 strcat (buf
, ", uses new ABI");
1965 case EF_ARM_OLD_ABI
:
1966 strcat (buf
, ", uses old ABI");
1969 case EF_ARM_SOFT_FLOAT
:
1970 strcat (buf
, ", software FP");
1973 case EF_ARM_VFP_FLOAT
:
1974 strcat (buf
, ", VFP");
1977 case EF_ARM_MAVERICK_FLOAT
:
1978 strcat (buf
, ", Maverick FP");
1989 strcat (buf
,", <unknown>");
1993 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
1995 static char buf
[1024];
2007 decode_ARM_machine_flags (e_flags
, buf
);
2011 switch (e_flags
& EF_FRV_CPU_MASK
)
2013 case EF_FRV_CPU_GENERIC
:
2017 strcat (buf
, ", fr???");
2020 case EF_FRV_CPU_FR300
:
2021 strcat (buf
, ", fr300");
2024 case EF_FRV_CPU_FR400
:
2025 strcat (buf
, ", fr400");
2027 case EF_FRV_CPU_FR405
:
2028 strcat (buf
, ", fr405");
2031 case EF_FRV_CPU_FR450
:
2032 strcat (buf
, ", fr450");
2035 case EF_FRV_CPU_FR500
:
2036 strcat (buf
, ", fr500");
2038 case EF_FRV_CPU_FR550
:
2039 strcat (buf
, ", fr550");
2042 case EF_FRV_CPU_SIMPLE
:
2043 strcat (buf
, ", simple");
2045 case EF_FRV_CPU_TOMCAT
:
2046 strcat (buf
, ", tomcat");
2052 if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_M68000
)
2053 strcat (buf
, ", m68000");
2054 else if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_CPU32
)
2055 strcat (buf
, ", cpu32");
2056 else if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_FIDO
)
2057 strcat (buf
, ", fido_a");
2060 char const *isa
= _("unknown");
2061 char const *mac
= _("unknown mac");
2062 char const *additional
= NULL
;
2064 switch (e_flags
& EF_M68K_CF_ISA_MASK
)
2066 case EF_M68K_CF_ISA_A_NODIV
:
2068 additional
= ", nodiv";
2070 case EF_M68K_CF_ISA_A
:
2073 case EF_M68K_CF_ISA_A_PLUS
:
2076 case EF_M68K_CF_ISA_B_NOUSP
:
2078 additional
= ", nousp";
2080 case EF_M68K_CF_ISA_B
:
2084 strcat (buf
, ", cf, isa ");
2087 strcat (buf
, additional
);
2088 if (e_flags
& EF_M68K_CF_FLOAT
)
2089 strcat (buf
, ", float");
2090 switch (e_flags
& EF_M68K_CF_MAC_MASK
)
2095 case EF_M68K_CF_MAC
:
2098 case EF_M68K_CF_EMAC
:
2111 if (e_flags
& EF_PPC_EMB
)
2112 strcat (buf
, ", emb");
2114 if (e_flags
& EF_PPC_RELOCATABLE
)
2115 strcat (buf
, ", relocatable");
2117 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
2118 strcat (buf
, ", relocatable-lib");
2122 case EM_CYGNUS_V850
:
2123 switch (e_flags
& EF_V850_ARCH
)
2126 strcat (buf
, ", v850e1");
2129 strcat (buf
, ", v850e");
2132 strcat (buf
, ", v850");
2135 strcat (buf
, ", unknown v850 architecture variant");
2141 case EM_CYGNUS_M32R
:
2142 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
2143 strcat (buf
, ", m32r");
2147 case EM_MIPS_RS3_LE
:
2148 if (e_flags
& EF_MIPS_NOREORDER
)
2149 strcat (buf
, ", noreorder");
2151 if (e_flags
& EF_MIPS_PIC
)
2152 strcat (buf
, ", pic");
2154 if (e_flags
& EF_MIPS_CPIC
)
2155 strcat (buf
, ", cpic");
2157 if (e_flags
& EF_MIPS_UCODE
)
2158 strcat (buf
, ", ugen_reserved");
2160 if (e_flags
& EF_MIPS_ABI2
)
2161 strcat (buf
, ", abi2");
2163 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
2164 strcat (buf
, ", odk first");
2166 if (e_flags
& EF_MIPS_32BITMODE
)
2167 strcat (buf
, ", 32bitmode");
2169 switch ((e_flags
& EF_MIPS_MACH
))
2171 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
2172 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
2173 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
2174 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
2175 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
2176 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
2177 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
2178 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
2179 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
2180 case E_MIPS_MACH_9000
: strcat (buf
, ", 9000"); break;
2181 case E_MIPS_MACH_LS2E
: strcat (buf
, ", loongson-2e"); break;
2182 case E_MIPS_MACH_LS2F
: strcat (buf
, ", loongson-2f"); break;
2183 case E_MIPS_MACH_OCTEON
: strcat (buf
, ", octeon"); break;
2185 /* We simply ignore the field in this case to avoid confusion:
2186 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2189 default: strcat (buf
, ", unknown CPU"); break;
2192 switch ((e_flags
& EF_MIPS_ABI
))
2194 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
2195 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
2196 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
2197 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
2199 /* We simply ignore the field in this case to avoid confusion:
2200 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2201 This means it is likely to be an o32 file, but not for
2204 default: strcat (buf
, ", unknown ABI"); break;
2207 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
2208 strcat (buf
, ", mdmx");
2210 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
2211 strcat (buf
, ", mips16");
2213 switch ((e_flags
& EF_MIPS_ARCH
))
2215 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
2216 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
2217 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
2218 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
2219 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
2220 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
2221 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
2222 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
2223 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
2224 default: strcat (buf
, ", unknown ISA"); break;
2230 switch ((e_flags
& EF_SH_MACH_MASK
))
2232 case EF_SH1
: strcat (buf
, ", sh1"); break;
2233 case EF_SH2
: strcat (buf
, ", sh2"); break;
2234 case EF_SH3
: strcat (buf
, ", sh3"); break;
2235 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
2236 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
2237 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
2238 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
2239 case EF_SH4
: strcat (buf
, ", sh4"); break;
2240 case EF_SH5
: strcat (buf
, ", sh5"); break;
2241 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
2242 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
2243 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
2244 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
2245 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
2246 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
2247 case EF_SH3_NOMMU
: strcat (buf
, ", sh3-nommu"); break;
2248 case EF_SH4_NOMMU_NOFPU
: strcat (buf
, ", sh4-nommu-nofpu"); break;
2249 case EF_SH2A_SH4_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2250 case EF_SH2A_SH3_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh3-nommu"); break;
2251 case EF_SH2A_SH4
: strcat (buf
, ", sh2a-or-sh4"); break;
2252 case EF_SH2A_SH3E
: strcat (buf
, ", sh2a-or-sh3e"); break;
2253 default: strcat (buf
, ", unknown ISA"); break;
2259 if (e_flags
& EF_SPARC_32PLUS
)
2260 strcat (buf
, ", v8+");
2262 if (e_flags
& EF_SPARC_SUN_US1
)
2263 strcat (buf
, ", ultrasparcI");
2265 if (e_flags
& EF_SPARC_SUN_US3
)
2266 strcat (buf
, ", ultrasparcIII");
2268 if (e_flags
& EF_SPARC_HAL_R1
)
2269 strcat (buf
, ", halr1");
2271 if (e_flags
& EF_SPARC_LEDATA
)
2272 strcat (buf
, ", ledata");
2274 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2275 strcat (buf
, ", tso");
2277 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2278 strcat (buf
, ", pso");
2280 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2281 strcat (buf
, ", rmo");
2285 switch (e_flags
& EF_PARISC_ARCH
)
2287 case EFA_PARISC_1_0
:
2288 strcpy (buf
, ", PA-RISC 1.0");
2290 case EFA_PARISC_1_1
:
2291 strcpy (buf
, ", PA-RISC 1.1");
2293 case EFA_PARISC_2_0
:
2294 strcpy (buf
, ", PA-RISC 2.0");
2299 if (e_flags
& EF_PARISC_TRAPNIL
)
2300 strcat (buf
, ", trapnil");
2301 if (e_flags
& EF_PARISC_EXT
)
2302 strcat (buf
, ", ext");
2303 if (e_flags
& EF_PARISC_LSB
)
2304 strcat (buf
, ", lsb");
2305 if (e_flags
& EF_PARISC_WIDE
)
2306 strcat (buf
, ", wide");
2307 if (e_flags
& EF_PARISC_NO_KABP
)
2308 strcat (buf
, ", no kabp");
2309 if (e_flags
& EF_PARISC_LAZYSWAP
)
2310 strcat (buf
, ", lazyswap");
2315 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2316 strcat (buf
, ", new calling convention");
2318 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2319 strcat (buf
, ", gnu calling convention");
2323 if ((e_flags
& EF_IA_64_ABI64
))
2324 strcat (buf
, ", 64-bit");
2326 strcat (buf
, ", 32-bit");
2327 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2328 strcat (buf
, ", reduced fp model");
2329 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2330 strcat (buf
, ", no function descriptors, constant gp");
2331 else if ((e_flags
& EF_IA_64_CONS_GP
))
2332 strcat (buf
, ", constant gp");
2333 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2334 strcat (buf
, ", absolute");
2338 if ((e_flags
& EF_VAX_NONPIC
))
2339 strcat (buf
, ", non-PIC");
2340 if ((e_flags
& EF_VAX_DFLOAT
))
2341 strcat (buf
, ", D-Float");
2342 if ((e_flags
& EF_VAX_GFLOAT
))
2343 strcat (buf
, ", G-Float");
2352 get_osabi_name (unsigned int osabi
)
2354 static char buff
[32];
2358 case ELFOSABI_NONE
: return "UNIX - System V";
2359 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2360 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2361 case ELFOSABI_LINUX
: return "UNIX - Linux";
2362 case ELFOSABI_HURD
: return "GNU/Hurd";
2363 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2364 case ELFOSABI_AIX
: return "UNIX - AIX";
2365 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2366 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2367 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2368 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2369 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2370 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2371 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2372 case ELFOSABI_AROS
: return "Amiga Research OS";
2373 case ELFOSABI_STANDALONE
: return _("Standalone App");
2374 case ELFOSABI_ARM
: return "ARM";
2376 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), osabi
);
2382 get_arm_segment_type (unsigned long type
)
2396 get_mips_segment_type (unsigned long type
)
2400 case PT_MIPS_REGINFO
:
2402 case PT_MIPS_RTPROC
:
2404 case PT_MIPS_OPTIONS
:
2414 get_parisc_segment_type (unsigned long type
)
2418 case PT_HP_TLS
: return "HP_TLS";
2419 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2420 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2421 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2422 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2423 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2424 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2425 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2426 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2427 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2428 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2429 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2430 case PT_HP_OPT_ANNOT
: return "HP_OPT_ANNOT";
2431 case PT_HP_HSL_ANNOT
: return "HP_HSL_ANNOT";
2432 case PT_HP_STACK
: return "HP_STACK";
2433 case PT_HP_CORE_UTSNAME
: return "HP_CORE_UTSNAME";
2434 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2435 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2436 case PT_PARISC_WEAKORDER
: return "PARISC_WEAKORDER";
2445 get_ia64_segment_type (unsigned long type
)
2449 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2450 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2451 case PT_HP_TLS
: return "HP_TLS";
2452 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2453 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2454 case PT_IA_64_HP_STACK
: return "HP_STACK";
2463 get_segment_type (unsigned long p_type
)
2465 static char buff
[32];
2469 case PT_NULL
: return "NULL";
2470 case PT_LOAD
: return "LOAD";
2471 case PT_DYNAMIC
: return "DYNAMIC";
2472 case PT_INTERP
: return "INTERP";
2473 case PT_NOTE
: return "NOTE";
2474 case PT_SHLIB
: return "SHLIB";
2475 case PT_PHDR
: return "PHDR";
2476 case PT_TLS
: return "TLS";
2478 case PT_GNU_EH_FRAME
:
2479 return "GNU_EH_FRAME";
2480 case PT_GNU_STACK
: return "GNU_STACK";
2481 case PT_GNU_RELRO
: return "GNU_RELRO";
2484 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2488 switch (elf_header
.e_machine
)
2491 result
= get_arm_segment_type (p_type
);
2494 case EM_MIPS_RS3_LE
:
2495 result
= get_mips_segment_type (p_type
);
2498 result
= get_parisc_segment_type (p_type
);
2501 result
= get_ia64_segment_type (p_type
);
2511 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2513 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2517 switch (elf_header
.e_machine
)
2520 result
= get_parisc_segment_type (p_type
);
2523 result
= get_ia64_segment_type (p_type
);
2533 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2536 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), p_type
);
2543 get_mips_section_type_name (unsigned int sh_type
)
2547 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2548 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2549 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2550 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2551 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2552 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2553 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2554 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2555 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2556 case SHT_MIPS_RELD
: return "MIPS_RELD";
2557 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2558 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2559 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2560 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2561 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2562 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2563 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2564 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2565 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2566 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2567 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2568 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2569 case SHT_MIPS_LINE
: return "MIPS_LINE";
2570 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2571 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2572 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2573 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2574 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2575 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2576 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2577 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2578 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2579 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2580 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2581 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2582 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2583 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2584 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2585 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2593 get_parisc_section_type_name (unsigned int sh_type
)
2597 case SHT_PARISC_EXT
: return "PARISC_EXT";
2598 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2599 case SHT_PARISC_DOC
: return "PARISC_DOC";
2600 case SHT_PARISC_ANNOT
: return "PARISC_ANNOT";
2601 case SHT_PARISC_SYMEXTN
: return "PARISC_SYMEXTN";
2602 case SHT_PARISC_STUBS
: return "PARISC_STUBS";
2603 case SHT_PARISC_DLKM
: return "PARISC_DLKM";
2611 get_ia64_section_type_name (unsigned int sh_type
)
2613 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2614 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2615 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2619 case SHT_IA_64_EXT
: return "IA_64_EXT";
2620 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2621 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2622 case SHT_IA_64_VMS_TRACE
: return "VMS_TRACE";
2623 case SHT_IA_64_VMS_TIE_SIGNATURES
: return "VMS_TIE_SIGNATURES";
2624 case SHT_IA_64_VMS_DEBUG
: return "VMS_DEBUG";
2625 case SHT_IA_64_VMS_DEBUG_STR
: return "VMS_DEBUG_STR";
2626 case SHT_IA_64_VMS_LINKAGES
: return "VMS_LINKAGES";
2627 case SHT_IA_64_VMS_SYMBOL_VECTOR
: return "VMS_SYMBOL_VECTOR";
2628 case SHT_IA_64_VMS_FIXUP
: return "VMS_FIXUP";
2636 get_x86_64_section_type_name (unsigned int sh_type
)
2640 case SHT_X86_64_UNWIND
: return "X86_64_UNWIND";
2648 get_arm_section_type_name (unsigned int sh_type
)
2654 case SHT_ARM_PREEMPTMAP
:
2655 return "ARM_PREEMPTMAP";
2656 case SHT_ARM_ATTRIBUTES
:
2657 return "ARM_ATTRIBUTES";
2665 get_section_type_name (unsigned int sh_type
)
2667 static char buff
[32];
2671 case SHT_NULL
: return "NULL";
2672 case SHT_PROGBITS
: return "PROGBITS";
2673 case SHT_SYMTAB
: return "SYMTAB";
2674 case SHT_STRTAB
: return "STRTAB";
2675 case SHT_RELA
: return "RELA";
2676 case SHT_HASH
: return "HASH";
2677 case SHT_DYNAMIC
: return "DYNAMIC";
2678 case SHT_NOTE
: return "NOTE";
2679 case SHT_NOBITS
: return "NOBITS";
2680 case SHT_REL
: return "REL";
2681 case SHT_SHLIB
: return "SHLIB";
2682 case SHT_DYNSYM
: return "DYNSYM";
2683 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2684 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2685 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2686 case SHT_GNU_HASH
: return "GNU_HASH";
2687 case SHT_GROUP
: return "GROUP";
2688 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2689 case SHT_GNU_verdef
: return "VERDEF";
2690 case SHT_GNU_verneed
: return "VERNEED";
2691 case SHT_GNU_versym
: return "VERSYM";
2692 case 0x6ffffff0: return "VERSYM";
2693 case 0x6ffffffc: return "VERDEF";
2694 case 0x7ffffffd: return "AUXILIARY";
2695 case 0x7fffffff: return "FILTER";
2696 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2699 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2703 switch (elf_header
.e_machine
)
2706 case EM_MIPS_RS3_LE
:
2707 result
= get_mips_section_type_name (sh_type
);
2710 result
= get_parisc_section_type_name (sh_type
);
2713 result
= get_ia64_section_type_name (sh_type
);
2716 result
= get_x86_64_section_type_name (sh_type
);
2719 result
= get_arm_section_type_name (sh_type
);
2729 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2731 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2735 switch (elf_header
.e_machine
)
2738 result
= get_ia64_section_type_name (sh_type
);
2748 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2750 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2751 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2753 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), sh_type
);
2759 #define OPTION_DEBUG_DUMP 512
2761 static struct option options
[] =
2763 {"all", no_argument
, 0, 'a'},
2764 {"file-header", no_argument
, 0, 'h'},
2765 {"program-headers", no_argument
, 0, 'l'},
2766 {"headers", no_argument
, 0, 'e'},
2767 {"histogram", no_argument
, 0, 'I'},
2768 {"segments", no_argument
, 0, 'l'},
2769 {"sections", no_argument
, 0, 'S'},
2770 {"section-headers", no_argument
, 0, 'S'},
2771 {"section-groups", no_argument
, 0, 'g'},
2772 {"section-details", no_argument
, 0, 't'},
2773 {"full-section-name",no_argument
, 0, 'N'},
2774 {"symbols", no_argument
, 0, 's'},
2775 {"syms", no_argument
, 0, 's'},
2776 {"relocs", no_argument
, 0, 'r'},
2777 {"notes", no_argument
, 0, 'n'},
2778 {"dynamic", no_argument
, 0, 'd'},
2779 {"arch-specific", no_argument
, 0, 'A'},
2780 {"version-info", no_argument
, 0, 'V'},
2781 {"use-dynamic", no_argument
, 0, 'D'},
2782 {"unwind", no_argument
, 0, 'u'},
2783 {"archive-index", no_argument
, 0, 'c'},
2784 {"hex-dump", required_argument
, 0, 'x'},
2785 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2786 {"string-dump", required_argument
, 0, 'p'},
2787 #ifdef SUPPORT_DISASSEMBLY
2788 {"instruction-dump", required_argument
, 0, 'i'},
2791 {"version", no_argument
, 0, 'v'},
2792 {"wide", no_argument
, 0, 'W'},
2793 {"help", no_argument
, 0, 'H'},
2794 {0, no_argument
, 0, 0}
2798 usage (FILE *stream
)
2800 fprintf (stream
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2801 fprintf (stream
, _(" Display information about the contents of ELF format files\n"));
2802 fprintf (stream
, _(" Options are:\n\
2803 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2804 -h --file-header Display the ELF file header\n\
2805 -l --program-headers Display the program headers\n\
2806 --segments An alias for --program-headers\n\
2807 -S --section-headers Display the sections' header\n\
2808 --sections An alias for --section-headers\n\
2809 -g --section-groups Display the section groups\n\
2810 -t --section-details Display the section details\n\
2811 -e --headers Equivalent to: -h -l -S\n\
2812 -s --syms Display the symbol table\n\
2813 --symbols An alias for --syms\n\
2814 -n --notes Display the core notes (if present)\n\
2815 -r --relocs Display the relocations (if present)\n\
2816 -u --unwind Display the unwind info (if present)\n\
2817 -d --dynamic Display the dynamic section (if present)\n\
2818 -V --version-info Display the version sections (if present)\n\
2819 -A --arch-specific Display architecture specific information (if any).\n\
2820 -c --archive-index Display the symbol/file index in an archive\n\
2821 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2822 -x --hex-dump=<number|name>\n\
2823 Dump the contents of section <number|name> as bytes\n\
2824 -p --string-dump=<number|name>\n\
2825 Dump the contents of section <number|name> as strings\n\
2826 -w[lLiaprmfFsoR] or\n\
2827 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]\n\
2828 Display the contents of DWARF2 debug sections\n"));
2829 #ifdef SUPPORT_DISASSEMBLY
2830 fprintf (stream
, _("\
2831 -i --instruction-dump=<number|name>\n\
2832 Disassemble the contents of section <number|name>\n"));
2834 fprintf (stream
, _("\
2835 -I --histogram Display histogram of bucket list lengths\n\
2836 -W --wide Allow output width to exceed 80 characters\n\
2837 @<file> Read options from <file>\n\
2838 -H --help Display this information\n\
2839 -v --version Display the version number of readelf\n"));
2841 if (REPORT_BUGS_TO
[0] && stream
== stdout
)
2842 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2844 exit (stream
== stdout
? 0 : 1);
2847 /* Record the fact that the user wants the contents of section number
2848 SECTION to be displayed using the method(s) encoded as flags bits
2849 in TYPE. Note, TYPE can be zero if we are creating the array for
2853 request_dump_bynumber (unsigned int section
, dump_type type
)
2855 if (section
>= num_dump_sects
)
2857 dump_type
*new_dump_sects
;
2859 new_dump_sects
= calloc (section
+ 1, sizeof (* dump_sects
));
2861 if (new_dump_sects
== NULL
)
2862 error (_("Out of memory allocating dump request table.\n"));
2865 /* Copy current flag settings. */
2866 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
* sizeof (* dump_sects
));
2870 dump_sects
= new_dump_sects
;
2871 num_dump_sects
= section
+ 1;
2876 dump_sects
[section
] |= type
;
2881 /* Request a dump by section name. */
2884 request_dump_byname (const char *section
, dump_type type
)
2886 struct dump_list_entry
*new_request
;
2888 new_request
= malloc (sizeof (struct dump_list_entry
));
2890 error (_("Out of memory allocating dump request table.\n"));
2892 new_request
->name
= strdup (section
);
2893 if (!new_request
->name
)
2894 error (_("Out of memory allocating dump request table.\n"));
2896 new_request
->type
= type
;
2898 new_request
->next
= dump_sects_byname
;
2899 dump_sects_byname
= new_request
;
2903 parse_args (int argc
, char **argv
)
2910 while ((c
= getopt_long
2911 (argc
, argv
, "ADHINSVWacdeghi:lnp:rstuvw::x:", options
, NULL
)) != EOF
)
2932 do_section_groups
++;
2940 do_section_groups
++;
2945 do_section_details
++;
2990 section
= strtoul (optarg
, & cp
, 0);
2991 if (! *cp
&& section
>= 0)
2992 request_dump_bynumber (section
, HEX_DUMP
);
2994 request_dump_byname (optarg
, HEX_DUMP
);
2998 section
= strtoul (optarg
, & cp
, 0);
2999 if (! *cp
&& section
>= 0)
3000 request_dump_bynumber (section
, STRING_DUMP
);
3002 request_dump_byname (optarg
, STRING_DUMP
);
3010 unsigned int index
= 0;
3014 while (optarg
[index
])
3015 switch (optarg
[index
++])
3022 do_debug_abbrevs
= 1;
3030 do_debug_lines_decoded
= 1;
3034 do_debug_pubnames
= 1;
3038 do_debug_aranges
= 1;
3042 do_debug_ranges
= 1;
3046 do_debug_frames_interp
= 1;
3048 do_debug_frames
= 1;
3052 do_debug_macinfo
= 1;
3064 warn (_("Unrecognized debug option '%s'\n"), optarg
);
3069 case OPTION_DEBUG_DUMP
:
3077 const char * option
;
3080 debug_dump_long_opts
;
3082 debug_dump_long_opts opts_table
[] =
3084 /* Please keep this table alpha- sorted. */
3085 { "Ranges", & do_debug_ranges
},
3086 { "abbrev", & do_debug_abbrevs
},
3087 { "aranges", & do_debug_aranges
},
3088 { "frames", & do_debug_frames
},
3089 { "frames-interp", & do_debug_frames_interp
},
3090 { "info", & do_debug_info
},
3091 { "line", & do_debug_lines
}, /* For backwards compatibility. */
3092 { "rawline", & do_debug_lines
},
3093 { "decodedline", & do_debug_lines_decoded
},
3094 { "loc", & do_debug_loc
},
3095 { "macro", & do_debug_macinfo
},
3096 { "pubnames", & do_debug_pubnames
},
3097 /* This entry is for compatability
3098 with earlier versions of readelf. */
3099 { "ranges", & do_debug_aranges
},
3100 { "str", & do_debug_str
},
3111 debug_dump_long_opts
* entry
;
3113 for (entry
= opts_table
; entry
->option
; entry
++)
3115 size_t len
= strlen (entry
->option
);
3117 if (strneq (p
, entry
->option
, len
)
3118 && (p
[len
] == ',' || p
[len
] == '\0'))
3120 * entry
->variable
= 1;
3122 /* The --debug-dump=frames-interp option also
3123 enables the --debug-dump=frames option. */
3124 if (do_debug_frames_interp
)
3125 do_debug_frames
= 1;
3132 if (entry
->option
== NULL
)
3134 warn (_("Unrecognized debug option '%s'\n"), p
);
3135 p
= strchr (p
, ',');
3145 #ifdef SUPPORT_DISASSEMBLY
3148 section
= strtoul (optarg
, & cp
, 0);
3149 if (! *cp
&& section
>= 0)
3150 request_dump_bynumber (section
, DISASS_DUMP
);
3152 request_dump_byname (optarg
, DISASS_DUMP
);
3155 print_version (program_name
);
3164 /* xgettext:c-format */
3165 error (_("Invalid option '-%c'\n"), c
);
3172 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
3173 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
3174 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
3175 && !do_section_groups
&& !do_archive_index
)
3179 warn (_("Nothing to do.\n"));
3185 get_elf_class (unsigned int elf_class
)
3187 static char buff
[32];
3191 case ELFCLASSNONE
: return _("none");
3192 case ELFCLASS32
: return "ELF32";
3193 case ELFCLASS64
: return "ELF64";
3195 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), elf_class
);
3201 get_data_encoding (unsigned int encoding
)
3203 static char buff
[32];
3207 case ELFDATANONE
: return _("none");
3208 case ELFDATA2LSB
: return _("2's complement, little endian");
3209 case ELFDATA2MSB
: return _("2's complement, big endian");
3211 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), encoding
);
3216 /* Decode the data held in 'elf_header'. */
3219 process_file_header (void)
3221 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
3222 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
3223 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
3224 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
3227 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3231 init_dwarf_regnames (elf_header
.e_machine
);
3237 printf (_("ELF Header:\n"));
3238 printf (_(" Magic: "));
3239 for (i
= 0; i
< EI_NIDENT
; i
++)
3240 printf ("%2.2x ", elf_header
.e_ident
[i
]);
3242 printf (_(" Class: %s\n"),
3243 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
3244 printf (_(" Data: %s\n"),
3245 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
3246 printf (_(" Version: %d %s\n"),
3247 elf_header
.e_ident
[EI_VERSION
],
3248 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
3250 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
3253 printf (_(" OS/ABI: %s\n"),
3254 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
3255 printf (_(" ABI Version: %d\n"),
3256 elf_header
.e_ident
[EI_ABIVERSION
]);
3257 printf (_(" Type: %s\n"),
3258 get_file_type (elf_header
.e_type
));
3259 printf (_(" Machine: %s\n"),
3260 get_machine_name (elf_header
.e_machine
));
3261 printf (_(" Version: 0x%lx\n"),
3262 (unsigned long) elf_header
.e_version
);
3264 printf (_(" Entry point address: "));
3265 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3266 printf (_("\n Start of program headers: "));
3267 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3268 printf (_(" (bytes into file)\n Start of section headers: "));
3269 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
3270 printf (_(" (bytes into file)\n"));
3272 printf (_(" Flags: 0x%lx%s\n"),
3273 (unsigned long) elf_header
.e_flags
,
3274 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
3275 printf (_(" Size of this header: %ld (bytes)\n"),
3276 (long) elf_header
.e_ehsize
);
3277 printf (_(" Size of program headers: %ld (bytes)\n"),
3278 (long) elf_header
.e_phentsize
);
3279 printf (_(" Number of program headers: %ld\n"),
3280 (long) elf_header
.e_phnum
);
3281 printf (_(" Size of section headers: %ld (bytes)\n"),
3282 (long) elf_header
.e_shentsize
);
3283 printf (_(" Number of section headers: %ld"),
3284 (long) elf_header
.e_shnum
);
3285 if (section_headers
!= NULL
&& elf_header
.e_shnum
== SHN_UNDEF
)
3286 printf (" (%ld)", (long) section_headers
[0].sh_size
);
3287 putc ('\n', stdout
);
3288 printf (_(" Section header string table index: %ld"),
3289 (long) elf_header
.e_shstrndx
);
3290 if (section_headers
!= NULL
3291 && elf_header
.e_shstrndx
== (SHN_XINDEX
& 0xffff))
3292 printf (" (%u)", section_headers
[0].sh_link
);
3293 else if (elf_header
.e_shstrndx
>= elf_header
.e_shnum
)
3294 printf (" <corrupt: out of range>");
3295 putc ('\n', stdout
);
3298 if (section_headers
!= NULL
)
3300 if (elf_header
.e_shnum
== SHN_UNDEF
)
3301 elf_header
.e_shnum
= section_headers
[0].sh_size
;
3302 if (elf_header
.e_shstrndx
== (SHN_XINDEX
& 0xffff))
3303 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
3304 else if (elf_header
.e_shstrndx
>= elf_header
.e_shnum
)
3305 elf_header
.e_shstrndx
= SHN_UNDEF
;
3306 free (section_headers
);
3307 section_headers
= NULL
;
3315 get_32bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3317 Elf32_External_Phdr
*phdrs
;
3318 Elf32_External_Phdr
*external
;
3319 Elf_Internal_Phdr
*internal
;
3322 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3323 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3324 _("program headers"));
3328 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3329 i
< elf_header
.e_phnum
;
3330 i
++, internal
++, external
++)
3332 internal
->p_type
= BYTE_GET (external
->p_type
);
3333 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3334 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3335 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3336 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3337 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3338 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3339 internal
->p_align
= BYTE_GET (external
->p_align
);
3348 get_64bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3350 Elf64_External_Phdr
*phdrs
;
3351 Elf64_External_Phdr
*external
;
3352 Elf_Internal_Phdr
*internal
;
3355 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3356 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3357 _("program headers"));
3361 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3362 i
< elf_header
.e_phnum
;
3363 i
++, internal
++, external
++)
3365 internal
->p_type
= BYTE_GET (external
->p_type
);
3366 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3367 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3368 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3369 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3370 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3371 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3372 internal
->p_align
= BYTE_GET (external
->p_align
);
3380 /* Returns 1 if the program headers were read into `program_headers'. */
3383 get_program_headers (FILE *file
)
3385 Elf_Internal_Phdr
*phdrs
;
3387 /* Check cache of prior read. */
3388 if (program_headers
!= NULL
)
3391 phdrs
= cmalloc (elf_header
.e_phnum
, sizeof (Elf_Internal_Phdr
));
3395 error (_("Out of memory\n"));
3400 ? get_32bit_program_headers (file
, phdrs
)
3401 : get_64bit_program_headers (file
, phdrs
))
3403 program_headers
= phdrs
;
3411 /* Returns 1 if the program headers were loaded. */
3414 process_program_headers (FILE *file
)
3416 Elf_Internal_Phdr
*segment
;
3419 if (elf_header
.e_phnum
== 0)
3422 printf (_("\nThere are no program headers in this file.\n"));
3426 if (do_segments
&& !do_header
)
3428 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3429 printf (_("Entry point "));
3430 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3431 printf (_("\nThere are %d program headers, starting at offset "),
3432 elf_header
.e_phnum
);
3433 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3437 if (! get_program_headers (file
))
3442 if (elf_header
.e_phnum
> 1)
3443 printf (_("\nProgram Headers:\n"));
3445 printf (_("\nProgram Headers:\n"));
3449 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3452 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3456 (_(" Type Offset VirtAddr PhysAddr\n"));
3458 (_(" FileSiz MemSiz Flags Align\n"));
3465 for (i
= 0, segment
= program_headers
;
3466 i
< elf_header
.e_phnum
;
3471 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3475 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3476 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3477 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3478 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3479 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3481 (segment
->p_flags
& PF_R
? 'R' : ' '),
3482 (segment
->p_flags
& PF_W
? 'W' : ' '),
3483 (segment
->p_flags
& PF_X
? 'E' : ' '));
3484 printf ("%#lx", (unsigned long) segment
->p_align
);
3488 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3489 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3492 print_vma (segment
->p_offset
, FULL_HEX
);
3496 print_vma (segment
->p_vaddr
, FULL_HEX
);
3498 print_vma (segment
->p_paddr
, FULL_HEX
);
3501 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3502 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3505 print_vma (segment
->p_filesz
, FULL_HEX
);
3509 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3510 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3513 print_vma (segment
->p_offset
, FULL_HEX
);
3517 (segment
->p_flags
& PF_R
? 'R' : ' '),
3518 (segment
->p_flags
& PF_W
? 'W' : ' '),
3519 (segment
->p_flags
& PF_X
? 'E' : ' '));
3521 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3522 printf ("%#lx", (unsigned long) segment
->p_align
);
3525 print_vma (segment
->p_align
, PREFIX_HEX
);
3530 print_vma (segment
->p_offset
, FULL_HEX
);
3532 print_vma (segment
->p_vaddr
, FULL_HEX
);
3534 print_vma (segment
->p_paddr
, FULL_HEX
);
3536 print_vma (segment
->p_filesz
, FULL_HEX
);
3538 print_vma (segment
->p_memsz
, FULL_HEX
);
3540 (segment
->p_flags
& PF_R
? 'R' : ' '),
3541 (segment
->p_flags
& PF_W
? 'W' : ' '),
3542 (segment
->p_flags
& PF_X
? 'E' : ' '));
3543 print_vma (segment
->p_align
, HEX
);
3547 switch (segment
->p_type
)
3551 error (_("more than one dynamic segment\n"));
3553 /* By default, assume that the .dynamic section is the first
3554 section in the DYNAMIC segment. */
3555 dynamic_addr
= segment
->p_offset
;
3556 dynamic_size
= segment
->p_filesz
;
3558 /* Try to locate the .dynamic section. If there is
3559 a section header table, we can easily locate it. */
3560 if (section_headers
!= NULL
)
3562 Elf_Internal_Shdr
*sec
;
3564 sec
= find_section (".dynamic");
3565 if (sec
== NULL
|| sec
->sh_size
== 0)
3567 error (_("no .dynamic section in the dynamic segment\n"));
3571 if (sec
->sh_type
== SHT_NOBITS
)
3577 dynamic_addr
= sec
->sh_offset
;
3578 dynamic_size
= sec
->sh_size
;
3580 if (dynamic_addr
< segment
->p_offset
3581 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
3582 warn (_("the .dynamic section is not contained"
3583 " within the dynamic segment\n"));
3584 else if (dynamic_addr
> segment
->p_offset
)
3585 warn (_("the .dynamic section is not the first section"
3586 " in the dynamic segment.\n"));
3591 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3593 error (_("Unable to find program interpreter name\n"));
3597 int ret
= snprintf (fmt
, sizeof (fmt
), "%%%ds", PATH_MAX
);
3599 if (ret
>= (int) sizeof (fmt
) || ret
< 0)
3600 error (_("Internal error: failed to create format string to display program interpreter\n"));
3602 program_interpreter
[0] = 0;
3603 if (fscanf (file
, fmt
, program_interpreter
) <= 0)
3604 error (_("Unable to read program interpreter name\n"));
3607 printf (_("\n [Requesting program interpreter: %s]"),
3608 program_interpreter
);
3614 putc ('\n', stdout
);
3617 if (do_segments
&& section_headers
!= NULL
&& string_table
!= NULL
)
3619 printf (_("\n Section to Segment mapping:\n"));
3620 printf (_(" Segment Sections...\n"));
3622 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3625 Elf_Internal_Shdr
*section
;
3627 segment
= program_headers
+ i
;
3628 section
= section_headers
+ 1;
3630 printf (" %2.2d ", i
);
3632 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3634 if (ELF_IS_SECTION_IN_SEGMENT_MEMORY(section
, segment
))
3635 printf ("%s ", SECTION_NAME (section
));
3646 /* Find the file offset corresponding to VMA by using the program headers. */
3649 offset_from_vma (FILE *file
, bfd_vma vma
, bfd_size_type size
)
3651 Elf_Internal_Phdr
*seg
;
3653 if (! get_program_headers (file
))
3655 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3659 for (seg
= program_headers
;
3660 seg
< program_headers
+ elf_header
.e_phnum
;
3663 if (seg
->p_type
!= PT_LOAD
)
3666 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3667 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3668 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3671 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3672 (unsigned long) vma
);
3678 get_32bit_section_headers (FILE *file
, unsigned int num
)
3680 Elf32_External_Shdr
*shdrs
;
3681 Elf_Internal_Shdr
*internal
;
3684 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3685 elf_header
.e_shentsize
, num
, _("section headers"));
3689 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3691 if (section_headers
== NULL
)
3693 error (_("Out of memory\n"));
3697 for (i
= 0, internal
= section_headers
;
3701 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3702 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3703 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3704 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3705 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3706 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3707 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3708 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3709 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3710 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3719 get_64bit_section_headers (FILE *file
, unsigned int num
)
3721 Elf64_External_Shdr
*shdrs
;
3722 Elf_Internal_Shdr
*internal
;
3725 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3726 elf_header
.e_shentsize
, num
, _("section headers"));
3730 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3732 if (section_headers
== NULL
)
3734 error (_("Out of memory\n"));
3738 for (i
= 0, internal
= section_headers
;
3742 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3743 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3744 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3745 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3746 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3747 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3748 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3749 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3750 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3751 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3759 static Elf_Internal_Sym
*
3760 get_32bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3762 unsigned long number
;
3763 Elf32_External_Sym
*esyms
;
3764 Elf_External_Sym_Shndx
*shndx
;
3765 Elf_Internal_Sym
*isyms
;
3766 Elf_Internal_Sym
*psym
;
3769 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3775 if (symtab_shndx_hdr
!= NULL
3776 && (symtab_shndx_hdr
->sh_link
3777 == (unsigned long) (section
- section_headers
)))
3779 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3780 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3788 number
= section
->sh_size
/ section
->sh_entsize
;
3789 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3793 error (_("Out of memory\n"));
3800 for (j
= 0, psym
= isyms
;
3804 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3805 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3806 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3807 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3808 if (psym
->st_shndx
== (SHN_XINDEX
& 0xffff) && shndx
!= NULL
)
3810 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3811 else if (psym
->st_shndx
>= (SHN_LORESERVE
& 0xffff))
3812 psym
->st_shndx
+= SHN_LORESERVE
- (SHN_LORESERVE
& 0xffff);
3813 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3814 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3824 static Elf_Internal_Sym
*
3825 get_64bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3827 unsigned long number
;
3828 Elf64_External_Sym
*esyms
;
3829 Elf_External_Sym_Shndx
*shndx
;
3830 Elf_Internal_Sym
*isyms
;
3831 Elf_Internal_Sym
*psym
;
3834 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3840 if (symtab_shndx_hdr
!= NULL
3841 && (symtab_shndx_hdr
->sh_link
3842 == (unsigned long) (section
- section_headers
)))
3844 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3845 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3853 number
= section
->sh_size
/ section
->sh_entsize
;
3854 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3858 error (_("Out of memory\n"));
3865 for (j
= 0, psym
= isyms
;
3869 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3870 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3871 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3872 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3873 if (psym
->st_shndx
== (SHN_XINDEX
& 0xffff) && shndx
!= NULL
)
3875 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3876 else if (psym
->st_shndx
>= (SHN_LORESERVE
& 0xffff))
3877 psym
->st_shndx
+= SHN_LORESERVE
- (SHN_LORESERVE
& 0xffff);
3878 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3879 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3890 get_elf_section_flags (bfd_vma sh_flags
)
3892 static char buff
[1024];
3894 int field_size
= is_32bit_elf
? 8 : 16;
3895 int index
, size
= sizeof (buff
) - (field_size
+ 4 + 1);
3896 bfd_vma os_flags
= 0;
3897 bfd_vma proc_flags
= 0;
3898 bfd_vma unknown_flags
= 0;
3912 { "LINK ORDER", 10 },
3913 { "OS NONCONF", 10 },
3916 /* IA-64 specific. */
3919 /* IA-64 OpenVMS specific. */
3920 { "VMS_GLOBAL", 10 },
3921 { "VMS_OVERLAID", 12 },
3922 { "VMS_SHARED", 10 },
3923 { "VMS_VECTOR", 10 },
3924 { "VMS_ALLOC_64BIT", 15 },
3925 { "VMS_PROTECTED", 13}
3928 if (do_section_details
)
3930 sprintf (buff
, "[%*.*lx]: ",
3931 field_size
, field_size
, (unsigned long) sh_flags
);
3932 p
+= field_size
+ 4;
3939 flag
= sh_flags
& - sh_flags
;
3942 if (do_section_details
)
3946 case SHF_WRITE
: index
= 0; break;
3947 case SHF_ALLOC
: index
= 1; break;
3948 case SHF_EXECINSTR
: index
= 2; break;
3949 case SHF_MERGE
: index
= 3; break;
3950 case SHF_STRINGS
: index
= 4; break;
3951 case SHF_INFO_LINK
: index
= 5; break;
3952 case SHF_LINK_ORDER
: index
= 6; break;
3953 case SHF_OS_NONCONFORMING
: index
= 7; break;
3954 case SHF_GROUP
: index
= 8; break;
3955 case SHF_TLS
: index
= 9; break;
3959 if (elf_header
.e_machine
== EM_IA_64
)
3961 if (flag
== SHF_IA_64_SHORT
)
3963 else if (flag
== SHF_IA_64_NORECOV
)
3966 else if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_OPENVMS
)
3969 case SHF_IA_64_VMS_GLOBAL
: index
= 12; break;
3970 case SHF_IA_64_VMS_OVERLAID
: index
= 13; break;
3971 case SHF_IA_64_VMS_SHARED
: index
= 14; break;
3972 case SHF_IA_64_VMS_VECTOR
: index
= 15; break;
3973 case SHF_IA_64_VMS_ALLOC_64BIT
: index
= 16; break;
3974 case SHF_IA_64_VMS_PROTECTED
: index
= 17; break;
3984 if (p
!= buff
+ field_size
+ 4)
3986 if (size
< (10 + 2))
3993 size
-= flags
[index
].len
;
3994 p
= stpcpy (p
, flags
[index
].str
);
3996 else if (flag
& SHF_MASKOS
)
3998 else if (flag
& SHF_MASKPROC
)
4001 unknown_flags
|= flag
;
4007 case SHF_WRITE
: *p
= 'W'; break;
4008 case SHF_ALLOC
: *p
= 'A'; break;
4009 case SHF_EXECINSTR
: *p
= 'X'; break;
4010 case SHF_MERGE
: *p
= 'M'; break;
4011 case SHF_STRINGS
: *p
= 'S'; break;
4012 case SHF_INFO_LINK
: *p
= 'I'; break;
4013 case SHF_LINK_ORDER
: *p
= 'L'; break;
4014 case SHF_OS_NONCONFORMING
: *p
= 'O'; break;
4015 case SHF_GROUP
: *p
= 'G'; break;
4016 case SHF_TLS
: *p
= 'T'; break;
4019 if (elf_header
.e_machine
== EM_X86_64
4020 && flag
== SHF_X86_64_LARGE
)
4022 else if (flag
& SHF_MASKOS
)
4025 sh_flags
&= ~ SHF_MASKOS
;
4027 else if (flag
& SHF_MASKPROC
)
4030 sh_flags
&= ~ SHF_MASKPROC
;
4040 if (do_section_details
)
4044 size
-= 5 + field_size
;
4045 if (p
!= buff
+ field_size
+ 4)
4053 sprintf (p
, "OS (%*.*lx)", field_size
, field_size
,
4054 (unsigned long) os_flags
);
4055 p
+= 5 + field_size
;
4059 size
-= 7 + field_size
;
4060 if (p
!= buff
+ field_size
+ 4)
4068 sprintf (p
, "PROC (%*.*lx)", field_size
, field_size
,
4069 (unsigned long) proc_flags
);
4070 p
+= 7 + field_size
;
4074 size
-= 10 + field_size
;
4075 if (p
!= buff
+ field_size
+ 4)
4083 sprintf (p
, "UNKNOWN (%*.*lx)", field_size
, field_size
,
4084 (unsigned long) unknown_flags
);
4085 p
+= 10 + field_size
;
4094 process_section_headers (FILE *file
)
4096 Elf_Internal_Shdr
*section
;
4099 section_headers
= NULL
;
4101 if (elf_header
.e_shnum
== 0)
4104 printf (_("\nThere are no sections in this file.\n"));
4109 if (do_sections
&& !do_header
)
4110 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
4111 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
4115 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
4118 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
4121 /* Read in the string table, so that we have names to display. */
4122 if (elf_header
.e_shstrndx
!= SHN_UNDEF
4123 && elf_header
.e_shstrndx
< elf_header
.e_shnum
)
4125 section
= section_headers
+ elf_header
.e_shstrndx
;
4127 if (section
->sh_size
!= 0)
4129 string_table
= get_data (NULL
, file
, section
->sh_offset
,
4130 1, section
->sh_size
, _("string table"));
4132 string_table_length
= string_table
!= NULL
? section
->sh_size
: 0;
4136 /* Scan the sections for the dynamic symbol table
4137 and dynamic string table and debug sections. */
4138 dynamic_symbols
= NULL
;
4139 dynamic_strings
= NULL
;
4140 dynamic_syminfo
= NULL
;
4141 symtab_shndx_hdr
= NULL
;
4143 eh_addr_size
= is_32bit_elf
? 4 : 8;
4144 switch (elf_header
.e_machine
)
4147 case EM_MIPS_RS3_LE
:
4148 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
4149 FDE addresses. However, the ABI also has a semi-official ILP32
4150 variant for which the normal FDE address size rules apply.
4152 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
4153 section, where XX is the size of longs in bits. Unfortunately,
4154 earlier compilers provided no way of distinguishing ILP32 objects
4155 from LP64 objects, so if there's any doubt, we should assume that
4156 the official LP64 form is being used. */
4157 if ((elf_header
.e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
4158 && find_section (".gcc_compiled_long32") == NULL
)
4164 switch (elf_header
.e_flags
& EF_H8_MACH
)
4166 case E_H8_MACH_H8300
:
4167 case E_H8_MACH_H8300HN
:
4168 case E_H8_MACH_H8300SN
:
4169 case E_H8_MACH_H8300SXN
:
4172 case E_H8_MACH_H8300H
:
4173 case E_H8_MACH_H8300S
:
4174 case E_H8_MACH_H8300SX
:
4182 switch (elf_header
.e_flags
& EF_M32C_CPU_MASK
)
4184 case EF_M32C_CPU_M16C
:
4191 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
4194 size_t expected_entsize \
4195 = is_32bit_elf ? size32 : size64; \
4196 if (section->sh_entsize != expected_entsize) \
4197 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
4198 i, (unsigned long int) section->sh_entsize, \
4199 (unsigned long int) expected_entsize); \
4200 section->sh_entsize = expected_entsize; \
4203 #define CHECK_ENTSIZE(section, i, type) \
4204 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
4205 sizeof (Elf64_External_##type))
4207 for (i
= 0, section
= section_headers
;
4208 i
< elf_header
.e_shnum
;
4211 char *name
= SECTION_NAME (section
);
4213 if (section
->sh_type
== SHT_DYNSYM
)
4215 if (dynamic_symbols
!= NULL
)
4217 error (_("File contains multiple dynamic symbol tables\n"));
4221 CHECK_ENTSIZE (section
, i
, Sym
);
4222 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
4223 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
4225 else if (section
->sh_type
== SHT_STRTAB
4226 && streq (name
, ".dynstr"))
4228 if (dynamic_strings
!= NULL
)
4230 error (_("File contains multiple dynamic string tables\n"));
4234 dynamic_strings
= get_data (NULL
, file
, section
->sh_offset
,
4235 1, section
->sh_size
, _("dynamic strings"));
4236 dynamic_strings_length
= section
->sh_size
;
4238 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
4240 if (symtab_shndx_hdr
!= NULL
)
4242 error (_("File contains multiple symtab shndx tables\n"));
4245 symtab_shndx_hdr
= section
;
4247 else if (section
->sh_type
== SHT_SYMTAB
)
4248 CHECK_ENTSIZE (section
, i
, Sym
);
4249 else if (section
->sh_type
== SHT_GROUP
)
4250 CHECK_ENTSIZE_VALUES (section
, i
, GRP_ENTRY_SIZE
, GRP_ENTRY_SIZE
);
4251 else if (section
->sh_type
== SHT_REL
)
4252 CHECK_ENTSIZE (section
, i
, Rel
);
4253 else if (section
->sh_type
== SHT_RELA
)
4254 CHECK_ENTSIZE (section
, i
, Rela
);
4255 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
4256 || do_debug_lines
|| do_debug_lines_decoded
|| do_debug_pubnames
4257 || do_debug_aranges
|| do_debug_frames
|| do_debug_macinfo
4258 || do_debug_str
|| do_debug_loc
|| do_debug_ranges
)
4259 && (const_strneq (name
, ".debug_")
4260 || const_strneq (name
, ".zdebug_")))
4263 name
+= sizeof (".zdebug_") - 1;
4265 name
+= sizeof (".debug_") - 1;
4268 || (do_debug_info
&& streq (name
, "info"))
4269 || (do_debug_abbrevs
&& streq (name
, "abbrev"))
4270 || ((do_debug_lines
|| do_debug_lines_decoded
)
4271 && streq (name
, "line"))
4272 || (do_debug_pubnames
&& streq (name
, "pubnames"))
4273 || (do_debug_aranges
&& streq (name
, "aranges"))
4274 || (do_debug_ranges
&& streq (name
, "ranges"))
4275 || (do_debug_frames
&& streq (name
, "frame"))
4276 || (do_debug_macinfo
&& streq (name
, "macinfo"))
4277 || (do_debug_str
&& streq (name
, "str"))
4278 || (do_debug_loc
&& streq (name
, "loc"))
4280 request_dump_bynumber (i
, DEBUG_DUMP
);
4282 /* Linkonce section to be combined with .debug_info at link time. */
4283 else if ((do_debugging
|| do_debug_info
)
4284 && const_strneq (name
, ".gnu.linkonce.wi."))
4285 request_dump_bynumber (i
, DEBUG_DUMP
);
4286 else if (do_debug_frames
&& streq (name
, ".eh_frame"))
4287 request_dump_bynumber (i
, DEBUG_DUMP
);
4293 if (elf_header
.e_shnum
> 1)
4294 printf (_("\nSection Headers:\n"));
4296 printf (_("\nSection Header:\n"));
4300 if (do_section_details
)
4302 printf (_(" [Nr] Name\n"));
4303 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
4307 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4311 if (do_section_details
)
4313 printf (_(" [Nr] Name\n"));
4314 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
4318 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4322 if (do_section_details
)
4324 printf (_(" [Nr] Name\n"));
4325 printf (_(" Type Address Offset Link\n"));
4326 printf (_(" Size EntSize Info Align\n"));
4330 printf (_(" [Nr] Name Type Address Offset\n"));
4331 printf (_(" Size EntSize Flags Link Info Align\n"));
4335 if (do_section_details
)
4336 printf (_(" Flags\n"));
4338 for (i
= 0, section
= section_headers
;
4339 i
< elf_header
.e_shnum
;
4342 if (do_section_details
)
4344 printf (" [%2u] %s\n",
4346 SECTION_NAME (section
));
4347 if (is_32bit_elf
|| do_wide
)
4348 printf (" %-15.15s ",
4349 get_section_type_name (section
->sh_type
));
4352 printf (" [%2u] %-17.17s %-15.15s ",
4354 SECTION_NAME (section
),
4355 get_section_type_name (section
->sh_type
));
4359 print_vma (section
->sh_addr
, LONG_HEX
);
4361 printf ( " %6.6lx %6.6lx %2.2lx",
4362 (unsigned long) section
->sh_offset
,
4363 (unsigned long) section
->sh_size
,
4364 (unsigned long) section
->sh_entsize
);
4366 if (do_section_details
)
4367 fputs (" ", stdout
);
4369 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4371 printf ("%2u %3u %2lu\n",
4374 (unsigned long) section
->sh_addralign
);
4378 print_vma (section
->sh_addr
, LONG_HEX
);
4380 if ((long) section
->sh_offset
== section
->sh_offset
)
4381 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
4385 print_vma (section
->sh_offset
, LONG_HEX
);
4388 if ((unsigned long) section
->sh_size
== section
->sh_size
)
4389 printf (" %6.6lx", (unsigned long) section
->sh_size
);
4393 print_vma (section
->sh_size
, LONG_HEX
);
4396 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
4397 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
4401 print_vma (section
->sh_entsize
, LONG_HEX
);
4404 if (do_section_details
)
4405 fputs (" ", stdout
);
4407 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4409 printf ("%2u %3u ", section
->sh_link
, section
->sh_info
);
4411 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
4412 printf ("%2lu\n", (unsigned long) section
->sh_addralign
);
4415 print_vma (section
->sh_addralign
, DEC
);
4419 else if (do_section_details
)
4421 printf (" %-15.15s ",
4422 get_section_type_name (section
->sh_type
));
4423 print_vma (section
->sh_addr
, LONG_HEX
);
4424 if ((long) section
->sh_offset
== section
->sh_offset
)
4425 printf (" %16.16lx", (unsigned long) section
->sh_offset
);
4429 print_vma (section
->sh_offset
, LONG_HEX
);
4431 printf (" %u\n ", section
->sh_link
);
4432 print_vma (section
->sh_size
, LONG_HEX
);
4434 print_vma (section
->sh_entsize
, LONG_HEX
);
4436 printf (" %-16u %lu\n",
4438 (unsigned long) section
->sh_addralign
);
4443 print_vma (section
->sh_addr
, LONG_HEX
);
4444 if ((long) section
->sh_offset
== section
->sh_offset
)
4445 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
4449 print_vma (section
->sh_offset
, LONG_HEX
);
4452 print_vma (section
->sh_size
, LONG_HEX
);
4454 print_vma (section
->sh_entsize
, LONG_HEX
);
4456 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4458 printf (" %2u %3u %lu\n",
4461 (unsigned long) section
->sh_addralign
);
4464 if (do_section_details
)
4465 printf (" %s\n", get_elf_section_flags (section
->sh_flags
));
4468 if (!do_section_details
)
4469 printf (_("Key to Flags:\n\
4470 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4471 I (info), L (link order), G (group), x (unknown)\n\
4472 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4478 get_group_flags (unsigned int flags
)
4480 static char buff
[32];
4487 snprintf (buff
, sizeof (buff
), _("[<unknown>: 0x%x]"), flags
);
4494 process_section_groups (FILE *file
)
4496 Elf_Internal_Shdr
*section
;
4498 struct group
*group
;
4499 Elf_Internal_Shdr
*symtab_sec
, *strtab_sec
;
4500 Elf_Internal_Sym
*symtab
;
4504 /* Don't process section groups unless needed. */
4505 if (!do_unwind
&& !do_section_groups
)
4508 if (elf_header
.e_shnum
== 0)
4510 if (do_section_groups
)
4511 printf (_("\nThere are no sections in this file.\n"));
4516 if (section_headers
== NULL
)
4518 error (_("Section headers are not available!\n"));
4522 section_headers_groups
= calloc (elf_header
.e_shnum
,
4523 sizeof (struct group
*));
4525 if (section_headers_groups
== NULL
)
4527 error (_("Out of memory\n"));
4531 /* Scan the sections for the group section. */
4533 for (i
= 0, section
= section_headers
;
4534 i
< elf_header
.e_shnum
;
4536 if (section
->sh_type
== SHT_GROUP
)
4539 if (group_count
== 0)
4541 if (do_section_groups
)
4542 printf (_("\nThere are no section groups in this file.\n"));
4547 section_groups
= calloc (group_count
, sizeof (struct group
));
4549 if (section_groups
== NULL
)
4551 error (_("Out of memory\n"));
4560 for (i
= 0, section
= section_headers
, group
= section_groups
;
4561 i
< elf_header
.e_shnum
;
4564 if (section
->sh_type
== SHT_GROUP
)
4566 char *name
= SECTION_NAME (section
);
4568 unsigned char *start
, *indices
;
4569 unsigned int entry
, j
, size
;
4570 Elf_Internal_Shdr
*sec
;
4571 Elf_Internal_Sym
*sym
;
4573 /* Get the symbol table. */
4574 if (section
->sh_link
>= elf_header
.e_shnum
4575 || ((sec
= section_headers
+ section
->sh_link
)->sh_type
4578 error (_("Bad sh_link in group section `%s'\n"), name
);
4582 if (symtab_sec
!= sec
)
4587 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
);
4590 sym
= symtab
+ section
->sh_info
;
4592 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4594 if (sym
->st_shndx
== 0
4595 || sym
->st_shndx
>= elf_header
.e_shnum
)
4597 error (_("Bad sh_info in group section `%s'\n"), name
);
4601 group_name
= SECTION_NAME (section_headers
+ sym
->st_shndx
);
4610 /* Get the string table. */
4611 if (symtab_sec
->sh_link
>= elf_header
.e_shnum
)
4620 != (sec
= section_headers
+ symtab_sec
->sh_link
))
4625 strtab
= get_data (NULL
, file
, strtab_sec
->sh_offset
,
4626 1, strtab_sec
->sh_size
,
4628 strtab_size
= strtab
!= NULL
? strtab_sec
->sh_size
: 0;
4630 group_name
= sym
->st_name
< strtab_size
4631 ? strtab
+ sym
->st_name
: "<corrupt>";
4634 start
= get_data (NULL
, file
, section
->sh_offset
,
4635 1, section
->sh_size
, _("section data"));
4638 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
4639 entry
= byte_get (indices
, 4);
4642 if (do_section_groups
)
4644 printf ("\n%s group section [%5u] `%s' [%s] contains %u sections:\n",
4645 get_group_flags (entry
), i
, name
, group_name
, size
);
4647 printf (_(" [Index] Name\n"));
4650 group
->group_index
= i
;
4652 for (j
= 0; j
< size
; j
++)
4654 struct group_list
*g
;
4656 entry
= byte_get (indices
, 4);
4659 if (entry
>= elf_header
.e_shnum
)
4661 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
4662 entry
, i
, elf_header
.e_shnum
- 1);
4666 if (section_headers_groups
[entry
] != NULL
)
4670 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
4672 section_headers_groups
[entry
]->group_index
);
4677 /* Intel C/C++ compiler may put section 0 in a
4678 section group. We just warn it the first time
4679 and ignore it afterwards. */
4680 static int warned
= 0;
4683 error (_("section 0 in group section [%5u]\n"),
4684 section_headers_groups
[entry
]->group_index
);
4690 section_headers_groups
[entry
] = group
;
4692 if (do_section_groups
)
4694 sec
= section_headers
+ entry
;
4695 printf (" [%5u] %s\n", entry
, SECTION_NAME (sec
));
4698 g
= xmalloc (sizeof (struct group_list
));
4699 g
->section_index
= entry
;
4700 g
->next
= group
->root
;
4724 } dynamic_relocations
[] =
4726 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
4727 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
4728 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
4731 /* Process the reloc section. */
4734 process_relocs (FILE *file
)
4736 unsigned long rel_size
;
4737 unsigned long rel_offset
;
4743 if (do_using_dynamic
)
4747 int has_dynamic_reloc
;
4750 has_dynamic_reloc
= 0;
4752 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
4754 is_rela
= dynamic_relocations
[i
].rela
;
4755 name
= dynamic_relocations
[i
].name
;
4756 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
4757 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
4759 has_dynamic_reloc
|= rel_size
;
4761 if (is_rela
== UNKNOWN
)
4763 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
4764 switch (dynamic_info
[DT_PLTREL
])
4778 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4779 name
, rel_offset
, rel_size
);
4781 dump_relocations (file
,
4782 offset_from_vma (file
, rel_offset
, rel_size
),
4784 dynamic_symbols
, num_dynamic_syms
,
4785 dynamic_strings
, dynamic_strings_length
, is_rela
);
4789 if (! has_dynamic_reloc
)
4790 printf (_("\nThere are no dynamic relocations in this file.\n"));
4794 Elf_Internal_Shdr
*section
;
4798 for (i
= 0, section
= section_headers
;
4799 i
< elf_header
.e_shnum
;
4802 if ( section
->sh_type
!= SHT_RELA
4803 && section
->sh_type
!= SHT_REL
)
4806 rel_offset
= section
->sh_offset
;
4807 rel_size
= section
->sh_size
;
4811 Elf_Internal_Shdr
*strsec
;
4814 printf (_("\nRelocation section "));
4816 if (string_table
== NULL
)
4817 printf ("%d", section
->sh_name
);
4819 printf (_("'%s'"), SECTION_NAME (section
));
4821 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4822 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4824 is_rela
= section
->sh_type
== SHT_RELA
;
4826 if (section
->sh_link
!= 0
4827 && section
->sh_link
< elf_header
.e_shnum
)
4829 Elf_Internal_Shdr
*symsec
;
4830 Elf_Internal_Sym
*symtab
;
4831 unsigned long nsyms
;
4832 unsigned long strtablen
= 0;
4833 char *strtab
= NULL
;
4835 symsec
= section_headers
+ section
->sh_link
;
4836 if (symsec
->sh_type
!= SHT_SYMTAB
4837 && symsec
->sh_type
!= SHT_DYNSYM
)
4840 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4841 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4846 if (symsec
->sh_link
!= 0
4847 && symsec
->sh_link
< elf_header
.e_shnum
)
4849 strsec
= section_headers
+ symsec
->sh_link
;
4851 strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4854 strtablen
= strtab
== NULL
? 0 : strsec
->sh_size
;
4857 dump_relocations (file
, rel_offset
, rel_size
,
4858 symtab
, nsyms
, strtab
, strtablen
, is_rela
);
4864 dump_relocations (file
, rel_offset
, rel_size
,
4865 NULL
, 0, NULL
, 0, is_rela
);
4872 printf (_("\nThere are no relocations in this file.\n"));
4878 /* Process the unwind section. */
4880 #include "unwind-ia64.h"
4882 /* An absolute address consists of a section and an offset. If the
4883 section is NULL, the offset itself is the address, otherwise, the
4884 address equals to LOAD_ADDRESS(section) + offset. */
4888 unsigned short section
;
4892 #define ABSADDR(a) \
4894 ? section_headers [(a).section].sh_addr + (a).offset \
4897 struct ia64_unw_aux_info
4899 struct ia64_unw_table_entry
4901 struct absaddr start
;
4903 struct absaddr info
;
4905 *table
; /* Unwind table. */
4906 unsigned long table_len
; /* Length of unwind table. */
4907 unsigned char *info
; /* Unwind info. */
4908 unsigned long info_size
; /* Size of unwind info. */
4909 bfd_vma info_addr
; /* starting address of unwind info. */
4910 bfd_vma seg_base
; /* Starting address of segment. */
4911 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4912 unsigned long nsyms
; /* Number of symbols. */
4913 char *strtab
; /* The string table. */
4914 unsigned long strtab_size
; /* Size of string table. */
4918 find_symbol_for_address (Elf_Internal_Sym
*symtab
,
4919 unsigned long nsyms
,
4921 unsigned long strtab_size
,
4922 struct absaddr addr
,
4923 const char **symname
,
4926 bfd_vma dist
= 0x100000;
4927 Elf_Internal_Sym
*sym
, *best
= NULL
;
4930 for (i
= 0, sym
= symtab
; i
< nsyms
; ++i
, ++sym
)
4932 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
4933 && sym
->st_name
!= 0
4934 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
4935 && addr
.offset
>= sym
->st_value
4936 && addr
.offset
- sym
->st_value
< dist
)
4939 dist
= addr
.offset
- sym
->st_value
;
4946 *symname
= (best
->st_name
>= strtab_size
4947 ? "<corrupt>" : strtab
+ best
->st_name
);
4952 *offset
= addr
.offset
;
4956 dump_ia64_unwind (struct ia64_unw_aux_info
*aux
)
4958 struct ia64_unw_table_entry
*tp
;
4961 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4965 const unsigned char *dp
;
4966 const unsigned char *head
;
4967 const char *procname
;
4969 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
4970 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
4972 fputs ("\n<", stdout
);
4976 fputs (procname
, stdout
);
4979 printf ("+%lx", (unsigned long) offset
);
4982 fputs (">: [", stdout
);
4983 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4984 fputc ('-', stdout
);
4985 print_vma (tp
->end
.offset
, PREFIX_HEX
);
4986 printf ("], info at +0x%lx\n",
4987 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
4989 head
= aux
->info
+ (ABSADDR (tp
->info
) - aux
->info_addr
);
4990 stamp
= byte_get ((unsigned char *) head
, sizeof (stamp
));
4992 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4993 (unsigned) UNW_VER (stamp
),
4994 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
4995 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
4996 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
4997 (unsigned long) (eh_addr_size
* UNW_LENGTH (stamp
)));
4999 if (UNW_VER (stamp
) != 1)
5001 printf ("\tUnknown version.\n");
5006 for (dp
= head
+ 8; dp
< head
+ 8 + eh_addr_size
* UNW_LENGTH (stamp
);)
5007 dp
= unw_decode (dp
, in_body
, & in_body
);
5012 slurp_ia64_unwind_table (FILE *file
,
5013 struct ia64_unw_aux_info
*aux
,
5014 Elf_Internal_Shdr
*sec
)
5016 unsigned long size
, nrelas
, i
;
5017 Elf_Internal_Phdr
*seg
;
5018 struct ia64_unw_table_entry
*tep
;
5019 Elf_Internal_Shdr
*relsec
;
5020 Elf_Internal_Rela
*rela
, *rp
;
5021 unsigned char *table
, *tp
;
5022 Elf_Internal_Sym
*sym
;
5023 const char *relname
;
5025 /* First, find the starting address of the segment that includes
5028 if (elf_header
.e_phnum
)
5030 if (! get_program_headers (file
))
5033 for (seg
= program_headers
;
5034 seg
< program_headers
+ elf_header
.e_phnum
;
5037 if (seg
->p_type
!= PT_LOAD
)
5040 if (sec
->sh_addr
>= seg
->p_vaddr
5041 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5043 aux
->seg_base
= seg
->p_vaddr
;
5049 /* Second, build the unwind table from the contents of the unwind section: */
5050 size
= sec
->sh_size
;
5051 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
5055 aux
->table
= xcmalloc (size
/ (3 * eh_addr_size
), sizeof (aux
->table
[0]));
5057 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * eh_addr_size
, ++tep
)
5059 tep
->start
.section
= SHN_UNDEF
;
5060 tep
->end
.section
= SHN_UNDEF
;
5061 tep
->info
.section
= SHN_UNDEF
;
5064 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
5065 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
5066 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
5070 tep
->start
.offset
= BYTE_GET ((unsigned char *) tp
+ 0);
5071 tep
->end
.offset
= BYTE_GET ((unsigned char *) tp
+ 8);
5072 tep
->info
.offset
= BYTE_GET ((unsigned char *) tp
+ 16);
5074 tep
->start
.offset
+= aux
->seg_base
;
5075 tep
->end
.offset
+= aux
->seg_base
;
5076 tep
->info
.offset
+= aux
->seg_base
;
5080 /* Third, apply any relocations to the unwind table: */
5081 for (relsec
= section_headers
;
5082 relsec
< section_headers
+ elf_header
.e_shnum
;
5085 if (relsec
->sh_type
!= SHT_RELA
5086 || relsec
->sh_info
>= elf_header
.e_shnum
5087 || section_headers
+ relsec
->sh_info
!= sec
)
5090 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5094 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5096 relname
= elf_ia64_reloc_type (get_reloc_type (rp
->r_info
));
5097 sym
= aux
->symtab
+ get_reloc_symindex (rp
->r_info
);
5099 if (! const_strneq (relname
, "R_IA64_SEGREL"))
5101 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5105 i
= rp
->r_offset
/ (3 * eh_addr_size
);
5107 switch (rp
->r_offset
/eh_addr_size
% 3)
5110 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5111 aux
->table
[i
].start
.offset
+= rp
->r_addend
+ sym
->st_value
;
5114 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5115 aux
->table
[i
].end
.offset
+= rp
->r_addend
+ sym
->st_value
;
5118 aux
->table
[i
].info
.section
= sym
->st_shndx
;
5119 aux
->table
[i
].info
.offset
+= rp
->r_addend
+ sym
->st_value
;
5129 aux
->table_len
= size
/ (3 * eh_addr_size
);
5134 ia64_process_unwind (FILE *file
)
5136 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
5137 unsigned long i
, unwcount
= 0, unwstart
= 0;
5138 struct ia64_unw_aux_info aux
;
5140 memset (& aux
, 0, sizeof (aux
));
5142 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5144 if (sec
->sh_type
== SHT_SYMTAB
5145 && sec
->sh_link
< elf_header
.e_shnum
)
5147 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5148 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5150 strsec
= section_headers
+ sec
->sh_link
;
5151 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
5152 1, strsec
->sh_size
, _("string table"));
5153 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5155 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
5160 printf (_("\nThere are no unwind sections in this file.\n"));
5162 while (unwcount
-- > 0)
5167 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
5168 i
< elf_header
.e_shnum
; ++i
, ++sec
)
5169 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
5176 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
5178 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
5180 /* We need to find which section group it is in. */
5181 struct group_list
*g
= section_headers_groups
[i
]->root
;
5183 for (; g
!= NULL
; g
= g
->next
)
5185 sec
= section_headers
+ g
->section_index
;
5187 if (streq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
))
5192 i
= elf_header
.e_shnum
;
5194 else if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
, len
))
5196 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
5197 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
5198 suffix
= SECTION_NAME (unwsec
) + len
;
5199 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
5201 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info_once
, len2
)
5202 && streq (SECTION_NAME (sec
) + len2
, suffix
))
5207 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
5208 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
5209 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
5210 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
5212 if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
, len
))
5213 suffix
= SECTION_NAME (unwsec
) + len
;
5214 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
5216 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
, len2
)
5217 && streq (SECTION_NAME (sec
) + len2
, suffix
))
5221 if (i
== elf_header
.e_shnum
)
5223 printf (_("\nCould not find unwind info section for "));
5225 if (string_table
== NULL
)
5226 printf ("%d", unwsec
->sh_name
);
5228 printf (_("'%s'"), SECTION_NAME (unwsec
));
5232 aux
.info_size
= sec
->sh_size
;
5233 aux
.info_addr
= sec
->sh_addr
;
5234 aux
.info
= get_data (NULL
, file
, sec
->sh_offset
, 1, aux
.info_size
,
5237 printf (_("\nUnwind section "));
5239 if (string_table
== NULL
)
5240 printf ("%d", unwsec
->sh_name
);
5242 printf (_("'%s'"), SECTION_NAME (unwsec
));
5244 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5245 (unsigned long) unwsec
->sh_offset
,
5246 (unsigned long) (unwsec
->sh_size
/ (3 * eh_addr_size
)));
5248 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
5250 if (aux
.table_len
> 0)
5251 dump_ia64_unwind (& aux
);
5254 free ((char *) aux
.table
);
5256 free ((char *) aux
.info
);
5265 free ((char *) aux
.strtab
);
5270 struct hppa_unw_aux_info
5272 struct hppa_unw_table_entry
5274 struct absaddr start
;
5276 unsigned int Cannot_unwind
:1; /* 0 */
5277 unsigned int Millicode
:1; /* 1 */
5278 unsigned int Millicode_save_sr0
:1; /* 2 */
5279 unsigned int Region_description
:2; /* 3..4 */
5280 unsigned int reserved1
:1; /* 5 */
5281 unsigned int Entry_SR
:1; /* 6 */
5282 unsigned int Entry_FR
:4; /* number saved */ /* 7..10 */
5283 unsigned int Entry_GR
:5; /* number saved */ /* 11..15 */
5284 unsigned int Args_stored
:1; /* 16 */
5285 unsigned int Variable_Frame
:1; /* 17 */
5286 unsigned int Separate_Package_Body
:1; /* 18 */
5287 unsigned int Frame_Extension_Millicode
:1; /* 19 */
5288 unsigned int Stack_Overflow_Check
:1; /* 20 */
5289 unsigned int Two_Instruction_SP_Increment
:1; /* 21 */
5290 unsigned int Ada_Region
:1; /* 22 */
5291 unsigned int cxx_info
:1; /* 23 */
5292 unsigned int cxx_try_catch
:1; /* 24 */
5293 unsigned int sched_entry_seq
:1; /* 25 */
5294 unsigned int reserved2
:1; /* 26 */
5295 unsigned int Save_SP
:1; /* 27 */
5296 unsigned int Save_RP
:1; /* 28 */
5297 unsigned int Save_MRP_in_frame
:1; /* 29 */
5298 unsigned int extn_ptr_defined
:1; /* 30 */
5299 unsigned int Cleanup_defined
:1; /* 31 */
5301 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
5302 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
5303 unsigned int Large_frame
:1; /* 2 */
5304 unsigned int Pseudo_SP_Set
:1; /* 3 */
5305 unsigned int reserved4
:1; /* 4 */
5306 unsigned int Total_frame_size
:27; /* 5..31 */
5308 *table
; /* Unwind table. */
5309 unsigned long table_len
; /* Length of unwind table. */
5310 bfd_vma seg_base
; /* Starting address of segment. */
5311 Elf_Internal_Sym
*symtab
; /* The symbol table. */
5312 unsigned long nsyms
; /* Number of symbols. */
5313 char *strtab
; /* The string table. */
5314 unsigned long strtab_size
; /* Size of string table. */
5318 dump_hppa_unwind (struct hppa_unw_aux_info
*aux
)
5320 struct hppa_unw_table_entry
*tp
;
5322 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
5325 const char *procname
;
5327 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
5328 aux
->strtab_size
, tp
->start
, &procname
,
5331 fputs ("\n<", stdout
);
5335 fputs (procname
, stdout
);
5338 printf ("+%lx", (unsigned long) offset
);
5341 fputs (">: [", stdout
);
5342 print_vma (tp
->start
.offset
, PREFIX_HEX
);
5343 fputc ('-', stdout
);
5344 print_vma (tp
->end
.offset
, PREFIX_HEX
);
5347 #define PF(_m) if (tp->_m) printf (#_m " ");
5348 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5351 PF(Millicode_save_sr0
);
5352 /* PV(Region_description); */
5358 PF(Separate_Package_Body
);
5359 PF(Frame_Extension_Millicode
);
5360 PF(Stack_Overflow_Check
);
5361 PF(Two_Instruction_SP_Increment
);
5365 PF(sched_entry_seq
);
5368 PF(Save_MRP_in_frame
);
5369 PF(extn_ptr_defined
);
5370 PF(Cleanup_defined
);
5371 PF(MPE_XL_interrupt_marker
);
5372 PF(HP_UX_interrupt_marker
);
5375 PV(Total_frame_size
);
5384 slurp_hppa_unwind_table (FILE *file
,
5385 struct hppa_unw_aux_info
*aux
,
5386 Elf_Internal_Shdr
*sec
)
5388 unsigned long size
, unw_ent_size
, nentries
, nrelas
, i
;
5389 Elf_Internal_Phdr
*seg
;
5390 struct hppa_unw_table_entry
*tep
;
5391 Elf_Internal_Shdr
*relsec
;
5392 Elf_Internal_Rela
*rela
, *rp
;
5393 unsigned char *table
, *tp
;
5394 Elf_Internal_Sym
*sym
;
5395 const char *relname
;
5397 /* First, find the starting address of the segment that includes
5400 if (elf_header
.e_phnum
)
5402 if (! get_program_headers (file
))
5405 for (seg
= program_headers
;
5406 seg
< program_headers
+ elf_header
.e_phnum
;
5409 if (seg
->p_type
!= PT_LOAD
)
5412 if (sec
->sh_addr
>= seg
->p_vaddr
5413 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5415 aux
->seg_base
= seg
->p_vaddr
;
5421 /* Second, build the unwind table from the contents of the unwind
5423 size
= sec
->sh_size
;
5424 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
5429 nentries
= size
/ unw_ent_size
;
5430 size
= unw_ent_size
* nentries
;
5432 tep
= aux
->table
= xcmalloc (nentries
, sizeof (aux
->table
[0]));
5434 for (tp
= table
; tp
< table
+ size
; tp
+= unw_ent_size
, ++tep
)
5436 unsigned int tmp1
, tmp2
;
5438 tep
->start
.section
= SHN_UNDEF
;
5439 tep
->end
.section
= SHN_UNDEF
;
5441 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
5442 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
5443 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
5444 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
5446 tep
->start
.offset
+= aux
->seg_base
;
5447 tep
->end
.offset
+= aux
->seg_base
;
5449 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
5450 tep
->Millicode
= (tmp1
>> 30) & 0x1;
5451 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
5452 tep
->Region_description
= (tmp1
>> 27) & 0x3;
5453 tep
->reserved1
= (tmp1
>> 26) & 0x1;
5454 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
5455 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
5456 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
5457 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
5458 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
5459 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
5460 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
5461 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
5462 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
5463 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
5464 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
5465 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
5466 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
5467 tep
->reserved2
= (tmp1
>> 5) & 0x1;
5468 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
5469 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
5470 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
5471 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
5472 tep
->Cleanup_defined
= tmp1
& 0x1;
5474 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
5475 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
5476 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
5477 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
5478 tep
->reserved4
= (tmp2
>> 27) & 0x1;
5479 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
5483 /* Third, apply any relocations to the unwind table. */
5484 for (relsec
= section_headers
;
5485 relsec
< section_headers
+ elf_header
.e_shnum
;
5488 if (relsec
->sh_type
!= SHT_RELA
5489 || relsec
->sh_info
>= elf_header
.e_shnum
5490 || section_headers
+ relsec
->sh_info
!= sec
)
5493 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5497 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5499 relname
= elf_hppa_reloc_type (get_reloc_type (rp
->r_info
));
5500 sym
= aux
->symtab
+ get_reloc_symindex (rp
->r_info
);
5502 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
5503 if (! const_strneq (relname
, "R_PARISC_SEGREL"))
5505 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5509 i
= rp
->r_offset
/ unw_ent_size
;
5511 switch ((rp
->r_offset
% unw_ent_size
) / eh_addr_size
)
5514 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5515 aux
->table
[i
].start
.offset
+= sym
->st_value
+ rp
->r_addend
;
5518 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5519 aux
->table
[i
].end
.offset
+= sym
->st_value
+ rp
->r_addend
;
5529 aux
->table_len
= nentries
;
5535 hppa_process_unwind (FILE *file
)
5537 struct hppa_unw_aux_info aux
;
5538 Elf_Internal_Shdr
*unwsec
= NULL
;
5539 Elf_Internal_Shdr
*strsec
;
5540 Elf_Internal_Shdr
*sec
;
5543 memset (& aux
, 0, sizeof (aux
));
5545 if (string_table
== NULL
)
5548 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5550 if (sec
->sh_type
== SHT_SYMTAB
5551 && sec
->sh_link
< elf_header
.e_shnum
)
5553 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5554 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5556 strsec
= section_headers
+ sec
->sh_link
;
5557 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
5558 1, strsec
->sh_size
, _("string table"));
5559 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5561 else if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5566 printf (_("\nThere are no unwind sections in this file.\n"));
5568 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5570 if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5572 printf (_("\nUnwind section "));
5573 printf (_("'%s'"), SECTION_NAME (sec
));
5575 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5576 (unsigned long) sec
->sh_offset
,
5577 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
+ 8)));
5579 slurp_hppa_unwind_table (file
, &aux
, sec
);
5580 if (aux
.table_len
> 0)
5581 dump_hppa_unwind (&aux
);
5584 free ((char *) aux
.table
);
5592 free ((char *) aux
.strtab
);
5598 process_unwind (FILE *file
)
5600 struct unwind_handler
{
5602 int (*handler
)(FILE *file
);
5604 { EM_IA_64
, ia64_process_unwind
},
5605 { EM_PARISC
, hppa_process_unwind
},
5613 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
5614 if (elf_header
.e_machine
== handlers
[i
].machtype
)
5615 return handlers
[i
].handler (file
);
5617 printf (_("\nThere are no unwind sections in this file.\n"));
5622 dynamic_section_mips_val (Elf_Internal_Dyn
*entry
)
5624 switch (entry
->d_tag
)
5627 if (entry
->d_un
.d_val
== 0)
5631 static const char * opts
[] =
5633 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5634 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5635 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5636 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5641 for (cnt
= 0; cnt
< ARRAY_SIZE (opts
); ++cnt
)
5642 if (entry
->d_un
.d_val
& (1 << cnt
))
5644 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
5651 case DT_MIPS_IVERSION
:
5652 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5653 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5655 printf ("<corrupt: %ld>\n", (long) entry
->d_un
.d_ptr
);
5658 case DT_MIPS_TIME_STAMP
:
5663 time_t time
= entry
->d_un
.d_val
;
5664 tmp
= gmtime (&time
);
5665 snprintf (timebuf
, sizeof (timebuf
), "%04u-%02u-%02uT%02u:%02u:%02u",
5666 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5667 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5668 printf ("Time Stamp: %s\n", timebuf
);
5672 case DT_MIPS_RLD_VERSION
:
5673 case DT_MIPS_LOCAL_GOTNO
:
5674 case DT_MIPS_CONFLICTNO
:
5675 case DT_MIPS_LIBLISTNO
:
5676 case DT_MIPS_SYMTABNO
:
5677 case DT_MIPS_UNREFEXTNO
:
5678 case DT_MIPS_HIPAGENO
:
5679 case DT_MIPS_DELTA_CLASS_NO
:
5680 case DT_MIPS_DELTA_INSTANCE_NO
:
5681 case DT_MIPS_DELTA_RELOC_NO
:
5682 case DT_MIPS_DELTA_SYM_NO
:
5683 case DT_MIPS_DELTA_CLASSSYM_NO
:
5684 case DT_MIPS_COMPACT_SIZE
:
5685 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
5689 printf ("%#lx\n", (unsigned long) entry
->d_un
.d_ptr
);
5695 dynamic_section_parisc_val (Elf_Internal_Dyn
*entry
)
5697 switch (entry
->d_tag
)
5699 case DT_HP_DLD_FLAGS
:
5708 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
5709 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
5710 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
5711 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
5712 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
5713 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
5714 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
5715 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
5716 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
5717 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
5718 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" },
5719 { DT_HP_GST
, "HP_GST" },
5720 { DT_HP_SHLIB_FIXED
, "HP_SHLIB_FIXED" },
5721 { DT_HP_MERGE_SHLIB_SEG
, "HP_MERGE_SHLIB_SEG" },
5722 { DT_HP_NODELETE
, "HP_NODELETE" },
5723 { DT_HP_GROUP
, "HP_GROUP" },
5724 { DT_HP_PROTECT_LINKAGE_TABLE
, "HP_PROTECT_LINKAGE_TABLE" }
5728 bfd_vma val
= entry
->d_un
.d_val
;
5730 for (cnt
= 0; cnt
< ARRAY_SIZE (flags
); ++cnt
)
5731 if (val
& flags
[cnt
].bit
)
5735 fputs (flags
[cnt
].str
, stdout
);
5737 val
^= flags
[cnt
].bit
;
5740 if (val
!= 0 || first
)
5744 print_vma (val
, HEX
);
5750 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5757 dynamic_section_ia64_val (Elf_Internal_Dyn
*entry
)
5759 switch (entry
->d_tag
)
5761 case DT_IA_64_PLT_RESERVE
:
5762 /* First 3 slots reserved. */
5763 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5765 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
5769 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5776 get_32bit_dynamic_section (FILE *file
)
5778 Elf32_External_Dyn
*edyn
, *ext
;
5779 Elf_Internal_Dyn
*entry
;
5781 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5782 _("dynamic section"));
5786 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5787 might not have the luxury of section headers. Look for the DT_NULL
5788 terminator to determine the number of entries. */
5789 for (ext
= edyn
, dynamic_nent
= 0;
5790 (char *) ext
< (char *) edyn
+ dynamic_size
;
5794 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5798 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5799 if (dynamic_section
== NULL
)
5801 error (_("Out of memory\n"));
5806 for (ext
= edyn
, entry
= dynamic_section
;
5807 entry
< dynamic_section
+ dynamic_nent
;
5810 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5811 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5820 get_64bit_dynamic_section (FILE *file
)
5822 Elf64_External_Dyn
*edyn
, *ext
;
5823 Elf_Internal_Dyn
*entry
;
5825 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5826 _("dynamic section"));
5830 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5831 might not have the luxury of section headers. Look for the DT_NULL
5832 terminator to determine the number of entries. */
5833 for (ext
= edyn
, dynamic_nent
= 0;
5834 (char *) ext
< (char *) edyn
+ dynamic_size
;
5838 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5842 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5843 if (dynamic_section
== NULL
)
5845 error (_("Out of memory\n"));
5850 for (ext
= edyn
, entry
= dynamic_section
;
5851 entry
< dynamic_section
+ dynamic_nent
;
5854 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5855 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5864 print_dynamic_flags (bfd_vma flags
)
5872 flag
= flags
& - flags
;
5882 case DF_ORIGIN
: fputs ("ORIGIN", stdout
); break;
5883 case DF_SYMBOLIC
: fputs ("SYMBOLIC", stdout
); break;
5884 case DF_TEXTREL
: fputs ("TEXTREL", stdout
); break;
5885 case DF_BIND_NOW
: fputs ("BIND_NOW", stdout
); break;
5886 case DF_STATIC_TLS
: fputs ("STATIC_TLS", stdout
); break;
5887 default: fputs ("unknown", stdout
); break;
5893 /* Parse and display the contents of the dynamic section. */
5896 process_dynamic_section (FILE *file
)
5898 Elf_Internal_Dyn
*entry
;
5900 if (dynamic_size
== 0)
5903 printf (_("\nThere is no dynamic section in this file.\n"));
5910 if (! get_32bit_dynamic_section (file
))
5913 else if (! get_64bit_dynamic_section (file
))
5916 /* Find the appropriate symbol table. */
5917 if (dynamic_symbols
== NULL
)
5919 for (entry
= dynamic_section
;
5920 entry
< dynamic_section
+ dynamic_nent
;
5923 Elf_Internal_Shdr section
;
5925 if (entry
->d_tag
!= DT_SYMTAB
)
5928 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
5930 /* Since we do not know how big the symbol table is,
5931 we default to reading in the entire file (!) and
5932 processing that. This is overkill, I know, but it
5934 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5936 if (archive_file_offset
!= 0)
5937 section
.sh_size
= archive_file_size
- section
.sh_offset
;
5940 if (fseek (file
, 0, SEEK_END
))
5941 error (_("Unable to seek to end of file!\n"));
5943 section
.sh_size
= ftell (file
) - section
.sh_offset
;
5947 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
5949 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
5951 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
5952 if (num_dynamic_syms
< 1)
5954 error (_("Unable to determine the number of symbols to load\n"));
5958 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
5962 /* Similarly find a string table. */
5963 if (dynamic_strings
== NULL
)
5965 for (entry
= dynamic_section
;
5966 entry
< dynamic_section
+ dynamic_nent
;
5969 unsigned long offset
;
5972 if (entry
->d_tag
!= DT_STRTAB
)
5975 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
5977 /* Since we do not know how big the string table is,
5978 we default to reading in the entire file (!) and
5979 processing that. This is overkill, I know, but it
5982 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5984 if (archive_file_offset
!= 0)
5985 str_tab_len
= archive_file_size
- offset
;
5988 if (fseek (file
, 0, SEEK_END
))
5989 error (_("Unable to seek to end of file\n"));
5990 str_tab_len
= ftell (file
) - offset
;
5993 if (str_tab_len
< 1)
5996 (_("Unable to determine the length of the dynamic string table\n"));
6000 dynamic_strings
= get_data (NULL
, file
, offset
, 1, str_tab_len
,
6001 _("dynamic string table"));
6002 dynamic_strings_length
= str_tab_len
;
6007 /* And find the syminfo section if available. */
6008 if (dynamic_syminfo
== NULL
)
6010 unsigned long syminsz
= 0;
6012 for (entry
= dynamic_section
;
6013 entry
< dynamic_section
+ dynamic_nent
;
6016 if (entry
->d_tag
== DT_SYMINENT
)
6018 /* Note: these braces are necessary to avoid a syntax
6019 error from the SunOS4 C compiler. */
6020 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
6022 else if (entry
->d_tag
== DT_SYMINSZ
)
6023 syminsz
= entry
->d_un
.d_val
;
6024 else if (entry
->d_tag
== DT_SYMINFO
)
6025 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
6029 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
6031 Elf_External_Syminfo
*extsyminfo
, *extsym
;
6032 Elf_Internal_Syminfo
*syminfo
;
6034 /* There is a syminfo section. Read the data. */
6035 extsyminfo
= get_data (NULL
, file
, dynamic_syminfo_offset
, 1,
6036 syminsz
, _("symbol information"));
6040 dynamic_syminfo
= malloc (syminsz
);
6041 if (dynamic_syminfo
== NULL
)
6043 error (_("Out of memory\n"));
6047 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
6048 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
6049 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
6050 ++syminfo
, ++extsym
)
6052 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
6053 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
6060 if (do_dynamic
&& dynamic_addr
)
6061 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
6062 dynamic_addr
, dynamic_nent
);
6064 printf (_(" Tag Type Name/Value\n"));
6066 for (entry
= dynamic_section
;
6067 entry
< dynamic_section
+ dynamic_nent
;
6075 print_vma (entry
->d_tag
, FULL_HEX
);
6076 dtype
= get_dynamic_type (entry
->d_tag
);
6077 printf (" (%s)%*s", dtype
,
6078 ((is_32bit_elf
? 27 : 19)
6079 - (int) strlen (dtype
)),
6083 switch (entry
->d_tag
)
6087 print_dynamic_flags (entry
->d_un
.d_val
);
6097 switch (entry
->d_tag
)
6100 printf (_("Auxiliary library"));
6104 printf (_("Filter library"));
6108 printf (_("Configuration file"));
6112 printf (_("Dependency audit library"));
6116 printf (_("Audit library"));
6120 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6121 printf (": [%s]\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
6125 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6134 printf (_("Flags:"));
6136 if (entry
->d_un
.d_val
== 0)
6137 printf (_(" None\n"));
6140 unsigned long int val
= entry
->d_un
.d_val
;
6142 if (val
& DTF_1_PARINIT
)
6144 printf (" PARINIT");
6145 val
^= DTF_1_PARINIT
;
6147 if (val
& DTF_1_CONFEXP
)
6149 printf (" CONFEXP");
6150 val
^= DTF_1_CONFEXP
;
6153 printf (" %lx", val
);
6162 printf (_("Flags:"));
6164 if (entry
->d_un
.d_val
== 0)
6165 printf (_(" None\n"));
6168 unsigned long int val
= entry
->d_un
.d_val
;
6170 if (val
& DF_P1_LAZYLOAD
)
6172 printf (" LAZYLOAD");
6173 val
^= DF_P1_LAZYLOAD
;
6175 if (val
& DF_P1_GROUPPERM
)
6177 printf (" GROUPPERM");
6178 val
^= DF_P1_GROUPPERM
;
6181 printf (" %lx", val
);
6190 printf (_("Flags:"));
6191 if (entry
->d_un
.d_val
== 0)
6192 printf (_(" None\n"));
6195 unsigned long int val
= entry
->d_un
.d_val
;
6202 if (val
& DF_1_GLOBAL
)
6207 if (val
& DF_1_GROUP
)
6212 if (val
& DF_1_NODELETE
)
6214 printf (" NODELETE");
6215 val
^= DF_1_NODELETE
;
6217 if (val
& DF_1_LOADFLTR
)
6219 printf (" LOADFLTR");
6220 val
^= DF_1_LOADFLTR
;
6222 if (val
& DF_1_INITFIRST
)
6224 printf (" INITFIRST");
6225 val
^= DF_1_INITFIRST
;
6227 if (val
& DF_1_NOOPEN
)
6232 if (val
& DF_1_ORIGIN
)
6237 if (val
& DF_1_DIRECT
)
6242 if (val
& DF_1_TRANS
)
6247 if (val
& DF_1_INTERPOSE
)
6249 printf (" INTERPOSE");
6250 val
^= DF_1_INTERPOSE
;
6252 if (val
& DF_1_NODEFLIB
)
6254 printf (" NODEFLIB");
6255 val
^= DF_1_NODEFLIB
;
6257 if (val
& DF_1_NODUMP
)
6262 if (val
& DF_1_CONLFAT
)
6264 printf (" CONLFAT");
6265 val
^= DF_1_CONLFAT
;
6268 printf (" %lx", val
);
6275 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6277 puts (get_dynamic_type (entry
->d_un
.d_val
));
6297 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6303 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6304 name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6310 switch (entry
->d_tag
)
6313 printf (_("Shared library: [%s]"), name
);
6315 if (streq (name
, program_interpreter
))
6316 printf (_(" program interpreter"));
6320 printf (_("Library soname: [%s]"), name
);
6324 printf (_("Library rpath: [%s]"), name
);
6328 printf (_("Library runpath: [%s]"), name
);
6332 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6337 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6350 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6354 case DT_INIT_ARRAYSZ
:
6355 case DT_FINI_ARRAYSZ
:
6356 case DT_GNU_CONFLICTSZ
:
6357 case DT_GNU_LIBLISTSZ
:
6360 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6361 printf (" (bytes)\n");
6371 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6384 if (entry
->d_tag
== DT_USED
6385 && VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6387 char *name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6391 printf (_("Not needed object: [%s]\n"), name
);
6396 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6402 /* The value of this entry is ignored. */
6407 case DT_GNU_PRELINKED
:
6411 time_t time
= entry
->d_un
.d_val
;
6413 tmp
= gmtime (&time
);
6414 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
6415 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
6416 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
6422 dynamic_info_DT_GNU_HASH
= entry
->d_un
.d_val
;
6425 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6431 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
6432 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
6437 switch (elf_header
.e_machine
)
6440 case EM_MIPS_RS3_LE
:
6441 dynamic_section_mips_val (entry
);
6444 dynamic_section_parisc_val (entry
);
6447 dynamic_section_ia64_val (entry
);
6450 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6462 get_ver_flags (unsigned int flags
)
6464 static char buff
[32];
6471 if (flags
& VER_FLG_BASE
)
6472 strcat (buff
, "BASE ");
6474 if (flags
& VER_FLG_WEAK
)
6476 if (flags
& VER_FLG_BASE
)
6477 strcat (buff
, "| ");
6479 strcat (buff
, "WEAK ");
6482 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
6483 strcat (buff
, "| <unknown>");
6488 /* Display the contents of the version sections. */
6490 process_version_sections (FILE *file
)
6492 Elf_Internal_Shdr
*section
;
6499 for (i
= 0, section
= section_headers
;
6500 i
< elf_header
.e_shnum
;
6503 switch (section
->sh_type
)
6505 case SHT_GNU_verdef
:
6507 Elf_External_Verdef
*edefs
;
6515 (_("\nVersion definition section '%s' contains %u entries:\n"),
6516 SECTION_NAME (section
), section
->sh_info
);
6518 printf (_(" Addr: 0x"));
6519 printf_vma (section
->sh_addr
);
6520 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
6521 (unsigned long) section
->sh_offset
, section
->sh_link
,
6522 section
->sh_link
< elf_header
.e_shnum
6523 ? SECTION_NAME (section_headers
+ section
->sh_link
)
6526 edefs
= get_data (NULL
, file
, section
->sh_offset
, 1,
6528 _("version definition section"));
6529 endbuf
= (char *) edefs
+ section
->sh_size
;
6533 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6536 Elf_External_Verdef
*edef
;
6537 Elf_Internal_Verdef ent
;
6538 Elf_External_Verdaux
*eaux
;
6539 Elf_Internal_Verdaux aux
;
6543 vstart
= ((char *) edefs
) + idx
;
6544 if (vstart
+ sizeof (*edef
) > endbuf
)
6547 edef
= (Elf_External_Verdef
*) vstart
;
6549 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
6550 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
6551 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
6552 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
6553 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
6554 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
6555 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
6557 printf (_(" %#06x: Rev: %d Flags: %s"),
6558 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
6560 printf (_(" Index: %d Cnt: %d "),
6561 ent
.vd_ndx
, ent
.vd_cnt
);
6563 vstart
+= ent
.vd_aux
;
6565 eaux
= (Elf_External_Verdaux
*) vstart
;
6567 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6568 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6570 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6571 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux
.vda_name
));
6573 printf (_("Name index: %ld\n"), aux
.vda_name
);
6575 isum
= idx
+ ent
.vd_aux
;
6577 for (j
= 1; j
< ent
.vd_cnt
; j
++)
6579 isum
+= aux
.vda_next
;
6580 vstart
+= aux
.vda_next
;
6582 eaux
= (Elf_External_Verdaux
*) vstart
;
6583 if (vstart
+ sizeof (*eaux
) > endbuf
)
6586 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6587 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6589 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6590 printf (_(" %#06x: Parent %d: %s\n"),
6591 isum
, j
, GET_DYNAMIC_NAME (aux
.vda_name
));
6593 printf (_(" %#06x: Parent %d, name index: %ld\n"),
6594 isum
, j
, aux
.vda_name
);
6597 printf (_(" Version def aux past end of section\n"));
6601 if (cnt
< section
->sh_info
)
6602 printf (_(" Version definition past end of section\n"));
6608 case SHT_GNU_verneed
:
6610 Elf_External_Verneed
*eneed
;
6617 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
6618 SECTION_NAME (section
), section
->sh_info
);
6620 printf (_(" Addr: 0x"));
6621 printf_vma (section
->sh_addr
);
6622 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
6623 (unsigned long) section
->sh_offset
, section
->sh_link
,
6624 section
->sh_link
< elf_header
.e_shnum
6625 ? SECTION_NAME (section_headers
+ section
->sh_link
)
6628 eneed
= get_data (NULL
, file
, section
->sh_offset
, 1,
6630 _("version need section"));
6631 endbuf
= (char *) eneed
+ section
->sh_size
;
6635 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6637 Elf_External_Verneed
*entry
;
6638 Elf_Internal_Verneed ent
;
6643 vstart
= ((char *) eneed
) + idx
;
6644 if (vstart
+ sizeof (*entry
) > endbuf
)
6647 entry
= (Elf_External_Verneed
*) vstart
;
6649 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
6650 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
6651 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
6652 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
6653 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
6655 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
6657 if (VALID_DYNAMIC_NAME (ent
.vn_file
))
6658 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent
.vn_file
));
6660 printf (_(" File: %lx"), ent
.vn_file
);
6662 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
6664 vstart
+= ent
.vn_aux
;
6666 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
6668 Elf_External_Vernaux
*eaux
;
6669 Elf_Internal_Vernaux aux
;
6671 if (vstart
+ sizeof (*eaux
) > endbuf
)
6673 eaux
= (Elf_External_Vernaux
*) vstart
;
6675 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
6676 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
6677 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
6678 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
6679 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
6681 if (VALID_DYNAMIC_NAME (aux
.vna_name
))
6682 printf (_(" %#06x: Name: %s"),
6683 isum
, GET_DYNAMIC_NAME (aux
.vna_name
));
6685 printf (_(" %#06x: Name index: %lx"),
6686 isum
, aux
.vna_name
);
6688 printf (_(" Flags: %s Version: %d\n"),
6689 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
6691 isum
+= aux
.vna_next
;
6692 vstart
+= aux
.vna_next
;
6695 printf (_(" Version need aux past end of section\n"));
6699 if (cnt
< section
->sh_info
)
6700 printf (_(" Version need past end of section\n"));
6706 case SHT_GNU_versym
:
6708 Elf_Internal_Shdr
*link_section
;
6711 unsigned char *edata
;
6712 unsigned short *data
;
6714 Elf_Internal_Sym
*symbols
;
6715 Elf_Internal_Shdr
*string_sec
;
6718 if (section
->sh_link
>= elf_header
.e_shnum
)
6721 link_section
= section_headers
+ section
->sh_link
;
6722 total
= section
->sh_size
/ sizeof (Elf_External_Versym
);
6724 if (link_section
->sh_link
>= elf_header
.e_shnum
)
6729 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
6731 string_sec
= section_headers
+ link_section
->sh_link
;
6733 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
6734 string_sec
->sh_size
, _("version string table"));
6738 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6739 SECTION_NAME (section
), total
);
6741 printf (_(" Addr: "));
6742 printf_vma (section
->sh_addr
);
6743 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
6744 (unsigned long) section
->sh_offset
, section
->sh_link
,
6745 SECTION_NAME (link_section
));
6747 off
= offset_from_vma (file
,
6748 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6749 total
* sizeof (short));
6750 edata
= get_data (NULL
, file
, off
, total
, sizeof (short),
6751 _("version symbol data"));
6758 data
= cmalloc (total
, sizeof (short));
6760 for (cnt
= total
; cnt
--;)
6761 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
6766 for (cnt
= 0; cnt
< total
; cnt
+= 4)
6769 int check_def
, check_need
;
6772 printf (" %03x:", cnt
);
6774 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
6775 switch (data
[cnt
+ j
])
6778 fputs (_(" 0 (*local*) "), stdout
);
6782 fputs (_(" 1 (*global*) "), stdout
);
6786 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
6787 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
6791 if (symbols
[cnt
+ j
].st_shndx
>= elf_header
.e_shnum
6792 || section_headers
[symbols
[cnt
+ j
].st_shndx
].sh_type
6795 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
6802 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
6804 Elf_Internal_Verneed ivn
;
6805 unsigned long offset
;
6807 offset
= offset_from_vma
6808 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6809 sizeof (Elf_External_Verneed
));
6813 Elf_Internal_Vernaux ivna
;
6814 Elf_External_Verneed evn
;
6815 Elf_External_Vernaux evna
;
6816 unsigned long a_off
;
6818 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
6821 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6822 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6824 a_off
= offset
+ ivn
.vn_aux
;
6828 get_data (&evna
, file
, a_off
, sizeof (evna
),
6829 1, _("version need aux (2)"));
6831 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6832 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6834 a_off
+= ivna
.vna_next
;
6836 while (ivna
.vna_other
!= data
[cnt
+ j
]
6837 && ivna
.vna_next
!= 0);
6839 if (ivna
.vna_other
== data
[cnt
+ j
])
6841 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6843 if (ivna
.vna_name
>= string_sec
->sh_size
)
6844 name
= _("*invalid*");
6846 name
= strtab
+ ivna
.vna_name
;
6847 nn
+= printf ("(%s%-*s",
6849 12 - (int) strlen (name
),
6855 offset
+= ivn
.vn_next
;
6857 while (ivn
.vn_next
);
6860 if (check_def
&& data
[cnt
+ j
] != 0x8001
6861 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6863 Elf_Internal_Verdef ivd
;
6864 Elf_External_Verdef evd
;
6865 unsigned long offset
;
6867 offset
= offset_from_vma
6868 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6873 get_data (&evd
, file
, offset
, sizeof (evd
), 1,
6876 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6877 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6879 offset
+= ivd
.vd_next
;
6881 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
6882 && ivd
.vd_next
!= 0);
6884 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
6886 Elf_External_Verdaux evda
;
6887 Elf_Internal_Verdaux ivda
;
6889 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6891 get_data (&evda
, file
,
6892 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
6894 _("version def aux"));
6896 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6898 if (ivda
.vda_name
>= string_sec
->sh_size
)
6899 name
= _("*invalid*");
6901 name
= strtab
+ ivda
.vda_name
;
6902 nn
+= printf ("(%s%-*s",
6904 12 - (int) strlen (name
),
6910 printf ("%*c", 18 - nn
, ' ');
6928 printf (_("\nNo version information found in this file.\n"));
6934 get_symbol_binding (unsigned int binding
)
6936 static char buff
[32];
6940 case STB_LOCAL
: return "LOCAL";
6941 case STB_GLOBAL
: return "GLOBAL";
6942 case STB_WEAK
: return "WEAK";
6944 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
6945 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"),
6947 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
6948 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), binding
);
6950 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), binding
);
6956 get_symbol_type (unsigned int type
)
6958 static char buff
[32];
6962 case STT_NOTYPE
: return "NOTYPE";
6963 case STT_OBJECT
: return "OBJECT";
6964 case STT_FUNC
: return "FUNC";
6965 case STT_SECTION
: return "SECTION";
6966 case STT_FILE
: return "FILE";
6967 case STT_COMMON
: return "COMMON";
6968 case STT_TLS
: return "TLS";
6969 case STT_RELC
: return "RELC";
6970 case STT_SRELC
: return "SRELC";
6972 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
6974 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
6975 return "THUMB_FUNC";
6977 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
6980 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
6981 return "PARISC_MILLI";
6983 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"), type
);
6985 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
6987 if (elf_header
.e_machine
== EM_PARISC
)
6989 if (type
== STT_HP_OPAQUE
)
6991 if (type
== STT_HP_STUB
)
6995 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), type
);
6998 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), type
);
7004 get_symbol_visibility (unsigned int visibility
)
7008 case STV_DEFAULT
: return "DEFAULT";
7009 case STV_INTERNAL
: return "INTERNAL";
7010 case STV_HIDDEN
: return "HIDDEN";
7011 case STV_PROTECTED
: return "PROTECTED";
7017 get_mips_symbol_other (unsigned int other
)
7021 case STO_OPTIONAL
: return "OPTIONAL";
7022 case STO_MIPS16
: return "MIPS16";
7023 default: return NULL
;
7028 get_symbol_other (unsigned int other
)
7030 const char * result
= NULL
;
7031 static char buff
[32];
7036 switch (elf_header
.e_machine
)
7039 result
= get_mips_symbol_other (other
);
7047 snprintf (buff
, sizeof buff
, _("<other>: %x"), other
);
7052 get_symbol_index_type (unsigned int type
)
7054 static char buff
[32];
7058 case SHN_UNDEF
: return "UND";
7059 case SHN_ABS
: return "ABS";
7060 case SHN_COMMON
: return "COM";
7062 if (type
== SHN_IA_64_ANSI_COMMON
7063 && elf_header
.e_machine
== EM_IA_64
7064 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
7066 else if (elf_header
.e_machine
== EM_X86_64
7067 && type
== SHN_X86_64_LCOMMON
)
7069 else if (type
== SHN_MIPS_SCOMMON
7070 && elf_header
.e_machine
== EM_MIPS
)
7072 else if (type
== SHN_MIPS_SUNDEFINED
7073 && elf_header
.e_machine
== EM_MIPS
)
7075 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
7076 sprintf (buff
, "PRC[0x%04x]", type
& 0xffff);
7077 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
7078 sprintf (buff
, "OS [0x%04x]", type
& 0xffff);
7079 else if (type
>= SHN_LORESERVE
)
7080 sprintf (buff
, "RSV[0x%04x]", type
& 0xffff);
7082 sprintf (buff
, "%3d", type
);
7090 get_dynamic_data (FILE *file
, unsigned int number
, unsigned int ent_size
)
7092 unsigned char *e_data
;
7095 e_data
= cmalloc (number
, ent_size
);
7099 error (_("Out of memory\n"));
7103 if (fread (e_data
, ent_size
, number
, file
) != number
)
7105 error (_("Unable to read in dynamic data\n"));
7109 i_data
= cmalloc (number
, sizeof (*i_data
));
7113 error (_("Out of memory\n"));
7119 i_data
[number
] = byte_get (e_data
+ number
* ent_size
, ent_size
);
7127 print_dynamic_symbol (bfd_vma si
, unsigned long hn
)
7129 Elf_Internal_Sym
*psym
;
7132 psym
= dynamic_symbols
+ si
;
7134 n
= print_vma (si
, DEC_5
);
7136 fputs (" " + n
, stdout
);
7137 printf (" %3lu: ", hn
);
7138 print_vma (psym
->st_value
, LONG_HEX
);
7140 print_vma (psym
->st_size
, DEC_5
);
7142 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
7143 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
7144 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
7145 /* Check to see if any other bits in the st_other field are set.
7146 Note - displaying this information disrupts the layout of the
7147 table being generated, but for the moment this case is very
7149 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
7150 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
7151 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
7152 if (VALID_DYNAMIC_NAME (psym
->st_name
))
7153 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
7155 printf (" <corrupt: %14ld>", psym
->st_name
);
7159 /* Dump the symbol table. */
7161 process_symbol_table (FILE *file
)
7163 Elf_Internal_Shdr
*section
;
7164 bfd_vma nbuckets
= 0;
7165 bfd_vma nchains
= 0;
7166 bfd_vma
*buckets
= NULL
;
7167 bfd_vma
*chains
= NULL
;
7168 bfd_vma ngnubuckets
= 0;
7169 bfd_vma
*gnubuckets
= NULL
;
7170 bfd_vma
*gnuchains
= NULL
;
7171 bfd_vma gnusymidx
= 0;
7173 if (! do_syms
&& !do_histogram
)
7176 if (dynamic_info
[DT_HASH
]
7178 || (do_using_dynamic
&& dynamic_strings
!= NULL
)))
7180 unsigned char nb
[8];
7181 unsigned char nc
[8];
7182 int hash_ent_size
= 4;
7184 if ((elf_header
.e_machine
== EM_ALPHA
7185 || elf_header
.e_machine
== EM_S390
7186 || elf_header
.e_machine
== EM_S390_OLD
)
7187 && elf_header
.e_ident
[EI_CLASS
] == ELFCLASS64
)
7191 (archive_file_offset
7192 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
7193 sizeof nb
+ sizeof nc
)),
7196 error (_("Unable to seek to start of dynamic information\n"));
7200 if (fread (nb
, hash_ent_size
, 1, file
) != 1)
7202 error (_("Failed to read in number of buckets\n"));
7206 if (fread (nc
, hash_ent_size
, 1, file
) != 1)
7208 error (_("Failed to read in number of chains\n"));
7212 nbuckets
= byte_get (nb
, hash_ent_size
);
7213 nchains
= byte_get (nc
, hash_ent_size
);
7215 buckets
= get_dynamic_data (file
, nbuckets
, hash_ent_size
);
7216 chains
= get_dynamic_data (file
, nchains
, hash_ent_size
);
7218 if (buckets
== NULL
|| chains
== NULL
)
7222 if (dynamic_info_DT_GNU_HASH
7224 || (do_using_dynamic
&& dynamic_strings
!= NULL
)))
7226 unsigned char nb
[16];
7227 bfd_vma i
, maxchain
= 0xffffffff, bitmaskwords
;
7228 bfd_vma buckets_vma
;
7231 (archive_file_offset
7232 + offset_from_vma (file
, dynamic_info_DT_GNU_HASH
,
7236 error (_("Unable to seek to start of dynamic information\n"));
7240 if (fread (nb
, 16, 1, file
) != 1)
7242 error (_("Failed to read in number of buckets\n"));
7246 ngnubuckets
= byte_get (nb
, 4);
7247 gnusymidx
= byte_get (nb
+ 4, 4);
7248 bitmaskwords
= byte_get (nb
+ 8, 4);
7249 buckets_vma
= dynamic_info_DT_GNU_HASH
+ 16;
7251 buckets_vma
+= bitmaskwords
* 4;
7253 buckets_vma
+= bitmaskwords
* 8;
7256 (archive_file_offset
7257 + offset_from_vma (file
, buckets_vma
, 4)),
7260 error (_("Unable to seek to start of dynamic information\n"));
7264 gnubuckets
= get_dynamic_data (file
, ngnubuckets
, 4);
7266 if (gnubuckets
== NULL
)
7269 for (i
= 0; i
< ngnubuckets
; i
++)
7270 if (gnubuckets
[i
] != 0)
7272 if (gnubuckets
[i
] < gnusymidx
)
7275 if (maxchain
== 0xffffffff || gnubuckets
[i
] > maxchain
)
7276 maxchain
= gnubuckets
[i
];
7279 if (maxchain
== 0xffffffff)
7282 maxchain
-= gnusymidx
;
7285 (archive_file_offset
7286 + offset_from_vma (file
, buckets_vma
7287 + 4 * (ngnubuckets
+ maxchain
), 4)),
7290 error (_("Unable to seek to start of dynamic information\n"));
7296 if (fread (nb
, 4, 1, file
) != 1)
7298 error (_("Failed to determine last chain length\n"));
7302 if (maxchain
+ 1 == 0)
7307 while ((byte_get (nb
, 4) & 1) == 0);
7310 (archive_file_offset
7311 + offset_from_vma (file
, buckets_vma
+ 4 * ngnubuckets
, 4)),
7314 error (_("Unable to seek to start of dynamic information\n"));
7318 gnuchains
= get_dynamic_data (file
, maxchain
, 4);
7320 if (gnuchains
== NULL
)
7324 if ((dynamic_info
[DT_HASH
] || dynamic_info_DT_GNU_HASH
)
7327 && dynamic_strings
!= NULL
)
7331 if (dynamic_info
[DT_HASH
])
7335 printf (_("\nSymbol table for image:\n"));
7337 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7339 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7341 for (hn
= 0; hn
< nbuckets
; hn
++)
7346 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
7347 print_dynamic_symbol (si
, hn
);
7351 if (dynamic_info_DT_GNU_HASH
)
7353 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
7355 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7357 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7359 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7360 if (gnubuckets
[hn
] != 0)
7362 bfd_vma si
= gnubuckets
[hn
];
7363 bfd_vma off
= si
- gnusymidx
;
7367 print_dynamic_symbol (si
, hn
);
7370 while ((gnuchains
[off
++] & 1) == 0);
7374 else if (do_syms
&& !do_using_dynamic
)
7378 for (i
= 0, section
= section_headers
;
7379 i
< elf_header
.e_shnum
;
7383 char *strtab
= NULL
;
7384 unsigned long int strtab_size
= 0;
7385 Elf_Internal_Sym
*symtab
;
7386 Elf_Internal_Sym
*psym
;
7389 if ( section
->sh_type
!= SHT_SYMTAB
7390 && section
->sh_type
!= SHT_DYNSYM
)
7393 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
7394 SECTION_NAME (section
),
7395 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
7397 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7399 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7401 symtab
= GET_ELF_SYMBOLS (file
, section
);
7405 if (section
->sh_link
== elf_header
.e_shstrndx
)
7407 strtab
= string_table
;
7408 strtab_size
= string_table_length
;
7410 else if (section
->sh_link
< elf_header
.e_shnum
)
7412 Elf_Internal_Shdr
*string_sec
;
7414 string_sec
= section_headers
+ section
->sh_link
;
7416 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
7417 1, string_sec
->sh_size
, _("string table"));
7418 strtab_size
= strtab
!= NULL
? string_sec
->sh_size
: 0;
7421 for (si
= 0, psym
= symtab
;
7422 si
< section
->sh_size
/ section
->sh_entsize
;
7425 printf ("%6d: ", si
);
7426 print_vma (psym
->st_value
, LONG_HEX
);
7428 print_vma (psym
->st_size
, DEC_5
);
7429 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
7430 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
7431 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
7432 /* Check to see if any other bits in the st_other field are set.
7433 Note - displaying this information disrupts the layout of the
7434 table being generated, but for the moment this case is very rare. */
7435 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
7436 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
7437 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
7438 print_symbol (25, psym
->st_name
< strtab_size
7439 ? strtab
+ psym
->st_name
: "<corrupt>");
7441 if (section
->sh_type
== SHT_DYNSYM
&&
7442 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
7444 unsigned char data
[2];
7445 unsigned short vers_data
;
7446 unsigned long offset
;
7450 offset
= offset_from_vma
7451 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
7452 sizeof data
+ si
* sizeof (vers_data
));
7454 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
7455 sizeof (data
), 1, _("version data"));
7457 vers_data
= byte_get (data
, 2);
7459 is_nobits
= (psym
->st_shndx
< elf_header
.e_shnum
7460 && section_headers
[psym
->st_shndx
].sh_type
7463 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
7465 if ((vers_data
& 0x8000) || vers_data
> 1)
7467 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
7468 && (is_nobits
|| ! check_def
))
7470 Elf_External_Verneed evn
;
7471 Elf_Internal_Verneed ivn
;
7472 Elf_Internal_Vernaux ivna
;
7474 /* We must test both. */
7475 offset
= offset_from_vma
7476 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
7481 unsigned long vna_off
;
7483 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
7486 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
7487 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
7489 vna_off
= offset
+ ivn
.vn_aux
;
7493 Elf_External_Vernaux evna
;
7495 get_data (&evna
, file
, vna_off
,
7497 _("version need aux (3)"));
7499 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
7500 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
7501 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
7503 vna_off
+= ivna
.vna_next
;
7505 while (ivna
.vna_other
!= vers_data
7506 && ivna
.vna_next
!= 0);
7508 if (ivna
.vna_other
== vers_data
)
7511 offset
+= ivn
.vn_next
;
7513 while (ivn
.vn_next
!= 0);
7515 if (ivna
.vna_other
== vers_data
)
7518 ivna
.vna_name
< strtab_size
7519 ? strtab
+ ivna
.vna_name
: "<corrupt>",
7523 else if (! is_nobits
)
7524 error (_("bad dynamic symbol\n"));
7531 if (vers_data
!= 0x8001
7532 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
7534 Elf_Internal_Verdef ivd
;
7535 Elf_Internal_Verdaux ivda
;
7536 Elf_External_Verdaux evda
;
7537 unsigned long offset
;
7539 offset
= offset_from_vma
7541 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
7542 sizeof (Elf_External_Verdef
));
7546 Elf_External_Verdef evd
;
7548 get_data (&evd
, file
, offset
, sizeof (evd
),
7549 1, _("version def"));
7551 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
7552 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
7553 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
7555 offset
+= ivd
.vd_next
;
7557 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
7558 && ivd
.vd_next
!= 0);
7560 offset
-= ivd
.vd_next
;
7561 offset
+= ivd
.vd_aux
;
7563 get_data (&evda
, file
, offset
, sizeof (evda
),
7564 1, _("version def aux"));
7566 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
7568 if (psym
->st_name
!= ivda
.vda_name
)
7569 printf ((vers_data
& 0x8000)
7571 ivda
.vda_name
< strtab_size
7572 ? strtab
+ ivda
.vda_name
: "<corrupt>");
7582 if (strtab
!= string_table
)
7588 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
7590 if (do_histogram
&& buckets
!= NULL
)
7592 unsigned long *lengths
;
7593 unsigned long *counts
;
7596 unsigned long maxlength
= 0;
7597 unsigned long nzero_counts
= 0;
7598 unsigned long nsyms
= 0;
7600 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
7601 (unsigned long) nbuckets
);
7602 printf (_(" Length Number %% of total Coverage\n"));
7604 lengths
= calloc (nbuckets
, sizeof (*lengths
));
7605 if (lengths
== NULL
)
7607 error (_("Out of memory\n"));
7610 for (hn
= 0; hn
< nbuckets
; ++hn
)
7612 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
7615 if (maxlength
< ++lengths
[hn
])
7620 counts
= calloc (maxlength
+ 1, sizeof (*counts
));
7623 error (_("Out of memory\n"));
7627 for (hn
= 0; hn
< nbuckets
; ++hn
)
7628 ++counts
[lengths
[hn
]];
7633 printf (" 0 %-10lu (%5.1f%%)\n",
7634 counts
[0], (counts
[0] * 100.0) / nbuckets
);
7635 for (i
= 1; i
<= maxlength
; ++i
)
7637 nzero_counts
+= counts
[i
] * i
;
7638 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7639 i
, counts
[i
], (counts
[i
] * 100.0) / nbuckets
,
7640 (nzero_counts
* 100.0) / nsyms
);
7648 if (buckets
!= NULL
)
7654 if (do_histogram
&& dynamic_info_DT_GNU_HASH
)
7656 unsigned long *lengths
;
7657 unsigned long *counts
;
7659 unsigned long maxlength
= 0;
7660 unsigned long nzero_counts
= 0;
7661 unsigned long nsyms
= 0;
7663 lengths
= calloc (ngnubuckets
, sizeof (*lengths
));
7664 if (lengths
== NULL
)
7666 error (_("Out of memory\n"));
7670 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
7671 (unsigned long) ngnubuckets
);
7672 printf (_(" Length Number %% of total Coverage\n"));
7674 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7675 if (gnubuckets
[hn
] != 0)
7677 bfd_vma off
, length
= 1;
7679 for (off
= gnubuckets
[hn
] - gnusymidx
;
7680 (gnuchains
[off
] & 1) == 0; ++off
)
7682 lengths
[hn
] = length
;
7683 if (length
> maxlength
)
7688 counts
= calloc (maxlength
+ 1, sizeof (*counts
));
7691 error (_("Out of memory\n"));
7695 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7696 ++counts
[lengths
[hn
]];
7698 if (ngnubuckets
> 0)
7701 printf (" 0 %-10lu (%5.1f%%)\n",
7702 counts
[0], (counts
[0] * 100.0) / ngnubuckets
);
7703 for (j
= 1; j
<= maxlength
; ++j
)
7705 nzero_counts
+= counts
[j
] * j
;
7706 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7707 j
, counts
[j
], (counts
[j
] * 100.0) / ngnubuckets
,
7708 (nzero_counts
* 100.0) / nsyms
);
7722 process_syminfo (FILE *file ATTRIBUTE_UNUSED
)
7726 if (dynamic_syminfo
== NULL
7728 /* No syminfo, this is ok. */
7731 /* There better should be a dynamic symbol section. */
7732 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
7736 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
7737 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
7739 printf (_(" Num: Name BoundTo Flags\n"));
7740 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
7742 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
7744 printf ("%4d: ", i
);
7745 if (VALID_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
))
7746 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
));
7748 printf ("<corrupt: %19ld>", dynamic_symbols
[i
].st_name
);
7751 switch (dynamic_syminfo
[i
].si_boundto
)
7753 case SYMINFO_BT_SELF
:
7754 fputs ("SELF ", stdout
);
7756 case SYMINFO_BT_PARENT
:
7757 fputs ("PARENT ", stdout
);
7760 if (dynamic_syminfo
[i
].si_boundto
> 0
7761 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
7762 && VALID_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
7764 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
7768 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
7772 if (flags
& SYMINFO_FLG_DIRECT
)
7774 if (flags
& SYMINFO_FLG_PASSTHRU
)
7775 printf (" PASSTHRU");
7776 if (flags
& SYMINFO_FLG_COPY
)
7778 if (flags
& SYMINFO_FLG_LAZYLOAD
)
7779 printf (" LAZYLOAD");
7787 #ifdef SUPPORT_DISASSEMBLY
7789 disassemble_section (Elf_Internal_Shdr
*section
, FILE *file
)
7791 printf (_("\nAssembly dump of section %s\n"),
7792 SECTION_NAME (section
));
7794 /* XXX -- to be done --- XXX */
7801 dump_section_as_strings (Elf_Internal_Shdr
*section
, FILE *file
)
7803 Elf_Internal_Shdr
*relsec
;
7804 bfd_size_type num_bytes
;
7809 char *name
= SECTION_NAME (section
);
7810 bfd_boolean some_strings_shown
;
7812 num_bytes
= section
->sh_size
;
7814 if (num_bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
7816 printf (_("\nSection '%s' has no data to dump.\n"), name
);
7820 addr
= section
->sh_addr
;
7822 start
= get_data (NULL
, file
, section
->sh_offset
, 1, num_bytes
,
7827 printf (_("\nString dump of section '%s':\n"), name
);
7829 /* If the section being dumped has relocations against it the user might
7830 be expecting these relocations to have been applied. Check for this
7831 case and issue a warning message in order to avoid confusion.
7832 FIXME: Maybe we ought to have an option that dumps a section with
7834 for (relsec
= section_headers
;
7835 relsec
< section_headers
+ elf_header
.e_shnum
;
7838 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
7839 || relsec
->sh_info
>= elf_header
.e_shnum
7840 || section_headers
+ relsec
->sh_info
!= section
7841 || relsec
->sh_size
== 0
7842 || relsec
->sh_link
>= elf_header
.e_shnum
)
7845 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
7850 end
= start
+ num_bytes
;
7851 some_strings_shown
= FALSE
;
7855 while (!ISPRINT (* data
))
7862 printf (" [%6tx] %s\n", data
- start
, data
);
7864 printf (" [%6Ix] %s\n", (size_t) (data
- start
), data
);
7866 data
+= strlen (data
);
7867 some_strings_shown
= TRUE
;
7871 if (! some_strings_shown
)
7872 printf (_(" No strings found in this section."));
7882 dump_section_as_bytes (Elf_Internal_Shdr
*section
, FILE *file
)
7884 Elf_Internal_Shdr
*relsec
;
7885 bfd_size_type bytes
;
7887 unsigned char *data
;
7888 unsigned char *start
;
7890 bytes
= section
->sh_size
;
7892 if (bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
7894 printf (_("\nSection '%s' has no data to dump.\n"),
7895 SECTION_NAME (section
));
7899 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
7901 addr
= section
->sh_addr
;
7903 start
= get_data (NULL
, file
, section
->sh_offset
, 1, bytes
,
7908 /* If the section being dumped has relocations against it the user might
7909 be expecting these relocations to have been applied. Check for this
7910 case and issue a warning message in order to avoid confusion.
7911 FIXME: Maybe we ought to have an option that dumps a section with
7913 for (relsec
= section_headers
;
7914 relsec
< section_headers
+ elf_header
.e_shnum
;
7917 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
7918 || relsec
->sh_info
>= elf_header
.e_shnum
7919 || section_headers
+ relsec
->sh_info
!= section
7920 || relsec
->sh_size
== 0
7921 || relsec
->sh_link
>= elf_header
.e_shnum
)
7924 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
7936 lbytes
= (bytes
> 16 ? 16 : bytes
);
7938 printf (" 0x%8.8lx ", (unsigned long) addr
);
7940 for (j
= 0; j
< 16; j
++)
7943 printf ("%2.2x", data
[j
]);
7951 for (j
= 0; j
< lbytes
; j
++)
7954 if (k
>= ' ' && k
< 0x7f)
7973 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
7974 DWARF debug sections. This is a target specific test. Note - we do not
7975 go through the whole including-target-headers-multiple-times route, (as
7976 we have already done with <elf/h8.h>) because this would become very
7977 messy and even then this function would have to contain target specific
7978 information (the names of the relocs instead of their numeric values).
7979 FIXME: This is not the correct way to solve this problem. The proper way
7980 is to have target specific reloc sizing and typing functions created by
7981 the reloc-macros.h header, in the same way that it already creates the
7982 reloc naming functions. */
7985 is_32bit_abs_reloc (unsigned int reloc_type
)
7987 switch (elf_header
.e_machine
)
7991 return reloc_type
== 1; /* R_386_32. */
7993 return reloc_type
== 1; /* R_68K_32. */
7995 return reloc_type
== 1; /* R_860_32. */
7997 return reloc_type
== 1; /* XXX Is this right ? */
7999 return reloc_type
== 1; /* R_ARC_32. */
8001 return reloc_type
== 2; /* R_ARM_ABS32 */
8004 return reloc_type
== 1;
8006 return reloc_type
== 0x12; /* R_byte4_data. */
8008 return reloc_type
== 3; /* R_CRIS_32. */
8011 return reloc_type
== 3; /* R_CR16_NUM32. */
8013 return reloc_type
== 15; /* R_CRX_NUM32. */
8015 return reloc_type
== 1;
8016 case EM_CYGNUS_D10V
:
8018 return reloc_type
== 6; /* R_D10V_32. */
8019 case EM_CYGNUS_D30V
:
8021 return reloc_type
== 12; /* R_D30V_32_NORMAL. */
8023 return reloc_type
== 3; /* R_DLX_RELOC_32. */
8024 case EM_CYGNUS_FR30
:
8026 return reloc_type
== 3; /* R_FR30_32. */
8030 return reloc_type
== 1; /* R_H8_DIR32. */
8032 return reloc_type
== 0x65; /* R_IA64_SECREL32LSB. */
8035 return reloc_type
== 2; /* R_IP2K_32. */
8037 return reloc_type
== 2; /* R_IQ2000_32. */
8040 return reloc_type
== 3; /* R_M32C_32. */
8042 return reloc_type
== 34; /* R_M32R_32_RELA. */
8044 return reloc_type
== 1; /* R_MCORE_ADDR32. */
8046 return reloc_type
== 4; /* R_MEP_32. */
8048 return reloc_type
== 2; /* R_MIPS_32. */
8050 return reloc_type
== 4; /* R_MMIX_32. */
8051 case EM_CYGNUS_MN10200
:
8053 return reloc_type
== 1; /* R_MN10200_32. */
8054 case EM_CYGNUS_MN10300
:
8056 return reloc_type
== 1; /* R_MN10300_32. */
8059 return reloc_type
== 1; /* R_MSP43_32. */
8061 return reloc_type
== 2; /* R_MT_32. */
8062 case EM_ALTERA_NIOS2
:
8064 return reloc_type
== 1; /* R_NIOS_32. */
8067 return reloc_type
== 1; /* R_OR32_32. */
8069 return reloc_type
== 1; /* R_PARISC_DIR32. */
8072 return reloc_type
== 1; /* R_PJ_DATA_DIR32. */
8074 return reloc_type
== 1; /* R_PPC64_ADDR32. */
8076 return reloc_type
== 1; /* R_PPC_ADDR32. */
8078 return reloc_type
== 1; /* R_I370_ADDR31. */
8081 return reloc_type
== 4; /* R_S390_32. */
8083 return reloc_type
== 8; /* R_SCORE_ABS32. */
8085 return reloc_type
== 1; /* R_SH_DIR32. */
8086 case EM_SPARC32PLUS
:
8089 return reloc_type
== 3 /* R_SPARC_32. */
8090 || reloc_type
== 23; /* R_SPARC_UA32. */
8092 return reloc_type
== 6; /* R_SPU_ADDR32 */
8093 case EM_CYGNUS_V850
:
8095 return reloc_type
== 6; /* R_V850_ABS32. */
8097 return reloc_type
== 1; /* R_VAX_32. */
8099 return reloc_type
== 10; /* R_X86_64_32. */
8101 return reloc_type
== 1; /* R_XSTROMY16_32. */
8104 return reloc_type
== 1; /* R_XTENSA_32. */
8107 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
8108 elf_header
.e_machine
);
8113 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8114 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
8117 is_32bit_pcrel_reloc (unsigned int reloc_type
)
8119 switch (elf_header
.e_machine
)
8123 return reloc_type
== 2; /* R_386_PC32. */
8125 return reloc_type
== 4; /* R_68K_PC32. */
8127 return reloc_type
== 10; /* R_ALPHA_SREL32. */
8129 return reloc_type
== 3; /* R_ARM_REL32 */
8131 return reloc_type
== 0; /* R_PARISC_NONE. *//* FIXME: This reloc is generated, but it may be a bug. */
8133 return reloc_type
== 26; /* R_PPC_REL32. */
8135 return reloc_type
== 26; /* R_PPC64_REL32. */
8138 return reloc_type
== 5; /* R_390_PC32. */
8140 return reloc_type
== 2; /* R_SH_REL32. */
8141 case EM_SPARC32PLUS
:
8144 return reloc_type
== 6; /* R_SPARC_DISP32. */
8146 return reloc_type
== 13; /* R_SPU_REL32. */
8148 return reloc_type
== 2; /* R_X86_64_PC32. */
8151 return reloc_type
== 14; /* R_XTENSA_32_PCREL. */
8153 /* Do not abort or issue an error message here. Not all targets use
8154 pc-relative 32-bit relocs in their DWARF debug information and we
8155 have already tested for target coverage in is_32bit_abs_reloc. A
8156 more helpful warning message will be generated by
8157 debug_apply_relocations anyway, so just return. */
8162 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8163 a 64-bit absolute RELA relocation used in DWARF debug sections. */
8166 is_64bit_abs_reloc (unsigned int reloc_type
)
8168 switch (elf_header
.e_machine
)
8171 return reloc_type
== 2; /* R_ALPHA_REFQUAD. */
8173 return reloc_type
== 0x27; /* R_IA64_DIR64LSB. */
8175 return reloc_type
== 80; /* R_PARISC_DIR64. */
8177 return reloc_type
== 38; /* R_PPC64_ADDR64. */
8178 case EM_SPARC32PLUS
:
8181 return reloc_type
== 54; /* R_SPARC_UA64. */
8183 return reloc_type
== 1; /* R_X86_64_64. */
8186 return reloc_type
== 22; /* R_S390_64 */
8192 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8193 a 16-bit absolute RELA relocation used in DWARF debug sections. */
8196 is_16bit_abs_reloc (unsigned int reloc_type
)
8198 switch (elf_header
.e_machine
)
8202 return reloc_type
== 4; /* R_AVR_16. */
8203 case EM_CYGNUS_D10V
:
8205 return reloc_type
== 3; /* R_D10V_16. */
8209 return reloc_type
== R_H8_DIR16
;
8212 return reloc_type
== 1; /* R_IP2K_16. */
8215 return reloc_type
== 1; /* R_M32C_16 */
8218 return reloc_type
== 5; /* R_MSP430_16_BYTE. */
8219 case EM_ALTERA_NIOS2
:
8221 return reloc_type
== 9; /* R_NIOS_16. */
8227 /* Uncompresses a section that was compressed using zlib, in place.
8228 * This is a copy of bfd_uncompress_section_contents, in bfd/compress.c */
8231 uncompress_section_contents (unsigned char **buffer
, dwarf_size_type
*size
)
8234 /* These are just to quiet gcc. */
8239 dwarf_size_type compressed_size
= *size
;
8240 unsigned char* compressed_buffer
= *buffer
;
8241 dwarf_size_type uncompressed_size
;
8242 unsigned char* uncompressed_buffer
;
8245 dwarf_size_type header_size
= 12;
8247 /* Read the zlib header. In this case, it should be "ZLIB" followed
8248 by the uncompressed section size, 8 bytes in big-endian order. */
8249 if (compressed_size
< header_size
8250 || ! streq ((char*) compressed_buffer
, "ZLIB"))
8252 uncompressed_size
= compressed_buffer
[4]; uncompressed_size
<<= 8;
8253 uncompressed_size
+= compressed_buffer
[5]; uncompressed_size
<<= 8;
8254 uncompressed_size
+= compressed_buffer
[6]; uncompressed_size
<<= 8;
8255 uncompressed_size
+= compressed_buffer
[7]; uncompressed_size
<<= 8;
8256 uncompressed_size
+= compressed_buffer
[8]; uncompressed_size
<<= 8;
8257 uncompressed_size
+= compressed_buffer
[9]; uncompressed_size
<<= 8;
8258 uncompressed_size
+= compressed_buffer
[10]; uncompressed_size
<<= 8;
8259 uncompressed_size
+= compressed_buffer
[11];
8261 /* It is possible the section consists of several compressed
8262 buffers concatenated together, so we uncompress in a loop. */
8266 strm
.avail_in
= compressed_size
- header_size
;
8267 strm
.next_in
= (Bytef
*) compressed_buffer
+ header_size
;
8268 strm
.avail_out
= uncompressed_size
;
8269 uncompressed_buffer
= xmalloc (uncompressed_size
);
8271 rc
= inflateInit (&strm
);
8272 while (strm
.avail_in
> 0)
8276 strm
.next_out
= ((Bytef
*) uncompressed_buffer
8277 + (uncompressed_size
- strm
.avail_out
));
8278 rc
= inflate (&strm
, Z_FINISH
);
8279 if (rc
!= Z_STREAM_END
)
8281 rc
= inflateReset (&strm
);
8283 rc
= inflateEnd (&strm
);
8285 || strm
.avail_out
!= 0)
8288 free (compressed_buffer
);
8289 *buffer
= uncompressed_buffer
;
8290 *size
= uncompressed_size
;
8294 free (uncompressed_buffer
);
8296 #endif /* HAVE_ZLIB_H */
8299 /* Apply relocations to a debug section. */
8302 debug_apply_relocations (void *file
,
8303 Elf_Internal_Shdr
*section
,
8304 unsigned char *start
)
8306 Elf_Internal_Shdr
*relsec
;
8307 unsigned char *end
= start
+ section
->sh_size
;
8309 if (elf_header
.e_type
!= ET_REL
)
8312 /* Find the reloc section associated with the debug section. */
8313 for (relsec
= section_headers
;
8314 relsec
< section_headers
+ elf_header
.e_shnum
;
8317 bfd_boolean is_rela
;
8318 unsigned long num_relocs
;
8319 Elf_Internal_Rela
*relocs
, *rp
;
8320 Elf_Internal_Shdr
*symsec
;
8321 Elf_Internal_Sym
*symtab
;
8322 Elf_Internal_Sym
*sym
;
8324 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
8325 || relsec
->sh_info
>= elf_header
.e_shnum
8326 || section_headers
+ relsec
->sh_info
!= section
8327 || relsec
->sh_size
== 0
8328 || relsec
->sh_link
>= elf_header
.e_shnum
)
8331 is_rela
= relsec
->sh_type
== SHT_RELA
;
8335 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
8336 & relocs
, & num_relocs
))
8341 if (!slurp_rel_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
8342 & relocs
, & num_relocs
))
8346 /* SH uses RELA but uses in place value instead of the addend field. */
8347 if (elf_header
.e_machine
== EM_SH
)
8350 symsec
= section_headers
+ relsec
->sh_link
;
8351 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
8353 for (rp
= relocs
; rp
< relocs
+ num_relocs
; ++rp
)
8356 unsigned int reloc_type
;
8357 unsigned int reloc_size
;
8358 unsigned char * loc
;
8360 /* In MIPS little-endian objects, r_info isn't really a
8361 64-bit little-endian value: it has a 32-bit little-endian
8362 symbol index followed by four individual byte fields.
8363 Reorder INFO accordingly. */
8365 && elf_header
.e_machine
== EM_MIPS
8366 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
8367 rp
->r_info
= (((rp
->r_info
& 0xffffffff) << 32)
8368 | ((rp
->r_info
>> 56) & 0xff)
8369 | ((rp
->r_info
>> 40) & 0xff00)
8370 | ((rp
->r_info
>> 24) & 0xff0000)
8371 | ((rp
->r_info
>> 8) & 0xff000000));
8373 reloc_type
= get_reloc_type (rp
->r_info
);
8375 if (is_32bit_abs_reloc (reloc_type
)
8376 || is_32bit_pcrel_reloc (reloc_type
))
8378 else if (is_64bit_abs_reloc (reloc_type
))
8380 else if (is_16bit_abs_reloc (reloc_type
))
8384 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
8385 reloc_type
, SECTION_NAME (section
));
8389 loc
= start
+ rp
->r_offset
;
8390 if ((loc
+ reloc_size
) > end
)
8392 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
8393 (unsigned long) rp
->r_offset
,
8394 SECTION_NAME (section
));
8398 sym
= symtab
+ get_reloc_symindex (rp
->r_info
);
8400 /* If the reloc has a symbol associated with it,
8401 make sure that it is of an appropriate type. */
8403 && ELF_ST_TYPE (sym
->st_info
) != STT_SECTION
8404 /* Relocations against symbols without type can happen.
8405 Gcc -feliminate-dwarf2-dups may generate symbols
8406 without type for debug info. */
8407 && ELF_ST_TYPE (sym
->st_info
) != STT_NOTYPE
8408 /* Relocations against object symbols can happen,
8409 eg when referencing a global array. For an
8410 example of this see the _clz.o binary in libgcc.a. */
8411 && ELF_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
8413 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
8414 get_symbol_type (ELF_ST_TYPE (sym
->st_info
)),
8415 (long int)(rp
- relocs
),
8416 SECTION_NAME (relsec
));
8420 addend
= is_rela
? rp
->r_addend
: byte_get (loc
, reloc_size
);
8422 if (is_32bit_pcrel_reloc (reloc_type
))
8423 byte_put (loc
, (addend
+ sym
->st_value
) - rp
->r_offset
,
8426 byte_put (loc
, addend
+ sym
->st_value
, reloc_size
);
8436 load_debug_section (enum dwarf_section_display_enum debug
, void *file
)
8438 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
8439 Elf_Internal_Shdr
*sec
;
8441 int section_is_compressed
;
8443 /* If it is already loaded, do nothing. */
8444 if (section
->start
!= NULL
)
8447 /* Locate the debug section. */
8448 sec
= find_section (section
->uncompressed_name
);
8450 section
->name
= section
->uncompressed_name
;
8453 sec
= find_section (section
->compressed_name
);
8455 section
->name
= section
->compressed_name
;
8459 section_is_compressed
= section
->name
== section
->compressed_name
;
8461 snprintf (buf
, sizeof (buf
), _("%s section data"), section
->name
);
8462 section
->address
= sec
->sh_addr
;
8463 section
->size
= sec
->sh_size
;
8464 section
->start
= get_data (NULL
, file
, sec
->sh_offset
, 1,
8466 if (section
->start
== NULL
)
8469 if (section_is_compressed
)
8470 if (! uncompress_section_contents (§ion
->start
, §ion
->size
))
8473 if (debug_displays
[debug
].relocate
)
8474 debug_apply_relocations (file
, sec
, section
->start
);
8480 free_debug_section (enum dwarf_section_display_enum debug
)
8482 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
8484 if (section
->start
== NULL
)
8487 free ((char *) section
->start
);
8488 section
->start
= NULL
;
8489 section
->address
= 0;
8494 display_debug_section (Elf_Internal_Shdr
*section
, FILE *file
)
8496 char *name
= SECTION_NAME (section
);
8497 bfd_size_type length
;
8499 enum dwarf_section_display_enum i
;
8501 length
= section
->sh_size
;
8504 printf (_("\nSection '%s' has no debugging data.\n"), name
);
8508 if (const_strneq (name
, ".gnu.linkonce.wi."))
8509 name
= ".debug_info";
8511 /* See if we know how to display the contents of this section. */
8512 for (i
= 0; i
< max
; i
++)
8513 if (streq (debug_displays
[i
].section
.uncompressed_name
, name
)
8514 || streq (debug_displays
[i
].section
.compressed_name
, name
))
8516 struct dwarf_section
*sec
= &debug_displays
[i
].section
;
8518 if (load_debug_section (i
, file
))
8520 result
&= debug_displays
[i
].display (sec
, file
);
8522 if (i
!= info
&& i
!= abbrev
)
8523 free_debug_section (i
);
8531 printf (_("Unrecognized debug section: %s\n"), name
);
8538 /* Set DUMP_SECTS for all sections where dumps were requested
8539 based on section name. */
8542 initialise_dumps_byname (void)
8544 struct dump_list_entry
*cur
;
8546 for (cur
= dump_sects_byname
; cur
; cur
= cur
->next
)
8551 for (i
= 0, any
= 0; i
< elf_header
.e_shnum
; i
++)
8552 if (streq (SECTION_NAME (section_headers
+ i
), cur
->name
))
8554 request_dump_bynumber (i
, cur
->type
);
8559 warn (_("Section '%s' was not dumped because it does not exist!\n"),
8565 process_section_contents (FILE *file
)
8567 Elf_Internal_Shdr
*section
;
8573 initialise_dumps_byname ();
8575 for (i
= 0, section
= section_headers
;
8576 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
8579 #ifdef SUPPORT_DISASSEMBLY
8580 if (dump_sects
[i
] & DISASS_DUMP
)
8581 disassemble_section (section
, file
);
8583 if (dump_sects
[i
] & HEX_DUMP
)
8584 dump_section_as_bytes (section
, file
);
8586 if (dump_sects
[i
] & DEBUG_DUMP
)
8587 display_debug_section (section
, file
);
8589 if (dump_sects
[i
] & STRING_DUMP
)
8590 dump_section_as_strings (section
, file
);
8593 /* Check to see if the user requested a
8594 dump of a section that does not exist. */
8595 while (i
++ < num_dump_sects
)
8597 warn (_("Section %d was not dumped because it does not exist!\n"), i
);
8601 process_mips_fpe_exception (int mask
)
8606 if (mask
& OEX_FPU_INEX
)
8607 fputs ("INEX", stdout
), first
= 0;
8608 if (mask
& OEX_FPU_UFLO
)
8609 printf ("%sUFLO", first
? "" : "|"), first
= 0;
8610 if (mask
& OEX_FPU_OFLO
)
8611 printf ("%sOFLO", first
? "" : "|"), first
= 0;
8612 if (mask
& OEX_FPU_DIV0
)
8613 printf ("%sDIV0", first
? "" : "|"), first
= 0;
8614 if (mask
& OEX_FPU_INVAL
)
8615 printf ("%sINVAL", first
? "" : "|");
8618 fputs ("0", stdout
);
8621 /* ARM EABI attributes section. */
8626 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
8629 } arm_attr_public_tag
;
8631 static const char *arm_attr_tag_CPU_arch
[] =
8632 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
8634 static const char *arm_attr_tag_ARM_ISA_use
[] = {"No", "Yes"};
8635 static const char *arm_attr_tag_THUMB_ISA_use
[] =
8636 {"No", "Thumb-1", "Thumb-2"};
8637 static const char *arm_attr_tag_VFP_arch
[] =
8638 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16"};
8639 static const char *arm_attr_tag_WMMX_arch
[] = {"No", "WMMXv1"};
8640 static const char *arm_attr_tag_NEON_arch
[] = {"No", "NEONv1"};
8641 static const char *arm_attr_tag_ABI_PCS_config
[] =
8642 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
8643 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
8644 static const char *arm_attr_tag_ABI_PCS_R9_use
[] =
8645 {"V6", "SB", "TLS", "Unused"};
8646 static const char *arm_attr_tag_ABI_PCS_RW_data
[] =
8647 {"Absolute", "PC-relative", "SB-relative", "None"};
8648 static const char *arm_attr_tag_ABI_PCS_RO_DATA
[] =
8649 {"Absolute", "PC-relative", "None"};
8650 static const char *arm_attr_tag_ABI_PCS_GOT_use
[] =
8651 {"None", "direct", "GOT-indirect"};
8652 static const char *arm_attr_tag_ABI_PCS_wchar_t
[] =
8653 {"None", "??? 1", "2", "??? 3", "4"};
8654 static const char *arm_attr_tag_ABI_FP_rounding
[] = {"Unused", "Needed"};
8655 static const char *arm_attr_tag_ABI_FP_denormal
[] = {"Unused", "Needed"};
8656 static const char *arm_attr_tag_ABI_FP_exceptions
[] = {"Unused", "Needed"};
8657 static const char *arm_attr_tag_ABI_FP_user_exceptions
[] = {"Unused", "Needed"};
8658 static const char *arm_attr_tag_ABI_FP_number_model
[] =
8659 {"Unused", "Finite", "RTABI", "IEEE 754"};
8660 static const char *arm_attr_tag_ABI_align8_needed
[] = {"No", "Yes", "4-byte"};
8661 static const char *arm_attr_tag_ABI_align8_preserved
[] =
8662 {"No", "Yes, except leaf SP", "Yes"};
8663 static const char *arm_attr_tag_ABI_enum_size
[] =
8664 {"Unused", "small", "int", "forced to int"};
8665 static const char *arm_attr_tag_ABI_HardFP_use
[] =
8666 {"As Tag_VFP_arch", "SP only", "DP only", "SP and DP"};
8667 static const char *arm_attr_tag_ABI_VFP_args
[] =
8668 {"AAPCS", "VFP registers", "custom"};
8669 static const char *arm_attr_tag_ABI_WMMX_args
[] =
8670 {"AAPCS", "WMMX registers", "custom"};
8671 static const char *arm_attr_tag_ABI_optimization_goals
[] =
8672 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
8673 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
8674 static const char *arm_attr_tag_ABI_FP_optimization_goals
[] =
8675 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
8676 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
8678 #define LOOKUP(id, name) \
8679 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
8680 static arm_attr_public_tag arm_attr_public_tags
[] =
8682 {4, "CPU_raw_name", 1, NULL
},
8683 {5, "CPU_name", 1, NULL
},
8684 LOOKUP(6, CPU_arch
),
8685 {7, "CPU_arch_profile", 0, NULL
},
8686 LOOKUP(8, ARM_ISA_use
),
8687 LOOKUP(9, THUMB_ISA_use
),
8688 LOOKUP(10, VFP_arch
),
8689 LOOKUP(11, WMMX_arch
),
8690 LOOKUP(12, NEON_arch
),
8691 LOOKUP(13, ABI_PCS_config
),
8692 LOOKUP(14, ABI_PCS_R9_use
),
8693 LOOKUP(15, ABI_PCS_RW_data
),
8694 LOOKUP(16, ABI_PCS_RO_DATA
),
8695 LOOKUP(17, ABI_PCS_GOT_use
),
8696 LOOKUP(18, ABI_PCS_wchar_t
),
8697 LOOKUP(19, ABI_FP_rounding
),
8698 LOOKUP(20, ABI_FP_denormal
),
8699 LOOKUP(21, ABI_FP_exceptions
),
8700 LOOKUP(22, ABI_FP_user_exceptions
),
8701 LOOKUP(23, ABI_FP_number_model
),
8702 LOOKUP(24, ABI_align8_needed
),
8703 LOOKUP(25, ABI_align8_preserved
),
8704 LOOKUP(26, ABI_enum_size
),
8705 LOOKUP(27, ABI_HardFP_use
),
8706 LOOKUP(28, ABI_VFP_args
),
8707 LOOKUP(29, ABI_WMMX_args
),
8708 LOOKUP(30, ABI_optimization_goals
),
8709 LOOKUP(31, ABI_FP_optimization_goals
),
8710 {32, "compatibility", 0, NULL
}
8714 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
8717 read_uleb128 (unsigned char *p
, unsigned int *plen
)
8731 val
|= ((unsigned int)c
& 0x7f) << shift
;
8740 static unsigned char *
8741 display_arm_attribute (unsigned char *p
)
8746 arm_attr_public_tag
*attr
;
8750 tag
= read_uleb128 (p
, &len
);
8753 for (i
= 0; i
< ARRAY_SIZE(arm_attr_public_tags
); i
++)
8755 if (arm_attr_public_tags
[i
].tag
== tag
)
8757 attr
= &arm_attr_public_tags
[i
];
8764 printf (" Tag_%s: ", attr
->name
);
8770 case 7: /* Tag_CPU_arch_profile. */
8771 val
= read_uleb128 (p
, &len
);
8775 case 0: printf ("None\n"); break;
8776 case 'A': printf ("Application\n"); break;
8777 case 'R': printf ("Realtime\n"); break;
8778 case 'M': printf ("Microcontroller\n"); break;
8779 default: printf ("??? (%d)\n", val
); break;
8783 case 32: /* Tag_compatibility. */
8784 val
= read_uleb128 (p
, &len
);
8786 printf ("flag = %d, vendor = %s\n", val
, p
);
8787 p
+= strlen((char *)p
) + 1;
8801 assert (attr
->type
& 0x80);
8802 val
= read_uleb128 (p
, &len
);
8804 type
= attr
->type
& 0x7f;
8806 printf ("??? (%d)\n", val
);
8808 printf ("%s\n", attr
->table
[val
]);
8815 type
= 1; /* String. */
8817 type
= 2; /* uleb128. */
8818 printf (" Tag_unknown_%d: ", tag
);
8823 printf ("\"%s\"\n", p
);
8824 p
+= strlen((char *)p
) + 1;
8828 val
= read_uleb128 (p
, &len
);
8830 printf ("%d (0x%x)\n", val
, val
);
8836 static unsigned char *
8837 display_gnu_attribute (unsigned char * p
,
8838 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, int))
8845 tag
= read_uleb128 (p
, &len
);
8848 /* Tag_compatibility is the only generic GNU attribute defined at
8852 val
= read_uleb128 (p
, &len
);
8854 printf ("flag = %d, vendor = %s\n", val
, p
);
8855 p
+= strlen ((char *) p
) + 1;
8859 if ((tag
& 2) == 0 && display_proc_gnu_attribute
)
8860 return display_proc_gnu_attribute (p
, tag
);
8863 type
= 1; /* String. */
8865 type
= 2; /* uleb128. */
8866 printf (" Tag_unknown_%d: ", tag
);
8870 printf ("\"%s\"\n", p
);
8871 p
+= strlen ((char *) p
) + 1;
8875 val
= read_uleb128 (p
, &len
);
8877 printf ("%d (0x%x)\n", val
, val
);
8883 static unsigned char *
8884 display_power_gnu_attribute (unsigned char *p
, int tag
)
8890 if (tag
== Tag_GNU_Power_ABI_FP
)
8892 val
= read_uleb128 (p
, &len
);
8894 printf (" Tag_GNU_Power_ABI_FP: ");
8899 printf ("Hard or soft float\n");
8902 printf ("Hard float\n");
8905 printf ("Soft float\n");
8908 printf ("Single-precision hard float\n");
8911 printf ("??? (%d)\n", val
);
8917 if (tag
== Tag_GNU_Power_ABI_Vector
)
8919 val
= read_uleb128 (p
, &len
);
8921 printf (" Tag_GNU_Power_ABI_Vector: ");
8928 printf ("Generic\n");
8931 printf ("AltiVec\n");
8937 printf ("??? (%d)\n", val
);
8944 type
= 1; /* String. */
8946 type
= 2; /* uleb128. */
8947 printf (" Tag_unknown_%d: ", tag
);
8951 printf ("\"%s\"\n", p
);
8952 p
+= strlen ((char *) p
) + 1;
8956 val
= read_uleb128 (p
, &len
);
8958 printf ("%d (0x%x)\n", val
, val
);
8964 static unsigned char *
8965 display_mips_gnu_attribute (unsigned char *p
, int tag
)
8971 if (tag
== Tag_GNU_MIPS_ABI_FP
)
8973 val
= read_uleb128 (p
, &len
);
8975 printf (" Tag_GNU_MIPS_ABI_FP: ");
8980 printf ("Hard or soft float\n");
8983 printf ("Hard float (-mdouble-float)\n");
8986 printf ("Hard float (-msingle-float)\n");
8989 printf ("Soft float\n");
8992 printf ("64-bit float (-mips32r2 -mfp64)\n");
8995 printf ("??? (%d)\n", val
);
9002 type
= 1; /* String. */
9004 type
= 2; /* uleb128. */
9005 printf (" Tag_unknown_%d: ", tag
);
9009 printf ("\"%s\"\n", p
);
9010 p
+= strlen ((char *) p
) + 1;
9014 val
= read_uleb128 (p
, &len
);
9016 printf ("%d (0x%x)\n", val
, val
);
9023 process_attributes (FILE * file
,
9024 const char * public_name
,
9025 unsigned int proc_type
,
9026 unsigned char * (* display_pub_attribute
) (unsigned char *),
9027 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, int))
9029 Elf_Internal_Shdr
*sect
;
9030 unsigned char *contents
;
9033 bfd_vma section_len
;
9037 /* Find the section header so that we get the size. */
9038 for (i
= 0, sect
= section_headers
;
9039 i
< elf_header
.e_shnum
;
9042 if (sect
->sh_type
!= proc_type
&& sect
->sh_type
!= SHT_GNU_ATTRIBUTES
)
9045 contents
= get_data (NULL
, file
, sect
->sh_offset
, 1, sect
->sh_size
,
9047 if (contents
== NULL
)
9053 len
= sect
->sh_size
- 1;
9059 bfd_boolean public_section
;
9060 bfd_boolean gnu_section
;
9062 section_len
= byte_get (p
, 4);
9065 if (section_len
> len
)
9067 printf (_("ERROR: Bad section length (%d > %d)\n"),
9068 (int) section_len
, (int) len
);
9073 printf ("Attribute Section: %s\n", p
);
9075 if (public_name
&& streq ((char *) p
, public_name
))
9076 public_section
= TRUE
;
9078 public_section
= FALSE
;
9080 if (streq ((char *) p
, "gnu"))
9083 gnu_section
= FALSE
;
9085 namelen
= strlen ((char *) p
) + 1;
9087 section_len
-= namelen
+ 4;
9089 while (section_len
> 0)
9095 size
= byte_get (p
, 4);
9096 if (size
> section_len
)
9098 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
9099 (int) size
, (int) section_len
);
9103 section_len
-= size
;
9110 printf ("File Attributes\n");
9113 printf ("Section Attributes:");
9116 printf ("Symbol Attributes:");
9122 val
= read_uleb128 (p
, &i
);
9126 printf (" %d", val
);
9131 printf ("Unknown tag: %d\n", tag
);
9132 public_section
= FALSE
;
9139 p
= display_pub_attribute (p
);
9141 else if (gnu_section
)
9144 p
= display_gnu_attribute (p
,
9145 display_proc_gnu_attribute
);
9149 /* ??? Do something sensible, like dump hex. */
9150 printf (" Unknown section contexts\n");
9157 printf (_("Unknown format '%c'\n"), *p
);
9165 process_arm_specific (FILE *file
)
9167 return process_attributes (file
, "aeabi", SHT_ARM_ATTRIBUTES
,
9168 display_arm_attribute
, NULL
);
9172 process_power_specific (FILE *file
)
9174 return process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
9175 display_power_gnu_attribute
);
9178 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
9179 Print the Address, Access and Initial fields of an entry at VMA ADDR
9180 and return the VMA of the next entry. */
9183 print_mips_got_entry (unsigned char *data
, bfd_vma pltgot
, bfd_vma addr
)
9186 print_vma (addr
, LONG_HEX
);
9188 if (addr
< pltgot
+ 0xfff0)
9189 printf ("%6d(gp)", (int) (addr
- pltgot
- 0x7ff0));
9191 printf ("%10s", "");
9194 printf ("%*s", is_32bit_elf
? 8 : 16, "<unknown>");
9199 entry
= byte_get (data
+ addr
- pltgot
, is_32bit_elf
? 4 : 8);
9200 print_vma (entry
, LONG_HEX
);
9202 return addr
+ (is_32bit_elf
? 4 : 8);
9206 process_mips_specific (FILE *file
)
9208 Elf_Internal_Dyn
*entry
;
9209 size_t liblist_offset
= 0;
9210 size_t liblistno
= 0;
9211 size_t conflictsno
= 0;
9212 size_t options_offset
= 0;
9213 size_t conflicts_offset
= 0;
9215 bfd_vma local_gotno
= 0;
9217 bfd_vma symtabno
= 0;
9219 process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
9220 display_mips_gnu_attribute
);
9222 /* We have a lot of special sections. Thanks SGI! */
9223 if (dynamic_section
== NULL
)
9224 /* No information available. */
9227 for (entry
= dynamic_section
; entry
->d_tag
!= DT_NULL
; ++entry
)
9228 switch (entry
->d_tag
)
9230 case DT_MIPS_LIBLIST
:
9232 = offset_from_vma (file
, entry
->d_un
.d_val
,
9233 liblistno
* sizeof (Elf32_External_Lib
));
9235 case DT_MIPS_LIBLISTNO
:
9236 liblistno
= entry
->d_un
.d_val
;
9238 case DT_MIPS_OPTIONS
:
9239 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
9241 case DT_MIPS_CONFLICT
:
9243 = offset_from_vma (file
, entry
->d_un
.d_val
,
9244 conflictsno
* sizeof (Elf32_External_Conflict
));
9246 case DT_MIPS_CONFLICTNO
:
9247 conflictsno
= entry
->d_un
.d_val
;
9250 pltgot
= entry
->d_un
.d_val
;
9251 case DT_MIPS_LOCAL_GOTNO
:
9252 local_gotno
= entry
->d_un
.d_val
;
9254 case DT_MIPS_GOTSYM
:
9255 gotsym
= entry
->d_un
.d_val
;
9257 case DT_MIPS_SYMTABNO
:
9258 symtabno
= entry
->d_un
.d_val
;
9264 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
9266 Elf32_External_Lib
*elib
;
9269 elib
= get_data (NULL
, file
, liblist_offset
,
9270 liblistno
, sizeof (Elf32_External_Lib
),
9274 printf ("\nSection '.liblist' contains %lu entries:\n",
9275 (unsigned long) liblistno
);
9276 fputs (" Library Time Stamp Checksum Version Flags\n",
9279 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
9286 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9287 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9288 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9289 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9290 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9292 tmp
= gmtime (&time
);
9293 snprintf (timebuf
, sizeof (timebuf
),
9294 "%04u-%02u-%02uT%02u:%02u:%02u",
9295 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9296 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9298 printf ("%3lu: ", (unsigned long) cnt
);
9299 if (VALID_DYNAMIC_NAME (liblist
.l_name
))
9300 print_symbol (20, GET_DYNAMIC_NAME (liblist
.l_name
));
9302 printf ("<corrupt: %9ld>", liblist
.l_name
);
9303 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
9306 if (liblist
.l_flags
== 0)
9317 { " EXACT_MATCH", LL_EXACT_MATCH
},
9318 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
9319 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
9320 { " EXPORTS", LL_EXPORTS
},
9321 { " DELAY_LOAD", LL_DELAY_LOAD
},
9322 { " DELTA", LL_DELTA
}
9324 int flags
= liblist
.l_flags
;
9327 for (fcnt
= 0; fcnt
< ARRAY_SIZE (l_flags_vals
); ++fcnt
)
9328 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
9330 fputs (l_flags_vals
[fcnt
].name
, stdout
);
9331 flags
^= l_flags_vals
[fcnt
].bit
;
9334 printf (" %#x", (unsigned int) flags
);
9344 if (options_offset
!= 0)
9346 Elf_External_Options
*eopt
;
9347 Elf_Internal_Shdr
*sect
= section_headers
;
9348 Elf_Internal_Options
*iopt
;
9349 Elf_Internal_Options
*option
;
9353 /* Find the section header so that we get the size. */
9354 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
9357 eopt
= get_data (NULL
, file
, options_offset
, 1, sect
->sh_size
,
9361 iopt
= cmalloc ((sect
->sh_size
/ sizeof (eopt
)), sizeof (*iopt
));
9364 error (_("Out of memory\n"));
9371 while (offset
< sect
->sh_size
)
9373 Elf_External_Options
*eoption
;
9375 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
9377 option
->kind
= BYTE_GET (eoption
->kind
);
9378 option
->size
= BYTE_GET (eoption
->size
);
9379 option
->section
= BYTE_GET (eoption
->section
);
9380 option
->info
= BYTE_GET (eoption
->info
);
9382 offset
+= option
->size
;
9388 printf (_("\nSection '%s' contains %d entries:\n"),
9389 SECTION_NAME (sect
), cnt
);
9397 switch (option
->kind
)
9400 /* This shouldn't happen. */
9401 printf (" NULL %d %lx", option
->section
, option
->info
);
9404 printf (" REGINFO ");
9405 if (elf_header
.e_machine
== EM_MIPS
)
9408 Elf32_External_RegInfo
*ereg
;
9409 Elf32_RegInfo reginfo
;
9411 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
9412 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9413 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9414 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9415 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9416 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9417 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9419 printf ("GPR %08lx GP 0x%lx\n",
9421 (unsigned long) reginfo
.ri_gp_value
);
9422 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9423 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9424 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9429 Elf64_External_RegInfo
*ereg
;
9430 Elf64_Internal_RegInfo reginfo
;
9432 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
9433 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9434 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9435 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9436 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9437 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9438 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9440 printf ("GPR %08lx GP 0x",
9441 reginfo
.ri_gprmask
);
9442 printf_vma (reginfo
.ri_gp_value
);
9445 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9446 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9447 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9451 case ODK_EXCEPTIONS
:
9452 fputs (" EXCEPTIONS fpe_min(", stdout
);
9453 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
9454 fputs (") fpe_max(", stdout
);
9455 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
9456 fputs (")", stdout
);
9458 if (option
->info
& OEX_PAGE0
)
9459 fputs (" PAGE0", stdout
);
9460 if (option
->info
& OEX_SMM
)
9461 fputs (" SMM", stdout
);
9462 if (option
->info
& OEX_FPDBUG
)
9463 fputs (" FPDBUG", stdout
);
9464 if (option
->info
& OEX_DISMISS
)
9465 fputs (" DISMISS", stdout
);
9468 fputs (" PAD ", stdout
);
9469 if (option
->info
& OPAD_PREFIX
)
9470 fputs (" PREFIX", stdout
);
9471 if (option
->info
& OPAD_POSTFIX
)
9472 fputs (" POSTFIX", stdout
);
9473 if (option
->info
& OPAD_SYMBOL
)
9474 fputs (" SYMBOL", stdout
);
9477 fputs (" HWPATCH ", stdout
);
9478 if (option
->info
& OHW_R4KEOP
)
9479 fputs (" R4KEOP", stdout
);
9480 if (option
->info
& OHW_R8KPFETCH
)
9481 fputs (" R8KPFETCH", stdout
);
9482 if (option
->info
& OHW_R5KEOP
)
9483 fputs (" R5KEOP", stdout
);
9484 if (option
->info
& OHW_R5KCVTL
)
9485 fputs (" R5KCVTL", stdout
);
9488 fputs (" FILL ", stdout
);
9489 /* XXX Print content of info word? */
9492 fputs (" TAGS ", stdout
);
9493 /* XXX Print content of info word? */
9496 fputs (" HWAND ", stdout
);
9497 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9498 fputs (" R4KEOP_CHECKED", stdout
);
9499 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9500 fputs (" R4KEOP_CLEAN", stdout
);
9503 fputs (" HWOR ", stdout
);
9504 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9505 fputs (" R4KEOP_CHECKED", stdout
);
9506 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9507 fputs (" R4KEOP_CLEAN", stdout
);
9510 printf (" GP_GROUP %#06lx self-contained %#06lx",
9511 option
->info
& OGP_GROUP
,
9512 (option
->info
& OGP_SELF
) >> 16);
9515 printf (" IDENT %#06lx self-contained %#06lx",
9516 option
->info
& OGP_GROUP
,
9517 (option
->info
& OGP_SELF
) >> 16);
9520 /* This shouldn't happen. */
9521 printf (" %3d ??? %d %lx",
9522 option
->kind
, option
->section
, option
->info
);
9526 len
= sizeof (*eopt
);
9527 while (len
< option
->size
)
9528 if (((char *) option
)[len
] >= ' '
9529 && ((char *) option
)[len
] < 0x7f)
9530 printf ("%c", ((char *) option
)[len
++]);
9532 printf ("\\%03o", ((char *) option
)[len
++]);
9534 fputs ("\n", stdout
);
9542 if (conflicts_offset
!= 0 && conflictsno
!= 0)
9544 Elf32_Conflict
*iconf
;
9547 if (dynamic_symbols
== NULL
)
9549 error (_("conflict list found without a dynamic symbol table\n"));
9553 iconf
= cmalloc (conflictsno
, sizeof (*iconf
));
9556 error (_("Out of memory\n"));
9562 Elf32_External_Conflict
*econf32
;
9564 econf32
= get_data (NULL
, file
, conflicts_offset
,
9565 conflictsno
, sizeof (*econf32
), _("conflict"));
9569 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9570 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
9576 Elf64_External_Conflict
*econf64
;
9578 econf64
= get_data (NULL
, file
, conflicts_offset
,
9579 conflictsno
, sizeof (*econf64
), _("conflict"));
9583 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9584 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
9589 printf (_("\nSection '.conflict' contains %lu entries:\n"),
9590 (unsigned long) conflictsno
);
9591 puts (_(" Num: Index Value Name"));
9593 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9595 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
9597 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
9598 print_vma (psym
->st_value
, FULL_HEX
);
9600 if (VALID_DYNAMIC_NAME (psym
->st_name
))
9601 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
9603 printf ("<corrupt: %14ld>", psym
->st_name
);
9610 if (pltgot
!= 0 && local_gotno
!= 0)
9612 bfd_vma entry
, local_end
, global_end
;
9614 unsigned char *data
;
9618 addr_size
= (is_32bit_elf
? 4 : 8);
9619 local_end
= pltgot
+ local_gotno
* addr_size
;
9620 global_end
= local_end
+ (symtabno
- gotsym
) * addr_size
;
9622 offset
= offset_from_vma (file
, pltgot
, global_end
- pltgot
);
9623 data
= get_data (NULL
, file
, offset
, global_end
- pltgot
, 1, _("GOT"));
9624 printf (_("\nPrimary GOT:\n"));
9625 printf (_(" Canonical gp value: "));
9626 print_vma (pltgot
+ 0x7ff0, LONG_HEX
);
9629 printf (_(" Reserved entries:\n"));
9630 printf (_(" %*s %10s %*s Purpose\n"),
9631 addr_size
* 2, "Address", "Access",
9632 addr_size
* 2, "Initial");
9633 entry
= print_mips_got_entry (data
, pltgot
, entry
);
9634 printf (" Lazy resolver\n");
9636 && (byte_get (data
+ entry
- pltgot
, addr_size
)
9637 >> (addr_size
* 8 - 1)) != 0)
9639 entry
= print_mips_got_entry (data
, pltgot
, entry
);
9640 printf (" Module pointer (GNU extension)\n");
9644 if (entry
< local_end
)
9646 printf (_(" Local entries:\n"));
9647 printf (_(" %*s %10s %*s\n"),
9648 addr_size
* 2, "Address", "Access",
9649 addr_size
* 2, "Initial");
9650 while (entry
< local_end
)
9652 entry
= print_mips_got_entry (data
, pltgot
, entry
);
9658 if (gotsym
< symtabno
)
9662 printf (_(" Global entries:\n"));
9663 printf (_(" %*s %10s %*s %*s %-7s %3s %s\n"),
9664 addr_size
* 2, "Address", "Access",
9665 addr_size
* 2, "Initial",
9666 addr_size
* 2, "Sym.Val.", "Type", "Ndx", "Name");
9667 sym_width
= (is_32bit_elf
? 80 : 160) - 28 - addr_size
* 6 - 1;
9668 for (i
= gotsym
; i
< symtabno
; i
++)
9670 Elf_Internal_Sym
*psym
;
9672 psym
= dynamic_symbols
+ i
;
9673 entry
= print_mips_got_entry (data
, pltgot
, entry
);
9675 print_vma (psym
->st_value
, LONG_HEX
);
9676 printf (" %-7s %3s ",
9677 get_symbol_type (ELF_ST_TYPE (psym
->st_info
)),
9678 get_symbol_index_type (psym
->st_shndx
));
9679 if (VALID_DYNAMIC_NAME (psym
->st_name
))
9680 print_symbol (sym_width
, GET_DYNAMIC_NAME (psym
->st_name
));
9682 printf ("<corrupt: %14ld>", psym
->st_name
);
9696 process_gnu_liblist (FILE *file
)
9698 Elf_Internal_Shdr
*section
, *string_sec
;
9699 Elf32_External_Lib
*elib
;
9708 for (i
= 0, section
= section_headers
;
9709 i
< elf_header
.e_shnum
;
9712 switch (section
->sh_type
)
9714 case SHT_GNU_LIBLIST
:
9715 if (section
->sh_link
>= elf_header
.e_shnum
)
9718 elib
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
9723 string_sec
= section_headers
+ section
->sh_link
;
9725 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
9726 string_sec
->sh_size
, _("liblist string table"));
9727 strtab_size
= string_sec
->sh_size
;
9730 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
9736 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
9737 SECTION_NAME (section
),
9738 (unsigned long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
9740 puts (" Library Time Stamp Checksum Version Flags");
9742 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
9750 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9751 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9752 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9753 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9754 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9756 tmp
= gmtime (&time
);
9757 snprintf (timebuf
, sizeof (timebuf
),
9758 "%04u-%02u-%02uT%02u:%02u:%02u",
9759 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9760 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9762 printf ("%3lu: ", (unsigned long) cnt
);
9764 printf ("%-20s", liblist
.l_name
< strtab_size
9765 ? strtab
+ liblist
.l_name
: "<corrupt>");
9767 printf ("%-20.20s", liblist
.l_name
< strtab_size
9768 ? strtab
+ liblist
.l_name
: "<corrupt>");
9769 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
9770 liblist
.l_version
, liblist
.l_flags
);
9781 get_note_type (unsigned e_type
)
9783 static char buff
[64];
9785 if (elf_header
.e_type
== ET_CORE
)
9789 return _("NT_AUXV (auxiliary vector)");
9791 return _("NT_PRSTATUS (prstatus structure)");
9793 return _("NT_FPREGSET (floating point registers)");
9795 return _("NT_PRPSINFO (prpsinfo structure)");
9797 return _("NT_TASKSTRUCT (task structure)");
9799 return _("NT_PRXFPREG (user_xfpregs structure)");
9801 return _("NT_PPC_VMX (ppc Altivec registers)");
9803 return _("NT_PPC_VSX (ppc VSX registers)");
9805 return _("NT_PSTATUS (pstatus structure)");
9807 return _("NT_FPREGS (floating point registers)");
9809 return _("NT_PSINFO (psinfo structure)");
9811 return _("NT_LWPSTATUS (lwpstatus_t structure)");
9813 return _("NT_LWPSINFO (lwpsinfo_t structure)");
9814 case NT_WIN32PSTATUS
:
9815 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9823 return _("NT_VERSION (version)");
9825 return _("NT_ARCH (architecture)");
9830 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
9835 get_gnu_elf_note_type (unsigned e_type
)
9837 static char buff
[64];
9841 case NT_GNU_ABI_TAG
:
9842 return _("NT_GNU_ABI_TAG (ABI version tag)");
9844 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
9845 case NT_GNU_BUILD_ID
:
9846 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
9847 case NT_GNU_GOLD_VERSION
:
9848 return _("NT_GNU_GOLD_VERSION (gold version)");
9853 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
9858 get_netbsd_elfcore_note_type (unsigned e_type
)
9860 static char buff
[64];
9862 if (e_type
== NT_NETBSDCORE_PROCINFO
)
9864 /* NetBSD core "procinfo" structure. */
9865 return _("NetBSD procinfo structure");
9868 /* As of Jan 2002 there are no other machine-independent notes
9869 defined for NetBSD core files. If the note type is less
9870 than the start of the machine-dependent note types, we don't
9873 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
9875 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
9879 switch (elf_header
.e_machine
)
9881 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
9882 and PT_GETFPREGS == mach+2. */
9887 case EM_SPARC32PLUS
:
9891 case NT_NETBSDCORE_FIRSTMACH
+0:
9892 return _("PT_GETREGS (reg structure)");
9893 case NT_NETBSDCORE_FIRSTMACH
+2:
9894 return _("PT_GETFPREGS (fpreg structure)");
9900 /* On all other arch's, PT_GETREGS == mach+1 and
9901 PT_GETFPREGS == mach+3. */
9905 case NT_NETBSDCORE_FIRSTMACH
+1:
9906 return _("PT_GETREGS (reg structure)");
9907 case NT_NETBSDCORE_FIRSTMACH
+3:
9908 return _("PT_GETFPREGS (fpreg structure)");
9914 snprintf (buff
, sizeof (buff
), _("PT_FIRSTMACH+%d"),
9915 e_type
- NT_NETBSDCORE_FIRSTMACH
);
9919 /* Note that by the ELF standard, the name field is already null byte
9920 terminated, and namesz includes the terminating null byte.
9921 I.E. the value of namesz for the name "FSF" is 4.
9923 If the value of namesz is zero, there is no name present. */
9925 process_note (Elf_Internal_Note
*pnote
)
9927 const char *name
= pnote
->namesz
? pnote
->namedata
: "(NONE)";
9930 if (pnote
->namesz
== 0)
9931 /* If there is no note name, then use the default set of
9932 note type strings. */
9933 nt
= get_note_type (pnote
->type
);
9935 else if (const_strneq (pnote
->namedata
, "GNU"))
9936 /* GNU-specific object file notes. */
9937 nt
= get_gnu_elf_note_type (pnote
->type
);
9939 else if (const_strneq (pnote
->namedata
, "NetBSD-CORE"))
9940 /* NetBSD-specific core file notes. */
9941 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
9943 else if (strneq (pnote
->namedata
, "SPU/", 4))
9945 /* SPU-specific core file notes. */
9946 nt
= pnote
->namedata
+ 4;
9951 /* Don't recognize this note name; just use the default set of
9952 note type strings. */
9953 nt
= get_note_type (pnote
->type
);
9955 printf (" %s\t\t0x%08lx\t%s\n", name
, pnote
->descsz
, nt
);
9961 process_corefile_note_segment (FILE *file
, bfd_vma offset
, bfd_vma length
)
9963 Elf_External_Note
*pnotes
;
9964 Elf_External_Note
*external
;
9970 pnotes
= get_data (NULL
, file
, offset
, 1, length
, _("notes"));
9976 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9977 (unsigned long) offset
, (unsigned long) length
);
9978 printf (_(" Owner\t\tData size\tDescription\n"));
9980 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
9982 Elf_External_Note
*next
;
9983 Elf_Internal_Note inote
;
9986 inote
.type
= BYTE_GET (external
->type
);
9987 inote
.namesz
= BYTE_GET (external
->namesz
);
9988 inote
.namedata
= external
->name
;
9989 inote
.descsz
= BYTE_GET (external
->descsz
);
9990 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
9991 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
9993 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
9995 if (((char *) next
) > (((char *) pnotes
) + length
))
9997 warn (_("corrupt note found at offset %lx into core notes\n"),
9998 (unsigned long) ((char *) external
- (char *) pnotes
));
9999 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
10000 inote
.type
, inote
.namesz
, inote
.descsz
);
10006 /* Verify that name is null terminated. It appears that at least
10007 one version of Linux (RedHat 6.0) generates corefiles that don't
10008 comply with the ELF spec by failing to include the null byte in
10010 if (inote
.namedata
[inote
.namesz
] != '\0')
10012 temp
= malloc (inote
.namesz
+ 1);
10016 error (_("Out of memory\n"));
10021 strncpy (temp
, inote
.namedata
, inote
.namesz
);
10022 temp
[inote
.namesz
] = 0;
10024 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
10025 inote
.namedata
= temp
;
10028 res
&= process_note (& inote
);
10043 process_corefile_note_segments (FILE *file
)
10045 Elf_Internal_Phdr
*segment
;
10049 if (! get_program_headers (file
))
10052 for (i
= 0, segment
= program_headers
;
10053 i
< elf_header
.e_phnum
;
10056 if (segment
->p_type
== PT_NOTE
)
10057 res
&= process_corefile_note_segment (file
,
10058 (bfd_vma
) segment
->p_offset
,
10059 (bfd_vma
) segment
->p_filesz
);
10066 process_note_sections (FILE *file
)
10068 Elf_Internal_Shdr
*section
;
10072 for (i
= 0, section
= section_headers
;
10073 i
< elf_header
.e_shnum
;
10075 if (section
->sh_type
== SHT_NOTE
)
10076 res
&= process_corefile_note_segment (file
,
10077 (bfd_vma
) section
->sh_offset
,
10078 (bfd_vma
) section
->sh_size
);
10084 process_notes (FILE *file
)
10086 /* If we have not been asked to display the notes then do nothing. */
10090 if (elf_header
.e_type
!= ET_CORE
)
10091 return process_note_sections (file
);
10093 /* No program headers means no NOTE segment. */
10094 if (elf_header
.e_phnum
> 0)
10095 return process_corefile_note_segments (file
);
10097 printf (_("No note segments present in the core file.\n"));
10102 process_arch_specific (FILE *file
)
10107 switch (elf_header
.e_machine
)
10110 return process_arm_specific (file
);
10112 case EM_MIPS_RS3_LE
:
10113 return process_mips_specific (file
);
10116 return process_power_specific (file
);
10125 get_file_header (FILE *file
)
10127 /* Read in the identity array. */
10128 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
10131 /* Determine how to read the rest of the header. */
10132 switch (elf_header
.e_ident
[EI_DATA
])
10134 default: /* fall through */
10135 case ELFDATANONE
: /* fall through */
10137 byte_get
= byte_get_little_endian
;
10138 byte_put
= byte_put_little_endian
;
10141 byte_get
= byte_get_big_endian
;
10142 byte_put
= byte_put_big_endian
;
10146 /* For now we only support 32 bit and 64 bit ELF files. */
10147 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
10149 /* Read in the rest of the header. */
10152 Elf32_External_Ehdr ehdr32
;
10154 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
10157 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
10158 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
10159 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
10160 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
10161 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
10162 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
10163 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
10164 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
10165 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
10166 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
10167 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
10168 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
10169 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
10173 Elf64_External_Ehdr ehdr64
;
10175 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10176 we will not be able to cope with the 64bit data found in
10177 64 ELF files. Detect this now and abort before we start
10178 overwriting things. */
10179 if (sizeof (bfd_vma
) < 8)
10181 error (_("This instance of readelf has been built without support for a\n\
10182 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10186 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
10189 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
10190 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
10191 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
10192 elf_header
.e_entry
= BYTE_GET (ehdr64
.e_entry
);
10193 elf_header
.e_phoff
= BYTE_GET (ehdr64
.e_phoff
);
10194 elf_header
.e_shoff
= BYTE_GET (ehdr64
.e_shoff
);
10195 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
10196 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
10197 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
10198 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
10199 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
10200 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
10201 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
10204 if (elf_header
.e_shoff
)
10206 /* There may be some extensions in the first section header. Don't
10207 bomb if we can't read it. */
10209 get_32bit_section_headers (file
, 1);
10211 get_64bit_section_headers (file
, 1);
10217 /* Process one ELF object file according to the command line options.
10218 This file may actually be stored in an archive. The file is
10219 positioned at the start of the ELF object. */
10222 process_object (char *file_name
, FILE *file
)
10226 if (! get_file_header (file
))
10228 error (_("%s: Failed to read file header\n"), file_name
);
10232 /* Initialise per file variables. */
10233 for (i
= ARRAY_SIZE (version_info
); i
--;)
10234 version_info
[i
] = 0;
10236 for (i
= ARRAY_SIZE (dynamic_info
); i
--;)
10237 dynamic_info
[i
] = 0;
10239 /* Process the file. */
10241 printf (_("\nFile: %s\n"), file_name
);
10243 /* Initialise the dump_sects array from the cmdline_dump_sects array.
10244 Note we do this even if cmdline_dump_sects is empty because we
10245 must make sure that the dump_sets array is zeroed out before each
10246 object file is processed. */
10247 if (num_dump_sects
> num_cmdline_dump_sects
)
10248 memset (dump_sects
, 0, num_dump_sects
* sizeof (* dump_sects
));
10250 if (num_cmdline_dump_sects
> 0)
10252 if (num_dump_sects
== 0)
10253 /* A sneaky way of allocating the dump_sects array. */
10254 request_dump_bynumber (num_cmdline_dump_sects
, 0);
10256 assert (num_dump_sects
>= num_cmdline_dump_sects
);
10257 memcpy (dump_sects
, cmdline_dump_sects
,
10258 num_cmdline_dump_sects
* sizeof (* dump_sects
));
10261 if (! process_file_header ())
10264 if (! process_section_headers (file
))
10266 /* Without loaded section headers we cannot process lots of
10268 do_unwind
= do_version
= do_dump
= do_arch
= 0;
10270 if (! do_using_dynamic
)
10271 do_syms
= do_reloc
= 0;
10274 if (! process_section_groups (file
))
10276 /* Without loaded section groups we cannot process unwind. */
10280 if (process_program_headers (file
))
10281 process_dynamic_section (file
);
10283 process_relocs (file
);
10285 process_unwind (file
);
10287 process_symbol_table (file
);
10289 process_syminfo (file
);
10291 process_version_sections (file
);
10293 process_section_contents (file
);
10295 process_notes (file
);
10297 process_gnu_liblist (file
);
10299 process_arch_specific (file
);
10301 if (program_headers
)
10303 free (program_headers
);
10304 program_headers
= NULL
;
10307 if (section_headers
)
10309 free (section_headers
);
10310 section_headers
= NULL
;
10315 free (string_table
);
10316 string_table
= NULL
;
10317 string_table_length
= 0;
10320 if (dynamic_strings
)
10322 free (dynamic_strings
);
10323 dynamic_strings
= NULL
;
10324 dynamic_strings_length
= 0;
10327 if (dynamic_symbols
)
10329 free (dynamic_symbols
);
10330 dynamic_symbols
= NULL
;
10331 num_dynamic_syms
= 0;
10334 if (dynamic_syminfo
)
10336 free (dynamic_syminfo
);
10337 dynamic_syminfo
= NULL
;
10340 if (section_headers_groups
)
10342 free (section_headers_groups
);
10343 section_headers_groups
= NULL
;
10346 if (section_groups
)
10348 struct group_list
*g
, *next
;
10350 for (i
= 0; i
< group_count
; i
++)
10352 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
10359 free (section_groups
);
10360 section_groups
= NULL
;
10363 free_debug_memory ();
10368 /* Process an ELF archive.
10369 On entry the file is positioned just after the ARMAG string. */
10372 process_archive (char *file_name
, FILE *file
)
10374 struct ar_hdr arhdr
;
10376 unsigned long size
;
10377 unsigned long index_num
= 0;
10378 unsigned long *index_array
= NULL
;
10379 char *sym_table
= NULL
;
10380 unsigned long sym_size
= 0;
10381 char *longnames
= NULL
;
10382 unsigned long longnames_size
= 0;
10383 size_t file_name_size
;
10388 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10389 if (got
!= sizeof arhdr
)
10394 error (_("%s: failed to read archive header\n"), file_name
);
10398 /* See if this is the archive symbol table. */
10399 if (const_strneq (arhdr
.ar_name
, "/ ")
10400 || const_strneq (arhdr
.ar_name
, "/SYM64/ "))
10402 size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10403 size
= size
+ (size
& 1);
10405 if (do_archive_index
)
10408 /* A buffer used to hold numbers read in from an archive index.
10409 These are always 4 bytes long and stored in big-endian format. */
10410 #define SIZEOF_AR_INDEX_NUMBERS 4
10411 unsigned char integer_buffer
[SIZEOF_AR_INDEX_NUMBERS
];
10412 unsigned char * index_buffer
;
10414 /* Check the size of the archive index. */
10415 if (size
< SIZEOF_AR_INDEX_NUMBERS
)
10417 error (_("%s: the archive index is empty\n"), file_name
);
10421 /* Read the numer of entries in the archive index. */
10422 got
= fread (integer_buffer
, 1, sizeof integer_buffer
, file
);
10423 if (got
!= sizeof (integer_buffer
))
10425 error (_("%s: failed to read archive index\n"), file_name
);
10428 index_num
= byte_get_big_endian (integer_buffer
, sizeof integer_buffer
);
10429 size
-= SIZEOF_AR_INDEX_NUMBERS
;
10431 /* Read in the archive index. */
10432 if (size
< index_num
* SIZEOF_AR_INDEX_NUMBERS
)
10434 error (_("%s: the archive index is supposed to have %ld entries, but the size in the header is too small\n"),
10435 file_name
, index_num
);
10438 index_buffer
= malloc (index_num
* SIZEOF_AR_INDEX_NUMBERS
);
10439 if (index_buffer
== NULL
)
10441 error (_("Out of memory whilst trying to read archive symbol index\n"));
10444 got
= fread (index_buffer
, SIZEOF_AR_INDEX_NUMBERS
, index_num
, file
);
10445 if (got
!= index_num
)
10447 free (index_buffer
);
10448 error (_("%s: failed to read archive index\n"), file_name
);
10452 size
-= index_num
* SIZEOF_AR_INDEX_NUMBERS
;
10454 /* Convert the index numbers into the host's numeric format. */
10455 index_array
= malloc (index_num
* sizeof (* index_array
));
10456 if (index_array
== NULL
)
10458 free (index_buffer
);
10459 error (_("Out of memory whilst trying to convert the archive symbol index\n"));
10463 for (i
= 0; i
< index_num
; i
++)
10464 index_array
[i
] = byte_get_big_endian ((unsigned char *)(index_buffer
+ (i
* SIZEOF_AR_INDEX_NUMBERS
)),
10465 SIZEOF_AR_INDEX_NUMBERS
);
10466 free (index_buffer
);
10468 /* The remaining space in the header is taken up by the symbol table. */
10471 error (_("%s: the archive has an index but no symbols\n"), file_name
);
10475 sym_table
= malloc (size
);
10477 if (sym_table
== NULL
)
10479 error (_("Out of memory whilst trying to read archive index symbol table\n"));
10483 got
= fread (sym_table
, 1, size
, file
);
10486 error (_("%s: failed to read archive index symbol table\n"), file_name
);
10493 if (fseek (file
, size
, SEEK_CUR
) != 0)
10495 error (_("%s: failed to skip archive symbol table\n"), file_name
);
10500 got
= fread (& arhdr
, 1, sizeof arhdr
, file
);
10501 if (got
!= sizeof arhdr
)
10509 error (_("%s: failed to read archive header following archive index\n"), file_name
);
10514 else if (do_archive_index
)
10515 printf (_("%s has no archive index\n"), file_name
);
10517 if (const_strneq (arhdr
.ar_name
, "// "))
10519 /* This is the archive string table holding long member
10522 longnames_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10523 longnames
= malloc (longnames_size
);
10524 if (longnames
== NULL
)
10526 error (_("Out of memory reading long symbol names in archive\n"));
10531 if (fread (longnames
, longnames_size
, 1, file
) != 1)
10534 error (_("%s: failed to read long symbol name string table\n"), file_name
);
10539 if ((longnames_size
& 1) != 0)
10542 got
= fread (& arhdr
, 1, sizeof arhdr
, file
);
10543 if (got
!= sizeof arhdr
)
10549 error (_("%s: failed to read archive header following long symbol names\n"), file_name
);
10556 if (do_archive_index
)
10558 if (sym_table
== NULL
)
10559 error (_("%s: unable to dump the index as none was found\n"), file_name
);
10562 unsigned int i
, j
, k
, l
;
10564 unsigned long current_pos
;
10566 printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
10567 file_name
, index_num
, sym_size
);
10568 current_pos
= ftell (file
);
10570 for (i
= l
= 0; i
< index_num
; i
++)
10572 if ((i
== 0) || ((i
> 0) && (index_array
[i
] != index_array
[i
- 1])))
10574 if (fseek (file
, index_array
[i
], SEEK_SET
) != 0)
10576 error (_("%s: failed to seek to next file name\n"), file_name
);
10580 got
= fread (elf_name
, 1, 16, file
);
10583 error (_("%s: failed to read file name\n"), file_name
);
10588 if (elf_name
[0] == '/')
10590 /* We have a long name. */
10591 k
= j
= strtoul (elf_name
+ 1, NULL
, 10);
10592 while ((j
< longnames_size
) && (longnames
[j
] != '/'))
10594 longnames
[j
] = '\0';
10595 printf (_("Binary %s contains:\n"), longnames
+ k
);
10596 longnames
[j
] = '/';
10601 while ((elf_name
[j
] != '/') && (j
< 16))
10603 elf_name
[j
] = '\0';
10604 printf(_("Binary %s contains:\n"), elf_name
);
10609 error (_("%s: end of the symbol table reached before the end of the index\n"),
10613 printf ("\t%s\n", sym_table
+ l
);
10614 l
+= strlen (sym_table
+ l
) + 1;
10618 error (_("%s: symbols remain in the index symbol table, but without corresponding entries in the index table\n"),
10621 free (index_array
);
10622 index_array
= NULL
;
10625 if (fseek (file
, current_pos
, SEEK_SET
) != 0)
10627 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name
);
10632 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
10633 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
10634 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
10635 && !do_section_groups
)
10636 return 0; /* Archive index only. */
10639 file_name_size
= strlen (file_name
);
10648 if (arhdr
.ar_name
[0] == '/')
10652 off
= strtoul (arhdr
.ar_name
+ 1, NULL
, 10);
10653 if (off
>= longnames_size
)
10655 error (_("%s: invalid archive string table offset %lu\n"), file_name
, off
);
10660 name
= longnames
+ off
;
10661 nameend
= memchr (name
, '/', longnames_size
- off
);
10665 name
= arhdr
.ar_name
;
10666 nameend
= memchr (name
, '/', 16);
10669 if (nameend
== NULL
)
10671 error (_("%s: bad archive file name\n"), file_name
);
10676 namealc
= malloc (file_name_size
+ (nameend
- name
) + 3);
10677 if (namealc
== NULL
)
10679 error (_("Out of memory\n"));
10684 memcpy (namealc
, file_name
, file_name_size
);
10685 namealc
[file_name_size
] = '(';
10686 memcpy (namealc
+ file_name_size
+ 1, name
, nameend
- name
);
10687 namealc
[file_name_size
+ 1 + (nameend
- name
)] = ')';
10688 namealc
[file_name_size
+ 2 + (nameend
- name
)] = '\0';
10690 archive_file_offset
= ftell (file
);
10691 archive_file_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10693 ret
|= process_object (namealc
, file
);
10698 (archive_file_offset
10699 + archive_file_size
10700 + (archive_file_size
& 1)),
10703 error (_("%s: failed to seek to next archive header\n"), file_name
);
10708 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10709 if (got
!= sizeof arhdr
)
10714 error (_("%s: failed to read archive header\n"), file_name
);
10721 if (index_array
!= NULL
)
10722 free (index_array
);
10723 if (sym_table
!= NULL
)
10725 if (longnames
!= NULL
)
10732 process_file (char *file_name
)
10735 struct stat statbuf
;
10736 char armag
[SARMAG
];
10739 if (stat (file_name
, &statbuf
) < 0)
10741 if (errno
== ENOENT
)
10742 error (_("'%s': No such file\n"), file_name
);
10744 error (_("Could not locate '%s'. System error message: %s\n"),
10745 file_name
, strerror (errno
));
10749 if (! S_ISREG (statbuf
.st_mode
))
10751 error (_("'%s' is not an ordinary file\n"), file_name
);
10755 file
= fopen (file_name
, "rb");
10758 error (_("Input file '%s' is not readable.\n"), file_name
);
10762 if (fread (armag
, SARMAG
, 1, file
) != 1)
10764 error (_("%s: Failed to read file's magic number\n"), file_name
);
10769 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
10770 ret
= process_archive (file_name
, file
);
10773 if (do_archive_index
)
10774 error (_("File %s is not an archive so its index cannot be displayed.\n"),
10778 archive_file_size
= archive_file_offset
= 0;
10779 ret
= process_object (file_name
, file
);
10787 #ifdef SUPPORT_DISASSEMBLY
10788 /* Needed by the i386 disassembler. For extra credit, someone could
10789 fix this so that we insert symbolic addresses here, esp for GOT/PLT
10793 print_address (unsigned int addr
, FILE *outfile
)
10795 fprintf (outfile
,"0x%8.8x", addr
);
10798 /* Needed by the i386 disassembler. */
10800 db_task_printsym (unsigned int addr
)
10802 print_address (addr
, stderr
);
10807 main (int argc
, char **argv
)
10811 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
10812 setlocale (LC_MESSAGES
, "");
10814 #if defined (HAVE_SETLOCALE)
10815 setlocale (LC_CTYPE
, "");
10817 bindtextdomain (PACKAGE
, LOCALEDIR
);
10818 textdomain (PACKAGE
);
10820 expandargv (&argc
, &argv
);
10822 parse_args (argc
, argv
);
10824 if (num_dump_sects
> 0)
10826 /* Make a copy of the dump_sects array. */
10827 cmdline_dump_sects
= malloc (num_dump_sects
* sizeof (* dump_sects
));
10828 if (cmdline_dump_sects
== NULL
)
10829 error (_("Out of memory allocating dump request table.\n"));
10832 memcpy (cmdline_dump_sects
, dump_sects
,
10833 num_dump_sects
* sizeof (* dump_sects
));
10834 num_cmdline_dump_sects
= num_dump_sects
;
10838 if (optind
< (argc
- 1))
10842 while (optind
< argc
)
10843 err
|= process_file (argv
[optind
++]);
10845 if (dump_sects
!= NULL
)
10847 if (cmdline_dump_sects
!= NULL
)
10848 free (cmdline_dump_sects
);