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"
133 #include "elf/s390.h"
134 #include "elf/score.h"
136 #include "elf/sparc.h"
138 #include "elf/v850.h"
140 #include "elf/x86-64.h"
141 #include "elf/xstormy16.h"
142 #include "elf/xtensa.h"
147 #include "libiberty.h"
148 #include "safe-ctype.h"
149 #include "filenames.h"
151 char * program_name
= "readelf";
152 static long archive_file_offset
;
153 static unsigned long archive_file_size
;
154 static unsigned long dynamic_addr
;
155 static bfd_size_type dynamic_size
;
156 static unsigned int dynamic_nent
;
157 static char * dynamic_strings
;
158 static unsigned long dynamic_strings_length
;
159 static char * string_table
;
160 static unsigned long string_table_length
;
161 static unsigned long num_dynamic_syms
;
162 static Elf_Internal_Sym
* dynamic_symbols
;
163 static Elf_Internal_Syminfo
* dynamic_syminfo
;
164 static unsigned long dynamic_syminfo_offset
;
165 static unsigned int dynamic_syminfo_nent
;
166 static char program_interpreter
[PATH_MAX
];
167 static bfd_vma dynamic_info
[DT_JMPREL
+ 1];
168 static bfd_vma dynamic_info_DT_GNU_HASH
;
169 static bfd_vma version_info
[16];
170 static Elf_Internal_Ehdr elf_header
;
171 static Elf_Internal_Shdr
* section_headers
;
172 static Elf_Internal_Phdr
* program_headers
;
173 static Elf_Internal_Dyn
* dynamic_section
;
174 static Elf_Internal_Shdr
* symtab_shndx_hdr
;
175 static int show_name
;
176 static int do_dynamic
;
179 static int do_sections
;
180 static int do_section_groups
;
181 static int do_section_details
;
182 static int do_segments
;
183 static int do_unwind
;
184 static int do_using_dynamic
;
185 static int do_header
;
187 static int do_version
;
188 static int do_histogram
;
189 static int do_debugging
;
192 static int do_archive_index
;
193 static int is_32bit_elf
;
197 struct group_list
* next
;
198 unsigned int section_index
;
203 struct group_list
* root
;
204 unsigned int group_index
;
207 static size_t group_count
;
208 static struct group
* section_groups
;
209 static struct group
** section_headers_groups
;
212 /* Flag bits indicating particular types of dump. */
213 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
214 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
215 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
216 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
217 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
219 typedef unsigned char dump_type
;
221 /* A linked list of the section names for which dumps were requested. */
222 struct dump_list_entry
226 struct dump_list_entry
* next
;
228 static struct dump_list_entry
* dump_sects_byname
;
230 /* A dynamic array of flags indicating for which sections a dump
231 has been requested via command line switches. */
232 static dump_type
* cmdline_dump_sects
= NULL
;
233 static unsigned int num_cmdline_dump_sects
= 0;
235 /* A dynamic array of flags indicating for which sections a dump of
236 some kind has been requested. It is reset on a per-object file
237 basis and then initialised from the cmdline_dump_sects array,
238 the results of interpreting the -w switch, and the
239 dump_sects_byname list. */
240 static dump_type
* dump_sects
= NULL
;
241 static unsigned int num_dump_sects
= 0;
244 /* How to print a vma value. */
245 typedef enum print_mode
257 static void (* byte_put
) (unsigned char *, bfd_vma
, int);
261 #define SECTION_NAME(X) \
262 ((X) == NULL ? "<none>" \
263 : string_table == NULL ? "<no-name>" \
264 : ((X)->sh_name >= string_table_length ? "<corrupt>" \
265 : string_table + (X)->sh_name))
267 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
269 #define BYTE_GET(field) byte_get (field, sizeof (field))
271 #define GET_ELF_SYMBOLS(file, section) \
272 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
273 : get_64bit_elf_symbols (file, section))
275 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
276 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
277 already been called and verified that the string exists. */
278 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
280 /* This is just a bit of syntatic sugar. */
281 #define streq(a,b) (strcmp ((a), (b)) == 0)
282 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
283 #define const_strneq(a,b) (strncmp ((a), (b), sizeof (b) - 1) == 0)
286 get_data (void * var
, FILE * file
, long offset
, size_t size
, size_t nmemb
,
291 if (size
== 0 || nmemb
== 0)
294 if (fseek (file
, archive_file_offset
+ offset
, SEEK_SET
))
296 error (_("Unable to seek to 0x%lx for %s\n"),
297 (unsigned long) archive_file_offset
+ offset
, reason
);
304 /* Check for overflow. */
305 if (nmemb
< (~(size_t) 0 - 1) / size
)
306 /* + 1 so that we can '\0' terminate invalid string table sections. */
307 mvar
= malloc (size
* nmemb
+ 1);
311 error (_("Out of memory allocating 0x%lx bytes for %s\n"),
312 (unsigned long)(size
* nmemb
), reason
);
316 ((char *) mvar
)[size
* nmemb
] = '\0';
319 if (fread (mvar
, size
, nmemb
, file
) != nmemb
)
321 error (_("Unable to read in 0x%lx bytes of %s\n"),
322 (unsigned long)(size
* nmemb
), reason
);
332 byte_put_little_endian (unsigned char * field
, bfd_vma value
, int size
)
337 field
[7] = (((value
>> 24) >> 24) >> 8) & 0xff;
338 field
[6] = ((value
>> 24) >> 24) & 0xff;
339 field
[5] = ((value
>> 24) >> 16) & 0xff;
340 field
[4] = ((value
>> 24) >> 8) & 0xff;
343 field
[3] = (value
>> 24) & 0xff;
346 field
[2] = (value
>> 16) & 0xff;
349 field
[1] = (value
>> 8) & 0xff;
352 field
[0] = value
& 0xff;
356 error (_("Unhandled data length: %d\n"), size
);
361 /* Print a VMA value. */
364 print_vma (bfd_vma vma
, print_mode mode
)
377 return nc
+ printf ("%8.8" BFD_VMA_FMT
"x", vma
);
384 return printf ("%5" BFD_VMA_FMT
"d", vma
);
392 return nc
+ printf ("%" BFD_VMA_FMT
"x", vma
);
395 return printf ("%" BFD_VMA_FMT
"d", vma
);
398 return printf ("%" BFD_VMA_FMT
"u", vma
);
403 /* Display a symbol on stdout. Handles the display of non-printing characters.
405 If DO_WIDE is not true then format the symbol to be at most WIDTH characters,
406 truncating as necessary. If WIDTH is negative then format the string to be
407 exactly - WIDTH characters, truncating or padding as necessary.
409 Returns the number of emitted characters. */
412 print_symbol (int width
, const char * symbol
)
415 bfd_boolean extra_padding
= FALSE
;
416 unsigned int num_printed
= 0;
420 /* Set the width to a very large value. This simplifies the code below. */
425 /* Keep the width positive. This also helps. */
427 extra_padding
= TRUE
;
436 /* Look for non-printing symbols inside the symbol's name.
437 This test is triggered in particular by the names generated
438 by the assembler for local labels. */
439 while (ISPRINT (* c
))
449 printf ("%.*s", len
, symbol
);
455 if (* c
== 0 || width
== 0)
458 /* Now display the non-printing character, if
459 there is room left in which to dipslay it. */
465 printf ("^%c", *c
+ 0x40);
475 printf ("<0x%.2x>", *c
);
484 if (extra_padding
&& width
> 0)
486 /* Fill in the remaining spaces. */
487 printf ("%-*s", width
, " ");
495 byte_put_big_endian (unsigned char * field
, bfd_vma value
, int size
)
500 field
[7] = value
& 0xff;
501 field
[6] = (value
>> 8) & 0xff;
502 field
[5] = (value
>> 16) & 0xff;
503 field
[4] = (value
>> 24) & 0xff;
508 field
[3] = value
& 0xff;
512 field
[2] = value
& 0xff;
516 field
[1] = value
& 0xff;
520 field
[0] = value
& 0xff;
524 error (_("Unhandled data length: %d\n"), size
);
529 /* Return a pointer to section NAME, or NULL if no such section exists. */
531 static Elf_Internal_Shdr
*
532 find_section (const char * name
)
536 for (i
= 0; i
< elf_header
.e_shnum
; i
++)
537 if (streq (SECTION_NAME (section_headers
+ i
), name
))
538 return section_headers
+ i
;
543 /* Guess the relocation size commonly used by the specific machines. */
546 guess_is_rela (unsigned int e_machine
)
550 /* Targets that use REL relocations. */
566 /* Targets that use RELA relocations. */
570 case EM_ALTERA_NIOS2
:
590 case EM_LATTICEMICO32
:
598 case EM_CYGNUS_MN10200
:
600 case EM_CYGNUS_MN10300
:
623 case EM_MICROBLAZE_OLD
:
644 warn (_("Don't know about relocations on this machine architecture\n"));
650 slurp_rela_relocs (FILE * file
,
651 unsigned long rel_offset
,
652 unsigned long rel_size
,
653 Elf_Internal_Rela
** relasp
,
654 unsigned long * nrelasp
)
656 Elf_Internal_Rela
* relas
;
657 unsigned long nrelas
;
662 Elf32_External_Rela
* erelas
;
664 erelas
= (Elf32_External_Rela
*) get_data (NULL
, file
, rel_offset
, 1,
665 rel_size
, _("relocs"));
669 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
671 relas
= (Elf_Internal_Rela
*) cmalloc (nrelas
,
672 sizeof (Elf_Internal_Rela
));
677 error (_("out of memory parsing relocs\n"));
681 for (i
= 0; i
< nrelas
; i
++)
683 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
684 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
685 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
692 Elf64_External_Rela
* erelas
;
694 erelas
= (Elf64_External_Rela
*) get_data (NULL
, file
, rel_offset
, 1,
695 rel_size
, _("relocs"));
699 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
701 relas
= (Elf_Internal_Rela
*) cmalloc (nrelas
,
702 sizeof (Elf_Internal_Rela
));
707 error (_("out of memory parsing relocs\n"));
711 for (i
= 0; i
< nrelas
; i
++)
713 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
714 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
715 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
717 /* The #ifdef BFD64 below is to prevent a compile time
718 warning. We know that if we do not have a 64 bit data
719 type that we will never execute this code anyway. */
721 if (elf_header
.e_machine
== EM_MIPS
722 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
724 /* In little-endian objects, r_info isn't really a
725 64-bit little-endian value: it has a 32-bit
726 little-endian symbol index followed by four
727 individual byte fields. Reorder INFO
729 bfd_vma info
= relas
[i
].r_info
;
730 info
= (((info
& 0xffffffff) << 32)
731 | ((info
>> 56) & 0xff)
732 | ((info
>> 40) & 0xff00)
733 | ((info
>> 24) & 0xff0000)
734 | ((info
>> 8) & 0xff000000));
735 relas
[i
].r_info
= info
;
748 slurp_rel_relocs (FILE * file
,
749 unsigned long rel_offset
,
750 unsigned long rel_size
,
751 Elf_Internal_Rela
** relsp
,
752 unsigned long * nrelsp
)
754 Elf_Internal_Rela
* rels
;
760 Elf32_External_Rel
* erels
;
762 erels
= (Elf32_External_Rel
*) get_data (NULL
, file
, rel_offset
, 1,
763 rel_size
, _("relocs"));
767 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
769 rels
= (Elf_Internal_Rela
*) cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
774 error (_("out of memory parsing relocs\n"));
778 for (i
= 0; i
< nrels
; i
++)
780 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
781 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
782 rels
[i
].r_addend
= 0;
789 Elf64_External_Rel
* erels
;
791 erels
= (Elf64_External_Rel
*) get_data (NULL
, file
, rel_offset
, 1,
792 rel_size
, _("relocs"));
796 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
798 rels
= (Elf_Internal_Rela
*) cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
803 error (_("out of memory parsing relocs\n"));
807 for (i
= 0; i
< nrels
; i
++)
809 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
810 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
811 rels
[i
].r_addend
= 0;
813 /* The #ifdef BFD64 below is to prevent a compile time
814 warning. We know that if we do not have a 64 bit data
815 type that we will never execute this code anyway. */
817 if (elf_header
.e_machine
== EM_MIPS
818 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
820 /* In little-endian objects, r_info isn't really a
821 64-bit little-endian value: it has a 32-bit
822 little-endian symbol index followed by four
823 individual byte fields. Reorder INFO
825 bfd_vma info
= rels
[i
].r_info
;
826 info
= (((info
& 0xffffffff) << 32)
827 | ((info
>> 56) & 0xff)
828 | ((info
>> 40) & 0xff00)
829 | ((info
>> 24) & 0xff0000)
830 | ((info
>> 8) & 0xff000000));
831 rels
[i
].r_info
= info
;
843 /* Returns the reloc type extracted from the reloc info field. */
846 get_reloc_type (bfd_vma reloc_info
)
849 return ELF32_R_TYPE (reloc_info
);
851 switch (elf_header
.e_machine
)
854 /* Note: We assume that reloc_info has already been adjusted for us. */
855 return ELF64_MIPS_R_TYPE (reloc_info
);
858 return ELF64_R_TYPE_ID (reloc_info
);
861 return ELF64_R_TYPE (reloc_info
);
865 /* Return the symbol index extracted from the reloc info field. */
868 get_reloc_symindex (bfd_vma reloc_info
)
870 return is_32bit_elf
? ELF32_R_SYM (reloc_info
) : ELF64_R_SYM (reloc_info
);
873 /* Display the contents of the relocation data found at the specified
877 dump_relocations (FILE * file
,
878 unsigned long rel_offset
,
879 unsigned long rel_size
,
880 Elf_Internal_Sym
* symtab
,
883 unsigned long strtablen
,
887 Elf_Internal_Rela
* rels
;
889 if (is_rela
== UNKNOWN
)
890 is_rela
= guess_is_rela (elf_header
.e_machine
);
894 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
899 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
908 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
910 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
915 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
917 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
925 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
927 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
932 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
934 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
938 for (i
= 0; i
< rel_size
; i
++)
943 bfd_vma symtab_index
;
946 offset
= rels
[i
].r_offset
;
947 info
= rels
[i
].r_info
;
949 type
= get_reloc_type (info
);
950 symtab_index
= get_reloc_symindex (info
);
954 printf ("%8.8lx %8.8lx ",
955 (unsigned long) offset
& 0xffffffff,
956 (unsigned long) info
& 0xffffffff);
960 #if BFD_HOST_64BIT_LONG
962 ? "%16.16lx %16.16lx "
963 : "%12.12lx %12.12lx ",
965 #elif BFD_HOST_64BIT_LONG_LONG
968 ? "%16.16llx %16.16llx "
969 : "%12.12llx %12.12llx ",
973 ? "%16.16I64x %16.16I64x "
974 : "%12.12I64x %12.12I64x ",
979 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
980 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
981 _bfd_int64_high (offset
),
982 _bfd_int64_low (offset
),
983 _bfd_int64_high (info
),
984 _bfd_int64_low (info
));
988 switch (elf_header
.e_machine
)
996 rtype
= elf_m32r_reloc_type (type
);
1001 rtype
= elf_i386_reloc_type (type
);
1006 rtype
= elf_m68hc11_reloc_type (type
);
1010 rtype
= elf_m68k_reloc_type (type
);
1014 rtype
= elf_i960_reloc_type (type
);
1019 rtype
= elf_avr_reloc_type (type
);
1022 case EM_OLD_SPARCV9
:
1023 case EM_SPARC32PLUS
:
1026 rtype
= elf_sparc_reloc_type (type
);
1030 rtype
= elf_spu_reloc_type (type
);
1034 case EM_CYGNUS_V850
:
1035 rtype
= v850_reloc_type (type
);
1039 case EM_CYGNUS_D10V
:
1040 rtype
= elf_d10v_reloc_type (type
);
1044 case EM_CYGNUS_D30V
:
1045 rtype
= elf_d30v_reloc_type (type
);
1049 rtype
= elf_dlx_reloc_type (type
);
1053 rtype
= elf_sh_reloc_type (type
);
1057 case EM_CYGNUS_MN10300
:
1058 rtype
= elf_mn10300_reloc_type (type
);
1062 case EM_CYGNUS_MN10200
:
1063 rtype
= elf_mn10200_reloc_type (type
);
1067 case EM_CYGNUS_FR30
:
1068 rtype
= elf_fr30_reloc_type (type
);
1072 rtype
= elf_frv_reloc_type (type
);
1076 rtype
= elf_mcore_reloc_type (type
);
1080 rtype
= elf_mmix_reloc_type (type
);
1085 rtype
= elf_msp430_reloc_type (type
);
1089 rtype
= elf_ppc_reloc_type (type
);
1093 rtype
= elf_ppc64_reloc_type (type
);
1097 case EM_MIPS_RS3_LE
:
1098 rtype
= elf_mips_reloc_type (type
);
1102 rtype
= elf_alpha_reloc_type (type
);
1106 rtype
= elf_arm_reloc_type (type
);
1110 rtype
= elf_arc_reloc_type (type
);
1114 rtype
= elf_hppa_reloc_type (type
);
1120 rtype
= elf_h8_reloc_type (type
);
1125 rtype
= elf_or32_reloc_type (type
);
1130 rtype
= elf_pj_reloc_type (type
);
1133 rtype
= elf_ia64_reloc_type (type
);
1137 rtype
= elf_cris_reloc_type (type
);
1141 rtype
= elf_i860_reloc_type (type
);
1146 rtype
= elf_x86_64_reloc_type (type
);
1150 rtype
= i370_reloc_type (type
);
1155 rtype
= elf_s390_reloc_type (type
);
1159 rtype
= elf_score_reloc_type (type
);
1163 rtype
= elf_xstormy16_reloc_type (type
);
1167 rtype
= elf_crx_reloc_type (type
);
1171 rtype
= elf_vax_reloc_type (type
);
1176 rtype
= elf_ip2k_reloc_type (type
);
1180 rtype
= elf_iq2000_reloc_type (type
);
1185 rtype
= elf_xtensa_reloc_type (type
);
1188 case EM_LATTICEMICO32
:
1189 rtype
= elf_lm32_reloc_type (type
);
1194 rtype
= elf_m32c_reloc_type (type
);
1198 rtype
= elf_mt_reloc_type (type
);
1202 rtype
= elf_bfin_reloc_type (type
);
1206 rtype
= elf_mep_reloc_type (type
);
1211 rtype
= elf_cr16_reloc_type (type
);
1215 case EM_MICROBLAZE_OLD
:
1216 rtype
= elf_microblaze_reloc_type (type
);
1221 printf (_("unrecognized: %-7lx"), (unsigned long) type
& 0xffffffff);
1223 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1225 if (elf_header
.e_machine
== EM_ALPHA
1227 && streq (rtype
, "R_ALPHA_LITUSE")
1230 switch (rels
[i
].r_addend
)
1232 case LITUSE_ALPHA_ADDR
: rtype
= "ADDR"; break;
1233 case LITUSE_ALPHA_BASE
: rtype
= "BASE"; break;
1234 case LITUSE_ALPHA_BYTOFF
: rtype
= "BYTOFF"; break;
1235 case LITUSE_ALPHA_JSR
: rtype
= "JSR"; break;
1236 case LITUSE_ALPHA_TLSGD
: rtype
= "TLSGD"; break;
1237 case LITUSE_ALPHA_TLSLDM
: rtype
= "TLSLDM"; break;
1238 case LITUSE_ALPHA_JSRDIRECT
: rtype
= "JSRDIRECT"; break;
1239 default: rtype
= NULL
;
1242 printf (" (%s)", rtype
);
1246 printf (_("<unknown addend: %lx>"),
1247 (unsigned long) rels
[i
].r_addend
);
1250 else if (symtab_index
)
1252 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1253 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1256 Elf_Internal_Sym
* psym
;
1258 psym
= symtab
+ symtab_index
;
1262 if (ELF_ST_TYPE (psym
->st_info
) == STT_GNU_IFUNC
)
1266 unsigned int width
= is_32bit_elf
? 8 : 14;
1268 /* Relocations against GNU_IFUNC symbols do not use the value
1269 of the symbol as the address to relocate against. Instead
1270 they invoke the function named by the symbol and use its
1271 result as the address for relocation.
1273 To indicate this to the user, do not display the value of
1274 the symbol in the "Symbols's Value" field. Instead show
1275 its name followed by () as a hint that the symbol is
1279 || psym
->st_name
== 0
1280 || psym
->st_name
>= strtablen
)
1283 name
= strtab
+ psym
->st_name
;
1285 len
= print_symbol (width
, name
);
1286 printf ("()%-*s", len
<= width
? (width
+ 1) - len
: 1, " ");
1290 print_vma (psym
->st_value
, LONG_HEX
);
1292 printf (is_32bit_elf
? " " : " ");
1295 if (psym
->st_name
== 0)
1297 const char * sec_name
= "<null>";
1300 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1302 if (psym
->st_shndx
< elf_header
.e_shnum
)
1304 = SECTION_NAME (section_headers
+ psym
->st_shndx
);
1305 else if (psym
->st_shndx
== SHN_ABS
)
1307 else if (psym
->st_shndx
== SHN_COMMON
)
1308 sec_name
= "COMMON";
1309 else if (elf_header
.e_machine
== EM_MIPS
1310 && psym
->st_shndx
== SHN_MIPS_SCOMMON
)
1311 sec_name
= "SCOMMON";
1312 else if (elf_header
.e_machine
== EM_MIPS
1313 && psym
->st_shndx
== SHN_MIPS_SUNDEFINED
)
1314 sec_name
= "SUNDEF";
1315 else if ((elf_header
.e_machine
== EM_X86_64
1316 || elf_header
.e_machine
== EM_L1OM
)
1317 && psym
->st_shndx
== SHN_X86_64_LCOMMON
)
1318 sec_name
= "LARGE_COMMON";
1319 else if (elf_header
.e_machine
== EM_IA_64
1320 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1321 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1322 sec_name
= "ANSI_COM";
1323 else if (elf_header
.e_machine
== EM_IA_64
1324 && (elf_header
.e_ident
[EI_OSABI
]
1325 == ELFOSABI_OPENVMS
)
1326 && psym
->st_shndx
== SHN_IA_64_VMS_SYMVEC
)
1327 sec_name
= "VMS_SYMVEC";
1330 sprintf (name_buf
, "<section 0x%x>",
1331 (unsigned int) psym
->st_shndx
);
1332 sec_name
= name_buf
;
1335 print_symbol (22, sec_name
);
1337 else if (strtab
== NULL
)
1338 printf (_("<string table index: %3ld>"), psym
->st_name
);
1339 else if (psym
->st_name
>= strtablen
)
1340 printf (_("<corrupt string table index: %3ld>"), psym
->st_name
);
1342 print_symbol (22, strtab
+ psym
->st_name
);
1346 long offset
= (long) (bfd_signed_vma
) rels
[i
].r_addend
;
1349 printf (" - %lx", - offset
);
1351 printf (" + %lx", offset
);
1357 printf ("%*c", is_32bit_elf
?
1358 (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1359 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1362 if (elf_header
.e_machine
== EM_SPARCV9
1364 && streq (rtype
, "R_SPARC_OLO10"))
1365 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1370 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1372 bfd_vma type2
= ELF64_MIPS_R_TYPE2 (info
);
1373 bfd_vma type3
= ELF64_MIPS_R_TYPE3 (info
);
1374 const char * rtype2
= elf_mips_reloc_type (type2
);
1375 const char * rtype3
= elf_mips_reloc_type (type3
);
1377 printf (" Type2: ");
1380 printf (_("unrecognized: %-7lx"),
1381 (unsigned long) type2
& 0xffffffff);
1383 printf ("%-17.17s", rtype2
);
1385 printf ("\n Type3: ");
1388 printf (_("unrecognized: %-7lx"),
1389 (unsigned long) type3
& 0xffffffff);
1391 printf ("%-17.17s", rtype3
);
1402 get_mips_dynamic_type (unsigned long type
)
1406 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1407 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1408 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1409 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1410 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1411 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1412 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1413 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1414 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1415 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1416 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1417 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1418 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1419 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1420 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1421 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1422 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1423 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1424 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1425 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1426 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1427 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1428 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1429 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1430 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1431 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1432 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1433 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1434 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1435 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1436 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1437 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1438 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1439 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1440 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1441 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1442 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1443 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1444 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1445 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1446 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1447 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1448 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1449 case DT_MIPS_PLTGOT
: return "MIPS_PLTGOT";
1450 case DT_MIPS_RWPLT
: return "MIPS_RWPLT";
1457 get_sparc64_dynamic_type (unsigned long type
)
1461 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1468 get_ppc_dynamic_type (unsigned long type
)
1472 case DT_PPC_GOT
: return "PPC_GOT";
1473 case DT_PPC_TLSOPT
: return "PPC_TLSOPT";
1480 get_ppc64_dynamic_type (unsigned long type
)
1484 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1485 case DT_PPC64_OPD
: return "PPC64_OPD";
1486 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1487 case DT_PPC64_TLSOPT
: return "PPC64_TLSOPT";
1494 get_parisc_dynamic_type (unsigned long type
)
1498 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1499 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1500 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1501 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1502 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1503 case DT_HP_PREINIT
: return "HP_PREINIT";
1504 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1505 case DT_HP_NEEDED
: return "HP_NEEDED";
1506 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1507 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1508 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1509 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1510 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1511 case DT_HP_EPLTREL
: return "HP_GST_EPLTREL";
1512 case DT_HP_EPLTRELSZ
: return "HP_GST_EPLTRELSZ";
1513 case DT_HP_FILTERED
: return "HP_FILTERED";
1514 case DT_HP_FILTER_TLS
: return "HP_FILTER_TLS";
1515 case DT_HP_COMPAT_FILTERED
: return "HP_COMPAT_FILTERED";
1516 case DT_HP_LAZYLOAD
: return "HP_LAZYLOAD";
1517 case DT_HP_BIND_NOW_COUNT
: return "HP_BIND_NOW_COUNT";
1518 case DT_PLT
: return "PLT";
1519 case DT_PLT_SIZE
: return "PLT_SIZE";
1520 case DT_DLT
: return "DLT";
1521 case DT_DLT_SIZE
: return "DLT_SIZE";
1528 get_ia64_dynamic_type (unsigned long type
)
1532 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1533 case DT_IA_64_VMS_SUBTYPE
: return "VMS_SUBTYPE";
1534 case DT_IA_64_VMS_IMGIOCNT
: return "VMS_IMGIOCNT";
1535 case DT_IA_64_VMS_LNKFLAGS
: return "VMS_LNKFLAGS";
1536 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ
: return "VMS_VIR_MEM_BLK_SIZ";
1537 case DT_IA_64_VMS_IDENT
: return "VMS_IDENT";
1538 case DT_IA_64_VMS_NEEDED_IDENT
: return "VMS_NEEDED_IDENT";
1539 case DT_IA_64_VMS_IMG_RELA_CNT
: return "VMS_IMG_RELA_CNT";
1540 case DT_IA_64_VMS_SEG_RELA_CNT
: return "VMS_SEG_RELA_CNT";
1541 case DT_IA_64_VMS_FIXUP_RELA_CNT
: return "VMS_FIXUP_RELA_CNT";
1542 case DT_IA_64_VMS_FIXUP_NEEDED
: return "VMS_FIXUP_NEEDED";
1543 case DT_IA_64_VMS_SYMVEC_CNT
: return "VMS_SYMVEC_CNT";
1544 case DT_IA_64_VMS_XLATED
: return "VMS_XLATED";
1545 case DT_IA_64_VMS_STACKSIZE
: return "VMS_STACKSIZE";
1546 case DT_IA_64_VMS_UNWINDSZ
: return "VMS_UNWINDSZ";
1547 case DT_IA_64_VMS_UNWIND_CODSEG
: return "VMS_UNWIND_CODSEG";
1548 case DT_IA_64_VMS_UNWIND_INFOSEG
: return "VMS_UNWIND_INFOSEG";
1549 case DT_IA_64_VMS_LINKTIME
: return "VMS_LINKTIME";
1550 case DT_IA_64_VMS_SEG_NO
: return "VMS_SEG_NO";
1551 case DT_IA_64_VMS_SYMVEC_OFFSET
: return "VMS_SYMVEC_OFFSET";
1552 case DT_IA_64_VMS_SYMVEC_SEG
: return "VMS_SYMVEC_SEG";
1553 case DT_IA_64_VMS_UNWIND_OFFSET
: return "VMS_UNWIND_OFFSET";
1554 case DT_IA_64_VMS_UNWIND_SEG
: return "VMS_UNWIND_SEG";
1555 case DT_IA_64_VMS_STRTAB_OFFSET
: return "VMS_STRTAB_OFFSET";
1556 case DT_IA_64_VMS_SYSVER_OFFSET
: return "VMS_SYSVER_OFFSET";
1557 case DT_IA_64_VMS_IMG_RELA_OFF
: return "VMS_IMG_RELA_OFF";
1558 case DT_IA_64_VMS_SEG_RELA_OFF
: return "VMS_SEG_RELA_OFF";
1559 case DT_IA_64_VMS_FIXUP_RELA_OFF
: return "VMS_FIXUP_RELA_OFF";
1560 case DT_IA_64_VMS_PLTGOT_OFFSET
: return "VMS_PLTGOT_OFFSET";
1561 case DT_IA_64_VMS_PLTGOT_SEG
: return "VMS_PLTGOT_SEG";
1562 case DT_IA_64_VMS_FPMODE
: return "VMS_FPMODE";
1569 get_alpha_dynamic_type (unsigned long type
)
1573 case DT_ALPHA_PLTRO
: return "ALPHA_PLTRO";
1580 get_score_dynamic_type (unsigned long type
)
1584 case DT_SCORE_BASE_ADDRESS
: return "SCORE_BASE_ADDRESS";
1585 case DT_SCORE_LOCAL_GOTNO
: return "SCORE_LOCAL_GOTNO";
1586 case DT_SCORE_SYMTABNO
: return "SCORE_SYMTABNO";
1587 case DT_SCORE_GOTSYM
: return "SCORE_GOTSYM";
1588 case DT_SCORE_UNREFEXTNO
: return "SCORE_UNREFEXTNO";
1589 case DT_SCORE_HIPAGENO
: return "SCORE_HIPAGENO";
1597 get_dynamic_type (unsigned long type
)
1599 static char buff
[64];
1603 case DT_NULL
: return "NULL";
1604 case DT_NEEDED
: return "NEEDED";
1605 case DT_PLTRELSZ
: return "PLTRELSZ";
1606 case DT_PLTGOT
: return "PLTGOT";
1607 case DT_HASH
: return "HASH";
1608 case DT_STRTAB
: return "STRTAB";
1609 case DT_SYMTAB
: return "SYMTAB";
1610 case DT_RELA
: return "RELA";
1611 case DT_RELASZ
: return "RELASZ";
1612 case DT_RELAENT
: return "RELAENT";
1613 case DT_STRSZ
: return "STRSZ";
1614 case DT_SYMENT
: return "SYMENT";
1615 case DT_INIT
: return "INIT";
1616 case DT_FINI
: return "FINI";
1617 case DT_SONAME
: return "SONAME";
1618 case DT_RPATH
: return "RPATH";
1619 case DT_SYMBOLIC
: return "SYMBOLIC";
1620 case DT_REL
: return "REL";
1621 case DT_RELSZ
: return "RELSZ";
1622 case DT_RELENT
: return "RELENT";
1623 case DT_PLTREL
: return "PLTREL";
1624 case DT_DEBUG
: return "DEBUG";
1625 case DT_TEXTREL
: return "TEXTREL";
1626 case DT_JMPREL
: return "JMPREL";
1627 case DT_BIND_NOW
: return "BIND_NOW";
1628 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1629 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1630 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1631 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1632 case DT_RUNPATH
: return "RUNPATH";
1633 case DT_FLAGS
: return "FLAGS";
1635 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1636 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1638 case DT_CHECKSUM
: return "CHECKSUM";
1639 case DT_PLTPADSZ
: return "PLTPADSZ";
1640 case DT_MOVEENT
: return "MOVEENT";
1641 case DT_MOVESZ
: return "MOVESZ";
1642 case DT_FEATURE
: return "FEATURE";
1643 case DT_POSFLAG_1
: return "POSFLAG_1";
1644 case DT_SYMINSZ
: return "SYMINSZ";
1645 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1647 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1648 case DT_CONFIG
: return "CONFIG";
1649 case DT_DEPAUDIT
: return "DEPAUDIT";
1650 case DT_AUDIT
: return "AUDIT";
1651 case DT_PLTPAD
: return "PLTPAD";
1652 case DT_MOVETAB
: return "MOVETAB";
1653 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1655 case DT_VERSYM
: return "VERSYM";
1657 case DT_TLSDESC_GOT
: return "TLSDESC_GOT";
1658 case DT_TLSDESC_PLT
: return "TLSDESC_PLT";
1659 case DT_RELACOUNT
: return "RELACOUNT";
1660 case DT_RELCOUNT
: return "RELCOUNT";
1661 case DT_FLAGS_1
: return "FLAGS_1";
1662 case DT_VERDEF
: return "VERDEF";
1663 case DT_VERDEFNUM
: return "VERDEFNUM";
1664 case DT_VERNEED
: return "VERNEED";
1665 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1667 case DT_AUXILIARY
: return "AUXILIARY";
1668 case DT_USED
: return "USED";
1669 case DT_FILTER
: return "FILTER";
1671 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1672 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1673 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1674 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1675 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1676 case DT_GNU_HASH
: return "GNU_HASH";
1679 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1681 const char * result
;
1683 switch (elf_header
.e_machine
)
1686 case EM_MIPS_RS3_LE
:
1687 result
= get_mips_dynamic_type (type
);
1690 result
= get_sparc64_dynamic_type (type
);
1693 result
= get_ppc_dynamic_type (type
);
1696 result
= get_ppc64_dynamic_type (type
);
1699 result
= get_ia64_dynamic_type (type
);
1702 result
= get_alpha_dynamic_type (type
);
1705 result
= get_score_dynamic_type (type
);
1715 snprintf (buff
, sizeof (buff
), _("Processor Specific: %lx"), type
);
1717 else if (((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1718 || (elf_header
.e_machine
== EM_PARISC
1719 && (type
>= OLD_DT_LOOS
) && (type
<= OLD_DT_HIOS
)))
1721 const char * result
;
1723 switch (elf_header
.e_machine
)
1726 result
= get_parisc_dynamic_type (type
);
1729 result
= get_ia64_dynamic_type (type
);
1739 snprintf (buff
, sizeof (buff
), _("Operating System specific: %lx"),
1743 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), type
);
1750 get_file_type (unsigned e_type
)
1752 static char buff
[32];
1756 case ET_NONE
: return _("NONE (None)");
1757 case ET_REL
: return _("REL (Relocatable file)");
1758 case ET_EXEC
: return _("EXEC (Executable file)");
1759 case ET_DYN
: return _("DYN (Shared object file)");
1760 case ET_CORE
: return _("CORE (Core file)");
1763 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1764 snprintf (buff
, sizeof (buff
), _("Processor Specific: (%x)"), e_type
);
1765 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1766 snprintf (buff
, sizeof (buff
), _("OS Specific: (%x)"), e_type
);
1768 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_type
);
1774 get_machine_name (unsigned e_machine
)
1776 static char buff
[64]; /* XXX */
1780 case EM_NONE
: return _("None");
1781 case EM_M32
: return "WE32100";
1782 case EM_SPARC
: return "Sparc";
1783 case EM_SPU
: return "SPU";
1784 case EM_386
: return "Intel 80386";
1785 case EM_68K
: return "MC68000";
1786 case EM_88K
: return "MC88000";
1787 case EM_486
: return "Intel 80486";
1788 case EM_860
: return "Intel 80860";
1789 case EM_MIPS
: return "MIPS R3000";
1790 case EM_S370
: return "IBM System/370";
1791 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1792 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1793 case EM_PARISC
: return "HPPA";
1794 case EM_PPC_OLD
: return "Power PC (old)";
1795 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1796 case EM_960
: return "Intel 90860";
1797 case EM_PPC
: return "PowerPC";
1798 case EM_PPC64
: return "PowerPC64";
1799 case EM_V800
: return "NEC V800";
1800 case EM_FR20
: return "Fujitsu FR20";
1801 case EM_RH32
: return "TRW RH32";
1802 case EM_MCORE
: return "MCORE";
1803 case EM_ARM
: return "ARM";
1804 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1805 case EM_SH
: return "Renesas / SuperH SH";
1806 case EM_SPARCV9
: return "Sparc v9";
1807 case EM_TRICORE
: return "Siemens Tricore";
1808 case EM_ARC
: return "ARC";
1809 case EM_H8_300
: return "Renesas H8/300";
1810 case EM_H8_300H
: return "Renesas H8/300H";
1811 case EM_H8S
: return "Renesas H8S";
1812 case EM_H8_500
: return "Renesas H8/500";
1813 case EM_IA_64
: return "Intel IA-64";
1814 case EM_MIPS_X
: return "Stanford MIPS-X";
1815 case EM_COLDFIRE
: return "Motorola Coldfire";
1816 case EM_68HC12
: return "Motorola M68HC12";
1817 case EM_ALPHA
: return "Alpha";
1818 case EM_CYGNUS_D10V
:
1819 case EM_D10V
: return "d10v";
1820 case EM_CYGNUS_D30V
:
1821 case EM_D30V
: return "d30v";
1822 case EM_CYGNUS_M32R
:
1823 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
1824 case EM_CYGNUS_V850
:
1825 case EM_V850
: return "NEC v850";
1826 case EM_CYGNUS_MN10300
:
1827 case EM_MN10300
: return "mn10300";
1828 case EM_CYGNUS_MN10200
:
1829 case EM_MN10200
: return "mn10200";
1830 case EM_CYGNUS_FR30
:
1831 case EM_FR30
: return "Fujitsu FR30";
1832 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1834 case EM_PJ
: return "picoJava";
1835 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1836 case EM_PCP
: return "Siemens PCP";
1837 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1838 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1839 case EM_STARCORE
: return "Motorola Star*Core processor";
1840 case EM_ME16
: return "Toyota ME16 processor";
1841 case EM_ST100
: return "STMicroelectronics ST100 processor";
1842 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1843 case EM_FX66
: return "Siemens FX66 microcontroller";
1844 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1845 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1846 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1847 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1848 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1849 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1850 case EM_SVX
: return "Silicon Graphics SVx";
1851 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1852 case EM_VAX
: return "Digital VAX";
1854 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1855 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1856 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1857 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1858 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1859 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1860 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1861 case EM_PRISM
: return "Vitesse Prism";
1862 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1863 case EM_L1OM
: return "Intel L1OM";
1865 case EM_S390
: return "IBM S/390";
1866 case EM_SCORE
: return "SUNPLUS S+Core";
1867 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1869 case EM_OR32
: return "OpenRISC";
1870 case EM_CRX
: return "National Semiconductor CRX microprocessor";
1871 case EM_DLX
: return "OpenDLX";
1873 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1874 case EM_IQ2000
: return "Vitesse IQ2000";
1876 case EM_XTENSA
: return "Tensilica Xtensa Processor";
1877 case EM_LATTICEMICO32
: return "Lattice Mico32";
1879 case EM_M32C
: return "Renesas M32c";
1880 case EM_MT
: return "Morpho Techologies MT processor";
1881 case EM_BLACKFIN
: return "Analog Devices Blackfin";
1882 case EM_NIOS32
: return "Altera Nios";
1883 case EM_ALTERA_NIOS2
: return "Altera Nios II";
1884 case EM_XC16X
: return "Infineon Technologies xc16x";
1885 case EM_CYGNUS_MEP
: return "Toshiba MeP Media Engine";
1887 case EM_CR16_OLD
: return "National Semiconductor's CR16";
1888 case EM_MICROBLAZE
: return "Xilinx MicroBlaze";
1889 case EM_MICROBLAZE_OLD
: return "Xilinx MicroBlaze";
1891 snprintf (buff
, sizeof (buff
), _("<unknown>: 0x%x"), e_machine
);
1897 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
1902 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1903 e_flags
&= ~ EF_ARM_EABIMASK
;
1905 /* Handle "generic" ARM flags. */
1906 if (e_flags
& EF_ARM_RELEXEC
)
1908 strcat (buf
, ", relocatable executable");
1909 e_flags
&= ~ EF_ARM_RELEXEC
;
1912 if (e_flags
& EF_ARM_HASENTRY
)
1914 strcat (buf
, ", has entry point");
1915 e_flags
&= ~ EF_ARM_HASENTRY
;
1918 /* Now handle EABI specific flags. */
1922 strcat (buf
, ", <unrecognized EABI>");
1927 case EF_ARM_EABI_VER1
:
1928 strcat (buf
, ", Version1 EABI");
1933 /* Process flags one bit at a time. */
1934 flag
= e_flags
& - e_flags
;
1939 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1940 strcat (buf
, ", sorted symbol tables");
1950 case EF_ARM_EABI_VER2
:
1951 strcat (buf
, ", Version2 EABI");
1956 /* Process flags one bit at a time. */
1957 flag
= e_flags
& - e_flags
;
1962 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1963 strcat (buf
, ", sorted symbol tables");
1966 case EF_ARM_DYNSYMSUSESEGIDX
:
1967 strcat (buf
, ", dynamic symbols use segment index");
1970 case EF_ARM_MAPSYMSFIRST
:
1971 strcat (buf
, ", mapping symbols precede others");
1981 case EF_ARM_EABI_VER3
:
1982 strcat (buf
, ", Version3 EABI");
1985 case EF_ARM_EABI_VER4
:
1986 strcat (buf
, ", Version4 EABI");
1989 case EF_ARM_EABI_VER5
:
1990 strcat (buf
, ", Version5 EABI");
1996 /* Process flags one bit at a time. */
1997 flag
= e_flags
& - e_flags
;
2003 strcat (buf
, ", BE8");
2007 strcat (buf
, ", LE8");
2017 case EF_ARM_EABI_UNKNOWN
:
2018 strcat (buf
, ", GNU EABI");
2023 /* Process flags one bit at a time. */
2024 flag
= e_flags
& - e_flags
;
2029 case EF_ARM_INTERWORK
:
2030 strcat (buf
, ", interworking enabled");
2033 case EF_ARM_APCS_26
:
2034 strcat (buf
, ", uses APCS/26");
2037 case EF_ARM_APCS_FLOAT
:
2038 strcat (buf
, ", uses APCS/float");
2042 strcat (buf
, ", position independent");
2046 strcat (buf
, ", 8 bit structure alignment");
2049 case EF_ARM_NEW_ABI
:
2050 strcat (buf
, ", uses new ABI");
2053 case EF_ARM_OLD_ABI
:
2054 strcat (buf
, ", uses old ABI");
2057 case EF_ARM_SOFT_FLOAT
:
2058 strcat (buf
, ", software FP");
2061 case EF_ARM_VFP_FLOAT
:
2062 strcat (buf
, ", VFP");
2065 case EF_ARM_MAVERICK_FLOAT
:
2066 strcat (buf
, ", Maverick FP");
2077 strcat (buf
,", <unknown>");
2081 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
2083 static char buf
[1024];
2095 decode_ARM_machine_flags (e_flags
, buf
);
2099 switch (e_flags
& EF_FRV_CPU_MASK
)
2101 case EF_FRV_CPU_GENERIC
:
2105 strcat (buf
, ", fr???");
2108 case EF_FRV_CPU_FR300
:
2109 strcat (buf
, ", fr300");
2112 case EF_FRV_CPU_FR400
:
2113 strcat (buf
, ", fr400");
2115 case EF_FRV_CPU_FR405
:
2116 strcat (buf
, ", fr405");
2119 case EF_FRV_CPU_FR450
:
2120 strcat (buf
, ", fr450");
2123 case EF_FRV_CPU_FR500
:
2124 strcat (buf
, ", fr500");
2126 case EF_FRV_CPU_FR550
:
2127 strcat (buf
, ", fr550");
2130 case EF_FRV_CPU_SIMPLE
:
2131 strcat (buf
, ", simple");
2133 case EF_FRV_CPU_TOMCAT
:
2134 strcat (buf
, ", tomcat");
2140 if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_M68000
)
2141 strcat (buf
, ", m68000");
2142 else if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_CPU32
)
2143 strcat (buf
, ", cpu32");
2144 else if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_FIDO
)
2145 strcat (buf
, ", fido_a");
2148 char const * isa
= _("unknown");
2149 char const * mac
= _("unknown mac");
2150 char const * additional
= NULL
;
2152 switch (e_flags
& EF_M68K_CF_ISA_MASK
)
2154 case EF_M68K_CF_ISA_A_NODIV
:
2156 additional
= ", nodiv";
2158 case EF_M68K_CF_ISA_A
:
2161 case EF_M68K_CF_ISA_A_PLUS
:
2164 case EF_M68K_CF_ISA_B_NOUSP
:
2166 additional
= ", nousp";
2168 case EF_M68K_CF_ISA_B
:
2172 strcat (buf
, ", cf, isa ");
2175 strcat (buf
, additional
);
2176 if (e_flags
& EF_M68K_CF_FLOAT
)
2177 strcat (buf
, ", float");
2178 switch (e_flags
& EF_M68K_CF_MAC_MASK
)
2183 case EF_M68K_CF_MAC
:
2186 case EF_M68K_CF_EMAC
:
2199 if (e_flags
& EF_PPC_EMB
)
2200 strcat (buf
, ", emb");
2202 if (e_flags
& EF_PPC_RELOCATABLE
)
2203 strcat (buf
, ", relocatable");
2205 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
2206 strcat (buf
, ", relocatable-lib");
2210 case EM_CYGNUS_V850
:
2211 switch (e_flags
& EF_V850_ARCH
)
2214 strcat (buf
, ", v850e1");
2217 strcat (buf
, ", v850e");
2220 strcat (buf
, ", v850");
2223 strcat (buf
, ", unknown v850 architecture variant");
2229 case EM_CYGNUS_M32R
:
2230 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
2231 strcat (buf
, ", m32r");
2235 case EM_MIPS_RS3_LE
:
2236 if (e_flags
& EF_MIPS_NOREORDER
)
2237 strcat (buf
, ", noreorder");
2239 if (e_flags
& EF_MIPS_PIC
)
2240 strcat (buf
, ", pic");
2242 if (e_flags
& EF_MIPS_CPIC
)
2243 strcat (buf
, ", cpic");
2245 if (e_flags
& EF_MIPS_UCODE
)
2246 strcat (buf
, ", ugen_reserved");
2248 if (e_flags
& EF_MIPS_ABI2
)
2249 strcat (buf
, ", abi2");
2251 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
2252 strcat (buf
, ", odk first");
2254 if (e_flags
& EF_MIPS_32BITMODE
)
2255 strcat (buf
, ", 32bitmode");
2257 switch ((e_flags
& EF_MIPS_MACH
))
2259 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
2260 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
2261 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
2262 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
2263 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
2264 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
2265 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
2266 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
2267 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
2268 case E_MIPS_MACH_9000
: strcat (buf
, ", 9000"); break;
2269 case E_MIPS_MACH_LS2E
: strcat (buf
, ", loongson-2e"); break;
2270 case E_MIPS_MACH_LS2F
: strcat (buf
, ", loongson-2f"); break;
2271 case E_MIPS_MACH_OCTEON
: strcat (buf
, ", octeon"); break;
2272 case E_MIPS_MACH_XLR
: strcat (buf
, ", xlr"); break;
2274 /* We simply ignore the field in this case to avoid confusion:
2275 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2278 default: strcat (buf
, ", unknown CPU"); break;
2281 switch ((e_flags
& EF_MIPS_ABI
))
2283 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
2284 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
2285 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
2286 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
2288 /* We simply ignore the field in this case to avoid confusion:
2289 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2290 This means it is likely to be an o32 file, but not for
2293 default: strcat (buf
, ", unknown ABI"); break;
2296 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
2297 strcat (buf
, ", mdmx");
2299 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
2300 strcat (buf
, ", mips16");
2302 switch ((e_flags
& EF_MIPS_ARCH
))
2304 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
2305 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
2306 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
2307 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
2308 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
2309 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
2310 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
2311 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
2312 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
2313 default: strcat (buf
, ", unknown ISA"); break;
2319 switch ((e_flags
& EF_SH_MACH_MASK
))
2321 case EF_SH1
: strcat (buf
, ", sh1"); break;
2322 case EF_SH2
: strcat (buf
, ", sh2"); break;
2323 case EF_SH3
: strcat (buf
, ", sh3"); break;
2324 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
2325 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
2326 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
2327 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
2328 case EF_SH4
: strcat (buf
, ", sh4"); break;
2329 case EF_SH5
: strcat (buf
, ", sh5"); break;
2330 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
2331 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
2332 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
2333 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
2334 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
2335 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
2336 case EF_SH3_NOMMU
: strcat (buf
, ", sh3-nommu"); break;
2337 case EF_SH4_NOMMU_NOFPU
: strcat (buf
, ", sh4-nommu-nofpu"); break;
2338 case EF_SH2A_SH4_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2339 case EF_SH2A_SH3_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh3-nommu"); break;
2340 case EF_SH2A_SH4
: strcat (buf
, ", sh2a-or-sh4"); break;
2341 case EF_SH2A_SH3E
: strcat (buf
, ", sh2a-or-sh3e"); break;
2342 default: strcat (buf
, ", unknown ISA"); break;
2348 if (e_flags
& EF_SPARC_32PLUS
)
2349 strcat (buf
, ", v8+");
2351 if (e_flags
& EF_SPARC_SUN_US1
)
2352 strcat (buf
, ", ultrasparcI");
2354 if (e_flags
& EF_SPARC_SUN_US3
)
2355 strcat (buf
, ", ultrasparcIII");
2357 if (e_flags
& EF_SPARC_HAL_R1
)
2358 strcat (buf
, ", halr1");
2360 if (e_flags
& EF_SPARC_LEDATA
)
2361 strcat (buf
, ", ledata");
2363 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2364 strcat (buf
, ", tso");
2366 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2367 strcat (buf
, ", pso");
2369 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2370 strcat (buf
, ", rmo");
2374 switch (e_flags
& EF_PARISC_ARCH
)
2376 case EFA_PARISC_1_0
:
2377 strcpy (buf
, ", PA-RISC 1.0");
2379 case EFA_PARISC_1_1
:
2380 strcpy (buf
, ", PA-RISC 1.1");
2382 case EFA_PARISC_2_0
:
2383 strcpy (buf
, ", PA-RISC 2.0");
2388 if (e_flags
& EF_PARISC_TRAPNIL
)
2389 strcat (buf
, ", trapnil");
2390 if (e_flags
& EF_PARISC_EXT
)
2391 strcat (buf
, ", ext");
2392 if (e_flags
& EF_PARISC_LSB
)
2393 strcat (buf
, ", lsb");
2394 if (e_flags
& EF_PARISC_WIDE
)
2395 strcat (buf
, ", wide");
2396 if (e_flags
& EF_PARISC_NO_KABP
)
2397 strcat (buf
, ", no kabp");
2398 if (e_flags
& EF_PARISC_LAZYSWAP
)
2399 strcat (buf
, ", lazyswap");
2404 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2405 strcat (buf
, ", new calling convention");
2407 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2408 strcat (buf
, ", gnu calling convention");
2412 if ((e_flags
& EF_IA_64_ABI64
))
2413 strcat (buf
, ", 64-bit");
2415 strcat (buf
, ", 32-bit");
2416 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2417 strcat (buf
, ", reduced fp model");
2418 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2419 strcat (buf
, ", no function descriptors, constant gp");
2420 else if ((e_flags
& EF_IA_64_CONS_GP
))
2421 strcat (buf
, ", constant gp");
2422 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2423 strcat (buf
, ", absolute");
2427 if ((e_flags
& EF_VAX_NONPIC
))
2428 strcat (buf
, ", non-PIC");
2429 if ((e_flags
& EF_VAX_DFLOAT
))
2430 strcat (buf
, ", D-Float");
2431 if ((e_flags
& EF_VAX_GFLOAT
))
2432 strcat (buf
, ", G-Float");
2441 get_osabi_name (unsigned int osabi
)
2443 static char buff
[32];
2447 case ELFOSABI_NONE
: return "UNIX - System V";
2448 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2449 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2450 case ELFOSABI_LINUX
: return "UNIX - Linux";
2451 case ELFOSABI_HURD
: return "GNU/Hurd";
2452 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2453 case ELFOSABI_AIX
: return "UNIX - AIX";
2454 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2455 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2456 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2457 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2458 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2459 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2460 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2461 case ELFOSABI_AROS
: return "AROS";
2462 case ELFOSABI_STANDALONE
: return _("Standalone App");
2463 case ELFOSABI_ARM
: return "ARM";
2465 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), osabi
);
2471 get_arm_segment_type (unsigned long type
)
2485 get_mips_segment_type (unsigned long type
)
2489 case PT_MIPS_REGINFO
:
2491 case PT_MIPS_RTPROC
:
2493 case PT_MIPS_OPTIONS
:
2503 get_parisc_segment_type (unsigned long type
)
2507 case PT_HP_TLS
: return "HP_TLS";
2508 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2509 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2510 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2511 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2512 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2513 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2514 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2515 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2516 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2517 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2518 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2519 case PT_HP_OPT_ANNOT
: return "HP_OPT_ANNOT";
2520 case PT_HP_HSL_ANNOT
: return "HP_HSL_ANNOT";
2521 case PT_HP_STACK
: return "HP_STACK";
2522 case PT_HP_CORE_UTSNAME
: return "HP_CORE_UTSNAME";
2523 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2524 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2525 case PT_PARISC_WEAKORDER
: return "PARISC_WEAKORDER";
2534 get_ia64_segment_type (unsigned long type
)
2538 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2539 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2540 case PT_HP_TLS
: return "HP_TLS";
2541 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2542 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2543 case PT_IA_64_HP_STACK
: return "HP_STACK";
2552 get_segment_type (unsigned long p_type
)
2554 static char buff
[32];
2558 case PT_NULL
: return "NULL";
2559 case PT_LOAD
: return "LOAD";
2560 case PT_DYNAMIC
: return "DYNAMIC";
2561 case PT_INTERP
: return "INTERP";
2562 case PT_NOTE
: return "NOTE";
2563 case PT_SHLIB
: return "SHLIB";
2564 case PT_PHDR
: return "PHDR";
2565 case PT_TLS
: return "TLS";
2567 case PT_GNU_EH_FRAME
:
2568 return "GNU_EH_FRAME";
2569 case PT_GNU_STACK
: return "GNU_STACK";
2570 case PT_GNU_RELRO
: return "GNU_RELRO";
2573 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2575 const char * result
;
2577 switch (elf_header
.e_machine
)
2580 result
= get_arm_segment_type (p_type
);
2583 case EM_MIPS_RS3_LE
:
2584 result
= get_mips_segment_type (p_type
);
2587 result
= get_parisc_segment_type (p_type
);
2590 result
= get_ia64_segment_type (p_type
);
2600 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2602 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2604 const char * result
;
2606 switch (elf_header
.e_machine
)
2609 result
= get_parisc_segment_type (p_type
);
2612 result
= get_ia64_segment_type (p_type
);
2622 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2625 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), p_type
);
2632 get_mips_section_type_name (unsigned int sh_type
)
2636 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2637 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2638 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2639 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2640 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2641 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2642 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2643 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2644 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2645 case SHT_MIPS_RELD
: return "MIPS_RELD";
2646 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2647 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2648 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2649 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2650 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2651 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2652 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2653 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2654 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2655 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2656 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2657 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2658 case SHT_MIPS_LINE
: return "MIPS_LINE";
2659 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2660 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2661 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2662 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2663 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2664 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2665 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2666 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2667 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2668 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2669 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2670 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2671 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2672 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2673 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2674 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2682 get_parisc_section_type_name (unsigned int sh_type
)
2686 case SHT_PARISC_EXT
: return "PARISC_EXT";
2687 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2688 case SHT_PARISC_DOC
: return "PARISC_DOC";
2689 case SHT_PARISC_ANNOT
: return "PARISC_ANNOT";
2690 case SHT_PARISC_SYMEXTN
: return "PARISC_SYMEXTN";
2691 case SHT_PARISC_STUBS
: return "PARISC_STUBS";
2692 case SHT_PARISC_DLKM
: return "PARISC_DLKM";
2700 get_ia64_section_type_name (unsigned int sh_type
)
2702 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2703 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2704 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2708 case SHT_IA_64_EXT
: return "IA_64_EXT";
2709 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2710 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2711 case SHT_IA_64_VMS_TRACE
: return "VMS_TRACE";
2712 case SHT_IA_64_VMS_TIE_SIGNATURES
: return "VMS_TIE_SIGNATURES";
2713 case SHT_IA_64_VMS_DEBUG
: return "VMS_DEBUG";
2714 case SHT_IA_64_VMS_DEBUG_STR
: return "VMS_DEBUG_STR";
2715 case SHT_IA_64_VMS_LINKAGES
: return "VMS_LINKAGES";
2716 case SHT_IA_64_VMS_SYMBOL_VECTOR
: return "VMS_SYMBOL_VECTOR";
2717 case SHT_IA_64_VMS_FIXUP
: return "VMS_FIXUP";
2725 get_x86_64_section_type_name (unsigned int sh_type
)
2729 case SHT_X86_64_UNWIND
: return "X86_64_UNWIND";
2737 get_arm_section_type_name (unsigned int sh_type
)
2741 case SHT_ARM_EXIDX
: return "ARM_EXIDX";
2742 case SHT_ARM_PREEMPTMAP
: return "ARM_PREEMPTMAP";
2743 case SHT_ARM_ATTRIBUTES
: return "ARM_ATTRIBUTES";
2744 case SHT_ARM_DEBUGOVERLAY
: return "ARM_DEBUGOVERLAY";
2745 case SHT_ARM_OVERLAYSECTION
: return "ARM_OVERLAYSECTION";
2753 get_section_type_name (unsigned int sh_type
)
2755 static char buff
[32];
2759 case SHT_NULL
: return "NULL";
2760 case SHT_PROGBITS
: return "PROGBITS";
2761 case SHT_SYMTAB
: return "SYMTAB";
2762 case SHT_STRTAB
: return "STRTAB";
2763 case SHT_RELA
: return "RELA";
2764 case SHT_HASH
: return "HASH";
2765 case SHT_DYNAMIC
: return "DYNAMIC";
2766 case SHT_NOTE
: return "NOTE";
2767 case SHT_NOBITS
: return "NOBITS";
2768 case SHT_REL
: return "REL";
2769 case SHT_SHLIB
: return "SHLIB";
2770 case SHT_DYNSYM
: return "DYNSYM";
2771 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2772 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2773 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2774 case SHT_GNU_HASH
: return "GNU_HASH";
2775 case SHT_GROUP
: return "GROUP";
2776 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2777 case SHT_GNU_verdef
: return "VERDEF";
2778 case SHT_GNU_verneed
: return "VERNEED";
2779 case SHT_GNU_versym
: return "VERSYM";
2780 case 0x6ffffff0: return "VERSYM";
2781 case 0x6ffffffc: return "VERDEF";
2782 case 0x7ffffffd: return "AUXILIARY";
2783 case 0x7fffffff: return "FILTER";
2784 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2787 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2789 const char * result
;
2791 switch (elf_header
.e_machine
)
2794 case EM_MIPS_RS3_LE
:
2795 result
= get_mips_section_type_name (sh_type
);
2798 result
= get_parisc_section_type_name (sh_type
);
2801 result
= get_ia64_section_type_name (sh_type
);
2805 result
= get_x86_64_section_type_name (sh_type
);
2808 result
= get_arm_section_type_name (sh_type
);
2818 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2820 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2822 const char * result
;
2824 switch (elf_header
.e_machine
)
2827 result
= get_ia64_section_type_name (sh_type
);
2837 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2839 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2840 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2842 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), sh_type
);
2848 #define OPTION_DEBUG_DUMP 512
2850 static struct option options
[] =
2852 {"all", no_argument
, 0, 'a'},
2853 {"file-header", no_argument
, 0, 'h'},
2854 {"program-headers", no_argument
, 0, 'l'},
2855 {"headers", no_argument
, 0, 'e'},
2856 {"histogram", no_argument
, 0, 'I'},
2857 {"segments", no_argument
, 0, 'l'},
2858 {"sections", no_argument
, 0, 'S'},
2859 {"section-headers", no_argument
, 0, 'S'},
2860 {"section-groups", no_argument
, 0, 'g'},
2861 {"section-details", no_argument
, 0, 't'},
2862 {"full-section-name",no_argument
, 0, 'N'},
2863 {"symbols", no_argument
, 0, 's'},
2864 {"syms", no_argument
, 0, 's'},
2865 {"relocs", no_argument
, 0, 'r'},
2866 {"notes", no_argument
, 0, 'n'},
2867 {"dynamic", no_argument
, 0, 'd'},
2868 {"arch-specific", no_argument
, 0, 'A'},
2869 {"version-info", no_argument
, 0, 'V'},
2870 {"use-dynamic", no_argument
, 0, 'D'},
2871 {"unwind", no_argument
, 0, 'u'},
2872 {"archive-index", no_argument
, 0, 'c'},
2873 {"hex-dump", required_argument
, 0, 'x'},
2874 {"relocated-dump", required_argument
, 0, 'R'},
2875 {"string-dump", required_argument
, 0, 'p'},
2876 #ifdef SUPPORT_DISASSEMBLY
2877 {"instruction-dump", required_argument
, 0, 'i'},
2879 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2881 {"version", no_argument
, 0, 'v'},
2882 {"wide", no_argument
, 0, 'W'},
2883 {"help", no_argument
, 0, 'H'},
2884 {0, no_argument
, 0, 0}
2888 usage (FILE * stream
)
2890 fprintf (stream
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2891 fprintf (stream
, _(" Display information about the contents of ELF format files\n"));
2892 fprintf (stream
, _(" Options are:\n\
2893 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2894 -h --file-header Display the ELF file header\n\
2895 -l --program-headers Display the program headers\n\
2896 --segments An alias for --program-headers\n\
2897 -S --section-headers Display the sections' header\n\
2898 --sections An alias for --section-headers\n\
2899 -g --section-groups Display the section groups\n\
2900 -t --section-details Display the section details\n\
2901 -e --headers Equivalent to: -h -l -S\n\
2902 -s --syms Display the symbol table\n\
2903 --symbols An alias for --syms\n\
2904 -n --notes Display the core notes (if present)\n\
2905 -r --relocs Display the relocations (if present)\n\
2906 -u --unwind Display the unwind info (if present)\n\
2907 -d --dynamic Display the dynamic section (if present)\n\
2908 -V --version-info Display the version sections (if present)\n\
2909 -A --arch-specific Display architecture specific information (if any).\n\
2910 -c --archive-index Display the symbol/file index in an archive\n\
2911 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2912 -x --hex-dump=<number|name>\n\
2913 Dump the contents of section <number|name> as bytes\n\
2914 -p --string-dump=<number|name>\n\
2915 Dump the contents of section <number|name> as strings\n\
2916 -R --relocated-dump=<number|name>\n\
2917 Dump the contents of section <number|name> as relocated bytes\n\
2918 -w[lLiaprmfFsoR] or\n\
2919 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]\n\
2920 Display the contents of DWARF2 debug sections\n"));
2921 #ifdef SUPPORT_DISASSEMBLY
2922 fprintf (stream
, _("\
2923 -i --instruction-dump=<number|name>\n\
2924 Disassemble the contents of section <number|name>\n"));
2926 fprintf (stream
, _("\
2927 -I --histogram Display histogram of bucket list lengths\n\
2928 -W --wide Allow output width to exceed 80 characters\n\
2929 @<file> Read options from <file>\n\
2930 -H --help Display this information\n\
2931 -v --version Display the version number of readelf\n"));
2933 if (REPORT_BUGS_TO
[0] && stream
== stdout
)
2934 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2936 exit (stream
== stdout
? 0 : 1);
2939 /* Record the fact that the user wants the contents of section number
2940 SECTION to be displayed using the method(s) encoded as flags bits
2941 in TYPE. Note, TYPE can be zero if we are creating the array for
2945 request_dump_bynumber (unsigned int section
, dump_type type
)
2947 if (section
>= num_dump_sects
)
2949 dump_type
* new_dump_sects
;
2951 new_dump_sects
= (dump_type
*) calloc (section
+ 1,
2952 sizeof (* dump_sects
));
2954 if (new_dump_sects
== NULL
)
2955 error (_("Out of memory allocating dump request table.\n"));
2958 /* Copy current flag settings. */
2959 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
* sizeof (* dump_sects
));
2963 dump_sects
= new_dump_sects
;
2964 num_dump_sects
= section
+ 1;
2969 dump_sects
[section
] |= type
;
2974 /* Request a dump by section name. */
2977 request_dump_byname (const char * section
, dump_type type
)
2979 struct dump_list_entry
* new_request
;
2981 new_request
= (struct dump_list_entry
*)
2982 malloc (sizeof (struct dump_list_entry
));
2984 error (_("Out of memory allocating dump request table.\n"));
2986 new_request
->name
= strdup (section
);
2987 if (!new_request
->name
)
2988 error (_("Out of memory allocating dump request table.\n"));
2990 new_request
->type
= type
;
2992 new_request
->next
= dump_sects_byname
;
2993 dump_sects_byname
= new_request
;
2997 request_dump (dump_type type
)
3003 section
= strtoul (optarg
, & cp
, 0);
3005 if (! *cp
&& section
>= 0)
3006 request_dump_bynumber (section
, type
);
3008 request_dump_byname (optarg
, type
);
3013 parse_args (int argc
, char ** argv
)
3020 while ((c
= getopt_long
3021 (argc
, argv
, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options
, NULL
)) != EOF
)
3039 do_section_groups
++;
3047 do_section_groups
++;
3052 do_section_details
++;
3096 request_dump (HEX_DUMP
);
3099 request_dump (STRING_DUMP
);
3102 request_dump (RELOC_DUMP
);
3109 dwarf_select_sections_all ();
3114 dwarf_select_sections_by_letters (optarg
);
3117 case OPTION_DEBUG_DUMP
:
3124 dwarf_select_sections_by_names (optarg
);
3127 #ifdef SUPPORT_DISASSEMBLY
3129 request_dump (DISASS_DUMP
);
3133 print_version (program_name
);
3142 /* xgettext:c-format */
3143 error (_("Invalid option '-%c'\n"), c
);
3150 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
3151 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
3152 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
3153 && !do_section_groups
&& !do_archive_index
)
3157 warn (_("Nothing to do.\n"));
3163 get_elf_class (unsigned int elf_class
)
3165 static char buff
[32];
3169 case ELFCLASSNONE
: return _("none");
3170 case ELFCLASS32
: return "ELF32";
3171 case ELFCLASS64
: return "ELF64";
3173 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), elf_class
);
3179 get_data_encoding (unsigned int encoding
)
3181 static char buff
[32];
3185 case ELFDATANONE
: return _("none");
3186 case ELFDATA2LSB
: return _("2's complement, little endian");
3187 case ELFDATA2MSB
: return _("2's complement, big endian");
3189 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), encoding
);
3194 /* Decode the data held in 'elf_header'. */
3197 process_file_header (void)
3199 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
3200 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
3201 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
3202 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
3205 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3209 init_dwarf_regnames (elf_header
.e_machine
);
3215 printf (_("ELF Header:\n"));
3216 printf (_(" Magic: "));
3217 for (i
= 0; i
< EI_NIDENT
; i
++)
3218 printf ("%2.2x ", elf_header
.e_ident
[i
]);
3220 printf (_(" Class: %s\n"),
3221 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
3222 printf (_(" Data: %s\n"),
3223 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
3224 printf (_(" Version: %d %s\n"),
3225 elf_header
.e_ident
[EI_VERSION
],
3226 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
3228 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
3231 printf (_(" OS/ABI: %s\n"),
3232 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
3233 printf (_(" ABI Version: %d\n"),
3234 elf_header
.e_ident
[EI_ABIVERSION
]);
3235 printf (_(" Type: %s\n"),
3236 get_file_type (elf_header
.e_type
));
3237 printf (_(" Machine: %s\n"),
3238 get_machine_name (elf_header
.e_machine
));
3239 printf (_(" Version: 0x%lx\n"),
3240 (unsigned long) elf_header
.e_version
);
3242 printf (_(" Entry point address: "));
3243 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3244 printf (_("\n Start of program headers: "));
3245 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3246 printf (_(" (bytes into file)\n Start of section headers: "));
3247 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
3248 printf (_(" (bytes into file)\n"));
3250 printf (_(" Flags: 0x%lx%s\n"),
3251 (unsigned long) elf_header
.e_flags
,
3252 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
3253 printf (_(" Size of this header: %ld (bytes)\n"),
3254 (long) elf_header
.e_ehsize
);
3255 printf (_(" Size of program headers: %ld (bytes)\n"),
3256 (long) elf_header
.e_phentsize
);
3257 printf (_(" Number of program headers: %ld\n"),
3258 (long) elf_header
.e_phnum
);
3259 printf (_(" Size of section headers: %ld (bytes)\n"),
3260 (long) elf_header
.e_shentsize
);
3261 printf (_(" Number of section headers: %ld"),
3262 (long) elf_header
.e_shnum
);
3263 if (section_headers
!= NULL
&& elf_header
.e_shnum
== SHN_UNDEF
)
3264 printf (" (%ld)", (long) section_headers
[0].sh_size
);
3265 putc ('\n', stdout
);
3266 printf (_(" Section header string table index: %ld"),
3267 (long) elf_header
.e_shstrndx
);
3268 if (section_headers
!= NULL
3269 && elf_header
.e_shstrndx
== (SHN_XINDEX
& 0xffff))
3270 printf (" (%u)", section_headers
[0].sh_link
);
3271 else if (elf_header
.e_shstrndx
!= SHN_UNDEF
3272 && elf_header
.e_shstrndx
>= elf_header
.e_shnum
)
3273 printf (" <corrupt: out of range>");
3274 putc ('\n', stdout
);
3277 if (section_headers
!= NULL
)
3279 if (elf_header
.e_shnum
== SHN_UNDEF
)
3280 elf_header
.e_shnum
= section_headers
[0].sh_size
;
3281 if (elf_header
.e_shstrndx
== (SHN_XINDEX
& 0xffff))
3282 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
3283 else if (elf_header
.e_shstrndx
>= elf_header
.e_shnum
)
3284 elf_header
.e_shstrndx
= SHN_UNDEF
;
3285 free (section_headers
);
3286 section_headers
= NULL
;
3294 get_32bit_program_headers (FILE * file
, Elf_Internal_Phdr
* program_headers
)
3296 Elf32_External_Phdr
* phdrs
;
3297 Elf32_External_Phdr
* external
;
3298 Elf_Internal_Phdr
* internal
;
3301 phdrs
= (Elf32_External_Phdr
*) get_data (NULL
, file
, elf_header
.e_phoff
,
3302 elf_header
.e_phentsize
,
3304 _("program headers"));
3308 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3309 i
< elf_header
.e_phnum
;
3310 i
++, internal
++, external
++)
3312 internal
->p_type
= BYTE_GET (external
->p_type
);
3313 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3314 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3315 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3316 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3317 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3318 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3319 internal
->p_align
= BYTE_GET (external
->p_align
);
3328 get_64bit_program_headers (FILE * file
, Elf_Internal_Phdr
* program_headers
)
3330 Elf64_External_Phdr
* phdrs
;
3331 Elf64_External_Phdr
* external
;
3332 Elf_Internal_Phdr
* internal
;
3335 phdrs
= (Elf64_External_Phdr
*) get_data (NULL
, file
, elf_header
.e_phoff
,
3336 elf_header
.e_phentsize
,
3338 _("program headers"));
3342 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3343 i
< elf_header
.e_phnum
;
3344 i
++, internal
++, external
++)
3346 internal
->p_type
= BYTE_GET (external
->p_type
);
3347 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3348 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3349 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3350 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3351 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3352 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3353 internal
->p_align
= BYTE_GET (external
->p_align
);
3361 /* Returns 1 if the program headers were read into `program_headers'. */
3364 get_program_headers (FILE * file
)
3366 Elf_Internal_Phdr
* phdrs
;
3368 /* Check cache of prior read. */
3369 if (program_headers
!= NULL
)
3372 phdrs
= (Elf_Internal_Phdr
*) cmalloc (elf_header
.e_phnum
,
3373 sizeof (Elf_Internal_Phdr
));
3377 error (_("Out of memory\n"));
3382 ? get_32bit_program_headers (file
, phdrs
)
3383 : get_64bit_program_headers (file
, phdrs
))
3385 program_headers
= phdrs
;
3393 /* Returns 1 if the program headers were loaded. */
3396 process_program_headers (FILE * file
)
3398 Elf_Internal_Phdr
* segment
;
3401 if (elf_header
.e_phnum
== 0)
3404 printf (_("\nThere are no program headers in this file.\n"));
3408 if (do_segments
&& !do_header
)
3410 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3411 printf (_("Entry point "));
3412 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3413 printf (_("\nThere are %d program headers, starting at offset "),
3414 elf_header
.e_phnum
);
3415 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3419 if (! get_program_headers (file
))
3424 if (elf_header
.e_phnum
> 1)
3425 printf (_("\nProgram Headers:\n"));
3427 printf (_("\nProgram Headers:\n"));
3431 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3434 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3438 (_(" Type Offset VirtAddr PhysAddr\n"));
3440 (_(" FileSiz MemSiz Flags Align\n"));
3447 for (i
= 0, segment
= program_headers
;
3448 i
< elf_header
.e_phnum
;
3453 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3457 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3458 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3459 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3460 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3461 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3463 (segment
->p_flags
& PF_R
? 'R' : ' '),
3464 (segment
->p_flags
& PF_W
? 'W' : ' '),
3465 (segment
->p_flags
& PF_X
? 'E' : ' '));
3466 printf ("%#lx", (unsigned long) segment
->p_align
);
3470 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3471 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3474 print_vma (segment
->p_offset
, FULL_HEX
);
3478 print_vma (segment
->p_vaddr
, FULL_HEX
);
3480 print_vma (segment
->p_paddr
, FULL_HEX
);
3483 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3484 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3487 print_vma (segment
->p_filesz
, FULL_HEX
);
3491 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3492 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3495 print_vma (segment
->p_offset
, FULL_HEX
);
3499 (segment
->p_flags
& PF_R
? 'R' : ' '),
3500 (segment
->p_flags
& PF_W
? 'W' : ' '),
3501 (segment
->p_flags
& PF_X
? 'E' : ' '));
3503 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3504 printf ("%#lx", (unsigned long) segment
->p_align
);
3507 print_vma (segment
->p_align
, PREFIX_HEX
);
3512 print_vma (segment
->p_offset
, FULL_HEX
);
3514 print_vma (segment
->p_vaddr
, FULL_HEX
);
3516 print_vma (segment
->p_paddr
, FULL_HEX
);
3518 print_vma (segment
->p_filesz
, FULL_HEX
);
3520 print_vma (segment
->p_memsz
, FULL_HEX
);
3522 (segment
->p_flags
& PF_R
? 'R' : ' '),
3523 (segment
->p_flags
& PF_W
? 'W' : ' '),
3524 (segment
->p_flags
& PF_X
? 'E' : ' '));
3525 print_vma (segment
->p_align
, HEX
);
3529 switch (segment
->p_type
)
3533 error (_("more than one dynamic segment\n"));
3535 /* By default, assume that the .dynamic section is the first
3536 section in the DYNAMIC segment. */
3537 dynamic_addr
= segment
->p_offset
;
3538 dynamic_size
= segment
->p_filesz
;
3540 /* Try to locate the .dynamic section. If there is
3541 a section header table, we can easily locate it. */
3542 if (section_headers
!= NULL
)
3544 Elf_Internal_Shdr
* sec
;
3546 sec
= find_section (".dynamic");
3547 if (sec
== NULL
|| sec
->sh_size
== 0)
3549 error (_("no .dynamic section in the dynamic segment\n"));
3553 if (sec
->sh_type
== SHT_NOBITS
)
3559 dynamic_addr
= sec
->sh_offset
;
3560 dynamic_size
= sec
->sh_size
;
3562 if (dynamic_addr
< segment
->p_offset
3563 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
3564 warn (_("the .dynamic section is not contained"
3565 " within the dynamic segment\n"));
3566 else if (dynamic_addr
> segment
->p_offset
)
3567 warn (_("the .dynamic section is not the first section"
3568 " in the dynamic segment.\n"));
3573 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3575 error (_("Unable to find program interpreter name\n"));
3579 int ret
= snprintf (fmt
, sizeof (fmt
), "%%%ds", PATH_MAX
);
3581 if (ret
>= (int) sizeof (fmt
) || ret
< 0)
3582 error (_("Internal error: failed to create format string to display program interpreter\n"));
3584 program_interpreter
[0] = 0;
3585 if (fscanf (file
, fmt
, program_interpreter
) <= 0)
3586 error (_("Unable to read program interpreter name\n"));
3589 printf (_("\n [Requesting program interpreter: %s]"),
3590 program_interpreter
);
3596 putc ('\n', stdout
);
3599 if (do_segments
&& section_headers
!= NULL
&& string_table
!= NULL
)
3601 printf (_("\n Section to Segment mapping:\n"));
3602 printf (_(" Segment Sections...\n"));
3604 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3607 Elf_Internal_Shdr
* section
;
3609 segment
= program_headers
+ i
;
3610 section
= section_headers
+ 1;
3612 printf (" %2.2d ", i
);
3614 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3616 if (ELF_IS_SECTION_IN_SEGMENT_MEMORY (section
, segment
))
3617 printf ("%s ", SECTION_NAME (section
));
3628 /* Find the file offset corresponding to VMA by using the program headers. */
3631 offset_from_vma (FILE * file
, bfd_vma vma
, bfd_size_type size
)
3633 Elf_Internal_Phdr
* seg
;
3635 if (! get_program_headers (file
))
3637 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3641 for (seg
= program_headers
;
3642 seg
< program_headers
+ elf_header
.e_phnum
;
3645 if (seg
->p_type
!= PT_LOAD
)
3648 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3649 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3650 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3653 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3654 (unsigned long) vma
);
3660 get_32bit_section_headers (FILE * file
, unsigned int num
)
3662 Elf32_External_Shdr
* shdrs
;
3663 Elf_Internal_Shdr
* internal
;
3666 shdrs
= (Elf32_External_Shdr
*) get_data (NULL
, file
, elf_header
.e_shoff
,
3667 elf_header
.e_shentsize
, num
,
3668 _("section headers"));
3672 section_headers
= (Elf_Internal_Shdr
*) cmalloc (num
,
3673 sizeof (Elf_Internal_Shdr
));
3675 if (section_headers
== NULL
)
3677 error (_("Out of memory\n"));
3681 for (i
= 0, internal
= section_headers
;
3685 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3686 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3687 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3688 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3689 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3690 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3691 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3692 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3693 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3694 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3703 get_64bit_section_headers (FILE * file
, unsigned int num
)
3705 Elf64_External_Shdr
* shdrs
;
3706 Elf_Internal_Shdr
* internal
;
3709 shdrs
= (Elf64_External_Shdr
*) get_data (NULL
, file
, elf_header
.e_shoff
,
3710 elf_header
.e_shentsize
, num
,
3711 _("section headers"));
3715 section_headers
= (Elf_Internal_Shdr
*) cmalloc (num
,
3716 sizeof (Elf_Internal_Shdr
));
3718 if (section_headers
== NULL
)
3720 error (_("Out of memory\n"));
3724 for (i
= 0, internal
= section_headers
;
3728 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3729 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3730 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3731 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3732 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3733 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3734 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3735 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3736 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3737 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3745 static Elf_Internal_Sym
*
3746 get_32bit_elf_symbols (FILE * file
, Elf_Internal_Shdr
* section
)
3748 unsigned long number
;
3749 Elf32_External_Sym
* esyms
;
3750 Elf_External_Sym_Shndx
* shndx
;
3751 Elf_Internal_Sym
* isyms
;
3752 Elf_Internal_Sym
* psym
;
3755 esyms
= (Elf32_External_Sym
*) get_data (NULL
, file
, section
->sh_offset
, 1,
3756 section
->sh_size
, _("symbols"));
3761 if (symtab_shndx_hdr
!= NULL
3762 && (symtab_shndx_hdr
->sh_link
3763 == (unsigned long) (section
- section_headers
)))
3765 shndx
= (Elf_External_Sym_Shndx
*) get_data (NULL
, file
,
3766 symtab_shndx_hdr
->sh_offset
,
3767 1, symtab_shndx_hdr
->sh_size
,
3776 number
= section
->sh_size
/ section
->sh_entsize
;
3777 isyms
= (Elf_Internal_Sym
*) cmalloc (number
, sizeof (Elf_Internal_Sym
));
3781 error (_("Out of memory\n"));
3788 for (j
= 0, psym
= isyms
;
3792 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3793 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3794 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3795 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3796 if (psym
->st_shndx
== (SHN_XINDEX
& 0xffff) && shndx
!= NULL
)
3798 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3799 else if (psym
->st_shndx
>= (SHN_LORESERVE
& 0xffff))
3800 psym
->st_shndx
+= SHN_LORESERVE
- (SHN_LORESERVE
& 0xffff);
3801 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3802 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3812 static Elf_Internal_Sym
*
3813 get_64bit_elf_symbols (FILE * file
, Elf_Internal_Shdr
* section
)
3815 unsigned long number
;
3816 Elf64_External_Sym
* esyms
;
3817 Elf_External_Sym_Shndx
* shndx
;
3818 Elf_Internal_Sym
* isyms
;
3819 Elf_Internal_Sym
* psym
;
3822 esyms
= (Elf64_External_Sym
*) get_data (NULL
, file
, section
->sh_offset
, 1,
3823 section
->sh_size
, _("symbols"));
3828 if (symtab_shndx_hdr
!= NULL
3829 && (symtab_shndx_hdr
->sh_link
3830 == (unsigned long) (section
- section_headers
)))
3832 shndx
= (Elf_External_Sym_Shndx
*) get_data (NULL
, file
,
3833 symtab_shndx_hdr
->sh_offset
,
3834 1, symtab_shndx_hdr
->sh_size
,
3843 number
= section
->sh_size
/ section
->sh_entsize
;
3844 isyms
= (Elf_Internal_Sym
*) cmalloc (number
, sizeof (Elf_Internal_Sym
));
3848 error (_("Out of memory\n"));
3855 for (j
= 0, psym
= isyms
;
3859 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3860 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3861 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3862 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3863 if (psym
->st_shndx
== (SHN_XINDEX
& 0xffff) && shndx
!= NULL
)
3865 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3866 else if (psym
->st_shndx
>= (SHN_LORESERVE
& 0xffff))
3867 psym
->st_shndx
+= SHN_LORESERVE
- (SHN_LORESERVE
& 0xffff);
3868 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3869 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3880 get_elf_section_flags (bfd_vma sh_flags
)
3882 static char buff
[1024];
3884 int field_size
= is_32bit_elf
? 8 : 16;
3885 int index
, size
= sizeof (buff
) - (field_size
+ 4 + 1);
3886 bfd_vma os_flags
= 0;
3887 bfd_vma proc_flags
= 0;
3888 bfd_vma unknown_flags
= 0;
3896 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
3897 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
3898 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
3899 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
3900 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
3901 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
3902 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
3903 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
3904 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
3905 /* 9 */ { STRING_COMMA_LEN ("TLS") },
3906 /* IA-64 specific. */
3907 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
3908 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
3909 /* IA-64 OpenVMS specific. */
3910 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
3911 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
3912 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
3913 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
3914 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
3915 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
3916 /* SPARC specific. */
3917 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
3918 /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
3921 if (do_section_details
)
3923 sprintf (buff
, "[%*.*lx]: ",
3924 field_size
, field_size
, (unsigned long) sh_flags
);
3925 p
+= field_size
+ 4;
3932 flag
= sh_flags
& - sh_flags
;
3935 if (do_section_details
)
3939 case SHF_WRITE
: index
= 0; break;
3940 case SHF_ALLOC
: index
= 1; break;
3941 case SHF_EXECINSTR
: index
= 2; break;
3942 case SHF_MERGE
: index
= 3; break;
3943 case SHF_STRINGS
: index
= 4; break;
3944 case SHF_INFO_LINK
: index
= 5; break;
3945 case SHF_LINK_ORDER
: index
= 6; break;
3946 case SHF_OS_NONCONFORMING
: index
= 7; break;
3947 case SHF_GROUP
: index
= 8; break;
3948 case SHF_TLS
: index
= 9; break;
3952 switch (elf_header
.e_machine
)
3955 if (flag
== SHF_IA_64_SHORT
)
3957 else if (flag
== SHF_IA_64_NORECOV
)
3960 else if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_OPENVMS
)
3963 case SHF_IA_64_VMS_GLOBAL
: index
= 12; break;
3964 case SHF_IA_64_VMS_OVERLAID
: index
= 13; break;
3965 case SHF_IA_64_VMS_SHARED
: index
= 14; break;
3966 case SHF_IA_64_VMS_VECTOR
: index
= 15; break;
3967 case SHF_IA_64_VMS_ALLOC_64BIT
: index
= 16; break;
3968 case SHF_IA_64_VMS_PROTECTED
: index
= 17; break;
3974 case EM_OLD_SPARCV9
:
3975 case EM_SPARC32PLUS
:
3978 if (flag
== SHF_EXCLUDE
)
3980 else if (flag
== SHF_ORDERED
)
3990 if (p
!= buff
+ field_size
+ 4)
3992 if (size
< (10 + 2))
3999 size
-= flags
[index
].len
;
4000 p
= stpcpy (p
, flags
[index
].str
);
4002 else if (flag
& SHF_MASKOS
)
4004 else if (flag
& SHF_MASKPROC
)
4007 unknown_flags
|= flag
;
4013 case SHF_WRITE
: *p
= 'W'; break;
4014 case SHF_ALLOC
: *p
= 'A'; break;
4015 case SHF_EXECINSTR
: *p
= 'X'; break;
4016 case SHF_MERGE
: *p
= 'M'; break;
4017 case SHF_STRINGS
: *p
= 'S'; break;
4018 case SHF_INFO_LINK
: *p
= 'I'; break;
4019 case SHF_LINK_ORDER
: *p
= 'L'; break;
4020 case SHF_OS_NONCONFORMING
: *p
= 'O'; break;
4021 case SHF_GROUP
: *p
= 'G'; break;
4022 case SHF_TLS
: *p
= 'T'; break;
4025 if ((elf_header
.e_machine
== EM_X86_64
4026 || elf_header
.e_machine
== EM_L1OM
)
4027 && flag
== SHF_X86_64_LARGE
)
4029 else if (flag
& SHF_MASKOS
)
4032 sh_flags
&= ~ SHF_MASKOS
;
4034 else if (flag
& SHF_MASKPROC
)
4037 sh_flags
&= ~ SHF_MASKPROC
;
4047 if (do_section_details
)
4051 size
-= 5 + field_size
;
4052 if (p
!= buff
+ field_size
+ 4)
4060 sprintf (p
, "OS (%*.*lx)", field_size
, field_size
,
4061 (unsigned long) os_flags
);
4062 p
+= 5 + field_size
;
4066 size
-= 7 + field_size
;
4067 if (p
!= buff
+ field_size
+ 4)
4075 sprintf (p
, "PROC (%*.*lx)", field_size
, field_size
,
4076 (unsigned long) proc_flags
);
4077 p
+= 7 + field_size
;
4081 size
-= 10 + field_size
;
4082 if (p
!= buff
+ field_size
+ 4)
4090 sprintf (p
, "UNKNOWN (%*.*lx)", field_size
, field_size
,
4091 (unsigned long) unknown_flags
);
4092 p
+= 10 + field_size
;
4101 process_section_headers (FILE * file
)
4103 Elf_Internal_Shdr
* section
;
4106 section_headers
= NULL
;
4108 if (elf_header
.e_shnum
== 0)
4111 printf (_("\nThere are no sections in this file.\n"));
4116 if (do_sections
&& !do_header
)
4117 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
4118 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
4122 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
4125 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
4128 /* Read in the string table, so that we have names to display. */
4129 if (elf_header
.e_shstrndx
!= SHN_UNDEF
4130 && elf_header
.e_shstrndx
< elf_header
.e_shnum
)
4132 section
= section_headers
+ elf_header
.e_shstrndx
;
4134 if (section
->sh_size
!= 0)
4136 string_table
= (char *) get_data (NULL
, file
, section
->sh_offset
,
4137 1, section
->sh_size
,
4140 string_table_length
= string_table
!= NULL
? section
->sh_size
: 0;
4144 /* Scan the sections for the dynamic symbol table
4145 and dynamic string table and debug sections. */
4146 dynamic_symbols
= NULL
;
4147 dynamic_strings
= NULL
;
4148 dynamic_syminfo
= NULL
;
4149 symtab_shndx_hdr
= NULL
;
4151 eh_addr_size
= is_32bit_elf
? 4 : 8;
4152 switch (elf_header
.e_machine
)
4155 case EM_MIPS_RS3_LE
:
4156 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
4157 FDE addresses. However, the ABI also has a semi-official ILP32
4158 variant for which the normal FDE address size rules apply.
4160 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
4161 section, where XX is the size of longs in bits. Unfortunately,
4162 earlier compilers provided no way of distinguishing ILP32 objects
4163 from LP64 objects, so if there's any doubt, we should assume that
4164 the official LP64 form is being used. */
4165 if ((elf_header
.e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
4166 && find_section (".gcc_compiled_long32") == NULL
)
4172 switch (elf_header
.e_flags
& EF_H8_MACH
)
4174 case E_H8_MACH_H8300
:
4175 case E_H8_MACH_H8300HN
:
4176 case E_H8_MACH_H8300SN
:
4177 case E_H8_MACH_H8300SXN
:
4180 case E_H8_MACH_H8300H
:
4181 case E_H8_MACH_H8300S
:
4182 case E_H8_MACH_H8300SX
:
4190 switch (elf_header
.e_flags
& EF_M32C_CPU_MASK
)
4192 case EF_M32C_CPU_M16C
:
4199 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
4202 size_t expected_entsize \
4203 = is_32bit_elf ? size32 : size64; \
4204 if (section->sh_entsize != expected_entsize) \
4205 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
4206 i, (unsigned long int) section->sh_entsize, \
4207 (unsigned long int) expected_entsize); \
4208 section->sh_entsize = expected_entsize; \
4211 #define CHECK_ENTSIZE(section, i, type) \
4212 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
4213 sizeof (Elf64_External_##type))
4215 for (i
= 0, section
= section_headers
;
4216 i
< elf_header
.e_shnum
;
4219 char * name
= SECTION_NAME (section
);
4221 if (section
->sh_type
== SHT_DYNSYM
)
4223 if (dynamic_symbols
!= NULL
)
4225 error (_("File contains multiple dynamic symbol tables\n"));
4229 CHECK_ENTSIZE (section
, i
, Sym
);
4230 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
4231 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
4233 else if (section
->sh_type
== SHT_STRTAB
4234 && streq (name
, ".dynstr"))
4236 if (dynamic_strings
!= NULL
)
4238 error (_("File contains multiple dynamic string tables\n"));
4242 dynamic_strings
= (char *) get_data (NULL
, file
, section
->sh_offset
,
4243 1, section
->sh_size
,
4244 _("dynamic strings"));
4245 dynamic_strings_length
= section
->sh_size
;
4247 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
4249 if (symtab_shndx_hdr
!= NULL
)
4251 error (_("File contains multiple symtab shndx tables\n"));
4254 symtab_shndx_hdr
= section
;
4256 else if (section
->sh_type
== SHT_SYMTAB
)
4257 CHECK_ENTSIZE (section
, i
, Sym
);
4258 else if (section
->sh_type
== SHT_GROUP
)
4259 CHECK_ENTSIZE_VALUES (section
, i
, GRP_ENTRY_SIZE
, GRP_ENTRY_SIZE
);
4260 else if (section
->sh_type
== SHT_REL
)
4261 CHECK_ENTSIZE (section
, i
, Rel
);
4262 else if (section
->sh_type
== SHT_RELA
)
4263 CHECK_ENTSIZE (section
, i
, Rela
);
4264 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
4265 || do_debug_lines
|| do_debug_pubnames
4266 || do_debug_aranges
|| do_debug_frames
|| do_debug_macinfo
4267 || do_debug_str
|| do_debug_loc
|| do_debug_ranges
)
4268 && (const_strneq (name
, ".debug_")
4269 || const_strneq (name
, ".zdebug_")))
4272 name
+= sizeof (".zdebug_") - 1;
4274 name
+= sizeof (".debug_") - 1;
4277 || (do_debug_info
&& streq (name
, "info"))
4278 || (do_debug_info
&& streq (name
, "types"))
4279 || (do_debug_abbrevs
&& streq (name
, "abbrev"))
4280 || (do_debug_lines
&& streq (name
, "line"))
4281 || (do_debug_pubnames
&& streq (name
, "pubnames"))
4282 || (do_debug_aranges
&& streq (name
, "aranges"))
4283 || (do_debug_ranges
&& streq (name
, "ranges"))
4284 || (do_debug_frames
&& streq (name
, "frame"))
4285 || (do_debug_macinfo
&& streq (name
, "macinfo"))
4286 || (do_debug_str
&& streq (name
, "str"))
4287 || (do_debug_loc
&& streq (name
, "loc"))
4289 request_dump_bynumber (i
, DEBUG_DUMP
);
4291 /* Linkonce section to be combined with .debug_info at link time. */
4292 else if ((do_debugging
|| do_debug_info
)
4293 && const_strneq (name
, ".gnu.linkonce.wi."))
4294 request_dump_bynumber (i
, DEBUG_DUMP
);
4295 else if (do_debug_frames
&& streq (name
, ".eh_frame"))
4296 request_dump_bynumber (i
, DEBUG_DUMP
);
4302 if (elf_header
.e_shnum
> 1)
4303 printf (_("\nSection Headers:\n"));
4305 printf (_("\nSection Header:\n"));
4309 if (do_section_details
)
4311 printf (_(" [Nr] Name\n"));
4312 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
4316 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4320 if (do_section_details
)
4322 printf (_(" [Nr] Name\n"));
4323 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
4327 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4331 if (do_section_details
)
4333 printf (_(" [Nr] Name\n"));
4334 printf (_(" Type Address Offset Link\n"));
4335 printf (_(" Size EntSize Info Align\n"));
4339 printf (_(" [Nr] Name Type Address Offset\n"));
4340 printf (_(" Size EntSize Flags Link Info Align\n"));
4344 if (do_section_details
)
4345 printf (_(" Flags\n"));
4347 for (i
= 0, section
= section_headers
;
4348 i
< elf_header
.e_shnum
;
4351 if (do_section_details
)
4353 printf (" [%2u] %s\n",
4355 SECTION_NAME (section
));
4356 if (is_32bit_elf
|| do_wide
)
4357 printf (" %-15.15s ",
4358 get_section_type_name (section
->sh_type
));
4361 printf ((do_wide
? " [%2u] %-17s %-15s "
4362 : " [%2u] %-17.17s %-15.15s "),
4364 SECTION_NAME (section
),
4365 get_section_type_name (section
->sh_type
));
4369 const char * link_too_big
= NULL
;
4371 print_vma (section
->sh_addr
, LONG_HEX
);
4373 printf ( " %6.6lx %6.6lx %2.2lx",
4374 (unsigned long) section
->sh_offset
,
4375 (unsigned long) section
->sh_size
,
4376 (unsigned long) section
->sh_entsize
);
4378 if (do_section_details
)
4379 fputs (" ", stdout
);
4381 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4383 if (section
->sh_link
>= elf_header
.e_shnum
)
4386 /* The sh_link value is out of range. Normally this indicates
4387 an error but it can have special values in SPARC binaries. */
4388 switch (elf_header
.e_machine
)
4390 case EM_OLD_SPARCV9
:
4391 case EM_SPARC32PLUS
:
4394 if (section
->sh_link
== (SHN_BEFORE
& 0xffff))
4395 link_too_big
= "BEFORE";
4396 else if (section
->sh_link
== (SHN_AFTER
& 0xffff))
4397 link_too_big
= "AFTER";
4404 if (do_section_details
)
4406 if (link_too_big
!= NULL
&& * link_too_big
)
4407 printf ("<%s> ", link_too_big
);
4409 printf ("%2u ", section
->sh_link
);
4410 printf ("%3u %2lu\n", section
->sh_info
,
4411 (unsigned long) section
->sh_addralign
);
4414 printf ("%2u %3u %2lu\n",
4417 (unsigned long) section
->sh_addralign
);
4419 if (link_too_big
&& ! * link_too_big
)
4420 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
4421 i
, section
->sh_link
);
4425 print_vma (section
->sh_addr
, LONG_HEX
);
4427 if ((long) section
->sh_offset
== section
->sh_offset
)
4428 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
4432 print_vma (section
->sh_offset
, LONG_HEX
);
4435 if ((unsigned long) section
->sh_size
== section
->sh_size
)
4436 printf (" %6.6lx", (unsigned long) section
->sh_size
);
4440 print_vma (section
->sh_size
, LONG_HEX
);
4443 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
4444 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
4448 print_vma (section
->sh_entsize
, LONG_HEX
);
4451 if (do_section_details
)
4452 fputs (" ", stdout
);
4454 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4456 printf ("%2u %3u ", section
->sh_link
, section
->sh_info
);
4458 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
4459 printf ("%2lu\n", (unsigned long) section
->sh_addralign
);
4462 print_vma (section
->sh_addralign
, DEC
);
4466 else if (do_section_details
)
4468 printf (" %-15.15s ",
4469 get_section_type_name (section
->sh_type
));
4470 print_vma (section
->sh_addr
, LONG_HEX
);
4471 if ((long) section
->sh_offset
== section
->sh_offset
)
4472 printf (" %16.16lx", (unsigned long) section
->sh_offset
);
4476 print_vma (section
->sh_offset
, LONG_HEX
);
4478 printf (" %u\n ", section
->sh_link
);
4479 print_vma (section
->sh_size
, LONG_HEX
);
4481 print_vma (section
->sh_entsize
, LONG_HEX
);
4483 printf (" %-16u %lu\n",
4485 (unsigned long) section
->sh_addralign
);
4490 print_vma (section
->sh_addr
, LONG_HEX
);
4491 if ((long) section
->sh_offset
== section
->sh_offset
)
4492 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
4496 print_vma (section
->sh_offset
, LONG_HEX
);
4499 print_vma (section
->sh_size
, LONG_HEX
);
4501 print_vma (section
->sh_entsize
, LONG_HEX
);
4503 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4505 printf (" %2u %3u %lu\n",
4508 (unsigned long) section
->sh_addralign
);
4511 if (do_section_details
)
4512 printf (" %s\n", get_elf_section_flags (section
->sh_flags
));
4515 if (!do_section_details
)
4516 printf (_("Key to Flags:\n\
4517 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4518 I (info), L (link order), G (group), x (unknown)\n\
4519 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4525 get_group_flags (unsigned int flags
)
4527 static char buff
[32];
4534 snprintf (buff
, sizeof (buff
), _("[<unknown>: 0x%x]"), flags
);
4541 process_section_groups (FILE * file
)
4543 Elf_Internal_Shdr
* section
;
4545 struct group
* group
;
4546 Elf_Internal_Shdr
* symtab_sec
;
4547 Elf_Internal_Shdr
* strtab_sec
;
4548 Elf_Internal_Sym
* symtab
;
4552 /* Don't process section groups unless needed. */
4553 if (!do_unwind
&& !do_section_groups
)
4556 if (elf_header
.e_shnum
== 0)
4558 if (do_section_groups
)
4559 printf (_("\nThere are no sections in this file.\n"));
4564 if (section_headers
== NULL
)
4566 error (_("Section headers are not available!\n"));
4570 section_headers_groups
= (struct group
**) calloc (elf_header
.e_shnum
,
4571 sizeof (struct group
*));
4573 if (section_headers_groups
== NULL
)
4575 error (_("Out of memory\n"));
4579 /* Scan the sections for the group section. */
4581 for (i
= 0, section
= section_headers
;
4582 i
< elf_header
.e_shnum
;
4584 if (section
->sh_type
== SHT_GROUP
)
4587 if (group_count
== 0)
4589 if (do_section_groups
)
4590 printf (_("\nThere are no section groups in this file.\n"));
4595 section_groups
= (struct group
*) calloc (group_count
, sizeof (struct group
));
4597 if (section_groups
== NULL
)
4599 error (_("Out of memory\n"));
4608 for (i
= 0, section
= section_headers
, group
= section_groups
;
4609 i
< elf_header
.e_shnum
;
4612 if (section
->sh_type
== SHT_GROUP
)
4614 char * name
= SECTION_NAME (section
);
4616 unsigned char * start
;
4617 unsigned char * indices
;
4618 unsigned int entry
, j
, size
;
4619 Elf_Internal_Shdr
* sec
;
4620 Elf_Internal_Sym
* sym
;
4622 /* Get the symbol table. */
4623 if (section
->sh_link
>= elf_header
.e_shnum
4624 || ((sec
= section_headers
+ section
->sh_link
)->sh_type
4627 error (_("Bad sh_link in group section `%s'\n"), name
);
4631 if (symtab_sec
!= sec
)
4636 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
);
4639 sym
= symtab
+ section
->sh_info
;
4641 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4643 if (sym
->st_shndx
== 0
4644 || sym
->st_shndx
>= elf_header
.e_shnum
)
4646 error (_("Bad sh_info in group section `%s'\n"), name
);
4650 group_name
= SECTION_NAME (section_headers
+ sym
->st_shndx
);
4659 /* Get the string table. */
4660 if (symtab_sec
->sh_link
>= elf_header
.e_shnum
)
4669 != (sec
= section_headers
+ symtab_sec
->sh_link
))
4674 strtab
= (char *) get_data (NULL
, file
, strtab_sec
->sh_offset
,
4675 1, strtab_sec
->sh_size
,
4677 strtab_size
= strtab
!= NULL
? strtab_sec
->sh_size
: 0;
4679 group_name
= sym
->st_name
< strtab_size
4680 ? strtab
+ sym
->st_name
: "<corrupt>";
4683 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
,
4684 1, section
->sh_size
,
4688 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
4689 entry
= byte_get (indices
, 4);
4692 if (do_section_groups
)
4694 printf ("\n%s group section [%5u] `%s' [%s] contains %u sections:\n",
4695 get_group_flags (entry
), i
, name
, group_name
, size
);
4697 printf (_(" [Index] Name\n"));
4700 group
->group_index
= i
;
4702 for (j
= 0; j
< size
; j
++)
4704 struct group_list
* g
;
4706 entry
= byte_get (indices
, 4);
4709 if (entry
>= elf_header
.e_shnum
)
4711 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
4712 entry
, i
, elf_header
.e_shnum
- 1);
4716 if (section_headers_groups
[entry
] != NULL
)
4720 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
4722 section_headers_groups
[entry
]->group_index
);
4727 /* Intel C/C++ compiler may put section 0 in a
4728 section group. We just warn it the first time
4729 and ignore it afterwards. */
4730 static int warned
= 0;
4733 error (_("section 0 in group section [%5u]\n"),
4734 section_headers_groups
[entry
]->group_index
);
4740 section_headers_groups
[entry
] = group
;
4742 if (do_section_groups
)
4744 sec
= section_headers
+ entry
;
4745 printf (" [%5u] %s\n", entry
, SECTION_NAME (sec
));
4748 g
= (struct group_list
*) xmalloc (sizeof (struct group_list
));
4749 g
->section_index
= entry
;
4750 g
->next
= group
->root
;
4774 } dynamic_relocations
[] =
4776 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
4777 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
4778 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
4781 /* Process the reloc section. */
4784 process_relocs (FILE * file
)
4786 unsigned long rel_size
;
4787 unsigned long rel_offset
;
4793 if (do_using_dynamic
)
4797 int has_dynamic_reloc
;
4800 has_dynamic_reloc
= 0;
4802 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
4804 is_rela
= dynamic_relocations
[i
].rela
;
4805 name
= dynamic_relocations
[i
].name
;
4806 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
4807 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
4809 has_dynamic_reloc
|= rel_size
;
4811 if (is_rela
== UNKNOWN
)
4813 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
4814 switch (dynamic_info
[DT_PLTREL
])
4828 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4829 name
, rel_offset
, rel_size
);
4831 dump_relocations (file
,
4832 offset_from_vma (file
, rel_offset
, rel_size
),
4834 dynamic_symbols
, num_dynamic_syms
,
4835 dynamic_strings
, dynamic_strings_length
, is_rela
);
4839 if (! has_dynamic_reloc
)
4840 printf (_("\nThere are no dynamic relocations in this file.\n"));
4844 Elf_Internal_Shdr
* section
;
4848 for (i
= 0, section
= section_headers
;
4849 i
< elf_header
.e_shnum
;
4852 if ( section
->sh_type
!= SHT_RELA
4853 && section
->sh_type
!= SHT_REL
)
4856 rel_offset
= section
->sh_offset
;
4857 rel_size
= section
->sh_size
;
4861 Elf_Internal_Shdr
* strsec
;
4864 printf (_("\nRelocation section "));
4866 if (string_table
== NULL
)
4867 printf ("%d", section
->sh_name
);
4869 printf (_("'%s'"), SECTION_NAME (section
));
4871 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4872 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4874 is_rela
= section
->sh_type
== SHT_RELA
;
4876 if (section
->sh_link
!= 0
4877 && section
->sh_link
< elf_header
.e_shnum
)
4879 Elf_Internal_Shdr
* symsec
;
4880 Elf_Internal_Sym
* symtab
;
4881 unsigned long nsyms
;
4882 unsigned long strtablen
= 0;
4883 char * strtab
= NULL
;
4885 symsec
= section_headers
+ section
->sh_link
;
4886 if (symsec
->sh_type
!= SHT_SYMTAB
4887 && symsec
->sh_type
!= SHT_DYNSYM
)
4890 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4891 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4896 if (symsec
->sh_link
!= 0
4897 && symsec
->sh_link
< elf_header
.e_shnum
)
4899 strsec
= section_headers
+ symsec
->sh_link
;
4901 strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
4904 strtablen
= strtab
== NULL
? 0 : strsec
->sh_size
;
4907 dump_relocations (file
, rel_offset
, rel_size
,
4908 symtab
, nsyms
, strtab
, strtablen
, is_rela
);
4914 dump_relocations (file
, rel_offset
, rel_size
,
4915 NULL
, 0, NULL
, 0, is_rela
);
4922 printf (_("\nThere are no relocations in this file.\n"));
4928 /* Process the unwind section. */
4930 #include "unwind-ia64.h"
4932 /* An absolute address consists of a section and an offset. If the
4933 section is NULL, the offset itself is the address, otherwise, the
4934 address equals to LOAD_ADDRESS(section) + offset. */
4938 unsigned short section
;
4942 #define ABSADDR(a) \
4944 ? section_headers [(a).section].sh_addr + (a).offset \
4947 struct ia64_unw_table_entry
4949 struct absaddr start
;
4951 struct absaddr info
;
4954 struct ia64_unw_aux_info
4957 struct ia64_unw_table_entry
*table
; /* Unwind table. */
4958 unsigned long table_len
; /* Length of unwind table. */
4959 unsigned char * info
; /* Unwind info. */
4960 unsigned long info_size
; /* Size of unwind info. */
4961 bfd_vma info_addr
; /* starting address of unwind info. */
4962 bfd_vma seg_base
; /* Starting address of segment. */
4963 Elf_Internal_Sym
* symtab
; /* The symbol table. */
4964 unsigned long nsyms
; /* Number of symbols. */
4965 char * strtab
; /* The string table. */
4966 unsigned long strtab_size
; /* Size of string table. */
4970 find_symbol_for_address (Elf_Internal_Sym
* symtab
,
4971 unsigned long nsyms
,
4972 const char * strtab
,
4973 unsigned long strtab_size
,
4974 struct absaddr addr
,
4975 const char ** symname
,
4978 bfd_vma dist
= 0x100000;
4979 Elf_Internal_Sym
* sym
;
4980 Elf_Internal_Sym
* best
= NULL
;
4983 for (i
= 0, sym
= symtab
; i
< nsyms
; ++i
, ++sym
)
4985 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
4986 && sym
->st_name
!= 0
4987 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
4988 && addr
.offset
>= sym
->st_value
4989 && addr
.offset
- sym
->st_value
< dist
)
4992 dist
= addr
.offset
- sym
->st_value
;
4999 *symname
= (best
->st_name
>= strtab_size
5000 ? "<corrupt>" : strtab
+ best
->st_name
);
5005 *offset
= addr
.offset
;
5009 dump_ia64_unwind (struct ia64_unw_aux_info
* aux
)
5011 struct ia64_unw_table_entry
* tp
;
5014 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
5018 const unsigned char * dp
;
5019 const unsigned char * head
;
5020 const char * procname
;
5022 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
5023 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
5025 fputs ("\n<", stdout
);
5029 fputs (procname
, stdout
);
5032 printf ("+%lx", (unsigned long) offset
);
5035 fputs (">: [", stdout
);
5036 print_vma (tp
->start
.offset
, PREFIX_HEX
);
5037 fputc ('-', stdout
);
5038 print_vma (tp
->end
.offset
, PREFIX_HEX
);
5039 printf ("], info at +0x%lx\n",
5040 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
5042 head
= aux
->info
+ (ABSADDR (tp
->info
) - aux
->info_addr
);
5043 stamp
= byte_get ((unsigned char *) head
, sizeof (stamp
));
5045 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
5046 (unsigned) UNW_VER (stamp
),
5047 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
5048 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
5049 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
5050 (unsigned long) (eh_addr_size
* UNW_LENGTH (stamp
)));
5052 if (UNW_VER (stamp
) != 1)
5054 printf ("\tUnknown version.\n");
5059 for (dp
= head
+ 8; dp
< head
+ 8 + eh_addr_size
* UNW_LENGTH (stamp
);)
5060 dp
= unw_decode (dp
, in_body
, & in_body
);
5065 slurp_ia64_unwind_table (FILE * file
,
5066 struct ia64_unw_aux_info
* aux
,
5067 Elf_Internal_Shdr
* sec
)
5069 unsigned long size
, nrelas
, i
;
5070 Elf_Internal_Phdr
* seg
;
5071 struct ia64_unw_table_entry
* tep
;
5072 Elf_Internal_Shdr
* relsec
;
5073 Elf_Internal_Rela
* rela
;
5074 Elf_Internal_Rela
* rp
;
5075 unsigned char * table
;
5077 Elf_Internal_Sym
* sym
;
5078 const char * relname
;
5080 /* First, find the starting address of the segment that includes
5083 if (elf_header
.e_phnum
)
5085 if (! get_program_headers (file
))
5088 for (seg
= program_headers
;
5089 seg
< program_headers
+ elf_header
.e_phnum
;
5092 if (seg
->p_type
!= PT_LOAD
)
5095 if (sec
->sh_addr
>= seg
->p_vaddr
5096 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5098 aux
->seg_base
= seg
->p_vaddr
;
5104 /* Second, build the unwind table from the contents of the unwind section: */
5105 size
= sec
->sh_size
;
5106 table
= (unsigned char *) get_data (NULL
, file
, sec
->sh_offset
, 1, size
,
5111 aux
->table
= (struct ia64_unw_table_entry
*)
5112 xcmalloc (size
/ (3 * eh_addr_size
), sizeof (aux
->table
[0]));
5114 for (tp
= table
; tp
< table
+ size
; ++tep
)
5116 tep
->start
.section
= SHN_UNDEF
;
5117 tep
->end
.section
= SHN_UNDEF
;
5118 tep
->info
.section
= SHN_UNDEF
;
5119 tep
->start
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
5120 tep
->end
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
5121 tep
->info
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
5122 tep
->start
.offset
+= aux
->seg_base
;
5123 tep
->end
.offset
+= aux
->seg_base
;
5124 tep
->info
.offset
+= aux
->seg_base
;
5128 /* Third, apply any relocations to the unwind table: */
5129 for (relsec
= section_headers
;
5130 relsec
< section_headers
+ elf_header
.e_shnum
;
5133 if (relsec
->sh_type
!= SHT_RELA
5134 || relsec
->sh_info
>= elf_header
.e_shnum
5135 || section_headers
+ relsec
->sh_info
!= sec
)
5138 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5142 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5144 relname
= elf_ia64_reloc_type (get_reloc_type (rp
->r_info
));
5145 sym
= aux
->symtab
+ get_reloc_symindex (rp
->r_info
);
5147 if (! const_strneq (relname
, "R_IA64_SEGREL"))
5149 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5153 i
= rp
->r_offset
/ (3 * eh_addr_size
);
5155 switch (rp
->r_offset
/eh_addr_size
% 3)
5158 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5159 aux
->table
[i
].start
.offset
+= rp
->r_addend
+ sym
->st_value
;
5162 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5163 aux
->table
[i
].end
.offset
+= rp
->r_addend
+ sym
->st_value
;
5166 aux
->table
[i
].info
.section
= sym
->st_shndx
;
5167 aux
->table
[i
].info
.offset
+= rp
->r_addend
+ sym
->st_value
;
5177 aux
->table_len
= size
/ (3 * eh_addr_size
);
5182 ia64_process_unwind (FILE * file
)
5184 Elf_Internal_Shdr
* sec
;
5185 Elf_Internal_Shdr
* unwsec
= NULL
;
5186 Elf_Internal_Shdr
* strsec
;
5187 unsigned long i
, unwcount
= 0, unwstart
= 0;
5188 struct ia64_unw_aux_info aux
;
5190 memset (& aux
, 0, sizeof (aux
));
5192 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5194 if (sec
->sh_type
== SHT_SYMTAB
5195 && sec
->sh_link
< elf_header
.e_shnum
)
5197 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5198 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5200 strsec
= section_headers
+ sec
->sh_link
;
5201 aux
.strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
5204 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5206 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
5211 printf (_("\nThere are no unwind sections in this file.\n"));
5213 while (unwcount
-- > 0)
5218 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
5219 i
< elf_header
.e_shnum
; ++i
, ++sec
)
5220 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
5227 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
5229 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
5231 /* We need to find which section group it is in. */
5232 struct group_list
* g
= section_headers_groups
[i
]->root
;
5234 for (; g
!= NULL
; g
= g
->next
)
5236 sec
= section_headers
+ g
->section_index
;
5238 if (streq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
))
5243 i
= elf_header
.e_shnum
;
5245 else if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
, len
))
5247 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
5248 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
5249 suffix
= SECTION_NAME (unwsec
) + len
;
5250 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
5252 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info_once
, len2
)
5253 && streq (SECTION_NAME (sec
) + len2
, suffix
))
5258 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
5259 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
5260 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
5261 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
5263 if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
, len
))
5264 suffix
= SECTION_NAME (unwsec
) + len
;
5265 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
5267 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
, len2
)
5268 && streq (SECTION_NAME (sec
) + len2
, suffix
))
5272 if (i
== elf_header
.e_shnum
)
5274 printf (_("\nCould not find unwind info section for "));
5276 if (string_table
== NULL
)
5277 printf ("%d", unwsec
->sh_name
);
5279 printf (_("'%s'"), SECTION_NAME (unwsec
));
5283 aux
.info_size
= sec
->sh_size
;
5284 aux
.info_addr
= sec
->sh_addr
;
5285 aux
.info
= (unsigned char *) get_data (NULL
, file
, sec
->sh_offset
, 1,
5289 printf (_("\nUnwind section "));
5291 if (string_table
== NULL
)
5292 printf ("%d", unwsec
->sh_name
);
5294 printf (_("'%s'"), SECTION_NAME (unwsec
));
5296 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5297 (unsigned long) unwsec
->sh_offset
,
5298 (unsigned long) (unwsec
->sh_size
/ (3 * eh_addr_size
)));
5300 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
5302 if (aux
.table_len
> 0)
5303 dump_ia64_unwind (& aux
);
5306 free ((char *) aux
.table
);
5308 free ((char *) aux
.info
);
5317 free ((char *) aux
.strtab
);
5322 struct hppa_unw_table_entry
5324 struct absaddr start
;
5326 unsigned int Cannot_unwind
:1; /* 0 */
5327 unsigned int Millicode
:1; /* 1 */
5328 unsigned int Millicode_save_sr0
:1; /* 2 */
5329 unsigned int Region_description
:2; /* 3..4 */
5330 unsigned int reserved1
:1; /* 5 */
5331 unsigned int Entry_SR
:1; /* 6 */
5332 unsigned int Entry_FR
:4; /* number saved */ /* 7..10 */
5333 unsigned int Entry_GR
:5; /* number saved */ /* 11..15 */
5334 unsigned int Args_stored
:1; /* 16 */
5335 unsigned int Variable_Frame
:1; /* 17 */
5336 unsigned int Separate_Package_Body
:1; /* 18 */
5337 unsigned int Frame_Extension_Millicode
:1; /* 19 */
5338 unsigned int Stack_Overflow_Check
:1; /* 20 */
5339 unsigned int Two_Instruction_SP_Increment
:1; /* 21 */
5340 unsigned int Ada_Region
:1; /* 22 */
5341 unsigned int cxx_info
:1; /* 23 */
5342 unsigned int cxx_try_catch
:1; /* 24 */
5343 unsigned int sched_entry_seq
:1; /* 25 */
5344 unsigned int reserved2
:1; /* 26 */
5345 unsigned int Save_SP
:1; /* 27 */
5346 unsigned int Save_RP
:1; /* 28 */
5347 unsigned int Save_MRP_in_frame
:1; /* 29 */
5348 unsigned int extn_ptr_defined
:1; /* 30 */
5349 unsigned int Cleanup_defined
:1; /* 31 */
5351 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
5352 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
5353 unsigned int Large_frame
:1; /* 2 */
5354 unsigned int Pseudo_SP_Set
:1; /* 3 */
5355 unsigned int reserved4
:1; /* 4 */
5356 unsigned int Total_frame_size
:27; /* 5..31 */
5359 struct hppa_unw_aux_info
5361 struct hppa_unw_table_entry
*table
; /* Unwind table. */
5362 unsigned long table_len
; /* Length of unwind table. */
5363 bfd_vma seg_base
; /* Starting address of segment. */
5364 Elf_Internal_Sym
* symtab
; /* The symbol table. */
5365 unsigned long nsyms
; /* Number of symbols. */
5366 char * strtab
; /* The string table. */
5367 unsigned long strtab_size
; /* Size of string table. */
5371 dump_hppa_unwind (struct hppa_unw_aux_info
* aux
)
5373 struct hppa_unw_table_entry
* tp
;
5375 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
5378 const char * procname
;
5380 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
5381 aux
->strtab_size
, tp
->start
, &procname
,
5384 fputs ("\n<", stdout
);
5388 fputs (procname
, stdout
);
5391 printf ("+%lx", (unsigned long) offset
);
5394 fputs (">: [", stdout
);
5395 print_vma (tp
->start
.offset
, PREFIX_HEX
);
5396 fputc ('-', stdout
);
5397 print_vma (tp
->end
.offset
, PREFIX_HEX
);
5400 #define PF(_m) if (tp->_m) printf (#_m " ");
5401 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5404 PF(Millicode_save_sr0
);
5405 /* PV(Region_description); */
5411 PF(Separate_Package_Body
);
5412 PF(Frame_Extension_Millicode
);
5413 PF(Stack_Overflow_Check
);
5414 PF(Two_Instruction_SP_Increment
);
5418 PF(sched_entry_seq
);
5421 PF(Save_MRP_in_frame
);
5422 PF(extn_ptr_defined
);
5423 PF(Cleanup_defined
);
5424 PF(MPE_XL_interrupt_marker
);
5425 PF(HP_UX_interrupt_marker
);
5428 PV(Total_frame_size
);
5437 slurp_hppa_unwind_table (FILE * file
,
5438 struct hppa_unw_aux_info
* aux
,
5439 Elf_Internal_Shdr
* sec
)
5441 unsigned long size
, unw_ent_size
, nentries
, nrelas
, i
;
5442 Elf_Internal_Phdr
* seg
;
5443 struct hppa_unw_table_entry
* tep
;
5444 Elf_Internal_Shdr
* relsec
;
5445 Elf_Internal_Rela
* rela
;
5446 Elf_Internal_Rela
* rp
;
5447 unsigned char * table
;
5449 Elf_Internal_Sym
* sym
;
5450 const char * relname
;
5452 /* First, find the starting address of the segment that includes
5455 if (elf_header
.e_phnum
)
5457 if (! get_program_headers (file
))
5460 for (seg
= program_headers
;
5461 seg
< program_headers
+ elf_header
.e_phnum
;
5464 if (seg
->p_type
!= PT_LOAD
)
5467 if (sec
->sh_addr
>= seg
->p_vaddr
5468 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5470 aux
->seg_base
= seg
->p_vaddr
;
5476 /* Second, build the unwind table from the contents of the unwind
5478 size
= sec
->sh_size
;
5479 table
= (unsigned char *) get_data (NULL
, file
, sec
->sh_offset
, 1, size
,
5485 nentries
= size
/ unw_ent_size
;
5486 size
= unw_ent_size
* nentries
;
5488 tep
= aux
->table
= (struct hppa_unw_table_entry
*)
5489 xcmalloc (nentries
, sizeof (aux
->table
[0]));
5491 for (tp
= table
; tp
< table
+ size
; tp
+= unw_ent_size
, ++tep
)
5493 unsigned int tmp1
, tmp2
;
5495 tep
->start
.section
= SHN_UNDEF
;
5496 tep
->end
.section
= SHN_UNDEF
;
5498 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
5499 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
5500 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
5501 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
5503 tep
->start
.offset
+= aux
->seg_base
;
5504 tep
->end
.offset
+= aux
->seg_base
;
5506 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
5507 tep
->Millicode
= (tmp1
>> 30) & 0x1;
5508 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
5509 tep
->Region_description
= (tmp1
>> 27) & 0x3;
5510 tep
->reserved1
= (tmp1
>> 26) & 0x1;
5511 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
5512 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
5513 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
5514 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
5515 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
5516 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
5517 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
5518 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
5519 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
5520 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
5521 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
5522 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
5523 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
5524 tep
->reserved2
= (tmp1
>> 5) & 0x1;
5525 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
5526 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
5527 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
5528 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
5529 tep
->Cleanup_defined
= tmp1
& 0x1;
5531 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
5532 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
5533 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
5534 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
5535 tep
->reserved4
= (tmp2
>> 27) & 0x1;
5536 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
5540 /* Third, apply any relocations to the unwind table. */
5541 for (relsec
= section_headers
;
5542 relsec
< section_headers
+ elf_header
.e_shnum
;
5545 if (relsec
->sh_type
!= SHT_RELA
5546 || relsec
->sh_info
>= elf_header
.e_shnum
5547 || section_headers
+ relsec
->sh_info
!= sec
)
5550 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5554 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5556 relname
= elf_hppa_reloc_type (get_reloc_type (rp
->r_info
));
5557 sym
= aux
->symtab
+ get_reloc_symindex (rp
->r_info
);
5559 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
5560 if (! const_strneq (relname
, "R_PARISC_SEGREL"))
5562 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5566 i
= rp
->r_offset
/ unw_ent_size
;
5568 switch ((rp
->r_offset
% unw_ent_size
) / eh_addr_size
)
5571 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5572 aux
->table
[i
].start
.offset
+= sym
->st_value
+ rp
->r_addend
;
5575 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5576 aux
->table
[i
].end
.offset
+= sym
->st_value
+ rp
->r_addend
;
5586 aux
->table_len
= nentries
;
5592 hppa_process_unwind (FILE * file
)
5594 struct hppa_unw_aux_info aux
;
5595 Elf_Internal_Shdr
* unwsec
= NULL
;
5596 Elf_Internal_Shdr
* strsec
;
5597 Elf_Internal_Shdr
* sec
;
5600 memset (& aux
, 0, sizeof (aux
));
5602 if (string_table
== NULL
)
5605 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5607 if (sec
->sh_type
== SHT_SYMTAB
5608 && sec
->sh_link
< elf_header
.e_shnum
)
5610 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5611 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5613 strsec
= section_headers
+ sec
->sh_link
;
5614 aux
.strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
5617 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5619 else if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5624 printf (_("\nThere are no unwind sections in this file.\n"));
5626 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5628 if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5630 printf (_("\nUnwind section "));
5631 printf (_("'%s'"), SECTION_NAME (sec
));
5633 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5634 (unsigned long) sec
->sh_offset
,
5635 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
+ 8)));
5637 slurp_hppa_unwind_table (file
, &aux
, sec
);
5638 if (aux
.table_len
> 0)
5639 dump_hppa_unwind (&aux
);
5642 free ((char *) aux
.table
);
5650 free ((char *) aux
.strtab
);
5656 process_unwind (FILE * file
)
5658 struct unwind_handler
5661 int (* handler
)(FILE *);
5664 { EM_IA_64
, ia64_process_unwind
},
5665 { EM_PARISC
, hppa_process_unwind
},
5673 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
5674 if (elf_header
.e_machine
== handlers
[i
].machtype
)
5675 return handlers
[i
].handler (file
);
5677 printf (_("\nThere are no unwind sections in this file.\n"));
5682 dynamic_section_mips_val (Elf_Internal_Dyn
* entry
)
5684 switch (entry
->d_tag
)
5687 if (entry
->d_un
.d_val
== 0)
5691 static const char * opts
[] =
5693 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5694 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5695 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5696 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5701 for (cnt
= 0; cnt
< ARRAY_SIZE (opts
); ++cnt
)
5702 if (entry
->d_un
.d_val
& (1 << cnt
))
5704 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
5711 case DT_MIPS_IVERSION
:
5712 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5713 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5715 printf ("<corrupt: %ld>\n", (long) entry
->d_un
.d_ptr
);
5718 case DT_MIPS_TIME_STAMP
:
5723 time_t time
= entry
->d_un
.d_val
;
5724 tmp
= gmtime (&time
);
5725 snprintf (timebuf
, sizeof (timebuf
), "%04u-%02u-%02uT%02u:%02u:%02u",
5726 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5727 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5728 printf ("Time Stamp: %s\n", timebuf
);
5732 case DT_MIPS_RLD_VERSION
:
5733 case DT_MIPS_LOCAL_GOTNO
:
5734 case DT_MIPS_CONFLICTNO
:
5735 case DT_MIPS_LIBLISTNO
:
5736 case DT_MIPS_SYMTABNO
:
5737 case DT_MIPS_UNREFEXTNO
:
5738 case DT_MIPS_HIPAGENO
:
5739 case DT_MIPS_DELTA_CLASS_NO
:
5740 case DT_MIPS_DELTA_INSTANCE_NO
:
5741 case DT_MIPS_DELTA_RELOC_NO
:
5742 case DT_MIPS_DELTA_SYM_NO
:
5743 case DT_MIPS_DELTA_CLASSSYM_NO
:
5744 case DT_MIPS_COMPACT_SIZE
:
5745 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
5749 printf ("%#lx\n", (unsigned long) entry
->d_un
.d_ptr
);
5755 dynamic_section_parisc_val (Elf_Internal_Dyn
* entry
)
5757 switch (entry
->d_tag
)
5759 case DT_HP_DLD_FLAGS
:
5768 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
5769 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
5770 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
5771 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
5772 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
5773 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
5774 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
5775 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
5776 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
5777 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
5778 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" },
5779 { DT_HP_GST
, "HP_GST" },
5780 { DT_HP_SHLIB_FIXED
, "HP_SHLIB_FIXED" },
5781 { DT_HP_MERGE_SHLIB_SEG
, "HP_MERGE_SHLIB_SEG" },
5782 { DT_HP_NODELETE
, "HP_NODELETE" },
5783 { DT_HP_GROUP
, "HP_GROUP" },
5784 { DT_HP_PROTECT_LINKAGE_TABLE
, "HP_PROTECT_LINKAGE_TABLE" }
5788 bfd_vma val
= entry
->d_un
.d_val
;
5790 for (cnt
= 0; cnt
< ARRAY_SIZE (flags
); ++cnt
)
5791 if (val
& flags
[cnt
].bit
)
5795 fputs (flags
[cnt
].str
, stdout
);
5797 val
^= flags
[cnt
].bit
;
5800 if (val
!= 0 || first
)
5804 print_vma (val
, HEX
);
5810 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5817 dynamic_section_ia64_val (Elf_Internal_Dyn
* entry
)
5819 switch (entry
->d_tag
)
5821 case DT_IA_64_PLT_RESERVE
:
5822 /* First 3 slots reserved. */
5823 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5825 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
5829 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5836 get_32bit_dynamic_section (FILE * file
)
5838 Elf32_External_Dyn
* edyn
;
5839 Elf32_External_Dyn
* ext
;
5840 Elf_Internal_Dyn
* entry
;
5842 edyn
= (Elf32_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
, 1,
5843 dynamic_size
, _("dynamic section"));
5847 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5848 might not have the luxury of section headers. Look for the DT_NULL
5849 terminator to determine the number of entries. */
5850 for (ext
= edyn
, dynamic_nent
= 0;
5851 (char *) ext
< (char *) edyn
+ dynamic_size
;
5855 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5859 dynamic_section
= (Elf_Internal_Dyn
*) cmalloc (dynamic_nent
,
5861 if (dynamic_section
== NULL
)
5863 error (_("Out of memory\n"));
5868 for (ext
= edyn
, entry
= dynamic_section
;
5869 entry
< dynamic_section
+ dynamic_nent
;
5872 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5873 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5882 get_64bit_dynamic_section (FILE * file
)
5884 Elf64_External_Dyn
* edyn
;
5885 Elf64_External_Dyn
* ext
;
5886 Elf_Internal_Dyn
* entry
;
5888 edyn
= (Elf64_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
, 1,
5889 dynamic_size
, _("dynamic section"));
5893 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5894 might not have the luxury of section headers. Look for the DT_NULL
5895 terminator to determine the number of entries. */
5896 for (ext
= edyn
, dynamic_nent
= 0;
5897 (char *) ext
< (char *) edyn
+ dynamic_size
;
5901 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5905 dynamic_section
= (Elf_Internal_Dyn
*) cmalloc (dynamic_nent
,
5907 if (dynamic_section
== NULL
)
5909 error (_("Out of memory\n"));
5914 for (ext
= edyn
, entry
= dynamic_section
;
5915 entry
< dynamic_section
+ dynamic_nent
;
5918 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5919 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5928 print_dynamic_flags (bfd_vma flags
)
5936 flag
= flags
& - flags
;
5946 case DF_ORIGIN
: fputs ("ORIGIN", stdout
); break;
5947 case DF_SYMBOLIC
: fputs ("SYMBOLIC", stdout
); break;
5948 case DF_TEXTREL
: fputs ("TEXTREL", stdout
); break;
5949 case DF_BIND_NOW
: fputs ("BIND_NOW", stdout
); break;
5950 case DF_STATIC_TLS
: fputs ("STATIC_TLS", stdout
); break;
5951 default: fputs ("unknown", stdout
); break;
5957 /* Parse and display the contents of the dynamic section. */
5960 process_dynamic_section (FILE * file
)
5962 Elf_Internal_Dyn
* entry
;
5964 if (dynamic_size
== 0)
5967 printf (_("\nThere is no dynamic section in this file.\n"));
5974 if (! get_32bit_dynamic_section (file
))
5977 else if (! get_64bit_dynamic_section (file
))
5980 /* Find the appropriate symbol table. */
5981 if (dynamic_symbols
== NULL
)
5983 for (entry
= dynamic_section
;
5984 entry
< dynamic_section
+ dynamic_nent
;
5987 Elf_Internal_Shdr section
;
5989 if (entry
->d_tag
!= DT_SYMTAB
)
5992 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
5994 /* Since we do not know how big the symbol table is,
5995 we default to reading in the entire file (!) and
5996 processing that. This is overkill, I know, but it
5998 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
6000 if (archive_file_offset
!= 0)
6001 section
.sh_size
= archive_file_size
- section
.sh_offset
;
6004 if (fseek (file
, 0, SEEK_END
))
6005 error (_("Unable to seek to end of file!\n"));
6007 section
.sh_size
= ftell (file
) - section
.sh_offset
;
6011 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
6013 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
6015 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
6016 if (num_dynamic_syms
< 1)
6018 error (_("Unable to determine the number of symbols to load\n"));
6022 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
6026 /* Similarly find a string table. */
6027 if (dynamic_strings
== NULL
)
6029 for (entry
= dynamic_section
;
6030 entry
< dynamic_section
+ dynamic_nent
;
6033 unsigned long offset
;
6036 if (entry
->d_tag
!= DT_STRTAB
)
6039 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
6041 /* Since we do not know how big the string table is,
6042 we default to reading in the entire file (!) and
6043 processing that. This is overkill, I know, but it
6046 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
6048 if (archive_file_offset
!= 0)
6049 str_tab_len
= archive_file_size
- offset
;
6052 if (fseek (file
, 0, SEEK_END
))
6053 error (_("Unable to seek to end of file\n"));
6054 str_tab_len
= ftell (file
) - offset
;
6057 if (str_tab_len
< 1)
6060 (_("Unable to determine the length of the dynamic string table\n"));
6064 dynamic_strings
= (char *) get_data (NULL
, file
, offset
, 1,
6066 _("dynamic string table"));
6067 dynamic_strings_length
= str_tab_len
;
6072 /* And find the syminfo section if available. */
6073 if (dynamic_syminfo
== NULL
)
6075 unsigned long syminsz
= 0;
6077 for (entry
= dynamic_section
;
6078 entry
< dynamic_section
+ dynamic_nent
;
6081 if (entry
->d_tag
== DT_SYMINENT
)
6083 /* Note: these braces are necessary to avoid a syntax
6084 error from the SunOS4 C compiler. */
6085 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
6087 else if (entry
->d_tag
== DT_SYMINSZ
)
6088 syminsz
= entry
->d_un
.d_val
;
6089 else if (entry
->d_tag
== DT_SYMINFO
)
6090 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
6094 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
6096 Elf_External_Syminfo
* extsyminfo
;
6097 Elf_External_Syminfo
* extsym
;
6098 Elf_Internal_Syminfo
* syminfo
;
6100 /* There is a syminfo section. Read the data. */
6101 extsyminfo
= (Elf_External_Syminfo
*)
6102 get_data (NULL
, file
, dynamic_syminfo_offset
, 1, syminsz
,
6103 _("symbol information"));
6107 dynamic_syminfo
= (Elf_Internal_Syminfo
*) malloc (syminsz
);
6108 if (dynamic_syminfo
== NULL
)
6110 error (_("Out of memory\n"));
6114 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
6115 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
6116 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
6117 ++syminfo
, ++extsym
)
6119 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
6120 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
6127 if (do_dynamic
&& dynamic_addr
)
6128 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
6129 dynamic_addr
, dynamic_nent
);
6131 printf (_(" Tag Type Name/Value\n"));
6133 for (entry
= dynamic_section
;
6134 entry
< dynamic_section
+ dynamic_nent
;
6142 print_vma (entry
->d_tag
, FULL_HEX
);
6143 dtype
= get_dynamic_type (entry
->d_tag
);
6144 printf (" (%s)%*s", dtype
,
6145 ((is_32bit_elf
? 27 : 19)
6146 - (int) strlen (dtype
)),
6150 switch (entry
->d_tag
)
6154 print_dynamic_flags (entry
->d_un
.d_val
);
6164 switch (entry
->d_tag
)
6167 printf (_("Auxiliary library"));
6171 printf (_("Filter library"));
6175 printf (_("Configuration file"));
6179 printf (_("Dependency audit library"));
6183 printf (_("Audit library"));
6187 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6188 printf (": [%s]\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
6192 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6201 printf (_("Flags:"));
6203 if (entry
->d_un
.d_val
== 0)
6204 printf (_(" None\n"));
6207 unsigned long int val
= entry
->d_un
.d_val
;
6209 if (val
& DTF_1_PARINIT
)
6211 printf (" PARINIT");
6212 val
^= DTF_1_PARINIT
;
6214 if (val
& DTF_1_CONFEXP
)
6216 printf (" CONFEXP");
6217 val
^= DTF_1_CONFEXP
;
6220 printf (" %lx", val
);
6229 printf (_("Flags:"));
6231 if (entry
->d_un
.d_val
== 0)
6232 printf (_(" None\n"));
6235 unsigned long int val
= entry
->d_un
.d_val
;
6237 if (val
& DF_P1_LAZYLOAD
)
6239 printf (" LAZYLOAD");
6240 val
^= DF_P1_LAZYLOAD
;
6242 if (val
& DF_P1_GROUPPERM
)
6244 printf (" GROUPPERM");
6245 val
^= DF_P1_GROUPPERM
;
6248 printf (" %lx", val
);
6257 printf (_("Flags:"));
6258 if (entry
->d_un
.d_val
== 0)
6259 printf (_(" None\n"));
6262 unsigned long int val
= entry
->d_un
.d_val
;
6269 if (val
& DF_1_GLOBAL
)
6274 if (val
& DF_1_GROUP
)
6279 if (val
& DF_1_NODELETE
)
6281 printf (" NODELETE");
6282 val
^= DF_1_NODELETE
;
6284 if (val
& DF_1_LOADFLTR
)
6286 printf (" LOADFLTR");
6287 val
^= DF_1_LOADFLTR
;
6289 if (val
& DF_1_INITFIRST
)
6291 printf (" INITFIRST");
6292 val
^= DF_1_INITFIRST
;
6294 if (val
& DF_1_NOOPEN
)
6299 if (val
& DF_1_ORIGIN
)
6304 if (val
& DF_1_DIRECT
)
6309 if (val
& DF_1_TRANS
)
6314 if (val
& DF_1_INTERPOSE
)
6316 printf (" INTERPOSE");
6317 val
^= DF_1_INTERPOSE
;
6319 if (val
& DF_1_NODEFLIB
)
6321 printf (" NODEFLIB");
6322 val
^= DF_1_NODEFLIB
;
6324 if (val
& DF_1_NODUMP
)
6329 if (val
& DF_1_CONLFAT
)
6331 printf (" CONLFAT");
6332 val
^= DF_1_CONLFAT
;
6335 printf (" %lx", val
);
6342 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6344 puts (get_dynamic_type (entry
->d_un
.d_val
));
6364 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6370 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6371 name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6377 switch (entry
->d_tag
)
6380 printf (_("Shared library: [%s]"), name
);
6382 if (streq (name
, program_interpreter
))
6383 printf (_(" program interpreter"));
6387 printf (_("Library soname: [%s]"), name
);
6391 printf (_("Library rpath: [%s]"), name
);
6395 printf (_("Library runpath: [%s]"), name
);
6399 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6404 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6417 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6421 case DT_INIT_ARRAYSZ
:
6422 case DT_FINI_ARRAYSZ
:
6423 case DT_GNU_CONFLICTSZ
:
6424 case DT_GNU_LIBLISTSZ
:
6427 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6428 printf (" (bytes)\n");
6438 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6451 if (entry
->d_tag
== DT_USED
6452 && VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6454 char * name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6458 printf (_("Not needed object: [%s]\n"), name
);
6463 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6469 /* The value of this entry is ignored. */
6474 case DT_GNU_PRELINKED
:
6478 time_t time
= entry
->d_un
.d_val
;
6480 tmp
= gmtime (&time
);
6481 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
6482 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
6483 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
6489 dynamic_info_DT_GNU_HASH
= entry
->d_un
.d_val
;
6492 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6498 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
6499 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
6504 switch (elf_header
.e_machine
)
6507 case EM_MIPS_RS3_LE
:
6508 dynamic_section_mips_val (entry
);
6511 dynamic_section_parisc_val (entry
);
6514 dynamic_section_ia64_val (entry
);
6517 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6529 get_ver_flags (unsigned int flags
)
6531 static char buff
[32];
6538 if (flags
& VER_FLG_BASE
)
6539 strcat (buff
, "BASE ");
6541 if (flags
& VER_FLG_WEAK
)
6543 if (flags
& VER_FLG_BASE
)
6544 strcat (buff
, "| ");
6546 strcat (buff
, "WEAK ");
6549 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
6550 strcat (buff
, "| <unknown>");
6555 /* Display the contents of the version sections. */
6558 process_version_sections (FILE * file
)
6560 Elf_Internal_Shdr
* section
;
6567 for (i
= 0, section
= section_headers
;
6568 i
< elf_header
.e_shnum
;
6571 switch (section
->sh_type
)
6573 case SHT_GNU_verdef
:
6575 Elf_External_Verdef
* edefs
;
6583 (_("\nVersion definition section '%s' contains %u entries:\n"),
6584 SECTION_NAME (section
), section
->sh_info
);
6586 printf (_(" Addr: 0x"));
6587 printf_vma (section
->sh_addr
);
6588 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
6589 (unsigned long) section
->sh_offset
, section
->sh_link
,
6590 section
->sh_link
< elf_header
.e_shnum
6591 ? SECTION_NAME (section_headers
+ section
->sh_link
)
6594 edefs
= (Elf_External_Verdef
*)
6595 get_data (NULL
, file
, section
->sh_offset
, 1,section
->sh_size
,
6596 _("version definition section"));
6597 endbuf
= (char *) edefs
+ section
->sh_size
;
6601 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6604 Elf_External_Verdef
* edef
;
6605 Elf_Internal_Verdef ent
;
6606 Elf_External_Verdaux
* eaux
;
6607 Elf_Internal_Verdaux aux
;
6611 vstart
= ((char *) edefs
) + idx
;
6612 if (vstart
+ sizeof (*edef
) > endbuf
)
6615 edef
= (Elf_External_Verdef
*) vstart
;
6617 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
6618 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
6619 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
6620 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
6621 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
6622 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
6623 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
6625 printf (_(" %#06x: Rev: %d Flags: %s"),
6626 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
6628 printf (_(" Index: %d Cnt: %d "),
6629 ent
.vd_ndx
, ent
.vd_cnt
);
6631 vstart
+= ent
.vd_aux
;
6633 eaux
= (Elf_External_Verdaux
*) vstart
;
6635 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6636 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6638 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6639 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux
.vda_name
));
6641 printf (_("Name index: %ld\n"), aux
.vda_name
);
6643 isum
= idx
+ ent
.vd_aux
;
6645 for (j
= 1; j
< ent
.vd_cnt
; j
++)
6647 isum
+= aux
.vda_next
;
6648 vstart
+= aux
.vda_next
;
6650 eaux
= (Elf_External_Verdaux
*) vstart
;
6651 if (vstart
+ sizeof (*eaux
) > endbuf
)
6654 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6655 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6657 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6658 printf (_(" %#06x: Parent %d: %s\n"),
6659 isum
, j
, GET_DYNAMIC_NAME (aux
.vda_name
));
6661 printf (_(" %#06x: Parent %d, name index: %ld\n"),
6662 isum
, j
, aux
.vda_name
);
6665 printf (_(" Version def aux past end of section\n"));
6669 if (cnt
< section
->sh_info
)
6670 printf (_(" Version definition past end of section\n"));
6676 case SHT_GNU_verneed
:
6678 Elf_External_Verneed
* eneed
;
6685 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
6686 SECTION_NAME (section
), section
->sh_info
);
6688 printf (_(" Addr: 0x"));
6689 printf_vma (section
->sh_addr
);
6690 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
6691 (unsigned long) section
->sh_offset
, section
->sh_link
,
6692 section
->sh_link
< elf_header
.e_shnum
6693 ? SECTION_NAME (section_headers
+ section
->sh_link
)
6696 eneed
= (Elf_External_Verneed
*) get_data (NULL
, file
,
6697 section
->sh_offset
, 1,
6699 _("version need section"));
6700 endbuf
= (char *) eneed
+ section
->sh_size
;
6704 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6706 Elf_External_Verneed
* entry
;
6707 Elf_Internal_Verneed ent
;
6712 vstart
= ((char *) eneed
) + idx
;
6713 if (vstart
+ sizeof (*entry
) > endbuf
)
6716 entry
= (Elf_External_Verneed
*) vstart
;
6718 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
6719 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
6720 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
6721 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
6722 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
6724 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
6726 if (VALID_DYNAMIC_NAME (ent
.vn_file
))
6727 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent
.vn_file
));
6729 printf (_(" File: %lx"), ent
.vn_file
);
6731 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
6733 vstart
+= ent
.vn_aux
;
6735 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
6737 Elf_External_Vernaux
* eaux
;
6738 Elf_Internal_Vernaux aux
;
6740 if (vstart
+ sizeof (*eaux
) > endbuf
)
6742 eaux
= (Elf_External_Vernaux
*) vstart
;
6744 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
6745 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
6746 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
6747 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
6748 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
6750 if (VALID_DYNAMIC_NAME (aux
.vna_name
))
6751 printf (_(" %#06x: Name: %s"),
6752 isum
, GET_DYNAMIC_NAME (aux
.vna_name
));
6754 printf (_(" %#06x: Name index: %lx"),
6755 isum
, aux
.vna_name
);
6757 printf (_(" Flags: %s Version: %d\n"),
6758 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
6760 isum
+= aux
.vna_next
;
6761 vstart
+= aux
.vna_next
;
6764 printf (_(" Version need aux past end of section\n"));
6768 if (cnt
< section
->sh_info
)
6769 printf (_(" Version need past end of section\n"));
6775 case SHT_GNU_versym
:
6777 Elf_Internal_Shdr
* link_section
;
6780 unsigned char * edata
;
6781 unsigned short * data
;
6783 Elf_Internal_Sym
* symbols
;
6784 Elf_Internal_Shdr
* string_sec
;
6787 if (section
->sh_link
>= elf_header
.e_shnum
)
6790 link_section
= section_headers
+ section
->sh_link
;
6791 total
= section
->sh_size
/ sizeof (Elf_External_Versym
);
6793 if (link_section
->sh_link
>= elf_header
.e_shnum
)
6798 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
6800 string_sec
= section_headers
+ link_section
->sh_link
;
6802 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
, 1,
6803 string_sec
->sh_size
,
6804 _("version string table"));
6808 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6809 SECTION_NAME (section
), total
);
6811 printf (_(" Addr: "));
6812 printf_vma (section
->sh_addr
);
6813 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
6814 (unsigned long) section
->sh_offset
, section
->sh_link
,
6815 SECTION_NAME (link_section
));
6817 off
= offset_from_vma (file
,
6818 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6819 total
* sizeof (short));
6820 edata
= (unsigned char *) get_data (NULL
, file
, off
, total
,
6822 _("version symbol data"));
6829 data
= (short unsigned int *) cmalloc (total
, sizeof (short));
6831 for (cnt
= total
; cnt
--;)
6832 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
6837 for (cnt
= 0; cnt
< total
; cnt
+= 4)
6840 int check_def
, check_need
;
6843 printf (" %03x:", cnt
);
6845 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
6846 switch (data
[cnt
+ j
])
6849 fputs (_(" 0 (*local*) "), stdout
);
6853 fputs (_(" 1 (*global*) "), stdout
);
6857 nn
= printf ("%4x%c", data
[cnt
+ j
] & VERSYM_VERSION
,
6858 data
[cnt
+ j
] & VERSYM_HIDDEN
? 'h' : ' ');
6862 if (symbols
[cnt
+ j
].st_shndx
>= elf_header
.e_shnum
6863 || section_headers
[symbols
[cnt
+ j
].st_shndx
].sh_type
6866 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
6873 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
6875 Elf_Internal_Verneed ivn
;
6876 unsigned long offset
;
6878 offset
= offset_from_vma
6879 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6880 sizeof (Elf_External_Verneed
));
6884 Elf_Internal_Vernaux ivna
;
6885 Elf_External_Verneed evn
;
6886 Elf_External_Vernaux evna
;
6887 unsigned long a_off
;
6889 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
6892 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6893 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6895 a_off
= offset
+ ivn
.vn_aux
;
6899 get_data (&evna
, file
, a_off
, sizeof (evna
),
6900 1, _("version need aux (2)"));
6902 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6903 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6905 a_off
+= ivna
.vna_next
;
6907 while (ivna
.vna_other
!= data
[cnt
+ j
]
6908 && ivna
.vna_next
!= 0);
6910 if (ivna
.vna_other
== data
[cnt
+ j
])
6912 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6914 if (ivna
.vna_name
>= string_sec
->sh_size
)
6915 name
= _("*invalid*");
6917 name
= strtab
+ ivna
.vna_name
;
6918 nn
+= printf ("(%s%-*s",
6920 12 - (int) strlen (name
),
6926 offset
+= ivn
.vn_next
;
6928 while (ivn
.vn_next
);
6931 if (check_def
&& data
[cnt
+ j
] != 0x8001
6932 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6934 Elf_Internal_Verdef ivd
;
6935 Elf_External_Verdef evd
;
6936 unsigned long offset
;
6938 offset
= offset_from_vma
6939 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6944 get_data (&evd
, file
, offset
, sizeof (evd
), 1,
6947 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6948 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6950 offset
+= ivd
.vd_next
;
6952 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & VERSYM_VERSION
)
6953 && ivd
.vd_next
!= 0);
6955 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & VERSYM_VERSION
))
6957 Elf_External_Verdaux evda
;
6958 Elf_Internal_Verdaux ivda
;
6960 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6962 get_data (&evda
, file
,
6963 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
6965 _("version def aux"));
6967 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6969 if (ivda
.vda_name
>= string_sec
->sh_size
)
6970 name
= _("*invalid*");
6972 name
= strtab
+ ivda
.vda_name
;
6973 nn
+= printf ("(%s%-*s",
6975 12 - (int) strlen (name
),
6981 printf ("%*c", 18 - nn
, ' ');
6999 printf (_("\nNo version information found in this file.\n"));
7005 get_symbol_binding (unsigned int binding
)
7007 static char buff
[32];
7011 case STB_LOCAL
: return "LOCAL";
7012 case STB_GLOBAL
: return "GLOBAL";
7013 case STB_WEAK
: return "WEAK";
7015 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
7016 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"),
7018 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
7020 if (binding
== STB_GNU_UNIQUE
7021 && (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_LINUX
7022 /* GNU/Linux is still using the default value 0. */
7023 || elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_NONE
))
7025 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), binding
);
7028 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), binding
);
7034 get_symbol_type (unsigned int type
)
7036 static char buff
[32];
7040 case STT_NOTYPE
: return "NOTYPE";
7041 case STT_OBJECT
: return "OBJECT";
7042 case STT_FUNC
: return "FUNC";
7043 case STT_SECTION
: return "SECTION";
7044 case STT_FILE
: return "FILE";
7045 case STT_COMMON
: return "COMMON";
7046 case STT_TLS
: return "TLS";
7047 case STT_RELC
: return "RELC";
7048 case STT_SRELC
: return "SRELC";
7050 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
7052 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
7053 return "THUMB_FUNC";
7055 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
7058 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
7059 return "PARISC_MILLI";
7061 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"), type
);
7063 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
7065 if (elf_header
.e_machine
== EM_PARISC
)
7067 if (type
== STT_HP_OPAQUE
)
7069 if (type
== STT_HP_STUB
)
7073 if (type
== STT_GNU_IFUNC
7074 && (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_LINUX
7075 /* GNU/Linux is still using the default value 0. */
7076 || elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_NONE
))
7079 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), type
);
7082 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), type
);
7088 get_symbol_visibility (unsigned int visibility
)
7092 case STV_DEFAULT
: return "DEFAULT";
7093 case STV_INTERNAL
: return "INTERNAL";
7094 case STV_HIDDEN
: return "HIDDEN";
7095 case STV_PROTECTED
: return "PROTECTED";
7101 get_mips_symbol_other (unsigned int other
)
7105 case STO_OPTIONAL
: return "OPTIONAL";
7106 case STO_MIPS16
: return "MIPS16";
7107 case STO_MIPS_PLT
: return "MIPS PLT";
7108 case STO_MIPS_PIC
: return "MIPS PIC";
7109 default: return NULL
;
7114 get_symbol_other (unsigned int other
)
7116 const char * result
= NULL
;
7117 static char buff
[32];
7122 switch (elf_header
.e_machine
)
7125 result
= get_mips_symbol_other (other
);
7133 snprintf (buff
, sizeof buff
, _("<other>: %x"), other
);
7138 get_symbol_index_type (unsigned int type
)
7140 static char buff
[32];
7144 case SHN_UNDEF
: return "UND";
7145 case SHN_ABS
: return "ABS";
7146 case SHN_COMMON
: return "COM";
7148 if (type
== SHN_IA_64_ANSI_COMMON
7149 && elf_header
.e_machine
== EM_IA_64
7150 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
7152 else if ((elf_header
.e_machine
== EM_X86_64
7153 || elf_header
.e_machine
== EM_L1OM
)
7154 && type
== SHN_X86_64_LCOMMON
)
7156 else if (type
== SHN_MIPS_SCOMMON
7157 && elf_header
.e_machine
== EM_MIPS
)
7159 else if (type
== SHN_MIPS_SUNDEFINED
7160 && elf_header
.e_machine
== EM_MIPS
)
7162 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
7163 sprintf (buff
, "PRC[0x%04x]", type
& 0xffff);
7164 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
7165 sprintf (buff
, "OS [0x%04x]", type
& 0xffff);
7166 else if (type
>= SHN_LORESERVE
)
7167 sprintf (buff
, "RSV[0x%04x]", type
& 0xffff);
7169 sprintf (buff
, "%3d", type
);
7177 get_dynamic_data (FILE * file
, unsigned int number
, unsigned int ent_size
)
7179 unsigned char * e_data
;
7182 e_data
= (unsigned char *) cmalloc (number
, ent_size
);
7186 error (_("Out of memory\n"));
7190 if (fread (e_data
, ent_size
, number
, file
) != number
)
7192 error (_("Unable to read in dynamic data\n"));
7196 i_data
= (bfd_vma
*) cmalloc (number
, sizeof (*i_data
));
7200 error (_("Out of memory\n"));
7206 i_data
[number
] = byte_get (e_data
+ number
* ent_size
, ent_size
);
7214 print_dynamic_symbol (bfd_vma si
, unsigned long hn
)
7216 Elf_Internal_Sym
* psym
;
7219 psym
= dynamic_symbols
+ si
;
7221 n
= print_vma (si
, DEC_5
);
7223 fputs (" " + n
, stdout
);
7224 printf (" %3lu: ", hn
);
7225 print_vma (psym
->st_value
, LONG_HEX
);
7227 print_vma (psym
->st_size
, DEC_5
);
7229 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
7230 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
7231 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
7232 /* Check to see if any other bits in the st_other field are set.
7233 Note - displaying this information disrupts the layout of the
7234 table being generated, but for the moment this case is very
7236 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
7237 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
7238 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
7239 if (VALID_DYNAMIC_NAME (psym
->st_name
))
7240 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
7242 printf (" <corrupt: %14ld>", psym
->st_name
);
7246 /* Dump the symbol table. */
7248 process_symbol_table (FILE * file
)
7250 Elf_Internal_Shdr
* section
;
7251 bfd_vma nbuckets
= 0;
7252 bfd_vma nchains
= 0;
7253 bfd_vma
* buckets
= NULL
;
7254 bfd_vma
* chains
= NULL
;
7255 bfd_vma ngnubuckets
= 0;
7256 bfd_vma
* gnubuckets
= NULL
;
7257 bfd_vma
* gnuchains
= NULL
;
7258 bfd_vma gnusymidx
= 0;
7260 if (! do_syms
&& !do_histogram
)
7263 if (dynamic_info
[DT_HASH
]
7265 || (do_using_dynamic
&& dynamic_strings
!= NULL
)))
7267 unsigned char nb
[8];
7268 unsigned char nc
[8];
7269 int hash_ent_size
= 4;
7271 if ((elf_header
.e_machine
== EM_ALPHA
7272 || elf_header
.e_machine
== EM_S390
7273 || elf_header
.e_machine
== EM_S390_OLD
)
7274 && elf_header
.e_ident
[EI_CLASS
] == ELFCLASS64
)
7278 (archive_file_offset
7279 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
7280 sizeof nb
+ sizeof nc
)),
7283 error (_("Unable to seek to start of dynamic information\n"));
7287 if (fread (nb
, hash_ent_size
, 1, file
) != 1)
7289 error (_("Failed to read in number of buckets\n"));
7293 if (fread (nc
, hash_ent_size
, 1, file
) != 1)
7295 error (_("Failed to read in number of chains\n"));
7299 nbuckets
= byte_get (nb
, hash_ent_size
);
7300 nchains
= byte_get (nc
, hash_ent_size
);
7302 buckets
= get_dynamic_data (file
, nbuckets
, hash_ent_size
);
7303 chains
= get_dynamic_data (file
, nchains
, hash_ent_size
);
7306 if (buckets
== NULL
|| chains
== NULL
)
7308 if (do_using_dynamic
)
7319 if (dynamic_info_DT_GNU_HASH
7321 || (do_using_dynamic
&& dynamic_strings
!= NULL
)))
7323 unsigned char nb
[16];
7324 bfd_vma i
, maxchain
= 0xffffffff, bitmaskwords
;
7325 bfd_vma buckets_vma
;
7328 (archive_file_offset
7329 + offset_from_vma (file
, dynamic_info_DT_GNU_HASH
,
7333 error (_("Unable to seek to start of dynamic information\n"));
7337 if (fread (nb
, 16, 1, file
) != 1)
7339 error (_("Failed to read in number of buckets\n"));
7343 ngnubuckets
= byte_get (nb
, 4);
7344 gnusymidx
= byte_get (nb
+ 4, 4);
7345 bitmaskwords
= byte_get (nb
+ 8, 4);
7346 buckets_vma
= dynamic_info_DT_GNU_HASH
+ 16;
7348 buckets_vma
+= bitmaskwords
* 4;
7350 buckets_vma
+= bitmaskwords
* 8;
7353 (archive_file_offset
7354 + offset_from_vma (file
, buckets_vma
, 4)),
7357 error (_("Unable to seek to start of dynamic information\n"));
7361 gnubuckets
= get_dynamic_data (file
, ngnubuckets
, 4);
7363 if (gnubuckets
== NULL
)
7366 for (i
= 0; i
< ngnubuckets
; i
++)
7367 if (gnubuckets
[i
] != 0)
7369 if (gnubuckets
[i
] < gnusymidx
)
7372 if (maxchain
== 0xffffffff || gnubuckets
[i
] > maxchain
)
7373 maxchain
= gnubuckets
[i
];
7376 if (maxchain
== 0xffffffff)
7379 maxchain
-= gnusymidx
;
7382 (archive_file_offset
7383 + offset_from_vma (file
, buckets_vma
7384 + 4 * (ngnubuckets
+ maxchain
), 4)),
7387 error (_("Unable to seek to start of dynamic information\n"));
7393 if (fread (nb
, 4, 1, file
) != 1)
7395 error (_("Failed to determine last chain length\n"));
7399 if (maxchain
+ 1 == 0)
7404 while ((byte_get (nb
, 4) & 1) == 0);
7407 (archive_file_offset
7408 + offset_from_vma (file
, buckets_vma
+ 4 * ngnubuckets
, 4)),
7411 error (_("Unable to seek to start of dynamic information\n"));
7415 gnuchains
= get_dynamic_data (file
, maxchain
, 4);
7418 if (gnuchains
== NULL
)
7423 if (do_using_dynamic
)
7428 if ((dynamic_info
[DT_HASH
] || dynamic_info_DT_GNU_HASH
)
7431 && dynamic_strings
!= NULL
)
7435 if (dynamic_info
[DT_HASH
])
7439 printf (_("\nSymbol table for image:\n"));
7441 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7443 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7445 for (hn
= 0; hn
< nbuckets
; hn
++)
7450 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
7451 print_dynamic_symbol (si
, hn
);
7455 if (dynamic_info_DT_GNU_HASH
)
7457 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
7459 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7461 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7463 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7464 if (gnubuckets
[hn
] != 0)
7466 bfd_vma si
= gnubuckets
[hn
];
7467 bfd_vma off
= si
- gnusymidx
;
7471 print_dynamic_symbol (si
, hn
);
7474 while ((gnuchains
[off
++] & 1) == 0);
7478 else if (do_syms
&& !do_using_dynamic
)
7482 for (i
= 0, section
= section_headers
;
7483 i
< elf_header
.e_shnum
;
7487 char * strtab
= NULL
;
7488 unsigned long int strtab_size
= 0;
7489 Elf_Internal_Sym
* symtab
;
7490 Elf_Internal_Sym
* psym
;
7492 if ( section
->sh_type
!= SHT_SYMTAB
7493 && section
->sh_type
!= SHT_DYNSYM
)
7496 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
7497 SECTION_NAME (section
),
7498 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
7500 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7502 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7504 symtab
= GET_ELF_SYMBOLS (file
, section
);
7508 if (section
->sh_link
== elf_header
.e_shstrndx
)
7510 strtab
= string_table
;
7511 strtab_size
= string_table_length
;
7513 else if (section
->sh_link
< elf_header
.e_shnum
)
7515 Elf_Internal_Shdr
* string_sec
;
7517 string_sec
= section_headers
+ section
->sh_link
;
7519 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
7520 1, string_sec
->sh_size
,
7522 strtab_size
= strtab
!= NULL
? string_sec
->sh_size
: 0;
7525 for (si
= 0, psym
= symtab
;
7526 si
< section
->sh_size
/ section
->sh_entsize
;
7529 printf ("%6d: ", si
);
7530 print_vma (psym
->st_value
, LONG_HEX
);
7532 print_vma (psym
->st_size
, DEC_5
);
7533 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
7534 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
7535 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
7536 /* Check to see if any other bits in the st_other field are set.
7537 Note - displaying this information disrupts the layout of the
7538 table being generated, but for the moment this case is very rare. */
7539 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
7540 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
7541 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
7542 print_symbol (25, psym
->st_name
< strtab_size
7543 ? strtab
+ psym
->st_name
: "<corrupt>");
7545 if (section
->sh_type
== SHT_DYNSYM
&&
7546 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
7548 unsigned char data
[2];
7549 unsigned short vers_data
;
7550 unsigned long offset
;
7554 offset
= offset_from_vma
7555 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
7556 sizeof data
+ si
* sizeof (vers_data
));
7558 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
7559 sizeof (data
), 1, _("version data"));
7561 vers_data
= byte_get (data
, 2);
7563 is_nobits
= (psym
->st_shndx
< elf_header
.e_shnum
7564 && section_headers
[psym
->st_shndx
].sh_type
7567 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
7569 if ((vers_data
& VERSYM_HIDDEN
) || vers_data
> 1)
7571 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
7572 && (is_nobits
|| ! check_def
))
7574 Elf_External_Verneed evn
;
7575 Elf_Internal_Verneed ivn
;
7576 Elf_Internal_Vernaux ivna
;
7578 /* We must test both. */
7579 offset
= offset_from_vma
7580 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
7585 unsigned long vna_off
;
7587 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
7590 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
7591 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
7593 vna_off
= offset
+ ivn
.vn_aux
;
7597 Elf_External_Vernaux evna
;
7599 get_data (&evna
, file
, vna_off
,
7601 _("version need aux (3)"));
7603 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
7604 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
7605 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
7607 vna_off
+= ivna
.vna_next
;
7609 while (ivna
.vna_other
!= vers_data
7610 && ivna
.vna_next
!= 0);
7612 if (ivna
.vna_other
== vers_data
)
7615 offset
+= ivn
.vn_next
;
7617 while (ivn
.vn_next
!= 0);
7619 if (ivna
.vna_other
== vers_data
)
7622 ivna
.vna_name
< strtab_size
7623 ? strtab
+ ivna
.vna_name
: "<corrupt>",
7627 else if (! is_nobits
)
7628 error (_("bad dynamic symbol\n"));
7635 if (vers_data
!= 0x8001
7636 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
7638 Elf_Internal_Verdef ivd
;
7639 Elf_Internal_Verdaux ivda
;
7640 Elf_External_Verdaux evda
;
7641 unsigned long offset
;
7643 offset
= offset_from_vma
7645 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
7646 sizeof (Elf_External_Verdef
));
7650 Elf_External_Verdef evd
;
7652 get_data (&evd
, file
, offset
, sizeof (evd
),
7653 1, _("version def"));
7655 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
7656 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
7657 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
7659 offset
+= ivd
.vd_next
;
7661 while (ivd
.vd_ndx
!= (vers_data
& VERSYM_VERSION
)
7662 && ivd
.vd_next
!= 0);
7664 offset
-= ivd
.vd_next
;
7665 offset
+= ivd
.vd_aux
;
7667 get_data (&evda
, file
, offset
, sizeof (evda
),
7668 1, _("version def aux"));
7670 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
7672 if (psym
->st_name
!= ivda
.vda_name
)
7673 printf ((vers_data
& VERSYM_HIDDEN
)
7675 ivda
.vda_name
< strtab_size
7676 ? strtab
+ ivda
.vda_name
: "<corrupt>");
7686 if (strtab
!= string_table
)
7692 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
7694 if (do_histogram
&& buckets
!= NULL
)
7696 unsigned long * lengths
;
7697 unsigned long * counts
;
7700 unsigned long maxlength
= 0;
7701 unsigned long nzero_counts
= 0;
7702 unsigned long nsyms
= 0;
7704 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
7705 (unsigned long) nbuckets
);
7706 printf (_(" Length Number %% of total Coverage\n"));
7708 lengths
= (unsigned long *) calloc (nbuckets
, sizeof (*lengths
));
7709 if (lengths
== NULL
)
7711 error (_("Out of memory\n"));
7714 for (hn
= 0; hn
< nbuckets
; ++hn
)
7716 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
7719 if (maxlength
< ++lengths
[hn
])
7724 counts
= (unsigned long *) calloc (maxlength
+ 1, sizeof (*counts
));
7727 error (_("Out of memory\n"));
7731 for (hn
= 0; hn
< nbuckets
; ++hn
)
7732 ++counts
[lengths
[hn
]];
7737 printf (" 0 %-10lu (%5.1f%%)\n",
7738 counts
[0], (counts
[0] * 100.0) / nbuckets
);
7739 for (i
= 1; i
<= maxlength
; ++i
)
7741 nzero_counts
+= counts
[i
] * i
;
7742 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7743 i
, counts
[i
], (counts
[i
] * 100.0) / nbuckets
,
7744 (nzero_counts
* 100.0) / nsyms
);
7752 if (buckets
!= NULL
)
7758 if (do_histogram
&& gnubuckets
!= NULL
)
7760 unsigned long * lengths
;
7761 unsigned long * counts
;
7763 unsigned long maxlength
= 0;
7764 unsigned long nzero_counts
= 0;
7765 unsigned long nsyms
= 0;
7767 lengths
= (unsigned long *) calloc (ngnubuckets
, sizeof (*lengths
));
7768 if (lengths
== NULL
)
7770 error (_("Out of memory\n"));
7774 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
7775 (unsigned long) ngnubuckets
);
7776 printf (_(" Length Number %% of total Coverage\n"));
7778 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7779 if (gnubuckets
[hn
] != 0)
7781 bfd_vma off
, length
= 1;
7783 for (off
= gnubuckets
[hn
] - gnusymidx
;
7784 (gnuchains
[off
] & 1) == 0; ++off
)
7786 lengths
[hn
] = length
;
7787 if (length
> maxlength
)
7792 counts
= (unsigned long *) calloc (maxlength
+ 1, sizeof (*counts
));
7795 error (_("Out of memory\n"));
7799 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7800 ++counts
[lengths
[hn
]];
7802 if (ngnubuckets
> 0)
7805 printf (" 0 %-10lu (%5.1f%%)\n",
7806 counts
[0], (counts
[0] * 100.0) / ngnubuckets
);
7807 for (j
= 1; j
<= maxlength
; ++j
)
7809 nzero_counts
+= counts
[j
] * j
;
7810 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7811 j
, counts
[j
], (counts
[j
] * 100.0) / ngnubuckets
,
7812 (nzero_counts
* 100.0) / nsyms
);
7826 process_syminfo (FILE * file ATTRIBUTE_UNUSED
)
7830 if (dynamic_syminfo
== NULL
7832 /* No syminfo, this is ok. */
7835 /* There better should be a dynamic symbol section. */
7836 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
7840 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
7841 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
7843 printf (_(" Num: Name BoundTo Flags\n"));
7844 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
7846 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
7848 printf ("%4d: ", i
);
7849 if (VALID_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
))
7850 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
));
7852 printf ("<corrupt: %19ld>", dynamic_symbols
[i
].st_name
);
7855 switch (dynamic_syminfo
[i
].si_boundto
)
7857 case SYMINFO_BT_SELF
:
7858 fputs ("SELF ", stdout
);
7860 case SYMINFO_BT_PARENT
:
7861 fputs ("PARENT ", stdout
);
7864 if (dynamic_syminfo
[i
].si_boundto
> 0
7865 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
7866 && VALID_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
7868 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
7872 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
7876 if (flags
& SYMINFO_FLG_DIRECT
)
7878 if (flags
& SYMINFO_FLG_PASSTHRU
)
7879 printf (" PASSTHRU");
7880 if (flags
& SYMINFO_FLG_COPY
)
7882 if (flags
& SYMINFO_FLG_LAZYLOAD
)
7883 printf (" LAZYLOAD");
7891 /* Check to see if the given reloc needs to be handled in a target specific
7892 manner. If so then process the reloc and return TRUE otherwise return
7896 target_specific_reloc_handling (Elf_Internal_Rela
* reloc
,
7897 unsigned char * start
,
7898 Elf_Internal_Sym
* symtab
)
7900 unsigned int reloc_type
= get_reloc_type (reloc
->r_info
);
7902 switch (elf_header
.e_machine
)
7905 case EM_CYGNUS_MN10300
:
7907 static Elf_Internal_Sym
* saved_sym
= NULL
;
7911 case 34: /* R_MN10300_ALIGN */
7913 case 33: /* R_MN10300_SYM_DIFF */
7914 saved_sym
= symtab
+ get_reloc_symindex (reloc
->r_info
);
7916 case 1: /* R_MN10300_32 */
7917 case 2: /* R_MN10300_16 */
7918 if (saved_sym
!= NULL
)
7922 value
= reloc
->r_addend
7923 + (symtab
[get_reloc_symindex (reloc
->r_info
)].st_value
7924 - saved_sym
->st_value
);
7926 byte_put (start
+ reloc
->r_offset
, value
, reloc_type
== 1 ? 4 : 2);
7933 if (saved_sym
!= NULL
)
7934 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc"));
7944 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
7945 DWARF debug sections. This is a target specific test. Note - we do not
7946 go through the whole including-target-headers-multiple-times route, (as
7947 we have already done with <elf/h8.h>) because this would become very
7948 messy and even then this function would have to contain target specific
7949 information (the names of the relocs instead of their numeric values).
7950 FIXME: This is not the correct way to solve this problem. The proper way
7951 is to have target specific reloc sizing and typing functions created by
7952 the reloc-macros.h header, in the same way that it already creates the
7953 reloc naming functions. */
7956 is_32bit_abs_reloc (unsigned int reloc_type
)
7958 switch (elf_header
.e_machine
)
7962 return reloc_type
== 1; /* R_386_32. */
7964 return reloc_type
== 1; /* R_68K_32. */
7966 return reloc_type
== 1; /* R_860_32. */
7968 return reloc_type
== 1; /* XXX Is this right ? */
7970 return reloc_type
== 1; /* R_ARC_32. */
7972 return reloc_type
== 2; /* R_ARM_ABS32 */
7975 return reloc_type
== 1;
7977 return reloc_type
== 0x12; /* R_byte4_data. */
7979 return reloc_type
== 3; /* R_CRIS_32. */
7982 return reloc_type
== 3; /* R_CR16_NUM32. */
7984 return reloc_type
== 15; /* R_CRX_NUM32. */
7986 return reloc_type
== 1;
7987 case EM_CYGNUS_D10V
:
7989 return reloc_type
== 6; /* R_D10V_32. */
7990 case EM_CYGNUS_D30V
:
7992 return reloc_type
== 12; /* R_D30V_32_NORMAL. */
7994 return reloc_type
== 3; /* R_DLX_RELOC_32. */
7995 case EM_CYGNUS_FR30
:
7997 return reloc_type
== 3; /* R_FR30_32. */
8001 return reloc_type
== 1; /* R_H8_DIR32. */
8003 return reloc_type
== 0x65; /* R_IA64_SECREL32LSB. */
8006 return reloc_type
== 2; /* R_IP2K_32. */
8008 return reloc_type
== 2; /* R_IQ2000_32. */
8009 case EM_LATTICEMICO32
:
8010 return reloc_type
== 3; /* R_LM32_32. */
8013 return reloc_type
== 3; /* R_M32C_32. */
8015 return reloc_type
== 34; /* R_M32R_32_RELA. */
8017 return reloc_type
== 1; /* R_MCORE_ADDR32. */
8019 return reloc_type
== 4; /* R_MEP_32. */
8021 return reloc_type
== 2; /* R_MIPS_32. */
8023 return reloc_type
== 4; /* R_MMIX_32. */
8024 case EM_CYGNUS_MN10200
:
8026 return reloc_type
== 1; /* R_MN10200_32. */
8027 case EM_CYGNUS_MN10300
:
8029 return reloc_type
== 1; /* R_MN10300_32. */
8032 return reloc_type
== 1; /* R_MSP43_32. */
8034 return reloc_type
== 2; /* R_MT_32. */
8035 case EM_ALTERA_NIOS2
:
8037 return reloc_type
== 1; /* R_NIOS_32. */
8040 return reloc_type
== 1; /* R_OR32_32. */
8042 return (reloc_type
== 1 /* R_PARISC_DIR32. */
8043 || reloc_type
== 41); /* R_PARISC_SECREL32. */
8046 return reloc_type
== 1; /* R_PJ_DATA_DIR32. */
8048 return reloc_type
== 1; /* R_PPC64_ADDR32. */
8050 return reloc_type
== 1; /* R_PPC_ADDR32. */
8052 return reloc_type
== 1; /* R_I370_ADDR31. */
8055 return reloc_type
== 4; /* R_S390_32. */
8057 return reloc_type
== 8; /* R_SCORE_ABS32. */
8059 return reloc_type
== 1; /* R_SH_DIR32. */
8060 case EM_SPARC32PLUS
:
8063 return reloc_type
== 3 /* R_SPARC_32. */
8064 || reloc_type
== 23; /* R_SPARC_UA32. */
8066 return reloc_type
== 6; /* R_SPU_ADDR32 */
8067 case EM_CYGNUS_V850
:
8069 return reloc_type
== 6; /* R_V850_ABS32. */
8071 return reloc_type
== 1; /* R_VAX_32. */
8074 return reloc_type
== 10; /* R_X86_64_32. */
8076 return reloc_type
== 1; /* R_XSTROMY16_32. */
8079 return reloc_type
== 1; /* R_XTENSA_32. */
8082 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
8083 elf_header
.e_machine
);
8088 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8089 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
8092 is_32bit_pcrel_reloc (unsigned int reloc_type
)
8094 switch (elf_header
.e_machine
)
8098 return reloc_type
== 2; /* R_386_PC32. */
8100 return reloc_type
== 4; /* R_68K_PC32. */
8102 return reloc_type
== 10; /* R_ALPHA_SREL32. */
8104 return reloc_type
== 3; /* R_ARM_REL32 */
8106 return reloc_type
== 9; /* R_PARISC_PCREL32. */
8108 return reloc_type
== 26; /* R_PPC_REL32. */
8110 return reloc_type
== 26; /* R_PPC64_REL32. */
8113 return reloc_type
== 5; /* R_390_PC32. */
8115 return reloc_type
== 2; /* R_SH_REL32. */
8116 case EM_SPARC32PLUS
:
8119 return reloc_type
== 6; /* R_SPARC_DISP32. */
8121 return reloc_type
== 13; /* R_SPU_REL32. */
8124 return reloc_type
== 2; /* R_X86_64_PC32. */
8127 return reloc_type
== 14; /* R_XTENSA_32_PCREL. */
8129 /* Do not abort or issue an error message here. Not all targets use
8130 pc-relative 32-bit relocs in their DWARF debug information and we
8131 have already tested for target coverage in is_32bit_abs_reloc. A
8132 more helpful warning message will be generated by apply_relocations
8133 anyway, so just return. */
8138 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8139 a 64-bit absolute RELA relocation used in DWARF debug sections. */
8142 is_64bit_abs_reloc (unsigned int reloc_type
)
8144 switch (elf_header
.e_machine
)
8147 return reloc_type
== 2; /* R_ALPHA_REFQUAD. */
8149 return reloc_type
== 0x27; /* R_IA64_DIR64LSB. */
8151 return reloc_type
== 80; /* R_PARISC_DIR64. */
8153 return reloc_type
== 38; /* R_PPC64_ADDR64. */
8154 case EM_SPARC32PLUS
:
8157 return reloc_type
== 54; /* R_SPARC_UA64. */
8160 return reloc_type
== 1; /* R_X86_64_64. */
8163 return reloc_type
== 22; /* R_S390_64 */
8165 return reloc_type
== 18; /* R_MIPS_64 */
8171 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
8172 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
8175 is_64bit_pcrel_reloc (unsigned int reloc_type
)
8177 switch (elf_header
.e_machine
)
8180 return reloc_type
== 11; /* R_ALPHA_SREL64 */
8182 return reloc_type
== 0x4f; /* R_IA64_PCREL64LSB */
8184 return reloc_type
== 72; /* R_PARISC_PCREL64 */
8186 return reloc_type
== 44; /* R_PPC64_REL64 */
8187 case EM_SPARC32PLUS
:
8190 return reloc_type
== 46; /* R_SPARC_DISP64 */
8193 return reloc_type
== 24; /* R_X86_64_PC64 */
8196 return reloc_type
== 23; /* R_S390_PC64 */
8202 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8203 a 24-bit absolute RELA relocation used in DWARF debug sections. */
8206 is_24bit_abs_reloc (unsigned int reloc_type
)
8208 switch (elf_header
.e_machine
)
8210 case EM_CYGNUS_MN10200
:
8212 return reloc_type
== 4; /* R_MN10200_24. */
8218 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8219 a 16-bit absolute RELA relocation used in DWARF debug sections. */
8222 is_16bit_abs_reloc (unsigned int reloc_type
)
8224 switch (elf_header
.e_machine
)
8228 return reloc_type
== 4; /* R_AVR_16. */
8229 case EM_CYGNUS_D10V
:
8231 return reloc_type
== 3; /* R_D10V_16. */
8235 return reloc_type
== R_H8_DIR16
;
8238 return reloc_type
== 1; /* R_IP2K_16. */
8241 return reloc_type
== 1; /* R_M32C_16 */
8244 return reloc_type
== 5; /* R_MSP430_16_BYTE. */
8245 case EM_ALTERA_NIOS2
:
8247 return reloc_type
== 9; /* R_NIOS_16. */
8253 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
8254 relocation entries (possibly formerly used for SHT_GROUP sections). */
8257 is_none_reloc (unsigned int reloc_type
)
8259 switch (elf_header
.e_machine
)
8261 case EM_68K
: /* R_68K_NONE. */
8262 case EM_386
: /* R_386_NONE. */
8263 case EM_SPARC32PLUS
:
8265 case EM_SPARC
: /* R_SPARC_NONE. */
8266 case EM_MIPS
: /* R_MIPS_NONE. */
8267 case EM_PARISC
: /* R_PARISC_NONE. */
8268 case EM_ALPHA
: /* R_ALPHA_NONE. */
8269 case EM_PPC
: /* R_PPC_NONE. */
8270 case EM_PPC64
: /* R_PPC64_NONE. */
8271 case EM_ARM
: /* R_ARM_NONE. */
8272 case EM_IA_64
: /* R_IA64_NONE. */
8273 case EM_SH
: /* R_SH_NONE. */
8275 case EM_S390
: /* R_390_NONE. */
8276 case EM_CRIS
: /* R_CRIS_NONE. */
8277 case EM_X86_64
: /* R_X86_64_NONE. */
8278 case EM_L1OM
: /* R_X86_64_NONE. */
8279 case EM_MN10300
: /* R_MN10300_NONE. */
8280 case EM_M32R
: /* R_M32R_NONE. */
8281 return reloc_type
== 0;
8284 return (reloc_type
== 0 /* R_XTENSA_NONE. */
8285 || reloc_type
== 17 /* R_XTENSA_DIFF8. */
8286 || reloc_type
== 18 /* R_XTENSA_DIFF16. */
8287 || reloc_type
== 19 /* R_XTENSA_DIFF32. */);
8292 /* Apply relocations to a section.
8293 Note: So far support has been added only for those relocations
8294 which can be found in debug sections.
8295 FIXME: Add support for more relocations ? */
8298 apply_relocations (void * file
,
8299 Elf_Internal_Shdr
* section
,
8300 unsigned char * start
)
8302 Elf_Internal_Shdr
* relsec
;
8303 unsigned char * end
= start
+ section
->sh_size
;
8305 if (elf_header
.e_type
!= ET_REL
)
8308 /* Find the reloc section associated with the section. */
8309 for (relsec
= section_headers
;
8310 relsec
< section_headers
+ elf_header
.e_shnum
;
8313 bfd_boolean is_rela
;
8314 unsigned long num_relocs
;
8315 Elf_Internal_Rela
* relocs
;
8316 Elf_Internal_Rela
* rp
;
8317 Elf_Internal_Shdr
* symsec
;
8318 Elf_Internal_Sym
* symtab
;
8319 Elf_Internal_Sym
* sym
;
8321 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
8322 || relsec
->sh_info
>= elf_header
.e_shnum
8323 || section_headers
+ relsec
->sh_info
!= section
8324 || relsec
->sh_size
== 0
8325 || relsec
->sh_link
>= elf_header
.e_shnum
)
8328 is_rela
= relsec
->sh_type
== SHT_RELA
;
8332 if (!slurp_rela_relocs ((FILE *) file
, relsec
->sh_offset
,
8333 relsec
->sh_size
, & relocs
, & num_relocs
))
8338 if (!slurp_rel_relocs ((FILE *) file
, relsec
->sh_offset
,
8339 relsec
->sh_size
, & relocs
, & num_relocs
))
8343 /* SH uses RELA but uses in place value instead of the addend field. */
8344 if (elf_header
.e_machine
== EM_SH
)
8347 symsec
= section_headers
+ relsec
->sh_link
;
8348 symtab
= GET_ELF_SYMBOLS ((FILE *) file
, symsec
);
8350 for (rp
= relocs
; rp
< relocs
+ num_relocs
; ++rp
)
8353 unsigned int reloc_type
;
8354 unsigned int reloc_size
;
8355 unsigned char * loc
;
8357 reloc_type
= get_reloc_type (rp
->r_info
);
8359 if (target_specific_reloc_handling (rp
, start
, symtab
))
8361 else if (is_none_reloc (reloc_type
))
8363 else if (is_32bit_abs_reloc (reloc_type
)
8364 || is_32bit_pcrel_reloc (reloc_type
))
8366 else if (is_64bit_abs_reloc (reloc_type
)
8367 || is_64bit_pcrel_reloc (reloc_type
))
8369 else if (is_24bit_abs_reloc (reloc_type
))
8371 else if (is_16bit_abs_reloc (reloc_type
))
8375 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
8376 reloc_type
, SECTION_NAME (section
));
8380 loc
= start
+ rp
->r_offset
;
8381 if ((loc
+ reloc_size
) > end
)
8383 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
8384 (unsigned long) rp
->r_offset
,
8385 SECTION_NAME (section
));
8389 sym
= symtab
+ get_reloc_symindex (rp
->r_info
);
8391 /* If the reloc has a symbol associated with it,
8392 make sure that it is of an appropriate type.
8394 Relocations against symbols without type can happen.
8395 Gcc -feliminate-dwarf2-dups may generate symbols
8396 without type for debug info.
8398 Icc generates relocations against function symbols
8399 instead of local labels.
8401 Relocations against object symbols can happen, eg when
8402 referencing a global array. For an example of this see
8403 the _clz.o binary in libgcc.a. */
8405 && ELF_ST_TYPE (sym
->st_info
) > STT_SECTION
)
8407 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
8408 get_symbol_type (ELF_ST_TYPE (sym
->st_info
)),
8409 (long int)(rp
- relocs
),
8410 SECTION_NAME (relsec
));
8416 addend
+= rp
->r_addend
;
8417 /* R_XTENSA_32 and R_PJ_DATA_DIR32 are partial_inplace. */
8419 || (elf_header
.e_machine
== EM_XTENSA
8421 || ((elf_header
.e_machine
== EM_PJ
8422 || elf_header
.e_machine
== EM_PJ_OLD
)
8423 && reloc_type
== 1))
8424 addend
+= byte_get (loc
, reloc_size
);
8426 if (is_32bit_pcrel_reloc (reloc_type
)
8427 || is_64bit_pcrel_reloc (reloc_type
))
8429 /* On HPPA, all pc-relative relocations are biased by 8. */
8430 if (elf_header
.e_machine
== EM_PARISC
)
8432 byte_put (loc
, (addend
+ sym
->st_value
) - rp
->r_offset
,
8436 byte_put (loc
, addend
+ sym
->st_value
, reloc_size
);
8445 #ifdef SUPPORT_DISASSEMBLY
8447 disassemble_section (Elf_Internal_Shdr
* section
, FILE * file
)
8449 printf (_("\nAssembly dump of section %s\n"),
8450 SECTION_NAME (section
));
8452 /* XXX -- to be done --- XXX */
8458 /* Reads in the contents of SECTION from FILE, returning a pointer
8459 to a malloc'ed buffer or NULL if something went wrong. */
8462 get_section_contents (Elf_Internal_Shdr
* section
, FILE * file
)
8464 bfd_size_type num_bytes
;
8466 num_bytes
= section
->sh_size
;
8468 if (num_bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
8470 printf (_("\nSection '%s' has no data to dump.\n"),
8471 SECTION_NAME (section
));
8475 return (char *) get_data (NULL
, file
, section
->sh_offset
, 1, num_bytes
,
8476 _("section contents"));
8481 dump_section_as_strings (Elf_Internal_Shdr
* section
, FILE * file
)
8483 Elf_Internal_Shdr
* relsec
;
8484 bfd_size_type num_bytes
;
8489 char * name
= SECTION_NAME (section
);
8490 bfd_boolean some_strings_shown
;
8492 start
= get_section_contents (section
, file
);
8496 printf (_("\nString dump of section '%s':\n"), name
);
8498 /* If the section being dumped has relocations against it the user might
8499 be expecting these relocations to have been applied. Check for this
8500 case and issue a warning message in order to avoid confusion.
8501 FIXME: Maybe we ought to have an option that dumps a section with
8503 for (relsec
= section_headers
;
8504 relsec
< section_headers
+ elf_header
.e_shnum
;
8507 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
8508 || relsec
->sh_info
>= elf_header
.e_shnum
8509 || section_headers
+ relsec
->sh_info
!= section
8510 || relsec
->sh_size
== 0
8511 || relsec
->sh_link
>= elf_header
.e_shnum
)
8514 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
8518 num_bytes
= section
->sh_size
;
8519 addr
= section
->sh_addr
;
8521 end
= start
+ num_bytes
;
8522 some_strings_shown
= FALSE
;
8526 while (!ISPRINT (* data
))
8533 printf (" [%6tx] %s\n", data
- start
, data
);
8535 printf (" [%6Ix] %s\n", (size_t) (data
- start
), data
);
8537 data
+= strlen (data
);
8538 some_strings_shown
= TRUE
;
8542 if (! some_strings_shown
)
8543 printf (_(" No strings found in this section."));
8551 dump_section_as_bytes (Elf_Internal_Shdr
* section
,
8553 bfd_boolean relocate
)
8555 Elf_Internal_Shdr
* relsec
;
8556 bfd_size_type bytes
;
8558 unsigned char * data
;
8559 unsigned char * start
;
8561 start
= (unsigned char *) get_section_contents (section
, file
);
8565 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
8569 apply_relocations (file
, section
, start
);
8573 /* If the section being dumped has relocations against it the user might
8574 be expecting these relocations to have been applied. Check for this
8575 case and issue a warning message in order to avoid confusion.
8576 FIXME: Maybe we ought to have an option that dumps a section with
8578 for (relsec
= section_headers
;
8579 relsec
< section_headers
+ elf_header
.e_shnum
;
8582 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
8583 || relsec
->sh_info
>= elf_header
.e_shnum
8584 || section_headers
+ relsec
->sh_info
!= section
8585 || relsec
->sh_size
== 0
8586 || relsec
->sh_link
>= elf_header
.e_shnum
)
8589 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
8594 addr
= section
->sh_addr
;
8595 bytes
= section
->sh_size
;
8604 lbytes
= (bytes
> 16 ? 16 : bytes
);
8606 printf (" 0x%8.8lx ", (unsigned long) addr
);
8608 for (j
= 0; j
< 16; j
++)
8611 printf ("%2.2x", data
[j
]);
8619 for (j
= 0; j
< lbytes
; j
++)
8622 if (k
>= ' ' && k
< 0x7f)
8640 /* Uncompresses a section that was compressed using zlib, in place.
8641 This is a copy of bfd_uncompress_section_contents, in bfd/compress.c */
8644 uncompress_section_contents (unsigned char ** buffer
, dwarf_size_type
* size
)
8647 /* These are just to quiet gcc. */
8652 dwarf_size_type compressed_size
= *size
;
8653 unsigned char * compressed_buffer
= *buffer
;
8654 dwarf_size_type uncompressed_size
;
8655 unsigned char * uncompressed_buffer
;
8658 dwarf_size_type header_size
= 12;
8660 /* Read the zlib header. In this case, it should be "ZLIB" followed
8661 by the uncompressed section size, 8 bytes in big-endian order. */
8662 if (compressed_size
< header_size
8663 || ! streq ((char *) compressed_buffer
, "ZLIB"))
8666 uncompressed_size
= compressed_buffer
[4]; uncompressed_size
<<= 8;
8667 uncompressed_size
+= compressed_buffer
[5]; uncompressed_size
<<= 8;
8668 uncompressed_size
+= compressed_buffer
[6]; uncompressed_size
<<= 8;
8669 uncompressed_size
+= compressed_buffer
[7]; uncompressed_size
<<= 8;
8670 uncompressed_size
+= compressed_buffer
[8]; uncompressed_size
<<= 8;
8671 uncompressed_size
+= compressed_buffer
[9]; uncompressed_size
<<= 8;
8672 uncompressed_size
+= compressed_buffer
[10]; uncompressed_size
<<= 8;
8673 uncompressed_size
+= compressed_buffer
[11];
8675 /* It is possible the section consists of several compressed
8676 buffers concatenated together, so we uncompress in a loop. */
8680 strm
.avail_in
= compressed_size
- header_size
;
8681 strm
.next_in
= (Bytef
*) compressed_buffer
+ header_size
;
8682 strm
.avail_out
= uncompressed_size
;
8683 uncompressed_buffer
= (unsigned char *) xmalloc (uncompressed_size
);
8685 rc
= inflateInit (& strm
);
8686 while (strm
.avail_in
> 0)
8690 strm
.next_out
= ((Bytef
*) uncompressed_buffer
8691 + (uncompressed_size
- strm
.avail_out
));
8692 rc
= inflate (&strm
, Z_FINISH
);
8693 if (rc
!= Z_STREAM_END
)
8695 rc
= inflateReset (& strm
);
8697 rc
= inflateEnd (& strm
);
8699 || strm
.avail_out
!= 0)
8702 free (compressed_buffer
);
8703 *buffer
= uncompressed_buffer
;
8704 *size
= uncompressed_size
;
8708 free (uncompressed_buffer
);
8710 #endif /* HAVE_ZLIB_H */
8714 load_specific_debug_section (enum dwarf_section_display_enum debug
,
8715 Elf_Internal_Shdr
* sec
, void * file
)
8717 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
8719 int section_is_compressed
;
8721 /* If it is already loaded, do nothing. */
8722 if (section
->start
!= NULL
)
8725 section_is_compressed
= section
->name
== section
->compressed_name
;
8727 snprintf (buf
, sizeof (buf
), _("%s section data"), section
->name
);
8728 section
->address
= sec
->sh_addr
;
8729 section
->size
= sec
->sh_size
;
8730 section
->start
= (unsigned char *) get_data (NULL
, (FILE *) file
,
8733 if (section
->start
== NULL
)
8736 if (section_is_compressed
)
8737 if (! uncompress_section_contents (§ion
->start
, §ion
->size
))
8740 if (debug_displays
[debug
].relocate
)
8741 apply_relocations ((FILE *) file
, sec
, section
->start
);
8747 load_debug_section (enum dwarf_section_display_enum debug
, void * file
)
8749 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
8750 Elf_Internal_Shdr
* sec
;
8752 /* Locate the debug section. */
8753 sec
= find_section (section
->uncompressed_name
);
8755 section
->name
= section
->uncompressed_name
;
8758 sec
= find_section (section
->compressed_name
);
8760 section
->name
= section
->compressed_name
;
8765 return load_specific_debug_section (debug
, sec
, (FILE *) file
);
8769 free_debug_section (enum dwarf_section_display_enum debug
)
8771 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
8773 if (section
->start
== NULL
)
8776 free ((char *) section
->start
);
8777 section
->start
= NULL
;
8778 section
->address
= 0;
8783 display_debug_section (Elf_Internal_Shdr
* section
, FILE * file
)
8785 char * name
= SECTION_NAME (section
);
8786 bfd_size_type length
;
8790 length
= section
->sh_size
;
8793 printf (_("\nSection '%s' has no debugging data.\n"), name
);
8796 if (section
->sh_type
== SHT_NOBITS
)
8798 /* There is no point in dumping the contents of a debugging section
8799 which has the NOBITS type - the bits in the file will be random.
8800 This can happen when a file containing a .eh_frame section is
8801 stripped with the --only-keep-debug command line option. */
8802 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"), name
);
8806 if (const_strneq (name
, ".gnu.linkonce.wi."))
8807 name
= ".debug_info";
8809 /* See if we know how to display the contents of this section. */
8810 for (i
= 0; i
< max
; i
++)
8811 if (streq (debug_displays
[i
].section
.uncompressed_name
, name
)
8812 || streq (debug_displays
[i
].section
.compressed_name
, name
))
8814 struct dwarf_section
* sec
= &debug_displays
[i
].section
;
8815 int secondary
= (section
!= find_section (name
));
8818 free_debug_section ((enum dwarf_section_display_enum
) i
);
8820 if (streq (sec
->uncompressed_name
, name
))
8821 sec
->name
= sec
->uncompressed_name
;
8823 sec
->name
= sec
->compressed_name
;
8824 if (load_specific_debug_section ((enum dwarf_section_display_enum
) i
,
8827 result
&= debug_displays
[i
].display (sec
, file
);
8829 if (secondary
|| (i
!= info
&& i
!= abbrev
))
8830 free_debug_section ((enum dwarf_section_display_enum
) i
);
8838 printf (_("Unrecognized debug section: %s\n"), name
);
8845 /* Set DUMP_SECTS for all sections where dumps were requested
8846 based on section name. */
8849 initialise_dumps_byname (void)
8851 struct dump_list_entry
* cur
;
8853 for (cur
= dump_sects_byname
; cur
; cur
= cur
->next
)
8858 for (i
= 0, any
= 0; i
< elf_header
.e_shnum
; i
++)
8859 if (streq (SECTION_NAME (section_headers
+ i
), cur
->name
))
8861 request_dump_bynumber (i
, cur
->type
);
8866 warn (_("Section '%s' was not dumped because it does not exist!\n"),
8872 process_section_contents (FILE * file
)
8874 Elf_Internal_Shdr
* section
;
8880 initialise_dumps_byname ();
8882 for (i
= 0, section
= section_headers
;
8883 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
8886 #ifdef SUPPORT_DISASSEMBLY
8887 if (dump_sects
[i
] & DISASS_DUMP
)
8888 disassemble_section (section
, file
);
8890 if (dump_sects
[i
] & HEX_DUMP
)
8891 dump_section_as_bytes (section
, file
, FALSE
);
8893 if (dump_sects
[i
] & RELOC_DUMP
)
8894 dump_section_as_bytes (section
, file
, TRUE
);
8896 if (dump_sects
[i
] & STRING_DUMP
)
8897 dump_section_as_strings (section
, file
);
8899 if (dump_sects
[i
] & DEBUG_DUMP
)
8900 display_debug_section (section
, file
);
8903 /* Check to see if the user requested a
8904 dump of a section that does not exist. */
8905 while (i
++ < num_dump_sects
)
8907 warn (_("Section %d was not dumped because it does not exist!\n"), i
);
8911 process_mips_fpe_exception (int mask
)
8916 if (mask
& OEX_FPU_INEX
)
8917 fputs ("INEX", stdout
), first
= 0;
8918 if (mask
& OEX_FPU_UFLO
)
8919 printf ("%sUFLO", first
? "" : "|"), first
= 0;
8920 if (mask
& OEX_FPU_OFLO
)
8921 printf ("%sOFLO", first
? "" : "|"), first
= 0;
8922 if (mask
& OEX_FPU_DIV0
)
8923 printf ("%sDIV0", first
? "" : "|"), first
= 0;
8924 if (mask
& OEX_FPU_INVAL
)
8925 printf ("%sINVAL", first
? "" : "|");
8928 fputs ("0", stdout
);
8931 /* ARM EABI attributes section. */
8936 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
8938 const char ** table
;
8939 } arm_attr_public_tag
;
8941 static const char * arm_attr_tag_CPU_arch
[] =
8942 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
8943 "v6K", "v7", "v6-M", "v6S-M"};
8944 static const char * arm_attr_tag_ARM_ISA_use
[] = {"No", "Yes"};
8945 static const char * arm_attr_tag_THUMB_ISA_use
[] =
8946 {"No", "Thumb-1", "Thumb-2"};
8947 static const char * arm_attr_tag_VFP_arch
[] =
8948 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16"};
8949 static const char * arm_attr_tag_WMMX_arch
[] = {"No", "WMMXv1", "WMMXv2"};
8950 static const char * arm_attr_tag_Advanced_SIMD_arch
[] = {"No", "NEONv1"};
8951 static const char * arm_attr_tag_PCS_config
[] =
8952 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
8953 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
8954 static const char * arm_attr_tag_ABI_PCS_R9_use
[] =
8955 {"V6", "SB", "TLS", "Unused"};
8956 static const char * arm_attr_tag_ABI_PCS_RW_data
[] =
8957 {"Absolute", "PC-relative", "SB-relative", "None"};
8958 static const char * arm_attr_tag_ABI_PCS_RO_data
[] =
8959 {"Absolute", "PC-relative", "None"};
8960 static const char * arm_attr_tag_ABI_PCS_GOT_use
[] =
8961 {"None", "direct", "GOT-indirect"};
8962 static const char * arm_attr_tag_ABI_PCS_wchar_t
[] =
8963 {"None", "??? 1", "2", "??? 3", "4"};
8964 static const char * arm_attr_tag_ABI_FP_rounding
[] = {"Unused", "Needed"};
8965 static const char * arm_attr_tag_ABI_FP_denormal
[] =
8966 {"Unused", "Needed", "Sign only"};
8967 static const char * arm_attr_tag_ABI_FP_exceptions
[] = {"Unused", "Needed"};
8968 static const char * arm_attr_tag_ABI_FP_user_exceptions
[] = {"Unused", "Needed"};
8969 static const char * arm_attr_tag_ABI_FP_number_model
[] =
8970 {"Unused", "Finite", "RTABI", "IEEE 754"};
8971 static const char * arm_attr_tag_ABI_align8_needed
[] = {"No", "Yes", "4-byte"};
8972 static const char * arm_attr_tag_ABI_align8_preserved
[] =
8973 {"No", "Yes, except leaf SP", "Yes"};
8974 static const char * arm_attr_tag_ABI_enum_size
[] =
8975 {"Unused", "small", "int", "forced to int"};
8976 static const char * arm_attr_tag_ABI_HardFP_use
[] =
8977 {"As Tag_VFP_arch", "SP only", "DP only", "SP and DP"};
8978 static const char * arm_attr_tag_ABI_VFP_args
[] =
8979 {"AAPCS", "VFP registers", "custom"};
8980 static const char * arm_attr_tag_ABI_WMMX_args
[] =
8981 {"AAPCS", "WMMX registers", "custom"};
8982 static const char * arm_attr_tag_ABI_optimization_goals
[] =
8983 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
8984 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
8985 static const char * arm_attr_tag_ABI_FP_optimization_goals
[] =
8986 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
8987 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
8988 static const char * arm_attr_tag_CPU_unaligned_access
[] = {"None", "v6"};
8989 static const char * arm_attr_tag_VFP_HP_extension
[] =
8990 {"Not Allowed", "Allowed"};
8991 static const char * arm_attr_tag_ABI_FP_16bit_format
[] =
8992 {"None", "IEEE 754", "Alternative Format"};
8993 static const char * arm_attr_tag_T2EE_use
[] = {"Not Allowed", "Allowed"};
8994 static const char * arm_attr_tag_Virtualization_use
[] =
8995 {"Not Allowed", "Allowed"};
8996 static const char * arm_attr_tag_MPextension_use
[] = {"Not Allowed", "Allowed"};
8998 #define LOOKUP(id, name) \
8999 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
9000 static arm_attr_public_tag arm_attr_public_tags
[] =
9002 {4, "CPU_raw_name", 1, NULL
},
9003 {5, "CPU_name", 1, NULL
},
9004 LOOKUP(6, CPU_arch
),
9005 {7, "CPU_arch_profile", 0, NULL
},
9006 LOOKUP(8, ARM_ISA_use
),
9007 LOOKUP(9, THUMB_ISA_use
),
9008 LOOKUP(10, VFP_arch
),
9009 LOOKUP(11, WMMX_arch
),
9010 LOOKUP(12, Advanced_SIMD_arch
),
9011 LOOKUP(13, PCS_config
),
9012 LOOKUP(14, ABI_PCS_R9_use
),
9013 LOOKUP(15, ABI_PCS_RW_data
),
9014 LOOKUP(16, ABI_PCS_RO_data
),
9015 LOOKUP(17, ABI_PCS_GOT_use
),
9016 LOOKUP(18, ABI_PCS_wchar_t
),
9017 LOOKUP(19, ABI_FP_rounding
),
9018 LOOKUP(20, ABI_FP_denormal
),
9019 LOOKUP(21, ABI_FP_exceptions
),
9020 LOOKUP(22, ABI_FP_user_exceptions
),
9021 LOOKUP(23, ABI_FP_number_model
),
9022 LOOKUP(24, ABI_align8_needed
),
9023 LOOKUP(25, ABI_align8_preserved
),
9024 LOOKUP(26, ABI_enum_size
),
9025 LOOKUP(27, ABI_HardFP_use
),
9026 LOOKUP(28, ABI_VFP_args
),
9027 LOOKUP(29, ABI_WMMX_args
),
9028 LOOKUP(30, ABI_optimization_goals
),
9029 LOOKUP(31, ABI_FP_optimization_goals
),
9030 {32, "compatibility", 0, NULL
},
9031 LOOKUP(34, CPU_unaligned_access
),
9032 LOOKUP(36, VFP_HP_extension
),
9033 LOOKUP(38, ABI_FP_16bit_format
),
9034 {64, "nodefaults", 0, NULL
},
9035 {65, "also_compatible_with", 0, NULL
},
9036 LOOKUP(66, T2EE_use
),
9037 {67, "conformance", 1, NULL
},
9038 LOOKUP(68, Virtualization_use
),
9039 LOOKUP(70, MPextension_use
)
9043 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
9047 read_uleb128 (unsigned char * p
, unsigned int * plen
)
9061 val
|= ((unsigned int)c
& 0x7f) << shift
;
9070 static unsigned char *
9071 display_arm_attribute (unsigned char * p
)
9076 arm_attr_public_tag
* attr
;
9080 tag
= read_uleb128 (p
, &len
);
9083 for (i
= 0; i
< ARRAY_SIZE (arm_attr_public_tags
); i
++)
9085 if (arm_attr_public_tags
[i
].tag
== tag
)
9087 attr
= &arm_attr_public_tags
[i
];
9094 printf (" Tag_%s: ", attr
->name
);
9100 case 7: /* Tag_CPU_arch_profile. */
9101 val
= read_uleb128 (p
, &len
);
9105 case 0: printf ("None\n"); break;
9106 case 'A': printf ("Application\n"); break;
9107 case 'R': printf ("Realtime\n"); break;
9108 case 'M': printf ("Microcontroller\n"); break;
9109 default: printf ("??? (%d)\n", val
); break;
9113 case 32: /* Tag_compatibility. */
9114 val
= read_uleb128 (p
, &len
);
9116 printf ("flag = %d, vendor = %s\n", val
, p
);
9117 p
+= strlen ((char *) p
) + 1;
9120 case 64: /* Tag_nodefaults. */
9125 case 65: /* Tag_also_compatible_with. */
9126 val
= read_uleb128 (p
, &len
);
9128 if (val
== 6 /* Tag_CPU_arch. */)
9130 val
= read_uleb128 (p
, &len
);
9132 if ((unsigned int)val
>= ARRAY_SIZE (arm_attr_tag_CPU_arch
))
9133 printf ("??? (%d)\n", val
);
9135 printf ("%s\n", arm_attr_tag_CPU_arch
[val
]);
9139 while (*(p
++) != '\0' /* NUL terminator. */);
9153 assert (attr
->type
& 0x80);
9154 val
= read_uleb128 (p
, &len
);
9156 type
= attr
->type
& 0x7f;
9158 printf ("??? (%d)\n", val
);
9160 printf ("%s\n", attr
->table
[val
]);
9167 type
= 1; /* String. */
9169 type
= 2; /* uleb128. */
9170 printf (" Tag_unknown_%d: ", tag
);
9175 printf ("\"%s\"\n", p
);
9176 p
+= strlen ((char *) p
) + 1;
9180 val
= read_uleb128 (p
, &len
);
9182 printf ("%d (0x%x)\n", val
, val
);
9188 static unsigned char *
9189 display_gnu_attribute (unsigned char * p
,
9190 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, int))
9197 tag
= read_uleb128 (p
, &len
);
9200 /* Tag_compatibility is the only generic GNU attribute defined at
9204 val
= read_uleb128 (p
, &len
);
9206 printf ("flag = %d, vendor = %s\n", val
, p
);
9207 p
+= strlen ((char *) p
) + 1;
9211 if ((tag
& 2) == 0 && display_proc_gnu_attribute
)
9212 return display_proc_gnu_attribute (p
, tag
);
9215 type
= 1; /* String. */
9217 type
= 2; /* uleb128. */
9218 printf (" Tag_unknown_%d: ", tag
);
9222 printf ("\"%s\"\n", p
);
9223 p
+= strlen ((char *) p
) + 1;
9227 val
= read_uleb128 (p
, &len
);
9229 printf ("%d (0x%x)\n", val
, val
);
9235 static unsigned char *
9236 display_power_gnu_attribute (unsigned char * p
, int tag
)
9242 if (tag
== Tag_GNU_Power_ABI_FP
)
9244 val
= read_uleb128 (p
, &len
);
9246 printf (" Tag_GNU_Power_ABI_FP: ");
9251 printf ("Hard or soft float\n");
9254 printf ("Hard float\n");
9257 printf ("Soft float\n");
9260 printf ("Single-precision hard float\n");
9263 printf ("??? (%d)\n", val
);
9269 if (tag
== Tag_GNU_Power_ABI_Vector
)
9271 val
= read_uleb128 (p
, &len
);
9273 printf (" Tag_GNU_Power_ABI_Vector: ");
9280 printf ("Generic\n");
9283 printf ("AltiVec\n");
9289 printf ("??? (%d)\n", val
);
9295 if (tag
== Tag_GNU_Power_ABI_Struct_Return
)
9297 val
= read_uleb128 (p
, &len
);
9299 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
9309 printf ("Memory\n");
9312 printf ("??? (%d)\n", val
);
9319 type
= 1; /* String. */
9321 type
= 2; /* uleb128. */
9322 printf (" Tag_unknown_%d: ", tag
);
9326 printf ("\"%s\"\n", p
);
9327 p
+= strlen ((char *) p
) + 1;
9331 val
= read_uleb128 (p
, &len
);
9333 printf ("%d (0x%x)\n", val
, val
);
9339 static unsigned char *
9340 display_mips_gnu_attribute (unsigned char * p
, int tag
)
9346 if (tag
== Tag_GNU_MIPS_ABI_FP
)
9348 val
= read_uleb128 (p
, &len
);
9350 printf (" Tag_GNU_MIPS_ABI_FP: ");
9355 printf ("Hard or soft float\n");
9358 printf ("Hard float (-mdouble-float)\n");
9361 printf ("Hard float (-msingle-float)\n");
9364 printf ("Soft float\n");
9367 printf ("64-bit float (-mips32r2 -mfp64)\n");
9370 printf ("??? (%d)\n", val
);
9377 type
= 1; /* String. */
9379 type
= 2; /* uleb128. */
9380 printf (" Tag_unknown_%d: ", tag
);
9384 printf ("\"%s\"\n", p
);
9385 p
+= strlen ((char *) p
) + 1;
9389 val
= read_uleb128 (p
, &len
);
9391 printf ("%d (0x%x)\n", val
, val
);
9398 process_attributes (FILE * file
,
9399 const char * public_name
,
9400 unsigned int proc_type
,
9401 unsigned char * (* display_pub_attribute
) (unsigned char *),
9402 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, int))
9404 Elf_Internal_Shdr
* sect
;
9405 unsigned char * contents
;
9407 unsigned char * end
;
9408 bfd_vma section_len
;
9412 /* Find the section header so that we get the size. */
9413 for (i
= 0, sect
= section_headers
;
9414 i
< elf_header
.e_shnum
;
9417 if (sect
->sh_type
!= proc_type
&& sect
->sh_type
!= SHT_GNU_ATTRIBUTES
)
9420 contents
= (unsigned char *) get_data (NULL
, file
, sect
->sh_offset
, 1,
9421 sect
->sh_size
, _("attributes"));
9422 if (contents
== NULL
)
9428 len
= sect
->sh_size
- 1;
9434 bfd_boolean public_section
;
9435 bfd_boolean gnu_section
;
9437 section_len
= byte_get (p
, 4);
9440 if (section_len
> len
)
9442 printf (_("ERROR: Bad section length (%d > %d)\n"),
9443 (int) section_len
, (int) len
);
9448 printf ("Attribute Section: %s\n", p
);
9450 if (public_name
&& streq ((char *) p
, public_name
))
9451 public_section
= TRUE
;
9453 public_section
= FALSE
;
9455 if (streq ((char *) p
, "gnu"))
9458 gnu_section
= FALSE
;
9460 namelen
= strlen ((char *) p
) + 1;
9462 section_len
-= namelen
+ 4;
9464 while (section_len
> 0)
9470 size
= byte_get (p
, 4);
9471 if (size
> section_len
)
9473 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
9474 (int) size
, (int) section_len
);
9478 section_len
-= size
;
9485 printf ("File Attributes\n");
9488 printf ("Section Attributes:");
9491 printf ("Symbol Attributes:");
9497 val
= read_uleb128 (p
, &i
);
9501 printf (" %d", val
);
9506 printf ("Unknown tag: %d\n", tag
);
9507 public_section
= FALSE
;
9514 p
= display_pub_attribute (p
);
9516 else if (gnu_section
)
9519 p
= display_gnu_attribute (p
,
9520 display_proc_gnu_attribute
);
9524 /* ??? Do something sensible, like dump hex. */
9525 printf (" Unknown section contexts\n");
9532 printf (_("Unknown format '%c'\n"), *p
);
9540 process_arm_specific (FILE * file
)
9542 return process_attributes (file
, "aeabi", SHT_ARM_ATTRIBUTES
,
9543 display_arm_attribute
, NULL
);
9547 process_power_specific (FILE * file
)
9549 return process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
9550 display_power_gnu_attribute
);
9553 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
9554 Print the Address, Access and Initial fields of an entry at VMA ADDR
9555 and return the VMA of the next entry. */
9558 print_mips_got_entry (unsigned char * data
, bfd_vma pltgot
, bfd_vma addr
)
9561 print_vma (addr
, LONG_HEX
);
9563 if (addr
< pltgot
+ 0xfff0)
9564 printf ("%6d(gp)", (int) (addr
- pltgot
- 0x7ff0));
9566 printf ("%10s", "");
9569 printf ("%*s", is_32bit_elf
? 8 : 16, "<unknown>");
9574 entry
= byte_get (data
+ addr
- pltgot
, is_32bit_elf
? 4 : 8);
9575 print_vma (entry
, LONG_HEX
);
9577 return addr
+ (is_32bit_elf
? 4 : 8);
9580 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
9581 PLTGOT. Print the Address and Initial fields of an entry at VMA
9582 ADDR and return the VMA of the next entry. */
9585 print_mips_pltgot_entry (unsigned char * data
, bfd_vma pltgot
, bfd_vma addr
)
9588 print_vma (addr
, LONG_HEX
);
9591 printf ("%*s", is_32bit_elf
? 8 : 16, "<unknown>");
9596 entry
= byte_get (data
+ addr
- pltgot
, is_32bit_elf
? 4 : 8);
9597 print_vma (entry
, LONG_HEX
);
9599 return addr
+ (is_32bit_elf
? 4 : 8);
9603 process_mips_specific (FILE * file
)
9605 Elf_Internal_Dyn
* entry
;
9606 size_t liblist_offset
= 0;
9607 size_t liblistno
= 0;
9608 size_t conflictsno
= 0;
9609 size_t options_offset
= 0;
9610 size_t conflicts_offset
= 0;
9611 size_t pltrelsz
= 0;
9614 bfd_vma mips_pltgot
= 0;
9616 bfd_vma local_gotno
= 0;
9618 bfd_vma symtabno
= 0;
9620 process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
9621 display_mips_gnu_attribute
);
9623 /* We have a lot of special sections. Thanks SGI! */
9624 if (dynamic_section
== NULL
)
9625 /* No information available. */
9628 for (entry
= dynamic_section
; entry
->d_tag
!= DT_NULL
; ++entry
)
9629 switch (entry
->d_tag
)
9631 case DT_MIPS_LIBLIST
:
9633 = offset_from_vma (file
, entry
->d_un
.d_val
,
9634 liblistno
* sizeof (Elf32_External_Lib
));
9636 case DT_MIPS_LIBLISTNO
:
9637 liblistno
= entry
->d_un
.d_val
;
9639 case DT_MIPS_OPTIONS
:
9640 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
9642 case DT_MIPS_CONFLICT
:
9644 = offset_from_vma (file
, entry
->d_un
.d_val
,
9645 conflictsno
* sizeof (Elf32_External_Conflict
));
9647 case DT_MIPS_CONFLICTNO
:
9648 conflictsno
= entry
->d_un
.d_val
;
9651 pltgot
= entry
->d_un
.d_ptr
;
9653 case DT_MIPS_LOCAL_GOTNO
:
9654 local_gotno
= entry
->d_un
.d_val
;
9656 case DT_MIPS_GOTSYM
:
9657 gotsym
= entry
->d_un
.d_val
;
9659 case DT_MIPS_SYMTABNO
:
9660 symtabno
= entry
->d_un
.d_val
;
9662 case DT_MIPS_PLTGOT
:
9663 mips_pltgot
= entry
->d_un
.d_ptr
;
9666 pltrel
= entry
->d_un
.d_val
;
9669 pltrelsz
= entry
->d_un
.d_val
;
9672 jmprel
= entry
->d_un
.d_ptr
;
9678 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
9680 Elf32_External_Lib
* elib
;
9683 elib
= (Elf32_External_Lib
*) get_data (NULL
, file
, liblist_offset
,
9685 sizeof (Elf32_External_Lib
),
9689 printf ("\nSection '.liblist' contains %lu entries:\n",
9690 (unsigned long) liblistno
);
9691 fputs (" Library Time Stamp Checksum Version Flags\n",
9694 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
9701 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9702 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9703 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9704 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9705 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9707 tmp
= gmtime (&time
);
9708 snprintf (timebuf
, sizeof (timebuf
),
9709 "%04u-%02u-%02uT%02u:%02u:%02u",
9710 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9711 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9713 printf ("%3lu: ", (unsigned long) cnt
);
9714 if (VALID_DYNAMIC_NAME (liblist
.l_name
))
9715 print_symbol (20, GET_DYNAMIC_NAME (liblist
.l_name
));
9717 printf ("<corrupt: %9ld>", liblist
.l_name
);
9718 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
9721 if (liblist
.l_flags
== 0)
9732 { " EXACT_MATCH", LL_EXACT_MATCH
},
9733 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
9734 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
9735 { " EXPORTS", LL_EXPORTS
},
9736 { " DELAY_LOAD", LL_DELAY_LOAD
},
9737 { " DELTA", LL_DELTA
}
9739 int flags
= liblist
.l_flags
;
9742 for (fcnt
= 0; fcnt
< ARRAY_SIZE (l_flags_vals
); ++fcnt
)
9743 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
9745 fputs (l_flags_vals
[fcnt
].name
, stdout
);
9746 flags
^= l_flags_vals
[fcnt
].bit
;
9749 printf (" %#x", (unsigned int) flags
);
9759 if (options_offset
!= 0)
9761 Elf_External_Options
* eopt
;
9762 Elf_Internal_Shdr
* sect
= section_headers
;
9763 Elf_Internal_Options
* iopt
;
9764 Elf_Internal_Options
* option
;
9768 /* Find the section header so that we get the size. */
9769 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
9772 eopt
= (Elf_External_Options
*) get_data (NULL
, file
, options_offset
, 1,
9773 sect
->sh_size
, _("options"));
9776 iopt
= (Elf_Internal_Options
*)
9777 cmalloc ((sect
->sh_size
/ sizeof (eopt
)), sizeof (* iopt
));
9780 error (_("Out of memory\n"));
9787 while (offset
< sect
->sh_size
)
9789 Elf_External_Options
* eoption
;
9791 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
9793 option
->kind
= BYTE_GET (eoption
->kind
);
9794 option
->size
= BYTE_GET (eoption
->size
);
9795 option
->section
= BYTE_GET (eoption
->section
);
9796 option
->info
= BYTE_GET (eoption
->info
);
9798 offset
+= option
->size
;
9804 printf (_("\nSection '%s' contains %d entries:\n"),
9805 SECTION_NAME (sect
), cnt
);
9813 switch (option
->kind
)
9816 /* This shouldn't happen. */
9817 printf (" NULL %d %lx", option
->section
, option
->info
);
9820 printf (" REGINFO ");
9821 if (elf_header
.e_machine
== EM_MIPS
)
9824 Elf32_External_RegInfo
* ereg
;
9825 Elf32_RegInfo reginfo
;
9827 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
9828 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9829 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9830 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9831 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9832 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9833 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9835 printf ("GPR %08lx GP 0x%lx\n",
9837 (unsigned long) reginfo
.ri_gp_value
);
9838 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9839 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9840 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9845 Elf64_External_RegInfo
* ereg
;
9846 Elf64_Internal_RegInfo reginfo
;
9848 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
9849 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9850 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9851 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9852 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9853 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9854 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9856 printf ("GPR %08lx GP 0x",
9857 reginfo
.ri_gprmask
);
9858 printf_vma (reginfo
.ri_gp_value
);
9861 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9862 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9863 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9867 case ODK_EXCEPTIONS
:
9868 fputs (" EXCEPTIONS fpe_min(", stdout
);
9869 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
9870 fputs (") fpe_max(", stdout
);
9871 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
9872 fputs (")", stdout
);
9874 if (option
->info
& OEX_PAGE0
)
9875 fputs (" PAGE0", stdout
);
9876 if (option
->info
& OEX_SMM
)
9877 fputs (" SMM", stdout
);
9878 if (option
->info
& OEX_FPDBUG
)
9879 fputs (" FPDBUG", stdout
);
9880 if (option
->info
& OEX_DISMISS
)
9881 fputs (" DISMISS", stdout
);
9884 fputs (" PAD ", stdout
);
9885 if (option
->info
& OPAD_PREFIX
)
9886 fputs (" PREFIX", stdout
);
9887 if (option
->info
& OPAD_POSTFIX
)
9888 fputs (" POSTFIX", stdout
);
9889 if (option
->info
& OPAD_SYMBOL
)
9890 fputs (" SYMBOL", stdout
);
9893 fputs (" HWPATCH ", stdout
);
9894 if (option
->info
& OHW_R4KEOP
)
9895 fputs (" R4KEOP", stdout
);
9896 if (option
->info
& OHW_R8KPFETCH
)
9897 fputs (" R8KPFETCH", stdout
);
9898 if (option
->info
& OHW_R5KEOP
)
9899 fputs (" R5KEOP", stdout
);
9900 if (option
->info
& OHW_R5KCVTL
)
9901 fputs (" R5KCVTL", stdout
);
9904 fputs (" FILL ", stdout
);
9905 /* XXX Print content of info word? */
9908 fputs (" TAGS ", stdout
);
9909 /* XXX Print content of info word? */
9912 fputs (" HWAND ", stdout
);
9913 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9914 fputs (" R4KEOP_CHECKED", stdout
);
9915 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9916 fputs (" R4KEOP_CLEAN", stdout
);
9919 fputs (" HWOR ", stdout
);
9920 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9921 fputs (" R4KEOP_CHECKED", stdout
);
9922 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9923 fputs (" R4KEOP_CLEAN", stdout
);
9926 printf (" GP_GROUP %#06lx self-contained %#06lx",
9927 option
->info
& OGP_GROUP
,
9928 (option
->info
& OGP_SELF
) >> 16);
9931 printf (" IDENT %#06lx self-contained %#06lx",
9932 option
->info
& OGP_GROUP
,
9933 (option
->info
& OGP_SELF
) >> 16);
9936 /* This shouldn't happen. */
9937 printf (" %3d ??? %d %lx",
9938 option
->kind
, option
->section
, option
->info
);
9942 len
= sizeof (* eopt
);
9943 while (len
< option
->size
)
9944 if (((char *) option
)[len
] >= ' '
9945 && ((char *) option
)[len
] < 0x7f)
9946 printf ("%c", ((char *) option
)[len
++]);
9948 printf ("\\%03o", ((char *) option
)[len
++]);
9950 fputs ("\n", stdout
);
9958 if (conflicts_offset
!= 0 && conflictsno
!= 0)
9960 Elf32_Conflict
* iconf
;
9963 if (dynamic_symbols
== NULL
)
9965 error (_("conflict list found without a dynamic symbol table\n"));
9969 iconf
= (Elf32_Conflict
*) cmalloc (conflictsno
, sizeof (* iconf
));
9972 error (_("Out of memory\n"));
9978 Elf32_External_Conflict
* econf32
;
9980 econf32
= (Elf32_External_Conflict
*)
9981 get_data (NULL
, file
, conflicts_offset
, conflictsno
,
9982 sizeof (* econf32
), _("conflict"));
9986 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9987 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
9993 Elf64_External_Conflict
* econf64
;
9995 econf64
= (Elf64_External_Conflict
*)
9996 get_data (NULL
, file
, conflicts_offset
, conflictsno
,
9997 sizeof (* econf64
), _("conflict"));
10001 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10002 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
10007 printf (_("\nSection '.conflict' contains %lu entries:\n"),
10008 (unsigned long) conflictsno
);
10009 puts (_(" Num: Index Value Name"));
10011 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10013 Elf_Internal_Sym
* psym
= & dynamic_symbols
[iconf
[cnt
]];
10015 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
10016 print_vma (psym
->st_value
, FULL_HEX
);
10018 if (VALID_DYNAMIC_NAME (psym
->st_name
))
10019 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
10021 printf ("<corrupt: %14ld>", psym
->st_name
);
10028 if (pltgot
!= 0 && local_gotno
!= 0)
10030 bfd_vma entry
, local_end
, global_end
;
10032 unsigned char * data
;
10036 addr_size
= (is_32bit_elf
? 4 : 8);
10037 local_end
= pltgot
+ local_gotno
* addr_size
;
10038 global_end
= local_end
+ (symtabno
- gotsym
) * addr_size
;
10040 offset
= offset_from_vma (file
, pltgot
, global_end
- pltgot
);
10041 data
= (unsigned char *) get_data (NULL
, file
, offset
,
10042 global_end
- pltgot
, 1, _("GOT"));
10043 printf (_("\nPrimary GOT:\n"));
10044 printf (_(" Canonical gp value: "));
10045 print_vma (pltgot
+ 0x7ff0, LONG_HEX
);
10048 printf (_(" Reserved entries:\n"));
10049 printf (_(" %*s %10s %*s Purpose\n"),
10050 addr_size
* 2, "Address", "Access",
10051 addr_size
* 2, "Initial");
10052 entry
= print_mips_got_entry (data
, pltgot
, entry
);
10053 printf (" Lazy resolver\n");
10055 && (byte_get (data
+ entry
- pltgot
, addr_size
)
10056 >> (addr_size
* 8 - 1)) != 0)
10058 entry
= print_mips_got_entry (data
, pltgot
, entry
);
10059 printf (" Module pointer (GNU extension)\n");
10063 if (entry
< local_end
)
10065 printf (_(" Local entries:\n"));
10066 printf (_(" %*s %10s %*s\n"),
10067 addr_size
* 2, "Address", "Access",
10068 addr_size
* 2, "Initial");
10069 while (entry
< local_end
)
10071 entry
= print_mips_got_entry (data
, pltgot
, entry
);
10077 if (gotsym
< symtabno
)
10081 printf (_(" Global entries:\n"));
10082 printf (_(" %*s %10s %*s %*s %-7s %3s %s\n"),
10083 addr_size
* 2, "Address", "Access",
10084 addr_size
* 2, "Initial",
10085 addr_size
* 2, "Sym.Val.", "Type", "Ndx", "Name");
10086 sym_width
= (is_32bit_elf
? 80 : 160) - 28 - addr_size
* 6 - 1;
10087 for (i
= gotsym
; i
< symtabno
; i
++)
10089 Elf_Internal_Sym
* psym
;
10091 psym
= dynamic_symbols
+ i
;
10092 entry
= print_mips_got_entry (data
, pltgot
, entry
);
10094 print_vma (psym
->st_value
, LONG_HEX
);
10095 printf (" %-7s %3s ",
10096 get_symbol_type (ELF_ST_TYPE (psym
->st_info
)),
10097 get_symbol_index_type (psym
->st_shndx
));
10098 if (VALID_DYNAMIC_NAME (psym
->st_name
))
10099 print_symbol (sym_width
, GET_DYNAMIC_NAME (psym
->st_name
));
10101 printf ("<corrupt: %14ld>", psym
->st_name
);
10111 if (mips_pltgot
!= 0 && jmprel
!= 0 && pltrel
!= 0 && pltrelsz
!= 0)
10113 bfd_vma entry
, end
;
10114 size_t offset
, rel_offset
;
10115 unsigned long count
, i
;
10116 unsigned char * data
;
10117 int addr_size
, sym_width
;
10118 Elf_Internal_Rela
* rels
;
10120 rel_offset
= offset_from_vma (file
, jmprel
, pltrelsz
);
10121 if (pltrel
== DT_RELA
)
10123 if (!slurp_rela_relocs (file
, rel_offset
, pltrelsz
, &rels
, &count
))
10128 if (!slurp_rel_relocs (file
, rel_offset
, pltrelsz
, &rels
, &count
))
10132 entry
= mips_pltgot
;
10133 addr_size
= (is_32bit_elf
? 4 : 8);
10134 end
= mips_pltgot
+ (2 + count
) * addr_size
;
10136 offset
= offset_from_vma (file
, mips_pltgot
, end
- mips_pltgot
);
10137 data
= (unsigned char *) get_data (NULL
, file
, offset
, end
- mips_pltgot
,
10139 printf (_("\nPLT GOT:\n\n"));
10140 printf (_(" Reserved entries:\n"));
10141 printf (_(" %*s %*s Purpose\n"),
10142 addr_size
* 2, "Address", addr_size
* 2, "Initial");
10143 entry
= print_mips_pltgot_entry (data
, mips_pltgot
, entry
);
10144 printf (" PLT lazy resolver\n");
10145 entry
= print_mips_pltgot_entry (data
, mips_pltgot
, entry
);
10146 printf (" Module pointer\n");
10149 printf (_(" Entries:\n"));
10150 printf (_(" %*s %*s %*s %-7s %3s %s\n"),
10151 addr_size
* 2, "Address",
10152 addr_size
* 2, "Initial",
10153 addr_size
* 2, "Sym.Val.", "Type", "Ndx", "Name");
10154 sym_width
= (is_32bit_elf
? 80 : 160) - 17 - addr_size
* 6 - 1;
10155 for (i
= 0; i
< count
; i
++)
10157 Elf_Internal_Sym
* psym
;
10159 psym
= dynamic_symbols
+ get_reloc_symindex (rels
[i
].r_info
);
10160 entry
= print_mips_pltgot_entry (data
, mips_pltgot
, entry
);
10162 print_vma (psym
->st_value
, LONG_HEX
);
10163 printf (" %-7s %3s ",
10164 get_symbol_type (ELF_ST_TYPE (psym
->st_info
)),
10165 get_symbol_index_type (psym
->st_shndx
));
10166 if (VALID_DYNAMIC_NAME (psym
->st_name
))
10167 print_symbol (sym_width
, GET_DYNAMIC_NAME (psym
->st_name
));
10169 printf ("<corrupt: %14ld>", psym
->st_name
);
10183 process_gnu_liblist (FILE * file
)
10185 Elf_Internal_Shdr
* section
;
10186 Elf_Internal_Shdr
* string_sec
;
10187 Elf32_External_Lib
* elib
;
10189 size_t strtab_size
;
10196 for (i
= 0, section
= section_headers
;
10197 i
< elf_header
.e_shnum
;
10200 switch (section
->sh_type
)
10202 case SHT_GNU_LIBLIST
:
10203 if (section
->sh_link
>= elf_header
.e_shnum
)
10206 elib
= (Elf32_External_Lib
*)
10207 get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
10212 string_sec
= section_headers
+ section
->sh_link
;
10214 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
, 1,
10215 string_sec
->sh_size
,
10216 _("liblist string table"));
10217 strtab_size
= string_sec
->sh_size
;
10220 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
10226 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
10227 SECTION_NAME (section
),
10228 (unsigned long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
10230 puts (" Library Time Stamp Checksum Version Flags");
10232 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
10240 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
10241 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
10242 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
10243 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
10244 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
10246 tmp
= gmtime (&time
);
10247 snprintf (timebuf
, sizeof (timebuf
),
10248 "%04u-%02u-%02uT%02u:%02u:%02u",
10249 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
10250 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
10252 printf ("%3lu: ", (unsigned long) cnt
);
10254 printf ("%-20s", liblist
.l_name
< strtab_size
10255 ? strtab
+ liblist
.l_name
: "<corrupt>");
10257 printf ("%-20.20s", liblist
.l_name
< strtab_size
10258 ? strtab
+ liblist
.l_name
: "<corrupt>");
10259 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
10260 liblist
.l_version
, liblist
.l_flags
);
10270 static const char *
10271 get_note_type (unsigned e_type
)
10273 static char buff
[64];
10275 if (elf_header
.e_type
== ET_CORE
)
10279 return _("NT_AUXV (auxiliary vector)");
10281 return _("NT_PRSTATUS (prstatus structure)");
10283 return _("NT_FPREGSET (floating point registers)");
10285 return _("NT_PRPSINFO (prpsinfo structure)");
10286 case NT_TASKSTRUCT
:
10287 return _("NT_TASKSTRUCT (task structure)");
10289 return _("NT_PRXFPREG (user_xfpregs structure)");
10291 return _("NT_PPC_VMX (ppc Altivec registers)");
10293 return _("NT_PPC_VSX (ppc VSX registers)");
10295 return _("NT_PSTATUS (pstatus structure)");
10297 return _("NT_FPREGS (floating point registers)");
10299 return _("NT_PSINFO (psinfo structure)");
10301 return _("NT_LWPSTATUS (lwpstatus_t structure)");
10303 return _("NT_LWPSINFO (lwpsinfo_t structure)");
10304 case NT_WIN32PSTATUS
:
10305 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
10313 return _("NT_VERSION (version)");
10315 return _("NT_ARCH (architecture)");
10320 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
10324 static const char *
10325 get_gnu_elf_note_type (unsigned e_type
)
10327 static char buff
[64];
10331 case NT_GNU_ABI_TAG
:
10332 return _("NT_GNU_ABI_TAG (ABI version tag)");
10334 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
10335 case NT_GNU_BUILD_ID
:
10336 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
10337 case NT_GNU_GOLD_VERSION
:
10338 return _("NT_GNU_GOLD_VERSION (gold version)");
10343 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
10347 static const char *
10348 get_netbsd_elfcore_note_type (unsigned e_type
)
10350 static char buff
[64];
10352 if (e_type
== NT_NETBSDCORE_PROCINFO
)
10354 /* NetBSD core "procinfo" structure. */
10355 return _("NetBSD procinfo structure");
10358 /* As of Jan 2002 there are no other machine-independent notes
10359 defined for NetBSD core files. If the note type is less
10360 than the start of the machine-dependent note types, we don't
10363 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
10365 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
10369 switch (elf_header
.e_machine
)
10371 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
10372 and PT_GETFPREGS == mach+2. */
10377 case EM_SPARC32PLUS
:
10381 case NT_NETBSDCORE_FIRSTMACH
+0:
10382 return _("PT_GETREGS (reg structure)");
10383 case NT_NETBSDCORE_FIRSTMACH
+2:
10384 return _("PT_GETFPREGS (fpreg structure)");
10390 /* On all other arch's, PT_GETREGS == mach+1 and
10391 PT_GETFPREGS == mach+3. */
10395 case NT_NETBSDCORE_FIRSTMACH
+1:
10396 return _("PT_GETREGS (reg structure)");
10397 case NT_NETBSDCORE_FIRSTMACH
+3:
10398 return _("PT_GETFPREGS (fpreg structure)");
10404 snprintf (buff
, sizeof (buff
), _("PT_FIRSTMACH+%d"),
10405 e_type
- NT_NETBSDCORE_FIRSTMACH
);
10409 /* Note that by the ELF standard, the name field is already null byte
10410 terminated, and namesz includes the terminating null byte.
10411 I.E. the value of namesz for the name "FSF" is 4.
10413 If the value of namesz is zero, there is no name present. */
10415 process_note (Elf_Internal_Note
* pnote
)
10417 const char * name
= pnote
->namesz
? pnote
->namedata
: "(NONE)";
10420 if (pnote
->namesz
== 0)
10421 /* If there is no note name, then use the default set of
10422 note type strings. */
10423 nt
= get_note_type (pnote
->type
);
10425 else if (const_strneq (pnote
->namedata
, "GNU"))
10426 /* GNU-specific object file notes. */
10427 nt
= get_gnu_elf_note_type (pnote
->type
);
10429 else if (const_strneq (pnote
->namedata
, "NetBSD-CORE"))
10430 /* NetBSD-specific core file notes. */
10431 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
10433 else if (strneq (pnote
->namedata
, "SPU/", 4))
10435 /* SPU-specific core file notes. */
10436 nt
= pnote
->namedata
+ 4;
10441 /* Don't recognize this note name; just use the default set of
10442 note type strings. */
10443 nt
= get_note_type (pnote
->type
);
10445 printf (" %s\t\t0x%08lx\t%s\n", name
, pnote
->descsz
, nt
);
10451 process_corefile_note_segment (FILE * file
, bfd_vma offset
, bfd_vma length
)
10453 Elf_External_Note
* pnotes
;
10454 Elf_External_Note
* external
;
10460 pnotes
= (Elf_External_Note
*) get_data (NULL
, file
, offset
, 1, length
,
10467 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
10468 (unsigned long) offset
, (unsigned long) length
);
10469 printf (_(" Owner\t\tData size\tDescription\n"));
10471 while (external
< (Elf_External_Note
*) ((char *) pnotes
+ length
))
10473 Elf_External_Note
* next
;
10474 Elf_Internal_Note inote
;
10475 char * temp
= NULL
;
10477 inote
.type
= BYTE_GET (external
->type
);
10478 inote
.namesz
= BYTE_GET (external
->namesz
);
10479 inote
.namedata
= external
->name
;
10480 inote
.descsz
= BYTE_GET (external
->descsz
);
10481 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
10482 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
10484 next
= (Elf_External_Note
*) (inote
.descdata
+ align_power (inote
.descsz
, 2));
10486 if (((char *) next
) > (((char *) pnotes
) + length
))
10488 warn (_("corrupt note found at offset %lx into core notes\n"),
10489 (unsigned long) ((char *) external
- (char *) pnotes
));
10490 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
10491 inote
.type
, inote
.namesz
, inote
.descsz
);
10497 /* Verify that name is null terminated. It appears that at least
10498 one version of Linux (RedHat 6.0) generates corefiles that don't
10499 comply with the ELF spec by failing to include the null byte in
10501 if (inote
.namedata
[inote
.namesz
] != '\0')
10503 temp
= (char *) malloc (inote
.namesz
+ 1);
10507 error (_("Out of memory\n"));
10512 strncpy (temp
, inote
.namedata
, inote
.namesz
);
10513 temp
[inote
.namesz
] = 0;
10515 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
10516 inote
.namedata
= temp
;
10519 res
&= process_note (& inote
);
10534 process_corefile_note_segments (FILE * file
)
10536 Elf_Internal_Phdr
* segment
;
10540 if (! get_program_headers (file
))
10543 for (i
= 0, segment
= program_headers
;
10544 i
< elf_header
.e_phnum
;
10547 if (segment
->p_type
== PT_NOTE
)
10548 res
&= process_corefile_note_segment (file
,
10549 (bfd_vma
) segment
->p_offset
,
10550 (bfd_vma
) segment
->p_filesz
);
10557 process_note_sections (FILE * file
)
10559 Elf_Internal_Shdr
* section
;
10563 for (i
= 0, section
= section_headers
;
10564 i
< elf_header
.e_shnum
;
10566 if (section
->sh_type
== SHT_NOTE
)
10567 res
&= process_corefile_note_segment (file
,
10568 (bfd_vma
) section
->sh_offset
,
10569 (bfd_vma
) section
->sh_size
);
10575 process_notes (FILE * file
)
10577 /* If we have not been asked to display the notes then do nothing. */
10581 if (elf_header
.e_type
!= ET_CORE
)
10582 return process_note_sections (file
);
10584 /* No program headers means no NOTE segment. */
10585 if (elf_header
.e_phnum
> 0)
10586 return process_corefile_note_segments (file
);
10588 printf (_("No note segments present in the core file.\n"));
10593 process_arch_specific (FILE * file
)
10598 switch (elf_header
.e_machine
)
10601 return process_arm_specific (file
);
10603 case EM_MIPS_RS3_LE
:
10604 return process_mips_specific (file
);
10607 return process_power_specific (file
);
10616 get_file_header (FILE * file
)
10618 /* Read in the identity array. */
10619 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
10622 /* Determine how to read the rest of the header. */
10623 switch (elf_header
.e_ident
[EI_DATA
])
10625 default: /* fall through */
10626 case ELFDATANONE
: /* fall through */
10628 byte_get
= byte_get_little_endian
;
10629 byte_put
= byte_put_little_endian
;
10632 byte_get
= byte_get_big_endian
;
10633 byte_put
= byte_put_big_endian
;
10637 /* For now we only support 32 bit and 64 bit ELF files. */
10638 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
10640 /* Read in the rest of the header. */
10643 Elf32_External_Ehdr ehdr32
;
10645 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
10648 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
10649 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
10650 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
10651 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
10652 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
10653 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
10654 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
10655 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
10656 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
10657 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
10658 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
10659 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
10660 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
10664 Elf64_External_Ehdr ehdr64
;
10666 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10667 we will not be able to cope with the 64bit data found in
10668 64 ELF files. Detect this now and abort before we start
10669 overwriting things. */
10670 if (sizeof (bfd_vma
) < 8)
10672 error (_("This instance of readelf has been built without support for a\n\
10673 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10677 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
10680 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
10681 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
10682 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
10683 elf_header
.e_entry
= BYTE_GET (ehdr64
.e_entry
);
10684 elf_header
.e_phoff
= BYTE_GET (ehdr64
.e_phoff
);
10685 elf_header
.e_shoff
= BYTE_GET (ehdr64
.e_shoff
);
10686 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
10687 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
10688 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
10689 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
10690 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
10691 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
10692 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
10695 if (elf_header
.e_shoff
)
10697 /* There may be some extensions in the first section header. Don't
10698 bomb if we can't read it. */
10700 get_32bit_section_headers (file
, 1);
10702 get_64bit_section_headers (file
, 1);
10708 /* Process one ELF object file according to the command line options.
10709 This file may actually be stored in an archive. The file is
10710 positioned at the start of the ELF object. */
10713 process_object (char * file_name
, FILE * file
)
10717 if (! get_file_header (file
))
10719 error (_("%s: Failed to read file header\n"), file_name
);
10723 /* Initialise per file variables. */
10724 for (i
= ARRAY_SIZE (version_info
); i
--;)
10725 version_info
[i
] = 0;
10727 for (i
= ARRAY_SIZE (dynamic_info
); i
--;)
10728 dynamic_info
[i
] = 0;
10730 /* Process the file. */
10732 printf (_("\nFile: %s\n"), file_name
);
10734 /* Initialise the dump_sects array from the cmdline_dump_sects array.
10735 Note we do this even if cmdline_dump_sects is empty because we
10736 must make sure that the dump_sets array is zeroed out before each
10737 object file is processed. */
10738 if (num_dump_sects
> num_cmdline_dump_sects
)
10739 memset (dump_sects
, 0, num_dump_sects
* sizeof (* dump_sects
));
10741 if (num_cmdline_dump_sects
> 0)
10743 if (num_dump_sects
== 0)
10744 /* A sneaky way of allocating the dump_sects array. */
10745 request_dump_bynumber (num_cmdline_dump_sects
, 0);
10747 assert (num_dump_sects
>= num_cmdline_dump_sects
);
10748 memcpy (dump_sects
, cmdline_dump_sects
,
10749 num_cmdline_dump_sects
* sizeof (* dump_sects
));
10752 if (! process_file_header ())
10755 if (! process_section_headers (file
))
10757 /* Without loaded section headers we cannot process lots of
10759 do_unwind
= do_version
= do_dump
= do_arch
= 0;
10761 if (! do_using_dynamic
)
10762 do_syms
= do_reloc
= 0;
10765 if (! process_section_groups (file
))
10767 /* Without loaded section groups we cannot process unwind. */
10771 if (process_program_headers (file
))
10772 process_dynamic_section (file
);
10774 process_relocs (file
);
10776 process_unwind (file
);
10778 process_symbol_table (file
);
10780 process_syminfo (file
);
10782 process_version_sections (file
);
10784 process_section_contents (file
);
10786 process_notes (file
);
10788 process_gnu_liblist (file
);
10790 process_arch_specific (file
);
10792 if (program_headers
)
10794 free (program_headers
);
10795 program_headers
= NULL
;
10798 if (section_headers
)
10800 free (section_headers
);
10801 section_headers
= NULL
;
10806 free (string_table
);
10807 string_table
= NULL
;
10808 string_table_length
= 0;
10811 if (dynamic_strings
)
10813 free (dynamic_strings
);
10814 dynamic_strings
= NULL
;
10815 dynamic_strings_length
= 0;
10818 if (dynamic_symbols
)
10820 free (dynamic_symbols
);
10821 dynamic_symbols
= NULL
;
10822 num_dynamic_syms
= 0;
10825 if (dynamic_syminfo
)
10827 free (dynamic_syminfo
);
10828 dynamic_syminfo
= NULL
;
10831 if (section_headers_groups
)
10833 free (section_headers_groups
);
10834 section_headers_groups
= NULL
;
10837 if (section_groups
)
10839 struct group_list
* g
;
10840 struct group_list
* next
;
10842 for (i
= 0; i
< group_count
; i
++)
10844 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
10851 free (section_groups
);
10852 section_groups
= NULL
;
10855 free_debug_memory ();
10860 /* Return the path name for a proxy entry in a thin archive, adjusted relative
10861 to the path name of the thin archive itself if necessary. Always returns
10862 a pointer to malloc'ed memory. */
10865 adjust_relative_path (char * file_name
, char * name
, int name_len
)
10867 char * member_file_name
;
10868 const char * base_name
= lbasename (file_name
);
10870 /* This is a proxy entry for a thin archive member.
10871 If the extended name table contains an absolute path
10872 name, or if the archive is in the current directory,
10873 use the path name as given. Otherwise, we need to
10874 find the member relative to the directory where the
10875 archive is located. */
10876 if (IS_ABSOLUTE_PATH (name
) || base_name
== file_name
)
10878 member_file_name
= (char *) malloc (name_len
+ 1);
10879 if (member_file_name
== NULL
)
10881 error (_("Out of memory\n"));
10884 memcpy (member_file_name
, name
, name_len
);
10885 member_file_name
[name_len
] = '\0';
10889 /* Concatenate the path components of the archive file name
10890 to the relative path name from the extended name table. */
10891 size_t prefix_len
= base_name
- file_name
;
10892 member_file_name
= (char *) malloc (prefix_len
+ name_len
+ 1);
10893 if (member_file_name
== NULL
)
10895 error (_("Out of memory\n"));
10898 memcpy (member_file_name
, file_name
, prefix_len
);
10899 memcpy (member_file_name
+ prefix_len
, name
, name_len
);
10900 member_file_name
[prefix_len
+ name_len
] = '\0';
10902 return member_file_name
;
10905 /* Structure to hold information about an archive file. */
10907 struct archive_info
10909 char * file_name
; /* Archive file name. */
10910 FILE * file
; /* Open file descriptor. */
10911 unsigned long index_num
; /* Number of symbols in table. */
10912 unsigned long * index_array
; /* The array of member offsets. */
10913 char * sym_table
; /* The symbol table. */
10914 unsigned long sym_size
; /* Size of the symbol table. */
10915 char * longnames
; /* The long file names table. */
10916 unsigned long longnames_size
; /* Size of the long file names table. */
10917 unsigned long nested_member_origin
; /* Origin in the nested archive of the current member. */
10918 unsigned long next_arhdr_offset
; /* Offset of the next archive header. */
10919 bfd_boolean is_thin_archive
; /* TRUE if this is a thin archive. */
10920 struct ar_hdr arhdr
; /* Current archive header. */
10923 /* Read the symbol table and long-name table from an archive. */
10926 setup_archive (struct archive_info
* arch
, char * file_name
, FILE * file
,
10927 bfd_boolean is_thin_archive
, bfd_boolean read_symbols
)
10930 unsigned long size
;
10932 arch
->file_name
= strdup (file_name
);
10934 arch
->index_num
= 0;
10935 arch
->index_array
= NULL
;
10936 arch
->sym_table
= NULL
;
10937 arch
->sym_size
= 0;
10938 arch
->longnames
= NULL
;
10939 arch
->longnames_size
= 0;
10940 arch
->nested_member_origin
= 0;
10941 arch
->is_thin_archive
= is_thin_archive
;
10942 arch
->next_arhdr_offset
= SARMAG
;
10944 /* Read the first archive member header. */
10945 if (fseek (file
, SARMAG
, SEEK_SET
) != 0)
10947 error (_("%s: failed to seek to first archive header\n"), file_name
);
10950 got
= fread (&arch
->arhdr
, 1, sizeof arch
->arhdr
, file
);
10951 if (got
!= sizeof arch
->arhdr
)
10956 error (_("%s: failed to read archive header\n"), file_name
);
10960 /* See if this is the archive symbol table. */
10961 if (const_strneq (arch
->arhdr
.ar_name
, "/ ")
10962 || const_strneq (arch
->arhdr
.ar_name
, "/SYM64/ "))
10964 size
= strtoul (arch
->arhdr
.ar_size
, NULL
, 10);
10965 size
= size
+ (size
& 1);
10967 arch
->next_arhdr_offset
+= sizeof arch
->arhdr
+ size
;
10972 /* A buffer used to hold numbers read in from an archive index.
10973 These are always 4 bytes long and stored in big-endian format. */
10974 #define SIZEOF_AR_INDEX_NUMBERS 4
10975 unsigned char integer_buffer
[SIZEOF_AR_INDEX_NUMBERS
];
10976 unsigned char * index_buffer
;
10978 /* Check the size of the archive index. */
10979 if (size
< SIZEOF_AR_INDEX_NUMBERS
)
10981 error (_("%s: the archive index is empty\n"), file_name
);
10985 /* Read the numer of entries in the archive index. */
10986 got
= fread (integer_buffer
, 1, sizeof integer_buffer
, file
);
10987 if (got
!= sizeof (integer_buffer
))
10989 error (_("%s: failed to read archive index\n"), file_name
);
10992 arch
->index_num
= byte_get_big_endian (integer_buffer
, sizeof integer_buffer
);
10993 size
-= SIZEOF_AR_INDEX_NUMBERS
;
10995 /* Read in the archive index. */
10996 if (size
< arch
->index_num
* SIZEOF_AR_INDEX_NUMBERS
)
10998 error (_("%s: the archive index is supposed to have %ld entries, but the size in the header is too small\n"),
10999 file_name
, arch
->index_num
);
11002 index_buffer
= (unsigned char *)
11003 malloc (arch
->index_num
* SIZEOF_AR_INDEX_NUMBERS
);
11004 if (index_buffer
== NULL
)
11006 error (_("Out of memory whilst trying to read archive symbol index\n"));
11009 got
= fread (index_buffer
, SIZEOF_AR_INDEX_NUMBERS
, arch
->index_num
, file
);
11010 if (got
!= arch
->index_num
)
11012 free (index_buffer
);
11013 error (_("%s: failed to read archive index\n"), file_name
);
11016 size
-= arch
->index_num
* SIZEOF_AR_INDEX_NUMBERS
;
11018 /* Convert the index numbers into the host's numeric format. */
11019 arch
->index_array
= (long unsigned int *)
11020 malloc (arch
->index_num
* sizeof (* arch
->index_array
));
11021 if (arch
->index_array
== NULL
)
11023 free (index_buffer
);
11024 error (_("Out of memory whilst trying to convert the archive symbol index\n"));
11028 for (i
= 0; i
< arch
->index_num
; i
++)
11029 arch
->index_array
[i
] = byte_get_big_endian ((unsigned char *) (index_buffer
+ (i
* SIZEOF_AR_INDEX_NUMBERS
)),
11030 SIZEOF_AR_INDEX_NUMBERS
);
11031 free (index_buffer
);
11033 /* The remaining space in the header is taken up by the symbol table. */
11036 error (_("%s: the archive has an index but no symbols\n"), file_name
);
11039 arch
->sym_table
= (char *) malloc (size
);
11040 arch
->sym_size
= size
;
11041 if (arch
->sym_table
== NULL
)
11043 error (_("Out of memory whilst trying to read archive index symbol table\n"));
11046 got
= fread (arch
->sym_table
, 1, size
, file
);
11049 error (_("%s: failed to read archive index symbol table\n"), file_name
);
11055 if (fseek (file
, size
, SEEK_CUR
) != 0)
11057 error (_("%s: failed to skip archive symbol table\n"), file_name
);
11062 /* Read the next archive header. */
11063 got
= fread (&arch
->arhdr
, 1, sizeof arch
->arhdr
, file
);
11064 if (got
!= sizeof arch
->arhdr
)
11068 error (_("%s: failed to read archive header following archive index\n"), file_name
);
11072 else if (read_symbols
)
11073 printf (_("%s has no archive index\n"), file_name
);
11075 if (const_strneq (arch
->arhdr
.ar_name
, "// "))
11077 /* This is the archive string table holding long member names. */
11078 arch
->longnames_size
= strtoul (arch
->arhdr
.ar_size
, NULL
, 10);
11079 arch
->next_arhdr_offset
+= sizeof arch
->arhdr
+ arch
->longnames_size
;
11081 arch
->longnames
= (char *) malloc (arch
->longnames_size
);
11082 if (arch
->longnames
== NULL
)
11084 error (_("Out of memory reading long symbol names in archive\n"));
11088 if (fread (arch
->longnames
, arch
->longnames_size
, 1, file
) != 1)
11090 free (arch
->longnames
);
11091 arch
->longnames
= NULL
;
11092 error (_("%s: failed to read long symbol name string table\n"), file_name
);
11096 if ((arch
->longnames_size
& 1) != 0)
11103 /* Release the memory used for the archive information. */
11106 release_archive (struct archive_info
* arch
)
11108 if (arch
->file_name
!= NULL
)
11109 free (arch
->file_name
);
11110 if (arch
->index_array
!= NULL
)
11111 free (arch
->index_array
);
11112 if (arch
->sym_table
!= NULL
)
11113 free (arch
->sym_table
);
11114 if (arch
->longnames
!= NULL
)
11115 free (arch
->longnames
);
11118 /* Open and setup a nested archive, if not already open. */
11121 setup_nested_archive (struct archive_info
* nested_arch
, char * member_file_name
)
11123 FILE * member_file
;
11125 /* Have we already setup this archive? */
11126 if (nested_arch
->file_name
!= NULL
11127 && streq (nested_arch
->file_name
, member_file_name
))
11130 /* Close previous file and discard cached information. */
11131 if (nested_arch
->file
!= NULL
)
11132 fclose (nested_arch
->file
);
11133 release_archive (nested_arch
);
11135 member_file
= fopen (member_file_name
, "rb");
11136 if (member_file
== NULL
)
11138 return setup_archive (nested_arch
, member_file_name
, member_file
, FALSE
, FALSE
);
11142 get_archive_member_name_at (struct archive_info
* arch
,
11143 unsigned long offset
,
11144 struct archive_info
* nested_arch
);
11146 /* Get the name of an archive member from the current archive header.
11147 For simple names, this will modify the ar_name field of the current
11148 archive header. For long names, it will return a pointer to the
11149 longnames table. For nested archives, it will open the nested archive
11150 and get the name recursively. NESTED_ARCH is a single-entry cache so
11151 we don't keep rereading the same information from a nested archive. */
11154 get_archive_member_name (struct archive_info
* arch
,
11155 struct archive_info
* nested_arch
)
11157 unsigned long j
, k
;
11159 if (arch
->arhdr
.ar_name
[0] == '/')
11161 /* We have a long name. */
11163 char * member_file_name
;
11164 char * member_name
;
11166 arch
->nested_member_origin
= 0;
11167 k
= j
= strtoul (arch
->arhdr
.ar_name
+ 1, &endp
, 10);
11168 if (arch
->is_thin_archive
&& endp
!= NULL
&& * endp
== ':')
11169 arch
->nested_member_origin
= strtoul (endp
+ 1, NULL
, 10);
11171 while ((j
< arch
->longnames_size
)
11172 && (arch
->longnames
[j
] != '\n')
11173 && (arch
->longnames
[j
] != '\0'))
11175 if (arch
->longnames
[j
-1] == '/')
11177 arch
->longnames
[j
] = '\0';
11179 if (!arch
->is_thin_archive
|| arch
->nested_member_origin
== 0)
11180 return arch
->longnames
+ k
;
11182 /* This is a proxy for a member of a nested archive.
11183 Find the name of the member in that archive. */
11184 member_file_name
= adjust_relative_path (arch
->file_name
, arch
->longnames
+ k
, j
- k
);
11185 if (member_file_name
!= NULL
11186 && setup_nested_archive (nested_arch
, member_file_name
) == 0
11187 && (member_name
= get_archive_member_name_at (nested_arch
, arch
->nested_member_origin
, NULL
)) != NULL
)
11189 free (member_file_name
);
11190 return member_name
;
11192 free (member_file_name
);
11194 /* Last resort: just return the name of the nested archive. */
11195 return arch
->longnames
+ k
;
11198 /* We have a normal (short) name. */
11200 while ((arch
->arhdr
.ar_name
[j
] != '/') && (j
< 16))
11202 arch
->arhdr
.ar_name
[j
] = '\0';
11203 return arch
->arhdr
.ar_name
;
11206 /* Get the name of an archive member at a given OFFSET within an archive ARCH. */
11209 get_archive_member_name_at (struct archive_info
* arch
,
11210 unsigned long offset
,
11211 struct archive_info
* nested_arch
)
11215 if (fseek (arch
->file
, offset
, SEEK_SET
) != 0)
11217 error (_("%s: failed to seek to next file name\n"), arch
->file_name
);
11220 got
= fread (&arch
->arhdr
, 1, sizeof arch
->arhdr
, arch
->file
);
11221 if (got
!= sizeof arch
->arhdr
)
11223 error (_("%s: failed to read archive header\n"), arch
->file_name
);
11226 if (memcmp (arch
->arhdr
.ar_fmag
, ARFMAG
, 2) != 0)
11228 error (_("%s: did not find a valid archive header\n"), arch
->file_name
);
11232 return get_archive_member_name (arch
, nested_arch
);
11235 /* Construct a string showing the name of the archive member, qualified
11236 with the name of the containing archive file. For thin archives, we
11237 use square brackets to denote the indirection. For nested archives,
11238 we show the qualified name of the external member inside the square
11239 brackets (e.g., "thin.a[normal.a(foo.o)]"). */
11242 make_qualified_name (struct archive_info
* arch
,
11243 struct archive_info
* nested_arch
,
11244 char * member_name
)
11249 len
= strlen (arch
->file_name
) + strlen (member_name
) + 3;
11250 if (arch
->is_thin_archive
&& arch
->nested_member_origin
!= 0)
11251 len
+= strlen (nested_arch
->file_name
) + 2;
11253 name
= (char *) malloc (len
);
11256 error (_("Out of memory\n"));
11260 if (arch
->is_thin_archive
&& arch
->nested_member_origin
!= 0)
11261 snprintf (name
, len
, "%s[%s(%s)]", arch
->file_name
, nested_arch
->file_name
, member_name
);
11262 else if (arch
->is_thin_archive
)
11263 snprintf (name
, len
, "%s[%s]", arch
->file_name
, member_name
);
11265 snprintf (name
, len
, "%s(%s)", arch
->file_name
, member_name
);
11270 /* Process an ELF archive.
11271 On entry the file is positioned just after the ARMAG string. */
11274 process_archive (char * file_name
, FILE * file
, bfd_boolean is_thin_archive
)
11276 struct archive_info arch
;
11277 struct archive_info nested_arch
;
11279 size_t file_name_size
;
11284 /* The ARCH structure is used to hold information about this archive. */
11285 arch
.file_name
= NULL
;
11287 arch
.index_array
= NULL
;
11288 arch
.sym_table
= NULL
;
11289 arch
.longnames
= NULL
;
11291 /* The NESTED_ARCH structure is used as a single-item cache of information
11292 about a nested archive (when members of a thin archive reside within
11293 another regular archive file). */
11294 nested_arch
.file_name
= NULL
;
11295 nested_arch
.file
= NULL
;
11296 nested_arch
.index_array
= NULL
;
11297 nested_arch
.sym_table
= NULL
;
11298 nested_arch
.longnames
= NULL
;
11300 if (setup_archive (&arch
, file_name
, file
, is_thin_archive
, do_archive_index
) != 0)
11306 if (do_archive_index
)
11308 if (arch
.sym_table
== NULL
)
11309 error (_("%s: unable to dump the index as none was found\n"), file_name
);
11313 unsigned long current_pos
;
11315 printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
11316 file_name
, arch
.index_num
, arch
.sym_size
);
11317 current_pos
= ftell (file
);
11319 for (i
= l
= 0; i
< arch
.index_num
; i
++)
11321 if ((i
== 0) || ((i
> 0) && (arch
.index_array
[i
] != arch
.index_array
[i
- 1])))
11323 char * member_name
;
11325 member_name
= get_archive_member_name_at (&arch
, arch
.index_array
[i
], &nested_arch
);
11327 if (member_name
!= NULL
)
11329 char * qualified_name
= make_qualified_name (&arch
, &nested_arch
, member_name
);
11331 if (qualified_name
!= NULL
)
11333 printf (_("Binary %s contains:\n"), qualified_name
);
11334 free (qualified_name
);
11339 if (l
>= arch
.sym_size
)
11341 error (_("%s: end of the symbol table reached before the end of the index\n"),
11345 printf ("\t%s\n", arch
.sym_table
+ l
);
11346 l
+= strlen (arch
.sym_table
+ l
) + 1;
11351 if (l
< arch
.sym_size
)
11352 error (_("%s: symbols remain in the index symbol table, but without corresponding entries in the index table\n"),
11355 if (fseek (file
, current_pos
, SEEK_SET
) != 0)
11357 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name
);
11363 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
11364 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
11365 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
11366 && !do_section_groups
)
11368 ret
= 0; /* Archive index only. */
11373 file_name_size
= strlen (file_name
);
11380 char * qualified_name
;
11382 /* Read the next archive header. */
11383 if (fseek (file
, arch
.next_arhdr_offset
, SEEK_SET
) != 0)
11385 error (_("%s: failed to seek to next archive header\n"), file_name
);
11388 got
= fread (&arch
.arhdr
, 1, sizeof arch
.arhdr
, file
);
11389 if (got
!= sizeof arch
.arhdr
)
11393 error (_("%s: failed to read archive header\n"), file_name
);
11397 if (memcmp (arch
.arhdr
.ar_fmag
, ARFMAG
, 2) != 0)
11399 error (_("%s: did not find a valid archive header\n"), arch
.file_name
);
11404 arch
.next_arhdr_offset
+= sizeof arch
.arhdr
;
11406 archive_file_size
= strtoul (arch
.arhdr
.ar_size
, NULL
, 10);
11407 if (archive_file_size
& 01)
11408 ++archive_file_size
;
11410 name
= get_archive_member_name (&arch
, &nested_arch
);
11413 error (_("%s: bad archive file name\n"), file_name
);
11417 namelen
= strlen (name
);
11419 qualified_name
= make_qualified_name (&arch
, &nested_arch
, name
);
11420 if (qualified_name
== NULL
)
11422 error (_("%s: bad archive file name\n"), file_name
);
11427 if (is_thin_archive
&& arch
.nested_member_origin
== 0)
11429 /* This is a proxy for an external member of a thin archive. */
11430 FILE * member_file
;
11431 char * member_file_name
= adjust_relative_path (file_name
, name
, namelen
);
11432 if (member_file_name
== NULL
)
11438 member_file
= fopen (member_file_name
, "rb");
11439 if (member_file
== NULL
)
11441 error (_("Input file '%s' is not readable.\n"), member_file_name
);
11442 free (member_file_name
);
11447 archive_file_offset
= arch
.nested_member_origin
;
11449 ret
|= process_object (qualified_name
, member_file
);
11451 fclose (member_file
);
11452 free (member_file_name
);
11454 else if (is_thin_archive
)
11456 /* This is a proxy for a member of a nested archive. */
11457 archive_file_offset
= arch
.nested_member_origin
+ sizeof arch
.arhdr
;
11459 /* The nested archive file will have been opened and setup by
11460 get_archive_member_name. */
11461 if (fseek (nested_arch
.file
, archive_file_offset
, SEEK_SET
) != 0)
11463 error (_("%s: failed to seek to archive member.\n"), nested_arch
.file_name
);
11468 ret
|= process_object (qualified_name
, nested_arch
.file
);
11472 archive_file_offset
= arch
.next_arhdr_offset
;
11473 arch
.next_arhdr_offset
+= archive_file_size
;
11475 ret
|= process_object (qualified_name
, file
);
11478 free (qualified_name
);
11482 if (nested_arch
.file
!= NULL
)
11483 fclose (nested_arch
.file
);
11484 release_archive (&nested_arch
);
11485 release_archive (&arch
);
11491 process_file (char * file_name
)
11494 struct stat statbuf
;
11495 char armag
[SARMAG
];
11498 if (stat (file_name
, &statbuf
) < 0)
11500 if (errno
== ENOENT
)
11501 error (_("'%s': No such file\n"), file_name
);
11503 error (_("Could not locate '%s'. System error message: %s\n"),
11504 file_name
, strerror (errno
));
11508 if (! S_ISREG (statbuf
.st_mode
))
11510 error (_("'%s' is not an ordinary file\n"), file_name
);
11514 file
= fopen (file_name
, "rb");
11517 error (_("Input file '%s' is not readable.\n"), file_name
);
11521 if (fread (armag
, SARMAG
, 1, file
) != 1)
11523 error (_("%s: Failed to read file's magic number\n"), file_name
);
11528 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
11529 ret
= process_archive (file_name
, file
, FALSE
);
11530 else if (memcmp (armag
, ARMAGT
, SARMAG
) == 0)
11531 ret
= process_archive (file_name
, file
, TRUE
);
11534 if (do_archive_index
)
11535 error (_("File %s is not an archive so its index cannot be displayed.\n"),
11539 archive_file_size
= archive_file_offset
= 0;
11540 ret
= process_object (file_name
, file
);
11548 #ifdef SUPPORT_DISASSEMBLY
11549 /* Needed by the i386 disassembler. For extra credit, someone could
11550 fix this so that we insert symbolic addresses here, esp for GOT/PLT
11554 print_address (unsigned int addr
, FILE * outfile
)
11556 fprintf (outfile
,"0x%8.8x", addr
);
11559 /* Needed by the i386 disassembler. */
11561 db_task_printsym (unsigned int addr
)
11563 print_address (addr
, stderr
);
11568 main (int argc
, char ** argv
)
11572 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
11573 setlocale (LC_MESSAGES
, "");
11575 #if defined (HAVE_SETLOCALE)
11576 setlocale (LC_CTYPE
, "");
11578 bindtextdomain (PACKAGE
, LOCALEDIR
);
11579 textdomain (PACKAGE
);
11581 expandargv (&argc
, &argv
);
11583 parse_args (argc
, argv
);
11585 if (num_dump_sects
> 0)
11587 /* Make a copy of the dump_sects array. */
11588 cmdline_dump_sects
= (dump_type
*)
11589 malloc (num_dump_sects
* sizeof (* dump_sects
));
11590 if (cmdline_dump_sects
== NULL
)
11591 error (_("Out of memory allocating dump request table.\n"));
11594 memcpy (cmdline_dump_sects
, dump_sects
,
11595 num_dump_sects
* sizeof (* dump_sects
));
11596 num_cmdline_dump_sects
= num_dump_sects
;
11600 if (optind
< (argc
- 1))
11604 while (optind
< argc
)
11605 err
|= process_file (argv
[optind
++]);
11607 if (dump_sects
!= NULL
)
11609 if (cmdline_dump_sects
!= NULL
)
11610 free (cmdline_dump_sects
);