1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3 2008, 2009 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. */
54 /* Define BFD64 here, even if our default architecture is 32 bit ELF
55 as this will allow us to read in and parse 64bit and 32bit ELF files.
56 Only do this if we believe that the compiler can support a 64 bit
57 data type. For now we only rely on GCC being able to do this. */
65 #include "elf/common.h"
66 #include "elf/external.h"
67 #include "elf/internal.h"
70 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
71 we can obtain the H8 reloc numbers. We need these for the
72 get_reloc_size() function. We include h8.h again after defining
73 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
78 /* Undo the effects of #including reloc-macros.h. */
80 #undef START_RELOC_NUMBERS
84 #undef END_RELOC_NUMBERS
85 #undef _RELOC_MACROS_H
87 /* The following headers use the elf/reloc-macros.h file to
88 automatically generate relocation recognition functions
89 such as elf_mips_reloc_type() */
91 #define RELOC_MACROS_GEN_FUNC
93 #include "elf/alpha.h"
101 #include "elf/d10v.h"
102 #include "elf/d30v.h"
104 #include "elf/fr30.h"
107 #include "elf/hppa.h"
108 #include "elf/i386.h"
109 #include "elf/i370.h"
110 #include "elf/i860.h"
111 #include "elf/i960.h"
112 #include "elf/ia64.h"
113 #include "elf/ip2k.h"
114 #include "elf/lm32.h"
115 #include "elf/iq2000.h"
116 #include "elf/m32c.h"
117 #include "elf/m32r.h"
118 #include "elf/m68k.h"
119 #include "elf/m68hc11.h"
120 #include "elf/mcore.h"
122 #include "elf/microblaze.h"
123 #include "elf/mips.h"
124 #include "elf/mmix.h"
125 #include "elf/mn10200.h"
126 #include "elf/mn10300.h"
128 #include "elf/msp430.h"
129 #include "elf/or32.h"
132 #include "elf/ppc64.h"
134 #include "elf/s390.h"
135 #include "elf/score.h"
137 #include "elf/sparc.h"
139 #include "elf/v850.h"
141 #include "elf/x86-64.h"
142 #include "elf/xc16x.h"
143 #include "elf/xstormy16.h"
144 #include "elf/xtensa.h"
149 #include "libiberty.h"
150 #include "safe-ctype.h"
151 #include "filenames.h"
153 char * program_name
= "readelf";
154 static long archive_file_offset
;
155 static unsigned long archive_file_size
;
156 static unsigned long dynamic_addr
;
157 static bfd_size_type dynamic_size
;
158 static unsigned int dynamic_nent
;
159 static char * dynamic_strings
;
160 static unsigned long dynamic_strings_length
;
161 static char * string_table
;
162 static unsigned long string_table_length
;
163 static unsigned long num_dynamic_syms
;
164 static Elf_Internal_Sym
* dynamic_symbols
;
165 static Elf_Internal_Syminfo
* dynamic_syminfo
;
166 static unsigned long dynamic_syminfo_offset
;
167 static unsigned int dynamic_syminfo_nent
;
168 static char program_interpreter
[PATH_MAX
];
169 static bfd_vma dynamic_info
[DT_ENCODING
];
170 static bfd_vma dynamic_info_DT_GNU_HASH
;
171 static bfd_vma version_info
[16];
172 static Elf_Internal_Ehdr elf_header
;
173 static Elf_Internal_Shdr
* section_headers
;
174 static Elf_Internal_Phdr
* program_headers
;
175 static Elf_Internal_Dyn
* dynamic_section
;
176 static Elf_Internal_Shdr
* symtab_shndx_hdr
;
177 static int show_name
;
178 static int do_dynamic
;
181 static int do_sections
;
182 static int do_section_groups
;
183 static int do_section_details
;
184 static int do_segments
;
185 static int do_unwind
;
186 static int do_using_dynamic
;
187 static int do_header
;
189 static int do_version
;
190 static int do_histogram
;
191 static int do_debugging
;
194 static int do_archive_index
;
195 static int is_32bit_elf
;
199 struct group_list
* next
;
200 unsigned int section_index
;
205 struct group_list
* root
;
206 unsigned int group_index
;
209 static size_t group_count
;
210 static struct group
* section_groups
;
211 static struct group
** section_headers_groups
;
214 /* Flag bits indicating particular types of dump. */
215 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
216 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
217 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
218 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
219 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
221 typedef unsigned char dump_type
;
223 /* A linked list of the section names for which dumps were requested. */
224 struct dump_list_entry
228 struct dump_list_entry
* next
;
230 static struct dump_list_entry
* dump_sects_byname
;
232 /* A dynamic array of flags indicating for which sections a dump
233 has been requested via command line switches. */
234 static dump_type
* cmdline_dump_sects
= NULL
;
235 static unsigned int num_cmdline_dump_sects
= 0;
237 /* A dynamic array of flags indicating for which sections a dump of
238 some kind has been requested. It is reset on a per-object file
239 basis and then initialised from the cmdline_dump_sects array,
240 the results of interpreting the -w switch, and the
241 dump_sects_byname list. */
242 static dump_type
* dump_sects
= NULL
;
243 static unsigned int num_dump_sects
= 0;
246 /* How to print a vma value. */
247 typedef enum print_mode
259 static void (* byte_put
) (unsigned char *, bfd_vma
, int);
263 #define SECTION_NAME(X) \
264 ((X) == NULL ? "<none>" \
265 : string_table == NULL ? "<no-name>" \
266 : ((X)->sh_name >= string_table_length ? "<corrupt>" \
267 : string_table + (X)->sh_name))
269 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
271 #define BYTE_GET(field) byte_get (field, sizeof (field))
273 #define GET_ELF_SYMBOLS(file, section) \
274 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
275 : get_64bit_elf_symbols (file, section))
277 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
278 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
279 already been called and verified that the string exists. */
280 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
282 /* This is just a bit of syntatic sugar. */
283 #define streq(a,b) (strcmp ((a), (b)) == 0)
284 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
285 #define const_strneq(a,b) (strncmp ((a), (b), sizeof (b) - 1) == 0)
288 get_data (void * var
, FILE * file
, long offset
, size_t size
, size_t nmemb
,
293 if (size
== 0 || nmemb
== 0)
296 if (fseek (file
, archive_file_offset
+ offset
, SEEK_SET
))
298 error (_("Unable to seek to 0x%lx for %s\n"),
299 (unsigned long) archive_file_offset
+ offset
, reason
);
306 /* Check for overflow. */
307 if (nmemb
< (~(size_t) 0 - 1) / size
)
308 /* + 1 so that we can '\0' terminate invalid string table sections. */
309 mvar
= malloc (size
* nmemb
+ 1);
313 error (_("Out of memory allocating 0x%lx bytes for %s\n"),
314 (unsigned long)(size
* nmemb
), reason
);
318 ((char *) mvar
)[size
* nmemb
] = '\0';
321 if (fread (mvar
, size
, nmemb
, file
) != nmemb
)
323 error (_("Unable to read in 0x%lx bytes of %s\n"),
324 (unsigned long)(size
* nmemb
), reason
);
334 byte_put_little_endian (unsigned char * field
, bfd_vma value
, int size
)
339 field
[7] = (((value
>> 24) >> 24) >> 8) & 0xff;
340 field
[6] = ((value
>> 24) >> 24) & 0xff;
341 field
[5] = ((value
>> 24) >> 16) & 0xff;
342 field
[4] = ((value
>> 24) >> 8) & 0xff;
345 field
[3] = (value
>> 24) & 0xff;
348 field
[2] = (value
>> 16) & 0xff;
351 field
[1] = (value
>> 8) & 0xff;
354 field
[0] = value
& 0xff;
358 error (_("Unhandled data length: %d\n"), size
);
363 /* Print a VMA value. */
366 print_vma (bfd_vma vma
, print_mode mode
)
379 return nc
+ printf ("%8.8" BFD_VMA_FMT
"x", vma
);
386 return printf ("%5" BFD_VMA_FMT
"d", vma
);
394 return nc
+ printf ("%" BFD_VMA_FMT
"x", vma
);
397 return printf ("%" BFD_VMA_FMT
"d", vma
);
400 return printf ("%" BFD_VMA_FMT
"u", vma
);
405 /* Display a symbol on stdout. Handles the display of non-printing characters.
407 If DO_WIDE is not true then format the symbol to be at most WIDTH characters,
408 truncating as necessary. If WIDTH is negative then format the string to be
409 exactly - WIDTH characters, truncating or padding as necessary.
411 Returns the number of emitted characters. */
414 print_symbol (int width
, const char * symbol
)
417 bfd_boolean extra_padding
= FALSE
;
418 unsigned int num_printed
= 0;
422 /* Set the width to a very large value. This simplifies the code below. */
427 /* Keep the width positive. This also helps. */
429 extra_padding
= TRUE
;
438 /* Look for non-printing symbols inside the symbol's name.
439 This test is triggered in particular by the names generated
440 by the assembler for local labels. */
441 while (ISPRINT (* c
))
451 printf ("%.*s", len
, symbol
);
457 if (* c
== 0 || width
== 0)
460 /* Now display the non-printing character, if
461 there is room left in which to dipslay it. */
467 printf ("^%c", *c
+ 0x40);
477 printf ("<0x%.2x>", *c
);
486 if (extra_padding
&& width
> 0)
488 /* Fill in the remaining spaces. */
489 printf ("%-*s", width
, " ");
497 byte_put_big_endian (unsigned char * field
, bfd_vma value
, int size
)
502 field
[7] = value
& 0xff;
503 field
[6] = (value
>> 8) & 0xff;
504 field
[5] = (value
>> 16) & 0xff;
505 field
[4] = (value
>> 24) & 0xff;
510 field
[3] = value
& 0xff;
514 field
[2] = value
& 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
:
592 case EM_LATTICEMICO32
:
600 case EM_CYGNUS_MN10200
:
602 case EM_CYGNUS_MN10300
:
626 case EM_MICROBLAZE_OLD
:
647 warn (_("Don't know about relocations on this machine architecture\n"));
653 slurp_rela_relocs (FILE * file
,
654 unsigned long rel_offset
,
655 unsigned long rel_size
,
656 Elf_Internal_Rela
** relasp
,
657 unsigned long * nrelasp
)
659 Elf_Internal_Rela
* relas
;
660 unsigned long nrelas
;
665 Elf32_External_Rela
* erelas
;
667 erelas
= (Elf32_External_Rela
*) get_data (NULL
, file
, rel_offset
, 1,
668 rel_size
, _("relocs"));
672 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
674 relas
= (Elf_Internal_Rela
*) cmalloc (nrelas
,
675 sizeof (Elf_Internal_Rela
));
680 error (_("out of memory parsing relocs\n"));
684 for (i
= 0; i
< nrelas
; i
++)
686 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
687 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
688 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
695 Elf64_External_Rela
* erelas
;
697 erelas
= (Elf64_External_Rela
*) get_data (NULL
, file
, rel_offset
, 1,
698 rel_size
, _("relocs"));
702 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
704 relas
= (Elf_Internal_Rela
*) cmalloc (nrelas
,
705 sizeof (Elf_Internal_Rela
));
710 error (_("out of memory parsing relocs\n"));
714 for (i
= 0; i
< nrelas
; i
++)
716 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
717 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
718 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
720 /* The #ifdef BFD64 below is to prevent a compile time
721 warning. We know that if we do not have a 64 bit data
722 type that we will never execute this code anyway. */
724 if (elf_header
.e_machine
== EM_MIPS
725 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
727 /* In little-endian objects, r_info isn't really a
728 64-bit little-endian value: it has a 32-bit
729 little-endian symbol index followed by four
730 individual byte fields. Reorder INFO
732 bfd_vma info
= relas
[i
].r_info
;
733 info
= (((info
& 0xffffffff) << 32)
734 | ((info
>> 56) & 0xff)
735 | ((info
>> 40) & 0xff00)
736 | ((info
>> 24) & 0xff0000)
737 | ((info
>> 8) & 0xff000000));
738 relas
[i
].r_info
= info
;
751 slurp_rel_relocs (FILE * file
,
752 unsigned long rel_offset
,
753 unsigned long rel_size
,
754 Elf_Internal_Rela
** relsp
,
755 unsigned long * nrelsp
)
757 Elf_Internal_Rela
* rels
;
763 Elf32_External_Rel
* erels
;
765 erels
= (Elf32_External_Rel
*) get_data (NULL
, file
, rel_offset
, 1,
766 rel_size
, _("relocs"));
770 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
772 rels
= (Elf_Internal_Rela
*) cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
777 error (_("out of memory parsing relocs\n"));
781 for (i
= 0; i
< nrels
; i
++)
783 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
784 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
785 rels
[i
].r_addend
= 0;
792 Elf64_External_Rel
* erels
;
794 erels
= (Elf64_External_Rel
*) get_data (NULL
, file
, rel_offset
, 1,
795 rel_size
, _("relocs"));
799 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
801 rels
= (Elf_Internal_Rela
*) cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
806 error (_("out of memory parsing relocs\n"));
810 for (i
= 0; i
< nrels
; i
++)
812 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
813 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
814 rels
[i
].r_addend
= 0;
816 /* The #ifdef BFD64 below is to prevent a compile time
817 warning. We know that if we do not have a 64 bit data
818 type that we will never execute this code anyway. */
820 if (elf_header
.e_machine
== EM_MIPS
821 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
823 /* In little-endian objects, r_info isn't really a
824 64-bit little-endian value: it has a 32-bit
825 little-endian symbol index followed by four
826 individual byte fields. Reorder INFO
828 bfd_vma info
= rels
[i
].r_info
;
829 info
= (((info
& 0xffffffff) << 32)
830 | ((info
>> 56) & 0xff)
831 | ((info
>> 40) & 0xff00)
832 | ((info
>> 24) & 0xff0000)
833 | ((info
>> 8) & 0xff000000));
834 rels
[i
].r_info
= info
;
846 /* Returns the reloc type extracted from the reloc info field. */
849 get_reloc_type (bfd_vma reloc_info
)
852 return ELF32_R_TYPE (reloc_info
);
854 switch (elf_header
.e_machine
)
857 /* Note: We assume that reloc_info has already been adjusted for us. */
858 return ELF64_MIPS_R_TYPE (reloc_info
);
861 return ELF64_R_TYPE_ID (reloc_info
);
864 return ELF64_R_TYPE (reloc_info
);
868 /* Return the symbol index extracted from the reloc info field. */
871 get_reloc_symindex (bfd_vma reloc_info
)
873 return is_32bit_elf
? ELF32_R_SYM (reloc_info
) : ELF64_R_SYM (reloc_info
);
876 /* Display the contents of the relocation data found at the specified
880 dump_relocations (FILE * file
,
881 unsigned long rel_offset
,
882 unsigned long rel_size
,
883 Elf_Internal_Sym
* symtab
,
886 unsigned long strtablen
,
890 Elf_Internal_Rela
* rels
;
892 if (is_rela
== UNKNOWN
)
893 is_rela
= guess_is_rela (elf_header
.e_machine
);
897 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
902 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
911 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
913 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
918 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
920 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
928 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
930 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
935 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
937 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
941 for (i
= 0; i
< rel_size
; i
++)
946 bfd_vma symtab_index
;
949 offset
= rels
[i
].r_offset
;
950 info
= rels
[i
].r_info
;
952 type
= get_reloc_type (info
);
953 symtab_index
= get_reloc_symindex (info
);
957 printf ("%8.8lx %8.8lx ",
958 (unsigned long) offset
& 0xffffffff,
959 (unsigned long) info
& 0xffffffff);
963 #if BFD_HOST_64BIT_LONG
965 ? "%16.16lx %16.16lx "
966 : "%12.12lx %12.12lx ",
968 #elif BFD_HOST_64BIT_LONG_LONG
971 ? "%16.16llx %16.16llx "
972 : "%12.12llx %12.12llx ",
976 ? "%16.16I64x %16.16I64x "
977 : "%12.12I64x %12.12I64x ",
982 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
983 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
984 _bfd_int64_high (offset
),
985 _bfd_int64_low (offset
),
986 _bfd_int64_high (info
),
987 _bfd_int64_low (info
));
991 switch (elf_header
.e_machine
)
999 rtype
= elf_m32r_reloc_type (type
);
1004 rtype
= elf_i386_reloc_type (type
);
1009 rtype
= elf_m68hc11_reloc_type (type
);
1013 rtype
= elf_m68k_reloc_type (type
);
1017 rtype
= elf_i960_reloc_type (type
);
1022 rtype
= elf_avr_reloc_type (type
);
1025 case EM_OLD_SPARCV9
:
1026 case EM_SPARC32PLUS
:
1029 rtype
= elf_sparc_reloc_type (type
);
1033 rtype
= elf_spu_reloc_type (type
);
1037 case EM_CYGNUS_V850
:
1038 rtype
= v850_reloc_type (type
);
1042 case EM_CYGNUS_D10V
:
1043 rtype
= elf_d10v_reloc_type (type
);
1047 case EM_CYGNUS_D30V
:
1048 rtype
= elf_d30v_reloc_type (type
);
1052 rtype
= elf_dlx_reloc_type (type
);
1056 rtype
= elf_sh_reloc_type (type
);
1060 case EM_CYGNUS_MN10300
:
1061 rtype
= elf_mn10300_reloc_type (type
);
1065 case EM_CYGNUS_MN10200
:
1066 rtype
= elf_mn10200_reloc_type (type
);
1070 case EM_CYGNUS_FR30
:
1071 rtype
= elf_fr30_reloc_type (type
);
1075 rtype
= elf_frv_reloc_type (type
);
1079 rtype
= elf_mcore_reloc_type (type
);
1083 rtype
= elf_mmix_reloc_type (type
);
1088 rtype
= elf_msp430_reloc_type (type
);
1092 rtype
= elf_ppc_reloc_type (type
);
1096 rtype
= elf_ppc64_reloc_type (type
);
1100 case EM_MIPS_RS3_LE
:
1101 rtype
= elf_mips_reloc_type (type
);
1105 rtype
= elf_alpha_reloc_type (type
);
1109 rtype
= elf_arm_reloc_type (type
);
1113 rtype
= elf_arc_reloc_type (type
);
1117 rtype
= elf_hppa_reloc_type (type
);
1123 rtype
= elf_h8_reloc_type (type
);
1128 rtype
= elf_or32_reloc_type (type
);
1133 rtype
= elf_pj_reloc_type (type
);
1136 rtype
= elf_ia64_reloc_type (type
);
1140 rtype
= elf_cris_reloc_type (type
);
1144 rtype
= elf_i860_reloc_type (type
);
1149 rtype
= elf_x86_64_reloc_type (type
);
1153 rtype
= i370_reloc_type (type
);
1158 rtype
= elf_s390_reloc_type (type
);
1162 rtype
= elf_score_reloc_type (type
);
1166 rtype
= elf_xstormy16_reloc_type (type
);
1170 rtype
= elf_crx_reloc_type (type
);
1174 rtype
= elf_vax_reloc_type (type
);
1179 rtype
= elf_ip2k_reloc_type (type
);
1183 rtype
= elf_iq2000_reloc_type (type
);
1188 rtype
= elf_xtensa_reloc_type (type
);
1191 case EM_LATTICEMICO32
:
1192 rtype
= elf_lm32_reloc_type (type
);
1197 rtype
= elf_m32c_reloc_type (type
);
1201 rtype
= elf_mt_reloc_type (type
);
1205 rtype
= elf_bfin_reloc_type (type
);
1209 rtype
= elf_mep_reloc_type (type
);
1214 rtype
= elf_cr16_reloc_type (type
);
1218 case EM_MICROBLAZE_OLD
:
1219 rtype
= elf_microblaze_reloc_type (type
);
1223 rtype
= elf_rx_reloc_type (type
);
1228 rtype
= elf_xc16x_reloc_type (type
);
1233 printf (_("unrecognized: %-7lx"), (unsigned long) type
& 0xffffffff);
1235 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1237 if (elf_header
.e_machine
== EM_ALPHA
1239 && streq (rtype
, "R_ALPHA_LITUSE")
1242 switch (rels
[i
].r_addend
)
1244 case LITUSE_ALPHA_ADDR
: rtype
= "ADDR"; break;
1245 case LITUSE_ALPHA_BASE
: rtype
= "BASE"; break;
1246 case LITUSE_ALPHA_BYTOFF
: rtype
= "BYTOFF"; break;
1247 case LITUSE_ALPHA_JSR
: rtype
= "JSR"; break;
1248 case LITUSE_ALPHA_TLSGD
: rtype
= "TLSGD"; break;
1249 case LITUSE_ALPHA_TLSLDM
: rtype
= "TLSLDM"; break;
1250 case LITUSE_ALPHA_JSRDIRECT
: rtype
= "JSRDIRECT"; break;
1251 default: rtype
= NULL
;
1254 printf (" (%s)", rtype
);
1258 printf (_("<unknown addend: %lx>"),
1259 (unsigned long) rels
[i
].r_addend
);
1262 else if (symtab_index
)
1264 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1265 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1268 Elf_Internal_Sym
* psym
;
1270 psym
= symtab
+ symtab_index
;
1274 if (ELF_ST_TYPE (psym
->st_info
) == STT_GNU_IFUNC
)
1278 unsigned int width
= is_32bit_elf
? 8 : 14;
1280 /* Relocations against GNU_IFUNC symbols do not use the value
1281 of the symbol as the address to relocate against. Instead
1282 they invoke the function named by the symbol and use its
1283 result as the address for relocation.
1285 To indicate this to the user, do not display the value of
1286 the symbol in the "Symbols's Value" field. Instead show
1287 its name followed by () as a hint that the symbol is
1291 || psym
->st_name
== 0
1292 || psym
->st_name
>= strtablen
)
1295 name
= strtab
+ psym
->st_name
;
1297 len
= print_symbol (width
, name
);
1298 printf ("()%-*s", len
<= width
? (width
+ 1) - len
: 1, " ");
1302 print_vma (psym
->st_value
, LONG_HEX
);
1304 printf (is_32bit_elf
? " " : " ");
1307 if (psym
->st_name
== 0)
1309 const char * sec_name
= "<null>";
1312 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1314 if (psym
->st_shndx
< elf_header
.e_shnum
)
1316 = SECTION_NAME (section_headers
+ psym
->st_shndx
);
1317 else if (psym
->st_shndx
== SHN_ABS
)
1319 else if (psym
->st_shndx
== SHN_COMMON
)
1320 sec_name
= "COMMON";
1321 else if (elf_header
.e_machine
== EM_MIPS
1322 && psym
->st_shndx
== SHN_MIPS_SCOMMON
)
1323 sec_name
= "SCOMMON";
1324 else if (elf_header
.e_machine
== EM_MIPS
1325 && psym
->st_shndx
== SHN_MIPS_SUNDEFINED
)
1326 sec_name
= "SUNDEF";
1327 else if ((elf_header
.e_machine
== EM_X86_64
1328 || elf_header
.e_machine
== EM_L1OM
)
1329 && psym
->st_shndx
== SHN_X86_64_LCOMMON
)
1330 sec_name
= "LARGE_COMMON";
1331 else if (elf_header
.e_machine
== EM_IA_64
1332 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1333 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1334 sec_name
= "ANSI_COM";
1335 else if (elf_header
.e_machine
== EM_IA_64
1336 && (elf_header
.e_ident
[EI_OSABI
]
1337 == ELFOSABI_OPENVMS
)
1338 && psym
->st_shndx
== SHN_IA_64_VMS_SYMVEC
)
1339 sec_name
= "VMS_SYMVEC";
1342 sprintf (name_buf
, "<section 0x%x>",
1343 (unsigned int) psym
->st_shndx
);
1344 sec_name
= name_buf
;
1347 print_symbol (22, sec_name
);
1349 else if (strtab
== NULL
)
1350 printf (_("<string table index: %3ld>"), psym
->st_name
);
1351 else if (psym
->st_name
>= strtablen
)
1352 printf (_("<corrupt string table index: %3ld>"), psym
->st_name
);
1354 print_symbol (22, strtab
+ psym
->st_name
);
1358 long offset
= (long) (bfd_signed_vma
) rels
[i
].r_addend
;
1361 printf (" - %lx", - offset
);
1363 printf (" + %lx", offset
);
1369 printf ("%*c", is_32bit_elf
?
1370 (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1371 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1374 if (elf_header
.e_machine
== EM_SPARCV9
1376 && streq (rtype
, "R_SPARC_OLO10"))
1377 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1382 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1384 bfd_vma type2
= ELF64_MIPS_R_TYPE2 (info
);
1385 bfd_vma type3
= ELF64_MIPS_R_TYPE3 (info
);
1386 const char * rtype2
= elf_mips_reloc_type (type2
);
1387 const char * rtype3
= elf_mips_reloc_type (type3
);
1389 printf (" Type2: ");
1392 printf (_("unrecognized: %-7lx"),
1393 (unsigned long) type2
& 0xffffffff);
1395 printf ("%-17.17s", rtype2
);
1397 printf ("\n Type3: ");
1400 printf (_("unrecognized: %-7lx"),
1401 (unsigned long) type3
& 0xffffffff);
1403 printf ("%-17.17s", rtype3
);
1414 get_mips_dynamic_type (unsigned long type
)
1418 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1419 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1420 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1421 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1422 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1423 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1424 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1425 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1426 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1427 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1428 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1429 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1430 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1431 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1432 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1433 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1434 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1435 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1436 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1437 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1438 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1439 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1440 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1441 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1442 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1443 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1444 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1445 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1446 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1447 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1448 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1449 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1450 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1451 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1452 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1453 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1454 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1455 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1456 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1457 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1458 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1459 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1460 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1461 case DT_MIPS_PLTGOT
: return "MIPS_PLTGOT";
1462 case DT_MIPS_RWPLT
: return "MIPS_RWPLT";
1469 get_sparc64_dynamic_type (unsigned long type
)
1473 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1480 get_ppc_dynamic_type (unsigned long type
)
1484 case DT_PPC_GOT
: return "PPC_GOT";
1485 case DT_PPC_TLSOPT
: return "PPC_TLSOPT";
1492 get_ppc64_dynamic_type (unsigned long type
)
1496 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1497 case DT_PPC64_OPD
: return "PPC64_OPD";
1498 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1499 case DT_PPC64_TLSOPT
: return "PPC64_TLSOPT";
1506 get_parisc_dynamic_type (unsigned long type
)
1510 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1511 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1512 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1513 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1514 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1515 case DT_HP_PREINIT
: return "HP_PREINIT";
1516 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1517 case DT_HP_NEEDED
: return "HP_NEEDED";
1518 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1519 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1520 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1521 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1522 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1523 case DT_HP_EPLTREL
: return "HP_GST_EPLTREL";
1524 case DT_HP_EPLTRELSZ
: return "HP_GST_EPLTRELSZ";
1525 case DT_HP_FILTERED
: return "HP_FILTERED";
1526 case DT_HP_FILTER_TLS
: return "HP_FILTER_TLS";
1527 case DT_HP_COMPAT_FILTERED
: return "HP_COMPAT_FILTERED";
1528 case DT_HP_LAZYLOAD
: return "HP_LAZYLOAD";
1529 case DT_HP_BIND_NOW_COUNT
: return "HP_BIND_NOW_COUNT";
1530 case DT_PLT
: return "PLT";
1531 case DT_PLT_SIZE
: return "PLT_SIZE";
1532 case DT_DLT
: return "DLT";
1533 case DT_DLT_SIZE
: return "DLT_SIZE";
1540 get_ia64_dynamic_type (unsigned long type
)
1544 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1545 case DT_IA_64_VMS_SUBTYPE
: return "VMS_SUBTYPE";
1546 case DT_IA_64_VMS_IMGIOCNT
: return "VMS_IMGIOCNT";
1547 case DT_IA_64_VMS_LNKFLAGS
: return "VMS_LNKFLAGS";
1548 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ
: return "VMS_VIR_MEM_BLK_SIZ";
1549 case DT_IA_64_VMS_IDENT
: return "VMS_IDENT";
1550 case DT_IA_64_VMS_NEEDED_IDENT
: return "VMS_NEEDED_IDENT";
1551 case DT_IA_64_VMS_IMG_RELA_CNT
: return "VMS_IMG_RELA_CNT";
1552 case DT_IA_64_VMS_SEG_RELA_CNT
: return "VMS_SEG_RELA_CNT";
1553 case DT_IA_64_VMS_FIXUP_RELA_CNT
: return "VMS_FIXUP_RELA_CNT";
1554 case DT_IA_64_VMS_FIXUP_NEEDED
: return "VMS_FIXUP_NEEDED";
1555 case DT_IA_64_VMS_SYMVEC_CNT
: return "VMS_SYMVEC_CNT";
1556 case DT_IA_64_VMS_XLATED
: return "VMS_XLATED";
1557 case DT_IA_64_VMS_STACKSIZE
: return "VMS_STACKSIZE";
1558 case DT_IA_64_VMS_UNWINDSZ
: return "VMS_UNWINDSZ";
1559 case DT_IA_64_VMS_UNWIND_CODSEG
: return "VMS_UNWIND_CODSEG";
1560 case DT_IA_64_VMS_UNWIND_INFOSEG
: return "VMS_UNWIND_INFOSEG";
1561 case DT_IA_64_VMS_LINKTIME
: return "VMS_LINKTIME";
1562 case DT_IA_64_VMS_SEG_NO
: return "VMS_SEG_NO";
1563 case DT_IA_64_VMS_SYMVEC_OFFSET
: return "VMS_SYMVEC_OFFSET";
1564 case DT_IA_64_VMS_SYMVEC_SEG
: return "VMS_SYMVEC_SEG";
1565 case DT_IA_64_VMS_UNWIND_OFFSET
: return "VMS_UNWIND_OFFSET";
1566 case DT_IA_64_VMS_UNWIND_SEG
: return "VMS_UNWIND_SEG";
1567 case DT_IA_64_VMS_STRTAB_OFFSET
: return "VMS_STRTAB_OFFSET";
1568 case DT_IA_64_VMS_SYSVER_OFFSET
: return "VMS_SYSVER_OFFSET";
1569 case DT_IA_64_VMS_IMG_RELA_OFF
: return "VMS_IMG_RELA_OFF";
1570 case DT_IA_64_VMS_SEG_RELA_OFF
: return "VMS_SEG_RELA_OFF";
1571 case DT_IA_64_VMS_FIXUP_RELA_OFF
: return "VMS_FIXUP_RELA_OFF";
1572 case DT_IA_64_VMS_PLTGOT_OFFSET
: return "VMS_PLTGOT_OFFSET";
1573 case DT_IA_64_VMS_PLTGOT_SEG
: return "VMS_PLTGOT_SEG";
1574 case DT_IA_64_VMS_FPMODE
: return "VMS_FPMODE";
1581 get_alpha_dynamic_type (unsigned long type
)
1585 case DT_ALPHA_PLTRO
: return "ALPHA_PLTRO";
1592 get_score_dynamic_type (unsigned long type
)
1596 case DT_SCORE_BASE_ADDRESS
: return "SCORE_BASE_ADDRESS";
1597 case DT_SCORE_LOCAL_GOTNO
: return "SCORE_LOCAL_GOTNO";
1598 case DT_SCORE_SYMTABNO
: return "SCORE_SYMTABNO";
1599 case DT_SCORE_GOTSYM
: return "SCORE_GOTSYM";
1600 case DT_SCORE_UNREFEXTNO
: return "SCORE_UNREFEXTNO";
1601 case DT_SCORE_HIPAGENO
: return "SCORE_HIPAGENO";
1609 get_dynamic_type (unsigned long type
)
1611 static char buff
[64];
1615 case DT_NULL
: return "NULL";
1616 case DT_NEEDED
: return "NEEDED";
1617 case DT_PLTRELSZ
: return "PLTRELSZ";
1618 case DT_PLTGOT
: return "PLTGOT";
1619 case DT_HASH
: return "HASH";
1620 case DT_STRTAB
: return "STRTAB";
1621 case DT_SYMTAB
: return "SYMTAB";
1622 case DT_RELA
: return "RELA";
1623 case DT_RELASZ
: return "RELASZ";
1624 case DT_RELAENT
: return "RELAENT";
1625 case DT_STRSZ
: return "STRSZ";
1626 case DT_SYMENT
: return "SYMENT";
1627 case DT_INIT
: return "INIT";
1628 case DT_FINI
: return "FINI";
1629 case DT_SONAME
: return "SONAME";
1630 case DT_RPATH
: return "RPATH";
1631 case DT_SYMBOLIC
: return "SYMBOLIC";
1632 case DT_REL
: return "REL";
1633 case DT_RELSZ
: return "RELSZ";
1634 case DT_RELENT
: return "RELENT";
1635 case DT_PLTREL
: return "PLTREL";
1636 case DT_DEBUG
: return "DEBUG";
1637 case DT_TEXTREL
: return "TEXTREL";
1638 case DT_JMPREL
: return "JMPREL";
1639 case DT_BIND_NOW
: return "BIND_NOW";
1640 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1641 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1642 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1643 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1644 case DT_RUNPATH
: return "RUNPATH";
1645 case DT_FLAGS
: return "FLAGS";
1647 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1648 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1650 case DT_CHECKSUM
: return "CHECKSUM";
1651 case DT_PLTPADSZ
: return "PLTPADSZ";
1652 case DT_MOVEENT
: return "MOVEENT";
1653 case DT_MOVESZ
: return "MOVESZ";
1654 case DT_FEATURE
: return "FEATURE";
1655 case DT_POSFLAG_1
: return "POSFLAG_1";
1656 case DT_SYMINSZ
: return "SYMINSZ";
1657 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1659 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1660 case DT_CONFIG
: return "CONFIG";
1661 case DT_DEPAUDIT
: return "DEPAUDIT";
1662 case DT_AUDIT
: return "AUDIT";
1663 case DT_PLTPAD
: return "PLTPAD";
1664 case DT_MOVETAB
: return "MOVETAB";
1665 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1667 case DT_VERSYM
: return "VERSYM";
1669 case DT_TLSDESC_GOT
: return "TLSDESC_GOT";
1670 case DT_TLSDESC_PLT
: return "TLSDESC_PLT";
1671 case DT_RELACOUNT
: return "RELACOUNT";
1672 case DT_RELCOUNT
: return "RELCOUNT";
1673 case DT_FLAGS_1
: return "FLAGS_1";
1674 case DT_VERDEF
: return "VERDEF";
1675 case DT_VERDEFNUM
: return "VERDEFNUM";
1676 case DT_VERNEED
: return "VERNEED";
1677 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1679 case DT_AUXILIARY
: return "AUXILIARY";
1680 case DT_USED
: return "USED";
1681 case DT_FILTER
: return "FILTER";
1683 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1684 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1685 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1686 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1687 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1688 case DT_GNU_HASH
: return "GNU_HASH";
1691 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1693 const char * result
;
1695 switch (elf_header
.e_machine
)
1698 case EM_MIPS_RS3_LE
:
1699 result
= get_mips_dynamic_type (type
);
1702 result
= get_sparc64_dynamic_type (type
);
1705 result
= get_ppc_dynamic_type (type
);
1708 result
= get_ppc64_dynamic_type (type
);
1711 result
= get_ia64_dynamic_type (type
);
1714 result
= get_alpha_dynamic_type (type
);
1717 result
= get_score_dynamic_type (type
);
1727 snprintf (buff
, sizeof (buff
), _("Processor Specific: %lx"), type
);
1729 else if (((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1730 || (elf_header
.e_machine
== EM_PARISC
1731 && (type
>= OLD_DT_LOOS
) && (type
<= OLD_DT_HIOS
)))
1733 const char * result
;
1735 switch (elf_header
.e_machine
)
1738 result
= get_parisc_dynamic_type (type
);
1741 result
= get_ia64_dynamic_type (type
);
1751 snprintf (buff
, sizeof (buff
), _("Operating System specific: %lx"),
1755 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), type
);
1762 get_file_type (unsigned e_type
)
1764 static char buff
[32];
1768 case ET_NONE
: return _("NONE (None)");
1769 case ET_REL
: return _("REL (Relocatable file)");
1770 case ET_EXEC
: return _("EXEC (Executable file)");
1771 case ET_DYN
: return _("DYN (Shared object file)");
1772 case ET_CORE
: return _("CORE (Core file)");
1775 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1776 snprintf (buff
, sizeof (buff
), _("Processor Specific: (%x)"), e_type
);
1777 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1778 snprintf (buff
, sizeof (buff
), _("OS Specific: (%x)"), e_type
);
1780 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_type
);
1786 get_machine_name (unsigned e_machine
)
1788 static char buff
[64]; /* XXX */
1792 case EM_NONE
: return _("None");
1793 case EM_M32
: return "WE32100";
1794 case EM_SPARC
: return "Sparc";
1795 case EM_SPU
: return "SPU";
1796 case EM_386
: return "Intel 80386";
1797 case EM_68K
: return "MC68000";
1798 case EM_88K
: return "MC88000";
1799 case EM_486
: return "Intel 80486";
1800 case EM_860
: return "Intel 80860";
1801 case EM_MIPS
: return "MIPS R3000";
1802 case EM_S370
: return "IBM System/370";
1803 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1804 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1805 case EM_PARISC
: return "HPPA";
1806 case EM_PPC_OLD
: return "Power PC (old)";
1807 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1808 case EM_960
: return "Intel 90860";
1809 case EM_PPC
: return "PowerPC";
1810 case EM_PPC64
: return "PowerPC64";
1811 case EM_V800
: return "NEC V800";
1812 case EM_FR20
: return "Fujitsu FR20";
1813 case EM_RH32
: return "TRW RH32";
1814 case EM_MCORE
: return "MCORE";
1815 case EM_ARM
: return "ARM";
1816 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1817 case EM_SH
: return "Renesas / SuperH SH";
1818 case EM_SPARCV9
: return "Sparc v9";
1819 case EM_TRICORE
: return "Siemens Tricore";
1820 case EM_ARC
: return "ARC";
1821 case EM_H8_300
: return "Renesas H8/300";
1822 case EM_H8_300H
: return "Renesas H8/300H";
1823 case EM_H8S
: return "Renesas H8S";
1824 case EM_H8_500
: return "Renesas H8/500";
1825 case EM_IA_64
: return "Intel IA-64";
1826 case EM_MIPS_X
: return "Stanford MIPS-X";
1827 case EM_COLDFIRE
: return "Motorola Coldfire";
1828 case EM_68HC12
: return "Motorola M68HC12";
1829 case EM_ALPHA
: return "Alpha";
1830 case EM_CYGNUS_D10V
:
1831 case EM_D10V
: return "d10v";
1832 case EM_CYGNUS_D30V
:
1833 case EM_D30V
: return "d30v";
1834 case EM_CYGNUS_M32R
:
1835 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
1836 case EM_CYGNUS_V850
:
1837 case EM_V850
: return "NEC v850";
1838 case EM_CYGNUS_MN10300
:
1839 case EM_MN10300
: return "mn10300";
1840 case EM_CYGNUS_MN10200
:
1841 case EM_MN10200
: return "mn10200";
1842 case EM_CYGNUS_FR30
:
1843 case EM_FR30
: return "Fujitsu FR30";
1844 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1846 case EM_PJ
: return "picoJava";
1847 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1848 case EM_PCP
: return "Siemens PCP";
1849 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1850 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1851 case EM_STARCORE
: return "Motorola Star*Core processor";
1852 case EM_ME16
: return "Toyota ME16 processor";
1853 case EM_ST100
: return "STMicroelectronics ST100 processor";
1854 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1855 case EM_FX66
: return "Siemens FX66 microcontroller";
1856 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1857 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1858 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1859 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1860 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1861 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1862 case EM_SVX
: return "Silicon Graphics SVx";
1863 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1864 case EM_VAX
: return "Digital VAX";
1866 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1867 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1868 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1869 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1870 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1871 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1872 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1873 case EM_PRISM
: return "Vitesse Prism";
1874 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1875 case EM_L1OM
: return "Intel L1OM";
1877 case EM_S390
: return "IBM S/390";
1878 case EM_SCORE
: return "SUNPLUS S+Core";
1879 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1881 case EM_OR32
: return "OpenRISC";
1882 case EM_CRX
: return "National Semiconductor CRX microprocessor";
1883 case EM_DLX
: return "OpenDLX";
1885 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1886 case EM_IQ2000
: return "Vitesse IQ2000";
1888 case EM_XTENSA
: return "Tensilica Xtensa Processor";
1889 case EM_LATTICEMICO32
: return "Lattice Mico32";
1891 case EM_M32C
: return "Renesas M32c";
1892 case EM_MT
: return "Morpho Techologies MT processor";
1893 case EM_BLACKFIN
: return "Analog Devices Blackfin";
1894 case EM_NIOS32
: return "Altera Nios";
1895 case EM_ALTERA_NIOS2
: return "Altera Nios II";
1897 case EM_XC16X
: return "Infineon Technologies xc16x";
1898 case EM_CYGNUS_MEP
: return "Toshiba MeP Media Engine";
1900 case EM_CR16_OLD
: return "National Semiconductor's CR16";
1901 case EM_MICROBLAZE
: return "Xilinx MicroBlaze";
1902 case EM_MICROBLAZE_OLD
: return "Xilinx MicroBlaze";
1903 case EM_RX
: return "Renesas RX";
1905 snprintf (buff
, sizeof (buff
), _("<unknown>: 0x%x"), e_machine
);
1911 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
1916 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1917 e_flags
&= ~ EF_ARM_EABIMASK
;
1919 /* Handle "generic" ARM flags. */
1920 if (e_flags
& EF_ARM_RELEXEC
)
1922 strcat (buf
, ", relocatable executable");
1923 e_flags
&= ~ EF_ARM_RELEXEC
;
1926 if (e_flags
& EF_ARM_HASENTRY
)
1928 strcat (buf
, ", has entry point");
1929 e_flags
&= ~ EF_ARM_HASENTRY
;
1932 /* Now handle EABI specific flags. */
1936 strcat (buf
, ", <unrecognized EABI>");
1941 case EF_ARM_EABI_VER1
:
1942 strcat (buf
, ", Version1 EABI");
1947 /* Process flags one bit at a time. */
1948 flag
= e_flags
& - e_flags
;
1953 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1954 strcat (buf
, ", sorted symbol tables");
1964 case EF_ARM_EABI_VER2
:
1965 strcat (buf
, ", Version2 EABI");
1970 /* Process flags one bit at a time. */
1971 flag
= e_flags
& - e_flags
;
1976 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1977 strcat (buf
, ", sorted symbol tables");
1980 case EF_ARM_DYNSYMSUSESEGIDX
:
1981 strcat (buf
, ", dynamic symbols use segment index");
1984 case EF_ARM_MAPSYMSFIRST
:
1985 strcat (buf
, ", mapping symbols precede others");
1995 case EF_ARM_EABI_VER3
:
1996 strcat (buf
, ", Version3 EABI");
1999 case EF_ARM_EABI_VER4
:
2000 strcat (buf
, ", Version4 EABI");
2003 case EF_ARM_EABI_VER5
:
2004 strcat (buf
, ", Version5 EABI");
2010 /* Process flags one bit at a time. */
2011 flag
= e_flags
& - e_flags
;
2017 strcat (buf
, ", BE8");
2021 strcat (buf
, ", LE8");
2031 case EF_ARM_EABI_UNKNOWN
:
2032 strcat (buf
, ", GNU EABI");
2037 /* Process flags one bit at a time. */
2038 flag
= e_flags
& - e_flags
;
2043 case EF_ARM_INTERWORK
:
2044 strcat (buf
, ", interworking enabled");
2047 case EF_ARM_APCS_26
:
2048 strcat (buf
, ", uses APCS/26");
2051 case EF_ARM_APCS_FLOAT
:
2052 strcat (buf
, ", uses APCS/float");
2056 strcat (buf
, ", position independent");
2060 strcat (buf
, ", 8 bit structure alignment");
2063 case EF_ARM_NEW_ABI
:
2064 strcat (buf
, ", uses new ABI");
2067 case EF_ARM_OLD_ABI
:
2068 strcat (buf
, ", uses old ABI");
2071 case EF_ARM_SOFT_FLOAT
:
2072 strcat (buf
, ", software FP");
2075 case EF_ARM_VFP_FLOAT
:
2076 strcat (buf
, ", VFP");
2079 case EF_ARM_MAVERICK_FLOAT
:
2080 strcat (buf
, ", Maverick FP");
2091 strcat (buf
,", <unknown>");
2095 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
2097 static char buf
[1024];
2109 decode_ARM_machine_flags (e_flags
, buf
);
2113 switch (e_flags
& EF_FRV_CPU_MASK
)
2115 case EF_FRV_CPU_GENERIC
:
2119 strcat (buf
, ", fr???");
2122 case EF_FRV_CPU_FR300
:
2123 strcat (buf
, ", fr300");
2126 case EF_FRV_CPU_FR400
:
2127 strcat (buf
, ", fr400");
2129 case EF_FRV_CPU_FR405
:
2130 strcat (buf
, ", fr405");
2133 case EF_FRV_CPU_FR450
:
2134 strcat (buf
, ", fr450");
2137 case EF_FRV_CPU_FR500
:
2138 strcat (buf
, ", fr500");
2140 case EF_FRV_CPU_FR550
:
2141 strcat (buf
, ", fr550");
2144 case EF_FRV_CPU_SIMPLE
:
2145 strcat (buf
, ", simple");
2147 case EF_FRV_CPU_TOMCAT
:
2148 strcat (buf
, ", tomcat");
2154 if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_M68000
)
2155 strcat (buf
, ", m68000");
2156 else if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_CPU32
)
2157 strcat (buf
, ", cpu32");
2158 else if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_FIDO
)
2159 strcat (buf
, ", fido_a");
2162 char const * isa
= _("unknown");
2163 char const * mac
= _("unknown mac");
2164 char const * additional
= NULL
;
2166 switch (e_flags
& EF_M68K_CF_ISA_MASK
)
2168 case EF_M68K_CF_ISA_A_NODIV
:
2170 additional
= ", nodiv";
2172 case EF_M68K_CF_ISA_A
:
2175 case EF_M68K_CF_ISA_A_PLUS
:
2178 case EF_M68K_CF_ISA_B_NOUSP
:
2180 additional
= ", nousp";
2182 case EF_M68K_CF_ISA_B
:
2186 strcat (buf
, ", cf, isa ");
2189 strcat (buf
, additional
);
2190 if (e_flags
& EF_M68K_CF_FLOAT
)
2191 strcat (buf
, ", float");
2192 switch (e_flags
& EF_M68K_CF_MAC_MASK
)
2197 case EF_M68K_CF_MAC
:
2200 case EF_M68K_CF_EMAC
:
2213 if (e_flags
& EF_PPC_EMB
)
2214 strcat (buf
, ", emb");
2216 if (e_flags
& EF_PPC_RELOCATABLE
)
2217 strcat (buf
, ", relocatable");
2219 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
2220 strcat (buf
, ", relocatable-lib");
2224 case EM_CYGNUS_V850
:
2225 switch (e_flags
& EF_V850_ARCH
)
2228 strcat (buf
, ", v850e1");
2231 strcat (buf
, ", v850e");
2234 strcat (buf
, ", v850");
2237 strcat (buf
, ", unknown v850 architecture variant");
2243 case EM_CYGNUS_M32R
:
2244 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
2245 strcat (buf
, ", m32r");
2249 case EM_MIPS_RS3_LE
:
2250 if (e_flags
& EF_MIPS_NOREORDER
)
2251 strcat (buf
, ", noreorder");
2253 if (e_flags
& EF_MIPS_PIC
)
2254 strcat (buf
, ", pic");
2256 if (e_flags
& EF_MIPS_CPIC
)
2257 strcat (buf
, ", cpic");
2259 if (e_flags
& EF_MIPS_UCODE
)
2260 strcat (buf
, ", ugen_reserved");
2262 if (e_flags
& EF_MIPS_ABI2
)
2263 strcat (buf
, ", abi2");
2265 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
2266 strcat (buf
, ", odk first");
2268 if (e_flags
& EF_MIPS_32BITMODE
)
2269 strcat (buf
, ", 32bitmode");
2271 switch ((e_flags
& EF_MIPS_MACH
))
2273 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
2274 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
2275 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
2276 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
2277 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
2278 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
2279 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
2280 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
2281 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
2282 case E_MIPS_MACH_9000
: strcat (buf
, ", 9000"); break;
2283 case E_MIPS_MACH_LS2E
: strcat (buf
, ", loongson-2e"); break;
2284 case E_MIPS_MACH_LS2F
: strcat (buf
, ", loongson-2f"); break;
2285 case E_MIPS_MACH_OCTEON
: strcat (buf
, ", octeon"); break;
2286 case E_MIPS_MACH_XLR
: strcat (buf
, ", xlr"); break;
2288 /* We simply ignore the field in this case to avoid confusion:
2289 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2292 default: strcat (buf
, ", unknown CPU"); break;
2295 switch ((e_flags
& EF_MIPS_ABI
))
2297 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
2298 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
2299 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
2300 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
2302 /* We simply ignore the field in this case to avoid confusion:
2303 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2304 This means it is likely to be an o32 file, but not for
2307 default: strcat (buf
, ", unknown ABI"); break;
2310 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
2311 strcat (buf
, ", mdmx");
2313 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
2314 strcat (buf
, ", mips16");
2316 switch ((e_flags
& EF_MIPS_ARCH
))
2318 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
2319 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
2320 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
2321 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
2322 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
2323 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
2324 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
2325 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
2326 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
2327 default: strcat (buf
, ", unknown ISA"); break;
2333 switch ((e_flags
& EF_SH_MACH_MASK
))
2335 case EF_SH1
: strcat (buf
, ", sh1"); break;
2336 case EF_SH2
: strcat (buf
, ", sh2"); break;
2337 case EF_SH3
: strcat (buf
, ", sh3"); break;
2338 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
2339 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
2340 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
2341 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
2342 case EF_SH4
: strcat (buf
, ", sh4"); break;
2343 case EF_SH5
: strcat (buf
, ", sh5"); break;
2344 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
2345 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
2346 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
2347 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
2348 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
2349 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
2350 case EF_SH3_NOMMU
: strcat (buf
, ", sh3-nommu"); break;
2351 case EF_SH4_NOMMU_NOFPU
: strcat (buf
, ", sh4-nommu-nofpu"); break;
2352 case EF_SH2A_SH4_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2353 case EF_SH2A_SH3_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh3-nommu"); break;
2354 case EF_SH2A_SH4
: strcat (buf
, ", sh2a-or-sh4"); break;
2355 case EF_SH2A_SH3E
: strcat (buf
, ", sh2a-or-sh3e"); break;
2356 default: strcat (buf
, ", unknown ISA"); break;
2362 if (e_flags
& EF_SPARC_32PLUS
)
2363 strcat (buf
, ", v8+");
2365 if (e_flags
& EF_SPARC_SUN_US1
)
2366 strcat (buf
, ", ultrasparcI");
2368 if (e_flags
& EF_SPARC_SUN_US3
)
2369 strcat (buf
, ", ultrasparcIII");
2371 if (e_flags
& EF_SPARC_HAL_R1
)
2372 strcat (buf
, ", halr1");
2374 if (e_flags
& EF_SPARC_LEDATA
)
2375 strcat (buf
, ", ledata");
2377 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2378 strcat (buf
, ", tso");
2380 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2381 strcat (buf
, ", pso");
2383 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2384 strcat (buf
, ", rmo");
2388 switch (e_flags
& EF_PARISC_ARCH
)
2390 case EFA_PARISC_1_0
:
2391 strcpy (buf
, ", PA-RISC 1.0");
2393 case EFA_PARISC_1_1
:
2394 strcpy (buf
, ", PA-RISC 1.1");
2396 case EFA_PARISC_2_0
:
2397 strcpy (buf
, ", PA-RISC 2.0");
2402 if (e_flags
& EF_PARISC_TRAPNIL
)
2403 strcat (buf
, ", trapnil");
2404 if (e_flags
& EF_PARISC_EXT
)
2405 strcat (buf
, ", ext");
2406 if (e_flags
& EF_PARISC_LSB
)
2407 strcat (buf
, ", lsb");
2408 if (e_flags
& EF_PARISC_WIDE
)
2409 strcat (buf
, ", wide");
2410 if (e_flags
& EF_PARISC_NO_KABP
)
2411 strcat (buf
, ", no kabp");
2412 if (e_flags
& EF_PARISC_LAZYSWAP
)
2413 strcat (buf
, ", lazyswap");
2418 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2419 strcat (buf
, ", new calling convention");
2421 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2422 strcat (buf
, ", gnu calling convention");
2426 if ((e_flags
& EF_IA_64_ABI64
))
2427 strcat (buf
, ", 64-bit");
2429 strcat (buf
, ", 32-bit");
2430 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2431 strcat (buf
, ", reduced fp model");
2432 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2433 strcat (buf
, ", no function descriptors, constant gp");
2434 else if ((e_flags
& EF_IA_64_CONS_GP
))
2435 strcat (buf
, ", constant gp");
2436 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2437 strcat (buf
, ", absolute");
2441 if ((e_flags
& EF_VAX_NONPIC
))
2442 strcat (buf
, ", non-PIC");
2443 if ((e_flags
& EF_VAX_DFLOAT
))
2444 strcat (buf
, ", D-Float");
2445 if ((e_flags
& EF_VAX_GFLOAT
))
2446 strcat (buf
, ", G-Float");
2450 if (e_flags
& E_FLAG_RX_64BIT_DOUBLES
)
2451 strcat (buf
, ", 64-bit doubles");
2452 if (e_flags
& E_FLAG_RX_DSP
)
2453 strcat (buf
, ", dsp");
2461 get_osabi_name (unsigned int osabi
)
2463 static char buff
[32];
2467 case ELFOSABI_NONE
: return "UNIX - System V";
2468 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2469 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2470 case ELFOSABI_LINUX
: return "UNIX - Linux";
2471 case ELFOSABI_HURD
: return "GNU/Hurd";
2472 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2473 case ELFOSABI_AIX
: return "UNIX - AIX";
2474 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2475 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2476 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2477 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2478 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2479 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2480 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2481 case ELFOSABI_AROS
: return "AROS";
2482 case ELFOSABI_STANDALONE
: return _("Standalone App");
2483 case ELFOSABI_ARM
: return "ARM";
2485 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), osabi
);
2491 get_arm_segment_type (unsigned long type
)
2505 get_mips_segment_type (unsigned long type
)
2509 case PT_MIPS_REGINFO
:
2511 case PT_MIPS_RTPROC
:
2513 case PT_MIPS_OPTIONS
:
2523 get_parisc_segment_type (unsigned long type
)
2527 case PT_HP_TLS
: return "HP_TLS";
2528 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2529 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2530 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2531 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2532 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2533 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2534 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2535 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2536 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2537 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2538 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2539 case PT_HP_OPT_ANNOT
: return "HP_OPT_ANNOT";
2540 case PT_HP_HSL_ANNOT
: return "HP_HSL_ANNOT";
2541 case PT_HP_STACK
: return "HP_STACK";
2542 case PT_HP_CORE_UTSNAME
: return "HP_CORE_UTSNAME";
2543 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2544 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2545 case PT_PARISC_WEAKORDER
: return "PARISC_WEAKORDER";
2554 get_ia64_segment_type (unsigned long type
)
2558 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2559 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2560 case PT_HP_TLS
: return "HP_TLS";
2561 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2562 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2563 case PT_IA_64_HP_STACK
: return "HP_STACK";
2572 get_segment_type (unsigned long p_type
)
2574 static char buff
[32];
2578 case PT_NULL
: return "NULL";
2579 case PT_LOAD
: return "LOAD";
2580 case PT_DYNAMIC
: return "DYNAMIC";
2581 case PT_INTERP
: return "INTERP";
2582 case PT_NOTE
: return "NOTE";
2583 case PT_SHLIB
: return "SHLIB";
2584 case PT_PHDR
: return "PHDR";
2585 case PT_TLS
: return "TLS";
2587 case PT_GNU_EH_FRAME
:
2588 return "GNU_EH_FRAME";
2589 case PT_GNU_STACK
: return "GNU_STACK";
2590 case PT_GNU_RELRO
: return "GNU_RELRO";
2593 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2595 const char * result
;
2597 switch (elf_header
.e_machine
)
2600 result
= get_arm_segment_type (p_type
);
2603 case EM_MIPS_RS3_LE
:
2604 result
= get_mips_segment_type (p_type
);
2607 result
= get_parisc_segment_type (p_type
);
2610 result
= get_ia64_segment_type (p_type
);
2620 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2622 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2624 const char * result
;
2626 switch (elf_header
.e_machine
)
2629 result
= get_parisc_segment_type (p_type
);
2632 result
= get_ia64_segment_type (p_type
);
2642 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2645 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), p_type
);
2652 get_mips_section_type_name (unsigned int sh_type
)
2656 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2657 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2658 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2659 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2660 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2661 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2662 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2663 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2664 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2665 case SHT_MIPS_RELD
: return "MIPS_RELD";
2666 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2667 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2668 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2669 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2670 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2671 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2672 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2673 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2674 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2675 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2676 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2677 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2678 case SHT_MIPS_LINE
: return "MIPS_LINE";
2679 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2680 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2681 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2682 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2683 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2684 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2685 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2686 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2687 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2688 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2689 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2690 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2691 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2692 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2693 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2694 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2702 get_parisc_section_type_name (unsigned int sh_type
)
2706 case SHT_PARISC_EXT
: return "PARISC_EXT";
2707 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2708 case SHT_PARISC_DOC
: return "PARISC_DOC";
2709 case SHT_PARISC_ANNOT
: return "PARISC_ANNOT";
2710 case SHT_PARISC_SYMEXTN
: return "PARISC_SYMEXTN";
2711 case SHT_PARISC_STUBS
: return "PARISC_STUBS";
2712 case SHT_PARISC_DLKM
: return "PARISC_DLKM";
2720 get_ia64_section_type_name (unsigned int sh_type
)
2722 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2723 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2724 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2728 case SHT_IA_64_EXT
: return "IA_64_EXT";
2729 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2730 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2731 case SHT_IA_64_VMS_TRACE
: return "VMS_TRACE";
2732 case SHT_IA_64_VMS_TIE_SIGNATURES
: return "VMS_TIE_SIGNATURES";
2733 case SHT_IA_64_VMS_DEBUG
: return "VMS_DEBUG";
2734 case SHT_IA_64_VMS_DEBUG_STR
: return "VMS_DEBUG_STR";
2735 case SHT_IA_64_VMS_LINKAGES
: return "VMS_LINKAGES";
2736 case SHT_IA_64_VMS_SYMBOL_VECTOR
: return "VMS_SYMBOL_VECTOR";
2737 case SHT_IA_64_VMS_FIXUP
: return "VMS_FIXUP";
2745 get_x86_64_section_type_name (unsigned int sh_type
)
2749 case SHT_X86_64_UNWIND
: return "X86_64_UNWIND";
2757 get_arm_section_type_name (unsigned int sh_type
)
2761 case SHT_ARM_EXIDX
: return "ARM_EXIDX";
2762 case SHT_ARM_PREEMPTMAP
: return "ARM_PREEMPTMAP";
2763 case SHT_ARM_ATTRIBUTES
: return "ARM_ATTRIBUTES";
2764 case SHT_ARM_DEBUGOVERLAY
: return "ARM_DEBUGOVERLAY";
2765 case SHT_ARM_OVERLAYSECTION
: return "ARM_OVERLAYSECTION";
2773 get_section_type_name (unsigned int sh_type
)
2775 static char buff
[32];
2779 case SHT_NULL
: return "NULL";
2780 case SHT_PROGBITS
: return "PROGBITS";
2781 case SHT_SYMTAB
: return "SYMTAB";
2782 case SHT_STRTAB
: return "STRTAB";
2783 case SHT_RELA
: return "RELA";
2784 case SHT_HASH
: return "HASH";
2785 case SHT_DYNAMIC
: return "DYNAMIC";
2786 case SHT_NOTE
: return "NOTE";
2787 case SHT_NOBITS
: return "NOBITS";
2788 case SHT_REL
: return "REL";
2789 case SHT_SHLIB
: return "SHLIB";
2790 case SHT_DYNSYM
: return "DYNSYM";
2791 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2792 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2793 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2794 case SHT_GNU_HASH
: return "GNU_HASH";
2795 case SHT_GROUP
: return "GROUP";
2796 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2797 case SHT_GNU_verdef
: return "VERDEF";
2798 case SHT_GNU_verneed
: return "VERNEED";
2799 case SHT_GNU_versym
: return "VERSYM";
2800 case 0x6ffffff0: return "VERSYM";
2801 case 0x6ffffffc: return "VERDEF";
2802 case 0x7ffffffd: return "AUXILIARY";
2803 case 0x7fffffff: return "FILTER";
2804 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2807 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2809 const char * result
;
2811 switch (elf_header
.e_machine
)
2814 case EM_MIPS_RS3_LE
:
2815 result
= get_mips_section_type_name (sh_type
);
2818 result
= get_parisc_section_type_name (sh_type
);
2821 result
= get_ia64_section_type_name (sh_type
);
2825 result
= get_x86_64_section_type_name (sh_type
);
2828 result
= get_arm_section_type_name (sh_type
);
2838 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2840 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2842 const char * result
;
2844 switch (elf_header
.e_machine
)
2847 result
= get_ia64_section_type_name (sh_type
);
2857 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2859 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2860 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2862 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), sh_type
);
2868 #define OPTION_DEBUG_DUMP 512
2870 static struct option options
[] =
2872 {"all", no_argument
, 0, 'a'},
2873 {"file-header", no_argument
, 0, 'h'},
2874 {"program-headers", no_argument
, 0, 'l'},
2875 {"headers", no_argument
, 0, 'e'},
2876 {"histogram", no_argument
, 0, 'I'},
2877 {"segments", no_argument
, 0, 'l'},
2878 {"sections", no_argument
, 0, 'S'},
2879 {"section-headers", no_argument
, 0, 'S'},
2880 {"section-groups", no_argument
, 0, 'g'},
2881 {"section-details", no_argument
, 0, 't'},
2882 {"full-section-name",no_argument
, 0, 'N'},
2883 {"symbols", no_argument
, 0, 's'},
2884 {"syms", no_argument
, 0, 's'},
2885 {"relocs", no_argument
, 0, 'r'},
2886 {"notes", no_argument
, 0, 'n'},
2887 {"dynamic", no_argument
, 0, 'd'},
2888 {"arch-specific", no_argument
, 0, 'A'},
2889 {"version-info", no_argument
, 0, 'V'},
2890 {"use-dynamic", no_argument
, 0, 'D'},
2891 {"unwind", no_argument
, 0, 'u'},
2892 {"archive-index", no_argument
, 0, 'c'},
2893 {"hex-dump", required_argument
, 0, 'x'},
2894 {"relocated-dump", required_argument
, 0, 'R'},
2895 {"string-dump", required_argument
, 0, 'p'},
2896 #ifdef SUPPORT_DISASSEMBLY
2897 {"instruction-dump", required_argument
, 0, 'i'},
2899 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2901 {"version", no_argument
, 0, 'v'},
2902 {"wide", no_argument
, 0, 'W'},
2903 {"help", no_argument
, 0, 'H'},
2904 {0, no_argument
, 0, 0}
2908 usage (FILE * stream
)
2910 fprintf (stream
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2911 fprintf (stream
, _(" Display information about the contents of ELF format files\n"));
2912 fprintf (stream
, _(" Options are:\n\
2913 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2914 -h --file-header Display the ELF file header\n\
2915 -l --program-headers Display the program headers\n\
2916 --segments An alias for --program-headers\n\
2917 -S --section-headers Display the sections' header\n\
2918 --sections An alias for --section-headers\n\
2919 -g --section-groups Display the section groups\n\
2920 -t --section-details Display the section details\n\
2921 -e --headers Equivalent to: -h -l -S\n\
2922 -s --syms Display the symbol table\n\
2923 --symbols An alias for --syms\n\
2924 -n --notes Display the core notes (if present)\n\
2925 -r --relocs Display the relocations (if present)\n\
2926 -u --unwind Display the unwind info (if present)\n\
2927 -d --dynamic Display the dynamic section (if present)\n\
2928 -V --version-info Display the version sections (if present)\n\
2929 -A --arch-specific Display architecture specific information (if any).\n\
2930 -c --archive-index Display the symbol/file index in an archive\n\
2931 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2932 -x --hex-dump=<number|name>\n\
2933 Dump the contents of section <number|name> as bytes\n\
2934 -p --string-dump=<number|name>\n\
2935 Dump the contents of section <number|name> as strings\n\
2936 -R --relocated-dump=<number|name>\n\
2937 Dump the contents of section <number|name> as relocated bytes\n\
2938 -w[lLiaprmfFsoR] or\n\
2939 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
2940 =frames-interp,=str,=loc,=Ranges]\n\
2941 Display the contents of DWARF2 debug sections\n"));
2942 #ifdef SUPPORT_DISASSEMBLY
2943 fprintf (stream
, _("\
2944 -i --instruction-dump=<number|name>\n\
2945 Disassemble the contents of section <number|name>\n"));
2947 fprintf (stream
, _("\
2948 -I --histogram Display histogram of bucket list lengths\n\
2949 -W --wide Allow output width to exceed 80 characters\n\
2950 @<file> Read options from <file>\n\
2951 -H --help Display this information\n\
2952 -v --version Display the version number of readelf\n"));
2954 if (REPORT_BUGS_TO
[0] && stream
== stdout
)
2955 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2957 exit (stream
== stdout
? 0 : 1);
2960 /* Record the fact that the user wants the contents of section number
2961 SECTION to be displayed using the method(s) encoded as flags bits
2962 in TYPE. Note, TYPE can be zero if we are creating the array for
2966 request_dump_bynumber (unsigned int section
, dump_type type
)
2968 if (section
>= num_dump_sects
)
2970 dump_type
* new_dump_sects
;
2972 new_dump_sects
= (dump_type
*) calloc (section
+ 1,
2973 sizeof (* dump_sects
));
2975 if (new_dump_sects
== NULL
)
2976 error (_("Out of memory allocating dump request table.\n"));
2979 /* Copy current flag settings. */
2980 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
* sizeof (* dump_sects
));
2984 dump_sects
= new_dump_sects
;
2985 num_dump_sects
= section
+ 1;
2990 dump_sects
[section
] |= type
;
2995 /* Request a dump by section name. */
2998 request_dump_byname (const char * section
, dump_type type
)
3000 struct dump_list_entry
* new_request
;
3002 new_request
= (struct dump_list_entry
*)
3003 malloc (sizeof (struct dump_list_entry
));
3005 error (_("Out of memory allocating dump request table.\n"));
3007 new_request
->name
= strdup (section
);
3008 if (!new_request
->name
)
3009 error (_("Out of memory allocating dump request table.\n"));
3011 new_request
->type
= type
;
3013 new_request
->next
= dump_sects_byname
;
3014 dump_sects_byname
= new_request
;
3018 request_dump (dump_type type
)
3024 section
= strtoul (optarg
, & cp
, 0);
3026 if (! *cp
&& section
>= 0)
3027 request_dump_bynumber (section
, type
);
3029 request_dump_byname (optarg
, type
);
3034 parse_args (int argc
, char ** argv
)
3041 while ((c
= getopt_long
3042 (argc
, argv
, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options
, NULL
)) != EOF
)
3060 do_section_groups
++;
3068 do_section_groups
++;
3073 do_section_details
++;
3117 request_dump (HEX_DUMP
);
3120 request_dump (STRING_DUMP
);
3123 request_dump (RELOC_DUMP
);
3130 dwarf_select_sections_all ();
3135 dwarf_select_sections_by_letters (optarg
);
3138 case OPTION_DEBUG_DUMP
:
3145 dwarf_select_sections_by_names (optarg
);
3148 #ifdef SUPPORT_DISASSEMBLY
3150 request_dump (DISASS_DUMP
);
3154 print_version (program_name
);
3163 /* xgettext:c-format */
3164 error (_("Invalid option '-%c'\n"), c
);
3171 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
3172 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
3173 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
3174 && !do_section_groups
&& !do_archive_index
)
3178 warn (_("Nothing to do.\n"));
3184 get_elf_class (unsigned int elf_class
)
3186 static char buff
[32];
3190 case ELFCLASSNONE
: return _("none");
3191 case ELFCLASS32
: return "ELF32";
3192 case ELFCLASS64
: return "ELF64";
3194 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), elf_class
);
3200 get_data_encoding (unsigned int encoding
)
3202 static char buff
[32];
3206 case ELFDATANONE
: return _("none");
3207 case ELFDATA2LSB
: return _("2's complement, little endian");
3208 case ELFDATA2MSB
: return _("2's complement, big endian");
3210 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), encoding
);
3215 /* Decode the data held in 'elf_header'. */
3218 process_file_header (void)
3220 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
3221 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
3222 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
3223 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
3226 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3230 init_dwarf_regnames (elf_header
.e_machine
);
3236 printf (_("ELF Header:\n"));
3237 printf (_(" Magic: "));
3238 for (i
= 0; i
< EI_NIDENT
; i
++)
3239 printf ("%2.2x ", elf_header
.e_ident
[i
]);
3241 printf (_(" Class: %s\n"),
3242 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
3243 printf (_(" Data: %s\n"),
3244 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
3245 printf (_(" Version: %d %s\n"),
3246 elf_header
.e_ident
[EI_VERSION
],
3247 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
3249 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
3252 printf (_(" OS/ABI: %s\n"),
3253 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
3254 printf (_(" ABI Version: %d\n"),
3255 elf_header
.e_ident
[EI_ABIVERSION
]);
3256 printf (_(" Type: %s\n"),
3257 get_file_type (elf_header
.e_type
));
3258 printf (_(" Machine: %s\n"),
3259 get_machine_name (elf_header
.e_machine
));
3260 printf (_(" Version: 0x%lx\n"),
3261 (unsigned long) elf_header
.e_version
);
3263 printf (_(" Entry point address: "));
3264 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3265 printf (_("\n Start of program headers: "));
3266 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3267 printf (_(" (bytes into file)\n Start of section headers: "));
3268 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
3269 printf (_(" (bytes into file)\n"));
3271 printf (_(" Flags: 0x%lx%s\n"),
3272 (unsigned long) elf_header
.e_flags
,
3273 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
3274 printf (_(" Size of this header: %ld (bytes)\n"),
3275 (long) elf_header
.e_ehsize
);
3276 printf (_(" Size of program headers: %ld (bytes)\n"),
3277 (long) elf_header
.e_phentsize
);
3278 printf (_(" Number of program headers: %ld\n"),
3279 (long) elf_header
.e_phnum
);
3280 printf (_(" Size of section headers: %ld (bytes)\n"),
3281 (long) elf_header
.e_shentsize
);
3282 printf (_(" Number of section headers: %ld"),
3283 (long) elf_header
.e_shnum
);
3284 if (section_headers
!= NULL
&& elf_header
.e_shnum
== SHN_UNDEF
)
3285 printf (" (%ld)", (long) section_headers
[0].sh_size
);
3286 putc ('\n', stdout
);
3287 printf (_(" Section header string table index: %ld"),
3288 (long) elf_header
.e_shstrndx
);
3289 if (section_headers
!= NULL
3290 && elf_header
.e_shstrndx
== (SHN_XINDEX
& 0xffff))
3291 printf (" (%u)", section_headers
[0].sh_link
);
3292 else if (elf_header
.e_shstrndx
!= SHN_UNDEF
3293 && 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
= (Elf32_External_Phdr
*) get_data (NULL
, file
, elf_header
.e_phoff
,
3323 elf_header
.e_phentsize
,
3325 _("program headers"));
3329 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3330 i
< elf_header
.e_phnum
;
3331 i
++, internal
++, external
++)
3333 internal
->p_type
= BYTE_GET (external
->p_type
);
3334 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3335 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3336 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3337 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3338 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3339 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3340 internal
->p_align
= BYTE_GET (external
->p_align
);
3349 get_64bit_program_headers (FILE * file
, Elf_Internal_Phdr
* program_headers
)
3351 Elf64_External_Phdr
* phdrs
;
3352 Elf64_External_Phdr
* external
;
3353 Elf_Internal_Phdr
* internal
;
3356 phdrs
= (Elf64_External_Phdr
*) get_data (NULL
, file
, elf_header
.e_phoff
,
3357 elf_header
.e_phentsize
,
3359 _("program headers"));
3363 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3364 i
< elf_header
.e_phnum
;
3365 i
++, internal
++, external
++)
3367 internal
->p_type
= BYTE_GET (external
->p_type
);
3368 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3369 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3370 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3371 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3372 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3373 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3374 internal
->p_align
= BYTE_GET (external
->p_align
);
3382 /* Returns 1 if the program headers were read into `program_headers'. */
3385 get_program_headers (FILE * file
)
3387 Elf_Internal_Phdr
* phdrs
;
3389 /* Check cache of prior read. */
3390 if (program_headers
!= NULL
)
3393 phdrs
= (Elf_Internal_Phdr
*) cmalloc (elf_header
.e_phnum
,
3394 sizeof (Elf_Internal_Phdr
));
3398 error (_("Out of memory\n"));
3403 ? get_32bit_program_headers (file
, phdrs
)
3404 : get_64bit_program_headers (file
, phdrs
))
3406 program_headers
= phdrs
;
3414 /* Returns 1 if the program headers were loaded. */
3417 process_program_headers (FILE * file
)
3419 Elf_Internal_Phdr
* segment
;
3422 if (elf_header
.e_phnum
== 0)
3425 printf (_("\nThere are no program headers in this file.\n"));
3429 if (do_segments
&& !do_header
)
3431 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3432 printf (_("Entry point "));
3433 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3434 printf (_("\nThere are %d program headers, starting at offset "),
3435 elf_header
.e_phnum
);
3436 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3440 if (! get_program_headers (file
))
3445 if (elf_header
.e_phnum
> 1)
3446 printf (_("\nProgram Headers:\n"));
3448 printf (_("\nProgram Headers:\n"));
3452 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3455 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3459 (_(" Type Offset VirtAddr PhysAddr\n"));
3461 (_(" FileSiz MemSiz Flags Align\n"));
3468 for (i
= 0, segment
= program_headers
;
3469 i
< elf_header
.e_phnum
;
3474 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3478 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3479 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3480 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3481 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3482 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3484 (segment
->p_flags
& PF_R
? 'R' : ' '),
3485 (segment
->p_flags
& PF_W
? 'W' : ' '),
3486 (segment
->p_flags
& PF_X
? 'E' : ' '));
3487 printf ("%#lx", (unsigned long) segment
->p_align
);
3491 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3492 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3495 print_vma (segment
->p_offset
, FULL_HEX
);
3499 print_vma (segment
->p_vaddr
, FULL_HEX
);
3501 print_vma (segment
->p_paddr
, FULL_HEX
);
3504 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3505 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3508 print_vma (segment
->p_filesz
, FULL_HEX
);
3512 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3513 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3516 print_vma (segment
->p_offset
, FULL_HEX
);
3520 (segment
->p_flags
& PF_R
? 'R' : ' '),
3521 (segment
->p_flags
& PF_W
? 'W' : ' '),
3522 (segment
->p_flags
& PF_X
? 'E' : ' '));
3524 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3525 printf ("%#lx", (unsigned long) segment
->p_align
);
3528 print_vma (segment
->p_align
, PREFIX_HEX
);
3533 print_vma (segment
->p_offset
, FULL_HEX
);
3535 print_vma (segment
->p_vaddr
, FULL_HEX
);
3537 print_vma (segment
->p_paddr
, FULL_HEX
);
3539 print_vma (segment
->p_filesz
, FULL_HEX
);
3541 print_vma (segment
->p_memsz
, FULL_HEX
);
3543 (segment
->p_flags
& PF_R
? 'R' : ' '),
3544 (segment
->p_flags
& PF_W
? 'W' : ' '),
3545 (segment
->p_flags
& PF_X
? 'E' : ' '));
3546 print_vma (segment
->p_align
, HEX
);
3550 switch (segment
->p_type
)
3554 error (_("more than one dynamic segment\n"));
3556 /* By default, assume that the .dynamic section is the first
3557 section in the DYNAMIC segment. */
3558 dynamic_addr
= segment
->p_offset
;
3559 dynamic_size
= segment
->p_filesz
;
3561 /* Try to locate the .dynamic section. If there is
3562 a section header table, we can easily locate it. */
3563 if (section_headers
!= NULL
)
3565 Elf_Internal_Shdr
* sec
;
3567 sec
= find_section (".dynamic");
3568 if (sec
== NULL
|| sec
->sh_size
== 0)
3570 error (_("no .dynamic section in the dynamic segment\n"));
3574 if (sec
->sh_type
== SHT_NOBITS
)
3580 dynamic_addr
= sec
->sh_offset
;
3581 dynamic_size
= sec
->sh_size
;
3583 if (dynamic_addr
< segment
->p_offset
3584 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
3585 warn (_("the .dynamic section is not contained"
3586 " within the dynamic segment\n"));
3587 else if (dynamic_addr
> segment
->p_offset
)
3588 warn (_("the .dynamic section is not the first section"
3589 " in the dynamic segment.\n"));
3594 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3596 error (_("Unable to find program interpreter name\n"));
3600 int ret
= snprintf (fmt
, sizeof (fmt
), "%%%ds", PATH_MAX
);
3602 if (ret
>= (int) sizeof (fmt
) || ret
< 0)
3603 error (_("Internal error: failed to create format string to display program interpreter\n"));
3605 program_interpreter
[0] = 0;
3606 if (fscanf (file
, fmt
, program_interpreter
) <= 0)
3607 error (_("Unable to read program interpreter name\n"));
3610 printf (_("\n [Requesting program interpreter: %s]"),
3611 program_interpreter
);
3617 putc ('\n', stdout
);
3620 if (do_segments
&& section_headers
!= NULL
&& string_table
!= NULL
)
3622 printf (_("\n Section to Segment mapping:\n"));
3623 printf (_(" Segment Sections...\n"));
3625 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3628 Elf_Internal_Shdr
* section
;
3630 segment
= program_headers
+ i
;
3631 section
= section_headers
+ 1;
3633 printf (" %2.2d ", i
);
3635 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3637 if (ELF_IS_SECTION_IN_SEGMENT_MEMORY (section
, segment
))
3638 printf ("%s ", SECTION_NAME (section
));
3649 /* Find the file offset corresponding to VMA by using the program headers. */
3652 offset_from_vma (FILE * file
, bfd_vma vma
, bfd_size_type size
)
3654 Elf_Internal_Phdr
* seg
;
3656 if (! get_program_headers (file
))
3658 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3662 for (seg
= program_headers
;
3663 seg
< program_headers
+ elf_header
.e_phnum
;
3666 if (seg
->p_type
!= PT_LOAD
)
3669 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3670 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3671 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3674 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3675 (unsigned long) vma
);
3681 get_32bit_section_headers (FILE * file
, unsigned int num
)
3683 Elf32_External_Shdr
* shdrs
;
3684 Elf_Internal_Shdr
* internal
;
3687 shdrs
= (Elf32_External_Shdr
*) get_data (NULL
, file
, elf_header
.e_shoff
,
3688 elf_header
.e_shentsize
, num
,
3689 _("section headers"));
3693 section_headers
= (Elf_Internal_Shdr
*) cmalloc (num
,
3694 sizeof (Elf_Internal_Shdr
));
3696 if (section_headers
== NULL
)
3698 error (_("Out of memory\n"));
3702 for (i
= 0, internal
= section_headers
;
3706 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3707 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3708 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3709 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3710 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3711 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3712 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3713 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3714 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3715 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3724 get_64bit_section_headers (FILE * file
, unsigned int num
)
3726 Elf64_External_Shdr
* shdrs
;
3727 Elf_Internal_Shdr
* internal
;
3730 shdrs
= (Elf64_External_Shdr
*) get_data (NULL
, file
, elf_header
.e_shoff
,
3731 elf_header
.e_shentsize
, num
,
3732 _("section headers"));
3736 section_headers
= (Elf_Internal_Shdr
*) cmalloc (num
,
3737 sizeof (Elf_Internal_Shdr
));
3739 if (section_headers
== NULL
)
3741 error (_("Out of memory\n"));
3745 for (i
= 0, internal
= section_headers
;
3749 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3750 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3751 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3752 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3753 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3754 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3755 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3756 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3757 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3758 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3766 static Elf_Internal_Sym
*
3767 get_32bit_elf_symbols (FILE * file
, Elf_Internal_Shdr
* section
)
3769 unsigned long number
;
3770 Elf32_External_Sym
* esyms
;
3771 Elf_External_Sym_Shndx
* shndx
;
3772 Elf_Internal_Sym
* isyms
;
3773 Elf_Internal_Sym
* psym
;
3776 esyms
= (Elf32_External_Sym
*) get_data (NULL
, file
, section
->sh_offset
, 1,
3777 section
->sh_size
, _("symbols"));
3782 if (symtab_shndx_hdr
!= NULL
3783 && (symtab_shndx_hdr
->sh_link
3784 == (unsigned long) (section
- section_headers
)))
3786 shndx
= (Elf_External_Sym_Shndx
*) get_data (NULL
, file
,
3787 symtab_shndx_hdr
->sh_offset
,
3788 1, symtab_shndx_hdr
->sh_size
,
3797 number
= section
->sh_size
/ section
->sh_entsize
;
3798 isyms
= (Elf_Internal_Sym
*) cmalloc (number
, sizeof (Elf_Internal_Sym
));
3802 error (_("Out of memory\n"));
3809 for (j
= 0, psym
= isyms
;
3813 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3814 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3815 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3816 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3817 if (psym
->st_shndx
== (SHN_XINDEX
& 0xffff) && shndx
!= NULL
)
3819 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3820 else if (psym
->st_shndx
>= (SHN_LORESERVE
& 0xffff))
3821 psym
->st_shndx
+= SHN_LORESERVE
- (SHN_LORESERVE
& 0xffff);
3822 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3823 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3833 static Elf_Internal_Sym
*
3834 get_64bit_elf_symbols (FILE * file
, Elf_Internal_Shdr
* section
)
3836 unsigned long number
;
3837 Elf64_External_Sym
* esyms
;
3838 Elf_External_Sym_Shndx
* shndx
;
3839 Elf_Internal_Sym
* isyms
;
3840 Elf_Internal_Sym
* psym
;
3843 esyms
= (Elf64_External_Sym
*) get_data (NULL
, file
, section
->sh_offset
, 1,
3844 section
->sh_size
, _("symbols"));
3849 if (symtab_shndx_hdr
!= NULL
3850 && (symtab_shndx_hdr
->sh_link
3851 == (unsigned long) (section
- section_headers
)))
3853 shndx
= (Elf_External_Sym_Shndx
*) get_data (NULL
, file
,
3854 symtab_shndx_hdr
->sh_offset
,
3855 1, symtab_shndx_hdr
->sh_size
,
3864 number
= section
->sh_size
/ section
->sh_entsize
;
3865 isyms
= (Elf_Internal_Sym
*) cmalloc (number
, sizeof (Elf_Internal_Sym
));
3869 error (_("Out of memory\n"));
3876 for (j
= 0, psym
= isyms
;
3880 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3881 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3882 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3883 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3884 if (psym
->st_shndx
== (SHN_XINDEX
& 0xffff) && shndx
!= NULL
)
3886 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3887 else if (psym
->st_shndx
>= (SHN_LORESERVE
& 0xffff))
3888 psym
->st_shndx
+= SHN_LORESERVE
- (SHN_LORESERVE
& 0xffff);
3889 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3890 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3901 get_elf_section_flags (bfd_vma sh_flags
)
3903 static char buff
[1024];
3905 int field_size
= is_32bit_elf
? 8 : 16;
3906 int index
, size
= sizeof (buff
) - (field_size
+ 4 + 1);
3907 bfd_vma os_flags
= 0;
3908 bfd_vma proc_flags
= 0;
3909 bfd_vma unknown_flags
= 0;
3917 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
3918 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
3919 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
3920 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
3921 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
3922 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
3923 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
3924 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
3925 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
3926 /* 9 */ { STRING_COMMA_LEN ("TLS") },
3927 /* IA-64 specific. */
3928 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
3929 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
3930 /* IA-64 OpenVMS specific. */
3931 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
3932 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
3933 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
3934 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
3935 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
3936 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
3937 /* SPARC specific. */
3938 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
3939 /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
3942 if (do_section_details
)
3944 sprintf (buff
, "[%*.*lx]: ",
3945 field_size
, field_size
, (unsigned long) sh_flags
);
3946 p
+= field_size
+ 4;
3953 flag
= sh_flags
& - sh_flags
;
3956 if (do_section_details
)
3960 case SHF_WRITE
: index
= 0; break;
3961 case SHF_ALLOC
: index
= 1; break;
3962 case SHF_EXECINSTR
: index
= 2; break;
3963 case SHF_MERGE
: index
= 3; break;
3964 case SHF_STRINGS
: index
= 4; break;
3965 case SHF_INFO_LINK
: index
= 5; break;
3966 case SHF_LINK_ORDER
: index
= 6; break;
3967 case SHF_OS_NONCONFORMING
: index
= 7; break;
3968 case SHF_GROUP
: index
= 8; break;
3969 case SHF_TLS
: index
= 9; break;
3973 switch (elf_header
.e_machine
)
3976 if (flag
== SHF_IA_64_SHORT
)
3978 else if (flag
== SHF_IA_64_NORECOV
)
3981 else if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_OPENVMS
)
3984 case SHF_IA_64_VMS_GLOBAL
: index
= 12; break;
3985 case SHF_IA_64_VMS_OVERLAID
: index
= 13; break;
3986 case SHF_IA_64_VMS_SHARED
: index
= 14; break;
3987 case SHF_IA_64_VMS_VECTOR
: index
= 15; break;
3988 case SHF_IA_64_VMS_ALLOC_64BIT
: index
= 16; break;
3989 case SHF_IA_64_VMS_PROTECTED
: index
= 17; break;
3998 case EM_OLD_SPARCV9
:
3999 case EM_SPARC32PLUS
:
4002 if (flag
== SHF_EXCLUDE
)
4004 else if (flag
== SHF_ORDERED
)
4014 if (p
!= buff
+ field_size
+ 4)
4016 if (size
< (10 + 2))
4023 size
-= flags
[index
].len
;
4024 p
= stpcpy (p
, flags
[index
].str
);
4026 else if (flag
& SHF_MASKOS
)
4028 else if (flag
& SHF_MASKPROC
)
4031 unknown_flags
|= flag
;
4037 case SHF_WRITE
: *p
= 'W'; break;
4038 case SHF_ALLOC
: *p
= 'A'; break;
4039 case SHF_EXECINSTR
: *p
= 'X'; break;
4040 case SHF_MERGE
: *p
= 'M'; break;
4041 case SHF_STRINGS
: *p
= 'S'; break;
4042 case SHF_INFO_LINK
: *p
= 'I'; break;
4043 case SHF_LINK_ORDER
: *p
= 'L'; break;
4044 case SHF_OS_NONCONFORMING
: *p
= 'O'; break;
4045 case SHF_GROUP
: *p
= 'G'; break;
4046 case SHF_TLS
: *p
= 'T'; break;
4049 if ((elf_header
.e_machine
== EM_X86_64
4050 || elf_header
.e_machine
== EM_L1OM
)
4051 && flag
== SHF_X86_64_LARGE
)
4053 else if (flag
& SHF_MASKOS
)
4056 sh_flags
&= ~ SHF_MASKOS
;
4058 else if (flag
& SHF_MASKPROC
)
4061 sh_flags
&= ~ SHF_MASKPROC
;
4071 if (do_section_details
)
4075 size
-= 5 + field_size
;
4076 if (p
!= buff
+ field_size
+ 4)
4084 sprintf (p
, "OS (%*.*lx)", field_size
, field_size
,
4085 (unsigned long) os_flags
);
4086 p
+= 5 + field_size
;
4090 size
-= 7 + field_size
;
4091 if (p
!= buff
+ field_size
+ 4)
4099 sprintf (p
, "PROC (%*.*lx)", field_size
, field_size
,
4100 (unsigned long) proc_flags
);
4101 p
+= 7 + field_size
;
4105 size
-= 10 + field_size
;
4106 if (p
!= buff
+ field_size
+ 4)
4114 sprintf (p
, "UNKNOWN (%*.*lx)", field_size
, field_size
,
4115 (unsigned long) unknown_flags
);
4116 p
+= 10 + field_size
;
4125 process_section_headers (FILE * file
)
4127 Elf_Internal_Shdr
* section
;
4130 section_headers
= NULL
;
4132 if (elf_header
.e_shnum
== 0)
4135 printf (_("\nThere are no sections in this file.\n"));
4140 if (do_sections
&& !do_header
)
4141 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
4142 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
4146 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
4149 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
4152 /* Read in the string table, so that we have names to display. */
4153 if (elf_header
.e_shstrndx
!= SHN_UNDEF
4154 && elf_header
.e_shstrndx
< elf_header
.e_shnum
)
4156 section
= section_headers
+ elf_header
.e_shstrndx
;
4158 if (section
->sh_size
!= 0)
4160 string_table
= (char *) get_data (NULL
, file
, section
->sh_offset
,
4161 1, section
->sh_size
,
4164 string_table_length
= string_table
!= NULL
? section
->sh_size
: 0;
4168 /* Scan the sections for the dynamic symbol table
4169 and dynamic string table and debug sections. */
4170 dynamic_symbols
= NULL
;
4171 dynamic_strings
= NULL
;
4172 dynamic_syminfo
= NULL
;
4173 symtab_shndx_hdr
= NULL
;
4175 eh_addr_size
= is_32bit_elf
? 4 : 8;
4176 switch (elf_header
.e_machine
)
4179 case EM_MIPS_RS3_LE
:
4180 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
4181 FDE addresses. However, the ABI also has a semi-official ILP32
4182 variant for which the normal FDE address size rules apply.
4184 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
4185 section, where XX is the size of longs in bits. Unfortunately,
4186 earlier compilers provided no way of distinguishing ILP32 objects
4187 from LP64 objects, so if there's any doubt, we should assume that
4188 the official LP64 form is being used. */
4189 if ((elf_header
.e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
4190 && find_section (".gcc_compiled_long32") == NULL
)
4196 switch (elf_header
.e_flags
& EF_H8_MACH
)
4198 case E_H8_MACH_H8300
:
4199 case E_H8_MACH_H8300HN
:
4200 case E_H8_MACH_H8300SN
:
4201 case E_H8_MACH_H8300SXN
:
4204 case E_H8_MACH_H8300H
:
4205 case E_H8_MACH_H8300S
:
4206 case E_H8_MACH_H8300SX
:
4214 switch (elf_header
.e_flags
& EF_M32C_CPU_MASK
)
4216 case EF_M32C_CPU_M16C
:
4223 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
4226 size_t expected_entsize \
4227 = is_32bit_elf ? size32 : size64; \
4228 if (section->sh_entsize != expected_entsize) \
4229 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
4230 i, (unsigned long int) section->sh_entsize, \
4231 (unsigned long int) expected_entsize); \
4232 section->sh_entsize = expected_entsize; \
4235 #define CHECK_ENTSIZE(section, i, type) \
4236 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
4237 sizeof (Elf64_External_##type))
4239 for (i
= 0, section
= section_headers
;
4240 i
< elf_header
.e_shnum
;
4243 char * name
= SECTION_NAME (section
);
4245 if (section
->sh_type
== SHT_DYNSYM
)
4247 if (dynamic_symbols
!= NULL
)
4249 error (_("File contains multiple dynamic symbol tables\n"));
4253 CHECK_ENTSIZE (section
, i
, Sym
);
4254 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
4255 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
4257 else if (section
->sh_type
== SHT_STRTAB
4258 && streq (name
, ".dynstr"))
4260 if (dynamic_strings
!= NULL
)
4262 error (_("File contains multiple dynamic string tables\n"));
4266 dynamic_strings
= (char *) get_data (NULL
, file
, section
->sh_offset
,
4267 1, section
->sh_size
,
4268 _("dynamic strings"));
4269 dynamic_strings_length
= section
->sh_size
;
4271 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
4273 if (symtab_shndx_hdr
!= NULL
)
4275 error (_("File contains multiple symtab shndx tables\n"));
4278 symtab_shndx_hdr
= section
;
4280 else if (section
->sh_type
== SHT_SYMTAB
)
4281 CHECK_ENTSIZE (section
, i
, Sym
);
4282 else if (section
->sh_type
== SHT_GROUP
)
4283 CHECK_ENTSIZE_VALUES (section
, i
, GRP_ENTRY_SIZE
, GRP_ENTRY_SIZE
);
4284 else if (section
->sh_type
== SHT_REL
)
4285 CHECK_ENTSIZE (section
, i
, Rel
);
4286 else if (section
->sh_type
== SHT_RELA
)
4287 CHECK_ENTSIZE (section
, i
, Rela
);
4288 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
4289 || do_debug_lines
|| do_debug_pubnames
4290 || do_debug_aranges
|| do_debug_frames
|| do_debug_macinfo
4291 || do_debug_str
|| do_debug_loc
|| do_debug_ranges
)
4292 && (const_strneq (name
, ".debug_")
4293 || const_strneq (name
, ".zdebug_")))
4296 name
+= sizeof (".zdebug_") - 1;
4298 name
+= sizeof (".debug_") - 1;
4301 || (do_debug_info
&& streq (name
, "info"))
4302 || (do_debug_info
&& streq (name
, "types"))
4303 || (do_debug_abbrevs
&& streq (name
, "abbrev"))
4304 || (do_debug_lines
&& streq (name
, "line"))
4305 || (do_debug_pubnames
&& streq (name
, "pubnames"))
4306 || (do_debug_aranges
&& streq (name
, "aranges"))
4307 || (do_debug_ranges
&& streq (name
, "ranges"))
4308 || (do_debug_frames
&& streq (name
, "frame"))
4309 || (do_debug_macinfo
&& streq (name
, "macinfo"))
4310 || (do_debug_str
&& streq (name
, "str"))
4311 || (do_debug_loc
&& streq (name
, "loc"))
4313 request_dump_bynumber (i
, DEBUG_DUMP
);
4315 /* Linkonce section to be combined with .debug_info at link time. */
4316 else if ((do_debugging
|| do_debug_info
)
4317 && const_strneq (name
, ".gnu.linkonce.wi."))
4318 request_dump_bynumber (i
, DEBUG_DUMP
);
4319 else if (do_debug_frames
&& streq (name
, ".eh_frame"))
4320 request_dump_bynumber (i
, DEBUG_DUMP
);
4326 if (elf_header
.e_shnum
> 1)
4327 printf (_("\nSection Headers:\n"));
4329 printf (_("\nSection Header:\n"));
4333 if (do_section_details
)
4335 printf (_(" [Nr] Name\n"));
4336 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
4340 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4344 if (do_section_details
)
4346 printf (_(" [Nr] Name\n"));
4347 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
4351 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4355 if (do_section_details
)
4357 printf (_(" [Nr] Name\n"));
4358 printf (_(" Type Address Offset Link\n"));
4359 printf (_(" Size EntSize Info Align\n"));
4363 printf (_(" [Nr] Name Type Address Offset\n"));
4364 printf (_(" Size EntSize Flags Link Info Align\n"));
4368 if (do_section_details
)
4369 printf (_(" Flags\n"));
4371 for (i
= 0, section
= section_headers
;
4372 i
< elf_header
.e_shnum
;
4375 if (do_section_details
)
4377 printf (" [%2u] %s\n",
4379 SECTION_NAME (section
));
4380 if (is_32bit_elf
|| do_wide
)
4381 printf (" %-15.15s ",
4382 get_section_type_name (section
->sh_type
));
4385 printf ((do_wide
? " [%2u] %-17s %-15s "
4386 : " [%2u] %-17.17s %-15.15s "),
4388 SECTION_NAME (section
),
4389 get_section_type_name (section
->sh_type
));
4393 const char * link_too_big
= NULL
;
4395 print_vma (section
->sh_addr
, LONG_HEX
);
4397 printf ( " %6.6lx %6.6lx %2.2lx",
4398 (unsigned long) section
->sh_offset
,
4399 (unsigned long) section
->sh_size
,
4400 (unsigned long) section
->sh_entsize
);
4402 if (do_section_details
)
4403 fputs (" ", stdout
);
4405 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4407 if (section
->sh_link
>= elf_header
.e_shnum
)
4410 /* The sh_link value is out of range. Normally this indicates
4411 an error but it can have special values in Solaris binaries. */
4412 switch (elf_header
.e_machine
)
4417 case EM_OLD_SPARCV9
:
4418 case EM_SPARC32PLUS
:
4421 if (section
->sh_link
== (SHN_BEFORE
& 0xffff))
4422 link_too_big
= "BEFORE";
4423 else if (section
->sh_link
== (SHN_AFTER
& 0xffff))
4424 link_too_big
= "AFTER";
4431 if (do_section_details
)
4433 if (link_too_big
!= NULL
&& * link_too_big
)
4434 printf ("<%s> ", link_too_big
);
4436 printf ("%2u ", section
->sh_link
);
4437 printf ("%3u %2lu\n", section
->sh_info
,
4438 (unsigned long) section
->sh_addralign
);
4441 printf ("%2u %3u %2lu\n",
4444 (unsigned long) section
->sh_addralign
);
4446 if (link_too_big
&& ! * link_too_big
)
4447 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
4448 i
, section
->sh_link
);
4452 print_vma (section
->sh_addr
, LONG_HEX
);
4454 if ((long) section
->sh_offset
== section
->sh_offset
)
4455 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
4459 print_vma (section
->sh_offset
, LONG_HEX
);
4462 if ((unsigned long) section
->sh_size
== section
->sh_size
)
4463 printf (" %6.6lx", (unsigned long) section
->sh_size
);
4467 print_vma (section
->sh_size
, LONG_HEX
);
4470 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
4471 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
4475 print_vma (section
->sh_entsize
, LONG_HEX
);
4478 if (do_section_details
)
4479 fputs (" ", stdout
);
4481 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4483 printf ("%2u %3u ", section
->sh_link
, section
->sh_info
);
4485 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
4486 printf ("%2lu\n", (unsigned long) section
->sh_addralign
);
4489 print_vma (section
->sh_addralign
, DEC
);
4493 else if (do_section_details
)
4495 printf (" %-15.15s ",
4496 get_section_type_name (section
->sh_type
));
4497 print_vma (section
->sh_addr
, LONG_HEX
);
4498 if ((long) section
->sh_offset
== section
->sh_offset
)
4499 printf (" %16.16lx", (unsigned long) section
->sh_offset
);
4503 print_vma (section
->sh_offset
, LONG_HEX
);
4505 printf (" %u\n ", section
->sh_link
);
4506 print_vma (section
->sh_size
, LONG_HEX
);
4508 print_vma (section
->sh_entsize
, LONG_HEX
);
4510 printf (" %-16u %lu\n",
4512 (unsigned long) section
->sh_addralign
);
4517 print_vma (section
->sh_addr
, LONG_HEX
);
4518 if ((long) section
->sh_offset
== section
->sh_offset
)
4519 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
4523 print_vma (section
->sh_offset
, LONG_HEX
);
4526 print_vma (section
->sh_size
, LONG_HEX
);
4528 print_vma (section
->sh_entsize
, LONG_HEX
);
4530 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4532 printf (" %2u %3u %lu\n",
4535 (unsigned long) section
->sh_addralign
);
4538 if (do_section_details
)
4539 printf (" %s\n", get_elf_section_flags (section
->sh_flags
));
4542 if (!do_section_details
)
4543 printf (_("Key to Flags:\n\
4544 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4545 I (info), L (link order), G (group), x (unknown)\n\
4546 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4552 get_group_flags (unsigned int flags
)
4554 static char buff
[32];
4561 snprintf (buff
, sizeof (buff
), _("[<unknown>: 0x%x]"), flags
);
4568 process_section_groups (FILE * file
)
4570 Elf_Internal_Shdr
* section
;
4572 struct group
* group
;
4573 Elf_Internal_Shdr
* symtab_sec
;
4574 Elf_Internal_Shdr
* strtab_sec
;
4575 Elf_Internal_Sym
* symtab
;
4579 /* Don't process section groups unless needed. */
4580 if (!do_unwind
&& !do_section_groups
)
4583 if (elf_header
.e_shnum
== 0)
4585 if (do_section_groups
)
4586 printf (_("\nThere are no sections in this file.\n"));
4591 if (section_headers
== NULL
)
4593 error (_("Section headers are not available!\n"));
4597 section_headers_groups
= (struct group
**) calloc (elf_header
.e_shnum
,
4598 sizeof (struct group
*));
4600 if (section_headers_groups
== NULL
)
4602 error (_("Out of memory\n"));
4606 /* Scan the sections for the group section. */
4608 for (i
= 0, section
= section_headers
;
4609 i
< elf_header
.e_shnum
;
4611 if (section
->sh_type
== SHT_GROUP
)
4614 if (group_count
== 0)
4616 if (do_section_groups
)
4617 printf (_("\nThere are no section groups in this file.\n"));
4622 section_groups
= (struct group
*) calloc (group_count
, sizeof (struct group
));
4624 if (section_groups
== NULL
)
4626 error (_("Out of memory\n"));
4635 for (i
= 0, section
= section_headers
, group
= section_groups
;
4636 i
< elf_header
.e_shnum
;
4639 if (section
->sh_type
== SHT_GROUP
)
4641 char * name
= SECTION_NAME (section
);
4643 unsigned char * start
;
4644 unsigned char * indices
;
4645 unsigned int entry
, j
, size
;
4646 Elf_Internal_Shdr
* sec
;
4647 Elf_Internal_Sym
* sym
;
4649 /* Get the symbol table. */
4650 if (section
->sh_link
>= elf_header
.e_shnum
4651 || ((sec
= section_headers
+ section
->sh_link
)->sh_type
4654 error (_("Bad sh_link in group section `%s'\n"), name
);
4658 if (symtab_sec
!= sec
)
4663 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
);
4666 sym
= symtab
+ section
->sh_info
;
4668 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4670 if (sym
->st_shndx
== 0
4671 || sym
->st_shndx
>= elf_header
.e_shnum
)
4673 error (_("Bad sh_info in group section `%s'\n"), name
);
4677 group_name
= SECTION_NAME (section_headers
+ sym
->st_shndx
);
4686 /* Get the string table. */
4687 if (symtab_sec
->sh_link
>= elf_header
.e_shnum
)
4696 != (sec
= section_headers
+ symtab_sec
->sh_link
))
4701 strtab
= (char *) get_data (NULL
, file
, strtab_sec
->sh_offset
,
4702 1, strtab_sec
->sh_size
,
4704 strtab_size
= strtab
!= NULL
? strtab_sec
->sh_size
: 0;
4706 group_name
= sym
->st_name
< strtab_size
4707 ? strtab
+ sym
->st_name
: "<corrupt>";
4710 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
,
4711 1, section
->sh_size
,
4715 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
4716 entry
= byte_get (indices
, 4);
4719 if (do_section_groups
)
4721 printf ("\n%s group section [%5u] `%s' [%s] contains %u sections:\n",
4722 get_group_flags (entry
), i
, name
, group_name
, size
);
4724 printf (_(" [Index] Name\n"));
4727 group
->group_index
= i
;
4729 for (j
= 0; j
< size
; j
++)
4731 struct group_list
* g
;
4733 entry
= byte_get (indices
, 4);
4736 if (entry
>= elf_header
.e_shnum
)
4738 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
4739 entry
, i
, elf_header
.e_shnum
- 1);
4743 if (section_headers_groups
[entry
] != NULL
)
4747 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
4749 section_headers_groups
[entry
]->group_index
);
4754 /* Intel C/C++ compiler may put section 0 in a
4755 section group. We just warn it the first time
4756 and ignore it afterwards. */
4757 static int warned
= 0;
4760 error (_("section 0 in group section [%5u]\n"),
4761 section_headers_groups
[entry
]->group_index
);
4767 section_headers_groups
[entry
] = group
;
4769 if (do_section_groups
)
4771 sec
= section_headers
+ entry
;
4772 printf (" [%5u] %s\n", entry
, SECTION_NAME (sec
));
4775 g
= (struct group_list
*) xmalloc (sizeof (struct group_list
));
4776 g
->section_index
= entry
;
4777 g
->next
= group
->root
;
4801 } dynamic_relocations
[] =
4803 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
4804 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
4805 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
4808 /* Process the reloc section. */
4811 process_relocs (FILE * file
)
4813 unsigned long rel_size
;
4814 unsigned long rel_offset
;
4820 if (do_using_dynamic
)
4824 int has_dynamic_reloc
;
4827 has_dynamic_reloc
= 0;
4829 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
4831 is_rela
= dynamic_relocations
[i
].rela
;
4832 name
= dynamic_relocations
[i
].name
;
4833 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
4834 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
4836 has_dynamic_reloc
|= rel_size
;
4838 if (is_rela
== UNKNOWN
)
4840 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
4841 switch (dynamic_info
[DT_PLTREL
])
4855 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4856 name
, rel_offset
, rel_size
);
4858 dump_relocations (file
,
4859 offset_from_vma (file
, rel_offset
, rel_size
),
4861 dynamic_symbols
, num_dynamic_syms
,
4862 dynamic_strings
, dynamic_strings_length
, is_rela
);
4866 if (! has_dynamic_reloc
)
4867 printf (_("\nThere are no dynamic relocations in this file.\n"));
4871 Elf_Internal_Shdr
* section
;
4875 for (i
= 0, section
= section_headers
;
4876 i
< elf_header
.e_shnum
;
4879 if ( section
->sh_type
!= SHT_RELA
4880 && section
->sh_type
!= SHT_REL
)
4883 rel_offset
= section
->sh_offset
;
4884 rel_size
= section
->sh_size
;
4888 Elf_Internal_Shdr
* strsec
;
4891 printf (_("\nRelocation section "));
4893 if (string_table
== NULL
)
4894 printf ("%d", section
->sh_name
);
4896 printf (_("'%s'"), SECTION_NAME (section
));
4898 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4899 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4901 is_rela
= section
->sh_type
== SHT_RELA
;
4903 if (section
->sh_link
!= 0
4904 && section
->sh_link
< elf_header
.e_shnum
)
4906 Elf_Internal_Shdr
* symsec
;
4907 Elf_Internal_Sym
* symtab
;
4908 unsigned long nsyms
;
4909 unsigned long strtablen
= 0;
4910 char * strtab
= NULL
;
4912 symsec
= section_headers
+ section
->sh_link
;
4913 if (symsec
->sh_type
!= SHT_SYMTAB
4914 && symsec
->sh_type
!= SHT_DYNSYM
)
4917 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4918 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4923 if (symsec
->sh_link
!= 0
4924 && symsec
->sh_link
< elf_header
.e_shnum
)
4926 strsec
= section_headers
+ symsec
->sh_link
;
4928 strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
4931 strtablen
= strtab
== NULL
? 0 : strsec
->sh_size
;
4934 dump_relocations (file
, rel_offset
, rel_size
,
4935 symtab
, nsyms
, strtab
, strtablen
, is_rela
);
4941 dump_relocations (file
, rel_offset
, rel_size
,
4942 NULL
, 0, NULL
, 0, is_rela
);
4949 printf (_("\nThere are no relocations in this file.\n"));
4955 /* Process the unwind section. */
4957 #include "unwind-ia64.h"
4959 /* An absolute address consists of a section and an offset. If the
4960 section is NULL, the offset itself is the address, otherwise, the
4961 address equals to LOAD_ADDRESS(section) + offset. */
4965 unsigned short section
;
4969 #define ABSADDR(a) \
4971 ? section_headers [(a).section].sh_addr + (a).offset \
4974 struct ia64_unw_table_entry
4976 struct absaddr start
;
4978 struct absaddr info
;
4981 struct ia64_unw_aux_info
4984 struct ia64_unw_table_entry
*table
; /* Unwind table. */
4985 unsigned long table_len
; /* Length of unwind table. */
4986 unsigned char * info
; /* Unwind info. */
4987 unsigned long info_size
; /* Size of unwind info. */
4988 bfd_vma info_addr
; /* starting address of unwind info. */
4989 bfd_vma seg_base
; /* Starting address of segment. */
4990 Elf_Internal_Sym
* symtab
; /* The symbol table. */
4991 unsigned long nsyms
; /* Number of symbols. */
4992 char * strtab
; /* The string table. */
4993 unsigned long strtab_size
; /* Size of string table. */
4997 find_symbol_for_address (Elf_Internal_Sym
* symtab
,
4998 unsigned long nsyms
,
4999 const char * strtab
,
5000 unsigned long strtab_size
,
5001 struct absaddr addr
,
5002 const char ** symname
,
5005 bfd_vma dist
= 0x100000;
5006 Elf_Internal_Sym
* sym
;
5007 Elf_Internal_Sym
* best
= NULL
;
5010 for (i
= 0, sym
= symtab
; i
< nsyms
; ++i
, ++sym
)
5012 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
5013 && sym
->st_name
!= 0
5014 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
5015 && addr
.offset
>= sym
->st_value
5016 && addr
.offset
- sym
->st_value
< dist
)
5019 dist
= addr
.offset
- sym
->st_value
;
5026 *symname
= (best
->st_name
>= strtab_size
5027 ? "<corrupt>" : strtab
+ best
->st_name
);
5032 *offset
= addr
.offset
;
5036 dump_ia64_unwind (struct ia64_unw_aux_info
* aux
)
5038 struct ia64_unw_table_entry
* tp
;
5041 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
5045 const unsigned char * dp
;
5046 const unsigned char * head
;
5047 const char * procname
;
5049 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
5050 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
5052 fputs ("\n<", stdout
);
5056 fputs (procname
, stdout
);
5059 printf ("+%lx", (unsigned long) offset
);
5062 fputs (">: [", stdout
);
5063 print_vma (tp
->start
.offset
, PREFIX_HEX
);
5064 fputc ('-', stdout
);
5065 print_vma (tp
->end
.offset
, PREFIX_HEX
);
5066 printf ("], info at +0x%lx\n",
5067 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
5069 head
= aux
->info
+ (ABSADDR (tp
->info
) - aux
->info_addr
);
5070 stamp
= byte_get ((unsigned char *) head
, sizeof (stamp
));
5072 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
5073 (unsigned) UNW_VER (stamp
),
5074 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
5075 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
5076 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
5077 (unsigned long) (eh_addr_size
* UNW_LENGTH (stamp
)));
5079 if (UNW_VER (stamp
) != 1)
5081 printf ("\tUnknown version.\n");
5086 for (dp
= head
+ 8; dp
< head
+ 8 + eh_addr_size
* UNW_LENGTH (stamp
);)
5087 dp
= unw_decode (dp
, in_body
, & in_body
);
5092 slurp_ia64_unwind_table (FILE * file
,
5093 struct ia64_unw_aux_info
* aux
,
5094 Elf_Internal_Shdr
* sec
)
5096 unsigned long size
, nrelas
, i
;
5097 Elf_Internal_Phdr
* seg
;
5098 struct ia64_unw_table_entry
* tep
;
5099 Elf_Internal_Shdr
* relsec
;
5100 Elf_Internal_Rela
* rela
;
5101 Elf_Internal_Rela
* rp
;
5102 unsigned char * table
;
5104 Elf_Internal_Sym
* sym
;
5105 const char * relname
;
5107 /* First, find the starting address of the segment that includes
5110 if (elf_header
.e_phnum
)
5112 if (! get_program_headers (file
))
5115 for (seg
= program_headers
;
5116 seg
< program_headers
+ elf_header
.e_phnum
;
5119 if (seg
->p_type
!= PT_LOAD
)
5122 if (sec
->sh_addr
>= seg
->p_vaddr
5123 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5125 aux
->seg_base
= seg
->p_vaddr
;
5131 /* Second, build the unwind table from the contents of the unwind section: */
5132 size
= sec
->sh_size
;
5133 table
= (unsigned char *) get_data (NULL
, file
, sec
->sh_offset
, 1, size
,
5138 aux
->table
= (struct ia64_unw_table_entry
*)
5139 xcmalloc (size
/ (3 * eh_addr_size
), sizeof (aux
->table
[0]));
5141 for (tp
= table
; tp
< table
+ size
; ++tep
)
5143 tep
->start
.section
= SHN_UNDEF
;
5144 tep
->end
.section
= SHN_UNDEF
;
5145 tep
->info
.section
= SHN_UNDEF
;
5146 tep
->start
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
5147 tep
->end
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
5148 tep
->info
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
5149 tep
->start
.offset
+= aux
->seg_base
;
5150 tep
->end
.offset
+= aux
->seg_base
;
5151 tep
->info
.offset
+= aux
->seg_base
;
5155 /* Third, apply any relocations to the unwind table: */
5156 for (relsec
= section_headers
;
5157 relsec
< section_headers
+ elf_header
.e_shnum
;
5160 if (relsec
->sh_type
!= SHT_RELA
5161 || relsec
->sh_info
>= elf_header
.e_shnum
5162 || section_headers
+ relsec
->sh_info
!= sec
)
5165 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5169 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5171 relname
= elf_ia64_reloc_type (get_reloc_type (rp
->r_info
));
5172 sym
= aux
->symtab
+ get_reloc_symindex (rp
->r_info
);
5174 if (! const_strneq (relname
, "R_IA64_SEGREL"))
5176 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5180 i
= rp
->r_offset
/ (3 * eh_addr_size
);
5182 switch (rp
->r_offset
/eh_addr_size
% 3)
5185 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5186 aux
->table
[i
].start
.offset
+= rp
->r_addend
+ sym
->st_value
;
5189 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5190 aux
->table
[i
].end
.offset
+= rp
->r_addend
+ sym
->st_value
;
5193 aux
->table
[i
].info
.section
= sym
->st_shndx
;
5194 aux
->table
[i
].info
.offset
+= rp
->r_addend
+ sym
->st_value
;
5204 aux
->table_len
= size
/ (3 * eh_addr_size
);
5209 ia64_process_unwind (FILE * file
)
5211 Elf_Internal_Shdr
* sec
;
5212 Elf_Internal_Shdr
* unwsec
= NULL
;
5213 Elf_Internal_Shdr
* strsec
;
5214 unsigned long i
, unwcount
= 0, unwstart
= 0;
5215 struct ia64_unw_aux_info aux
;
5217 memset (& aux
, 0, sizeof (aux
));
5219 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5221 if (sec
->sh_type
== SHT_SYMTAB
5222 && sec
->sh_link
< elf_header
.e_shnum
)
5224 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5225 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5227 strsec
= section_headers
+ sec
->sh_link
;
5228 aux
.strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
5231 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5233 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
5238 printf (_("\nThere are no unwind sections in this file.\n"));
5240 while (unwcount
-- > 0)
5245 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
5246 i
< elf_header
.e_shnum
; ++i
, ++sec
)
5247 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
5254 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
5256 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
5258 /* We need to find which section group it is in. */
5259 struct group_list
* g
= section_headers_groups
[i
]->root
;
5261 for (; g
!= NULL
; g
= g
->next
)
5263 sec
= section_headers
+ g
->section_index
;
5265 if (streq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
))
5270 i
= elf_header
.e_shnum
;
5272 else if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
, len
))
5274 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
5275 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
5276 suffix
= SECTION_NAME (unwsec
) + len
;
5277 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
5279 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info_once
, len2
)
5280 && streq (SECTION_NAME (sec
) + len2
, suffix
))
5285 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
5286 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
5287 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
5288 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
5290 if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
, len
))
5291 suffix
= SECTION_NAME (unwsec
) + len
;
5292 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
5294 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
, len2
)
5295 && streq (SECTION_NAME (sec
) + len2
, suffix
))
5299 if (i
== elf_header
.e_shnum
)
5301 printf (_("\nCould not find unwind info section for "));
5303 if (string_table
== NULL
)
5304 printf ("%d", unwsec
->sh_name
);
5306 printf (_("'%s'"), SECTION_NAME (unwsec
));
5310 aux
.info_size
= sec
->sh_size
;
5311 aux
.info_addr
= sec
->sh_addr
;
5312 aux
.info
= (unsigned char *) get_data (NULL
, file
, sec
->sh_offset
, 1,
5316 printf (_("\nUnwind section "));
5318 if (string_table
== NULL
)
5319 printf ("%d", unwsec
->sh_name
);
5321 printf (_("'%s'"), SECTION_NAME (unwsec
));
5323 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5324 (unsigned long) unwsec
->sh_offset
,
5325 (unsigned long) (unwsec
->sh_size
/ (3 * eh_addr_size
)));
5327 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
5329 if (aux
.table_len
> 0)
5330 dump_ia64_unwind (& aux
);
5333 free ((char *) aux
.table
);
5335 free ((char *) aux
.info
);
5344 free ((char *) aux
.strtab
);
5349 struct hppa_unw_table_entry
5351 struct absaddr start
;
5353 unsigned int Cannot_unwind
:1; /* 0 */
5354 unsigned int Millicode
:1; /* 1 */
5355 unsigned int Millicode_save_sr0
:1; /* 2 */
5356 unsigned int Region_description
:2; /* 3..4 */
5357 unsigned int reserved1
:1; /* 5 */
5358 unsigned int Entry_SR
:1; /* 6 */
5359 unsigned int Entry_FR
:4; /* number saved */ /* 7..10 */
5360 unsigned int Entry_GR
:5; /* number saved */ /* 11..15 */
5361 unsigned int Args_stored
:1; /* 16 */
5362 unsigned int Variable_Frame
:1; /* 17 */
5363 unsigned int Separate_Package_Body
:1; /* 18 */
5364 unsigned int Frame_Extension_Millicode
:1; /* 19 */
5365 unsigned int Stack_Overflow_Check
:1; /* 20 */
5366 unsigned int Two_Instruction_SP_Increment
:1; /* 21 */
5367 unsigned int Ada_Region
:1; /* 22 */
5368 unsigned int cxx_info
:1; /* 23 */
5369 unsigned int cxx_try_catch
:1; /* 24 */
5370 unsigned int sched_entry_seq
:1; /* 25 */
5371 unsigned int reserved2
:1; /* 26 */
5372 unsigned int Save_SP
:1; /* 27 */
5373 unsigned int Save_RP
:1; /* 28 */
5374 unsigned int Save_MRP_in_frame
:1; /* 29 */
5375 unsigned int extn_ptr_defined
:1; /* 30 */
5376 unsigned int Cleanup_defined
:1; /* 31 */
5378 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
5379 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
5380 unsigned int Large_frame
:1; /* 2 */
5381 unsigned int Pseudo_SP_Set
:1; /* 3 */
5382 unsigned int reserved4
:1; /* 4 */
5383 unsigned int Total_frame_size
:27; /* 5..31 */
5386 struct hppa_unw_aux_info
5388 struct hppa_unw_table_entry
*table
; /* Unwind table. */
5389 unsigned long table_len
; /* Length of unwind table. */
5390 bfd_vma seg_base
; /* Starting address of segment. */
5391 Elf_Internal_Sym
* symtab
; /* The symbol table. */
5392 unsigned long nsyms
; /* Number of symbols. */
5393 char * strtab
; /* The string table. */
5394 unsigned long strtab_size
; /* Size of string table. */
5398 dump_hppa_unwind (struct hppa_unw_aux_info
* aux
)
5400 struct hppa_unw_table_entry
* tp
;
5402 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
5405 const char * procname
;
5407 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
5408 aux
->strtab_size
, tp
->start
, &procname
,
5411 fputs ("\n<", stdout
);
5415 fputs (procname
, stdout
);
5418 printf ("+%lx", (unsigned long) offset
);
5421 fputs (">: [", stdout
);
5422 print_vma (tp
->start
.offset
, PREFIX_HEX
);
5423 fputc ('-', stdout
);
5424 print_vma (tp
->end
.offset
, PREFIX_HEX
);
5427 #define PF(_m) if (tp->_m) printf (#_m " ");
5428 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5431 PF(Millicode_save_sr0
);
5432 /* PV(Region_description); */
5438 PF(Separate_Package_Body
);
5439 PF(Frame_Extension_Millicode
);
5440 PF(Stack_Overflow_Check
);
5441 PF(Two_Instruction_SP_Increment
);
5445 PF(sched_entry_seq
);
5448 PF(Save_MRP_in_frame
);
5449 PF(extn_ptr_defined
);
5450 PF(Cleanup_defined
);
5451 PF(MPE_XL_interrupt_marker
);
5452 PF(HP_UX_interrupt_marker
);
5455 PV(Total_frame_size
);
5464 slurp_hppa_unwind_table (FILE * file
,
5465 struct hppa_unw_aux_info
* aux
,
5466 Elf_Internal_Shdr
* sec
)
5468 unsigned long size
, unw_ent_size
, nentries
, nrelas
, i
;
5469 Elf_Internal_Phdr
* seg
;
5470 struct hppa_unw_table_entry
* tep
;
5471 Elf_Internal_Shdr
* relsec
;
5472 Elf_Internal_Rela
* rela
;
5473 Elf_Internal_Rela
* rp
;
5474 unsigned char * table
;
5476 Elf_Internal_Sym
* sym
;
5477 const char * relname
;
5479 /* First, find the starting address of the segment that includes
5482 if (elf_header
.e_phnum
)
5484 if (! get_program_headers (file
))
5487 for (seg
= program_headers
;
5488 seg
< program_headers
+ elf_header
.e_phnum
;
5491 if (seg
->p_type
!= PT_LOAD
)
5494 if (sec
->sh_addr
>= seg
->p_vaddr
5495 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5497 aux
->seg_base
= seg
->p_vaddr
;
5503 /* Second, build the unwind table from the contents of the unwind
5505 size
= sec
->sh_size
;
5506 table
= (unsigned char *) get_data (NULL
, file
, sec
->sh_offset
, 1, size
,
5512 nentries
= size
/ unw_ent_size
;
5513 size
= unw_ent_size
* nentries
;
5515 tep
= aux
->table
= (struct hppa_unw_table_entry
*)
5516 xcmalloc (nentries
, sizeof (aux
->table
[0]));
5518 for (tp
= table
; tp
< table
+ size
; tp
+= unw_ent_size
, ++tep
)
5520 unsigned int tmp1
, tmp2
;
5522 tep
->start
.section
= SHN_UNDEF
;
5523 tep
->end
.section
= SHN_UNDEF
;
5525 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
5526 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
5527 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
5528 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
5530 tep
->start
.offset
+= aux
->seg_base
;
5531 tep
->end
.offset
+= aux
->seg_base
;
5533 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
5534 tep
->Millicode
= (tmp1
>> 30) & 0x1;
5535 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
5536 tep
->Region_description
= (tmp1
>> 27) & 0x3;
5537 tep
->reserved1
= (tmp1
>> 26) & 0x1;
5538 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
5539 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
5540 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
5541 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
5542 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
5543 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
5544 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
5545 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
5546 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
5547 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
5548 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
5549 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
5550 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
5551 tep
->reserved2
= (tmp1
>> 5) & 0x1;
5552 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
5553 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
5554 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
5555 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
5556 tep
->Cleanup_defined
= tmp1
& 0x1;
5558 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
5559 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
5560 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
5561 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
5562 tep
->reserved4
= (tmp2
>> 27) & 0x1;
5563 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
5567 /* Third, apply any relocations to the unwind table. */
5568 for (relsec
= section_headers
;
5569 relsec
< section_headers
+ elf_header
.e_shnum
;
5572 if (relsec
->sh_type
!= SHT_RELA
5573 || relsec
->sh_info
>= elf_header
.e_shnum
5574 || section_headers
+ relsec
->sh_info
!= sec
)
5577 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5581 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5583 relname
= elf_hppa_reloc_type (get_reloc_type (rp
->r_info
));
5584 sym
= aux
->symtab
+ get_reloc_symindex (rp
->r_info
);
5586 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
5587 if (! const_strneq (relname
, "R_PARISC_SEGREL"))
5589 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5593 i
= rp
->r_offset
/ unw_ent_size
;
5595 switch ((rp
->r_offset
% unw_ent_size
) / eh_addr_size
)
5598 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5599 aux
->table
[i
].start
.offset
= sym
->st_value
+ rp
->r_addend
;
5602 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5603 aux
->table
[i
].end
.offset
= sym
->st_value
+ rp
->r_addend
;
5613 aux
->table_len
= nentries
;
5619 hppa_process_unwind (FILE * file
)
5621 struct hppa_unw_aux_info aux
;
5622 Elf_Internal_Shdr
* unwsec
= NULL
;
5623 Elf_Internal_Shdr
* strsec
;
5624 Elf_Internal_Shdr
* sec
;
5627 memset (& aux
, 0, sizeof (aux
));
5629 if (string_table
== NULL
)
5632 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5634 if (sec
->sh_type
== SHT_SYMTAB
5635 && sec
->sh_link
< elf_header
.e_shnum
)
5637 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5638 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5640 strsec
= section_headers
+ sec
->sh_link
;
5641 aux
.strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
5644 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5646 else if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5651 printf (_("\nThere are no unwind sections in this file.\n"));
5653 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5655 if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5657 printf (_("\nUnwind section "));
5658 printf (_("'%s'"), SECTION_NAME (sec
));
5660 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5661 (unsigned long) sec
->sh_offset
,
5662 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
+ 8)));
5664 slurp_hppa_unwind_table (file
, &aux
, sec
);
5665 if (aux
.table_len
> 0)
5666 dump_hppa_unwind (&aux
);
5669 free ((char *) aux
.table
);
5677 free ((char *) aux
.strtab
);
5683 process_unwind (FILE * file
)
5685 struct unwind_handler
5688 int (* handler
)(FILE *);
5691 { EM_IA_64
, ia64_process_unwind
},
5692 { EM_PARISC
, hppa_process_unwind
},
5700 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
5701 if (elf_header
.e_machine
== handlers
[i
].machtype
)
5702 return handlers
[i
].handler (file
);
5704 printf (_("\nThere are no unwind sections in this file.\n"));
5709 dynamic_section_mips_val (Elf_Internal_Dyn
* entry
)
5711 switch (entry
->d_tag
)
5714 if (entry
->d_un
.d_val
== 0)
5718 static const char * opts
[] =
5720 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5721 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5722 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5723 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5728 for (cnt
= 0; cnt
< ARRAY_SIZE (opts
); ++cnt
)
5729 if (entry
->d_un
.d_val
& (1 << cnt
))
5731 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
5738 case DT_MIPS_IVERSION
:
5739 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5740 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5742 printf ("<corrupt: %ld>\n", (long) entry
->d_un
.d_ptr
);
5745 case DT_MIPS_TIME_STAMP
:
5750 time_t time
= entry
->d_un
.d_val
;
5751 tmp
= gmtime (&time
);
5752 snprintf (timebuf
, sizeof (timebuf
), "%04u-%02u-%02uT%02u:%02u:%02u",
5753 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5754 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5755 printf ("Time Stamp: %s\n", timebuf
);
5759 case DT_MIPS_RLD_VERSION
:
5760 case DT_MIPS_LOCAL_GOTNO
:
5761 case DT_MIPS_CONFLICTNO
:
5762 case DT_MIPS_LIBLISTNO
:
5763 case DT_MIPS_SYMTABNO
:
5764 case DT_MIPS_UNREFEXTNO
:
5765 case DT_MIPS_HIPAGENO
:
5766 case DT_MIPS_DELTA_CLASS_NO
:
5767 case DT_MIPS_DELTA_INSTANCE_NO
:
5768 case DT_MIPS_DELTA_RELOC_NO
:
5769 case DT_MIPS_DELTA_SYM_NO
:
5770 case DT_MIPS_DELTA_CLASSSYM_NO
:
5771 case DT_MIPS_COMPACT_SIZE
:
5772 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
5776 printf ("%#lx\n", (unsigned long) entry
->d_un
.d_ptr
);
5782 dynamic_section_parisc_val (Elf_Internal_Dyn
* entry
)
5784 switch (entry
->d_tag
)
5786 case DT_HP_DLD_FLAGS
:
5795 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
5796 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
5797 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
5798 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
5799 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
5800 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
5801 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
5802 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
5803 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
5804 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
5805 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" },
5806 { DT_HP_GST
, "HP_GST" },
5807 { DT_HP_SHLIB_FIXED
, "HP_SHLIB_FIXED" },
5808 { DT_HP_MERGE_SHLIB_SEG
, "HP_MERGE_SHLIB_SEG" },
5809 { DT_HP_NODELETE
, "HP_NODELETE" },
5810 { DT_HP_GROUP
, "HP_GROUP" },
5811 { DT_HP_PROTECT_LINKAGE_TABLE
, "HP_PROTECT_LINKAGE_TABLE" }
5815 bfd_vma val
= entry
->d_un
.d_val
;
5817 for (cnt
= 0; cnt
< ARRAY_SIZE (flags
); ++cnt
)
5818 if (val
& flags
[cnt
].bit
)
5822 fputs (flags
[cnt
].str
, stdout
);
5824 val
^= flags
[cnt
].bit
;
5827 if (val
!= 0 || first
)
5831 print_vma (val
, HEX
);
5837 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5844 dynamic_section_ia64_val (Elf_Internal_Dyn
* entry
)
5846 switch (entry
->d_tag
)
5848 case DT_IA_64_PLT_RESERVE
:
5849 /* First 3 slots reserved. */
5850 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5852 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
5856 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5863 get_32bit_dynamic_section (FILE * file
)
5865 Elf32_External_Dyn
* edyn
;
5866 Elf32_External_Dyn
* ext
;
5867 Elf_Internal_Dyn
* entry
;
5869 edyn
= (Elf32_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
, 1,
5870 dynamic_size
, _("dynamic section"));
5874 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5875 might not have the luxury of section headers. Look for the DT_NULL
5876 terminator to determine the number of entries. */
5877 for (ext
= edyn
, dynamic_nent
= 0;
5878 (char *) ext
< (char *) edyn
+ dynamic_size
;
5882 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5886 dynamic_section
= (Elf_Internal_Dyn
*) cmalloc (dynamic_nent
,
5888 if (dynamic_section
== NULL
)
5890 error (_("Out of memory\n"));
5895 for (ext
= edyn
, entry
= dynamic_section
;
5896 entry
< dynamic_section
+ dynamic_nent
;
5899 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5900 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5909 get_64bit_dynamic_section (FILE * file
)
5911 Elf64_External_Dyn
* edyn
;
5912 Elf64_External_Dyn
* ext
;
5913 Elf_Internal_Dyn
* entry
;
5915 edyn
= (Elf64_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
, 1,
5916 dynamic_size
, _("dynamic section"));
5920 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5921 might not have the luxury of section headers. Look for the DT_NULL
5922 terminator to determine the number of entries. */
5923 for (ext
= edyn
, dynamic_nent
= 0;
5924 (char *) ext
< (char *) edyn
+ dynamic_size
;
5928 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5932 dynamic_section
= (Elf_Internal_Dyn
*) cmalloc (dynamic_nent
,
5934 if (dynamic_section
== NULL
)
5936 error (_("Out of memory\n"));
5941 for (ext
= edyn
, entry
= dynamic_section
;
5942 entry
< dynamic_section
+ dynamic_nent
;
5945 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5946 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5955 print_dynamic_flags (bfd_vma flags
)
5963 flag
= flags
& - flags
;
5973 case DF_ORIGIN
: fputs ("ORIGIN", stdout
); break;
5974 case DF_SYMBOLIC
: fputs ("SYMBOLIC", stdout
); break;
5975 case DF_TEXTREL
: fputs ("TEXTREL", stdout
); break;
5976 case DF_BIND_NOW
: fputs ("BIND_NOW", stdout
); break;
5977 case DF_STATIC_TLS
: fputs ("STATIC_TLS", stdout
); break;
5978 default: fputs ("unknown", stdout
); break;
5984 /* Parse and display the contents of the dynamic section. */
5987 process_dynamic_section (FILE * file
)
5989 Elf_Internal_Dyn
* entry
;
5991 if (dynamic_size
== 0)
5994 printf (_("\nThere is no dynamic section in this file.\n"));
6001 if (! get_32bit_dynamic_section (file
))
6004 else if (! get_64bit_dynamic_section (file
))
6007 /* Find the appropriate symbol table. */
6008 if (dynamic_symbols
== NULL
)
6010 for (entry
= dynamic_section
;
6011 entry
< dynamic_section
+ dynamic_nent
;
6014 Elf_Internal_Shdr section
;
6016 if (entry
->d_tag
!= DT_SYMTAB
)
6019 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
6021 /* Since we do not know how big the symbol table is,
6022 we default to reading in the entire file (!) and
6023 processing that. This is overkill, I know, but it
6025 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
6027 if (archive_file_offset
!= 0)
6028 section
.sh_size
= archive_file_size
- section
.sh_offset
;
6031 if (fseek (file
, 0, SEEK_END
))
6032 error (_("Unable to seek to end of file!\n"));
6034 section
.sh_size
= ftell (file
) - section
.sh_offset
;
6038 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
6040 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
6042 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
6043 if (num_dynamic_syms
< 1)
6045 error (_("Unable to determine the number of symbols to load\n"));
6049 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
6053 /* Similarly find a string table. */
6054 if (dynamic_strings
== NULL
)
6056 for (entry
= dynamic_section
;
6057 entry
< dynamic_section
+ dynamic_nent
;
6060 unsigned long offset
;
6063 if (entry
->d_tag
!= DT_STRTAB
)
6066 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
6068 /* Since we do not know how big the string table is,
6069 we default to reading in the entire file (!) and
6070 processing that. This is overkill, I know, but it
6073 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
6075 if (archive_file_offset
!= 0)
6076 str_tab_len
= archive_file_size
- offset
;
6079 if (fseek (file
, 0, SEEK_END
))
6080 error (_("Unable to seek to end of file\n"));
6081 str_tab_len
= ftell (file
) - offset
;
6084 if (str_tab_len
< 1)
6087 (_("Unable to determine the length of the dynamic string table\n"));
6091 dynamic_strings
= (char *) get_data (NULL
, file
, offset
, 1,
6093 _("dynamic string table"));
6094 dynamic_strings_length
= str_tab_len
;
6099 /* And find the syminfo section if available. */
6100 if (dynamic_syminfo
== NULL
)
6102 unsigned long syminsz
= 0;
6104 for (entry
= dynamic_section
;
6105 entry
< dynamic_section
+ dynamic_nent
;
6108 if (entry
->d_tag
== DT_SYMINENT
)
6110 /* Note: these braces are necessary to avoid a syntax
6111 error from the SunOS4 C compiler. */
6112 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
6114 else if (entry
->d_tag
== DT_SYMINSZ
)
6115 syminsz
= entry
->d_un
.d_val
;
6116 else if (entry
->d_tag
== DT_SYMINFO
)
6117 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
6121 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
6123 Elf_External_Syminfo
* extsyminfo
;
6124 Elf_External_Syminfo
* extsym
;
6125 Elf_Internal_Syminfo
* syminfo
;
6127 /* There is a syminfo section. Read the data. */
6128 extsyminfo
= (Elf_External_Syminfo
*)
6129 get_data (NULL
, file
, dynamic_syminfo_offset
, 1, syminsz
,
6130 _("symbol information"));
6134 dynamic_syminfo
= (Elf_Internal_Syminfo
*) malloc (syminsz
);
6135 if (dynamic_syminfo
== NULL
)
6137 error (_("Out of memory\n"));
6141 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
6142 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
6143 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
6144 ++syminfo
, ++extsym
)
6146 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
6147 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
6154 if (do_dynamic
&& dynamic_addr
)
6155 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
6156 dynamic_addr
, dynamic_nent
);
6158 printf (_(" Tag Type Name/Value\n"));
6160 for (entry
= dynamic_section
;
6161 entry
< dynamic_section
+ dynamic_nent
;
6169 print_vma (entry
->d_tag
, FULL_HEX
);
6170 dtype
= get_dynamic_type (entry
->d_tag
);
6171 printf (" (%s)%*s", dtype
,
6172 ((is_32bit_elf
? 27 : 19)
6173 - (int) strlen (dtype
)),
6177 switch (entry
->d_tag
)
6181 print_dynamic_flags (entry
->d_un
.d_val
);
6191 switch (entry
->d_tag
)
6194 printf (_("Auxiliary library"));
6198 printf (_("Filter library"));
6202 printf (_("Configuration file"));
6206 printf (_("Dependency audit library"));
6210 printf (_("Audit library"));
6214 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6215 printf (": [%s]\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
6219 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6228 printf (_("Flags:"));
6230 if (entry
->d_un
.d_val
== 0)
6231 printf (_(" None\n"));
6234 unsigned long int val
= entry
->d_un
.d_val
;
6236 if (val
& DTF_1_PARINIT
)
6238 printf (" PARINIT");
6239 val
^= DTF_1_PARINIT
;
6241 if (val
& DTF_1_CONFEXP
)
6243 printf (" CONFEXP");
6244 val
^= DTF_1_CONFEXP
;
6247 printf (" %lx", val
);
6256 printf (_("Flags:"));
6258 if (entry
->d_un
.d_val
== 0)
6259 printf (_(" None\n"));
6262 unsigned long int val
= entry
->d_un
.d_val
;
6264 if (val
& DF_P1_LAZYLOAD
)
6266 printf (" LAZYLOAD");
6267 val
^= DF_P1_LAZYLOAD
;
6269 if (val
& DF_P1_GROUPPERM
)
6271 printf (" GROUPPERM");
6272 val
^= DF_P1_GROUPPERM
;
6275 printf (" %lx", val
);
6284 printf (_("Flags:"));
6285 if (entry
->d_un
.d_val
== 0)
6286 printf (_(" None\n"));
6289 unsigned long int val
= entry
->d_un
.d_val
;
6296 if (val
& DF_1_GLOBAL
)
6301 if (val
& DF_1_GROUP
)
6306 if (val
& DF_1_NODELETE
)
6308 printf (" NODELETE");
6309 val
^= DF_1_NODELETE
;
6311 if (val
& DF_1_LOADFLTR
)
6313 printf (" LOADFLTR");
6314 val
^= DF_1_LOADFLTR
;
6316 if (val
& DF_1_INITFIRST
)
6318 printf (" INITFIRST");
6319 val
^= DF_1_INITFIRST
;
6321 if (val
& DF_1_NOOPEN
)
6326 if (val
& DF_1_ORIGIN
)
6331 if (val
& DF_1_DIRECT
)
6336 if (val
& DF_1_TRANS
)
6341 if (val
& DF_1_INTERPOSE
)
6343 printf (" INTERPOSE");
6344 val
^= DF_1_INTERPOSE
;
6346 if (val
& DF_1_NODEFLIB
)
6348 printf (" NODEFLIB");
6349 val
^= DF_1_NODEFLIB
;
6351 if (val
& DF_1_NODUMP
)
6356 if (val
& DF_1_CONLFAT
)
6358 printf (" CONLFAT");
6359 val
^= DF_1_CONLFAT
;
6362 printf (" %lx", val
);
6369 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6371 puts (get_dynamic_type (entry
->d_un
.d_val
));
6391 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6397 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6398 name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6404 switch (entry
->d_tag
)
6407 printf (_("Shared library: [%s]"), name
);
6409 if (streq (name
, program_interpreter
))
6410 printf (_(" program interpreter"));
6414 printf (_("Library soname: [%s]"), name
);
6418 printf (_("Library rpath: [%s]"), name
);
6422 printf (_("Library runpath: [%s]"), name
);
6426 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6431 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6444 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6448 case DT_INIT_ARRAYSZ
:
6449 case DT_FINI_ARRAYSZ
:
6450 case DT_GNU_CONFLICTSZ
:
6451 case DT_GNU_LIBLISTSZ
:
6454 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6455 printf (" (bytes)\n");
6465 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6478 if (entry
->d_tag
== DT_USED
6479 && VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6481 char * name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6485 printf (_("Not needed object: [%s]\n"), name
);
6490 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6496 /* The value of this entry is ignored. */
6501 case DT_GNU_PRELINKED
:
6505 time_t time
= entry
->d_un
.d_val
;
6507 tmp
= gmtime (&time
);
6508 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
6509 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
6510 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
6516 dynamic_info_DT_GNU_HASH
= entry
->d_un
.d_val
;
6519 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6525 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
6526 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
6531 switch (elf_header
.e_machine
)
6534 case EM_MIPS_RS3_LE
:
6535 dynamic_section_mips_val (entry
);
6538 dynamic_section_parisc_val (entry
);
6541 dynamic_section_ia64_val (entry
);
6544 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6556 get_ver_flags (unsigned int flags
)
6558 static char buff
[32];
6565 if (flags
& VER_FLG_BASE
)
6566 strcat (buff
, "BASE ");
6568 if (flags
& VER_FLG_WEAK
)
6570 if (flags
& VER_FLG_BASE
)
6571 strcat (buff
, "| ");
6573 strcat (buff
, "WEAK ");
6576 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
6577 strcat (buff
, "| <unknown>");
6582 /* Display the contents of the version sections. */
6585 process_version_sections (FILE * file
)
6587 Elf_Internal_Shdr
* section
;
6594 for (i
= 0, section
= section_headers
;
6595 i
< elf_header
.e_shnum
;
6598 switch (section
->sh_type
)
6600 case SHT_GNU_verdef
:
6602 Elf_External_Verdef
* edefs
;
6610 (_("\nVersion definition section '%s' contains %u entries:\n"),
6611 SECTION_NAME (section
), section
->sh_info
);
6613 printf (_(" Addr: 0x"));
6614 printf_vma (section
->sh_addr
);
6615 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
6616 (unsigned long) section
->sh_offset
, section
->sh_link
,
6617 section
->sh_link
< elf_header
.e_shnum
6618 ? SECTION_NAME (section_headers
+ section
->sh_link
)
6621 edefs
= (Elf_External_Verdef
*)
6622 get_data (NULL
, file
, section
->sh_offset
, 1,section
->sh_size
,
6623 _("version definition section"));
6624 endbuf
= (char *) edefs
+ section
->sh_size
;
6628 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6631 Elf_External_Verdef
* edef
;
6632 Elf_Internal_Verdef ent
;
6633 Elf_External_Verdaux
* eaux
;
6634 Elf_Internal_Verdaux aux
;
6638 vstart
= ((char *) edefs
) + idx
;
6639 if (vstart
+ sizeof (*edef
) > endbuf
)
6642 edef
= (Elf_External_Verdef
*) vstart
;
6644 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
6645 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
6646 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
6647 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
6648 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
6649 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
6650 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
6652 printf (_(" %#06x: Rev: %d Flags: %s"),
6653 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
6655 printf (_(" Index: %d Cnt: %d "),
6656 ent
.vd_ndx
, ent
.vd_cnt
);
6658 vstart
+= ent
.vd_aux
;
6660 eaux
= (Elf_External_Verdaux
*) vstart
;
6662 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6663 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6665 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6666 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux
.vda_name
));
6668 printf (_("Name index: %ld\n"), aux
.vda_name
);
6670 isum
= idx
+ ent
.vd_aux
;
6672 for (j
= 1; j
< ent
.vd_cnt
; j
++)
6674 isum
+= aux
.vda_next
;
6675 vstart
+= aux
.vda_next
;
6677 eaux
= (Elf_External_Verdaux
*) vstart
;
6678 if (vstart
+ sizeof (*eaux
) > endbuf
)
6681 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6682 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6684 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6685 printf (_(" %#06x: Parent %d: %s\n"),
6686 isum
, j
, GET_DYNAMIC_NAME (aux
.vda_name
));
6688 printf (_(" %#06x: Parent %d, name index: %ld\n"),
6689 isum
, j
, aux
.vda_name
);
6692 printf (_(" Version def aux past end of section\n"));
6696 if (cnt
< section
->sh_info
)
6697 printf (_(" Version definition past end of section\n"));
6703 case SHT_GNU_verneed
:
6705 Elf_External_Verneed
* eneed
;
6712 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
6713 SECTION_NAME (section
), section
->sh_info
);
6715 printf (_(" Addr: 0x"));
6716 printf_vma (section
->sh_addr
);
6717 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
6718 (unsigned long) section
->sh_offset
, section
->sh_link
,
6719 section
->sh_link
< elf_header
.e_shnum
6720 ? SECTION_NAME (section_headers
+ section
->sh_link
)
6723 eneed
= (Elf_External_Verneed
*) get_data (NULL
, file
,
6724 section
->sh_offset
, 1,
6726 _("version need section"));
6727 endbuf
= (char *) eneed
+ section
->sh_size
;
6731 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6733 Elf_External_Verneed
* entry
;
6734 Elf_Internal_Verneed ent
;
6739 vstart
= ((char *) eneed
) + idx
;
6740 if (vstart
+ sizeof (*entry
) > endbuf
)
6743 entry
= (Elf_External_Verneed
*) vstart
;
6745 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
6746 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
6747 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
6748 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
6749 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
6751 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
6753 if (VALID_DYNAMIC_NAME (ent
.vn_file
))
6754 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent
.vn_file
));
6756 printf (_(" File: %lx"), ent
.vn_file
);
6758 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
6760 vstart
+= ent
.vn_aux
;
6762 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
6764 Elf_External_Vernaux
* eaux
;
6765 Elf_Internal_Vernaux aux
;
6767 if (vstart
+ sizeof (*eaux
) > endbuf
)
6769 eaux
= (Elf_External_Vernaux
*) vstart
;
6771 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
6772 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
6773 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
6774 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
6775 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
6777 if (VALID_DYNAMIC_NAME (aux
.vna_name
))
6778 printf (_(" %#06x: Name: %s"),
6779 isum
, GET_DYNAMIC_NAME (aux
.vna_name
));
6781 printf (_(" %#06x: Name index: %lx"),
6782 isum
, aux
.vna_name
);
6784 printf (_(" Flags: %s Version: %d\n"),
6785 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
6787 isum
+= aux
.vna_next
;
6788 vstart
+= aux
.vna_next
;
6791 printf (_(" Version need aux past end of section\n"));
6795 if (cnt
< section
->sh_info
)
6796 printf (_(" Version need past end of section\n"));
6802 case SHT_GNU_versym
:
6804 Elf_Internal_Shdr
* link_section
;
6807 unsigned char * edata
;
6808 unsigned short * data
;
6810 Elf_Internal_Sym
* symbols
;
6811 Elf_Internal_Shdr
* string_sec
;
6814 if (section
->sh_link
>= elf_header
.e_shnum
)
6817 link_section
= section_headers
+ section
->sh_link
;
6818 total
= section
->sh_size
/ sizeof (Elf_External_Versym
);
6820 if (link_section
->sh_link
>= elf_header
.e_shnum
)
6825 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
6827 string_sec
= section_headers
+ link_section
->sh_link
;
6829 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
, 1,
6830 string_sec
->sh_size
,
6831 _("version string table"));
6835 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6836 SECTION_NAME (section
), total
);
6838 printf (_(" Addr: "));
6839 printf_vma (section
->sh_addr
);
6840 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
6841 (unsigned long) section
->sh_offset
, section
->sh_link
,
6842 SECTION_NAME (link_section
));
6844 off
= offset_from_vma (file
,
6845 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6846 total
* sizeof (short));
6847 edata
= (unsigned char *) get_data (NULL
, file
, off
, total
,
6849 _("version symbol data"));
6856 data
= (short unsigned int *) cmalloc (total
, sizeof (short));
6858 for (cnt
= total
; cnt
--;)
6859 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
6864 for (cnt
= 0; cnt
< total
; cnt
+= 4)
6867 int check_def
, check_need
;
6870 printf (" %03x:", cnt
);
6872 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
6873 switch (data
[cnt
+ j
])
6876 fputs (_(" 0 (*local*) "), stdout
);
6880 fputs (_(" 1 (*global*) "), stdout
);
6884 nn
= printf ("%4x%c", data
[cnt
+ j
] & VERSYM_VERSION
,
6885 data
[cnt
+ j
] & VERSYM_HIDDEN
? 'h' : ' ');
6889 if (symbols
[cnt
+ j
].st_shndx
>= elf_header
.e_shnum
6890 || section_headers
[symbols
[cnt
+ j
].st_shndx
].sh_type
6893 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
6900 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
6902 Elf_Internal_Verneed ivn
;
6903 unsigned long offset
;
6905 offset
= offset_from_vma
6906 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6907 sizeof (Elf_External_Verneed
));
6911 Elf_Internal_Vernaux ivna
;
6912 Elf_External_Verneed evn
;
6913 Elf_External_Vernaux evna
;
6914 unsigned long a_off
;
6916 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
6919 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6920 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6922 a_off
= offset
+ ivn
.vn_aux
;
6926 get_data (&evna
, file
, a_off
, sizeof (evna
),
6927 1, _("version need aux (2)"));
6929 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6930 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6932 a_off
+= ivna
.vna_next
;
6934 while (ivna
.vna_other
!= data
[cnt
+ j
]
6935 && ivna
.vna_next
!= 0);
6937 if (ivna
.vna_other
== data
[cnt
+ j
])
6939 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6941 if (ivna
.vna_name
>= string_sec
->sh_size
)
6942 name
= _("*invalid*");
6944 name
= strtab
+ ivna
.vna_name
;
6945 nn
+= printf ("(%s%-*s",
6947 12 - (int) strlen (name
),
6953 offset
+= ivn
.vn_next
;
6955 while (ivn
.vn_next
);
6958 if (check_def
&& data
[cnt
+ j
] != 0x8001
6959 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6961 Elf_Internal_Verdef ivd
;
6962 Elf_External_Verdef evd
;
6963 unsigned long offset
;
6965 offset
= offset_from_vma
6966 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6971 get_data (&evd
, file
, offset
, sizeof (evd
), 1,
6974 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6975 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6977 offset
+= ivd
.vd_next
;
6979 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & VERSYM_VERSION
)
6980 && ivd
.vd_next
!= 0);
6982 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & VERSYM_VERSION
))
6984 Elf_External_Verdaux evda
;
6985 Elf_Internal_Verdaux ivda
;
6987 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6989 get_data (&evda
, file
,
6990 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
6992 _("version def aux"));
6994 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6996 if (ivda
.vda_name
>= string_sec
->sh_size
)
6997 name
= _("*invalid*");
6999 name
= strtab
+ ivda
.vda_name
;
7000 nn
+= printf ("(%s%-*s",
7002 12 - (int) strlen (name
),
7008 printf ("%*c", 18 - nn
, ' ');
7026 printf (_("\nNo version information found in this file.\n"));
7032 get_symbol_binding (unsigned int binding
)
7034 static char buff
[32];
7038 case STB_LOCAL
: return "LOCAL";
7039 case STB_GLOBAL
: return "GLOBAL";
7040 case STB_WEAK
: return "WEAK";
7042 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
7043 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"),
7045 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
7047 if (binding
== STB_GNU_UNIQUE
7048 && (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_LINUX
7049 /* GNU/Linux is still using the default value 0. */
7050 || elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_NONE
))
7052 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), binding
);
7055 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), binding
);
7061 get_symbol_type (unsigned int type
)
7063 static char buff
[32];
7067 case STT_NOTYPE
: return "NOTYPE";
7068 case STT_OBJECT
: return "OBJECT";
7069 case STT_FUNC
: return "FUNC";
7070 case STT_SECTION
: return "SECTION";
7071 case STT_FILE
: return "FILE";
7072 case STT_COMMON
: return "COMMON";
7073 case STT_TLS
: return "TLS";
7074 case STT_RELC
: return "RELC";
7075 case STT_SRELC
: return "SRELC";
7077 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
7079 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
7080 return "THUMB_FUNC";
7082 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
7085 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
7086 return "PARISC_MILLI";
7088 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"), type
);
7090 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
7092 if (elf_header
.e_machine
== EM_PARISC
)
7094 if (type
== STT_HP_OPAQUE
)
7096 if (type
== STT_HP_STUB
)
7100 if (type
== STT_GNU_IFUNC
7101 && (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_LINUX
7102 /* GNU/Linux is still using the default value 0. */
7103 || elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_NONE
))
7106 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), type
);
7109 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), type
);
7115 get_symbol_visibility (unsigned int visibility
)
7119 case STV_DEFAULT
: return "DEFAULT";
7120 case STV_INTERNAL
: return "INTERNAL";
7121 case STV_HIDDEN
: return "HIDDEN";
7122 case STV_PROTECTED
: return "PROTECTED";
7128 get_mips_symbol_other (unsigned int other
)
7132 case STO_OPTIONAL
: return "OPTIONAL";
7133 case STO_MIPS16
: return "MIPS16";
7134 case STO_MIPS_PLT
: return "MIPS PLT";
7135 case STO_MIPS_PIC
: return "MIPS PIC";
7136 default: return NULL
;
7141 get_symbol_other (unsigned int other
)
7143 const char * result
= NULL
;
7144 static char buff
[32];
7149 switch (elf_header
.e_machine
)
7152 result
= get_mips_symbol_other (other
);
7160 snprintf (buff
, sizeof buff
, _("<other>: %x"), other
);
7165 get_symbol_index_type (unsigned int type
)
7167 static char buff
[32];
7171 case SHN_UNDEF
: return "UND";
7172 case SHN_ABS
: return "ABS";
7173 case SHN_COMMON
: return "COM";
7175 if (type
== SHN_IA_64_ANSI_COMMON
7176 && elf_header
.e_machine
== EM_IA_64
7177 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
7179 else if ((elf_header
.e_machine
== EM_X86_64
7180 || elf_header
.e_machine
== EM_L1OM
)
7181 && type
== SHN_X86_64_LCOMMON
)
7183 else if (type
== SHN_MIPS_SCOMMON
7184 && elf_header
.e_machine
== EM_MIPS
)
7186 else if (type
== SHN_MIPS_SUNDEFINED
7187 && elf_header
.e_machine
== EM_MIPS
)
7189 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
7190 sprintf (buff
, "PRC[0x%04x]", type
& 0xffff);
7191 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
7192 sprintf (buff
, "OS [0x%04x]", type
& 0xffff);
7193 else if (type
>= SHN_LORESERVE
)
7194 sprintf (buff
, "RSV[0x%04x]", type
& 0xffff);
7196 sprintf (buff
, "%3d", type
);
7204 get_dynamic_data (FILE * file
, unsigned int number
, unsigned int ent_size
)
7206 unsigned char * e_data
;
7209 e_data
= (unsigned char *) cmalloc (number
, ent_size
);
7213 error (_("Out of memory\n"));
7217 if (fread (e_data
, ent_size
, number
, file
) != number
)
7219 error (_("Unable to read in dynamic data\n"));
7223 i_data
= (bfd_vma
*) cmalloc (number
, sizeof (*i_data
));
7227 error (_("Out of memory\n"));
7233 i_data
[number
] = byte_get (e_data
+ number
* ent_size
, ent_size
);
7241 print_dynamic_symbol (bfd_vma si
, unsigned long hn
)
7243 Elf_Internal_Sym
* psym
;
7246 psym
= dynamic_symbols
+ si
;
7248 n
= print_vma (si
, DEC_5
);
7250 fputs (" " + n
, stdout
);
7251 printf (" %3lu: ", hn
);
7252 print_vma (psym
->st_value
, LONG_HEX
);
7254 print_vma (psym
->st_size
, DEC_5
);
7256 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
7257 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
7258 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
7259 /* Check to see if any other bits in the st_other field are set.
7260 Note - displaying this information disrupts the layout of the
7261 table being generated, but for the moment this case is very
7263 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
7264 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
7265 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
7266 if (VALID_DYNAMIC_NAME (psym
->st_name
))
7267 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
7269 printf (" <corrupt: %14ld>", psym
->st_name
);
7273 /* Dump the symbol table. */
7275 process_symbol_table (FILE * file
)
7277 Elf_Internal_Shdr
* section
;
7278 bfd_vma nbuckets
= 0;
7279 bfd_vma nchains
= 0;
7280 bfd_vma
* buckets
= NULL
;
7281 bfd_vma
* chains
= NULL
;
7282 bfd_vma ngnubuckets
= 0;
7283 bfd_vma
* gnubuckets
= NULL
;
7284 bfd_vma
* gnuchains
= NULL
;
7285 bfd_vma gnusymidx
= 0;
7287 if (! do_syms
&& !do_histogram
)
7290 if (dynamic_info
[DT_HASH
]
7292 || (do_using_dynamic
&& dynamic_strings
!= NULL
)))
7294 unsigned char nb
[8];
7295 unsigned char nc
[8];
7296 int hash_ent_size
= 4;
7298 if ((elf_header
.e_machine
== EM_ALPHA
7299 || elf_header
.e_machine
== EM_S390
7300 || elf_header
.e_machine
== EM_S390_OLD
)
7301 && elf_header
.e_ident
[EI_CLASS
] == ELFCLASS64
)
7305 (archive_file_offset
7306 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
7307 sizeof nb
+ sizeof nc
)),
7310 error (_("Unable to seek to start of dynamic information\n"));
7314 if (fread (nb
, hash_ent_size
, 1, file
) != 1)
7316 error (_("Failed to read in number of buckets\n"));
7320 if (fread (nc
, hash_ent_size
, 1, file
) != 1)
7322 error (_("Failed to read in number of chains\n"));
7326 nbuckets
= byte_get (nb
, hash_ent_size
);
7327 nchains
= byte_get (nc
, hash_ent_size
);
7329 buckets
= get_dynamic_data (file
, nbuckets
, hash_ent_size
);
7330 chains
= get_dynamic_data (file
, nchains
, hash_ent_size
);
7333 if (buckets
== NULL
|| chains
== NULL
)
7335 if (do_using_dynamic
)
7346 if (dynamic_info_DT_GNU_HASH
7348 || (do_using_dynamic
&& dynamic_strings
!= NULL
)))
7350 unsigned char nb
[16];
7351 bfd_vma i
, maxchain
= 0xffffffff, bitmaskwords
;
7352 bfd_vma buckets_vma
;
7355 (archive_file_offset
7356 + offset_from_vma (file
, dynamic_info_DT_GNU_HASH
,
7360 error (_("Unable to seek to start of dynamic information\n"));
7364 if (fread (nb
, 16, 1, file
) != 1)
7366 error (_("Failed to read in number of buckets\n"));
7370 ngnubuckets
= byte_get (nb
, 4);
7371 gnusymidx
= byte_get (nb
+ 4, 4);
7372 bitmaskwords
= byte_get (nb
+ 8, 4);
7373 buckets_vma
= dynamic_info_DT_GNU_HASH
+ 16;
7375 buckets_vma
+= bitmaskwords
* 4;
7377 buckets_vma
+= bitmaskwords
* 8;
7380 (archive_file_offset
7381 + offset_from_vma (file
, buckets_vma
, 4)),
7384 error (_("Unable to seek to start of dynamic information\n"));
7388 gnubuckets
= get_dynamic_data (file
, ngnubuckets
, 4);
7390 if (gnubuckets
== NULL
)
7393 for (i
= 0; i
< ngnubuckets
; i
++)
7394 if (gnubuckets
[i
] != 0)
7396 if (gnubuckets
[i
] < gnusymidx
)
7399 if (maxchain
== 0xffffffff || gnubuckets
[i
] > maxchain
)
7400 maxchain
= gnubuckets
[i
];
7403 if (maxchain
== 0xffffffff)
7406 maxchain
-= gnusymidx
;
7409 (archive_file_offset
7410 + offset_from_vma (file
, buckets_vma
7411 + 4 * (ngnubuckets
+ maxchain
), 4)),
7414 error (_("Unable to seek to start of dynamic information\n"));
7420 if (fread (nb
, 4, 1, file
) != 1)
7422 error (_("Failed to determine last chain length\n"));
7426 if (maxchain
+ 1 == 0)
7431 while ((byte_get (nb
, 4) & 1) == 0);
7434 (archive_file_offset
7435 + offset_from_vma (file
, buckets_vma
+ 4 * ngnubuckets
, 4)),
7438 error (_("Unable to seek to start of dynamic information\n"));
7442 gnuchains
= get_dynamic_data (file
, maxchain
, 4);
7445 if (gnuchains
== NULL
)
7450 if (do_using_dynamic
)
7455 if ((dynamic_info
[DT_HASH
] || dynamic_info_DT_GNU_HASH
)
7458 && dynamic_strings
!= NULL
)
7462 if (dynamic_info
[DT_HASH
])
7466 printf (_("\nSymbol table for image:\n"));
7468 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7470 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7472 for (hn
= 0; hn
< nbuckets
; hn
++)
7477 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
7478 print_dynamic_symbol (si
, hn
);
7482 if (dynamic_info_DT_GNU_HASH
)
7484 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
7486 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7488 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7490 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7491 if (gnubuckets
[hn
] != 0)
7493 bfd_vma si
= gnubuckets
[hn
];
7494 bfd_vma off
= si
- gnusymidx
;
7498 print_dynamic_symbol (si
, hn
);
7501 while ((gnuchains
[off
++] & 1) == 0);
7505 else if (do_syms
&& !do_using_dynamic
)
7509 for (i
= 0, section
= section_headers
;
7510 i
< elf_header
.e_shnum
;
7514 char * strtab
= NULL
;
7515 unsigned long int strtab_size
= 0;
7516 Elf_Internal_Sym
* symtab
;
7517 Elf_Internal_Sym
* psym
;
7519 if ( section
->sh_type
!= SHT_SYMTAB
7520 && section
->sh_type
!= SHT_DYNSYM
)
7523 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
7524 SECTION_NAME (section
),
7525 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
7527 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7529 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7531 symtab
= GET_ELF_SYMBOLS (file
, section
);
7535 if (section
->sh_link
== elf_header
.e_shstrndx
)
7537 strtab
= string_table
;
7538 strtab_size
= string_table_length
;
7540 else if (section
->sh_link
< elf_header
.e_shnum
)
7542 Elf_Internal_Shdr
* string_sec
;
7544 string_sec
= section_headers
+ section
->sh_link
;
7546 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
7547 1, string_sec
->sh_size
,
7549 strtab_size
= strtab
!= NULL
? string_sec
->sh_size
: 0;
7552 for (si
= 0, psym
= symtab
;
7553 si
< section
->sh_size
/ section
->sh_entsize
;
7556 printf ("%6d: ", si
);
7557 print_vma (psym
->st_value
, LONG_HEX
);
7559 print_vma (psym
->st_size
, DEC_5
);
7560 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
7561 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
7562 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
7563 /* Check to see if any other bits in the st_other field are set.
7564 Note - displaying this information disrupts the layout of the
7565 table being generated, but for the moment this case is very rare. */
7566 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
7567 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
7568 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
7569 print_symbol (25, psym
->st_name
< strtab_size
7570 ? strtab
+ psym
->st_name
: "<corrupt>");
7572 if (section
->sh_type
== SHT_DYNSYM
&&
7573 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
7575 unsigned char data
[2];
7576 unsigned short vers_data
;
7577 unsigned long offset
;
7581 offset
= offset_from_vma
7582 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
7583 sizeof data
+ si
* sizeof (vers_data
));
7585 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
7586 sizeof (data
), 1, _("version data"));
7588 vers_data
= byte_get (data
, 2);
7590 is_nobits
= (psym
->st_shndx
< elf_header
.e_shnum
7591 && section_headers
[psym
->st_shndx
].sh_type
7594 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
7596 if ((vers_data
& VERSYM_HIDDEN
) || vers_data
> 1)
7598 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
7599 && (is_nobits
|| ! check_def
))
7601 Elf_External_Verneed evn
;
7602 Elf_Internal_Verneed ivn
;
7603 Elf_Internal_Vernaux ivna
;
7605 /* We must test both. */
7606 offset
= offset_from_vma
7607 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
7612 unsigned long vna_off
;
7614 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
7617 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
7618 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
7620 vna_off
= offset
+ ivn
.vn_aux
;
7624 Elf_External_Vernaux evna
;
7626 get_data (&evna
, file
, vna_off
,
7628 _("version need aux (3)"));
7630 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
7631 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
7632 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
7634 vna_off
+= ivna
.vna_next
;
7636 while (ivna
.vna_other
!= vers_data
7637 && ivna
.vna_next
!= 0);
7639 if (ivna
.vna_other
== vers_data
)
7642 offset
+= ivn
.vn_next
;
7644 while (ivn
.vn_next
!= 0);
7646 if (ivna
.vna_other
== vers_data
)
7649 ivna
.vna_name
< strtab_size
7650 ? strtab
+ ivna
.vna_name
: "<corrupt>",
7654 else if (! is_nobits
)
7655 error (_("bad dynamic symbol\n"));
7662 if (vers_data
!= 0x8001
7663 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
7665 Elf_Internal_Verdef ivd
;
7666 Elf_Internal_Verdaux ivda
;
7667 Elf_External_Verdaux evda
;
7668 unsigned long offset
;
7670 offset
= offset_from_vma
7672 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
7673 sizeof (Elf_External_Verdef
));
7677 Elf_External_Verdef evd
;
7679 get_data (&evd
, file
, offset
, sizeof (evd
),
7680 1, _("version def"));
7682 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
7683 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
7684 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
7686 offset
+= ivd
.vd_next
;
7688 while (ivd
.vd_ndx
!= (vers_data
& VERSYM_VERSION
)
7689 && ivd
.vd_next
!= 0);
7691 offset
-= ivd
.vd_next
;
7692 offset
+= ivd
.vd_aux
;
7694 get_data (&evda
, file
, offset
, sizeof (evda
),
7695 1, _("version def aux"));
7697 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
7699 if (psym
->st_name
!= ivda
.vda_name
)
7700 printf ((vers_data
& VERSYM_HIDDEN
)
7702 ivda
.vda_name
< strtab_size
7703 ? strtab
+ ivda
.vda_name
: "<corrupt>");
7713 if (strtab
!= string_table
)
7719 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
7721 if (do_histogram
&& buckets
!= NULL
)
7723 unsigned long * lengths
;
7724 unsigned long * counts
;
7727 unsigned long maxlength
= 0;
7728 unsigned long nzero_counts
= 0;
7729 unsigned long nsyms
= 0;
7731 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
7732 (unsigned long) nbuckets
);
7733 printf (_(" Length Number %% of total Coverage\n"));
7735 lengths
= (unsigned long *) calloc (nbuckets
, sizeof (*lengths
));
7736 if (lengths
== NULL
)
7738 error (_("Out of memory\n"));
7741 for (hn
= 0; hn
< nbuckets
; ++hn
)
7743 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
7746 if (maxlength
< ++lengths
[hn
])
7751 counts
= (unsigned long *) calloc (maxlength
+ 1, sizeof (*counts
));
7754 error (_("Out of memory\n"));
7758 for (hn
= 0; hn
< nbuckets
; ++hn
)
7759 ++counts
[lengths
[hn
]];
7764 printf (" 0 %-10lu (%5.1f%%)\n",
7765 counts
[0], (counts
[0] * 100.0) / nbuckets
);
7766 for (i
= 1; i
<= maxlength
; ++i
)
7768 nzero_counts
+= counts
[i
] * i
;
7769 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7770 i
, counts
[i
], (counts
[i
] * 100.0) / nbuckets
,
7771 (nzero_counts
* 100.0) / nsyms
);
7779 if (buckets
!= NULL
)
7785 if (do_histogram
&& gnubuckets
!= NULL
)
7787 unsigned long * lengths
;
7788 unsigned long * counts
;
7790 unsigned long maxlength
= 0;
7791 unsigned long nzero_counts
= 0;
7792 unsigned long nsyms
= 0;
7794 lengths
= (unsigned long *) calloc (ngnubuckets
, sizeof (*lengths
));
7795 if (lengths
== NULL
)
7797 error (_("Out of memory\n"));
7801 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
7802 (unsigned long) ngnubuckets
);
7803 printf (_(" Length Number %% of total Coverage\n"));
7805 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7806 if (gnubuckets
[hn
] != 0)
7808 bfd_vma off
, length
= 1;
7810 for (off
= gnubuckets
[hn
] - gnusymidx
;
7811 (gnuchains
[off
] & 1) == 0; ++off
)
7813 lengths
[hn
] = length
;
7814 if (length
> maxlength
)
7819 counts
= (unsigned long *) calloc (maxlength
+ 1, sizeof (*counts
));
7822 error (_("Out of memory\n"));
7826 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7827 ++counts
[lengths
[hn
]];
7829 if (ngnubuckets
> 0)
7832 printf (" 0 %-10lu (%5.1f%%)\n",
7833 counts
[0], (counts
[0] * 100.0) / ngnubuckets
);
7834 for (j
= 1; j
<= maxlength
; ++j
)
7836 nzero_counts
+= counts
[j
] * j
;
7837 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7838 j
, counts
[j
], (counts
[j
] * 100.0) / ngnubuckets
,
7839 (nzero_counts
* 100.0) / nsyms
);
7853 process_syminfo (FILE * file ATTRIBUTE_UNUSED
)
7857 if (dynamic_syminfo
== NULL
7859 /* No syminfo, this is ok. */
7862 /* There better should be a dynamic symbol section. */
7863 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
7867 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
7868 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
7870 printf (_(" Num: Name BoundTo Flags\n"));
7871 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
7873 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
7875 printf ("%4d: ", i
);
7876 if (VALID_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
))
7877 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
));
7879 printf ("<corrupt: %19ld>", dynamic_symbols
[i
].st_name
);
7882 switch (dynamic_syminfo
[i
].si_boundto
)
7884 case SYMINFO_BT_SELF
:
7885 fputs ("SELF ", stdout
);
7887 case SYMINFO_BT_PARENT
:
7888 fputs ("PARENT ", stdout
);
7891 if (dynamic_syminfo
[i
].si_boundto
> 0
7892 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
7893 && VALID_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
7895 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
7899 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
7903 if (flags
& SYMINFO_FLG_DIRECT
)
7905 if (flags
& SYMINFO_FLG_PASSTHRU
)
7906 printf (" PASSTHRU");
7907 if (flags
& SYMINFO_FLG_COPY
)
7909 if (flags
& SYMINFO_FLG_LAZYLOAD
)
7910 printf (" LAZYLOAD");
7918 /* Check to see if the given reloc needs to be handled in a target specific
7919 manner. If so then process the reloc and return TRUE otherwise return
7923 target_specific_reloc_handling (Elf_Internal_Rela
* reloc
,
7924 unsigned char * start
,
7925 Elf_Internal_Sym
* symtab
)
7927 unsigned int reloc_type
= get_reloc_type (reloc
->r_info
);
7929 switch (elf_header
.e_machine
)
7932 case EM_CYGNUS_MN10300
:
7934 static Elf_Internal_Sym
* saved_sym
= NULL
;
7938 case 34: /* R_MN10300_ALIGN */
7940 case 33: /* R_MN10300_SYM_DIFF */
7941 saved_sym
= symtab
+ get_reloc_symindex (reloc
->r_info
);
7943 case 1: /* R_MN10300_32 */
7944 case 2: /* R_MN10300_16 */
7945 if (saved_sym
!= NULL
)
7949 value
= reloc
->r_addend
7950 + (symtab
[get_reloc_symindex (reloc
->r_info
)].st_value
7951 - saved_sym
->st_value
);
7953 byte_put (start
+ reloc
->r_offset
, value
, reloc_type
== 1 ? 4 : 2);
7960 if (saved_sym
!= NULL
)
7961 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc"));
7971 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
7972 DWARF debug sections. This is a target specific test. Note - we do not
7973 go through the whole including-target-headers-multiple-times route, (as
7974 we have already done with <elf/h8.h>) because this would become very
7975 messy and even then this function would have to contain target specific
7976 information (the names of the relocs instead of their numeric values).
7977 FIXME: This is not the correct way to solve this problem. The proper way
7978 is to have target specific reloc sizing and typing functions created by
7979 the reloc-macros.h header, in the same way that it already creates the
7980 reloc naming functions. */
7983 is_32bit_abs_reloc (unsigned int reloc_type
)
7985 switch (elf_header
.e_machine
)
7989 return reloc_type
== 1; /* R_386_32. */
7991 return reloc_type
== 1; /* R_68K_32. */
7993 return reloc_type
== 1; /* R_860_32. */
7995 return reloc_type
== 1; /* XXX Is this right ? */
7997 return reloc_type
== 1; /* R_ARC_32. */
7999 return reloc_type
== 2; /* R_ARM_ABS32 */
8002 return reloc_type
== 1;
8004 return reloc_type
== 0x12; /* R_byte4_data. */
8006 return reloc_type
== 3; /* R_CRIS_32. */
8009 return reloc_type
== 3; /* R_CR16_NUM32. */
8011 return reloc_type
== 15; /* R_CRX_NUM32. */
8013 return reloc_type
== 1;
8014 case EM_CYGNUS_D10V
:
8016 return reloc_type
== 6; /* R_D10V_32. */
8017 case EM_CYGNUS_D30V
:
8019 return reloc_type
== 12; /* R_D30V_32_NORMAL. */
8021 return reloc_type
== 3; /* R_DLX_RELOC_32. */
8022 case EM_CYGNUS_FR30
:
8024 return reloc_type
== 3; /* R_FR30_32. */
8028 return reloc_type
== 1; /* R_H8_DIR32. */
8030 return reloc_type
== 0x65; /* R_IA64_SECREL32LSB. */
8033 return reloc_type
== 2; /* R_IP2K_32. */
8035 return reloc_type
== 2; /* R_IQ2000_32. */
8036 case EM_LATTICEMICO32
:
8037 return reloc_type
== 3; /* R_LM32_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. */
8070 || reloc_type
== 41); /* R_PARISC_SECREL32. */
8073 return reloc_type
== 1; /* R_PJ_DATA_DIR32. */
8075 return reloc_type
== 1; /* R_PPC64_ADDR32. */
8077 return reloc_type
== 1; /* R_PPC_ADDR32. */
8079 return reloc_type
== 1; /* R_RX_DIR32. */
8081 return reloc_type
== 1; /* R_I370_ADDR31. */
8084 return reloc_type
== 4; /* R_S390_32. */
8086 return reloc_type
== 8; /* R_SCORE_ABS32. */
8088 return reloc_type
== 1; /* R_SH_DIR32. */
8089 case EM_SPARC32PLUS
:
8092 return reloc_type
== 3 /* R_SPARC_32. */
8093 || reloc_type
== 23; /* R_SPARC_UA32. */
8095 return reloc_type
== 6; /* R_SPU_ADDR32 */
8096 case EM_CYGNUS_V850
:
8098 return reloc_type
== 6; /* R_V850_ABS32. */
8100 return reloc_type
== 1; /* R_VAX_32. */
8103 return reloc_type
== 10; /* R_X86_64_32. */
8106 return reloc_type
== 3; /* R_XC16C_ABS_32. */
8108 return reloc_type
== 1; /* R_XSTROMY16_32. */
8111 return reloc_type
== 1; /* R_XTENSA_32. */
8113 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
8114 elf_header
.e_machine
);
8119 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8120 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
8123 is_32bit_pcrel_reloc (unsigned int reloc_type
)
8125 switch (elf_header
.e_machine
)
8129 return reloc_type
== 2; /* R_386_PC32. */
8131 return reloc_type
== 4; /* R_68K_PC32. */
8133 return reloc_type
== 10; /* R_ALPHA_SREL32. */
8135 return reloc_type
== 3; /* R_ARM_REL32 */
8137 return reloc_type
== 9; /* R_PARISC_PCREL32. */
8139 return reloc_type
== 26; /* R_PPC_REL32. */
8141 return reloc_type
== 26; /* R_PPC64_REL32. */
8144 return reloc_type
== 5; /* R_390_PC32. */
8146 return reloc_type
== 2; /* R_SH_REL32. */
8147 case EM_SPARC32PLUS
:
8150 return reloc_type
== 6; /* R_SPARC_DISP32. */
8152 return reloc_type
== 13; /* R_SPU_REL32. */
8155 return reloc_type
== 2; /* R_X86_64_PC32. */
8158 return reloc_type
== 14; /* R_XTENSA_32_PCREL. */
8160 /* Do not abort or issue an error message here. Not all targets use
8161 pc-relative 32-bit relocs in their DWARF debug information and we
8162 have already tested for target coverage in is_32bit_abs_reloc. A
8163 more helpful warning message will be generated by apply_relocations
8164 anyway, so just return. */
8169 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8170 a 64-bit absolute RELA relocation used in DWARF debug sections. */
8173 is_64bit_abs_reloc (unsigned int reloc_type
)
8175 switch (elf_header
.e_machine
)
8178 return reloc_type
== 2; /* R_ALPHA_REFQUAD. */
8180 return reloc_type
== 0x27; /* R_IA64_DIR64LSB. */
8182 return reloc_type
== 80; /* R_PARISC_DIR64. */
8184 return reloc_type
== 38; /* R_PPC64_ADDR64. */
8185 case EM_SPARC32PLUS
:
8188 return reloc_type
== 54; /* R_SPARC_UA64. */
8191 return reloc_type
== 1; /* R_X86_64_64. */
8194 return reloc_type
== 22; /* R_S390_64 */
8196 return reloc_type
== 18; /* R_MIPS_64 */
8202 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
8203 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
8206 is_64bit_pcrel_reloc (unsigned int reloc_type
)
8208 switch (elf_header
.e_machine
)
8211 return reloc_type
== 11; /* R_ALPHA_SREL64 */
8213 return reloc_type
== 0x4f; /* R_IA64_PCREL64LSB */
8215 return reloc_type
== 72; /* R_PARISC_PCREL64 */
8217 return reloc_type
== 44; /* R_PPC64_REL64 */
8218 case EM_SPARC32PLUS
:
8221 return reloc_type
== 46; /* R_SPARC_DISP64 */
8224 return reloc_type
== 24; /* R_X86_64_PC64 */
8227 return reloc_type
== 23; /* R_S390_PC64 */
8233 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8234 a 24-bit absolute RELA relocation used in DWARF debug sections. */
8237 is_24bit_abs_reloc (unsigned int reloc_type
)
8239 switch (elf_header
.e_machine
)
8241 case EM_CYGNUS_MN10200
:
8243 return reloc_type
== 4; /* R_MN10200_24. */
8249 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8250 a 16-bit absolute RELA relocation used in DWARF debug sections. */
8253 is_16bit_abs_reloc (unsigned int reloc_type
)
8255 switch (elf_header
.e_machine
)
8259 return reloc_type
== 4; /* R_AVR_16. */
8260 case EM_CYGNUS_D10V
:
8262 return reloc_type
== 3; /* R_D10V_16. */
8266 return reloc_type
== R_H8_DIR16
;
8269 return reloc_type
== 1; /* R_IP2K_16. */
8272 return reloc_type
== 1; /* R_M32C_16 */
8275 return reloc_type
== 5; /* R_MSP430_16_BYTE. */
8276 case EM_ALTERA_NIOS2
:
8278 return reloc_type
== 9; /* R_NIOS_16. */
8281 return reloc_type
== 2; /* R_XC16C_ABS_16. */
8287 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
8288 relocation entries (possibly formerly used for SHT_GROUP sections). */
8291 is_none_reloc (unsigned int reloc_type
)
8293 switch (elf_header
.e_machine
)
8295 case EM_68K
: /* R_68K_NONE. */
8296 case EM_386
: /* R_386_NONE. */
8297 case EM_SPARC32PLUS
:
8299 case EM_SPARC
: /* R_SPARC_NONE. */
8300 case EM_MIPS
: /* R_MIPS_NONE. */
8301 case EM_PARISC
: /* R_PARISC_NONE. */
8302 case EM_ALPHA
: /* R_ALPHA_NONE. */
8303 case EM_PPC
: /* R_PPC_NONE. */
8304 case EM_PPC64
: /* R_PPC64_NONE. */
8305 case EM_ARM
: /* R_ARM_NONE. */
8306 case EM_IA_64
: /* R_IA64_NONE. */
8307 case EM_SH
: /* R_SH_NONE. */
8309 case EM_S390
: /* R_390_NONE. */
8310 case EM_CRIS
: /* R_CRIS_NONE. */
8311 case EM_X86_64
: /* R_X86_64_NONE. */
8312 case EM_L1OM
: /* R_X86_64_NONE. */
8313 case EM_MN10300
: /* R_MN10300_NONE. */
8314 case EM_M32R
: /* R_M32R_NONE. */
8316 case EM_C166
: /* R_XC16X_NONE. */
8317 return reloc_type
== 0;
8320 return (reloc_type
== 0 /* R_XTENSA_NONE. */
8321 || reloc_type
== 17 /* R_XTENSA_DIFF8. */
8322 || reloc_type
== 18 /* R_XTENSA_DIFF16. */
8323 || reloc_type
== 19 /* R_XTENSA_DIFF32. */);
8328 /* Apply relocations to a section.
8329 Note: So far support has been added only for those relocations
8330 which can be found in debug sections.
8331 FIXME: Add support for more relocations ? */
8334 apply_relocations (void * file
,
8335 Elf_Internal_Shdr
* section
,
8336 unsigned char * start
)
8338 Elf_Internal_Shdr
* relsec
;
8339 unsigned char * end
= start
+ section
->sh_size
;
8341 if (elf_header
.e_type
!= ET_REL
)
8344 /* Find the reloc section associated with the section. */
8345 for (relsec
= section_headers
;
8346 relsec
< section_headers
+ elf_header
.e_shnum
;
8349 bfd_boolean is_rela
;
8350 unsigned long num_relocs
;
8351 Elf_Internal_Rela
* relocs
;
8352 Elf_Internal_Rela
* rp
;
8353 Elf_Internal_Shdr
* symsec
;
8354 Elf_Internal_Sym
* symtab
;
8355 Elf_Internal_Sym
* sym
;
8357 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
8358 || relsec
->sh_info
>= elf_header
.e_shnum
8359 || section_headers
+ relsec
->sh_info
!= section
8360 || relsec
->sh_size
== 0
8361 || relsec
->sh_link
>= elf_header
.e_shnum
)
8364 is_rela
= relsec
->sh_type
== SHT_RELA
;
8368 if (!slurp_rela_relocs ((FILE *) file
, relsec
->sh_offset
,
8369 relsec
->sh_size
, & relocs
, & num_relocs
))
8374 if (!slurp_rel_relocs ((FILE *) file
, relsec
->sh_offset
,
8375 relsec
->sh_size
, & relocs
, & num_relocs
))
8379 /* SH uses RELA but uses in place value instead of the addend field. */
8380 if (elf_header
.e_machine
== EM_SH
)
8383 symsec
= section_headers
+ relsec
->sh_link
;
8384 symtab
= GET_ELF_SYMBOLS ((FILE *) file
, symsec
);
8386 for (rp
= relocs
; rp
< relocs
+ num_relocs
; ++rp
)
8389 unsigned int reloc_type
;
8390 unsigned int reloc_size
;
8391 unsigned char * loc
;
8393 reloc_type
= get_reloc_type (rp
->r_info
);
8395 if (target_specific_reloc_handling (rp
, start
, symtab
))
8397 else if (is_none_reloc (reloc_type
))
8399 else if (is_32bit_abs_reloc (reloc_type
)
8400 || is_32bit_pcrel_reloc (reloc_type
))
8402 else if (is_64bit_abs_reloc (reloc_type
)
8403 || is_64bit_pcrel_reloc (reloc_type
))
8405 else if (is_24bit_abs_reloc (reloc_type
))
8407 else if (is_16bit_abs_reloc (reloc_type
))
8411 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
8412 reloc_type
, SECTION_NAME (section
));
8416 loc
= start
+ rp
->r_offset
;
8417 if ((loc
+ reloc_size
) > end
)
8419 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
8420 (unsigned long) rp
->r_offset
,
8421 SECTION_NAME (section
));
8425 sym
= symtab
+ get_reloc_symindex (rp
->r_info
);
8427 /* If the reloc has a symbol associated with it,
8428 make sure that it is of an appropriate type.
8430 Relocations against symbols without type can happen.
8431 Gcc -feliminate-dwarf2-dups may generate symbols
8432 without type for debug info.
8434 Icc generates relocations against function symbols
8435 instead of local labels.
8437 Relocations against object symbols can happen, eg when
8438 referencing a global array. For an example of this see
8439 the _clz.o binary in libgcc.a. */
8441 && ELF_ST_TYPE (sym
->st_info
) > STT_SECTION
)
8443 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
8444 get_symbol_type (ELF_ST_TYPE (sym
->st_info
)),
8445 (long int)(rp
- relocs
),
8446 SECTION_NAME (relsec
));
8452 addend
+= rp
->r_addend
;
8453 /* R_XTENSA_32 and R_PJ_DATA_DIR32 are partial_inplace. */
8455 || (elf_header
.e_machine
== EM_XTENSA
8457 || ((elf_header
.e_machine
== EM_PJ
8458 || elf_header
.e_machine
== EM_PJ_OLD
)
8459 && reloc_type
== 1))
8460 addend
+= byte_get (loc
, reloc_size
);
8462 if (is_32bit_pcrel_reloc (reloc_type
)
8463 || is_64bit_pcrel_reloc (reloc_type
))
8465 /* On HPPA, all pc-relative relocations are biased by 8. */
8466 if (elf_header
.e_machine
== EM_PARISC
)
8468 byte_put (loc
, (addend
+ sym
->st_value
) - rp
->r_offset
,
8472 byte_put (loc
, addend
+ sym
->st_value
, reloc_size
);
8481 #ifdef SUPPORT_DISASSEMBLY
8483 disassemble_section (Elf_Internal_Shdr
* section
, FILE * file
)
8485 printf (_("\nAssembly dump of section %s\n"),
8486 SECTION_NAME (section
));
8488 /* XXX -- to be done --- XXX */
8494 /* Reads in the contents of SECTION from FILE, returning a pointer
8495 to a malloc'ed buffer or NULL if something went wrong. */
8498 get_section_contents (Elf_Internal_Shdr
* section
, FILE * file
)
8500 bfd_size_type num_bytes
;
8502 num_bytes
= section
->sh_size
;
8504 if (num_bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
8506 printf (_("\nSection '%s' has no data to dump.\n"),
8507 SECTION_NAME (section
));
8511 return (char *) get_data (NULL
, file
, section
->sh_offset
, 1, num_bytes
,
8512 _("section contents"));
8517 dump_section_as_strings (Elf_Internal_Shdr
* section
, FILE * file
)
8519 Elf_Internal_Shdr
* relsec
;
8520 bfd_size_type num_bytes
;
8525 char * name
= SECTION_NAME (section
);
8526 bfd_boolean some_strings_shown
;
8528 start
= get_section_contents (section
, file
);
8532 printf (_("\nString dump of section '%s':\n"), name
);
8534 /* If the section being dumped has relocations against it the user might
8535 be expecting these relocations to have been applied. Check for this
8536 case and issue a warning message in order to avoid confusion.
8537 FIXME: Maybe we ought to have an option that dumps a section with
8539 for (relsec
= section_headers
;
8540 relsec
< section_headers
+ elf_header
.e_shnum
;
8543 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
8544 || relsec
->sh_info
>= elf_header
.e_shnum
8545 || section_headers
+ relsec
->sh_info
!= section
8546 || relsec
->sh_size
== 0
8547 || relsec
->sh_link
>= elf_header
.e_shnum
)
8550 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
8554 num_bytes
= section
->sh_size
;
8555 addr
= section
->sh_addr
;
8557 end
= start
+ num_bytes
;
8558 some_strings_shown
= FALSE
;
8562 while (!ISPRINT (* data
))
8569 printf (" [%6tx] %s\n", data
- start
, data
);
8571 printf (" [%6Ix] %s\n", (size_t) (data
- start
), data
);
8573 data
+= strlen (data
);
8574 some_strings_shown
= TRUE
;
8578 if (! some_strings_shown
)
8579 printf (_(" No strings found in this section."));
8587 dump_section_as_bytes (Elf_Internal_Shdr
* section
,
8589 bfd_boolean relocate
)
8591 Elf_Internal_Shdr
* relsec
;
8592 bfd_size_type bytes
;
8594 unsigned char * data
;
8595 unsigned char * start
;
8597 start
= (unsigned char *) get_section_contents (section
, file
);
8601 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
8605 apply_relocations (file
, section
, start
);
8609 /* If the section being dumped has relocations against it the user might
8610 be expecting these relocations to have been applied. Check for this
8611 case and issue a warning message in order to avoid confusion.
8612 FIXME: Maybe we ought to have an option that dumps a section with
8614 for (relsec
= section_headers
;
8615 relsec
< section_headers
+ elf_header
.e_shnum
;
8618 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
8619 || relsec
->sh_info
>= elf_header
.e_shnum
8620 || section_headers
+ relsec
->sh_info
!= section
8621 || relsec
->sh_size
== 0
8622 || relsec
->sh_link
>= elf_header
.e_shnum
)
8625 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
8630 addr
= section
->sh_addr
;
8631 bytes
= section
->sh_size
;
8640 lbytes
= (bytes
> 16 ? 16 : bytes
);
8642 printf (" 0x%8.8lx ", (unsigned long) addr
);
8644 for (j
= 0; j
< 16; j
++)
8647 printf ("%2.2x", data
[j
]);
8655 for (j
= 0; j
< lbytes
; j
++)
8658 if (k
>= ' ' && k
< 0x7f)
8676 /* Uncompresses a section that was compressed using zlib, in place.
8677 This is a copy of bfd_uncompress_section_contents, in bfd/compress.c */
8680 uncompress_section_contents (unsigned char ** buffer
, dwarf_size_type
* size
)
8683 /* These are just to quiet gcc. */
8688 dwarf_size_type compressed_size
= *size
;
8689 unsigned char * compressed_buffer
= *buffer
;
8690 dwarf_size_type uncompressed_size
;
8691 unsigned char * uncompressed_buffer
;
8694 dwarf_size_type header_size
= 12;
8696 /* Read the zlib header. In this case, it should be "ZLIB" followed
8697 by the uncompressed section size, 8 bytes in big-endian order. */
8698 if (compressed_size
< header_size
8699 || ! streq ((char *) compressed_buffer
, "ZLIB"))
8702 uncompressed_size
= compressed_buffer
[4]; uncompressed_size
<<= 8;
8703 uncompressed_size
+= compressed_buffer
[5]; uncompressed_size
<<= 8;
8704 uncompressed_size
+= compressed_buffer
[6]; uncompressed_size
<<= 8;
8705 uncompressed_size
+= compressed_buffer
[7]; uncompressed_size
<<= 8;
8706 uncompressed_size
+= compressed_buffer
[8]; uncompressed_size
<<= 8;
8707 uncompressed_size
+= compressed_buffer
[9]; uncompressed_size
<<= 8;
8708 uncompressed_size
+= compressed_buffer
[10]; uncompressed_size
<<= 8;
8709 uncompressed_size
+= compressed_buffer
[11];
8711 /* It is possible the section consists of several compressed
8712 buffers concatenated together, so we uncompress in a loop. */
8716 strm
.avail_in
= compressed_size
- header_size
;
8717 strm
.next_in
= (Bytef
*) compressed_buffer
+ header_size
;
8718 strm
.avail_out
= uncompressed_size
;
8719 uncompressed_buffer
= (unsigned char *) xmalloc (uncompressed_size
);
8721 rc
= inflateInit (& strm
);
8722 while (strm
.avail_in
> 0)
8726 strm
.next_out
= ((Bytef
*) uncompressed_buffer
8727 + (uncompressed_size
- strm
.avail_out
));
8728 rc
= inflate (&strm
, Z_FINISH
);
8729 if (rc
!= Z_STREAM_END
)
8731 rc
= inflateReset (& strm
);
8733 rc
= inflateEnd (& strm
);
8735 || strm
.avail_out
!= 0)
8738 free (compressed_buffer
);
8739 *buffer
= uncompressed_buffer
;
8740 *size
= uncompressed_size
;
8744 free (uncompressed_buffer
);
8746 #endif /* HAVE_ZLIB_H */
8750 load_specific_debug_section (enum dwarf_section_display_enum debug
,
8751 Elf_Internal_Shdr
* sec
, void * file
)
8753 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
8755 int section_is_compressed
;
8757 /* If it is already loaded, do nothing. */
8758 if (section
->start
!= NULL
)
8761 section_is_compressed
= section
->name
== section
->compressed_name
;
8763 snprintf (buf
, sizeof (buf
), _("%s section data"), section
->name
);
8764 section
->address
= sec
->sh_addr
;
8765 section
->size
= sec
->sh_size
;
8766 section
->start
= (unsigned char *) get_data (NULL
, (FILE *) file
,
8769 if (section
->start
== NULL
)
8772 if (section_is_compressed
)
8773 if (! uncompress_section_contents (§ion
->start
, §ion
->size
))
8776 if (debug_displays
[debug
].relocate
)
8777 apply_relocations ((FILE *) file
, sec
, section
->start
);
8783 load_debug_section (enum dwarf_section_display_enum debug
, void * file
)
8785 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
8786 Elf_Internal_Shdr
* sec
;
8788 /* Locate the debug section. */
8789 sec
= find_section (section
->uncompressed_name
);
8791 section
->name
= section
->uncompressed_name
;
8794 sec
= find_section (section
->compressed_name
);
8796 section
->name
= section
->compressed_name
;
8801 return load_specific_debug_section (debug
, sec
, (FILE *) file
);
8805 free_debug_section (enum dwarf_section_display_enum debug
)
8807 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
8809 if (section
->start
== NULL
)
8812 free ((char *) section
->start
);
8813 section
->start
= NULL
;
8814 section
->address
= 0;
8819 display_debug_section (Elf_Internal_Shdr
* section
, FILE * file
)
8821 char * name
= SECTION_NAME (section
);
8822 bfd_size_type length
;
8826 length
= section
->sh_size
;
8829 printf (_("\nSection '%s' has no debugging data.\n"), name
);
8832 if (section
->sh_type
== SHT_NOBITS
)
8834 /* There is no point in dumping the contents of a debugging section
8835 which has the NOBITS type - the bits in the file will be random.
8836 This can happen when a file containing a .eh_frame section is
8837 stripped with the --only-keep-debug command line option. */
8838 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"), name
);
8842 if (const_strneq (name
, ".gnu.linkonce.wi."))
8843 name
= ".debug_info";
8845 /* See if we know how to display the contents of this section. */
8846 for (i
= 0; i
< max
; i
++)
8847 if (streq (debug_displays
[i
].section
.uncompressed_name
, name
)
8848 || streq (debug_displays
[i
].section
.compressed_name
, name
))
8850 struct dwarf_section
* sec
= &debug_displays
[i
].section
;
8851 int secondary
= (section
!= find_section (name
));
8854 free_debug_section ((enum dwarf_section_display_enum
) i
);
8856 if (streq (sec
->uncompressed_name
, name
))
8857 sec
->name
= sec
->uncompressed_name
;
8859 sec
->name
= sec
->compressed_name
;
8860 if (load_specific_debug_section ((enum dwarf_section_display_enum
) i
,
8863 result
&= debug_displays
[i
].display (sec
, file
);
8865 if (secondary
|| (i
!= info
&& i
!= abbrev
))
8866 free_debug_section ((enum dwarf_section_display_enum
) i
);
8874 printf (_("Unrecognized debug section: %s\n"), name
);
8881 /* Set DUMP_SECTS for all sections where dumps were requested
8882 based on section name. */
8885 initialise_dumps_byname (void)
8887 struct dump_list_entry
* cur
;
8889 for (cur
= dump_sects_byname
; cur
; cur
= cur
->next
)
8894 for (i
= 0, any
= 0; i
< elf_header
.e_shnum
; i
++)
8895 if (streq (SECTION_NAME (section_headers
+ i
), cur
->name
))
8897 request_dump_bynumber (i
, cur
->type
);
8902 warn (_("Section '%s' was not dumped because it does not exist!\n"),
8908 process_section_contents (FILE * file
)
8910 Elf_Internal_Shdr
* section
;
8916 initialise_dumps_byname ();
8918 for (i
= 0, section
= section_headers
;
8919 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
8922 #ifdef SUPPORT_DISASSEMBLY
8923 if (dump_sects
[i
] & DISASS_DUMP
)
8924 disassemble_section (section
, file
);
8926 if (dump_sects
[i
] & HEX_DUMP
)
8927 dump_section_as_bytes (section
, file
, FALSE
);
8929 if (dump_sects
[i
] & RELOC_DUMP
)
8930 dump_section_as_bytes (section
, file
, TRUE
);
8932 if (dump_sects
[i
] & STRING_DUMP
)
8933 dump_section_as_strings (section
, file
);
8935 if (dump_sects
[i
] & DEBUG_DUMP
)
8936 display_debug_section (section
, file
);
8939 /* Check to see if the user requested a
8940 dump of a section that does not exist. */
8941 while (i
++ < num_dump_sects
)
8943 warn (_("Section %d was not dumped because it does not exist!\n"), i
);
8947 process_mips_fpe_exception (int mask
)
8952 if (mask
& OEX_FPU_INEX
)
8953 fputs ("INEX", stdout
), first
= 0;
8954 if (mask
& OEX_FPU_UFLO
)
8955 printf ("%sUFLO", first
? "" : "|"), first
= 0;
8956 if (mask
& OEX_FPU_OFLO
)
8957 printf ("%sOFLO", first
? "" : "|"), first
= 0;
8958 if (mask
& OEX_FPU_DIV0
)
8959 printf ("%sDIV0", first
? "" : "|"), first
= 0;
8960 if (mask
& OEX_FPU_INVAL
)
8961 printf ("%sINVAL", first
? "" : "|");
8964 fputs ("0", stdout
);
8967 /* ARM EABI attributes section. */
8972 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
8974 const char ** table
;
8975 } arm_attr_public_tag
;
8977 static const char * arm_attr_tag_CPU_arch
[] =
8978 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
8979 "v6K", "v7", "v6-M", "v6S-M", "v7E-M"};
8980 static const char * arm_attr_tag_ARM_ISA_use
[] = {"No", "Yes"};
8981 static const char * arm_attr_tag_THUMB_ISA_use
[] =
8982 {"No", "Thumb-1", "Thumb-2"};
8983 static const char * arm_attr_tag_VFP_arch
[] =
8984 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16"};
8985 static const char * arm_attr_tag_WMMX_arch
[] = {"No", "WMMXv1", "WMMXv2"};
8986 static const char * arm_attr_tag_Advanced_SIMD_arch
[] = {"No", "NEONv1"};
8987 static const char * arm_attr_tag_PCS_config
[] =
8988 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
8989 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
8990 static const char * arm_attr_tag_ABI_PCS_R9_use
[] =
8991 {"V6", "SB", "TLS", "Unused"};
8992 static const char * arm_attr_tag_ABI_PCS_RW_data
[] =
8993 {"Absolute", "PC-relative", "SB-relative", "None"};
8994 static const char * arm_attr_tag_ABI_PCS_RO_data
[] =
8995 {"Absolute", "PC-relative", "None"};
8996 static const char * arm_attr_tag_ABI_PCS_GOT_use
[] =
8997 {"None", "direct", "GOT-indirect"};
8998 static const char * arm_attr_tag_ABI_PCS_wchar_t
[] =
8999 {"None", "??? 1", "2", "??? 3", "4"};
9000 static const char * arm_attr_tag_ABI_FP_rounding
[] = {"Unused", "Needed"};
9001 static const char * arm_attr_tag_ABI_FP_denormal
[] =
9002 {"Unused", "Needed", "Sign only"};
9003 static const char * arm_attr_tag_ABI_FP_exceptions
[] = {"Unused", "Needed"};
9004 static const char * arm_attr_tag_ABI_FP_user_exceptions
[] = {"Unused", "Needed"};
9005 static const char * arm_attr_tag_ABI_FP_number_model
[] =
9006 {"Unused", "Finite", "RTABI", "IEEE 754"};
9007 static const char * arm_attr_tag_ABI_align8_needed
[] = {"No", "Yes", "4-byte"};
9008 static const char * arm_attr_tag_ABI_align8_preserved
[] =
9009 {"No", "Yes, except leaf SP", "Yes"};
9010 static const char * arm_attr_tag_ABI_enum_size
[] =
9011 {"Unused", "small", "int", "forced to int"};
9012 static const char * arm_attr_tag_ABI_HardFP_use
[] =
9013 {"As Tag_VFP_arch", "SP only", "DP only", "SP and DP"};
9014 static const char * arm_attr_tag_ABI_VFP_args
[] =
9015 {"AAPCS", "VFP registers", "custom"};
9016 static const char * arm_attr_tag_ABI_WMMX_args
[] =
9017 {"AAPCS", "WMMX registers", "custom"};
9018 static const char * arm_attr_tag_ABI_optimization_goals
[] =
9019 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
9020 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
9021 static const char * arm_attr_tag_ABI_FP_optimization_goals
[] =
9022 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
9023 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
9024 static const char * arm_attr_tag_CPU_unaligned_access
[] = {"None", "v6"};
9025 static const char * arm_attr_tag_VFP_HP_extension
[] =
9026 {"Not Allowed", "Allowed"};
9027 static const char * arm_attr_tag_ABI_FP_16bit_format
[] =
9028 {"None", "IEEE 754", "Alternative Format"};
9029 static const char * arm_attr_tag_T2EE_use
[] = {"Not Allowed", "Allowed"};
9030 static const char * arm_attr_tag_Virtualization_use
[] =
9031 {"Not Allowed", "Allowed"};
9032 static const char * arm_attr_tag_MPextension_use
[] = {"Not Allowed", "Allowed"};
9034 #define LOOKUP(id, name) \
9035 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
9036 static arm_attr_public_tag arm_attr_public_tags
[] =
9038 {4, "CPU_raw_name", 1, NULL
},
9039 {5, "CPU_name", 1, NULL
},
9040 LOOKUP(6, CPU_arch
),
9041 {7, "CPU_arch_profile", 0, NULL
},
9042 LOOKUP(8, ARM_ISA_use
),
9043 LOOKUP(9, THUMB_ISA_use
),
9044 LOOKUP(10, VFP_arch
),
9045 LOOKUP(11, WMMX_arch
),
9046 LOOKUP(12, Advanced_SIMD_arch
),
9047 LOOKUP(13, PCS_config
),
9048 LOOKUP(14, ABI_PCS_R9_use
),
9049 LOOKUP(15, ABI_PCS_RW_data
),
9050 LOOKUP(16, ABI_PCS_RO_data
),
9051 LOOKUP(17, ABI_PCS_GOT_use
),
9052 LOOKUP(18, ABI_PCS_wchar_t
),
9053 LOOKUP(19, ABI_FP_rounding
),
9054 LOOKUP(20, ABI_FP_denormal
),
9055 LOOKUP(21, ABI_FP_exceptions
),
9056 LOOKUP(22, ABI_FP_user_exceptions
),
9057 LOOKUP(23, ABI_FP_number_model
),
9058 LOOKUP(24, ABI_align8_needed
),
9059 LOOKUP(25, ABI_align8_preserved
),
9060 LOOKUP(26, ABI_enum_size
),
9061 LOOKUP(27, ABI_HardFP_use
),
9062 LOOKUP(28, ABI_VFP_args
),
9063 LOOKUP(29, ABI_WMMX_args
),
9064 LOOKUP(30, ABI_optimization_goals
),
9065 LOOKUP(31, ABI_FP_optimization_goals
),
9066 {32, "compatibility", 0, NULL
},
9067 LOOKUP(34, CPU_unaligned_access
),
9068 LOOKUP(36, VFP_HP_extension
),
9069 LOOKUP(38, ABI_FP_16bit_format
),
9070 {64, "nodefaults", 0, NULL
},
9071 {65, "also_compatible_with", 0, NULL
},
9072 LOOKUP(66, T2EE_use
),
9073 {67, "conformance", 1, NULL
},
9074 LOOKUP(68, Virtualization_use
),
9075 LOOKUP(70, MPextension_use
)
9079 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
9083 read_uleb128 (unsigned char * p
, unsigned int * plen
)
9097 val
|= ((unsigned int)c
& 0x7f) << shift
;
9106 static unsigned char *
9107 display_arm_attribute (unsigned char * p
)
9112 arm_attr_public_tag
* attr
;
9116 tag
= read_uleb128 (p
, &len
);
9119 for (i
= 0; i
< ARRAY_SIZE (arm_attr_public_tags
); i
++)
9121 if (arm_attr_public_tags
[i
].tag
== tag
)
9123 attr
= &arm_attr_public_tags
[i
];
9130 printf (" Tag_%s: ", attr
->name
);
9136 case 7: /* Tag_CPU_arch_profile. */
9137 val
= read_uleb128 (p
, &len
);
9141 case 0: printf ("None\n"); break;
9142 case 'A': printf ("Application\n"); break;
9143 case 'R': printf ("Realtime\n"); break;
9144 case 'M': printf ("Microcontroller\n"); break;
9145 default: printf ("??? (%d)\n", val
); break;
9149 case 32: /* Tag_compatibility. */
9150 val
= read_uleb128 (p
, &len
);
9152 printf ("flag = %d, vendor = %s\n", val
, p
);
9153 p
+= strlen ((char *) p
) + 1;
9156 case 64: /* Tag_nodefaults. */
9161 case 65: /* Tag_also_compatible_with. */
9162 val
= read_uleb128 (p
, &len
);
9164 if (val
== 6 /* Tag_CPU_arch. */)
9166 val
= read_uleb128 (p
, &len
);
9168 if ((unsigned int)val
>= ARRAY_SIZE (arm_attr_tag_CPU_arch
))
9169 printf ("??? (%d)\n", val
);
9171 printf ("%s\n", arm_attr_tag_CPU_arch
[val
]);
9175 while (*(p
++) != '\0' /* NUL terminator. */);
9189 assert (attr
->type
& 0x80);
9190 val
= read_uleb128 (p
, &len
);
9192 type
= attr
->type
& 0x7f;
9194 printf ("??? (%d)\n", val
);
9196 printf ("%s\n", attr
->table
[val
]);
9203 type
= 1; /* String. */
9205 type
= 2; /* uleb128. */
9206 printf (" Tag_unknown_%d: ", tag
);
9211 printf ("\"%s\"\n", p
);
9212 p
+= strlen ((char *) p
) + 1;
9216 val
= read_uleb128 (p
, &len
);
9218 printf ("%d (0x%x)\n", val
, val
);
9224 static unsigned char *
9225 display_gnu_attribute (unsigned char * p
,
9226 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, int))
9233 tag
= read_uleb128 (p
, &len
);
9236 /* Tag_compatibility is the only generic GNU attribute defined at
9240 val
= read_uleb128 (p
, &len
);
9242 printf ("flag = %d, vendor = %s\n", val
, p
);
9243 p
+= strlen ((char *) p
) + 1;
9247 if ((tag
& 2) == 0 && display_proc_gnu_attribute
)
9248 return display_proc_gnu_attribute (p
, tag
);
9251 type
= 1; /* String. */
9253 type
= 2; /* uleb128. */
9254 printf (" Tag_unknown_%d: ", tag
);
9258 printf ("\"%s\"\n", p
);
9259 p
+= strlen ((char *) p
) + 1;
9263 val
= read_uleb128 (p
, &len
);
9265 printf ("%d (0x%x)\n", val
, val
);
9271 static unsigned char *
9272 display_power_gnu_attribute (unsigned char * p
, int tag
)
9278 if (tag
== Tag_GNU_Power_ABI_FP
)
9280 val
= read_uleb128 (p
, &len
);
9282 printf (" Tag_GNU_Power_ABI_FP: ");
9287 printf ("Hard or soft float\n");
9290 printf ("Hard float\n");
9293 printf ("Soft float\n");
9296 printf ("Single-precision hard float\n");
9299 printf ("??? (%d)\n", val
);
9305 if (tag
== Tag_GNU_Power_ABI_Vector
)
9307 val
= read_uleb128 (p
, &len
);
9309 printf (" Tag_GNU_Power_ABI_Vector: ");
9316 printf ("Generic\n");
9319 printf ("AltiVec\n");
9325 printf ("??? (%d)\n", val
);
9331 if (tag
== Tag_GNU_Power_ABI_Struct_Return
)
9333 val
= read_uleb128 (p
, &len
);
9335 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
9345 printf ("Memory\n");
9348 printf ("??? (%d)\n", val
);
9355 type
= 1; /* String. */
9357 type
= 2; /* uleb128. */
9358 printf (" Tag_unknown_%d: ", tag
);
9362 printf ("\"%s\"\n", p
);
9363 p
+= strlen ((char *) p
) + 1;
9367 val
= read_uleb128 (p
, &len
);
9369 printf ("%d (0x%x)\n", val
, val
);
9375 static unsigned char *
9376 display_mips_gnu_attribute (unsigned char * p
, int tag
)
9382 if (tag
== Tag_GNU_MIPS_ABI_FP
)
9384 val
= read_uleb128 (p
, &len
);
9386 printf (" Tag_GNU_MIPS_ABI_FP: ");
9391 printf ("Hard or soft float\n");
9394 printf ("Hard float (-mdouble-float)\n");
9397 printf ("Hard float (-msingle-float)\n");
9400 printf ("Soft float\n");
9403 printf ("64-bit float (-mips32r2 -mfp64)\n");
9406 printf ("??? (%d)\n", val
);
9413 type
= 1; /* String. */
9415 type
= 2; /* uleb128. */
9416 printf (" Tag_unknown_%d: ", tag
);
9420 printf ("\"%s\"\n", p
);
9421 p
+= strlen ((char *) p
) + 1;
9425 val
= read_uleb128 (p
, &len
);
9427 printf ("%d (0x%x)\n", val
, val
);
9434 process_attributes (FILE * file
,
9435 const char * public_name
,
9436 unsigned int proc_type
,
9437 unsigned char * (* display_pub_attribute
) (unsigned char *),
9438 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, int))
9440 Elf_Internal_Shdr
* sect
;
9441 unsigned char * contents
;
9443 unsigned char * end
;
9444 bfd_vma section_len
;
9448 /* Find the section header so that we get the size. */
9449 for (i
= 0, sect
= section_headers
;
9450 i
< elf_header
.e_shnum
;
9453 if (sect
->sh_type
!= proc_type
&& sect
->sh_type
!= SHT_GNU_ATTRIBUTES
)
9456 contents
= (unsigned char *) get_data (NULL
, file
, sect
->sh_offset
, 1,
9457 sect
->sh_size
, _("attributes"));
9458 if (contents
== NULL
)
9464 len
= sect
->sh_size
- 1;
9470 bfd_boolean public_section
;
9471 bfd_boolean gnu_section
;
9473 section_len
= byte_get (p
, 4);
9476 if (section_len
> len
)
9478 printf (_("ERROR: Bad section length (%d > %d)\n"),
9479 (int) section_len
, (int) len
);
9484 printf ("Attribute Section: %s\n", p
);
9486 if (public_name
&& streq ((char *) p
, public_name
))
9487 public_section
= TRUE
;
9489 public_section
= FALSE
;
9491 if (streq ((char *) p
, "gnu"))
9494 gnu_section
= FALSE
;
9496 namelen
= strlen ((char *) p
) + 1;
9498 section_len
-= namelen
+ 4;
9500 while (section_len
> 0)
9506 size
= byte_get (p
, 4);
9507 if (size
> section_len
)
9509 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
9510 (int) size
, (int) section_len
);
9514 section_len
-= size
;
9521 printf ("File Attributes\n");
9524 printf ("Section Attributes:");
9527 printf ("Symbol Attributes:");
9533 val
= read_uleb128 (p
, &i
);
9537 printf (" %d", val
);
9542 printf ("Unknown tag: %d\n", tag
);
9543 public_section
= FALSE
;
9550 p
= display_pub_attribute (p
);
9552 else if (gnu_section
)
9555 p
= display_gnu_attribute (p
,
9556 display_proc_gnu_attribute
);
9560 /* ??? Do something sensible, like dump hex. */
9561 printf (" Unknown section contexts\n");
9568 printf (_("Unknown format '%c'\n"), *p
);
9576 process_arm_specific (FILE * file
)
9578 return process_attributes (file
, "aeabi", SHT_ARM_ATTRIBUTES
,
9579 display_arm_attribute
, NULL
);
9583 process_power_specific (FILE * file
)
9585 return process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
9586 display_power_gnu_attribute
);
9589 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
9590 Print the Address, Access and Initial fields of an entry at VMA ADDR
9591 and return the VMA of the next entry. */
9594 print_mips_got_entry (unsigned char * data
, bfd_vma pltgot
, bfd_vma addr
)
9597 print_vma (addr
, LONG_HEX
);
9599 if (addr
< pltgot
+ 0xfff0)
9600 printf ("%6d(gp)", (int) (addr
- pltgot
- 0x7ff0));
9602 printf ("%10s", "");
9605 printf ("%*s", is_32bit_elf
? 8 : 16, "<unknown>");
9610 entry
= byte_get (data
+ addr
- pltgot
, is_32bit_elf
? 4 : 8);
9611 print_vma (entry
, LONG_HEX
);
9613 return addr
+ (is_32bit_elf
? 4 : 8);
9616 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
9617 PLTGOT. Print the Address and Initial fields of an entry at VMA
9618 ADDR and return the VMA of the next entry. */
9621 print_mips_pltgot_entry (unsigned char * data
, bfd_vma pltgot
, bfd_vma addr
)
9624 print_vma (addr
, LONG_HEX
);
9627 printf ("%*s", is_32bit_elf
? 8 : 16, "<unknown>");
9632 entry
= byte_get (data
+ addr
- pltgot
, is_32bit_elf
? 4 : 8);
9633 print_vma (entry
, LONG_HEX
);
9635 return addr
+ (is_32bit_elf
? 4 : 8);
9639 process_mips_specific (FILE * file
)
9641 Elf_Internal_Dyn
* entry
;
9642 size_t liblist_offset
= 0;
9643 size_t liblistno
= 0;
9644 size_t conflictsno
= 0;
9645 size_t options_offset
= 0;
9646 size_t conflicts_offset
= 0;
9647 size_t pltrelsz
= 0;
9650 bfd_vma mips_pltgot
= 0;
9652 bfd_vma local_gotno
= 0;
9654 bfd_vma symtabno
= 0;
9656 process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
9657 display_mips_gnu_attribute
);
9659 /* We have a lot of special sections. Thanks SGI! */
9660 if (dynamic_section
== NULL
)
9661 /* No information available. */
9664 for (entry
= dynamic_section
; entry
->d_tag
!= DT_NULL
; ++entry
)
9665 switch (entry
->d_tag
)
9667 case DT_MIPS_LIBLIST
:
9669 = offset_from_vma (file
, entry
->d_un
.d_val
,
9670 liblistno
* sizeof (Elf32_External_Lib
));
9672 case DT_MIPS_LIBLISTNO
:
9673 liblistno
= entry
->d_un
.d_val
;
9675 case DT_MIPS_OPTIONS
:
9676 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
9678 case DT_MIPS_CONFLICT
:
9680 = offset_from_vma (file
, entry
->d_un
.d_val
,
9681 conflictsno
* sizeof (Elf32_External_Conflict
));
9683 case DT_MIPS_CONFLICTNO
:
9684 conflictsno
= entry
->d_un
.d_val
;
9687 pltgot
= entry
->d_un
.d_ptr
;
9689 case DT_MIPS_LOCAL_GOTNO
:
9690 local_gotno
= entry
->d_un
.d_val
;
9692 case DT_MIPS_GOTSYM
:
9693 gotsym
= entry
->d_un
.d_val
;
9695 case DT_MIPS_SYMTABNO
:
9696 symtabno
= entry
->d_un
.d_val
;
9698 case DT_MIPS_PLTGOT
:
9699 mips_pltgot
= entry
->d_un
.d_ptr
;
9702 pltrel
= entry
->d_un
.d_val
;
9705 pltrelsz
= entry
->d_un
.d_val
;
9708 jmprel
= entry
->d_un
.d_ptr
;
9714 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
9716 Elf32_External_Lib
* elib
;
9719 elib
= (Elf32_External_Lib
*) get_data (NULL
, file
, liblist_offset
,
9721 sizeof (Elf32_External_Lib
),
9725 printf ("\nSection '.liblist' contains %lu entries:\n",
9726 (unsigned long) liblistno
);
9727 fputs (" Library Time Stamp Checksum Version Flags\n",
9730 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
9737 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9738 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9739 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9740 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9741 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9743 tmp
= gmtime (&time
);
9744 snprintf (timebuf
, sizeof (timebuf
),
9745 "%04u-%02u-%02uT%02u:%02u:%02u",
9746 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9747 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9749 printf ("%3lu: ", (unsigned long) cnt
);
9750 if (VALID_DYNAMIC_NAME (liblist
.l_name
))
9751 print_symbol (20, GET_DYNAMIC_NAME (liblist
.l_name
));
9753 printf ("<corrupt: %9ld>", liblist
.l_name
);
9754 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
9757 if (liblist
.l_flags
== 0)
9768 { " EXACT_MATCH", LL_EXACT_MATCH
},
9769 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
9770 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
9771 { " EXPORTS", LL_EXPORTS
},
9772 { " DELAY_LOAD", LL_DELAY_LOAD
},
9773 { " DELTA", LL_DELTA
}
9775 int flags
= liblist
.l_flags
;
9778 for (fcnt
= 0; fcnt
< ARRAY_SIZE (l_flags_vals
); ++fcnt
)
9779 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
9781 fputs (l_flags_vals
[fcnt
].name
, stdout
);
9782 flags
^= l_flags_vals
[fcnt
].bit
;
9785 printf (" %#x", (unsigned int) flags
);
9795 if (options_offset
!= 0)
9797 Elf_External_Options
* eopt
;
9798 Elf_Internal_Shdr
* sect
= section_headers
;
9799 Elf_Internal_Options
* iopt
;
9800 Elf_Internal_Options
* option
;
9804 /* Find the section header so that we get the size. */
9805 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
9808 eopt
= (Elf_External_Options
*) get_data (NULL
, file
, options_offset
, 1,
9809 sect
->sh_size
, _("options"));
9812 iopt
= (Elf_Internal_Options
*)
9813 cmalloc ((sect
->sh_size
/ sizeof (eopt
)), sizeof (* iopt
));
9816 error (_("Out of memory\n"));
9823 while (offset
< sect
->sh_size
)
9825 Elf_External_Options
* eoption
;
9827 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
9829 option
->kind
= BYTE_GET (eoption
->kind
);
9830 option
->size
= BYTE_GET (eoption
->size
);
9831 option
->section
= BYTE_GET (eoption
->section
);
9832 option
->info
= BYTE_GET (eoption
->info
);
9834 offset
+= option
->size
;
9840 printf (_("\nSection '%s' contains %d entries:\n"),
9841 SECTION_NAME (sect
), cnt
);
9849 switch (option
->kind
)
9852 /* This shouldn't happen. */
9853 printf (" NULL %d %lx", option
->section
, option
->info
);
9856 printf (" REGINFO ");
9857 if (elf_header
.e_machine
== EM_MIPS
)
9860 Elf32_External_RegInfo
* ereg
;
9861 Elf32_RegInfo reginfo
;
9863 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
9864 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9865 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9866 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9867 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9868 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9869 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9871 printf ("GPR %08lx GP 0x%lx\n",
9873 (unsigned long) reginfo
.ri_gp_value
);
9874 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9875 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9876 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9881 Elf64_External_RegInfo
* ereg
;
9882 Elf64_Internal_RegInfo reginfo
;
9884 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
9885 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9886 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9887 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9888 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9889 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9890 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9892 printf ("GPR %08lx GP 0x",
9893 reginfo
.ri_gprmask
);
9894 printf_vma (reginfo
.ri_gp_value
);
9897 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9898 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9899 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9903 case ODK_EXCEPTIONS
:
9904 fputs (" EXCEPTIONS fpe_min(", stdout
);
9905 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
9906 fputs (") fpe_max(", stdout
);
9907 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
9908 fputs (")", stdout
);
9910 if (option
->info
& OEX_PAGE0
)
9911 fputs (" PAGE0", stdout
);
9912 if (option
->info
& OEX_SMM
)
9913 fputs (" SMM", stdout
);
9914 if (option
->info
& OEX_FPDBUG
)
9915 fputs (" FPDBUG", stdout
);
9916 if (option
->info
& OEX_DISMISS
)
9917 fputs (" DISMISS", stdout
);
9920 fputs (" PAD ", stdout
);
9921 if (option
->info
& OPAD_PREFIX
)
9922 fputs (" PREFIX", stdout
);
9923 if (option
->info
& OPAD_POSTFIX
)
9924 fputs (" POSTFIX", stdout
);
9925 if (option
->info
& OPAD_SYMBOL
)
9926 fputs (" SYMBOL", stdout
);
9929 fputs (" HWPATCH ", stdout
);
9930 if (option
->info
& OHW_R4KEOP
)
9931 fputs (" R4KEOP", stdout
);
9932 if (option
->info
& OHW_R8KPFETCH
)
9933 fputs (" R8KPFETCH", stdout
);
9934 if (option
->info
& OHW_R5KEOP
)
9935 fputs (" R5KEOP", stdout
);
9936 if (option
->info
& OHW_R5KCVTL
)
9937 fputs (" R5KCVTL", stdout
);
9940 fputs (" FILL ", stdout
);
9941 /* XXX Print content of info word? */
9944 fputs (" TAGS ", stdout
);
9945 /* XXX Print content of info word? */
9948 fputs (" HWAND ", stdout
);
9949 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9950 fputs (" R4KEOP_CHECKED", stdout
);
9951 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9952 fputs (" R4KEOP_CLEAN", stdout
);
9955 fputs (" HWOR ", stdout
);
9956 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9957 fputs (" R4KEOP_CHECKED", stdout
);
9958 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9959 fputs (" R4KEOP_CLEAN", stdout
);
9962 printf (" GP_GROUP %#06lx self-contained %#06lx",
9963 option
->info
& OGP_GROUP
,
9964 (option
->info
& OGP_SELF
) >> 16);
9967 printf (" IDENT %#06lx self-contained %#06lx",
9968 option
->info
& OGP_GROUP
,
9969 (option
->info
& OGP_SELF
) >> 16);
9972 /* This shouldn't happen. */
9973 printf (" %3d ??? %d %lx",
9974 option
->kind
, option
->section
, option
->info
);
9978 len
= sizeof (* eopt
);
9979 while (len
< option
->size
)
9980 if (((char *) option
)[len
] >= ' '
9981 && ((char *) option
)[len
] < 0x7f)
9982 printf ("%c", ((char *) option
)[len
++]);
9984 printf ("\\%03o", ((char *) option
)[len
++]);
9986 fputs ("\n", stdout
);
9994 if (conflicts_offset
!= 0 && conflictsno
!= 0)
9996 Elf32_Conflict
* iconf
;
9999 if (dynamic_symbols
== NULL
)
10001 error (_("conflict list found without a dynamic symbol table\n"));
10005 iconf
= (Elf32_Conflict
*) cmalloc (conflictsno
, sizeof (* iconf
));
10008 error (_("Out of memory\n"));
10014 Elf32_External_Conflict
* econf32
;
10016 econf32
= (Elf32_External_Conflict
*)
10017 get_data (NULL
, file
, conflicts_offset
, conflictsno
,
10018 sizeof (* econf32
), _("conflict"));
10022 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10023 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
10029 Elf64_External_Conflict
* econf64
;
10031 econf64
= (Elf64_External_Conflict
*)
10032 get_data (NULL
, file
, conflicts_offset
, conflictsno
,
10033 sizeof (* econf64
), _("conflict"));
10037 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10038 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
10043 printf (_("\nSection '.conflict' contains %lu entries:\n"),
10044 (unsigned long) conflictsno
);
10045 puts (_(" Num: Index Value Name"));
10047 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10049 Elf_Internal_Sym
* psym
= & dynamic_symbols
[iconf
[cnt
]];
10051 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
10052 print_vma (psym
->st_value
, FULL_HEX
);
10054 if (VALID_DYNAMIC_NAME (psym
->st_name
))
10055 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
10057 printf ("<corrupt: %14ld>", psym
->st_name
);
10064 if (pltgot
!= 0 && local_gotno
!= 0)
10066 bfd_vma entry
, local_end
, global_end
;
10068 unsigned char * data
;
10072 addr_size
= (is_32bit_elf
? 4 : 8);
10073 local_end
= pltgot
+ local_gotno
* addr_size
;
10074 global_end
= local_end
+ (symtabno
- gotsym
) * addr_size
;
10076 offset
= offset_from_vma (file
, pltgot
, global_end
- pltgot
);
10077 data
= (unsigned char *) get_data (NULL
, file
, offset
,
10078 global_end
- pltgot
, 1, _("GOT"));
10079 printf (_("\nPrimary GOT:\n"));
10080 printf (_(" Canonical gp value: "));
10081 print_vma (pltgot
+ 0x7ff0, LONG_HEX
);
10084 printf (_(" Reserved entries:\n"));
10085 printf (_(" %*s %10s %*s Purpose\n"),
10086 addr_size
* 2, "Address", "Access",
10087 addr_size
* 2, "Initial");
10088 entry
= print_mips_got_entry (data
, pltgot
, entry
);
10089 printf (" Lazy resolver\n");
10091 && (byte_get (data
+ entry
- pltgot
, addr_size
)
10092 >> (addr_size
* 8 - 1)) != 0)
10094 entry
= print_mips_got_entry (data
, pltgot
, entry
);
10095 printf (" Module pointer (GNU extension)\n");
10099 if (entry
< local_end
)
10101 printf (_(" Local entries:\n"));
10102 printf (_(" %*s %10s %*s\n"),
10103 addr_size
* 2, "Address", "Access",
10104 addr_size
* 2, "Initial");
10105 while (entry
< local_end
)
10107 entry
= print_mips_got_entry (data
, pltgot
, entry
);
10113 if (gotsym
< symtabno
)
10117 printf (_(" Global entries:\n"));
10118 printf (_(" %*s %10s %*s %*s %-7s %3s %s\n"),
10119 addr_size
* 2, "Address", "Access",
10120 addr_size
* 2, "Initial",
10121 addr_size
* 2, "Sym.Val.", "Type", "Ndx", "Name");
10122 sym_width
= (is_32bit_elf
? 80 : 160) - 28 - addr_size
* 6 - 1;
10123 for (i
= gotsym
; i
< symtabno
; i
++)
10125 Elf_Internal_Sym
* psym
;
10127 psym
= dynamic_symbols
+ i
;
10128 entry
= print_mips_got_entry (data
, pltgot
, entry
);
10130 print_vma (psym
->st_value
, LONG_HEX
);
10131 printf (" %-7s %3s ",
10132 get_symbol_type (ELF_ST_TYPE (psym
->st_info
)),
10133 get_symbol_index_type (psym
->st_shndx
));
10134 if (VALID_DYNAMIC_NAME (psym
->st_name
))
10135 print_symbol (sym_width
, GET_DYNAMIC_NAME (psym
->st_name
));
10137 printf ("<corrupt: %14ld>", psym
->st_name
);
10147 if (mips_pltgot
!= 0 && jmprel
!= 0 && pltrel
!= 0 && pltrelsz
!= 0)
10149 bfd_vma entry
, end
;
10150 size_t offset
, rel_offset
;
10151 unsigned long count
, i
;
10152 unsigned char * data
;
10153 int addr_size
, sym_width
;
10154 Elf_Internal_Rela
* rels
;
10156 rel_offset
= offset_from_vma (file
, jmprel
, pltrelsz
);
10157 if (pltrel
== DT_RELA
)
10159 if (!slurp_rela_relocs (file
, rel_offset
, pltrelsz
, &rels
, &count
))
10164 if (!slurp_rel_relocs (file
, rel_offset
, pltrelsz
, &rels
, &count
))
10168 entry
= mips_pltgot
;
10169 addr_size
= (is_32bit_elf
? 4 : 8);
10170 end
= mips_pltgot
+ (2 + count
) * addr_size
;
10172 offset
= offset_from_vma (file
, mips_pltgot
, end
- mips_pltgot
);
10173 data
= (unsigned char *) get_data (NULL
, file
, offset
, end
- mips_pltgot
,
10175 printf (_("\nPLT GOT:\n\n"));
10176 printf (_(" Reserved entries:\n"));
10177 printf (_(" %*s %*s Purpose\n"),
10178 addr_size
* 2, "Address", addr_size
* 2, "Initial");
10179 entry
= print_mips_pltgot_entry (data
, mips_pltgot
, entry
);
10180 printf (" PLT lazy resolver\n");
10181 entry
= print_mips_pltgot_entry (data
, mips_pltgot
, entry
);
10182 printf (" Module pointer\n");
10185 printf (_(" Entries:\n"));
10186 printf (_(" %*s %*s %*s %-7s %3s %s\n"),
10187 addr_size
* 2, "Address",
10188 addr_size
* 2, "Initial",
10189 addr_size
* 2, "Sym.Val.", "Type", "Ndx", "Name");
10190 sym_width
= (is_32bit_elf
? 80 : 160) - 17 - addr_size
* 6 - 1;
10191 for (i
= 0; i
< count
; i
++)
10193 Elf_Internal_Sym
* psym
;
10195 psym
= dynamic_symbols
+ get_reloc_symindex (rels
[i
].r_info
);
10196 entry
= print_mips_pltgot_entry (data
, mips_pltgot
, entry
);
10198 print_vma (psym
->st_value
, LONG_HEX
);
10199 printf (" %-7s %3s ",
10200 get_symbol_type (ELF_ST_TYPE (psym
->st_info
)),
10201 get_symbol_index_type (psym
->st_shndx
));
10202 if (VALID_DYNAMIC_NAME (psym
->st_name
))
10203 print_symbol (sym_width
, GET_DYNAMIC_NAME (psym
->st_name
));
10205 printf ("<corrupt: %14ld>", psym
->st_name
);
10219 process_gnu_liblist (FILE * file
)
10221 Elf_Internal_Shdr
* section
;
10222 Elf_Internal_Shdr
* string_sec
;
10223 Elf32_External_Lib
* elib
;
10225 size_t strtab_size
;
10232 for (i
= 0, section
= section_headers
;
10233 i
< elf_header
.e_shnum
;
10236 switch (section
->sh_type
)
10238 case SHT_GNU_LIBLIST
:
10239 if (section
->sh_link
>= elf_header
.e_shnum
)
10242 elib
= (Elf32_External_Lib
*)
10243 get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
10248 string_sec
= section_headers
+ section
->sh_link
;
10250 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
, 1,
10251 string_sec
->sh_size
,
10252 _("liblist string table"));
10253 strtab_size
= string_sec
->sh_size
;
10256 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
10262 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
10263 SECTION_NAME (section
),
10264 (unsigned long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
10266 puts (" Library Time Stamp Checksum Version Flags");
10268 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
10276 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
10277 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
10278 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
10279 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
10280 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
10282 tmp
= gmtime (&time
);
10283 snprintf (timebuf
, sizeof (timebuf
),
10284 "%04u-%02u-%02uT%02u:%02u:%02u",
10285 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
10286 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
10288 printf ("%3lu: ", (unsigned long) cnt
);
10290 printf ("%-20s", liblist
.l_name
< strtab_size
10291 ? strtab
+ liblist
.l_name
: "<corrupt>");
10293 printf ("%-20.20s", liblist
.l_name
< strtab_size
10294 ? strtab
+ liblist
.l_name
: "<corrupt>");
10295 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
10296 liblist
.l_version
, liblist
.l_flags
);
10306 static const char *
10307 get_note_type (unsigned e_type
)
10309 static char buff
[64];
10311 if (elf_header
.e_type
== ET_CORE
)
10315 return _("NT_AUXV (auxiliary vector)");
10317 return _("NT_PRSTATUS (prstatus structure)");
10319 return _("NT_FPREGSET (floating point registers)");
10321 return _("NT_PRPSINFO (prpsinfo structure)");
10322 case NT_TASKSTRUCT
:
10323 return _("NT_TASKSTRUCT (task structure)");
10325 return _("NT_PRXFPREG (user_xfpregs structure)");
10327 return _("NT_PPC_VMX (ppc Altivec registers)");
10329 return _("NT_PPC_VSX (ppc VSX registers)");
10331 return _("NT_PSTATUS (pstatus structure)");
10333 return _("NT_FPREGS (floating point registers)");
10335 return _("NT_PSINFO (psinfo structure)");
10337 return _("NT_LWPSTATUS (lwpstatus_t structure)");
10339 return _("NT_LWPSINFO (lwpsinfo_t structure)");
10340 case NT_WIN32PSTATUS
:
10341 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
10349 return _("NT_VERSION (version)");
10351 return _("NT_ARCH (architecture)");
10356 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
10360 static const char *
10361 get_gnu_elf_note_type (unsigned e_type
)
10363 static char buff
[64];
10367 case NT_GNU_ABI_TAG
:
10368 return _("NT_GNU_ABI_TAG (ABI version tag)");
10370 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
10371 case NT_GNU_BUILD_ID
:
10372 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
10373 case NT_GNU_GOLD_VERSION
:
10374 return _("NT_GNU_GOLD_VERSION (gold version)");
10379 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
10383 static const char *
10384 get_netbsd_elfcore_note_type (unsigned e_type
)
10386 static char buff
[64];
10388 if (e_type
== NT_NETBSDCORE_PROCINFO
)
10390 /* NetBSD core "procinfo" structure. */
10391 return _("NetBSD procinfo structure");
10394 /* As of Jan 2002 there are no other machine-independent notes
10395 defined for NetBSD core files. If the note type is less
10396 than the start of the machine-dependent note types, we don't
10399 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
10401 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
10405 switch (elf_header
.e_machine
)
10407 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
10408 and PT_GETFPREGS == mach+2. */
10413 case EM_SPARC32PLUS
:
10417 case NT_NETBSDCORE_FIRSTMACH
+0:
10418 return _("PT_GETREGS (reg structure)");
10419 case NT_NETBSDCORE_FIRSTMACH
+2:
10420 return _("PT_GETFPREGS (fpreg structure)");
10426 /* On all other arch's, PT_GETREGS == mach+1 and
10427 PT_GETFPREGS == mach+3. */
10431 case NT_NETBSDCORE_FIRSTMACH
+1:
10432 return _("PT_GETREGS (reg structure)");
10433 case NT_NETBSDCORE_FIRSTMACH
+3:
10434 return _("PT_GETFPREGS (fpreg structure)");
10440 snprintf (buff
, sizeof (buff
), _("PT_FIRSTMACH+%d"),
10441 e_type
- NT_NETBSDCORE_FIRSTMACH
);
10445 /* Note that by the ELF standard, the name field is already null byte
10446 terminated, and namesz includes the terminating null byte.
10447 I.E. the value of namesz for the name "FSF" is 4.
10449 If the value of namesz is zero, there is no name present. */
10451 process_note (Elf_Internal_Note
* pnote
)
10453 const char * name
= pnote
->namesz
? pnote
->namedata
: "(NONE)";
10456 if (pnote
->namesz
== 0)
10457 /* If there is no note name, then use the default set of
10458 note type strings. */
10459 nt
= get_note_type (pnote
->type
);
10461 else if (const_strneq (pnote
->namedata
, "GNU"))
10462 /* GNU-specific object file notes. */
10463 nt
= get_gnu_elf_note_type (pnote
->type
);
10465 else if (const_strneq (pnote
->namedata
, "NetBSD-CORE"))
10466 /* NetBSD-specific core file notes. */
10467 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
10469 else if (strneq (pnote
->namedata
, "SPU/", 4))
10471 /* SPU-specific core file notes. */
10472 nt
= pnote
->namedata
+ 4;
10477 /* Don't recognize this note name; just use the default set of
10478 note type strings. */
10479 nt
= get_note_type (pnote
->type
);
10481 printf (" %s\t\t0x%08lx\t%s\n", name
, pnote
->descsz
, nt
);
10487 process_corefile_note_segment (FILE * file
, bfd_vma offset
, bfd_vma length
)
10489 Elf_External_Note
* pnotes
;
10490 Elf_External_Note
* external
;
10496 pnotes
= (Elf_External_Note
*) get_data (NULL
, file
, offset
, 1, length
,
10503 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
10504 (unsigned long) offset
, (unsigned long) length
);
10505 printf (_(" Owner\t\tData size\tDescription\n"));
10507 while (external
< (Elf_External_Note
*) ((char *) pnotes
+ length
))
10509 Elf_External_Note
* next
;
10510 Elf_Internal_Note inote
;
10511 char * temp
= NULL
;
10513 inote
.type
= BYTE_GET (external
->type
);
10514 inote
.namesz
= BYTE_GET (external
->namesz
);
10515 inote
.namedata
= external
->name
;
10516 inote
.descsz
= BYTE_GET (external
->descsz
);
10517 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
10518 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
10520 next
= (Elf_External_Note
*) (inote
.descdata
+ align_power (inote
.descsz
, 2));
10522 if (((char *) next
) > (((char *) pnotes
) + length
))
10524 warn (_("corrupt note found at offset %lx into core notes\n"),
10525 (unsigned long) ((char *) external
- (char *) pnotes
));
10526 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
10527 inote
.type
, inote
.namesz
, inote
.descsz
);
10533 /* Verify that name is null terminated. It appears that at least
10534 one version of Linux (RedHat 6.0) generates corefiles that don't
10535 comply with the ELF spec by failing to include the null byte in
10537 if (inote
.namedata
[inote
.namesz
] != '\0')
10539 temp
= (char *) malloc (inote
.namesz
+ 1);
10543 error (_("Out of memory\n"));
10548 strncpy (temp
, inote
.namedata
, inote
.namesz
);
10549 temp
[inote
.namesz
] = 0;
10551 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
10552 inote
.namedata
= temp
;
10555 res
&= process_note (& inote
);
10570 process_corefile_note_segments (FILE * file
)
10572 Elf_Internal_Phdr
* segment
;
10576 if (! get_program_headers (file
))
10579 for (i
= 0, segment
= program_headers
;
10580 i
< elf_header
.e_phnum
;
10583 if (segment
->p_type
== PT_NOTE
)
10584 res
&= process_corefile_note_segment (file
,
10585 (bfd_vma
) segment
->p_offset
,
10586 (bfd_vma
) segment
->p_filesz
);
10593 process_note_sections (FILE * file
)
10595 Elf_Internal_Shdr
* section
;
10599 for (i
= 0, section
= section_headers
;
10600 i
< elf_header
.e_shnum
;
10602 if (section
->sh_type
== SHT_NOTE
)
10603 res
&= process_corefile_note_segment (file
,
10604 (bfd_vma
) section
->sh_offset
,
10605 (bfd_vma
) section
->sh_size
);
10611 process_notes (FILE * file
)
10613 /* If we have not been asked to display the notes then do nothing. */
10617 if (elf_header
.e_type
!= ET_CORE
)
10618 return process_note_sections (file
);
10620 /* No program headers means no NOTE segment. */
10621 if (elf_header
.e_phnum
> 0)
10622 return process_corefile_note_segments (file
);
10624 printf (_("No note segments present in the core file.\n"));
10629 process_arch_specific (FILE * file
)
10634 switch (elf_header
.e_machine
)
10637 return process_arm_specific (file
);
10639 case EM_MIPS_RS3_LE
:
10640 return process_mips_specific (file
);
10643 return process_power_specific (file
);
10652 get_file_header (FILE * file
)
10654 /* Read in the identity array. */
10655 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
10658 /* Determine how to read the rest of the header. */
10659 switch (elf_header
.e_ident
[EI_DATA
])
10661 default: /* fall through */
10662 case ELFDATANONE
: /* fall through */
10664 byte_get
= byte_get_little_endian
;
10665 byte_put
= byte_put_little_endian
;
10668 byte_get
= byte_get_big_endian
;
10669 byte_put
= byte_put_big_endian
;
10673 /* For now we only support 32 bit and 64 bit ELF files. */
10674 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
10676 /* Read in the rest of the header. */
10679 Elf32_External_Ehdr ehdr32
;
10681 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
10684 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
10685 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
10686 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
10687 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
10688 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
10689 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
10690 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
10691 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
10692 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
10693 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
10694 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
10695 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
10696 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
10700 Elf64_External_Ehdr ehdr64
;
10702 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10703 we will not be able to cope with the 64bit data found in
10704 64 ELF files. Detect this now and abort before we start
10705 overwriting things. */
10706 if (sizeof (bfd_vma
) < 8)
10708 error (_("This instance of readelf has been built without support for a\n\
10709 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10713 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
10716 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
10717 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
10718 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
10719 elf_header
.e_entry
= BYTE_GET (ehdr64
.e_entry
);
10720 elf_header
.e_phoff
= BYTE_GET (ehdr64
.e_phoff
);
10721 elf_header
.e_shoff
= BYTE_GET (ehdr64
.e_shoff
);
10722 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
10723 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
10724 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
10725 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
10726 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
10727 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
10728 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
10731 if (elf_header
.e_shoff
)
10733 /* There may be some extensions in the first section header. Don't
10734 bomb if we can't read it. */
10736 get_32bit_section_headers (file
, 1);
10738 get_64bit_section_headers (file
, 1);
10744 /* Process one ELF object file according to the command line options.
10745 This file may actually be stored in an archive. The file is
10746 positioned at the start of the ELF object. */
10749 process_object (char * file_name
, FILE * file
)
10753 if (! get_file_header (file
))
10755 error (_("%s: Failed to read file header\n"), file_name
);
10759 /* Initialise per file variables. */
10760 for (i
= ARRAY_SIZE (version_info
); i
--;)
10761 version_info
[i
] = 0;
10763 for (i
= ARRAY_SIZE (dynamic_info
); i
--;)
10764 dynamic_info
[i
] = 0;
10766 /* Process the file. */
10768 printf (_("\nFile: %s\n"), file_name
);
10770 /* Initialise the dump_sects array from the cmdline_dump_sects array.
10771 Note we do this even if cmdline_dump_sects is empty because we
10772 must make sure that the dump_sets array is zeroed out before each
10773 object file is processed. */
10774 if (num_dump_sects
> num_cmdline_dump_sects
)
10775 memset (dump_sects
, 0, num_dump_sects
* sizeof (* dump_sects
));
10777 if (num_cmdline_dump_sects
> 0)
10779 if (num_dump_sects
== 0)
10780 /* A sneaky way of allocating the dump_sects array. */
10781 request_dump_bynumber (num_cmdline_dump_sects
, 0);
10783 assert (num_dump_sects
>= num_cmdline_dump_sects
);
10784 memcpy (dump_sects
, cmdline_dump_sects
,
10785 num_cmdline_dump_sects
* sizeof (* dump_sects
));
10788 if (! process_file_header ())
10791 if (! process_section_headers (file
))
10793 /* Without loaded section headers we cannot process lots of
10795 do_unwind
= do_version
= do_dump
= do_arch
= 0;
10797 if (! do_using_dynamic
)
10798 do_syms
= do_reloc
= 0;
10801 if (! process_section_groups (file
))
10803 /* Without loaded section groups we cannot process unwind. */
10807 if (process_program_headers (file
))
10808 process_dynamic_section (file
);
10810 process_relocs (file
);
10812 process_unwind (file
);
10814 process_symbol_table (file
);
10816 process_syminfo (file
);
10818 process_version_sections (file
);
10820 process_section_contents (file
);
10822 process_notes (file
);
10824 process_gnu_liblist (file
);
10826 process_arch_specific (file
);
10828 if (program_headers
)
10830 free (program_headers
);
10831 program_headers
= NULL
;
10834 if (section_headers
)
10836 free (section_headers
);
10837 section_headers
= NULL
;
10842 free (string_table
);
10843 string_table
= NULL
;
10844 string_table_length
= 0;
10847 if (dynamic_strings
)
10849 free (dynamic_strings
);
10850 dynamic_strings
= NULL
;
10851 dynamic_strings_length
= 0;
10854 if (dynamic_symbols
)
10856 free (dynamic_symbols
);
10857 dynamic_symbols
= NULL
;
10858 num_dynamic_syms
= 0;
10861 if (dynamic_syminfo
)
10863 free (dynamic_syminfo
);
10864 dynamic_syminfo
= NULL
;
10867 if (section_headers_groups
)
10869 free (section_headers_groups
);
10870 section_headers_groups
= NULL
;
10873 if (section_groups
)
10875 struct group_list
* g
;
10876 struct group_list
* next
;
10878 for (i
= 0; i
< group_count
; i
++)
10880 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
10887 free (section_groups
);
10888 section_groups
= NULL
;
10891 free_debug_memory ();
10896 /* Return the path name for a proxy entry in a thin archive, adjusted relative
10897 to the path name of the thin archive itself if necessary. Always returns
10898 a pointer to malloc'ed memory. */
10901 adjust_relative_path (char * file_name
, char * name
, int name_len
)
10903 char * member_file_name
;
10904 const char * base_name
= lbasename (file_name
);
10906 /* This is a proxy entry for a thin archive member.
10907 If the extended name table contains an absolute path
10908 name, or if the archive is in the current directory,
10909 use the path name as given. Otherwise, we need to
10910 find the member relative to the directory where the
10911 archive is located. */
10912 if (IS_ABSOLUTE_PATH (name
) || base_name
== file_name
)
10914 member_file_name
= (char *) malloc (name_len
+ 1);
10915 if (member_file_name
== NULL
)
10917 error (_("Out of memory\n"));
10920 memcpy (member_file_name
, name
, name_len
);
10921 member_file_name
[name_len
] = '\0';
10925 /* Concatenate the path components of the archive file name
10926 to the relative path name from the extended name table. */
10927 size_t prefix_len
= base_name
- file_name
;
10928 member_file_name
= (char *) malloc (prefix_len
+ name_len
+ 1);
10929 if (member_file_name
== NULL
)
10931 error (_("Out of memory\n"));
10934 memcpy (member_file_name
, file_name
, prefix_len
);
10935 memcpy (member_file_name
+ prefix_len
, name
, name_len
);
10936 member_file_name
[prefix_len
+ name_len
] = '\0';
10938 return member_file_name
;
10941 /* Structure to hold information about an archive file. */
10943 struct archive_info
10945 char * file_name
; /* Archive file name. */
10946 FILE * file
; /* Open file descriptor. */
10947 unsigned long index_num
; /* Number of symbols in table. */
10948 unsigned long * index_array
; /* The array of member offsets. */
10949 char * sym_table
; /* The symbol table. */
10950 unsigned long sym_size
; /* Size of the symbol table. */
10951 char * longnames
; /* The long file names table. */
10952 unsigned long longnames_size
; /* Size of the long file names table. */
10953 unsigned long nested_member_origin
; /* Origin in the nested archive of the current member. */
10954 unsigned long next_arhdr_offset
; /* Offset of the next archive header. */
10955 bfd_boolean is_thin_archive
; /* TRUE if this is a thin archive. */
10956 struct ar_hdr arhdr
; /* Current archive header. */
10959 /* Read the symbol table and long-name table from an archive. */
10962 setup_archive (struct archive_info
* arch
, char * file_name
, FILE * file
,
10963 bfd_boolean is_thin_archive
, bfd_boolean read_symbols
)
10966 unsigned long size
;
10968 arch
->file_name
= strdup (file_name
);
10970 arch
->index_num
= 0;
10971 arch
->index_array
= NULL
;
10972 arch
->sym_table
= NULL
;
10973 arch
->sym_size
= 0;
10974 arch
->longnames
= NULL
;
10975 arch
->longnames_size
= 0;
10976 arch
->nested_member_origin
= 0;
10977 arch
->is_thin_archive
= is_thin_archive
;
10978 arch
->next_arhdr_offset
= SARMAG
;
10980 /* Read the first archive member header. */
10981 if (fseek (file
, SARMAG
, SEEK_SET
) != 0)
10983 error (_("%s: failed to seek to first archive header\n"), file_name
);
10986 got
= fread (&arch
->arhdr
, 1, sizeof arch
->arhdr
, file
);
10987 if (got
!= sizeof arch
->arhdr
)
10992 error (_("%s: failed to read archive header\n"), file_name
);
10996 /* See if this is the archive symbol table. */
10997 if (const_strneq (arch
->arhdr
.ar_name
, "/ ")
10998 || const_strneq (arch
->arhdr
.ar_name
, "/SYM64/ "))
11000 size
= strtoul (arch
->arhdr
.ar_size
, NULL
, 10);
11001 size
= size
+ (size
& 1);
11003 arch
->next_arhdr_offset
+= sizeof arch
->arhdr
+ size
;
11008 /* A buffer used to hold numbers read in from an archive index.
11009 These are always 4 bytes long and stored in big-endian format. */
11010 #define SIZEOF_AR_INDEX_NUMBERS 4
11011 unsigned char integer_buffer
[SIZEOF_AR_INDEX_NUMBERS
];
11012 unsigned char * index_buffer
;
11014 /* Check the size of the archive index. */
11015 if (size
< SIZEOF_AR_INDEX_NUMBERS
)
11017 error (_("%s: the archive index is empty\n"), file_name
);
11021 /* Read the numer of entries in the archive index. */
11022 got
= fread (integer_buffer
, 1, sizeof integer_buffer
, file
);
11023 if (got
!= sizeof (integer_buffer
))
11025 error (_("%s: failed to read archive index\n"), file_name
);
11028 arch
->index_num
= byte_get_big_endian (integer_buffer
, sizeof integer_buffer
);
11029 size
-= SIZEOF_AR_INDEX_NUMBERS
;
11031 /* Read in the archive index. */
11032 if (size
< arch
->index_num
* SIZEOF_AR_INDEX_NUMBERS
)
11034 error (_("%s: the archive index is supposed to have %ld entries, but the size in the header is too small\n"),
11035 file_name
, arch
->index_num
);
11038 index_buffer
= (unsigned char *)
11039 malloc (arch
->index_num
* SIZEOF_AR_INDEX_NUMBERS
);
11040 if (index_buffer
== NULL
)
11042 error (_("Out of memory whilst trying to read archive symbol index\n"));
11045 got
= fread (index_buffer
, SIZEOF_AR_INDEX_NUMBERS
, arch
->index_num
, file
);
11046 if (got
!= arch
->index_num
)
11048 free (index_buffer
);
11049 error (_("%s: failed to read archive index\n"), file_name
);
11052 size
-= arch
->index_num
* SIZEOF_AR_INDEX_NUMBERS
;
11054 /* Convert the index numbers into the host's numeric format. */
11055 arch
->index_array
= (long unsigned int *)
11056 malloc (arch
->index_num
* sizeof (* arch
->index_array
));
11057 if (arch
->index_array
== NULL
)
11059 free (index_buffer
);
11060 error (_("Out of memory whilst trying to convert the archive symbol index\n"));
11064 for (i
= 0; i
< arch
->index_num
; i
++)
11065 arch
->index_array
[i
] = byte_get_big_endian ((unsigned char *) (index_buffer
+ (i
* SIZEOF_AR_INDEX_NUMBERS
)),
11066 SIZEOF_AR_INDEX_NUMBERS
);
11067 free (index_buffer
);
11069 /* The remaining space in the header is taken up by the symbol table. */
11072 error (_("%s: the archive has an index but no symbols\n"), file_name
);
11075 arch
->sym_table
= (char *) malloc (size
);
11076 arch
->sym_size
= size
;
11077 if (arch
->sym_table
== NULL
)
11079 error (_("Out of memory whilst trying to read archive index symbol table\n"));
11082 got
= fread (arch
->sym_table
, 1, size
, file
);
11085 error (_("%s: failed to read archive index symbol table\n"), file_name
);
11091 if (fseek (file
, size
, SEEK_CUR
) != 0)
11093 error (_("%s: failed to skip archive symbol table\n"), file_name
);
11098 /* Read the next archive header. */
11099 got
= fread (&arch
->arhdr
, 1, sizeof arch
->arhdr
, file
);
11100 if (got
!= sizeof arch
->arhdr
)
11104 error (_("%s: failed to read archive header following archive index\n"), file_name
);
11108 else if (read_symbols
)
11109 printf (_("%s has no archive index\n"), file_name
);
11111 if (const_strneq (arch
->arhdr
.ar_name
, "// "))
11113 /* This is the archive string table holding long member names. */
11114 arch
->longnames_size
= strtoul (arch
->arhdr
.ar_size
, NULL
, 10);
11115 arch
->next_arhdr_offset
+= sizeof arch
->arhdr
+ arch
->longnames_size
;
11117 arch
->longnames
= (char *) malloc (arch
->longnames_size
);
11118 if (arch
->longnames
== NULL
)
11120 error (_("Out of memory reading long symbol names in archive\n"));
11124 if (fread (arch
->longnames
, arch
->longnames_size
, 1, file
) != 1)
11126 free (arch
->longnames
);
11127 arch
->longnames
= NULL
;
11128 error (_("%s: failed to read long symbol name string table\n"), file_name
);
11132 if ((arch
->longnames_size
& 1) != 0)
11139 /* Release the memory used for the archive information. */
11142 release_archive (struct archive_info
* arch
)
11144 if (arch
->file_name
!= NULL
)
11145 free (arch
->file_name
);
11146 if (arch
->index_array
!= NULL
)
11147 free (arch
->index_array
);
11148 if (arch
->sym_table
!= NULL
)
11149 free (arch
->sym_table
);
11150 if (arch
->longnames
!= NULL
)
11151 free (arch
->longnames
);
11154 /* Open and setup a nested archive, if not already open. */
11157 setup_nested_archive (struct archive_info
* nested_arch
, char * member_file_name
)
11159 FILE * member_file
;
11161 /* Have we already setup this archive? */
11162 if (nested_arch
->file_name
!= NULL
11163 && streq (nested_arch
->file_name
, member_file_name
))
11166 /* Close previous file and discard cached information. */
11167 if (nested_arch
->file
!= NULL
)
11168 fclose (nested_arch
->file
);
11169 release_archive (nested_arch
);
11171 member_file
= fopen (member_file_name
, "rb");
11172 if (member_file
== NULL
)
11174 return setup_archive (nested_arch
, member_file_name
, member_file
, FALSE
, FALSE
);
11178 get_archive_member_name_at (struct archive_info
* arch
,
11179 unsigned long offset
,
11180 struct archive_info
* nested_arch
);
11182 /* Get the name of an archive member from the current archive header.
11183 For simple names, this will modify the ar_name field of the current
11184 archive header. For long names, it will return a pointer to the
11185 longnames table. For nested archives, it will open the nested archive
11186 and get the name recursively. NESTED_ARCH is a single-entry cache so
11187 we don't keep rereading the same information from a nested archive. */
11190 get_archive_member_name (struct archive_info
* arch
,
11191 struct archive_info
* nested_arch
)
11193 unsigned long j
, k
;
11195 if (arch
->arhdr
.ar_name
[0] == '/')
11197 /* We have a long name. */
11199 char * member_file_name
;
11200 char * member_name
;
11202 arch
->nested_member_origin
= 0;
11203 k
= j
= strtoul (arch
->arhdr
.ar_name
+ 1, &endp
, 10);
11204 if (arch
->is_thin_archive
&& endp
!= NULL
&& * endp
== ':')
11205 arch
->nested_member_origin
= strtoul (endp
+ 1, NULL
, 10);
11207 while ((j
< arch
->longnames_size
)
11208 && (arch
->longnames
[j
] != '\n')
11209 && (arch
->longnames
[j
] != '\0'))
11211 if (arch
->longnames
[j
-1] == '/')
11213 arch
->longnames
[j
] = '\0';
11215 if (!arch
->is_thin_archive
|| arch
->nested_member_origin
== 0)
11216 return arch
->longnames
+ k
;
11218 /* This is a proxy for a member of a nested archive.
11219 Find the name of the member in that archive. */
11220 member_file_name
= adjust_relative_path (arch
->file_name
, arch
->longnames
+ k
, j
- k
);
11221 if (member_file_name
!= NULL
11222 && setup_nested_archive (nested_arch
, member_file_name
) == 0
11223 && (member_name
= get_archive_member_name_at (nested_arch
, arch
->nested_member_origin
, NULL
)) != NULL
)
11225 free (member_file_name
);
11226 return member_name
;
11228 free (member_file_name
);
11230 /* Last resort: just return the name of the nested archive. */
11231 return arch
->longnames
+ k
;
11234 /* We have a normal (short) name. */
11236 while ((arch
->arhdr
.ar_name
[j
] != '/') && (j
< 16))
11238 arch
->arhdr
.ar_name
[j
] = '\0';
11239 return arch
->arhdr
.ar_name
;
11242 /* Get the name of an archive member at a given OFFSET within an archive ARCH. */
11245 get_archive_member_name_at (struct archive_info
* arch
,
11246 unsigned long offset
,
11247 struct archive_info
* nested_arch
)
11251 if (fseek (arch
->file
, offset
, SEEK_SET
) != 0)
11253 error (_("%s: failed to seek to next file name\n"), arch
->file_name
);
11256 got
= fread (&arch
->arhdr
, 1, sizeof arch
->arhdr
, arch
->file
);
11257 if (got
!= sizeof arch
->arhdr
)
11259 error (_("%s: failed to read archive header\n"), arch
->file_name
);
11262 if (memcmp (arch
->arhdr
.ar_fmag
, ARFMAG
, 2) != 0)
11264 error (_("%s: did not find a valid archive header\n"), arch
->file_name
);
11268 return get_archive_member_name (arch
, nested_arch
);
11271 /* Construct a string showing the name of the archive member, qualified
11272 with the name of the containing archive file. For thin archives, we
11273 use square brackets to denote the indirection. For nested archives,
11274 we show the qualified name of the external member inside the square
11275 brackets (e.g., "thin.a[normal.a(foo.o)]"). */
11278 make_qualified_name (struct archive_info
* arch
,
11279 struct archive_info
* nested_arch
,
11280 char * member_name
)
11285 len
= strlen (arch
->file_name
) + strlen (member_name
) + 3;
11286 if (arch
->is_thin_archive
&& arch
->nested_member_origin
!= 0)
11287 len
+= strlen (nested_arch
->file_name
) + 2;
11289 name
= (char *) malloc (len
);
11292 error (_("Out of memory\n"));
11296 if (arch
->is_thin_archive
&& arch
->nested_member_origin
!= 0)
11297 snprintf (name
, len
, "%s[%s(%s)]", arch
->file_name
, nested_arch
->file_name
, member_name
);
11298 else if (arch
->is_thin_archive
)
11299 snprintf (name
, len
, "%s[%s]", arch
->file_name
, member_name
);
11301 snprintf (name
, len
, "%s(%s)", arch
->file_name
, member_name
);
11306 /* Process an ELF archive.
11307 On entry the file is positioned just after the ARMAG string. */
11310 process_archive (char * file_name
, FILE * file
, bfd_boolean is_thin_archive
)
11312 struct archive_info arch
;
11313 struct archive_info nested_arch
;
11315 size_t file_name_size
;
11320 /* The ARCH structure is used to hold information about this archive. */
11321 arch
.file_name
= NULL
;
11323 arch
.index_array
= NULL
;
11324 arch
.sym_table
= NULL
;
11325 arch
.longnames
= NULL
;
11327 /* The NESTED_ARCH structure is used as a single-item cache of information
11328 about a nested archive (when members of a thin archive reside within
11329 another regular archive file). */
11330 nested_arch
.file_name
= NULL
;
11331 nested_arch
.file
= NULL
;
11332 nested_arch
.index_array
= NULL
;
11333 nested_arch
.sym_table
= NULL
;
11334 nested_arch
.longnames
= NULL
;
11336 if (setup_archive (&arch
, file_name
, file
, is_thin_archive
, do_archive_index
) != 0)
11342 if (do_archive_index
)
11344 if (arch
.sym_table
== NULL
)
11345 error (_("%s: unable to dump the index as none was found\n"), file_name
);
11349 unsigned long current_pos
;
11351 printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
11352 file_name
, arch
.index_num
, arch
.sym_size
);
11353 current_pos
= ftell (file
);
11355 for (i
= l
= 0; i
< arch
.index_num
; i
++)
11357 if ((i
== 0) || ((i
> 0) && (arch
.index_array
[i
] != arch
.index_array
[i
- 1])))
11359 char * member_name
;
11361 member_name
= get_archive_member_name_at (&arch
, arch
.index_array
[i
], &nested_arch
);
11363 if (member_name
!= NULL
)
11365 char * qualified_name
= make_qualified_name (&arch
, &nested_arch
, member_name
);
11367 if (qualified_name
!= NULL
)
11369 printf (_("Binary %s contains:\n"), qualified_name
);
11370 free (qualified_name
);
11375 if (l
>= arch
.sym_size
)
11377 error (_("%s: end of the symbol table reached before the end of the index\n"),
11381 printf ("\t%s\n", arch
.sym_table
+ l
);
11382 l
+= strlen (arch
.sym_table
+ l
) + 1;
11387 if (l
< arch
.sym_size
)
11388 error (_("%s: symbols remain in the index symbol table, but without corresponding entries in the index table\n"),
11391 if (fseek (file
, current_pos
, SEEK_SET
) != 0)
11393 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name
);
11399 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
11400 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
11401 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
11402 && !do_section_groups
)
11404 ret
= 0; /* Archive index only. */
11409 file_name_size
= strlen (file_name
);
11416 char * qualified_name
;
11418 /* Read the next archive header. */
11419 if (fseek (file
, arch
.next_arhdr_offset
, SEEK_SET
) != 0)
11421 error (_("%s: failed to seek to next archive header\n"), file_name
);
11424 got
= fread (&arch
.arhdr
, 1, sizeof arch
.arhdr
, file
);
11425 if (got
!= sizeof arch
.arhdr
)
11429 error (_("%s: failed to read archive header\n"), file_name
);
11433 if (memcmp (arch
.arhdr
.ar_fmag
, ARFMAG
, 2) != 0)
11435 error (_("%s: did not find a valid archive header\n"), arch
.file_name
);
11440 arch
.next_arhdr_offset
+= sizeof arch
.arhdr
;
11442 archive_file_size
= strtoul (arch
.arhdr
.ar_size
, NULL
, 10);
11443 if (archive_file_size
& 01)
11444 ++archive_file_size
;
11446 name
= get_archive_member_name (&arch
, &nested_arch
);
11449 error (_("%s: bad archive file name\n"), file_name
);
11453 namelen
= strlen (name
);
11455 qualified_name
= make_qualified_name (&arch
, &nested_arch
, name
);
11456 if (qualified_name
== NULL
)
11458 error (_("%s: bad archive file name\n"), file_name
);
11463 if (is_thin_archive
&& arch
.nested_member_origin
== 0)
11465 /* This is a proxy for an external member of a thin archive. */
11466 FILE * member_file
;
11467 char * member_file_name
= adjust_relative_path (file_name
, name
, namelen
);
11468 if (member_file_name
== NULL
)
11474 member_file
= fopen (member_file_name
, "rb");
11475 if (member_file
== NULL
)
11477 error (_("Input file '%s' is not readable.\n"), member_file_name
);
11478 free (member_file_name
);
11483 archive_file_offset
= arch
.nested_member_origin
;
11485 ret
|= process_object (qualified_name
, member_file
);
11487 fclose (member_file
);
11488 free (member_file_name
);
11490 else if (is_thin_archive
)
11492 /* This is a proxy for a member of a nested archive. */
11493 archive_file_offset
= arch
.nested_member_origin
+ sizeof arch
.arhdr
;
11495 /* The nested archive file will have been opened and setup by
11496 get_archive_member_name. */
11497 if (fseek (nested_arch
.file
, archive_file_offset
, SEEK_SET
) != 0)
11499 error (_("%s: failed to seek to archive member.\n"), nested_arch
.file_name
);
11504 ret
|= process_object (qualified_name
, nested_arch
.file
);
11508 archive_file_offset
= arch
.next_arhdr_offset
;
11509 arch
.next_arhdr_offset
+= archive_file_size
;
11511 ret
|= process_object (qualified_name
, file
);
11514 free (qualified_name
);
11518 if (nested_arch
.file
!= NULL
)
11519 fclose (nested_arch
.file
);
11520 release_archive (&nested_arch
);
11521 release_archive (&arch
);
11527 process_file (char * file_name
)
11530 struct stat statbuf
;
11531 char armag
[SARMAG
];
11534 if (stat (file_name
, &statbuf
) < 0)
11536 if (errno
== ENOENT
)
11537 error (_("'%s': No such file\n"), file_name
);
11539 error (_("Could not locate '%s'. System error message: %s\n"),
11540 file_name
, strerror (errno
));
11544 if (! S_ISREG (statbuf
.st_mode
))
11546 error (_("'%s' is not an ordinary file\n"), file_name
);
11550 file
= fopen (file_name
, "rb");
11553 error (_("Input file '%s' is not readable.\n"), file_name
);
11557 if (fread (armag
, SARMAG
, 1, file
) != 1)
11559 error (_("%s: Failed to read file's magic number\n"), file_name
);
11564 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
11565 ret
= process_archive (file_name
, file
, FALSE
);
11566 else if (memcmp (armag
, ARMAGT
, SARMAG
) == 0)
11567 ret
= process_archive (file_name
, file
, TRUE
);
11570 if (do_archive_index
)
11571 error (_("File %s is not an archive so its index cannot be displayed.\n"),
11575 archive_file_size
= archive_file_offset
= 0;
11576 ret
= process_object (file_name
, file
);
11584 #ifdef SUPPORT_DISASSEMBLY
11585 /* Needed by the i386 disassembler. For extra credit, someone could
11586 fix this so that we insert symbolic addresses here, esp for GOT/PLT
11590 print_address (unsigned int addr
, FILE * outfile
)
11592 fprintf (outfile
,"0x%8.8x", addr
);
11595 /* Needed by the i386 disassembler. */
11597 db_task_printsym (unsigned int addr
)
11599 print_address (addr
, stderr
);
11604 main (int argc
, char ** argv
)
11608 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
11609 setlocale (LC_MESSAGES
, "");
11611 #if defined (HAVE_SETLOCALE)
11612 setlocale (LC_CTYPE
, "");
11614 bindtextdomain (PACKAGE
, LOCALEDIR
);
11615 textdomain (PACKAGE
);
11617 expandargv (&argc
, &argv
);
11619 parse_args (argc
, argv
);
11621 if (num_dump_sects
> 0)
11623 /* Make a copy of the dump_sects array. */
11624 cmdline_dump_sects
= (dump_type
*)
11625 malloc (num_dump_sects
* sizeof (* dump_sects
));
11626 if (cmdline_dump_sects
== NULL
)
11627 error (_("Out of memory allocating dump request table.\n"));
11630 memcpy (cmdline_dump_sects
, dump_sects
,
11631 num_dump_sects
* sizeof (* dump_sects
));
11632 num_cmdline_dump_sects
= num_dump_sects
;
11636 if (optind
< (argc
- 1))
11640 while (optind
< argc
)
11641 err
|= process_file (argv
[optind
++]);
11643 if (dump_sects
!= NULL
)
11645 if (cmdline_dump_sects
!= NULL
)
11646 free (cmdline_dump_sects
);