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";
153 static long archive_file_offset
;
154 static unsigned long archive_file_size
;
155 static unsigned long dynamic_addr
;
156 static bfd_size_type dynamic_size
;
157 static unsigned int dynamic_nent
;
158 static char * dynamic_strings
;
159 static unsigned long dynamic_strings_length
;
160 static char * string_table
;
161 static unsigned long string_table_length
;
162 static unsigned long num_dynamic_syms
;
163 static Elf_Internal_Sym
* dynamic_symbols
;
164 static Elf_Internal_Syminfo
* dynamic_syminfo
;
165 static unsigned long dynamic_syminfo_offset
;
166 static unsigned int dynamic_syminfo_nent
;
167 static char program_interpreter
[PATH_MAX
];
168 static bfd_vma dynamic_info
[DT_JMPREL
+ 1];
169 static bfd_vma dynamic_info_DT_GNU_HASH
;
170 static bfd_vma version_info
[16];
171 static Elf_Internal_Ehdr elf_header
;
172 static Elf_Internal_Shdr
* section_headers
;
173 static Elf_Internal_Phdr
* program_headers
;
174 static Elf_Internal_Dyn
* dynamic_section
;
175 static Elf_Internal_Shdr
* symtab_shndx_hdr
;
176 static int show_name
;
177 static int do_dynamic
;
180 static int do_sections
;
181 static int do_section_groups
;
182 static int do_section_details
;
183 static int do_segments
;
184 static int do_unwind
;
185 static int do_using_dynamic
;
186 static int do_header
;
188 static int do_version
;
189 static int do_histogram
;
190 static int do_debugging
;
193 static int do_archive_index
;
194 static int is_32bit_elf
;
198 struct group_list
* next
;
199 unsigned int section_index
;
204 struct group_list
* root
;
205 unsigned int group_index
;
208 static size_t group_count
;
209 static struct group
* section_groups
;
210 static struct group
** section_headers_groups
;
213 /* Flag bits indicating particular types of dump. */
214 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
215 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
216 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
217 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
218 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
220 typedef unsigned char dump_type
;
222 /* A linked list of the section names for which dumps were requested. */
223 struct dump_list_entry
227 struct dump_list_entry
* next
;
229 static struct dump_list_entry
* dump_sects_byname
;
231 /* A dynamic array of flags indicating for which sections a dump
232 has been requested via command line switches. */
233 static dump_type
* cmdline_dump_sects
= NULL
;
234 static unsigned int num_cmdline_dump_sects
= 0;
236 /* A dynamic array of flags indicating for which sections a dump of
237 some kind has been requested. It is reset on a per-object file
238 basis and then initialised from the cmdline_dump_sects array,
239 the results of interpreting the -w switch, and the
240 dump_sects_byname list. */
241 static dump_type
* dump_sects
= NULL
;
242 static unsigned int num_dump_sects
= 0;
245 /* How to print a vma value. */
246 typedef enum print_mode
258 static void (* byte_put
) (unsigned char *, bfd_vma
, int);
262 #define SECTION_NAME(X) \
263 ((X) == NULL ? "<none>" \
264 : string_table == NULL ? "<no-name>" \
265 : ((X)->sh_name >= string_table_length ? "<corrupt>" \
266 : string_table + (X)->sh_name))
268 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
270 #define BYTE_GET(field) byte_get (field, sizeof (field))
272 #define GET_ELF_SYMBOLS(file, section) \
273 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
274 : get_64bit_elf_symbols (file, section))
276 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
277 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
278 already been called and verified that the string exists. */
279 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
281 /* This is just a bit of syntatic sugar. */
282 #define streq(a,b) (strcmp ((a), (b)) == 0)
283 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
284 #define const_strneq(a,b) (strncmp ((a), (b), sizeof (b) - 1) == 0)
287 get_data (void * var
, FILE * file
, long offset
, size_t size
, size_t nmemb
,
292 if (size
== 0 || nmemb
== 0)
295 if (fseek (file
, archive_file_offset
+ offset
, SEEK_SET
))
297 error (_("Unable to seek to 0x%lx for %s\n"),
298 (unsigned long) archive_file_offset
+ offset
, reason
);
305 /* Check for overflow. */
306 if (nmemb
< (~(size_t) 0 - 1) / size
)
307 /* + 1 so that we can '\0' terminate invalid string table sections. */
308 mvar
= malloc (size
* nmemb
+ 1);
312 error (_("Out of memory allocating 0x%lx bytes for %s\n"),
313 (unsigned long)(size
* nmemb
), reason
);
317 ((char *) mvar
)[size
* nmemb
] = '\0';
320 if (fread (mvar
, size
, nmemb
, file
) != nmemb
)
322 error (_("Unable to read in 0x%lx bytes of %s\n"),
323 (unsigned long)(size
* nmemb
), reason
);
333 byte_put_little_endian (unsigned char * field
, bfd_vma value
, int size
)
338 field
[7] = (((value
>> 24) >> 24) >> 8) & 0xff;
339 field
[6] = ((value
>> 24) >> 24) & 0xff;
340 field
[5] = ((value
>> 24) >> 16) & 0xff;
341 field
[4] = ((value
>> 24) >> 8) & 0xff;
344 field
[3] = (value
>> 24) & 0xff;
347 field
[2] = (value
>> 16) & 0xff;
350 field
[1] = (value
>> 8) & 0xff;
353 field
[0] = value
& 0xff;
357 error (_("Unhandled data length: %d\n"), size
);
362 /* Print a VMA value. */
365 print_vma (bfd_vma vma
, print_mode mode
)
378 return nc
+ printf ("%8.8" BFD_VMA_FMT
"x", vma
);
385 return printf ("%5" BFD_VMA_FMT
"d", vma
);
393 return nc
+ printf ("%" BFD_VMA_FMT
"x", vma
);
396 return printf ("%" BFD_VMA_FMT
"d", vma
);
399 return printf ("%" BFD_VMA_FMT
"u", vma
);
404 /* Display a symbol on stdout. Handles the display of non-printing characters.
406 If DO_WIDE is not true then format the symbol to be at most WIDTH characters,
407 truncating as necessary. If WIDTH is negative then format the string to be
408 exactly - WIDTH characters, truncating or padding as necessary.
410 Returns the number of emitted characters. */
413 print_symbol (int width
, const char * symbol
)
416 bfd_boolean extra_padding
= FALSE
;
417 unsigned int num_printed
= 0;
421 /* Set the width to a very large value. This simplifies the code below. */
426 /* Keep the width positive. This also helps. */
428 extra_padding
= TRUE
;
437 /* Look for non-printing symbols inside the symbol's name.
438 This test is triggered in particular by the names generated
439 by the assembler for local labels. */
440 while (ISPRINT (* c
))
450 printf ("%.*s", len
, symbol
);
456 if (* c
== 0 || width
== 0)
459 /* Now display the non-printing character, if
460 there is room left in which to dipslay it. */
466 printf ("^%c", *c
+ 0x40);
476 printf ("<0x%.2x>", *c
);
485 if (extra_padding
&& width
> 0)
487 /* Fill in the remaining spaces. */
488 printf ("%-*s", width
, " ");
496 byte_put_big_endian (unsigned char * field
, bfd_vma value
, int size
)
501 field
[7] = value
& 0xff;
502 field
[6] = (value
>> 8) & 0xff;
503 field
[5] = (value
>> 16) & 0xff;
504 field
[4] = (value
>> 24) & 0xff;
509 field
[3] = value
& 0xff;
513 field
[2] = value
& 0xff;
517 field
[1] = value
& 0xff;
521 field
[0] = value
& 0xff;
525 error (_("Unhandled data length: %d\n"), size
);
530 /* Return a pointer to section NAME, or NULL if no such section exists. */
532 static Elf_Internal_Shdr
*
533 find_section (const char * name
)
537 for (i
= 0; i
< elf_header
.e_shnum
; i
++)
538 if (streq (SECTION_NAME (section_headers
+ i
), name
))
539 return section_headers
+ i
;
544 /* Guess the relocation size commonly used by the specific machines. */
547 guess_is_rela (unsigned int e_machine
)
551 /* Targets that use REL relocations. */
567 /* Targets that use RELA relocations. */
571 case EM_ALTERA_NIOS2
:
591 case EM_LATTICEMICO32
:
599 case EM_CYGNUS_MN10200
:
601 case EM_CYGNUS_MN10300
:
624 case EM_MICROBLAZE_OLD
:
645 warn (_("Don't know about relocations on this machine architecture\n"));
651 slurp_rela_relocs (FILE * file
,
652 unsigned long rel_offset
,
653 unsigned long rel_size
,
654 Elf_Internal_Rela
** relasp
,
655 unsigned long * nrelasp
)
657 Elf_Internal_Rela
* relas
;
658 unsigned long nrelas
;
663 Elf32_External_Rela
* erelas
;
665 erelas
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
669 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
671 relas
= cmalloc (nrelas
, sizeof (Elf_Internal_Rela
));
676 error (_("out of memory parsing relocs\n"));
680 for (i
= 0; i
< nrelas
; i
++)
682 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
683 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
684 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
691 Elf64_External_Rela
* erelas
;
693 erelas
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
697 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
699 relas
= cmalloc (nrelas
, sizeof (Elf_Internal_Rela
));
704 error (_("out of memory parsing relocs\n"));
708 for (i
= 0; i
< nrelas
; i
++)
710 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
711 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
712 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
714 /* The #ifdef BFD64 below is to prevent a compile time
715 warning. We know that if we do not have a 64 bit data
716 type that we will never execute this code anyway. */
718 if (elf_header
.e_machine
== EM_MIPS
719 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
721 /* In little-endian objects, r_info isn't really a
722 64-bit little-endian value: it has a 32-bit
723 little-endian symbol index followed by four
724 individual byte fields. Reorder INFO
726 bfd_vma info
= relas
[i
].r_info
;
727 info
= (((info
& 0xffffffff) << 32)
728 | ((info
>> 56) & 0xff)
729 | ((info
>> 40) & 0xff00)
730 | ((info
>> 24) & 0xff0000)
731 | ((info
>> 8) & 0xff000000));
732 relas
[i
].r_info
= info
;
745 slurp_rel_relocs (FILE * file
,
746 unsigned long rel_offset
,
747 unsigned long rel_size
,
748 Elf_Internal_Rela
** relsp
,
749 unsigned long * nrelsp
)
751 Elf_Internal_Rela
* rels
;
757 Elf32_External_Rel
* erels
;
759 erels
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
763 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
765 rels
= cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
770 error (_("out of memory parsing relocs\n"));
774 for (i
= 0; i
< nrels
; i
++)
776 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
777 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
778 rels
[i
].r_addend
= 0;
785 Elf64_External_Rel
* erels
;
787 erels
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
791 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
793 rels
= cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
798 error (_("out of memory parsing relocs\n"));
802 for (i
= 0; i
< nrels
; i
++)
804 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
805 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
806 rels
[i
].r_addend
= 0;
808 /* The #ifdef BFD64 below is to prevent a compile time
809 warning. We know that if we do not have a 64 bit data
810 type that we will never execute this code anyway. */
812 if (elf_header
.e_machine
== EM_MIPS
813 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
815 /* In little-endian objects, r_info isn't really a
816 64-bit little-endian value: it has a 32-bit
817 little-endian symbol index followed by four
818 individual byte fields. Reorder INFO
820 bfd_vma info
= rels
[i
].r_info
;
821 info
= (((info
& 0xffffffff) << 32)
822 | ((info
>> 56) & 0xff)
823 | ((info
>> 40) & 0xff00)
824 | ((info
>> 24) & 0xff0000)
825 | ((info
>> 8) & 0xff000000));
826 rels
[i
].r_info
= info
;
838 /* Returns the reloc type extracted from the reloc info field. */
841 get_reloc_type (bfd_vma reloc_info
)
844 return ELF32_R_TYPE (reloc_info
);
846 switch (elf_header
.e_machine
)
849 /* Note: We assume that reloc_info has already been adjusted for us. */
850 return ELF64_MIPS_R_TYPE (reloc_info
);
853 return ELF64_R_TYPE_ID (reloc_info
);
856 return ELF64_R_TYPE (reloc_info
);
860 /* Return the symbol index extracted from the reloc info field. */
863 get_reloc_symindex (bfd_vma reloc_info
)
865 return is_32bit_elf
? ELF32_R_SYM (reloc_info
) : ELF64_R_SYM (reloc_info
);
868 /* Display the contents of the relocation data found at the specified
872 dump_relocations (FILE * file
,
873 unsigned long rel_offset
,
874 unsigned long rel_size
,
875 Elf_Internal_Sym
* symtab
,
878 unsigned long strtablen
,
882 Elf_Internal_Rela
* rels
;
884 if (is_rela
== UNKNOWN
)
885 is_rela
= guess_is_rela (elf_header
.e_machine
);
889 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
894 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
903 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
905 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
910 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
912 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
920 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
922 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
927 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
929 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
933 for (i
= 0; i
< rel_size
; i
++)
938 bfd_vma symtab_index
;
941 offset
= rels
[i
].r_offset
;
942 info
= rels
[i
].r_info
;
944 type
= get_reloc_type (info
);
945 symtab_index
= get_reloc_symindex (info
);
949 printf ("%8.8lx %8.8lx ",
950 (unsigned long) offset
& 0xffffffff,
951 (unsigned long) info
& 0xffffffff);
955 #if BFD_HOST_64BIT_LONG
957 ? "%16.16lx %16.16lx "
958 : "%12.12lx %12.12lx ",
960 #elif BFD_HOST_64BIT_LONG_LONG
963 ? "%16.16llx %16.16llx "
964 : "%12.12llx %12.12llx ",
968 ? "%16.16I64x %16.16I64x "
969 : "%12.12I64x %12.12I64x ",
974 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
975 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
976 _bfd_int64_high (offset
),
977 _bfd_int64_low (offset
),
978 _bfd_int64_high (info
),
979 _bfd_int64_low (info
));
983 switch (elf_header
.e_machine
)
991 rtype
= elf_m32r_reloc_type (type
);
996 rtype
= elf_i386_reloc_type (type
);
1001 rtype
= elf_m68hc11_reloc_type (type
);
1005 rtype
= elf_m68k_reloc_type (type
);
1009 rtype
= elf_i960_reloc_type (type
);
1014 rtype
= elf_avr_reloc_type (type
);
1017 case EM_OLD_SPARCV9
:
1018 case EM_SPARC32PLUS
:
1021 rtype
= elf_sparc_reloc_type (type
);
1025 rtype
= elf_spu_reloc_type (type
);
1029 case EM_CYGNUS_V850
:
1030 rtype
= v850_reloc_type (type
);
1034 case EM_CYGNUS_D10V
:
1035 rtype
= elf_d10v_reloc_type (type
);
1039 case EM_CYGNUS_D30V
:
1040 rtype
= elf_d30v_reloc_type (type
);
1044 rtype
= elf_dlx_reloc_type (type
);
1048 rtype
= elf_sh_reloc_type (type
);
1052 case EM_CYGNUS_MN10300
:
1053 rtype
= elf_mn10300_reloc_type (type
);
1057 case EM_CYGNUS_MN10200
:
1058 rtype
= elf_mn10200_reloc_type (type
);
1062 case EM_CYGNUS_FR30
:
1063 rtype
= elf_fr30_reloc_type (type
);
1067 rtype
= elf_frv_reloc_type (type
);
1071 rtype
= elf_mcore_reloc_type (type
);
1075 rtype
= elf_mmix_reloc_type (type
);
1080 rtype
= elf_msp430_reloc_type (type
);
1084 rtype
= elf_ppc_reloc_type (type
);
1088 rtype
= elf_ppc64_reloc_type (type
);
1092 case EM_MIPS_RS3_LE
:
1093 rtype
= elf_mips_reloc_type (type
);
1097 rtype
= elf_alpha_reloc_type (type
);
1101 rtype
= elf_arm_reloc_type (type
);
1105 rtype
= elf_arc_reloc_type (type
);
1109 rtype
= elf_hppa_reloc_type (type
);
1115 rtype
= elf_h8_reloc_type (type
);
1120 rtype
= elf_or32_reloc_type (type
);
1125 rtype
= elf_pj_reloc_type (type
);
1128 rtype
= elf_ia64_reloc_type (type
);
1132 rtype
= elf_cris_reloc_type (type
);
1136 rtype
= elf_i860_reloc_type (type
);
1141 rtype
= elf_x86_64_reloc_type (type
);
1145 rtype
= i370_reloc_type (type
);
1150 rtype
= elf_s390_reloc_type (type
);
1154 rtype
= elf_score_reloc_type (type
);
1158 rtype
= elf_xstormy16_reloc_type (type
);
1162 rtype
= elf_crx_reloc_type (type
);
1166 rtype
= elf_vax_reloc_type (type
);
1171 rtype
= elf_ip2k_reloc_type (type
);
1175 rtype
= elf_iq2000_reloc_type (type
);
1180 rtype
= elf_xtensa_reloc_type (type
);
1183 case EM_LATTICEMICO32
:
1184 rtype
= elf_lm32_reloc_type (type
);
1189 rtype
= elf_m32c_reloc_type (type
);
1193 rtype
= elf_mt_reloc_type (type
);
1197 rtype
= elf_bfin_reloc_type (type
);
1201 rtype
= elf_mep_reloc_type (type
);
1206 rtype
= elf_cr16_reloc_type (type
);
1210 case EM_MICROBLAZE_OLD
:
1211 rtype
= elf_microblaze_reloc_type (type
);
1216 printf (_("unrecognized: %-7lx"), (unsigned long) type
& 0xffffffff);
1218 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1220 if (elf_header
.e_machine
== EM_ALPHA
1222 && streq (rtype
, "R_ALPHA_LITUSE")
1225 switch (rels
[i
].r_addend
)
1227 case LITUSE_ALPHA_ADDR
: rtype
= "ADDR"; break;
1228 case LITUSE_ALPHA_BASE
: rtype
= "BASE"; break;
1229 case LITUSE_ALPHA_BYTOFF
: rtype
= "BYTOFF"; break;
1230 case LITUSE_ALPHA_JSR
: rtype
= "JSR"; break;
1231 case LITUSE_ALPHA_TLSGD
: rtype
= "TLSGD"; break;
1232 case LITUSE_ALPHA_TLSLDM
: rtype
= "TLSLDM"; break;
1233 case LITUSE_ALPHA_JSRDIRECT
: rtype
= "JSRDIRECT"; break;
1234 default: rtype
= NULL
;
1237 printf (" (%s)", rtype
);
1241 printf (_("<unknown addend: %lx>"),
1242 (unsigned long) rels
[i
].r_addend
);
1245 else if (symtab_index
)
1247 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1248 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1251 Elf_Internal_Sym
* psym
;
1253 psym
= symtab
+ symtab_index
;
1257 if (ELF_ST_TYPE (psym
->st_info
) == STT_GNU_IFUNC
)
1261 unsigned int width
= is_32bit_elf
? 8 : 14;
1263 /* Relocations against GNU_IFUNC symbols do not use the value
1264 of the symbol as the address to relocate against. Instead
1265 they invoke the function named by the symbol and use its
1266 result as the address for relocation.
1268 To indicate this to the user, do not display the value of
1269 the symbol in the "Symbols's Value" field. Instead show
1270 its name followed by () as a hint that the symbol is
1274 || psym
->st_name
== 0
1275 || psym
->st_name
>= strtablen
)
1278 name
= strtab
+ psym
->st_name
;
1280 len
= print_symbol (width
, name
);
1281 printf ("()%-*s", len
<= width
? (width
+ 1) - len
: 1, " ");
1285 print_vma (psym
->st_value
, LONG_HEX
);
1287 printf (is_32bit_elf
? " " : " ");
1290 if (psym
->st_name
== 0)
1292 const char * sec_name
= "<null>";
1295 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1297 if (psym
->st_shndx
< elf_header
.e_shnum
)
1299 = SECTION_NAME (section_headers
+ psym
->st_shndx
);
1300 else if (psym
->st_shndx
== SHN_ABS
)
1302 else if (psym
->st_shndx
== SHN_COMMON
)
1303 sec_name
= "COMMON";
1304 else if (elf_header
.e_machine
== EM_MIPS
1305 && psym
->st_shndx
== SHN_MIPS_SCOMMON
)
1306 sec_name
= "SCOMMON";
1307 else if (elf_header
.e_machine
== EM_MIPS
1308 && psym
->st_shndx
== SHN_MIPS_SUNDEFINED
)
1309 sec_name
= "SUNDEF";
1310 else if ((elf_header
.e_machine
== EM_X86_64
1311 || elf_header
.e_machine
== EM_L1OM
)
1312 && psym
->st_shndx
== SHN_X86_64_LCOMMON
)
1313 sec_name
= "LARGE_COMMON";
1314 else if (elf_header
.e_machine
== EM_IA_64
1315 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1316 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1317 sec_name
= "ANSI_COM";
1318 else if (elf_header
.e_machine
== EM_IA_64
1319 && (elf_header
.e_ident
[EI_OSABI
]
1320 == ELFOSABI_OPENVMS
)
1321 && psym
->st_shndx
== SHN_IA_64_VMS_SYMVEC
)
1322 sec_name
= "VMS_SYMVEC";
1325 sprintf (name_buf
, "<section 0x%x>",
1326 (unsigned int) psym
->st_shndx
);
1327 sec_name
= name_buf
;
1330 print_symbol (22, sec_name
);
1332 else if (strtab
== NULL
)
1333 printf (_("<string table index: %3ld>"), psym
->st_name
);
1334 else if (psym
->st_name
>= strtablen
)
1335 printf (_("<corrupt string table index: %3ld>"), psym
->st_name
);
1337 print_symbol (22, strtab
+ psym
->st_name
);
1341 long offset
= (long) (bfd_signed_vma
) rels
[i
].r_addend
;
1344 printf (" - %lx", - offset
);
1346 printf (" + %lx", offset
);
1352 printf ("%*c", is_32bit_elf
?
1353 (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1354 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1357 if (elf_header
.e_machine
== EM_SPARCV9
1359 && streq (rtype
, "R_SPARC_OLO10"))
1360 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1365 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1367 bfd_vma type2
= ELF64_MIPS_R_TYPE2 (info
);
1368 bfd_vma type3
= ELF64_MIPS_R_TYPE3 (info
);
1369 const char * rtype2
= elf_mips_reloc_type (type2
);
1370 const char * rtype3
= elf_mips_reloc_type (type3
);
1372 printf (" Type2: ");
1375 printf (_("unrecognized: %-7lx"),
1376 (unsigned long) type2
& 0xffffffff);
1378 printf ("%-17.17s", rtype2
);
1380 printf ("\n Type3: ");
1383 printf (_("unrecognized: %-7lx"),
1384 (unsigned long) type3
& 0xffffffff);
1386 printf ("%-17.17s", rtype3
);
1397 get_mips_dynamic_type (unsigned long type
)
1401 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1402 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1403 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1404 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1405 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1406 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1407 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1408 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1409 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1410 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1411 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1412 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1413 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1414 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1415 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1416 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1417 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1418 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1419 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1420 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1421 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1422 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1423 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1424 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1425 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1426 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1427 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1428 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1429 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1430 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1431 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1432 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1433 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1434 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1435 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1436 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1437 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1438 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1439 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1440 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1441 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1442 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1443 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1444 case DT_MIPS_PLTGOT
: return "MIPS_PLTGOT";
1445 case DT_MIPS_RWPLT
: return "MIPS_RWPLT";
1452 get_sparc64_dynamic_type (unsigned long type
)
1456 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1463 get_ppc_dynamic_type (unsigned long type
)
1467 case DT_PPC_GOT
: return "PPC_GOT";
1474 get_ppc64_dynamic_type (unsigned long type
)
1478 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1479 case DT_PPC64_OPD
: return "PPC64_OPD";
1480 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1487 get_parisc_dynamic_type (unsigned long type
)
1491 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1492 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1493 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1494 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1495 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1496 case DT_HP_PREINIT
: return "HP_PREINIT";
1497 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1498 case DT_HP_NEEDED
: return "HP_NEEDED";
1499 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1500 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1501 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1502 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1503 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1504 case DT_HP_EPLTREL
: return "HP_GST_EPLTREL";
1505 case DT_HP_EPLTRELSZ
: return "HP_GST_EPLTRELSZ";
1506 case DT_HP_FILTERED
: return "HP_FILTERED";
1507 case DT_HP_FILTER_TLS
: return "HP_FILTER_TLS";
1508 case DT_HP_COMPAT_FILTERED
: return "HP_COMPAT_FILTERED";
1509 case DT_HP_LAZYLOAD
: return "HP_LAZYLOAD";
1510 case DT_HP_BIND_NOW_COUNT
: return "HP_BIND_NOW_COUNT";
1511 case DT_PLT
: return "PLT";
1512 case DT_PLT_SIZE
: return "PLT_SIZE";
1513 case DT_DLT
: return "DLT";
1514 case DT_DLT_SIZE
: return "DLT_SIZE";
1521 get_ia64_dynamic_type (unsigned long type
)
1525 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1526 case DT_IA_64_VMS_SUBTYPE
: return "VMS_SUBTYPE";
1527 case DT_IA_64_VMS_IMGIOCNT
: return "VMS_IMGIOCNT";
1528 case DT_IA_64_VMS_LNKFLAGS
: return "VMS_LNKFLAGS";
1529 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ
: return "VMS_VIR_MEM_BLK_SIZ";
1530 case DT_IA_64_VMS_IDENT
: return "VMS_IDENT";
1531 case DT_IA_64_VMS_NEEDED_IDENT
: return "VMS_NEEDED_IDENT";
1532 case DT_IA_64_VMS_IMG_RELA_CNT
: return "VMS_IMG_RELA_CNT";
1533 case DT_IA_64_VMS_SEG_RELA_CNT
: return "VMS_SEG_RELA_CNT";
1534 case DT_IA_64_VMS_FIXUP_RELA_CNT
: return "VMS_FIXUP_RELA_CNT";
1535 case DT_IA_64_VMS_FIXUP_NEEDED
: return "VMS_FIXUP_NEEDED";
1536 case DT_IA_64_VMS_SYMVEC_CNT
: return "VMS_SYMVEC_CNT";
1537 case DT_IA_64_VMS_XLATED
: return "VMS_XLATED";
1538 case DT_IA_64_VMS_STACKSIZE
: return "VMS_STACKSIZE";
1539 case DT_IA_64_VMS_UNWINDSZ
: return "VMS_UNWINDSZ";
1540 case DT_IA_64_VMS_UNWIND_CODSEG
: return "VMS_UNWIND_CODSEG";
1541 case DT_IA_64_VMS_UNWIND_INFOSEG
: return "VMS_UNWIND_INFOSEG";
1542 case DT_IA_64_VMS_LINKTIME
: return "VMS_LINKTIME";
1543 case DT_IA_64_VMS_SEG_NO
: return "VMS_SEG_NO";
1544 case DT_IA_64_VMS_SYMVEC_OFFSET
: return "VMS_SYMVEC_OFFSET";
1545 case DT_IA_64_VMS_SYMVEC_SEG
: return "VMS_SYMVEC_SEG";
1546 case DT_IA_64_VMS_UNWIND_OFFSET
: return "VMS_UNWIND_OFFSET";
1547 case DT_IA_64_VMS_UNWIND_SEG
: return "VMS_UNWIND_SEG";
1548 case DT_IA_64_VMS_STRTAB_OFFSET
: return "VMS_STRTAB_OFFSET";
1549 case DT_IA_64_VMS_SYSVER_OFFSET
: return "VMS_SYSVER_OFFSET";
1550 case DT_IA_64_VMS_IMG_RELA_OFF
: return "VMS_IMG_RELA_OFF";
1551 case DT_IA_64_VMS_SEG_RELA_OFF
: return "VMS_SEG_RELA_OFF";
1552 case DT_IA_64_VMS_FIXUP_RELA_OFF
: return "VMS_FIXUP_RELA_OFF";
1553 case DT_IA_64_VMS_PLTGOT_OFFSET
: return "VMS_PLTGOT_OFFSET";
1554 case DT_IA_64_VMS_PLTGOT_SEG
: return "VMS_PLTGOT_SEG";
1555 case DT_IA_64_VMS_FPMODE
: return "VMS_FPMODE";
1562 get_alpha_dynamic_type (unsigned long type
)
1566 case DT_ALPHA_PLTRO
: return "ALPHA_PLTRO";
1573 get_score_dynamic_type (unsigned long type
)
1577 case DT_SCORE_BASE_ADDRESS
: return "SCORE_BASE_ADDRESS";
1578 case DT_SCORE_LOCAL_GOTNO
: return "SCORE_LOCAL_GOTNO";
1579 case DT_SCORE_SYMTABNO
: return "SCORE_SYMTABNO";
1580 case DT_SCORE_GOTSYM
: return "SCORE_GOTSYM";
1581 case DT_SCORE_UNREFEXTNO
: return "SCORE_UNREFEXTNO";
1582 case DT_SCORE_HIPAGENO
: return "SCORE_HIPAGENO";
1590 get_dynamic_type (unsigned long type
)
1592 static char buff
[64];
1596 case DT_NULL
: return "NULL";
1597 case DT_NEEDED
: return "NEEDED";
1598 case DT_PLTRELSZ
: return "PLTRELSZ";
1599 case DT_PLTGOT
: return "PLTGOT";
1600 case DT_HASH
: return "HASH";
1601 case DT_STRTAB
: return "STRTAB";
1602 case DT_SYMTAB
: return "SYMTAB";
1603 case DT_RELA
: return "RELA";
1604 case DT_RELASZ
: return "RELASZ";
1605 case DT_RELAENT
: return "RELAENT";
1606 case DT_STRSZ
: return "STRSZ";
1607 case DT_SYMENT
: return "SYMENT";
1608 case DT_INIT
: return "INIT";
1609 case DT_FINI
: return "FINI";
1610 case DT_SONAME
: return "SONAME";
1611 case DT_RPATH
: return "RPATH";
1612 case DT_SYMBOLIC
: return "SYMBOLIC";
1613 case DT_REL
: return "REL";
1614 case DT_RELSZ
: return "RELSZ";
1615 case DT_RELENT
: return "RELENT";
1616 case DT_PLTREL
: return "PLTREL";
1617 case DT_DEBUG
: return "DEBUG";
1618 case DT_TEXTREL
: return "TEXTREL";
1619 case DT_JMPREL
: return "JMPREL";
1620 case DT_BIND_NOW
: return "BIND_NOW";
1621 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1622 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1623 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1624 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1625 case DT_RUNPATH
: return "RUNPATH";
1626 case DT_FLAGS
: return "FLAGS";
1628 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1629 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1631 case DT_CHECKSUM
: return "CHECKSUM";
1632 case DT_PLTPADSZ
: return "PLTPADSZ";
1633 case DT_MOVEENT
: return "MOVEENT";
1634 case DT_MOVESZ
: return "MOVESZ";
1635 case DT_FEATURE
: return "FEATURE";
1636 case DT_POSFLAG_1
: return "POSFLAG_1";
1637 case DT_SYMINSZ
: return "SYMINSZ";
1638 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1640 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1641 case DT_CONFIG
: return "CONFIG";
1642 case DT_DEPAUDIT
: return "DEPAUDIT";
1643 case DT_AUDIT
: return "AUDIT";
1644 case DT_PLTPAD
: return "PLTPAD";
1645 case DT_MOVETAB
: return "MOVETAB";
1646 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1648 case DT_VERSYM
: return "VERSYM";
1650 case DT_TLSDESC_GOT
: return "TLSDESC_GOT";
1651 case DT_TLSDESC_PLT
: return "TLSDESC_PLT";
1652 case DT_RELACOUNT
: return "RELACOUNT";
1653 case DT_RELCOUNT
: return "RELCOUNT";
1654 case DT_FLAGS_1
: return "FLAGS_1";
1655 case DT_VERDEF
: return "VERDEF";
1656 case DT_VERDEFNUM
: return "VERDEFNUM";
1657 case DT_VERNEED
: return "VERNEED";
1658 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1660 case DT_AUXILIARY
: return "AUXILIARY";
1661 case DT_USED
: return "USED";
1662 case DT_FILTER
: return "FILTER";
1664 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1665 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1666 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1667 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1668 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1669 case DT_GNU_HASH
: return "GNU_HASH";
1672 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1674 const char * result
;
1676 switch (elf_header
.e_machine
)
1679 case EM_MIPS_RS3_LE
:
1680 result
= get_mips_dynamic_type (type
);
1683 result
= get_sparc64_dynamic_type (type
);
1686 result
= get_ppc_dynamic_type (type
);
1689 result
= get_ppc64_dynamic_type (type
);
1692 result
= get_ia64_dynamic_type (type
);
1695 result
= get_alpha_dynamic_type (type
);
1698 result
= get_score_dynamic_type (type
);
1708 snprintf (buff
, sizeof (buff
), _("Processor Specific: %lx"), type
);
1710 else if (((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1711 || (elf_header
.e_machine
== EM_PARISC
1712 && (type
>= OLD_DT_LOOS
) && (type
<= OLD_DT_HIOS
)))
1714 const char * result
;
1716 switch (elf_header
.e_machine
)
1719 result
= get_parisc_dynamic_type (type
);
1722 result
= get_ia64_dynamic_type (type
);
1732 snprintf (buff
, sizeof (buff
), _("Operating System specific: %lx"),
1736 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), type
);
1743 get_file_type (unsigned e_type
)
1745 static char buff
[32];
1749 case ET_NONE
: return _("NONE (None)");
1750 case ET_REL
: return _("REL (Relocatable file)");
1751 case ET_EXEC
: return _("EXEC (Executable file)");
1752 case ET_DYN
: return _("DYN (Shared object file)");
1753 case ET_CORE
: return _("CORE (Core file)");
1756 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1757 snprintf (buff
, sizeof (buff
), _("Processor Specific: (%x)"), e_type
);
1758 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1759 snprintf (buff
, sizeof (buff
), _("OS Specific: (%x)"), e_type
);
1761 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_type
);
1767 get_machine_name (unsigned e_machine
)
1769 static char buff
[64]; /* XXX */
1773 case EM_NONE
: return _("None");
1774 case EM_M32
: return "WE32100";
1775 case EM_SPARC
: return "Sparc";
1776 case EM_SPU
: return "SPU";
1777 case EM_386
: return "Intel 80386";
1778 case EM_68K
: return "MC68000";
1779 case EM_88K
: return "MC88000";
1780 case EM_486
: return "Intel 80486";
1781 case EM_860
: return "Intel 80860";
1782 case EM_MIPS
: return "MIPS R3000";
1783 case EM_S370
: return "IBM System/370";
1784 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1785 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1786 case EM_PARISC
: return "HPPA";
1787 case EM_PPC_OLD
: return "Power PC (old)";
1788 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1789 case EM_960
: return "Intel 90860";
1790 case EM_PPC
: return "PowerPC";
1791 case EM_PPC64
: return "PowerPC64";
1792 case EM_V800
: return "NEC V800";
1793 case EM_FR20
: return "Fujitsu FR20";
1794 case EM_RH32
: return "TRW RH32";
1795 case EM_MCORE
: return "MCORE";
1796 case EM_ARM
: return "ARM";
1797 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1798 case EM_SH
: return "Renesas / SuperH SH";
1799 case EM_SPARCV9
: return "Sparc v9";
1800 case EM_TRICORE
: return "Siemens Tricore";
1801 case EM_ARC
: return "ARC";
1802 case EM_H8_300
: return "Renesas H8/300";
1803 case EM_H8_300H
: return "Renesas H8/300H";
1804 case EM_H8S
: return "Renesas H8S";
1805 case EM_H8_500
: return "Renesas H8/500";
1806 case EM_IA_64
: return "Intel IA-64";
1807 case EM_MIPS_X
: return "Stanford MIPS-X";
1808 case EM_COLDFIRE
: return "Motorola Coldfire";
1809 case EM_68HC12
: return "Motorola M68HC12";
1810 case EM_ALPHA
: return "Alpha";
1811 case EM_CYGNUS_D10V
:
1812 case EM_D10V
: return "d10v";
1813 case EM_CYGNUS_D30V
:
1814 case EM_D30V
: return "d30v";
1815 case EM_CYGNUS_M32R
:
1816 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
1817 case EM_CYGNUS_V850
:
1818 case EM_V850
: return "NEC v850";
1819 case EM_CYGNUS_MN10300
:
1820 case EM_MN10300
: return "mn10300";
1821 case EM_CYGNUS_MN10200
:
1822 case EM_MN10200
: return "mn10200";
1823 case EM_CYGNUS_FR30
:
1824 case EM_FR30
: return "Fujitsu FR30";
1825 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1827 case EM_PJ
: return "picoJava";
1828 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1829 case EM_PCP
: return "Siemens PCP";
1830 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1831 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1832 case EM_STARCORE
: return "Motorola Star*Core processor";
1833 case EM_ME16
: return "Toyota ME16 processor";
1834 case EM_ST100
: return "STMicroelectronics ST100 processor";
1835 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1836 case EM_FX66
: return "Siemens FX66 microcontroller";
1837 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1838 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1839 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1840 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1841 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1842 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1843 case EM_SVX
: return "Silicon Graphics SVx";
1844 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1845 case EM_VAX
: return "Digital VAX";
1847 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1848 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1849 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1850 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1851 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1852 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1853 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1854 case EM_PRISM
: return "Vitesse Prism";
1855 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1856 case EM_L1OM
: return "Intel L1OM";
1858 case EM_S390
: return "IBM S/390";
1859 case EM_SCORE
: return "SUNPLUS S+Core";
1860 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1862 case EM_OR32
: return "OpenRISC";
1863 case EM_CRX
: return "National Semiconductor CRX microprocessor";
1864 case EM_DLX
: return "OpenDLX";
1866 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1867 case EM_IQ2000
: return "Vitesse IQ2000";
1869 case EM_XTENSA
: return "Tensilica Xtensa Processor";
1870 case EM_LATTICEMICO32
: return "Lattice Mico32";
1872 case EM_M32C
: return "Renesas M32c";
1873 case EM_MT
: return "Morpho Techologies MT processor";
1874 case EM_BLACKFIN
: return "Analog Devices Blackfin";
1875 case EM_NIOS32
: return "Altera Nios";
1876 case EM_ALTERA_NIOS2
: return "Altera Nios II";
1877 case EM_XC16X
: return "Infineon Technologies xc16x";
1878 case EM_CYGNUS_MEP
: return "Toshiba MeP Media Engine";
1880 case EM_CR16_OLD
: return "National Semiconductor's CR16";
1881 case EM_MICROBLAZE
: return "Xilinx MicroBlaze";
1882 case EM_MICROBLAZE_OLD
: return "Xilinx MicroBlaze";
1884 snprintf (buff
, sizeof (buff
), _("<unknown>: 0x%x"), e_machine
);
1890 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
1895 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1896 e_flags
&= ~ EF_ARM_EABIMASK
;
1898 /* Handle "generic" ARM flags. */
1899 if (e_flags
& EF_ARM_RELEXEC
)
1901 strcat (buf
, ", relocatable executable");
1902 e_flags
&= ~ EF_ARM_RELEXEC
;
1905 if (e_flags
& EF_ARM_HASENTRY
)
1907 strcat (buf
, ", has entry point");
1908 e_flags
&= ~ EF_ARM_HASENTRY
;
1911 /* Now handle EABI specific flags. */
1915 strcat (buf
, ", <unrecognized EABI>");
1920 case EF_ARM_EABI_VER1
:
1921 strcat (buf
, ", Version1 EABI");
1926 /* Process flags one bit at a time. */
1927 flag
= e_flags
& - e_flags
;
1932 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1933 strcat (buf
, ", sorted symbol tables");
1943 case EF_ARM_EABI_VER2
:
1944 strcat (buf
, ", Version2 EABI");
1949 /* Process flags one bit at a time. */
1950 flag
= e_flags
& - e_flags
;
1955 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1956 strcat (buf
, ", sorted symbol tables");
1959 case EF_ARM_DYNSYMSUSESEGIDX
:
1960 strcat (buf
, ", dynamic symbols use segment index");
1963 case EF_ARM_MAPSYMSFIRST
:
1964 strcat (buf
, ", mapping symbols precede others");
1974 case EF_ARM_EABI_VER3
:
1975 strcat (buf
, ", Version3 EABI");
1978 case EF_ARM_EABI_VER4
:
1979 strcat (buf
, ", Version4 EABI");
1982 case EF_ARM_EABI_VER5
:
1983 strcat (buf
, ", Version5 EABI");
1989 /* Process flags one bit at a time. */
1990 flag
= e_flags
& - e_flags
;
1996 strcat (buf
, ", BE8");
2000 strcat (buf
, ", LE8");
2010 case EF_ARM_EABI_UNKNOWN
:
2011 strcat (buf
, ", GNU EABI");
2016 /* Process flags one bit at a time. */
2017 flag
= e_flags
& - e_flags
;
2022 case EF_ARM_INTERWORK
:
2023 strcat (buf
, ", interworking enabled");
2026 case EF_ARM_APCS_26
:
2027 strcat (buf
, ", uses APCS/26");
2030 case EF_ARM_APCS_FLOAT
:
2031 strcat (buf
, ", uses APCS/float");
2035 strcat (buf
, ", position independent");
2039 strcat (buf
, ", 8 bit structure alignment");
2042 case EF_ARM_NEW_ABI
:
2043 strcat (buf
, ", uses new ABI");
2046 case EF_ARM_OLD_ABI
:
2047 strcat (buf
, ", uses old ABI");
2050 case EF_ARM_SOFT_FLOAT
:
2051 strcat (buf
, ", software FP");
2054 case EF_ARM_VFP_FLOAT
:
2055 strcat (buf
, ", VFP");
2058 case EF_ARM_MAVERICK_FLOAT
:
2059 strcat (buf
, ", Maverick FP");
2070 strcat (buf
,", <unknown>");
2074 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
2076 static char buf
[1024];
2088 decode_ARM_machine_flags (e_flags
, buf
);
2092 switch (e_flags
& EF_FRV_CPU_MASK
)
2094 case EF_FRV_CPU_GENERIC
:
2098 strcat (buf
, ", fr???");
2101 case EF_FRV_CPU_FR300
:
2102 strcat (buf
, ", fr300");
2105 case EF_FRV_CPU_FR400
:
2106 strcat (buf
, ", fr400");
2108 case EF_FRV_CPU_FR405
:
2109 strcat (buf
, ", fr405");
2112 case EF_FRV_CPU_FR450
:
2113 strcat (buf
, ", fr450");
2116 case EF_FRV_CPU_FR500
:
2117 strcat (buf
, ", fr500");
2119 case EF_FRV_CPU_FR550
:
2120 strcat (buf
, ", fr550");
2123 case EF_FRV_CPU_SIMPLE
:
2124 strcat (buf
, ", simple");
2126 case EF_FRV_CPU_TOMCAT
:
2127 strcat (buf
, ", tomcat");
2133 if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_M68000
)
2134 strcat (buf
, ", m68000");
2135 else if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_CPU32
)
2136 strcat (buf
, ", cpu32");
2137 else if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_FIDO
)
2138 strcat (buf
, ", fido_a");
2141 char const * isa
= _("unknown");
2142 char const * mac
= _("unknown mac");
2143 char const * additional
= NULL
;
2145 switch (e_flags
& EF_M68K_CF_ISA_MASK
)
2147 case EF_M68K_CF_ISA_A_NODIV
:
2149 additional
= ", nodiv";
2151 case EF_M68K_CF_ISA_A
:
2154 case EF_M68K_CF_ISA_A_PLUS
:
2157 case EF_M68K_CF_ISA_B_NOUSP
:
2159 additional
= ", nousp";
2161 case EF_M68K_CF_ISA_B
:
2165 strcat (buf
, ", cf, isa ");
2168 strcat (buf
, additional
);
2169 if (e_flags
& EF_M68K_CF_FLOAT
)
2170 strcat (buf
, ", float");
2171 switch (e_flags
& EF_M68K_CF_MAC_MASK
)
2176 case EF_M68K_CF_MAC
:
2179 case EF_M68K_CF_EMAC
:
2192 if (e_flags
& EF_PPC_EMB
)
2193 strcat (buf
, ", emb");
2195 if (e_flags
& EF_PPC_RELOCATABLE
)
2196 strcat (buf
, ", relocatable");
2198 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
2199 strcat (buf
, ", relocatable-lib");
2203 case EM_CYGNUS_V850
:
2204 switch (e_flags
& EF_V850_ARCH
)
2207 strcat (buf
, ", v850e1");
2210 strcat (buf
, ", v850e");
2213 strcat (buf
, ", v850");
2216 strcat (buf
, ", unknown v850 architecture variant");
2222 case EM_CYGNUS_M32R
:
2223 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
2224 strcat (buf
, ", m32r");
2228 case EM_MIPS_RS3_LE
:
2229 if (e_flags
& EF_MIPS_NOREORDER
)
2230 strcat (buf
, ", noreorder");
2232 if (e_flags
& EF_MIPS_PIC
)
2233 strcat (buf
, ", pic");
2235 if (e_flags
& EF_MIPS_CPIC
)
2236 strcat (buf
, ", cpic");
2238 if (e_flags
& EF_MIPS_UCODE
)
2239 strcat (buf
, ", ugen_reserved");
2241 if (e_flags
& EF_MIPS_ABI2
)
2242 strcat (buf
, ", abi2");
2244 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
2245 strcat (buf
, ", odk first");
2247 if (e_flags
& EF_MIPS_32BITMODE
)
2248 strcat (buf
, ", 32bitmode");
2250 switch ((e_flags
& EF_MIPS_MACH
))
2252 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
2253 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
2254 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
2255 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
2256 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
2257 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
2258 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
2259 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
2260 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
2261 case E_MIPS_MACH_9000
: strcat (buf
, ", 9000"); break;
2262 case E_MIPS_MACH_LS2E
: strcat (buf
, ", loongson-2e"); break;
2263 case E_MIPS_MACH_LS2F
: strcat (buf
, ", loongson-2f"); break;
2264 case E_MIPS_MACH_OCTEON
: strcat (buf
, ", octeon"); break;
2265 case E_MIPS_MACH_XLR
: strcat (buf
, ", xlr"); break;
2267 /* We simply ignore the field in this case to avoid confusion:
2268 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2271 default: strcat (buf
, ", unknown CPU"); break;
2274 switch ((e_flags
& EF_MIPS_ABI
))
2276 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
2277 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
2278 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
2279 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
2281 /* We simply ignore the field in this case to avoid confusion:
2282 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2283 This means it is likely to be an o32 file, but not for
2286 default: strcat (buf
, ", unknown ABI"); break;
2289 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
2290 strcat (buf
, ", mdmx");
2292 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
2293 strcat (buf
, ", mips16");
2295 switch ((e_flags
& EF_MIPS_ARCH
))
2297 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
2298 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
2299 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
2300 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
2301 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
2302 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
2303 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
2304 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
2305 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
2306 default: strcat (buf
, ", unknown ISA"); break;
2312 switch ((e_flags
& EF_SH_MACH_MASK
))
2314 case EF_SH1
: strcat (buf
, ", sh1"); break;
2315 case EF_SH2
: strcat (buf
, ", sh2"); break;
2316 case EF_SH3
: strcat (buf
, ", sh3"); break;
2317 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
2318 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
2319 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
2320 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
2321 case EF_SH4
: strcat (buf
, ", sh4"); break;
2322 case EF_SH5
: strcat (buf
, ", sh5"); break;
2323 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
2324 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
2325 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
2326 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
2327 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
2328 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
2329 case EF_SH3_NOMMU
: strcat (buf
, ", sh3-nommu"); break;
2330 case EF_SH4_NOMMU_NOFPU
: strcat (buf
, ", sh4-nommu-nofpu"); break;
2331 case EF_SH2A_SH4_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2332 case EF_SH2A_SH3_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh3-nommu"); break;
2333 case EF_SH2A_SH4
: strcat (buf
, ", sh2a-or-sh4"); break;
2334 case EF_SH2A_SH3E
: strcat (buf
, ", sh2a-or-sh3e"); break;
2335 default: strcat (buf
, ", unknown ISA"); break;
2341 if (e_flags
& EF_SPARC_32PLUS
)
2342 strcat (buf
, ", v8+");
2344 if (e_flags
& EF_SPARC_SUN_US1
)
2345 strcat (buf
, ", ultrasparcI");
2347 if (e_flags
& EF_SPARC_SUN_US3
)
2348 strcat (buf
, ", ultrasparcIII");
2350 if (e_flags
& EF_SPARC_HAL_R1
)
2351 strcat (buf
, ", halr1");
2353 if (e_flags
& EF_SPARC_LEDATA
)
2354 strcat (buf
, ", ledata");
2356 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2357 strcat (buf
, ", tso");
2359 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2360 strcat (buf
, ", pso");
2362 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2363 strcat (buf
, ", rmo");
2367 switch (e_flags
& EF_PARISC_ARCH
)
2369 case EFA_PARISC_1_0
:
2370 strcpy (buf
, ", PA-RISC 1.0");
2372 case EFA_PARISC_1_1
:
2373 strcpy (buf
, ", PA-RISC 1.1");
2375 case EFA_PARISC_2_0
:
2376 strcpy (buf
, ", PA-RISC 2.0");
2381 if (e_flags
& EF_PARISC_TRAPNIL
)
2382 strcat (buf
, ", trapnil");
2383 if (e_flags
& EF_PARISC_EXT
)
2384 strcat (buf
, ", ext");
2385 if (e_flags
& EF_PARISC_LSB
)
2386 strcat (buf
, ", lsb");
2387 if (e_flags
& EF_PARISC_WIDE
)
2388 strcat (buf
, ", wide");
2389 if (e_flags
& EF_PARISC_NO_KABP
)
2390 strcat (buf
, ", no kabp");
2391 if (e_flags
& EF_PARISC_LAZYSWAP
)
2392 strcat (buf
, ", lazyswap");
2397 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2398 strcat (buf
, ", new calling convention");
2400 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2401 strcat (buf
, ", gnu calling convention");
2405 if ((e_flags
& EF_IA_64_ABI64
))
2406 strcat (buf
, ", 64-bit");
2408 strcat (buf
, ", 32-bit");
2409 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2410 strcat (buf
, ", reduced fp model");
2411 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2412 strcat (buf
, ", no function descriptors, constant gp");
2413 else if ((e_flags
& EF_IA_64_CONS_GP
))
2414 strcat (buf
, ", constant gp");
2415 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2416 strcat (buf
, ", absolute");
2420 if ((e_flags
& EF_VAX_NONPIC
))
2421 strcat (buf
, ", non-PIC");
2422 if ((e_flags
& EF_VAX_DFLOAT
))
2423 strcat (buf
, ", D-Float");
2424 if ((e_flags
& EF_VAX_GFLOAT
))
2425 strcat (buf
, ", G-Float");
2434 get_osabi_name (unsigned int osabi
)
2436 static char buff
[32];
2440 case ELFOSABI_NONE
: return "UNIX - System V";
2441 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2442 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2443 case ELFOSABI_LINUX
: return "UNIX - Linux";
2444 case ELFOSABI_HURD
: return "GNU/Hurd";
2445 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2446 case ELFOSABI_AIX
: return "UNIX - AIX";
2447 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2448 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2449 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2450 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2451 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2452 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2453 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2454 case ELFOSABI_AROS
: return "AROS";
2455 case ELFOSABI_STANDALONE
: return _("Standalone App");
2456 case ELFOSABI_ARM
: return "ARM";
2458 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), osabi
);
2464 get_arm_segment_type (unsigned long type
)
2478 get_mips_segment_type (unsigned long type
)
2482 case PT_MIPS_REGINFO
:
2484 case PT_MIPS_RTPROC
:
2486 case PT_MIPS_OPTIONS
:
2496 get_parisc_segment_type (unsigned long type
)
2500 case PT_HP_TLS
: return "HP_TLS";
2501 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2502 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2503 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2504 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2505 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2506 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2507 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2508 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2509 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2510 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2511 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2512 case PT_HP_OPT_ANNOT
: return "HP_OPT_ANNOT";
2513 case PT_HP_HSL_ANNOT
: return "HP_HSL_ANNOT";
2514 case PT_HP_STACK
: return "HP_STACK";
2515 case PT_HP_CORE_UTSNAME
: return "HP_CORE_UTSNAME";
2516 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2517 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2518 case PT_PARISC_WEAKORDER
: return "PARISC_WEAKORDER";
2527 get_ia64_segment_type (unsigned long type
)
2531 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2532 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2533 case PT_HP_TLS
: return "HP_TLS";
2534 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2535 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2536 case PT_IA_64_HP_STACK
: return "HP_STACK";
2545 get_segment_type (unsigned long p_type
)
2547 static char buff
[32];
2551 case PT_NULL
: return "NULL";
2552 case PT_LOAD
: return "LOAD";
2553 case PT_DYNAMIC
: return "DYNAMIC";
2554 case PT_INTERP
: return "INTERP";
2555 case PT_NOTE
: return "NOTE";
2556 case PT_SHLIB
: return "SHLIB";
2557 case PT_PHDR
: return "PHDR";
2558 case PT_TLS
: return "TLS";
2560 case PT_GNU_EH_FRAME
:
2561 return "GNU_EH_FRAME";
2562 case PT_GNU_STACK
: return "GNU_STACK";
2563 case PT_GNU_RELRO
: return "GNU_RELRO";
2566 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2568 const char * result
;
2570 switch (elf_header
.e_machine
)
2573 result
= get_arm_segment_type (p_type
);
2576 case EM_MIPS_RS3_LE
:
2577 result
= get_mips_segment_type (p_type
);
2580 result
= get_parisc_segment_type (p_type
);
2583 result
= get_ia64_segment_type (p_type
);
2593 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2595 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2597 const char * result
;
2599 switch (elf_header
.e_machine
)
2602 result
= get_parisc_segment_type (p_type
);
2605 result
= get_ia64_segment_type (p_type
);
2615 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2618 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), p_type
);
2625 get_mips_section_type_name (unsigned int sh_type
)
2629 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2630 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2631 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2632 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2633 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2634 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2635 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2636 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2637 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2638 case SHT_MIPS_RELD
: return "MIPS_RELD";
2639 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2640 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2641 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2642 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2643 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2644 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2645 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2646 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2647 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2648 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2649 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2650 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2651 case SHT_MIPS_LINE
: return "MIPS_LINE";
2652 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2653 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2654 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2655 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2656 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2657 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2658 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2659 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2660 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2661 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2662 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2663 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2664 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2665 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2666 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2667 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2675 get_parisc_section_type_name (unsigned int sh_type
)
2679 case SHT_PARISC_EXT
: return "PARISC_EXT";
2680 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2681 case SHT_PARISC_DOC
: return "PARISC_DOC";
2682 case SHT_PARISC_ANNOT
: return "PARISC_ANNOT";
2683 case SHT_PARISC_SYMEXTN
: return "PARISC_SYMEXTN";
2684 case SHT_PARISC_STUBS
: return "PARISC_STUBS";
2685 case SHT_PARISC_DLKM
: return "PARISC_DLKM";
2693 get_ia64_section_type_name (unsigned int sh_type
)
2695 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2696 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2697 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2701 case SHT_IA_64_EXT
: return "IA_64_EXT";
2702 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2703 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2704 case SHT_IA_64_VMS_TRACE
: return "VMS_TRACE";
2705 case SHT_IA_64_VMS_TIE_SIGNATURES
: return "VMS_TIE_SIGNATURES";
2706 case SHT_IA_64_VMS_DEBUG
: return "VMS_DEBUG";
2707 case SHT_IA_64_VMS_DEBUG_STR
: return "VMS_DEBUG_STR";
2708 case SHT_IA_64_VMS_LINKAGES
: return "VMS_LINKAGES";
2709 case SHT_IA_64_VMS_SYMBOL_VECTOR
: return "VMS_SYMBOL_VECTOR";
2710 case SHT_IA_64_VMS_FIXUP
: return "VMS_FIXUP";
2718 get_x86_64_section_type_name (unsigned int sh_type
)
2722 case SHT_X86_64_UNWIND
: return "X86_64_UNWIND";
2730 get_arm_section_type_name (unsigned int sh_type
)
2734 case SHT_ARM_EXIDX
: return "ARM_EXIDX";
2735 case SHT_ARM_PREEMPTMAP
: return "ARM_PREEMPTMAP";
2736 case SHT_ARM_ATTRIBUTES
: return "ARM_ATTRIBUTES";
2737 case SHT_ARM_DEBUGOVERLAY
: return "ARM_DEBUGOVERLAY";
2738 case SHT_ARM_OVERLAYSECTION
: return "ARM_OVERLAYSECTION";
2746 get_section_type_name (unsigned int sh_type
)
2748 static char buff
[32];
2752 case SHT_NULL
: return "NULL";
2753 case SHT_PROGBITS
: return "PROGBITS";
2754 case SHT_SYMTAB
: return "SYMTAB";
2755 case SHT_STRTAB
: return "STRTAB";
2756 case SHT_RELA
: return "RELA";
2757 case SHT_HASH
: return "HASH";
2758 case SHT_DYNAMIC
: return "DYNAMIC";
2759 case SHT_NOTE
: return "NOTE";
2760 case SHT_NOBITS
: return "NOBITS";
2761 case SHT_REL
: return "REL";
2762 case SHT_SHLIB
: return "SHLIB";
2763 case SHT_DYNSYM
: return "DYNSYM";
2764 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2765 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2766 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2767 case SHT_GNU_HASH
: return "GNU_HASH";
2768 case SHT_GROUP
: return "GROUP";
2769 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2770 case SHT_GNU_verdef
: return "VERDEF";
2771 case SHT_GNU_verneed
: return "VERNEED";
2772 case SHT_GNU_versym
: return "VERSYM";
2773 case 0x6ffffff0: return "VERSYM";
2774 case 0x6ffffffc: return "VERDEF";
2775 case 0x7ffffffd: return "AUXILIARY";
2776 case 0x7fffffff: return "FILTER";
2777 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2780 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2782 const char * result
;
2784 switch (elf_header
.e_machine
)
2787 case EM_MIPS_RS3_LE
:
2788 result
= get_mips_section_type_name (sh_type
);
2791 result
= get_parisc_section_type_name (sh_type
);
2794 result
= get_ia64_section_type_name (sh_type
);
2798 result
= get_x86_64_section_type_name (sh_type
);
2801 result
= get_arm_section_type_name (sh_type
);
2811 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2813 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2815 const char * result
;
2817 switch (elf_header
.e_machine
)
2820 result
= get_ia64_section_type_name (sh_type
);
2830 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2832 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2833 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2835 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), sh_type
);
2841 #define OPTION_DEBUG_DUMP 512
2843 static struct option options
[] =
2845 {"all", no_argument
, 0, 'a'},
2846 {"file-header", no_argument
, 0, 'h'},
2847 {"program-headers", no_argument
, 0, 'l'},
2848 {"headers", no_argument
, 0, 'e'},
2849 {"histogram", no_argument
, 0, 'I'},
2850 {"segments", no_argument
, 0, 'l'},
2851 {"sections", no_argument
, 0, 'S'},
2852 {"section-headers", no_argument
, 0, 'S'},
2853 {"section-groups", no_argument
, 0, 'g'},
2854 {"section-details", no_argument
, 0, 't'},
2855 {"full-section-name",no_argument
, 0, 'N'},
2856 {"symbols", no_argument
, 0, 's'},
2857 {"syms", no_argument
, 0, 's'},
2858 {"relocs", no_argument
, 0, 'r'},
2859 {"notes", no_argument
, 0, 'n'},
2860 {"dynamic", no_argument
, 0, 'd'},
2861 {"arch-specific", no_argument
, 0, 'A'},
2862 {"version-info", no_argument
, 0, 'V'},
2863 {"use-dynamic", no_argument
, 0, 'D'},
2864 {"unwind", no_argument
, 0, 'u'},
2865 {"archive-index", no_argument
, 0, 'c'},
2866 {"hex-dump", required_argument
, 0, 'x'},
2867 {"relocated-dump", required_argument
, 0, 'R'},
2868 {"string-dump", required_argument
, 0, 'p'},
2869 #ifdef SUPPORT_DISASSEMBLY
2870 {"instruction-dump", required_argument
, 0, 'i'},
2872 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2874 {"version", no_argument
, 0, 'v'},
2875 {"wide", no_argument
, 0, 'W'},
2876 {"help", no_argument
, 0, 'H'},
2877 {0, no_argument
, 0, 0}
2881 usage (FILE * stream
)
2883 fprintf (stream
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2884 fprintf (stream
, _(" Display information about the contents of ELF format files\n"));
2885 fprintf (stream
, _(" Options are:\n\
2886 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2887 -h --file-header Display the ELF file header\n\
2888 -l --program-headers Display the program headers\n\
2889 --segments An alias for --program-headers\n\
2890 -S --section-headers Display the sections' header\n\
2891 --sections An alias for --section-headers\n\
2892 -g --section-groups Display the section groups\n\
2893 -t --section-details Display the section details\n\
2894 -e --headers Equivalent to: -h -l -S\n\
2895 -s --syms Display the symbol table\n\
2896 --symbols An alias for --syms\n\
2897 -n --notes Display the core notes (if present)\n\
2898 -r --relocs Display the relocations (if present)\n\
2899 -u --unwind Display the unwind info (if present)\n\
2900 -d --dynamic Display the dynamic section (if present)\n\
2901 -V --version-info Display the version sections (if present)\n\
2902 -A --arch-specific Display architecture specific information (if any).\n\
2903 -c --archive-index Display the symbol/file index in an archive\n\
2904 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2905 -x --hex-dump=<number|name>\n\
2906 Dump the contents of section <number|name> as bytes\n\
2907 -p --string-dump=<number|name>\n\
2908 Dump the contents of section <number|name> as strings\n\
2909 -R --relocated-dump=<number|name>\n\
2910 Dump the contents of section <number|name> as relocated bytes\n\
2911 -w[lLiaprmfFsoR] or\n\
2912 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]\n\
2913 Display the contents of DWARF2 debug sections\n"));
2914 #ifdef SUPPORT_DISASSEMBLY
2915 fprintf (stream
, _("\
2916 -i --instruction-dump=<number|name>\n\
2917 Disassemble the contents of section <number|name>\n"));
2919 fprintf (stream
, _("\
2920 -I --histogram Display histogram of bucket list lengths\n\
2921 -W --wide Allow output width to exceed 80 characters\n\
2922 @<file> Read options from <file>\n\
2923 -H --help Display this information\n\
2924 -v --version Display the version number of readelf\n"));
2926 if (REPORT_BUGS_TO
[0] && stream
== stdout
)
2927 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2929 exit (stream
== stdout
? 0 : 1);
2932 /* Record the fact that the user wants the contents of section number
2933 SECTION to be displayed using the method(s) encoded as flags bits
2934 in TYPE. Note, TYPE can be zero if we are creating the array for
2938 request_dump_bynumber (unsigned int section
, dump_type type
)
2940 if (section
>= num_dump_sects
)
2942 dump_type
* new_dump_sects
;
2944 new_dump_sects
= calloc (section
+ 1, sizeof (* dump_sects
));
2946 if (new_dump_sects
== NULL
)
2947 error (_("Out of memory allocating dump request table.\n"));
2950 /* Copy current flag settings. */
2951 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
* sizeof (* dump_sects
));
2955 dump_sects
= new_dump_sects
;
2956 num_dump_sects
= section
+ 1;
2961 dump_sects
[section
] |= type
;
2966 /* Request a dump by section name. */
2969 request_dump_byname (const char * section
, dump_type type
)
2971 struct dump_list_entry
* new_request
;
2973 new_request
= malloc (sizeof (struct dump_list_entry
));
2975 error (_("Out of memory allocating dump request table.\n"));
2977 new_request
->name
= strdup (section
);
2978 if (!new_request
->name
)
2979 error (_("Out of memory allocating dump request table.\n"));
2981 new_request
->type
= type
;
2983 new_request
->next
= dump_sects_byname
;
2984 dump_sects_byname
= new_request
;
2988 request_dump (dump_type type
)
2994 section
= strtoul (optarg
, & cp
, 0);
2996 if (! *cp
&& section
>= 0)
2997 request_dump_bynumber (section
, type
);
2999 request_dump_byname (optarg
, type
);
3004 parse_args (int argc
, char ** argv
)
3011 while ((c
= getopt_long
3012 (argc
, argv
, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options
, NULL
)) != EOF
)
3030 do_section_groups
++;
3038 do_section_groups
++;
3043 do_section_details
++;
3087 request_dump (HEX_DUMP
);
3090 request_dump (STRING_DUMP
);
3093 request_dump (RELOC_DUMP
);
3100 dwarf_select_sections_all ();
3105 dwarf_select_sections_by_letters (optarg
);
3108 case OPTION_DEBUG_DUMP
:
3115 dwarf_select_sections_by_names (optarg
);
3118 #ifdef SUPPORT_DISASSEMBLY
3120 request_dump (DISASS_DUMP
);
3124 print_version (program_name
);
3133 /* xgettext:c-format */
3134 error (_("Invalid option '-%c'\n"), c
);
3141 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
3142 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
3143 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
3144 && !do_section_groups
&& !do_archive_index
)
3148 warn (_("Nothing to do.\n"));
3154 get_elf_class (unsigned int elf_class
)
3156 static char buff
[32];
3160 case ELFCLASSNONE
: return _("none");
3161 case ELFCLASS32
: return "ELF32";
3162 case ELFCLASS64
: return "ELF64";
3164 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), elf_class
);
3170 get_data_encoding (unsigned int encoding
)
3172 static char buff
[32];
3176 case ELFDATANONE
: return _("none");
3177 case ELFDATA2LSB
: return _("2's complement, little endian");
3178 case ELFDATA2MSB
: return _("2's complement, big endian");
3180 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), encoding
);
3185 /* Decode the data held in 'elf_header'. */
3188 process_file_header (void)
3190 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
3191 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
3192 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
3193 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
3196 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3200 init_dwarf_regnames (elf_header
.e_machine
);
3206 printf (_("ELF Header:\n"));
3207 printf (_(" Magic: "));
3208 for (i
= 0; i
< EI_NIDENT
; i
++)
3209 printf ("%2.2x ", elf_header
.e_ident
[i
]);
3211 printf (_(" Class: %s\n"),
3212 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
3213 printf (_(" Data: %s\n"),
3214 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
3215 printf (_(" Version: %d %s\n"),
3216 elf_header
.e_ident
[EI_VERSION
],
3217 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
3219 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
3222 printf (_(" OS/ABI: %s\n"),
3223 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
3224 printf (_(" ABI Version: %d\n"),
3225 elf_header
.e_ident
[EI_ABIVERSION
]);
3226 printf (_(" Type: %s\n"),
3227 get_file_type (elf_header
.e_type
));
3228 printf (_(" Machine: %s\n"),
3229 get_machine_name (elf_header
.e_machine
));
3230 printf (_(" Version: 0x%lx\n"),
3231 (unsigned long) elf_header
.e_version
);
3233 printf (_(" Entry point address: "));
3234 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3235 printf (_("\n Start of program headers: "));
3236 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3237 printf (_(" (bytes into file)\n Start of section headers: "));
3238 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
3239 printf (_(" (bytes into file)\n"));
3241 printf (_(" Flags: 0x%lx%s\n"),
3242 (unsigned long) elf_header
.e_flags
,
3243 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
3244 printf (_(" Size of this header: %ld (bytes)\n"),
3245 (long) elf_header
.e_ehsize
);
3246 printf (_(" Size of program headers: %ld (bytes)\n"),
3247 (long) elf_header
.e_phentsize
);
3248 printf (_(" Number of program headers: %ld\n"),
3249 (long) elf_header
.e_phnum
);
3250 printf (_(" Size of section headers: %ld (bytes)\n"),
3251 (long) elf_header
.e_shentsize
);
3252 printf (_(" Number of section headers: %ld"),
3253 (long) elf_header
.e_shnum
);
3254 if (section_headers
!= NULL
&& elf_header
.e_shnum
== SHN_UNDEF
)
3255 printf (" (%ld)", (long) section_headers
[0].sh_size
);
3256 putc ('\n', stdout
);
3257 printf (_(" Section header string table index: %ld"),
3258 (long) elf_header
.e_shstrndx
);
3259 if (section_headers
!= NULL
3260 && elf_header
.e_shstrndx
== (SHN_XINDEX
& 0xffff))
3261 printf (" (%u)", section_headers
[0].sh_link
);
3262 else if (elf_header
.e_shstrndx
!= SHN_UNDEF
3263 && elf_header
.e_shstrndx
>= elf_header
.e_shnum
)
3264 printf (" <corrupt: out of range>");
3265 putc ('\n', stdout
);
3268 if (section_headers
!= NULL
)
3270 if (elf_header
.e_shnum
== SHN_UNDEF
)
3271 elf_header
.e_shnum
= section_headers
[0].sh_size
;
3272 if (elf_header
.e_shstrndx
== (SHN_XINDEX
& 0xffff))
3273 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
3274 else if (elf_header
.e_shstrndx
>= elf_header
.e_shnum
)
3275 elf_header
.e_shstrndx
= SHN_UNDEF
;
3276 free (section_headers
);
3277 section_headers
= NULL
;
3285 get_32bit_program_headers (FILE * file
, Elf_Internal_Phdr
* program_headers
)
3287 Elf32_External_Phdr
* phdrs
;
3288 Elf32_External_Phdr
* external
;
3289 Elf_Internal_Phdr
* internal
;
3292 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3293 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3294 _("program headers"));
3298 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3299 i
< elf_header
.e_phnum
;
3300 i
++, internal
++, external
++)
3302 internal
->p_type
= BYTE_GET (external
->p_type
);
3303 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3304 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3305 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3306 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3307 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3308 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3309 internal
->p_align
= BYTE_GET (external
->p_align
);
3318 get_64bit_program_headers (FILE * file
, Elf_Internal_Phdr
* program_headers
)
3320 Elf64_External_Phdr
* phdrs
;
3321 Elf64_External_Phdr
* external
;
3322 Elf_Internal_Phdr
* internal
;
3325 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3326 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3327 _("program headers"));
3331 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3332 i
< elf_header
.e_phnum
;
3333 i
++, internal
++, external
++)
3335 internal
->p_type
= BYTE_GET (external
->p_type
);
3336 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3337 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3338 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3339 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3340 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3341 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3342 internal
->p_align
= BYTE_GET (external
->p_align
);
3350 /* Returns 1 if the program headers were read into `program_headers'. */
3353 get_program_headers (FILE * file
)
3355 Elf_Internal_Phdr
* phdrs
;
3357 /* Check cache of prior read. */
3358 if (program_headers
!= NULL
)
3361 phdrs
= cmalloc (elf_header
.e_phnum
, sizeof (Elf_Internal_Phdr
));
3365 error (_("Out of memory\n"));
3370 ? get_32bit_program_headers (file
, phdrs
)
3371 : get_64bit_program_headers (file
, phdrs
))
3373 program_headers
= phdrs
;
3381 /* Returns 1 if the program headers were loaded. */
3384 process_program_headers (FILE * file
)
3386 Elf_Internal_Phdr
* segment
;
3389 if (elf_header
.e_phnum
== 0)
3392 printf (_("\nThere are no program headers in this file.\n"));
3396 if (do_segments
&& !do_header
)
3398 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3399 printf (_("Entry point "));
3400 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3401 printf (_("\nThere are %d program headers, starting at offset "),
3402 elf_header
.e_phnum
);
3403 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3407 if (! get_program_headers (file
))
3412 if (elf_header
.e_phnum
> 1)
3413 printf (_("\nProgram Headers:\n"));
3415 printf (_("\nProgram Headers:\n"));
3419 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3422 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3426 (_(" Type Offset VirtAddr PhysAddr\n"));
3428 (_(" FileSiz MemSiz Flags Align\n"));
3435 for (i
= 0, segment
= program_headers
;
3436 i
< elf_header
.e_phnum
;
3441 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3445 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3446 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3447 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3448 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3449 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3451 (segment
->p_flags
& PF_R
? 'R' : ' '),
3452 (segment
->p_flags
& PF_W
? 'W' : ' '),
3453 (segment
->p_flags
& PF_X
? 'E' : ' '));
3454 printf ("%#lx", (unsigned long) segment
->p_align
);
3458 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3459 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3462 print_vma (segment
->p_offset
, FULL_HEX
);
3466 print_vma (segment
->p_vaddr
, FULL_HEX
);
3468 print_vma (segment
->p_paddr
, FULL_HEX
);
3471 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3472 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3475 print_vma (segment
->p_filesz
, FULL_HEX
);
3479 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3480 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3483 print_vma (segment
->p_offset
, FULL_HEX
);
3487 (segment
->p_flags
& PF_R
? 'R' : ' '),
3488 (segment
->p_flags
& PF_W
? 'W' : ' '),
3489 (segment
->p_flags
& PF_X
? 'E' : ' '));
3491 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3492 printf ("%#lx", (unsigned long) segment
->p_align
);
3495 print_vma (segment
->p_align
, PREFIX_HEX
);
3500 print_vma (segment
->p_offset
, FULL_HEX
);
3502 print_vma (segment
->p_vaddr
, FULL_HEX
);
3504 print_vma (segment
->p_paddr
, FULL_HEX
);
3506 print_vma (segment
->p_filesz
, FULL_HEX
);
3508 print_vma (segment
->p_memsz
, FULL_HEX
);
3510 (segment
->p_flags
& PF_R
? 'R' : ' '),
3511 (segment
->p_flags
& PF_W
? 'W' : ' '),
3512 (segment
->p_flags
& PF_X
? 'E' : ' '));
3513 print_vma (segment
->p_align
, HEX
);
3517 switch (segment
->p_type
)
3521 error (_("more than one dynamic segment\n"));
3523 /* By default, assume that the .dynamic section is the first
3524 section in the DYNAMIC segment. */
3525 dynamic_addr
= segment
->p_offset
;
3526 dynamic_size
= segment
->p_filesz
;
3528 /* Try to locate the .dynamic section. If there is
3529 a section header table, we can easily locate it. */
3530 if (section_headers
!= NULL
)
3532 Elf_Internal_Shdr
* sec
;
3534 sec
= find_section (".dynamic");
3535 if (sec
== NULL
|| sec
->sh_size
== 0)
3537 error (_("no .dynamic section in the dynamic segment\n"));
3541 if (sec
->sh_type
== SHT_NOBITS
)
3547 dynamic_addr
= sec
->sh_offset
;
3548 dynamic_size
= sec
->sh_size
;
3550 if (dynamic_addr
< segment
->p_offset
3551 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
3552 warn (_("the .dynamic section is not contained"
3553 " within the dynamic segment\n"));
3554 else if (dynamic_addr
> segment
->p_offset
)
3555 warn (_("the .dynamic section is not the first section"
3556 " in the dynamic segment.\n"));
3561 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3563 error (_("Unable to find program interpreter name\n"));
3567 int ret
= snprintf (fmt
, sizeof (fmt
), "%%%ds", PATH_MAX
);
3569 if (ret
>= (int) sizeof (fmt
) || ret
< 0)
3570 error (_("Internal error: failed to create format string to display program interpreter\n"));
3572 program_interpreter
[0] = 0;
3573 if (fscanf (file
, fmt
, program_interpreter
) <= 0)
3574 error (_("Unable to read program interpreter name\n"));
3577 printf (_("\n [Requesting program interpreter: %s]"),
3578 program_interpreter
);
3584 putc ('\n', stdout
);
3587 if (do_segments
&& section_headers
!= NULL
&& string_table
!= NULL
)
3589 printf (_("\n Section to Segment mapping:\n"));
3590 printf (_(" Segment Sections...\n"));
3592 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3595 Elf_Internal_Shdr
* section
;
3597 segment
= program_headers
+ i
;
3598 section
= section_headers
+ 1;
3600 printf (" %2.2d ", i
);
3602 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3604 if (ELF_IS_SECTION_IN_SEGMENT_MEMORY (section
, segment
))
3605 printf ("%s ", SECTION_NAME (section
));
3616 /* Find the file offset corresponding to VMA by using the program headers. */
3619 offset_from_vma (FILE * file
, bfd_vma vma
, bfd_size_type size
)
3621 Elf_Internal_Phdr
* seg
;
3623 if (! get_program_headers (file
))
3625 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3629 for (seg
= program_headers
;
3630 seg
< program_headers
+ elf_header
.e_phnum
;
3633 if (seg
->p_type
!= PT_LOAD
)
3636 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3637 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3638 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3641 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3642 (unsigned long) vma
);
3648 get_32bit_section_headers (FILE * file
, unsigned int num
)
3650 Elf32_External_Shdr
* shdrs
;
3651 Elf_Internal_Shdr
* internal
;
3654 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3655 elf_header
.e_shentsize
, num
, _("section headers"));
3659 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3661 if (section_headers
== NULL
)
3663 error (_("Out of memory\n"));
3667 for (i
= 0, internal
= section_headers
;
3671 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3672 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3673 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3674 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3675 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3676 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3677 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3678 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3679 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3680 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3689 get_64bit_section_headers (FILE * file
, unsigned int num
)
3691 Elf64_External_Shdr
* shdrs
;
3692 Elf_Internal_Shdr
* internal
;
3695 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3696 elf_header
.e_shentsize
, num
, _("section headers"));
3700 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3702 if (section_headers
== NULL
)
3704 error (_("Out of memory\n"));
3708 for (i
= 0, internal
= section_headers
;
3712 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3713 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3714 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3715 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3716 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3717 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3718 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3719 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3720 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3721 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3729 static Elf_Internal_Sym
*
3730 get_32bit_elf_symbols (FILE * file
, Elf_Internal_Shdr
* section
)
3732 unsigned long number
;
3733 Elf32_External_Sym
* esyms
;
3734 Elf_External_Sym_Shndx
* shndx
;
3735 Elf_Internal_Sym
* isyms
;
3736 Elf_Internal_Sym
* psym
;
3739 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3745 if (symtab_shndx_hdr
!= NULL
3746 && (symtab_shndx_hdr
->sh_link
3747 == (unsigned long) (section
- section_headers
)))
3749 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3750 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3758 number
= section
->sh_size
/ section
->sh_entsize
;
3759 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3763 error (_("Out of memory\n"));
3770 for (j
= 0, psym
= isyms
;
3774 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3775 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3776 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3777 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3778 if (psym
->st_shndx
== (SHN_XINDEX
& 0xffff) && shndx
!= NULL
)
3780 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3781 else if (psym
->st_shndx
>= (SHN_LORESERVE
& 0xffff))
3782 psym
->st_shndx
+= SHN_LORESERVE
- (SHN_LORESERVE
& 0xffff);
3783 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3784 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3794 static Elf_Internal_Sym
*
3795 get_64bit_elf_symbols (FILE * file
, Elf_Internal_Shdr
* section
)
3797 unsigned long number
;
3798 Elf64_External_Sym
* esyms
;
3799 Elf_External_Sym_Shndx
* shndx
;
3800 Elf_Internal_Sym
* isyms
;
3801 Elf_Internal_Sym
* psym
;
3804 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3810 if (symtab_shndx_hdr
!= NULL
3811 && (symtab_shndx_hdr
->sh_link
3812 == (unsigned long) (section
- section_headers
)))
3814 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3815 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3823 number
= section
->sh_size
/ section
->sh_entsize
;
3824 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3828 error (_("Out of memory\n"));
3835 for (j
= 0, psym
= isyms
;
3839 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3840 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3841 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3842 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3843 if (psym
->st_shndx
== (SHN_XINDEX
& 0xffff) && shndx
!= NULL
)
3845 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3846 else if (psym
->st_shndx
>= (SHN_LORESERVE
& 0xffff))
3847 psym
->st_shndx
+= SHN_LORESERVE
- (SHN_LORESERVE
& 0xffff);
3848 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3849 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3860 get_elf_section_flags (bfd_vma sh_flags
)
3862 static char buff
[1024];
3864 int field_size
= is_32bit_elf
? 8 : 16;
3865 int index
, size
= sizeof (buff
) - (field_size
+ 4 + 1);
3866 bfd_vma os_flags
= 0;
3867 bfd_vma proc_flags
= 0;
3868 bfd_vma unknown_flags
= 0;
3876 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
3877 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
3878 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
3879 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
3880 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
3881 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
3882 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
3883 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
3884 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
3885 /* 9 */ { STRING_COMMA_LEN ("TLS") },
3886 /* IA-64 specific. */
3887 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
3888 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
3889 /* IA-64 OpenVMS specific. */
3890 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
3891 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
3892 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
3893 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
3894 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
3895 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
3896 /* SPARC specific. */
3897 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
3898 /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
3901 if (do_section_details
)
3903 sprintf (buff
, "[%*.*lx]: ",
3904 field_size
, field_size
, (unsigned long) sh_flags
);
3905 p
+= field_size
+ 4;
3912 flag
= sh_flags
& - sh_flags
;
3915 if (do_section_details
)
3919 case SHF_WRITE
: index
= 0; break;
3920 case SHF_ALLOC
: index
= 1; break;
3921 case SHF_EXECINSTR
: index
= 2; break;
3922 case SHF_MERGE
: index
= 3; break;
3923 case SHF_STRINGS
: index
= 4; break;
3924 case SHF_INFO_LINK
: index
= 5; break;
3925 case SHF_LINK_ORDER
: index
= 6; break;
3926 case SHF_OS_NONCONFORMING
: index
= 7; break;
3927 case SHF_GROUP
: index
= 8; break;
3928 case SHF_TLS
: index
= 9; break;
3932 switch (elf_header
.e_machine
)
3935 if (flag
== SHF_IA_64_SHORT
)
3937 else if (flag
== SHF_IA_64_NORECOV
)
3940 else if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_OPENVMS
)
3943 case SHF_IA_64_VMS_GLOBAL
: index
= 12; break;
3944 case SHF_IA_64_VMS_OVERLAID
: index
= 13; break;
3945 case SHF_IA_64_VMS_SHARED
: index
= 14; break;
3946 case SHF_IA_64_VMS_VECTOR
: index
= 15; break;
3947 case SHF_IA_64_VMS_ALLOC_64BIT
: index
= 16; break;
3948 case SHF_IA_64_VMS_PROTECTED
: index
= 17; break;
3954 case EM_OLD_SPARCV9
:
3955 case EM_SPARC32PLUS
:
3958 if (flag
== SHF_EXCLUDE
)
3960 else if (flag
== SHF_ORDERED
)
3970 if (p
!= buff
+ field_size
+ 4)
3972 if (size
< (10 + 2))
3979 size
-= flags
[index
].len
;
3980 p
= stpcpy (p
, flags
[index
].str
);
3982 else if (flag
& SHF_MASKOS
)
3984 else if (flag
& SHF_MASKPROC
)
3987 unknown_flags
|= flag
;
3993 case SHF_WRITE
: *p
= 'W'; break;
3994 case SHF_ALLOC
: *p
= 'A'; break;
3995 case SHF_EXECINSTR
: *p
= 'X'; break;
3996 case SHF_MERGE
: *p
= 'M'; break;
3997 case SHF_STRINGS
: *p
= 'S'; break;
3998 case SHF_INFO_LINK
: *p
= 'I'; break;
3999 case SHF_LINK_ORDER
: *p
= 'L'; break;
4000 case SHF_OS_NONCONFORMING
: *p
= 'O'; break;
4001 case SHF_GROUP
: *p
= 'G'; break;
4002 case SHF_TLS
: *p
= 'T'; break;
4005 if ((elf_header
.e_machine
== EM_X86_64
4006 || elf_header
.e_machine
== EM_L1OM
)
4007 && flag
== SHF_X86_64_LARGE
)
4009 else if (flag
& SHF_MASKOS
)
4012 sh_flags
&= ~ SHF_MASKOS
;
4014 else if (flag
& SHF_MASKPROC
)
4017 sh_flags
&= ~ SHF_MASKPROC
;
4027 if (do_section_details
)
4031 size
-= 5 + field_size
;
4032 if (p
!= buff
+ field_size
+ 4)
4040 sprintf (p
, "OS (%*.*lx)", field_size
, field_size
,
4041 (unsigned long) os_flags
);
4042 p
+= 5 + field_size
;
4046 size
-= 7 + field_size
;
4047 if (p
!= buff
+ field_size
+ 4)
4055 sprintf (p
, "PROC (%*.*lx)", field_size
, field_size
,
4056 (unsigned long) proc_flags
);
4057 p
+= 7 + field_size
;
4061 size
-= 10 + field_size
;
4062 if (p
!= buff
+ field_size
+ 4)
4070 sprintf (p
, "UNKNOWN (%*.*lx)", field_size
, field_size
,
4071 (unsigned long) unknown_flags
);
4072 p
+= 10 + field_size
;
4081 process_section_headers (FILE * file
)
4083 Elf_Internal_Shdr
* section
;
4086 section_headers
= NULL
;
4088 if (elf_header
.e_shnum
== 0)
4091 printf (_("\nThere are no sections in this file.\n"));
4096 if (do_sections
&& !do_header
)
4097 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
4098 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
4102 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
4105 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
4108 /* Read in the string table, so that we have names to display. */
4109 if (elf_header
.e_shstrndx
!= SHN_UNDEF
4110 && elf_header
.e_shstrndx
< elf_header
.e_shnum
)
4112 section
= section_headers
+ elf_header
.e_shstrndx
;
4114 if (section
->sh_size
!= 0)
4116 string_table
= get_data (NULL
, file
, section
->sh_offset
,
4117 1, section
->sh_size
, _("string table"));
4119 string_table_length
= string_table
!= NULL
? section
->sh_size
: 0;
4123 /* Scan the sections for the dynamic symbol table
4124 and dynamic string table and debug sections. */
4125 dynamic_symbols
= NULL
;
4126 dynamic_strings
= NULL
;
4127 dynamic_syminfo
= NULL
;
4128 symtab_shndx_hdr
= NULL
;
4130 eh_addr_size
= is_32bit_elf
? 4 : 8;
4131 switch (elf_header
.e_machine
)
4134 case EM_MIPS_RS3_LE
:
4135 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
4136 FDE addresses. However, the ABI also has a semi-official ILP32
4137 variant for which the normal FDE address size rules apply.
4139 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
4140 section, where XX is the size of longs in bits. Unfortunately,
4141 earlier compilers provided no way of distinguishing ILP32 objects
4142 from LP64 objects, so if there's any doubt, we should assume that
4143 the official LP64 form is being used. */
4144 if ((elf_header
.e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
4145 && find_section (".gcc_compiled_long32") == NULL
)
4151 switch (elf_header
.e_flags
& EF_H8_MACH
)
4153 case E_H8_MACH_H8300
:
4154 case E_H8_MACH_H8300HN
:
4155 case E_H8_MACH_H8300SN
:
4156 case E_H8_MACH_H8300SXN
:
4159 case E_H8_MACH_H8300H
:
4160 case E_H8_MACH_H8300S
:
4161 case E_H8_MACH_H8300SX
:
4169 switch (elf_header
.e_flags
& EF_M32C_CPU_MASK
)
4171 case EF_M32C_CPU_M16C
:
4178 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
4181 size_t expected_entsize \
4182 = is_32bit_elf ? size32 : size64; \
4183 if (section->sh_entsize != expected_entsize) \
4184 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
4185 i, (unsigned long int) section->sh_entsize, \
4186 (unsigned long int) expected_entsize); \
4187 section->sh_entsize = expected_entsize; \
4190 #define CHECK_ENTSIZE(section, i, type) \
4191 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
4192 sizeof (Elf64_External_##type))
4194 for (i
= 0, section
= section_headers
;
4195 i
< elf_header
.e_shnum
;
4198 char * name
= SECTION_NAME (section
);
4200 if (section
->sh_type
== SHT_DYNSYM
)
4202 if (dynamic_symbols
!= NULL
)
4204 error (_("File contains multiple dynamic symbol tables\n"));
4208 CHECK_ENTSIZE (section
, i
, Sym
);
4209 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
4210 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
4212 else if (section
->sh_type
== SHT_STRTAB
4213 && streq (name
, ".dynstr"))
4215 if (dynamic_strings
!= NULL
)
4217 error (_("File contains multiple dynamic string tables\n"));
4221 dynamic_strings
= get_data (NULL
, file
, section
->sh_offset
,
4222 1, section
->sh_size
, _("dynamic strings"));
4223 dynamic_strings_length
= section
->sh_size
;
4225 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
4227 if (symtab_shndx_hdr
!= NULL
)
4229 error (_("File contains multiple symtab shndx tables\n"));
4232 symtab_shndx_hdr
= section
;
4234 else if (section
->sh_type
== SHT_SYMTAB
)
4235 CHECK_ENTSIZE (section
, i
, Sym
);
4236 else if (section
->sh_type
== SHT_GROUP
)
4237 CHECK_ENTSIZE_VALUES (section
, i
, GRP_ENTRY_SIZE
, GRP_ENTRY_SIZE
);
4238 else if (section
->sh_type
== SHT_REL
)
4239 CHECK_ENTSIZE (section
, i
, Rel
);
4240 else if (section
->sh_type
== SHT_RELA
)
4241 CHECK_ENTSIZE (section
, i
, Rela
);
4242 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
4243 || do_debug_lines
|| do_debug_pubnames
4244 || do_debug_aranges
|| do_debug_frames
|| do_debug_macinfo
4245 || do_debug_str
|| do_debug_loc
|| do_debug_ranges
)
4246 && (const_strneq (name
, ".debug_")
4247 || const_strneq (name
, ".zdebug_")))
4250 name
+= sizeof (".zdebug_") - 1;
4252 name
+= sizeof (".debug_") - 1;
4255 || (do_debug_info
&& streq (name
, "info"))
4256 || (do_debug_abbrevs
&& streq (name
, "abbrev"))
4257 || (do_debug_lines
&& streq (name
, "line"))
4258 || (do_debug_pubnames
&& streq (name
, "pubnames"))
4259 || (do_debug_aranges
&& streq (name
, "aranges"))
4260 || (do_debug_ranges
&& streq (name
, "ranges"))
4261 || (do_debug_frames
&& streq (name
, "frame"))
4262 || (do_debug_macinfo
&& streq (name
, "macinfo"))
4263 || (do_debug_str
&& streq (name
, "str"))
4264 || (do_debug_loc
&& streq (name
, "loc"))
4266 request_dump_bynumber (i
, DEBUG_DUMP
);
4268 /* Linkonce section to be combined with .debug_info at link time. */
4269 else if ((do_debugging
|| do_debug_info
)
4270 && const_strneq (name
, ".gnu.linkonce.wi."))
4271 request_dump_bynumber (i
, DEBUG_DUMP
);
4272 else if (do_debug_frames
&& streq (name
, ".eh_frame"))
4273 request_dump_bynumber (i
, DEBUG_DUMP
);
4279 if (elf_header
.e_shnum
> 1)
4280 printf (_("\nSection Headers:\n"));
4282 printf (_("\nSection Header:\n"));
4286 if (do_section_details
)
4288 printf (_(" [Nr] Name\n"));
4289 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
4293 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4297 if (do_section_details
)
4299 printf (_(" [Nr] Name\n"));
4300 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
4304 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4308 if (do_section_details
)
4310 printf (_(" [Nr] Name\n"));
4311 printf (_(" Type Address Offset Link\n"));
4312 printf (_(" Size EntSize Info Align\n"));
4316 printf (_(" [Nr] Name Type Address Offset\n"));
4317 printf (_(" Size EntSize Flags Link Info Align\n"));
4321 if (do_section_details
)
4322 printf (_(" Flags\n"));
4324 for (i
= 0, section
= section_headers
;
4325 i
< elf_header
.e_shnum
;
4328 if (do_section_details
)
4330 printf (" [%2u] %s\n",
4332 SECTION_NAME (section
));
4333 if (is_32bit_elf
|| do_wide
)
4334 printf (" %-15.15s ",
4335 get_section_type_name (section
->sh_type
));
4338 printf ((do_wide
? " [%2u] %-17s %-15s "
4339 : " [%2u] %-17.17s %-15.15s "),
4341 SECTION_NAME (section
),
4342 get_section_type_name (section
->sh_type
));
4346 const char * link_too_big
= NULL
;
4348 print_vma (section
->sh_addr
, LONG_HEX
);
4350 printf ( " %6.6lx %6.6lx %2.2lx",
4351 (unsigned long) section
->sh_offset
,
4352 (unsigned long) section
->sh_size
,
4353 (unsigned long) section
->sh_entsize
);
4355 if (do_section_details
)
4356 fputs (" ", stdout
);
4358 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4360 if (section
->sh_link
>= elf_header
.e_shnum
)
4363 /* The sh_link value is out of range. Normally this indicates
4364 an error but it can have special values in SPARC binaries. */
4365 switch (elf_header
.e_machine
)
4367 case EM_OLD_SPARCV9
:
4368 case EM_SPARC32PLUS
:
4371 if (section
->sh_link
== (SHN_BEFORE
& 0xffff))
4372 link_too_big
= "BEFORE";
4373 else if (section
->sh_link
== (SHN_AFTER
& 0xffff))
4374 link_too_big
= "AFTER";
4381 if (do_section_details
)
4383 if (link_too_big
!= NULL
&& * link_too_big
)
4384 printf ("<%s> ", link_too_big
);
4386 printf ("%2u ", section
->sh_link
);
4387 printf ("%3u %2lu\n", section
->sh_info
,
4388 (unsigned long) section
->sh_addralign
);
4391 printf ("%2u %3u %2lu\n",
4394 (unsigned long) section
->sh_addralign
);
4396 if (link_too_big
&& ! * link_too_big
)
4397 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
4398 i
, section
->sh_link
);
4402 print_vma (section
->sh_addr
, LONG_HEX
);
4404 if ((long) section
->sh_offset
== section
->sh_offset
)
4405 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
4409 print_vma (section
->sh_offset
, LONG_HEX
);
4412 if ((unsigned long) section
->sh_size
== section
->sh_size
)
4413 printf (" %6.6lx", (unsigned long) section
->sh_size
);
4417 print_vma (section
->sh_size
, LONG_HEX
);
4420 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
4421 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
4425 print_vma (section
->sh_entsize
, LONG_HEX
);
4428 if (do_section_details
)
4429 fputs (" ", stdout
);
4431 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4433 printf ("%2u %3u ", section
->sh_link
, section
->sh_info
);
4435 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
4436 printf ("%2lu\n", (unsigned long) section
->sh_addralign
);
4439 print_vma (section
->sh_addralign
, DEC
);
4443 else if (do_section_details
)
4445 printf (" %-15.15s ",
4446 get_section_type_name (section
->sh_type
));
4447 print_vma (section
->sh_addr
, LONG_HEX
);
4448 if ((long) section
->sh_offset
== section
->sh_offset
)
4449 printf (" %16.16lx", (unsigned long) section
->sh_offset
);
4453 print_vma (section
->sh_offset
, LONG_HEX
);
4455 printf (" %u\n ", section
->sh_link
);
4456 print_vma (section
->sh_size
, LONG_HEX
);
4458 print_vma (section
->sh_entsize
, LONG_HEX
);
4460 printf (" %-16u %lu\n",
4462 (unsigned long) section
->sh_addralign
);
4467 print_vma (section
->sh_addr
, LONG_HEX
);
4468 if ((long) section
->sh_offset
== section
->sh_offset
)
4469 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
4473 print_vma (section
->sh_offset
, LONG_HEX
);
4476 print_vma (section
->sh_size
, LONG_HEX
);
4478 print_vma (section
->sh_entsize
, LONG_HEX
);
4480 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4482 printf (" %2u %3u %lu\n",
4485 (unsigned long) section
->sh_addralign
);
4488 if (do_section_details
)
4489 printf (" %s\n", get_elf_section_flags (section
->sh_flags
));
4492 if (!do_section_details
)
4493 printf (_("Key to Flags:\n\
4494 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4495 I (info), L (link order), G (group), x (unknown)\n\
4496 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4502 get_group_flags (unsigned int flags
)
4504 static char buff
[32];
4511 snprintf (buff
, sizeof (buff
), _("[<unknown>: 0x%x]"), flags
);
4518 process_section_groups (FILE * file
)
4520 Elf_Internal_Shdr
* section
;
4522 struct group
* group
;
4523 Elf_Internal_Shdr
* symtab_sec
;
4524 Elf_Internal_Shdr
* strtab_sec
;
4525 Elf_Internal_Sym
* symtab
;
4529 /* Don't process section groups unless needed. */
4530 if (!do_unwind
&& !do_section_groups
)
4533 if (elf_header
.e_shnum
== 0)
4535 if (do_section_groups
)
4536 printf (_("\nThere are no sections in this file.\n"));
4541 if (section_headers
== NULL
)
4543 error (_("Section headers are not available!\n"));
4547 section_headers_groups
= calloc (elf_header
.e_shnum
,
4548 sizeof (struct group
*));
4550 if (section_headers_groups
== NULL
)
4552 error (_("Out of memory\n"));
4556 /* Scan the sections for the group section. */
4558 for (i
= 0, section
= section_headers
;
4559 i
< elf_header
.e_shnum
;
4561 if (section
->sh_type
== SHT_GROUP
)
4564 if (group_count
== 0)
4566 if (do_section_groups
)
4567 printf (_("\nThere are no section groups in this file.\n"));
4572 section_groups
= calloc (group_count
, sizeof (struct group
));
4574 if (section_groups
== NULL
)
4576 error (_("Out of memory\n"));
4585 for (i
= 0, section
= section_headers
, group
= section_groups
;
4586 i
< elf_header
.e_shnum
;
4589 if (section
->sh_type
== SHT_GROUP
)
4591 char * name
= SECTION_NAME (section
);
4593 unsigned char * start
;
4594 unsigned char * indices
;
4595 unsigned int entry
, j
, size
;
4596 Elf_Internal_Shdr
* sec
;
4597 Elf_Internal_Sym
* sym
;
4599 /* Get the symbol table. */
4600 if (section
->sh_link
>= elf_header
.e_shnum
4601 || ((sec
= section_headers
+ section
->sh_link
)->sh_type
4604 error (_("Bad sh_link in group section `%s'\n"), name
);
4608 if (symtab_sec
!= sec
)
4613 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
);
4616 sym
= symtab
+ section
->sh_info
;
4618 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4620 if (sym
->st_shndx
== 0
4621 || sym
->st_shndx
>= elf_header
.e_shnum
)
4623 error (_("Bad sh_info in group section `%s'\n"), name
);
4627 group_name
= SECTION_NAME (section_headers
+ sym
->st_shndx
);
4636 /* Get the string table. */
4637 if (symtab_sec
->sh_link
>= elf_header
.e_shnum
)
4646 != (sec
= section_headers
+ symtab_sec
->sh_link
))
4651 strtab
= get_data (NULL
, file
, strtab_sec
->sh_offset
,
4652 1, strtab_sec
->sh_size
,
4654 strtab_size
= strtab
!= NULL
? strtab_sec
->sh_size
: 0;
4656 group_name
= sym
->st_name
< strtab_size
4657 ? strtab
+ sym
->st_name
: "<corrupt>";
4660 start
= get_data (NULL
, file
, section
->sh_offset
,
4661 1, section
->sh_size
, _("section data"));
4664 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
4665 entry
= byte_get (indices
, 4);
4668 if (do_section_groups
)
4670 printf ("\n%s group section [%5u] `%s' [%s] contains %u sections:\n",
4671 get_group_flags (entry
), i
, name
, group_name
, size
);
4673 printf (_(" [Index] Name\n"));
4676 group
->group_index
= i
;
4678 for (j
= 0; j
< size
; j
++)
4680 struct group_list
* g
;
4682 entry
= byte_get (indices
, 4);
4685 if (entry
>= elf_header
.e_shnum
)
4687 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
4688 entry
, i
, elf_header
.e_shnum
- 1);
4692 if (section_headers_groups
[entry
] != NULL
)
4696 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
4698 section_headers_groups
[entry
]->group_index
);
4703 /* Intel C/C++ compiler may put section 0 in a
4704 section group. We just warn it the first time
4705 and ignore it afterwards. */
4706 static int warned
= 0;
4709 error (_("section 0 in group section [%5u]\n"),
4710 section_headers_groups
[entry
]->group_index
);
4716 section_headers_groups
[entry
] = group
;
4718 if (do_section_groups
)
4720 sec
= section_headers
+ entry
;
4721 printf (" [%5u] %s\n", entry
, SECTION_NAME (sec
));
4724 g
= xmalloc (sizeof (struct group_list
));
4725 g
->section_index
= entry
;
4726 g
->next
= group
->root
;
4750 } dynamic_relocations
[] =
4752 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
4753 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
4754 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
4757 /* Process the reloc section. */
4760 process_relocs (FILE * file
)
4762 unsigned long rel_size
;
4763 unsigned long rel_offset
;
4769 if (do_using_dynamic
)
4773 int has_dynamic_reloc
;
4776 has_dynamic_reloc
= 0;
4778 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
4780 is_rela
= dynamic_relocations
[i
].rela
;
4781 name
= dynamic_relocations
[i
].name
;
4782 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
4783 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
4785 has_dynamic_reloc
|= rel_size
;
4787 if (is_rela
== UNKNOWN
)
4789 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
4790 switch (dynamic_info
[DT_PLTREL
])
4804 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4805 name
, rel_offset
, rel_size
);
4807 dump_relocations (file
,
4808 offset_from_vma (file
, rel_offset
, rel_size
),
4810 dynamic_symbols
, num_dynamic_syms
,
4811 dynamic_strings
, dynamic_strings_length
, is_rela
);
4815 if (! has_dynamic_reloc
)
4816 printf (_("\nThere are no dynamic relocations in this file.\n"));
4820 Elf_Internal_Shdr
* section
;
4824 for (i
= 0, section
= section_headers
;
4825 i
< elf_header
.e_shnum
;
4828 if ( section
->sh_type
!= SHT_RELA
4829 && section
->sh_type
!= SHT_REL
)
4832 rel_offset
= section
->sh_offset
;
4833 rel_size
= section
->sh_size
;
4837 Elf_Internal_Shdr
* strsec
;
4840 printf (_("\nRelocation section "));
4842 if (string_table
== NULL
)
4843 printf ("%d", section
->sh_name
);
4845 printf (_("'%s'"), SECTION_NAME (section
));
4847 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4848 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4850 is_rela
= section
->sh_type
== SHT_RELA
;
4852 if (section
->sh_link
!= 0
4853 && section
->sh_link
< elf_header
.e_shnum
)
4855 Elf_Internal_Shdr
* symsec
;
4856 Elf_Internal_Sym
* symtab
;
4857 unsigned long nsyms
;
4858 unsigned long strtablen
= 0;
4859 char * strtab
= NULL
;
4861 symsec
= section_headers
+ section
->sh_link
;
4862 if (symsec
->sh_type
!= SHT_SYMTAB
4863 && symsec
->sh_type
!= SHT_DYNSYM
)
4866 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4867 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4872 if (symsec
->sh_link
!= 0
4873 && symsec
->sh_link
< elf_header
.e_shnum
)
4875 strsec
= section_headers
+ symsec
->sh_link
;
4877 strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4880 strtablen
= strtab
== NULL
? 0 : strsec
->sh_size
;
4883 dump_relocations (file
, rel_offset
, rel_size
,
4884 symtab
, nsyms
, strtab
, strtablen
, is_rela
);
4890 dump_relocations (file
, rel_offset
, rel_size
,
4891 NULL
, 0, NULL
, 0, is_rela
);
4898 printf (_("\nThere are no relocations in this file.\n"));
4904 /* Process the unwind section. */
4906 #include "unwind-ia64.h"
4908 /* An absolute address consists of a section and an offset. If the
4909 section is NULL, the offset itself is the address, otherwise, the
4910 address equals to LOAD_ADDRESS(section) + offset. */
4914 unsigned short section
;
4918 #define ABSADDR(a) \
4920 ? section_headers [(a).section].sh_addr + (a).offset \
4923 struct ia64_unw_aux_info
4925 struct ia64_unw_table_entry
4927 struct absaddr start
;
4929 struct absaddr info
;
4931 *table
; /* Unwind table. */
4932 unsigned long table_len
; /* Length of unwind table. */
4933 unsigned char * info
; /* Unwind info. */
4934 unsigned long info_size
; /* Size of unwind info. */
4935 bfd_vma info_addr
; /* starting address of unwind info. */
4936 bfd_vma seg_base
; /* Starting address of segment. */
4937 Elf_Internal_Sym
* symtab
; /* The symbol table. */
4938 unsigned long nsyms
; /* Number of symbols. */
4939 char * strtab
; /* The string table. */
4940 unsigned long strtab_size
; /* Size of string table. */
4944 find_symbol_for_address (Elf_Internal_Sym
* symtab
,
4945 unsigned long nsyms
,
4946 const char * strtab
,
4947 unsigned long strtab_size
,
4948 struct absaddr addr
,
4949 const char ** symname
,
4952 bfd_vma dist
= 0x100000;
4953 Elf_Internal_Sym
* sym
;
4954 Elf_Internal_Sym
* best
= NULL
;
4957 for (i
= 0, sym
= symtab
; i
< nsyms
; ++i
, ++sym
)
4959 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
4960 && sym
->st_name
!= 0
4961 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
4962 && addr
.offset
>= sym
->st_value
4963 && addr
.offset
- sym
->st_value
< dist
)
4966 dist
= addr
.offset
- sym
->st_value
;
4973 *symname
= (best
->st_name
>= strtab_size
4974 ? "<corrupt>" : strtab
+ best
->st_name
);
4979 *offset
= addr
.offset
;
4983 dump_ia64_unwind (struct ia64_unw_aux_info
* aux
)
4985 struct ia64_unw_table_entry
* tp
;
4988 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4992 const unsigned char * dp
;
4993 const unsigned char * head
;
4994 const char * procname
;
4996 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
4997 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
4999 fputs ("\n<", stdout
);
5003 fputs (procname
, stdout
);
5006 printf ("+%lx", (unsigned long) offset
);
5009 fputs (">: [", stdout
);
5010 print_vma (tp
->start
.offset
, PREFIX_HEX
);
5011 fputc ('-', stdout
);
5012 print_vma (tp
->end
.offset
, PREFIX_HEX
);
5013 printf ("], info at +0x%lx\n",
5014 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
5016 head
= aux
->info
+ (ABSADDR (tp
->info
) - aux
->info_addr
);
5017 stamp
= byte_get ((unsigned char *) head
, sizeof (stamp
));
5019 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
5020 (unsigned) UNW_VER (stamp
),
5021 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
5022 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
5023 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
5024 (unsigned long) (eh_addr_size
* UNW_LENGTH (stamp
)));
5026 if (UNW_VER (stamp
) != 1)
5028 printf ("\tUnknown version.\n");
5033 for (dp
= head
+ 8; dp
< head
+ 8 + eh_addr_size
* UNW_LENGTH (stamp
);)
5034 dp
= unw_decode (dp
, in_body
, & in_body
);
5039 slurp_ia64_unwind_table (FILE * file
,
5040 struct ia64_unw_aux_info
* aux
,
5041 Elf_Internal_Shdr
* sec
)
5043 unsigned long size
, nrelas
, i
;
5044 Elf_Internal_Phdr
* seg
;
5045 struct ia64_unw_table_entry
* tep
;
5046 Elf_Internal_Shdr
* relsec
;
5047 Elf_Internal_Rela
* rela
;
5048 Elf_Internal_Rela
* rp
;
5049 unsigned char * table
;
5051 Elf_Internal_Sym
* sym
;
5052 const char * relname
;
5054 /* First, find the starting address of the segment that includes
5057 if (elf_header
.e_phnum
)
5059 if (! get_program_headers (file
))
5062 for (seg
= program_headers
;
5063 seg
< program_headers
+ elf_header
.e_phnum
;
5066 if (seg
->p_type
!= PT_LOAD
)
5069 if (sec
->sh_addr
>= seg
->p_vaddr
5070 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5072 aux
->seg_base
= seg
->p_vaddr
;
5078 /* Second, build the unwind table from the contents of the unwind section: */
5079 size
= sec
->sh_size
;
5080 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
5084 aux
->table
= xcmalloc (size
/ (3 * eh_addr_size
), sizeof (aux
->table
[0]));
5086 for (tp
= table
; tp
< table
+ size
; ++tep
)
5088 tep
->start
.section
= SHN_UNDEF
;
5089 tep
->end
.section
= SHN_UNDEF
;
5090 tep
->info
.section
= SHN_UNDEF
;
5091 tep
->start
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
5092 tep
->end
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
5093 tep
->info
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
5094 tep
->start
.offset
+= aux
->seg_base
;
5095 tep
->end
.offset
+= aux
->seg_base
;
5096 tep
->info
.offset
+= aux
->seg_base
;
5100 /* Third, apply any relocations to the unwind table: */
5101 for (relsec
= section_headers
;
5102 relsec
< section_headers
+ elf_header
.e_shnum
;
5105 if (relsec
->sh_type
!= SHT_RELA
5106 || relsec
->sh_info
>= elf_header
.e_shnum
5107 || section_headers
+ relsec
->sh_info
!= sec
)
5110 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5114 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5116 relname
= elf_ia64_reloc_type (get_reloc_type (rp
->r_info
));
5117 sym
= aux
->symtab
+ get_reloc_symindex (rp
->r_info
);
5119 if (! const_strneq (relname
, "R_IA64_SEGREL"))
5121 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5125 i
= rp
->r_offset
/ (3 * eh_addr_size
);
5127 switch (rp
->r_offset
/eh_addr_size
% 3)
5130 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5131 aux
->table
[i
].start
.offset
+= rp
->r_addend
+ sym
->st_value
;
5134 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5135 aux
->table
[i
].end
.offset
+= rp
->r_addend
+ sym
->st_value
;
5138 aux
->table
[i
].info
.section
= sym
->st_shndx
;
5139 aux
->table
[i
].info
.offset
+= rp
->r_addend
+ sym
->st_value
;
5149 aux
->table_len
= size
/ (3 * eh_addr_size
);
5154 ia64_process_unwind (FILE * file
)
5156 Elf_Internal_Shdr
* sec
;
5157 Elf_Internal_Shdr
* unwsec
= NULL
;
5158 Elf_Internal_Shdr
* strsec
;
5159 unsigned long i
, unwcount
= 0, unwstart
= 0;
5160 struct ia64_unw_aux_info aux
;
5162 memset (& aux
, 0, sizeof (aux
));
5164 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5166 if (sec
->sh_type
== SHT_SYMTAB
5167 && sec
->sh_link
< elf_header
.e_shnum
)
5169 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5170 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5172 strsec
= section_headers
+ sec
->sh_link
;
5173 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
5174 1, strsec
->sh_size
, _("string table"));
5175 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5177 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
5182 printf (_("\nThere are no unwind sections in this file.\n"));
5184 while (unwcount
-- > 0)
5189 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
5190 i
< elf_header
.e_shnum
; ++i
, ++sec
)
5191 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
5198 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
5200 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
5202 /* We need to find which section group it is in. */
5203 struct group_list
* g
= section_headers_groups
[i
]->root
;
5205 for (; g
!= NULL
; g
= g
->next
)
5207 sec
= section_headers
+ g
->section_index
;
5209 if (streq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
))
5214 i
= elf_header
.e_shnum
;
5216 else if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
, len
))
5218 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
5219 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
5220 suffix
= SECTION_NAME (unwsec
) + len
;
5221 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
5223 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info_once
, len2
)
5224 && streq (SECTION_NAME (sec
) + len2
, suffix
))
5229 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
5230 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
5231 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
5232 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
5234 if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
, len
))
5235 suffix
= SECTION_NAME (unwsec
) + len
;
5236 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
5238 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
, len2
)
5239 && streq (SECTION_NAME (sec
) + len2
, suffix
))
5243 if (i
== elf_header
.e_shnum
)
5245 printf (_("\nCould not find unwind info section for "));
5247 if (string_table
== NULL
)
5248 printf ("%d", unwsec
->sh_name
);
5250 printf (_("'%s'"), SECTION_NAME (unwsec
));
5254 aux
.info_size
= sec
->sh_size
;
5255 aux
.info_addr
= sec
->sh_addr
;
5256 aux
.info
= get_data (NULL
, file
, sec
->sh_offset
, 1, aux
.info_size
,
5259 printf (_("\nUnwind section "));
5261 if (string_table
== NULL
)
5262 printf ("%d", unwsec
->sh_name
);
5264 printf (_("'%s'"), SECTION_NAME (unwsec
));
5266 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5267 (unsigned long) unwsec
->sh_offset
,
5268 (unsigned long) (unwsec
->sh_size
/ (3 * eh_addr_size
)));
5270 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
5272 if (aux
.table_len
> 0)
5273 dump_ia64_unwind (& aux
);
5276 free ((char *) aux
.table
);
5278 free ((char *) aux
.info
);
5287 free ((char *) aux
.strtab
);
5292 struct hppa_unw_aux_info
5294 struct hppa_unw_table_entry
5296 struct absaddr start
;
5298 unsigned int Cannot_unwind
:1; /* 0 */
5299 unsigned int Millicode
:1; /* 1 */
5300 unsigned int Millicode_save_sr0
:1; /* 2 */
5301 unsigned int Region_description
:2; /* 3..4 */
5302 unsigned int reserved1
:1; /* 5 */
5303 unsigned int Entry_SR
:1; /* 6 */
5304 unsigned int Entry_FR
:4; /* number saved */ /* 7..10 */
5305 unsigned int Entry_GR
:5; /* number saved */ /* 11..15 */
5306 unsigned int Args_stored
:1; /* 16 */
5307 unsigned int Variable_Frame
:1; /* 17 */
5308 unsigned int Separate_Package_Body
:1; /* 18 */
5309 unsigned int Frame_Extension_Millicode
:1; /* 19 */
5310 unsigned int Stack_Overflow_Check
:1; /* 20 */
5311 unsigned int Two_Instruction_SP_Increment
:1; /* 21 */
5312 unsigned int Ada_Region
:1; /* 22 */
5313 unsigned int cxx_info
:1; /* 23 */
5314 unsigned int cxx_try_catch
:1; /* 24 */
5315 unsigned int sched_entry_seq
:1; /* 25 */
5316 unsigned int reserved2
:1; /* 26 */
5317 unsigned int Save_SP
:1; /* 27 */
5318 unsigned int Save_RP
:1; /* 28 */
5319 unsigned int Save_MRP_in_frame
:1; /* 29 */
5320 unsigned int extn_ptr_defined
:1; /* 30 */
5321 unsigned int Cleanup_defined
:1; /* 31 */
5323 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
5324 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
5325 unsigned int Large_frame
:1; /* 2 */
5326 unsigned int Pseudo_SP_Set
:1; /* 3 */
5327 unsigned int reserved4
:1; /* 4 */
5328 unsigned int Total_frame_size
:27; /* 5..31 */
5330 *table
; /* Unwind table. */
5331 unsigned long table_len
; /* Length of unwind table. */
5332 bfd_vma seg_base
; /* Starting address of segment. */
5333 Elf_Internal_Sym
* symtab
; /* The symbol table. */
5334 unsigned long nsyms
; /* Number of symbols. */
5335 char * strtab
; /* The string table. */
5336 unsigned long strtab_size
; /* Size of string table. */
5340 dump_hppa_unwind (struct hppa_unw_aux_info
* aux
)
5342 struct hppa_unw_table_entry
* tp
;
5344 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
5347 const char * procname
;
5349 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
5350 aux
->strtab_size
, tp
->start
, &procname
,
5353 fputs ("\n<", stdout
);
5357 fputs (procname
, stdout
);
5360 printf ("+%lx", (unsigned long) offset
);
5363 fputs (">: [", stdout
);
5364 print_vma (tp
->start
.offset
, PREFIX_HEX
);
5365 fputc ('-', stdout
);
5366 print_vma (tp
->end
.offset
, PREFIX_HEX
);
5369 #define PF(_m) if (tp->_m) printf (#_m " ");
5370 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5373 PF(Millicode_save_sr0
);
5374 /* PV(Region_description); */
5380 PF(Separate_Package_Body
);
5381 PF(Frame_Extension_Millicode
);
5382 PF(Stack_Overflow_Check
);
5383 PF(Two_Instruction_SP_Increment
);
5387 PF(sched_entry_seq
);
5390 PF(Save_MRP_in_frame
);
5391 PF(extn_ptr_defined
);
5392 PF(Cleanup_defined
);
5393 PF(MPE_XL_interrupt_marker
);
5394 PF(HP_UX_interrupt_marker
);
5397 PV(Total_frame_size
);
5406 slurp_hppa_unwind_table (FILE * file
,
5407 struct hppa_unw_aux_info
* aux
,
5408 Elf_Internal_Shdr
* sec
)
5410 unsigned long size
, unw_ent_size
, nentries
, nrelas
, i
;
5411 Elf_Internal_Phdr
* seg
;
5412 struct hppa_unw_table_entry
* tep
;
5413 Elf_Internal_Shdr
* relsec
;
5414 Elf_Internal_Rela
* rela
;
5415 Elf_Internal_Rela
* rp
;
5416 unsigned char * table
;
5418 Elf_Internal_Sym
* sym
;
5419 const char * relname
;
5421 /* First, find the starting address of the segment that includes
5424 if (elf_header
.e_phnum
)
5426 if (! get_program_headers (file
))
5429 for (seg
= program_headers
;
5430 seg
< program_headers
+ elf_header
.e_phnum
;
5433 if (seg
->p_type
!= PT_LOAD
)
5436 if (sec
->sh_addr
>= seg
->p_vaddr
5437 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5439 aux
->seg_base
= seg
->p_vaddr
;
5445 /* Second, build the unwind table from the contents of the unwind
5447 size
= sec
->sh_size
;
5448 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
5453 nentries
= size
/ unw_ent_size
;
5454 size
= unw_ent_size
* nentries
;
5456 tep
= aux
->table
= xcmalloc (nentries
, sizeof (aux
->table
[0]));
5458 for (tp
= table
; tp
< table
+ size
; tp
+= unw_ent_size
, ++tep
)
5460 unsigned int tmp1
, tmp2
;
5462 tep
->start
.section
= SHN_UNDEF
;
5463 tep
->end
.section
= SHN_UNDEF
;
5465 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
5466 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
5467 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
5468 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
5470 tep
->start
.offset
+= aux
->seg_base
;
5471 tep
->end
.offset
+= aux
->seg_base
;
5473 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
5474 tep
->Millicode
= (tmp1
>> 30) & 0x1;
5475 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
5476 tep
->Region_description
= (tmp1
>> 27) & 0x3;
5477 tep
->reserved1
= (tmp1
>> 26) & 0x1;
5478 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
5479 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
5480 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
5481 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
5482 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
5483 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
5484 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
5485 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
5486 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
5487 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
5488 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
5489 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
5490 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
5491 tep
->reserved2
= (tmp1
>> 5) & 0x1;
5492 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
5493 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
5494 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
5495 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
5496 tep
->Cleanup_defined
= tmp1
& 0x1;
5498 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
5499 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
5500 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
5501 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
5502 tep
->reserved4
= (tmp2
>> 27) & 0x1;
5503 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
5507 /* Third, apply any relocations to the unwind table. */
5508 for (relsec
= section_headers
;
5509 relsec
< section_headers
+ elf_header
.e_shnum
;
5512 if (relsec
->sh_type
!= SHT_RELA
5513 || relsec
->sh_info
>= elf_header
.e_shnum
5514 || section_headers
+ relsec
->sh_info
!= sec
)
5517 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5521 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5523 relname
= elf_hppa_reloc_type (get_reloc_type (rp
->r_info
));
5524 sym
= aux
->symtab
+ get_reloc_symindex (rp
->r_info
);
5526 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
5527 if (! const_strneq (relname
, "R_PARISC_SEGREL"))
5529 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5533 i
= rp
->r_offset
/ unw_ent_size
;
5535 switch ((rp
->r_offset
% unw_ent_size
) / eh_addr_size
)
5538 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5539 aux
->table
[i
].start
.offset
+= sym
->st_value
+ rp
->r_addend
;
5542 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5543 aux
->table
[i
].end
.offset
+= sym
->st_value
+ rp
->r_addend
;
5553 aux
->table_len
= nentries
;
5559 hppa_process_unwind (FILE * file
)
5561 struct hppa_unw_aux_info aux
;
5562 Elf_Internal_Shdr
* unwsec
= NULL
;
5563 Elf_Internal_Shdr
* strsec
;
5564 Elf_Internal_Shdr
* sec
;
5567 memset (& aux
, 0, sizeof (aux
));
5569 if (string_table
== NULL
)
5572 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5574 if (sec
->sh_type
== SHT_SYMTAB
5575 && sec
->sh_link
< elf_header
.e_shnum
)
5577 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5578 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5580 strsec
= section_headers
+ sec
->sh_link
;
5581 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
5582 1, strsec
->sh_size
, _("string table"));
5583 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5585 else if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5590 printf (_("\nThere are no unwind sections in this file.\n"));
5592 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5594 if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5596 printf (_("\nUnwind section "));
5597 printf (_("'%s'"), SECTION_NAME (sec
));
5599 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5600 (unsigned long) sec
->sh_offset
,
5601 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
+ 8)));
5603 slurp_hppa_unwind_table (file
, &aux
, sec
);
5604 if (aux
.table_len
> 0)
5605 dump_hppa_unwind (&aux
);
5608 free ((char *) aux
.table
);
5616 free ((char *) aux
.strtab
);
5622 process_unwind (FILE * file
)
5624 struct unwind_handler
5627 int (* handler
)(FILE *);
5630 { EM_IA_64
, ia64_process_unwind
},
5631 { EM_PARISC
, hppa_process_unwind
},
5639 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
5640 if (elf_header
.e_machine
== handlers
[i
].machtype
)
5641 return handlers
[i
].handler (file
);
5643 printf (_("\nThere are no unwind sections in this file.\n"));
5648 dynamic_section_mips_val (Elf_Internal_Dyn
* entry
)
5650 switch (entry
->d_tag
)
5653 if (entry
->d_un
.d_val
== 0)
5657 static const char * opts
[] =
5659 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5660 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5661 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5662 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5667 for (cnt
= 0; cnt
< ARRAY_SIZE (opts
); ++cnt
)
5668 if (entry
->d_un
.d_val
& (1 << cnt
))
5670 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
5677 case DT_MIPS_IVERSION
:
5678 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5679 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5681 printf ("<corrupt: %ld>\n", (long) entry
->d_un
.d_ptr
);
5684 case DT_MIPS_TIME_STAMP
:
5689 time_t time
= entry
->d_un
.d_val
;
5690 tmp
= gmtime (&time
);
5691 snprintf (timebuf
, sizeof (timebuf
), "%04u-%02u-%02uT%02u:%02u:%02u",
5692 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5693 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5694 printf ("Time Stamp: %s\n", timebuf
);
5698 case DT_MIPS_RLD_VERSION
:
5699 case DT_MIPS_LOCAL_GOTNO
:
5700 case DT_MIPS_CONFLICTNO
:
5701 case DT_MIPS_LIBLISTNO
:
5702 case DT_MIPS_SYMTABNO
:
5703 case DT_MIPS_UNREFEXTNO
:
5704 case DT_MIPS_HIPAGENO
:
5705 case DT_MIPS_DELTA_CLASS_NO
:
5706 case DT_MIPS_DELTA_INSTANCE_NO
:
5707 case DT_MIPS_DELTA_RELOC_NO
:
5708 case DT_MIPS_DELTA_SYM_NO
:
5709 case DT_MIPS_DELTA_CLASSSYM_NO
:
5710 case DT_MIPS_COMPACT_SIZE
:
5711 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
5715 printf ("%#lx\n", (unsigned long) entry
->d_un
.d_ptr
);
5721 dynamic_section_parisc_val (Elf_Internal_Dyn
* entry
)
5723 switch (entry
->d_tag
)
5725 case DT_HP_DLD_FLAGS
:
5734 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
5735 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
5736 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
5737 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
5738 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
5739 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
5740 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
5741 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
5742 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
5743 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
5744 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" },
5745 { DT_HP_GST
, "HP_GST" },
5746 { DT_HP_SHLIB_FIXED
, "HP_SHLIB_FIXED" },
5747 { DT_HP_MERGE_SHLIB_SEG
, "HP_MERGE_SHLIB_SEG" },
5748 { DT_HP_NODELETE
, "HP_NODELETE" },
5749 { DT_HP_GROUP
, "HP_GROUP" },
5750 { DT_HP_PROTECT_LINKAGE_TABLE
, "HP_PROTECT_LINKAGE_TABLE" }
5754 bfd_vma val
= entry
->d_un
.d_val
;
5756 for (cnt
= 0; cnt
< ARRAY_SIZE (flags
); ++cnt
)
5757 if (val
& flags
[cnt
].bit
)
5761 fputs (flags
[cnt
].str
, stdout
);
5763 val
^= flags
[cnt
].bit
;
5766 if (val
!= 0 || first
)
5770 print_vma (val
, HEX
);
5776 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5783 dynamic_section_ia64_val (Elf_Internal_Dyn
* entry
)
5785 switch (entry
->d_tag
)
5787 case DT_IA_64_PLT_RESERVE
:
5788 /* First 3 slots reserved. */
5789 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5791 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
5795 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5802 get_32bit_dynamic_section (FILE * file
)
5804 Elf32_External_Dyn
* edyn
;
5805 Elf32_External_Dyn
* ext
;
5806 Elf_Internal_Dyn
* entry
;
5808 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5809 _("dynamic section"));
5813 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5814 might not have the luxury of section headers. Look for the DT_NULL
5815 terminator to determine the number of entries. */
5816 for (ext
= edyn
, dynamic_nent
= 0;
5817 (char *) ext
< (char *) edyn
+ dynamic_size
;
5821 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5825 dynamic_section
= cmalloc (dynamic_nent
, sizeof (* entry
));
5826 if (dynamic_section
== NULL
)
5828 error (_("Out of memory\n"));
5833 for (ext
= edyn
, entry
= dynamic_section
;
5834 entry
< dynamic_section
+ dynamic_nent
;
5837 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5838 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5847 get_64bit_dynamic_section (FILE * file
)
5849 Elf64_External_Dyn
* edyn
;
5850 Elf64_External_Dyn
* ext
;
5851 Elf_Internal_Dyn
* entry
;
5853 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5854 _("dynamic section"));
5858 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5859 might not have the luxury of section headers. Look for the DT_NULL
5860 terminator to determine the number of entries. */
5861 for (ext
= edyn
, dynamic_nent
= 0;
5862 (char *) ext
< (char *) edyn
+ dynamic_size
;
5866 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5870 dynamic_section
= cmalloc (dynamic_nent
, sizeof (* entry
));
5871 if (dynamic_section
== NULL
)
5873 error (_("Out of memory\n"));
5878 for (ext
= edyn
, entry
= dynamic_section
;
5879 entry
< dynamic_section
+ dynamic_nent
;
5882 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5883 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5892 print_dynamic_flags (bfd_vma flags
)
5900 flag
= flags
& - flags
;
5910 case DF_ORIGIN
: fputs ("ORIGIN", stdout
); break;
5911 case DF_SYMBOLIC
: fputs ("SYMBOLIC", stdout
); break;
5912 case DF_TEXTREL
: fputs ("TEXTREL", stdout
); break;
5913 case DF_BIND_NOW
: fputs ("BIND_NOW", stdout
); break;
5914 case DF_STATIC_TLS
: fputs ("STATIC_TLS", stdout
); break;
5915 default: fputs ("unknown", stdout
); break;
5921 /* Parse and display the contents of the dynamic section. */
5924 process_dynamic_section (FILE * file
)
5926 Elf_Internal_Dyn
* entry
;
5928 if (dynamic_size
== 0)
5931 printf (_("\nThere is no dynamic section in this file.\n"));
5938 if (! get_32bit_dynamic_section (file
))
5941 else if (! get_64bit_dynamic_section (file
))
5944 /* Find the appropriate symbol table. */
5945 if (dynamic_symbols
== NULL
)
5947 for (entry
= dynamic_section
;
5948 entry
< dynamic_section
+ dynamic_nent
;
5951 Elf_Internal_Shdr section
;
5953 if (entry
->d_tag
!= DT_SYMTAB
)
5956 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
5958 /* Since we do not know how big the symbol table is,
5959 we default to reading in the entire file (!) and
5960 processing that. This is overkill, I know, but it
5962 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5964 if (archive_file_offset
!= 0)
5965 section
.sh_size
= archive_file_size
- section
.sh_offset
;
5968 if (fseek (file
, 0, SEEK_END
))
5969 error (_("Unable to seek to end of file!\n"));
5971 section
.sh_size
= ftell (file
) - section
.sh_offset
;
5975 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
5977 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
5979 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
5980 if (num_dynamic_syms
< 1)
5982 error (_("Unable to determine the number of symbols to load\n"));
5986 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
5990 /* Similarly find a string table. */
5991 if (dynamic_strings
== NULL
)
5993 for (entry
= dynamic_section
;
5994 entry
< dynamic_section
+ dynamic_nent
;
5997 unsigned long offset
;
6000 if (entry
->d_tag
!= DT_STRTAB
)
6003 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
6005 /* Since we do not know how big the string table is,
6006 we default to reading in the entire file (!) and
6007 processing that. This is overkill, I know, but it
6010 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
6012 if (archive_file_offset
!= 0)
6013 str_tab_len
= archive_file_size
- offset
;
6016 if (fseek (file
, 0, SEEK_END
))
6017 error (_("Unable to seek to end of file\n"));
6018 str_tab_len
= ftell (file
) - offset
;
6021 if (str_tab_len
< 1)
6024 (_("Unable to determine the length of the dynamic string table\n"));
6028 dynamic_strings
= get_data (NULL
, file
, offset
, 1, str_tab_len
,
6029 _("dynamic string table"));
6030 dynamic_strings_length
= str_tab_len
;
6035 /* And find the syminfo section if available. */
6036 if (dynamic_syminfo
== NULL
)
6038 unsigned long syminsz
= 0;
6040 for (entry
= dynamic_section
;
6041 entry
< dynamic_section
+ dynamic_nent
;
6044 if (entry
->d_tag
== DT_SYMINENT
)
6046 /* Note: these braces are necessary to avoid a syntax
6047 error from the SunOS4 C compiler. */
6048 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
6050 else if (entry
->d_tag
== DT_SYMINSZ
)
6051 syminsz
= entry
->d_un
.d_val
;
6052 else if (entry
->d_tag
== DT_SYMINFO
)
6053 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
6057 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
6059 Elf_External_Syminfo
* extsyminfo
;
6060 Elf_External_Syminfo
* extsym
;
6061 Elf_Internal_Syminfo
* syminfo
;
6063 /* There is a syminfo section. Read the data. */
6064 extsyminfo
= get_data (NULL
, file
, dynamic_syminfo_offset
, 1,
6065 syminsz
, _("symbol information"));
6069 dynamic_syminfo
= malloc (syminsz
);
6070 if (dynamic_syminfo
== NULL
)
6072 error (_("Out of memory\n"));
6076 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
6077 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
6078 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
6079 ++syminfo
, ++extsym
)
6081 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
6082 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
6089 if (do_dynamic
&& dynamic_addr
)
6090 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
6091 dynamic_addr
, dynamic_nent
);
6093 printf (_(" Tag Type Name/Value\n"));
6095 for (entry
= dynamic_section
;
6096 entry
< dynamic_section
+ dynamic_nent
;
6104 print_vma (entry
->d_tag
, FULL_HEX
);
6105 dtype
= get_dynamic_type (entry
->d_tag
);
6106 printf (" (%s)%*s", dtype
,
6107 ((is_32bit_elf
? 27 : 19)
6108 - (int) strlen (dtype
)),
6112 switch (entry
->d_tag
)
6116 print_dynamic_flags (entry
->d_un
.d_val
);
6126 switch (entry
->d_tag
)
6129 printf (_("Auxiliary library"));
6133 printf (_("Filter library"));
6137 printf (_("Configuration file"));
6141 printf (_("Dependency audit library"));
6145 printf (_("Audit library"));
6149 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6150 printf (": [%s]\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
6154 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6163 printf (_("Flags:"));
6165 if (entry
->d_un
.d_val
== 0)
6166 printf (_(" None\n"));
6169 unsigned long int val
= entry
->d_un
.d_val
;
6171 if (val
& DTF_1_PARINIT
)
6173 printf (" PARINIT");
6174 val
^= DTF_1_PARINIT
;
6176 if (val
& DTF_1_CONFEXP
)
6178 printf (" CONFEXP");
6179 val
^= DTF_1_CONFEXP
;
6182 printf (" %lx", val
);
6191 printf (_("Flags:"));
6193 if (entry
->d_un
.d_val
== 0)
6194 printf (_(" None\n"));
6197 unsigned long int val
= entry
->d_un
.d_val
;
6199 if (val
& DF_P1_LAZYLOAD
)
6201 printf (" LAZYLOAD");
6202 val
^= DF_P1_LAZYLOAD
;
6204 if (val
& DF_P1_GROUPPERM
)
6206 printf (" GROUPPERM");
6207 val
^= DF_P1_GROUPPERM
;
6210 printf (" %lx", val
);
6219 printf (_("Flags:"));
6220 if (entry
->d_un
.d_val
== 0)
6221 printf (_(" None\n"));
6224 unsigned long int val
= entry
->d_un
.d_val
;
6231 if (val
& DF_1_GLOBAL
)
6236 if (val
& DF_1_GROUP
)
6241 if (val
& DF_1_NODELETE
)
6243 printf (" NODELETE");
6244 val
^= DF_1_NODELETE
;
6246 if (val
& DF_1_LOADFLTR
)
6248 printf (" LOADFLTR");
6249 val
^= DF_1_LOADFLTR
;
6251 if (val
& DF_1_INITFIRST
)
6253 printf (" INITFIRST");
6254 val
^= DF_1_INITFIRST
;
6256 if (val
& DF_1_NOOPEN
)
6261 if (val
& DF_1_ORIGIN
)
6266 if (val
& DF_1_DIRECT
)
6271 if (val
& DF_1_TRANS
)
6276 if (val
& DF_1_INTERPOSE
)
6278 printf (" INTERPOSE");
6279 val
^= DF_1_INTERPOSE
;
6281 if (val
& DF_1_NODEFLIB
)
6283 printf (" NODEFLIB");
6284 val
^= DF_1_NODEFLIB
;
6286 if (val
& DF_1_NODUMP
)
6291 if (val
& DF_1_CONLFAT
)
6293 printf (" CONLFAT");
6294 val
^= DF_1_CONLFAT
;
6297 printf (" %lx", val
);
6304 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6306 puts (get_dynamic_type (entry
->d_un
.d_val
));
6326 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6332 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6333 name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6339 switch (entry
->d_tag
)
6342 printf (_("Shared library: [%s]"), name
);
6344 if (streq (name
, program_interpreter
))
6345 printf (_(" program interpreter"));
6349 printf (_("Library soname: [%s]"), name
);
6353 printf (_("Library rpath: [%s]"), name
);
6357 printf (_("Library runpath: [%s]"), name
);
6361 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6366 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6379 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6383 case DT_INIT_ARRAYSZ
:
6384 case DT_FINI_ARRAYSZ
:
6385 case DT_GNU_CONFLICTSZ
:
6386 case DT_GNU_LIBLISTSZ
:
6389 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6390 printf (" (bytes)\n");
6400 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6413 if (entry
->d_tag
== DT_USED
6414 && VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6416 char * name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6420 printf (_("Not needed object: [%s]\n"), name
);
6425 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6431 /* The value of this entry is ignored. */
6436 case DT_GNU_PRELINKED
:
6440 time_t time
= entry
->d_un
.d_val
;
6442 tmp
= gmtime (&time
);
6443 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
6444 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
6445 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
6451 dynamic_info_DT_GNU_HASH
= entry
->d_un
.d_val
;
6454 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6460 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
6461 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
6466 switch (elf_header
.e_machine
)
6469 case EM_MIPS_RS3_LE
:
6470 dynamic_section_mips_val (entry
);
6473 dynamic_section_parisc_val (entry
);
6476 dynamic_section_ia64_val (entry
);
6479 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6491 get_ver_flags (unsigned int flags
)
6493 static char buff
[32];
6500 if (flags
& VER_FLG_BASE
)
6501 strcat (buff
, "BASE ");
6503 if (flags
& VER_FLG_WEAK
)
6505 if (flags
& VER_FLG_BASE
)
6506 strcat (buff
, "| ");
6508 strcat (buff
, "WEAK ");
6511 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
6512 strcat (buff
, "| <unknown>");
6517 /* Display the contents of the version sections. */
6520 process_version_sections (FILE * file
)
6522 Elf_Internal_Shdr
* section
;
6529 for (i
= 0, section
= section_headers
;
6530 i
< elf_header
.e_shnum
;
6533 switch (section
->sh_type
)
6535 case SHT_GNU_verdef
:
6537 Elf_External_Verdef
* edefs
;
6545 (_("\nVersion definition section '%s' contains %u entries:\n"),
6546 SECTION_NAME (section
), section
->sh_info
);
6548 printf (_(" Addr: 0x"));
6549 printf_vma (section
->sh_addr
);
6550 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
6551 (unsigned long) section
->sh_offset
, section
->sh_link
,
6552 section
->sh_link
< elf_header
.e_shnum
6553 ? SECTION_NAME (section_headers
+ section
->sh_link
)
6556 edefs
= get_data (NULL
, file
, section
->sh_offset
, 1,
6558 _("version definition section"));
6559 endbuf
= (char *) edefs
+ section
->sh_size
;
6563 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6566 Elf_External_Verdef
* edef
;
6567 Elf_Internal_Verdef ent
;
6568 Elf_External_Verdaux
* eaux
;
6569 Elf_Internal_Verdaux aux
;
6573 vstart
= ((char *) edefs
) + idx
;
6574 if (vstart
+ sizeof (*edef
) > endbuf
)
6577 edef
= (Elf_External_Verdef
*) vstart
;
6579 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
6580 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
6581 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
6582 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
6583 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
6584 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
6585 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
6587 printf (_(" %#06x: Rev: %d Flags: %s"),
6588 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
6590 printf (_(" Index: %d Cnt: %d "),
6591 ent
.vd_ndx
, ent
.vd_cnt
);
6593 vstart
+= ent
.vd_aux
;
6595 eaux
= (Elf_External_Verdaux
*) vstart
;
6597 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6598 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6600 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6601 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux
.vda_name
));
6603 printf (_("Name index: %ld\n"), aux
.vda_name
);
6605 isum
= idx
+ ent
.vd_aux
;
6607 for (j
= 1; j
< ent
.vd_cnt
; j
++)
6609 isum
+= aux
.vda_next
;
6610 vstart
+= aux
.vda_next
;
6612 eaux
= (Elf_External_Verdaux
*) vstart
;
6613 if (vstart
+ sizeof (*eaux
) > endbuf
)
6616 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6617 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6619 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6620 printf (_(" %#06x: Parent %d: %s\n"),
6621 isum
, j
, GET_DYNAMIC_NAME (aux
.vda_name
));
6623 printf (_(" %#06x: Parent %d, name index: %ld\n"),
6624 isum
, j
, aux
.vda_name
);
6627 printf (_(" Version def aux past end of section\n"));
6631 if (cnt
< section
->sh_info
)
6632 printf (_(" Version definition past end of section\n"));
6638 case SHT_GNU_verneed
:
6640 Elf_External_Verneed
* eneed
;
6647 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
6648 SECTION_NAME (section
), section
->sh_info
);
6650 printf (_(" Addr: 0x"));
6651 printf_vma (section
->sh_addr
);
6652 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
6653 (unsigned long) section
->sh_offset
, section
->sh_link
,
6654 section
->sh_link
< elf_header
.e_shnum
6655 ? SECTION_NAME (section_headers
+ section
->sh_link
)
6658 eneed
= get_data (NULL
, file
, section
->sh_offset
, 1,
6660 _("version need section"));
6661 endbuf
= (char *) eneed
+ section
->sh_size
;
6665 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6667 Elf_External_Verneed
* entry
;
6668 Elf_Internal_Verneed ent
;
6673 vstart
= ((char *) eneed
) + idx
;
6674 if (vstart
+ sizeof (*entry
) > endbuf
)
6677 entry
= (Elf_External_Verneed
*) vstart
;
6679 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
6680 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
6681 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
6682 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
6683 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
6685 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
6687 if (VALID_DYNAMIC_NAME (ent
.vn_file
))
6688 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent
.vn_file
));
6690 printf (_(" File: %lx"), ent
.vn_file
);
6692 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
6694 vstart
+= ent
.vn_aux
;
6696 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
6698 Elf_External_Vernaux
* eaux
;
6699 Elf_Internal_Vernaux aux
;
6701 if (vstart
+ sizeof (*eaux
) > endbuf
)
6703 eaux
= (Elf_External_Vernaux
*) vstart
;
6705 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
6706 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
6707 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
6708 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
6709 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
6711 if (VALID_DYNAMIC_NAME (aux
.vna_name
))
6712 printf (_(" %#06x: Name: %s"),
6713 isum
, GET_DYNAMIC_NAME (aux
.vna_name
));
6715 printf (_(" %#06x: Name index: %lx"),
6716 isum
, aux
.vna_name
);
6718 printf (_(" Flags: %s Version: %d\n"),
6719 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
6721 isum
+= aux
.vna_next
;
6722 vstart
+= aux
.vna_next
;
6725 printf (_(" Version need aux past end of section\n"));
6729 if (cnt
< section
->sh_info
)
6730 printf (_(" Version need past end of section\n"));
6736 case SHT_GNU_versym
:
6738 Elf_Internal_Shdr
* link_section
;
6741 unsigned char * edata
;
6742 unsigned short * data
;
6744 Elf_Internal_Sym
* symbols
;
6745 Elf_Internal_Shdr
* string_sec
;
6748 if (section
->sh_link
>= elf_header
.e_shnum
)
6751 link_section
= section_headers
+ section
->sh_link
;
6752 total
= section
->sh_size
/ sizeof (Elf_External_Versym
);
6754 if (link_section
->sh_link
>= elf_header
.e_shnum
)
6759 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
6761 string_sec
= section_headers
+ link_section
->sh_link
;
6763 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
6764 string_sec
->sh_size
, _("version string table"));
6768 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6769 SECTION_NAME (section
), total
);
6771 printf (_(" Addr: "));
6772 printf_vma (section
->sh_addr
);
6773 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
6774 (unsigned long) section
->sh_offset
, section
->sh_link
,
6775 SECTION_NAME (link_section
));
6777 off
= offset_from_vma (file
,
6778 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6779 total
* sizeof (short));
6780 edata
= get_data (NULL
, file
, off
, total
, sizeof (short),
6781 _("version symbol data"));
6788 data
= cmalloc (total
, sizeof (short));
6790 for (cnt
= total
; cnt
--;)
6791 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
6796 for (cnt
= 0; cnt
< total
; cnt
+= 4)
6799 int check_def
, check_need
;
6802 printf (" %03x:", cnt
);
6804 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
6805 switch (data
[cnt
+ j
])
6808 fputs (_(" 0 (*local*) "), stdout
);
6812 fputs (_(" 1 (*global*) "), stdout
);
6816 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
6817 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
6821 if (symbols
[cnt
+ j
].st_shndx
>= elf_header
.e_shnum
6822 || section_headers
[symbols
[cnt
+ j
].st_shndx
].sh_type
6825 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
6832 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
6834 Elf_Internal_Verneed ivn
;
6835 unsigned long offset
;
6837 offset
= offset_from_vma
6838 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6839 sizeof (Elf_External_Verneed
));
6843 Elf_Internal_Vernaux ivna
;
6844 Elf_External_Verneed evn
;
6845 Elf_External_Vernaux evna
;
6846 unsigned long a_off
;
6848 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
6851 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6852 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6854 a_off
= offset
+ ivn
.vn_aux
;
6858 get_data (&evna
, file
, a_off
, sizeof (evna
),
6859 1, _("version need aux (2)"));
6861 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6862 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6864 a_off
+= ivna
.vna_next
;
6866 while (ivna
.vna_other
!= data
[cnt
+ j
]
6867 && ivna
.vna_next
!= 0);
6869 if (ivna
.vna_other
== data
[cnt
+ j
])
6871 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6873 if (ivna
.vna_name
>= string_sec
->sh_size
)
6874 name
= _("*invalid*");
6876 name
= strtab
+ ivna
.vna_name
;
6877 nn
+= printf ("(%s%-*s",
6879 12 - (int) strlen (name
),
6885 offset
+= ivn
.vn_next
;
6887 while (ivn
.vn_next
);
6890 if (check_def
&& data
[cnt
+ j
] != 0x8001
6891 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6893 Elf_Internal_Verdef ivd
;
6894 Elf_External_Verdef evd
;
6895 unsigned long offset
;
6897 offset
= offset_from_vma
6898 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6903 get_data (&evd
, file
, offset
, sizeof (evd
), 1,
6906 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6907 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6909 offset
+= ivd
.vd_next
;
6911 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
6912 && ivd
.vd_next
!= 0);
6914 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
6916 Elf_External_Verdaux evda
;
6917 Elf_Internal_Verdaux ivda
;
6919 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6921 get_data (&evda
, file
,
6922 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
6924 _("version def aux"));
6926 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6928 if (ivda
.vda_name
>= string_sec
->sh_size
)
6929 name
= _("*invalid*");
6931 name
= strtab
+ ivda
.vda_name
;
6932 nn
+= printf ("(%s%-*s",
6934 12 - (int) strlen (name
),
6940 printf ("%*c", 18 - nn
, ' ');
6958 printf (_("\nNo version information found in this file.\n"));
6964 get_symbol_binding (unsigned int binding
)
6966 static char buff
[32];
6970 case STB_LOCAL
: return "LOCAL";
6971 case STB_GLOBAL
: return "GLOBAL";
6972 case STB_WEAK
: return "WEAK";
6974 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
6975 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"),
6977 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
6979 if (binding
== STB_GNU_UNIQUE
6980 && (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_LINUX
6981 /* GNU/Linux is still using the default value 0. */
6982 || elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_NONE
))
6984 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), binding
);
6987 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), binding
);
6993 get_symbol_type (unsigned int type
)
6995 static char buff
[32];
6999 case STT_NOTYPE
: return "NOTYPE";
7000 case STT_OBJECT
: return "OBJECT";
7001 case STT_FUNC
: return "FUNC";
7002 case STT_SECTION
: return "SECTION";
7003 case STT_FILE
: return "FILE";
7004 case STT_COMMON
: return "COMMON";
7005 case STT_TLS
: return "TLS";
7006 case STT_RELC
: return "RELC";
7007 case STT_SRELC
: return "SRELC";
7009 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
7011 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
7012 return "THUMB_FUNC";
7014 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
7017 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
7018 return "PARISC_MILLI";
7020 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"), type
);
7022 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
7024 if (elf_header
.e_machine
== EM_PARISC
)
7026 if (type
== STT_HP_OPAQUE
)
7028 if (type
== STT_HP_STUB
)
7032 if (type
== STT_GNU_IFUNC
7033 && (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_LINUX
7034 /* GNU/Linux is still using the default value 0. */
7035 || elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_NONE
))
7038 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), type
);
7041 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), type
);
7047 get_symbol_visibility (unsigned int visibility
)
7051 case STV_DEFAULT
: return "DEFAULT";
7052 case STV_INTERNAL
: return "INTERNAL";
7053 case STV_HIDDEN
: return "HIDDEN";
7054 case STV_PROTECTED
: return "PROTECTED";
7060 get_mips_symbol_other (unsigned int other
)
7064 case STO_OPTIONAL
: return "OPTIONAL";
7065 case STO_MIPS16
: return "MIPS16";
7066 case STO_MIPS_PLT
: return "MIPS PLT";
7067 case STO_MIPS_PIC
: return "MIPS PIC";
7068 default: return NULL
;
7073 get_symbol_other (unsigned int other
)
7075 const char * result
= NULL
;
7076 static char buff
[32];
7081 switch (elf_header
.e_machine
)
7084 result
= get_mips_symbol_other (other
);
7092 snprintf (buff
, sizeof buff
, _("<other>: %x"), other
);
7097 get_symbol_index_type (unsigned int type
)
7099 static char buff
[32];
7103 case SHN_UNDEF
: return "UND";
7104 case SHN_ABS
: return "ABS";
7105 case SHN_COMMON
: return "COM";
7107 if (type
== SHN_IA_64_ANSI_COMMON
7108 && elf_header
.e_machine
== EM_IA_64
7109 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
7111 else if ((elf_header
.e_machine
== EM_X86_64
7112 || elf_header
.e_machine
== EM_L1OM
)
7113 && type
== SHN_X86_64_LCOMMON
)
7115 else if (type
== SHN_MIPS_SCOMMON
7116 && elf_header
.e_machine
== EM_MIPS
)
7118 else if (type
== SHN_MIPS_SUNDEFINED
7119 && elf_header
.e_machine
== EM_MIPS
)
7121 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
7122 sprintf (buff
, "PRC[0x%04x]", type
& 0xffff);
7123 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
7124 sprintf (buff
, "OS [0x%04x]", type
& 0xffff);
7125 else if (type
>= SHN_LORESERVE
)
7126 sprintf (buff
, "RSV[0x%04x]", type
& 0xffff);
7128 sprintf (buff
, "%3d", type
);
7136 get_dynamic_data (FILE * file
, unsigned int number
, unsigned int ent_size
)
7138 unsigned char * e_data
;
7141 e_data
= cmalloc (number
, ent_size
);
7145 error (_("Out of memory\n"));
7149 if (fread (e_data
, ent_size
, number
, file
) != number
)
7151 error (_("Unable to read in dynamic data\n"));
7155 i_data
= cmalloc (number
, sizeof (*i_data
));
7159 error (_("Out of memory\n"));
7165 i_data
[number
] = byte_get (e_data
+ number
* ent_size
, ent_size
);
7173 print_dynamic_symbol (bfd_vma si
, unsigned long hn
)
7175 Elf_Internal_Sym
* psym
;
7178 psym
= dynamic_symbols
+ si
;
7180 n
= print_vma (si
, DEC_5
);
7182 fputs (" " + n
, stdout
);
7183 printf (" %3lu: ", hn
);
7184 print_vma (psym
->st_value
, LONG_HEX
);
7186 print_vma (psym
->st_size
, DEC_5
);
7188 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
7189 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
7190 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
7191 /* Check to see if any other bits in the st_other field are set.
7192 Note - displaying this information disrupts the layout of the
7193 table being generated, but for the moment this case is very
7195 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
7196 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
7197 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
7198 if (VALID_DYNAMIC_NAME (psym
->st_name
))
7199 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
7201 printf (" <corrupt: %14ld>", psym
->st_name
);
7205 /* Dump the symbol table. */
7207 process_symbol_table (FILE * file
)
7209 Elf_Internal_Shdr
* section
;
7210 bfd_vma nbuckets
= 0;
7211 bfd_vma nchains
= 0;
7212 bfd_vma
* buckets
= NULL
;
7213 bfd_vma
* chains
= NULL
;
7214 bfd_vma ngnubuckets
= 0;
7215 bfd_vma
* gnubuckets
= NULL
;
7216 bfd_vma
* gnuchains
= NULL
;
7217 bfd_vma gnusymidx
= 0;
7219 if (! do_syms
&& !do_histogram
)
7222 if (dynamic_info
[DT_HASH
]
7224 || (do_using_dynamic
&& dynamic_strings
!= NULL
)))
7226 unsigned char nb
[8];
7227 unsigned char nc
[8];
7228 int hash_ent_size
= 4;
7230 if ((elf_header
.e_machine
== EM_ALPHA
7231 || elf_header
.e_machine
== EM_S390
7232 || elf_header
.e_machine
== EM_S390_OLD
)
7233 && elf_header
.e_ident
[EI_CLASS
] == ELFCLASS64
)
7237 (archive_file_offset
7238 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
7239 sizeof nb
+ sizeof nc
)),
7242 error (_("Unable to seek to start of dynamic information\n"));
7246 if (fread (nb
, hash_ent_size
, 1, file
) != 1)
7248 error (_("Failed to read in number of buckets\n"));
7252 if (fread (nc
, hash_ent_size
, 1, file
) != 1)
7254 error (_("Failed to read in number of chains\n"));
7258 nbuckets
= byte_get (nb
, hash_ent_size
);
7259 nchains
= byte_get (nc
, hash_ent_size
);
7261 buckets
= get_dynamic_data (file
, nbuckets
, hash_ent_size
);
7262 chains
= get_dynamic_data (file
, nchains
, hash_ent_size
);
7265 if (buckets
== NULL
|| chains
== NULL
)
7267 if (do_using_dynamic
)
7278 if (dynamic_info_DT_GNU_HASH
7280 || (do_using_dynamic
&& dynamic_strings
!= NULL
)))
7282 unsigned char nb
[16];
7283 bfd_vma i
, maxchain
= 0xffffffff, bitmaskwords
;
7284 bfd_vma buckets_vma
;
7287 (archive_file_offset
7288 + offset_from_vma (file
, dynamic_info_DT_GNU_HASH
,
7292 error (_("Unable to seek to start of dynamic information\n"));
7296 if (fread (nb
, 16, 1, file
) != 1)
7298 error (_("Failed to read in number of buckets\n"));
7302 ngnubuckets
= byte_get (nb
, 4);
7303 gnusymidx
= byte_get (nb
+ 4, 4);
7304 bitmaskwords
= byte_get (nb
+ 8, 4);
7305 buckets_vma
= dynamic_info_DT_GNU_HASH
+ 16;
7307 buckets_vma
+= bitmaskwords
* 4;
7309 buckets_vma
+= bitmaskwords
* 8;
7312 (archive_file_offset
7313 + offset_from_vma (file
, buckets_vma
, 4)),
7316 error (_("Unable to seek to start of dynamic information\n"));
7320 gnubuckets
= get_dynamic_data (file
, ngnubuckets
, 4);
7322 if (gnubuckets
== NULL
)
7325 for (i
= 0; i
< ngnubuckets
; i
++)
7326 if (gnubuckets
[i
] != 0)
7328 if (gnubuckets
[i
] < gnusymidx
)
7331 if (maxchain
== 0xffffffff || gnubuckets
[i
] > maxchain
)
7332 maxchain
= gnubuckets
[i
];
7335 if (maxchain
== 0xffffffff)
7338 maxchain
-= gnusymidx
;
7341 (archive_file_offset
7342 + offset_from_vma (file
, buckets_vma
7343 + 4 * (ngnubuckets
+ maxchain
), 4)),
7346 error (_("Unable to seek to start of dynamic information\n"));
7352 if (fread (nb
, 4, 1, file
) != 1)
7354 error (_("Failed to determine last chain length\n"));
7358 if (maxchain
+ 1 == 0)
7363 while ((byte_get (nb
, 4) & 1) == 0);
7366 (archive_file_offset
7367 + offset_from_vma (file
, buckets_vma
+ 4 * ngnubuckets
, 4)),
7370 error (_("Unable to seek to start of dynamic information\n"));
7374 gnuchains
= get_dynamic_data (file
, maxchain
, 4);
7377 if (gnuchains
== NULL
)
7382 if (do_using_dynamic
)
7387 if ((dynamic_info
[DT_HASH
] || dynamic_info_DT_GNU_HASH
)
7390 && dynamic_strings
!= NULL
)
7394 if (dynamic_info
[DT_HASH
])
7398 printf (_("\nSymbol table for image:\n"));
7400 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7402 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7404 for (hn
= 0; hn
< nbuckets
; hn
++)
7409 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
7410 print_dynamic_symbol (si
, hn
);
7414 if (dynamic_info_DT_GNU_HASH
)
7416 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
7418 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7420 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7422 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7423 if (gnubuckets
[hn
] != 0)
7425 bfd_vma si
= gnubuckets
[hn
];
7426 bfd_vma off
= si
- gnusymidx
;
7430 print_dynamic_symbol (si
, hn
);
7433 while ((gnuchains
[off
++] & 1) == 0);
7437 else if (do_syms
&& !do_using_dynamic
)
7441 for (i
= 0, section
= section_headers
;
7442 i
< elf_header
.e_shnum
;
7446 char * strtab
= NULL
;
7447 unsigned long int strtab_size
= 0;
7448 Elf_Internal_Sym
* symtab
;
7449 Elf_Internal_Sym
* psym
;
7451 if ( section
->sh_type
!= SHT_SYMTAB
7452 && section
->sh_type
!= SHT_DYNSYM
)
7455 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
7456 SECTION_NAME (section
),
7457 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
7459 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7461 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7463 symtab
= GET_ELF_SYMBOLS (file
, section
);
7467 if (section
->sh_link
== elf_header
.e_shstrndx
)
7469 strtab
= string_table
;
7470 strtab_size
= string_table_length
;
7472 else if (section
->sh_link
< elf_header
.e_shnum
)
7474 Elf_Internal_Shdr
* string_sec
;
7476 string_sec
= section_headers
+ section
->sh_link
;
7478 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
7479 1, string_sec
->sh_size
, _("string table"));
7480 strtab_size
= strtab
!= NULL
? string_sec
->sh_size
: 0;
7483 for (si
= 0, psym
= symtab
;
7484 si
< section
->sh_size
/ section
->sh_entsize
;
7487 printf ("%6d: ", si
);
7488 print_vma (psym
->st_value
, LONG_HEX
);
7490 print_vma (psym
->st_size
, DEC_5
);
7491 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
7492 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
7493 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
7494 /* Check to see if any other bits in the st_other field are set.
7495 Note - displaying this information disrupts the layout of the
7496 table being generated, but for the moment this case is very rare. */
7497 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
7498 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
7499 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
7500 print_symbol (25, psym
->st_name
< strtab_size
7501 ? strtab
+ psym
->st_name
: "<corrupt>");
7503 if (section
->sh_type
== SHT_DYNSYM
&&
7504 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
7506 unsigned char data
[2];
7507 unsigned short vers_data
;
7508 unsigned long offset
;
7512 offset
= offset_from_vma
7513 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
7514 sizeof data
+ si
* sizeof (vers_data
));
7516 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
7517 sizeof (data
), 1, _("version data"));
7519 vers_data
= byte_get (data
, 2);
7521 is_nobits
= (psym
->st_shndx
< elf_header
.e_shnum
7522 && section_headers
[psym
->st_shndx
].sh_type
7525 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
7527 if ((vers_data
& 0x8000) || vers_data
> 1)
7529 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
7530 && (is_nobits
|| ! check_def
))
7532 Elf_External_Verneed evn
;
7533 Elf_Internal_Verneed ivn
;
7534 Elf_Internal_Vernaux ivna
;
7536 /* We must test both. */
7537 offset
= offset_from_vma
7538 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
7543 unsigned long vna_off
;
7545 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
7548 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
7549 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
7551 vna_off
= offset
+ ivn
.vn_aux
;
7555 Elf_External_Vernaux evna
;
7557 get_data (&evna
, file
, vna_off
,
7559 _("version need aux (3)"));
7561 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
7562 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
7563 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
7565 vna_off
+= ivna
.vna_next
;
7567 while (ivna
.vna_other
!= vers_data
7568 && ivna
.vna_next
!= 0);
7570 if (ivna
.vna_other
== vers_data
)
7573 offset
+= ivn
.vn_next
;
7575 while (ivn
.vn_next
!= 0);
7577 if (ivna
.vna_other
== vers_data
)
7580 ivna
.vna_name
< strtab_size
7581 ? strtab
+ ivna
.vna_name
: "<corrupt>",
7585 else if (! is_nobits
)
7586 error (_("bad dynamic symbol\n"));
7593 if (vers_data
!= 0x8001
7594 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
7596 Elf_Internal_Verdef ivd
;
7597 Elf_Internal_Verdaux ivda
;
7598 Elf_External_Verdaux evda
;
7599 unsigned long offset
;
7601 offset
= offset_from_vma
7603 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
7604 sizeof (Elf_External_Verdef
));
7608 Elf_External_Verdef evd
;
7610 get_data (&evd
, file
, offset
, sizeof (evd
),
7611 1, _("version def"));
7613 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
7614 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
7615 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
7617 offset
+= ivd
.vd_next
;
7619 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
7620 && ivd
.vd_next
!= 0);
7622 offset
-= ivd
.vd_next
;
7623 offset
+= ivd
.vd_aux
;
7625 get_data (&evda
, file
, offset
, sizeof (evda
),
7626 1, _("version def aux"));
7628 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
7630 if (psym
->st_name
!= ivda
.vda_name
)
7631 printf ((vers_data
& 0x8000)
7633 ivda
.vda_name
< strtab_size
7634 ? strtab
+ ivda
.vda_name
: "<corrupt>");
7644 if (strtab
!= string_table
)
7650 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
7652 if (do_histogram
&& buckets
!= NULL
)
7654 unsigned long * lengths
;
7655 unsigned long * counts
;
7658 unsigned long maxlength
= 0;
7659 unsigned long nzero_counts
= 0;
7660 unsigned long nsyms
= 0;
7662 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
7663 (unsigned long) nbuckets
);
7664 printf (_(" Length Number %% of total Coverage\n"));
7666 lengths
= calloc (nbuckets
, sizeof (*lengths
));
7667 if (lengths
== NULL
)
7669 error (_("Out of memory\n"));
7672 for (hn
= 0; hn
< nbuckets
; ++hn
)
7674 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
7677 if (maxlength
< ++lengths
[hn
])
7682 counts
= calloc (maxlength
+ 1, sizeof (*counts
));
7685 error (_("Out of memory\n"));
7689 for (hn
= 0; hn
< nbuckets
; ++hn
)
7690 ++counts
[lengths
[hn
]];
7695 printf (" 0 %-10lu (%5.1f%%)\n",
7696 counts
[0], (counts
[0] * 100.0) / nbuckets
);
7697 for (i
= 1; i
<= maxlength
; ++i
)
7699 nzero_counts
+= counts
[i
] * i
;
7700 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7701 i
, counts
[i
], (counts
[i
] * 100.0) / nbuckets
,
7702 (nzero_counts
* 100.0) / nsyms
);
7710 if (buckets
!= NULL
)
7716 if (do_histogram
&& gnubuckets
!= NULL
)
7718 unsigned long * lengths
;
7719 unsigned long * counts
;
7721 unsigned long maxlength
= 0;
7722 unsigned long nzero_counts
= 0;
7723 unsigned long nsyms
= 0;
7725 lengths
= calloc (ngnubuckets
, sizeof (*lengths
));
7726 if (lengths
== NULL
)
7728 error (_("Out of memory\n"));
7732 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
7733 (unsigned long) ngnubuckets
);
7734 printf (_(" Length Number %% of total Coverage\n"));
7736 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7737 if (gnubuckets
[hn
] != 0)
7739 bfd_vma off
, length
= 1;
7741 for (off
= gnubuckets
[hn
] - gnusymidx
;
7742 (gnuchains
[off
] & 1) == 0; ++off
)
7744 lengths
[hn
] = length
;
7745 if (length
> maxlength
)
7750 counts
= calloc (maxlength
+ 1, sizeof (*counts
));
7753 error (_("Out of memory\n"));
7757 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7758 ++counts
[lengths
[hn
]];
7760 if (ngnubuckets
> 0)
7763 printf (" 0 %-10lu (%5.1f%%)\n",
7764 counts
[0], (counts
[0] * 100.0) / ngnubuckets
);
7765 for (j
= 1; j
<= maxlength
; ++j
)
7767 nzero_counts
+= counts
[j
] * j
;
7768 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7769 j
, counts
[j
], (counts
[j
] * 100.0) / ngnubuckets
,
7770 (nzero_counts
* 100.0) / nsyms
);
7784 process_syminfo (FILE * file ATTRIBUTE_UNUSED
)
7788 if (dynamic_syminfo
== NULL
7790 /* No syminfo, this is ok. */
7793 /* There better should be a dynamic symbol section. */
7794 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
7798 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
7799 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
7801 printf (_(" Num: Name BoundTo Flags\n"));
7802 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
7804 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
7806 printf ("%4d: ", i
);
7807 if (VALID_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
))
7808 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
));
7810 printf ("<corrupt: %19ld>", dynamic_symbols
[i
].st_name
);
7813 switch (dynamic_syminfo
[i
].si_boundto
)
7815 case SYMINFO_BT_SELF
:
7816 fputs ("SELF ", stdout
);
7818 case SYMINFO_BT_PARENT
:
7819 fputs ("PARENT ", stdout
);
7822 if (dynamic_syminfo
[i
].si_boundto
> 0
7823 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
7824 && VALID_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
7826 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
7830 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
7834 if (flags
& SYMINFO_FLG_DIRECT
)
7836 if (flags
& SYMINFO_FLG_PASSTHRU
)
7837 printf (" PASSTHRU");
7838 if (flags
& SYMINFO_FLG_COPY
)
7840 if (flags
& SYMINFO_FLG_LAZYLOAD
)
7841 printf (" LAZYLOAD");
7849 /* Check to see if the given reloc needs to be handled in a target specific
7850 manner. If so then process the reloc and return TRUE otherwise return
7854 target_specific_reloc_handling (Elf_Internal_Rela
* reloc
,
7855 unsigned char * start
,
7856 Elf_Internal_Sym
* symtab
)
7858 unsigned int reloc_type
= get_reloc_type (reloc
->r_info
);
7860 switch (elf_header
.e_machine
)
7863 case EM_CYGNUS_MN10300
:
7865 static Elf_Internal_Sym
* saved_sym
= NULL
;
7869 case 34: /* R_MN10300_ALIGN */
7871 case 33: /* R_MN10300_SYM_DIFF */
7872 saved_sym
= symtab
+ get_reloc_symindex (reloc
->r_info
);
7874 case 1: /* R_MN10300_32 */
7875 case 2: /* R_MN10300_16 */
7876 if (saved_sym
!= NULL
)
7880 value
= reloc
->r_addend
7881 + (symtab
[get_reloc_symindex (reloc
->r_info
)].st_value
7882 - saved_sym
->st_value
);
7884 byte_put (start
+ reloc
->r_offset
, value
, reloc_type
== 1 ? 4 : 2);
7891 if (saved_sym
!= NULL
)
7892 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc"));
7902 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
7903 DWARF debug sections. This is a target specific test. Note - we do not
7904 go through the whole including-target-headers-multiple-times route, (as
7905 we have already done with <elf/h8.h>) because this would become very
7906 messy and even then this function would have to contain target specific
7907 information (the names of the relocs instead of their numeric values).
7908 FIXME: This is not the correct way to solve this problem. The proper way
7909 is to have target specific reloc sizing and typing functions created by
7910 the reloc-macros.h header, in the same way that it already creates the
7911 reloc naming functions. */
7914 is_32bit_abs_reloc (unsigned int reloc_type
)
7916 switch (elf_header
.e_machine
)
7920 return reloc_type
== 1; /* R_386_32. */
7922 return reloc_type
== 1; /* R_68K_32. */
7924 return reloc_type
== 1; /* R_860_32. */
7926 return reloc_type
== 1; /* XXX Is this right ? */
7928 return reloc_type
== 1; /* R_ARC_32. */
7930 return reloc_type
== 2; /* R_ARM_ABS32 */
7933 return reloc_type
== 1;
7935 return reloc_type
== 0x12; /* R_byte4_data. */
7937 return reloc_type
== 3; /* R_CRIS_32. */
7940 return reloc_type
== 3; /* R_CR16_NUM32. */
7942 return reloc_type
== 15; /* R_CRX_NUM32. */
7944 return reloc_type
== 1;
7945 case EM_CYGNUS_D10V
:
7947 return reloc_type
== 6; /* R_D10V_32. */
7948 case EM_CYGNUS_D30V
:
7950 return reloc_type
== 12; /* R_D30V_32_NORMAL. */
7952 return reloc_type
== 3; /* R_DLX_RELOC_32. */
7953 case EM_CYGNUS_FR30
:
7955 return reloc_type
== 3; /* R_FR30_32. */
7959 return reloc_type
== 1; /* R_H8_DIR32. */
7961 return reloc_type
== 0x65; /* R_IA64_SECREL32LSB. */
7964 return reloc_type
== 2; /* R_IP2K_32. */
7966 return reloc_type
== 2; /* R_IQ2000_32. */
7967 case EM_LATTICEMICO32
:
7968 return reloc_type
== 3; /* R_LM32_32. */
7971 return reloc_type
== 3; /* R_M32C_32. */
7973 return reloc_type
== 34; /* R_M32R_32_RELA. */
7975 return reloc_type
== 1; /* R_MCORE_ADDR32. */
7977 return reloc_type
== 4; /* R_MEP_32. */
7979 return reloc_type
== 2; /* R_MIPS_32. */
7981 return reloc_type
== 4; /* R_MMIX_32. */
7982 case EM_CYGNUS_MN10200
:
7984 return reloc_type
== 1; /* R_MN10200_32. */
7985 case EM_CYGNUS_MN10300
:
7987 return reloc_type
== 1; /* R_MN10300_32. */
7990 return reloc_type
== 1; /* R_MSP43_32. */
7992 return reloc_type
== 2; /* R_MT_32. */
7993 case EM_ALTERA_NIOS2
:
7995 return reloc_type
== 1; /* R_NIOS_32. */
7998 return reloc_type
== 1; /* R_OR32_32. */
8000 return (reloc_type
== 1 /* R_PARISC_DIR32. */
8001 || reloc_type
== 41); /* R_PARISC_SECREL32. */
8004 return reloc_type
== 1; /* R_PJ_DATA_DIR32. */
8006 return reloc_type
== 1; /* R_PPC64_ADDR32. */
8008 return reloc_type
== 1; /* R_PPC_ADDR32. */
8010 return reloc_type
== 1; /* R_I370_ADDR31. */
8013 return reloc_type
== 4; /* R_S390_32. */
8015 return reloc_type
== 8; /* R_SCORE_ABS32. */
8017 return reloc_type
== 1; /* R_SH_DIR32. */
8018 case EM_SPARC32PLUS
:
8021 return reloc_type
== 3 /* R_SPARC_32. */
8022 || reloc_type
== 23; /* R_SPARC_UA32. */
8024 return reloc_type
== 6; /* R_SPU_ADDR32 */
8025 case EM_CYGNUS_V850
:
8027 return reloc_type
== 6; /* R_V850_ABS32. */
8029 return reloc_type
== 1; /* R_VAX_32. */
8032 return reloc_type
== 10; /* R_X86_64_32. */
8034 return reloc_type
== 1; /* R_XSTROMY16_32. */
8037 return reloc_type
== 1; /* R_XTENSA_32. */
8040 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
8041 elf_header
.e_machine
);
8046 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8047 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
8050 is_32bit_pcrel_reloc (unsigned int reloc_type
)
8052 switch (elf_header
.e_machine
)
8056 return reloc_type
== 2; /* R_386_PC32. */
8058 return reloc_type
== 4; /* R_68K_PC32. */
8060 return reloc_type
== 10; /* R_ALPHA_SREL32. */
8062 return reloc_type
== 3; /* R_ARM_REL32 */
8064 return reloc_type
== 9; /* R_PARISC_PCREL32. */
8066 return reloc_type
== 26; /* R_PPC_REL32. */
8068 return reloc_type
== 26; /* R_PPC64_REL32. */
8071 return reloc_type
== 5; /* R_390_PC32. */
8073 return reloc_type
== 2; /* R_SH_REL32. */
8074 case EM_SPARC32PLUS
:
8077 return reloc_type
== 6; /* R_SPARC_DISP32. */
8079 return reloc_type
== 13; /* R_SPU_REL32. */
8082 return reloc_type
== 2; /* R_X86_64_PC32. */
8085 return reloc_type
== 14; /* R_XTENSA_32_PCREL. */
8087 /* Do not abort or issue an error message here. Not all targets use
8088 pc-relative 32-bit relocs in their DWARF debug information and we
8089 have already tested for target coverage in is_32bit_abs_reloc. A
8090 more helpful warning message will be generated by apply_relocations
8091 anyway, so just return. */
8096 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8097 a 64-bit absolute RELA relocation used in DWARF debug sections. */
8100 is_64bit_abs_reloc (unsigned int reloc_type
)
8102 switch (elf_header
.e_machine
)
8105 return reloc_type
== 2; /* R_ALPHA_REFQUAD. */
8107 return reloc_type
== 0x27; /* R_IA64_DIR64LSB. */
8109 return reloc_type
== 80; /* R_PARISC_DIR64. */
8111 return reloc_type
== 38; /* R_PPC64_ADDR64. */
8112 case EM_SPARC32PLUS
:
8115 return reloc_type
== 54; /* R_SPARC_UA64. */
8118 return reloc_type
== 1; /* R_X86_64_64. */
8121 return reloc_type
== 22; /* R_S390_64 */
8123 return reloc_type
== 18; /* R_MIPS_64 */
8129 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
8130 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
8133 is_64bit_pcrel_reloc (unsigned int reloc_type
)
8135 switch (elf_header
.e_machine
)
8138 return reloc_type
== 11; /* R_ALPHA_SREL64 */
8140 return reloc_type
== 0x4f; /* R_IA64_PCREL64LSB */
8142 return reloc_type
== 72; /* R_PARISC_PCREL64 */
8144 return reloc_type
== 44; /* R_PPC64_REL64 */
8145 case EM_SPARC32PLUS
:
8148 return reloc_type
== 46; /* R_SPARC_DISP64 */
8151 return reloc_type
== 24; /* R_X86_64_PC64 */
8154 return reloc_type
== 23; /* R_S390_PC64 */
8160 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8161 a 24-bit absolute RELA relocation used in DWARF debug sections. */
8164 is_24bit_abs_reloc (unsigned int reloc_type
)
8166 switch (elf_header
.e_machine
)
8168 case EM_CYGNUS_MN10200
:
8170 return reloc_type
== 4; /* R_MN10200_24. */
8176 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8177 a 16-bit absolute RELA relocation used in DWARF debug sections. */
8180 is_16bit_abs_reloc (unsigned int reloc_type
)
8182 switch (elf_header
.e_machine
)
8186 return reloc_type
== 4; /* R_AVR_16. */
8187 case EM_CYGNUS_D10V
:
8189 return reloc_type
== 3; /* R_D10V_16. */
8193 return reloc_type
== R_H8_DIR16
;
8196 return reloc_type
== 1; /* R_IP2K_16. */
8199 return reloc_type
== 1; /* R_M32C_16 */
8202 return reloc_type
== 5; /* R_MSP430_16_BYTE. */
8203 case EM_ALTERA_NIOS2
:
8205 return reloc_type
== 9; /* R_NIOS_16. */
8211 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
8212 relocation entries (possibly formerly used for SHT_GROUP sections). */
8215 is_none_reloc (unsigned int reloc_type
)
8217 switch (elf_header
.e_machine
)
8219 case EM_68K
: /* R_68K_NONE. */
8220 case EM_386
: /* R_386_NONE. */
8221 case EM_SPARC32PLUS
:
8223 case EM_SPARC
: /* R_SPARC_NONE. */
8224 case EM_MIPS
: /* R_MIPS_NONE. */
8225 case EM_PARISC
: /* R_PARISC_NONE. */
8226 case EM_ALPHA
: /* R_ALPHA_NONE. */
8227 case EM_PPC
: /* R_PPC_NONE. */
8228 case EM_PPC64
: /* R_PPC64_NONE. */
8229 case EM_ARM
: /* R_ARM_NONE. */
8230 case EM_IA_64
: /* R_IA64_NONE. */
8231 case EM_SH
: /* R_SH_NONE. */
8233 case EM_S390
: /* R_390_NONE. */
8234 case EM_CRIS
: /* R_CRIS_NONE. */
8235 case EM_X86_64
: /* R_X86_64_NONE. */
8236 case EM_L1OM
: /* R_X86_64_NONE. */
8237 case EM_MN10300
: /* R_MN10300_NONE. */
8238 case EM_M32R
: /* R_M32R_NONE. */
8239 return reloc_type
== 0;
8242 return (reloc_type
== 0 /* R_XTENSA_NONE. */
8243 || reloc_type
== 17 /* R_XTENSA_DIFF8. */
8244 || reloc_type
== 18 /* R_XTENSA_DIFF16. */
8245 || reloc_type
== 19 /* R_XTENSA_DIFF32. */);
8250 /* Apply relocations to a section.
8251 Note: So far support has been added only for those relocations
8252 which can be found in debug sections.
8253 FIXME: Add support for more relocations ? */
8256 apply_relocations (void * file
,
8257 Elf_Internal_Shdr
* section
,
8258 unsigned char * start
)
8260 Elf_Internal_Shdr
* relsec
;
8261 unsigned char * end
= start
+ section
->sh_size
;
8263 if (elf_header
.e_type
!= ET_REL
)
8266 /* Find the reloc section associated with the section. */
8267 for (relsec
= section_headers
;
8268 relsec
< section_headers
+ elf_header
.e_shnum
;
8271 bfd_boolean is_rela
;
8272 unsigned long num_relocs
;
8273 Elf_Internal_Rela
* relocs
;
8274 Elf_Internal_Rela
* rp
;
8275 Elf_Internal_Shdr
* symsec
;
8276 Elf_Internal_Sym
* symtab
;
8277 Elf_Internal_Sym
* sym
;
8279 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
8280 || relsec
->sh_info
>= elf_header
.e_shnum
8281 || section_headers
+ relsec
->sh_info
!= section
8282 || relsec
->sh_size
== 0
8283 || relsec
->sh_link
>= elf_header
.e_shnum
)
8286 is_rela
= relsec
->sh_type
== SHT_RELA
;
8290 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
8291 & relocs
, & num_relocs
))
8296 if (!slurp_rel_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
8297 & relocs
, & num_relocs
))
8301 /* SH uses RELA but uses in place value instead of the addend field. */
8302 if (elf_header
.e_machine
== EM_SH
)
8305 symsec
= section_headers
+ relsec
->sh_link
;
8306 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
8308 for (rp
= relocs
; rp
< relocs
+ num_relocs
; ++rp
)
8311 unsigned int reloc_type
;
8312 unsigned int reloc_size
;
8313 unsigned char * loc
;
8315 reloc_type
= get_reloc_type (rp
->r_info
);
8317 if (target_specific_reloc_handling (rp
, start
, symtab
))
8319 else if (is_none_reloc (reloc_type
))
8321 else if (is_32bit_abs_reloc (reloc_type
)
8322 || is_32bit_pcrel_reloc (reloc_type
))
8324 else if (is_64bit_abs_reloc (reloc_type
)
8325 || is_64bit_pcrel_reloc (reloc_type
))
8327 else if (is_24bit_abs_reloc (reloc_type
))
8329 else if (is_16bit_abs_reloc (reloc_type
))
8333 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
8334 reloc_type
, SECTION_NAME (section
));
8338 loc
= start
+ rp
->r_offset
;
8339 if ((loc
+ reloc_size
) > end
)
8341 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
8342 (unsigned long) rp
->r_offset
,
8343 SECTION_NAME (section
));
8347 sym
= symtab
+ get_reloc_symindex (rp
->r_info
);
8349 /* If the reloc has a symbol associated with it,
8350 make sure that it is of an appropriate type.
8352 Relocations against symbols without type can happen.
8353 Gcc -feliminate-dwarf2-dups may generate symbols
8354 without type for debug info.
8356 Icc generates relocations against function symbols
8357 instead of local labels.
8359 Relocations against object symbols can happen, eg when
8360 referencing a global array. For an example of this see
8361 the _clz.o binary in libgcc.a. */
8363 && ELF_ST_TYPE (sym
->st_info
) > STT_SECTION
)
8365 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
8366 get_symbol_type (ELF_ST_TYPE (sym
->st_info
)),
8367 (long int)(rp
- relocs
),
8368 SECTION_NAME (relsec
));
8374 addend
+= rp
->r_addend
;
8375 /* R_XTENSA_32 and R_PJ_DATA_DIR32 are partial_inplace. */
8377 || (elf_header
.e_machine
== EM_XTENSA
8379 || ((elf_header
.e_machine
== EM_PJ
8380 || elf_header
.e_machine
== EM_PJ_OLD
)
8381 && reloc_type
== 1))
8382 addend
+= byte_get (loc
, reloc_size
);
8384 if (is_32bit_pcrel_reloc (reloc_type
)
8385 || is_64bit_pcrel_reloc (reloc_type
))
8387 /* On HPPA, all pc-relative relocations are biased by 8. */
8388 if (elf_header
.e_machine
== EM_PARISC
)
8390 byte_put (loc
, (addend
+ sym
->st_value
) - rp
->r_offset
,
8394 byte_put (loc
, addend
+ sym
->st_value
, reloc_size
);
8403 #ifdef SUPPORT_DISASSEMBLY
8405 disassemble_section (Elf_Internal_Shdr
* section
, FILE * file
)
8407 printf (_("\nAssembly dump of section %s\n"),
8408 SECTION_NAME (section
));
8410 /* XXX -- to be done --- XXX */
8416 /* Reads in the contents of SECTION from FILE, returning a pointer
8417 to a malloc'ed buffer or NULL if something went wrong. */
8420 get_section_contents (Elf_Internal_Shdr
* section
, FILE * file
)
8422 bfd_size_type num_bytes
;
8424 num_bytes
= section
->sh_size
;
8426 if (num_bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
8428 printf (_("\nSection '%s' has no data to dump.\n"),
8429 SECTION_NAME (section
));
8433 return get_data (NULL
, file
, section
->sh_offset
, 1, num_bytes
,
8434 _("section contents"));
8439 dump_section_as_strings (Elf_Internal_Shdr
* section
, FILE * file
)
8441 Elf_Internal_Shdr
* relsec
;
8442 bfd_size_type num_bytes
;
8447 char * name
= SECTION_NAME (section
);
8448 bfd_boolean some_strings_shown
;
8450 start
= get_section_contents (section
, file
);
8454 printf (_("\nString dump of section '%s':\n"), name
);
8456 /* If the section being dumped has relocations against it the user might
8457 be expecting these relocations to have been applied. Check for this
8458 case and issue a warning message in order to avoid confusion.
8459 FIXME: Maybe we ought to have an option that dumps a section with
8461 for (relsec
= section_headers
;
8462 relsec
< section_headers
+ elf_header
.e_shnum
;
8465 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
8466 || relsec
->sh_info
>= elf_header
.e_shnum
8467 || section_headers
+ relsec
->sh_info
!= section
8468 || relsec
->sh_size
== 0
8469 || relsec
->sh_link
>= elf_header
.e_shnum
)
8472 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
8476 num_bytes
= section
->sh_size
;
8477 addr
= section
->sh_addr
;
8479 end
= start
+ num_bytes
;
8480 some_strings_shown
= FALSE
;
8484 while (!ISPRINT (* data
))
8491 printf (" [%6tx] %s\n", data
- start
, data
);
8493 printf (" [%6Ix] %s\n", (size_t) (data
- start
), data
);
8495 data
+= strlen (data
);
8496 some_strings_shown
= TRUE
;
8500 if (! some_strings_shown
)
8501 printf (_(" No strings found in this section."));
8509 dump_section_as_bytes (Elf_Internal_Shdr
* section
,
8511 bfd_boolean relocate
)
8513 Elf_Internal_Shdr
* relsec
;
8514 bfd_size_type bytes
;
8516 unsigned char * data
;
8517 unsigned char * start
;
8519 start
= (unsigned char *) get_section_contents (section
, file
);
8523 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
8527 apply_relocations (file
, section
, start
);
8531 /* If the section being dumped has relocations against it the user might
8532 be expecting these relocations to have been applied. Check for this
8533 case and issue a warning message in order to avoid confusion.
8534 FIXME: Maybe we ought to have an option that dumps a section with
8536 for (relsec
= section_headers
;
8537 relsec
< section_headers
+ elf_header
.e_shnum
;
8540 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
8541 || relsec
->sh_info
>= elf_header
.e_shnum
8542 || section_headers
+ relsec
->sh_info
!= section
8543 || relsec
->sh_size
== 0
8544 || relsec
->sh_link
>= elf_header
.e_shnum
)
8547 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
8552 addr
= section
->sh_addr
;
8553 bytes
= section
->sh_size
;
8562 lbytes
= (bytes
> 16 ? 16 : bytes
);
8564 printf (" 0x%8.8lx ", (unsigned long) addr
);
8566 for (j
= 0; j
< 16; j
++)
8569 printf ("%2.2x", data
[j
]);
8577 for (j
= 0; j
< lbytes
; j
++)
8580 if (k
>= ' ' && k
< 0x7f)
8598 /* Uncompresses a section that was compressed using zlib, in place.
8599 This is a copy of bfd_uncompress_section_contents, in bfd/compress.c */
8602 uncompress_section_contents (unsigned char ** buffer
, dwarf_size_type
* size
)
8605 /* These are just to quiet gcc. */
8610 dwarf_size_type compressed_size
= *size
;
8611 unsigned char * compressed_buffer
= *buffer
;
8612 dwarf_size_type uncompressed_size
;
8613 unsigned char * uncompressed_buffer
;
8616 dwarf_size_type header_size
= 12;
8618 /* Read the zlib header. In this case, it should be "ZLIB" followed
8619 by the uncompressed section size, 8 bytes in big-endian order. */
8620 if (compressed_size
< header_size
8621 || ! streq ((char *) compressed_buffer
, "ZLIB"))
8624 uncompressed_size
= compressed_buffer
[4]; uncompressed_size
<<= 8;
8625 uncompressed_size
+= compressed_buffer
[5]; uncompressed_size
<<= 8;
8626 uncompressed_size
+= compressed_buffer
[6]; uncompressed_size
<<= 8;
8627 uncompressed_size
+= compressed_buffer
[7]; uncompressed_size
<<= 8;
8628 uncompressed_size
+= compressed_buffer
[8]; uncompressed_size
<<= 8;
8629 uncompressed_size
+= compressed_buffer
[9]; uncompressed_size
<<= 8;
8630 uncompressed_size
+= compressed_buffer
[10]; uncompressed_size
<<= 8;
8631 uncompressed_size
+= compressed_buffer
[11];
8633 /* It is possible the section consists of several compressed
8634 buffers concatenated together, so we uncompress in a loop. */
8638 strm
.avail_in
= compressed_size
- header_size
;
8639 strm
.next_in
= (Bytef
*) compressed_buffer
+ header_size
;
8640 strm
.avail_out
= uncompressed_size
;
8641 uncompressed_buffer
= xmalloc (uncompressed_size
);
8643 rc
= inflateInit (& strm
);
8644 while (strm
.avail_in
> 0)
8648 strm
.next_out
= ((Bytef
*) uncompressed_buffer
8649 + (uncompressed_size
- strm
.avail_out
));
8650 rc
= inflate (&strm
, Z_FINISH
);
8651 if (rc
!= Z_STREAM_END
)
8653 rc
= inflateReset (& strm
);
8655 rc
= inflateEnd (& strm
);
8657 || strm
.avail_out
!= 0)
8660 free (compressed_buffer
);
8661 *buffer
= uncompressed_buffer
;
8662 *size
= uncompressed_size
;
8666 free (uncompressed_buffer
);
8668 #endif /* HAVE_ZLIB_H */
8672 load_specific_debug_section (enum dwarf_section_display_enum debug
,
8673 Elf_Internal_Shdr
* sec
, void * file
)
8675 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
8677 int section_is_compressed
;
8679 /* If it is already loaded, do nothing. */
8680 if (section
->start
!= NULL
)
8683 section_is_compressed
= section
->name
== section
->compressed_name
;
8685 snprintf (buf
, sizeof (buf
), _("%s section data"), section
->name
);
8686 section
->address
= sec
->sh_addr
;
8687 section
->size
= sec
->sh_size
;
8688 section
->start
= get_data (NULL
, file
, sec
->sh_offset
, 1,
8690 if (section
->start
== NULL
)
8693 if (section_is_compressed
)
8694 if (! uncompress_section_contents (§ion
->start
, §ion
->size
))
8697 if (debug_displays
[debug
].relocate
)
8698 apply_relocations (file
, sec
, section
->start
);
8704 load_debug_section (enum dwarf_section_display_enum debug
, void * file
)
8706 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
8707 Elf_Internal_Shdr
* sec
;
8709 /* Locate the debug section. */
8710 sec
= find_section (section
->uncompressed_name
);
8712 section
->name
= section
->uncompressed_name
;
8715 sec
= find_section (section
->compressed_name
);
8717 section
->name
= section
->compressed_name
;
8722 return load_specific_debug_section (debug
, sec
, file
);
8726 free_debug_section (enum dwarf_section_display_enum debug
)
8728 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
8730 if (section
->start
== NULL
)
8733 free ((char *) section
->start
);
8734 section
->start
= NULL
;
8735 section
->address
= 0;
8740 display_debug_section (Elf_Internal_Shdr
* section
, FILE * file
)
8742 char * name
= SECTION_NAME (section
);
8743 bfd_size_type length
;
8745 enum dwarf_section_display_enum i
;
8747 length
= section
->sh_size
;
8750 printf (_("\nSection '%s' has no debugging data.\n"), name
);
8753 if (section
->sh_type
== SHT_NOBITS
)
8755 /* There is no point in dumping the contents of a debugging section
8756 which has the NOBITS type - the bits in the file will be random.
8757 This can happen when a file containing a .eh_frame section is
8758 stripped with the --only-keep-debug command line option. */
8759 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"), name
);
8763 if (const_strneq (name
, ".gnu.linkonce.wi."))
8764 name
= ".debug_info";
8766 /* See if we know how to display the contents of this section. */
8767 for (i
= 0; i
< max
; i
++)
8768 if (streq (debug_displays
[i
].section
.uncompressed_name
, name
)
8769 || streq (debug_displays
[i
].section
.compressed_name
, name
))
8771 struct dwarf_section
* sec
= &debug_displays
[i
].section
;
8772 int secondary
= (section
!= find_section (name
));
8775 free_debug_section (i
);
8777 if (streq (debug_displays
[i
].section
.uncompressed_name
, name
))
8778 sec
->name
= sec
->uncompressed_name
;
8780 sec
->name
= sec
->compressed_name
;
8781 if (load_specific_debug_section (i
, section
, file
))
8783 result
&= debug_displays
[i
].display (sec
, file
);
8785 if (secondary
|| (i
!= info
&& i
!= abbrev
))
8786 free_debug_section (i
);
8794 printf (_("Unrecognized debug section: %s\n"), name
);
8801 /* Set DUMP_SECTS for all sections where dumps were requested
8802 based on section name. */
8805 initialise_dumps_byname (void)
8807 struct dump_list_entry
* cur
;
8809 for (cur
= dump_sects_byname
; cur
; cur
= cur
->next
)
8814 for (i
= 0, any
= 0; i
< elf_header
.e_shnum
; i
++)
8815 if (streq (SECTION_NAME (section_headers
+ i
), cur
->name
))
8817 request_dump_bynumber (i
, cur
->type
);
8822 warn (_("Section '%s' was not dumped because it does not exist!\n"),
8828 process_section_contents (FILE * file
)
8830 Elf_Internal_Shdr
* section
;
8836 initialise_dumps_byname ();
8838 for (i
= 0, section
= section_headers
;
8839 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
8842 #ifdef SUPPORT_DISASSEMBLY
8843 if (dump_sects
[i
] & DISASS_DUMP
)
8844 disassemble_section (section
, file
);
8846 if (dump_sects
[i
] & HEX_DUMP
)
8847 dump_section_as_bytes (section
, file
, FALSE
);
8849 if (dump_sects
[i
] & RELOC_DUMP
)
8850 dump_section_as_bytes (section
, file
, TRUE
);
8852 if (dump_sects
[i
] & STRING_DUMP
)
8853 dump_section_as_strings (section
, file
);
8855 if (dump_sects
[i
] & DEBUG_DUMP
)
8856 display_debug_section (section
, file
);
8859 /* Check to see if the user requested a
8860 dump of a section that does not exist. */
8861 while (i
++ < num_dump_sects
)
8863 warn (_("Section %d was not dumped because it does not exist!\n"), i
);
8867 process_mips_fpe_exception (int mask
)
8872 if (mask
& OEX_FPU_INEX
)
8873 fputs ("INEX", stdout
), first
= 0;
8874 if (mask
& OEX_FPU_UFLO
)
8875 printf ("%sUFLO", first
? "" : "|"), first
= 0;
8876 if (mask
& OEX_FPU_OFLO
)
8877 printf ("%sOFLO", first
? "" : "|"), first
= 0;
8878 if (mask
& OEX_FPU_DIV0
)
8879 printf ("%sDIV0", first
? "" : "|"), first
= 0;
8880 if (mask
& OEX_FPU_INVAL
)
8881 printf ("%sINVAL", first
? "" : "|");
8884 fputs ("0", stdout
);
8887 /* ARM EABI attributes section. */
8892 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
8894 const char ** table
;
8895 } arm_attr_public_tag
;
8897 static const char * arm_attr_tag_CPU_arch
[] =
8898 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
8899 "v6K", "v7", "v6-M", "v6S-M"};
8900 static const char * arm_attr_tag_ARM_ISA_use
[] = {"No", "Yes"};
8901 static const char * arm_attr_tag_THUMB_ISA_use
[] =
8902 {"No", "Thumb-1", "Thumb-2"};
8903 static const char * arm_attr_tag_VFP_arch
[] =
8904 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16"};
8905 static const char * arm_attr_tag_WMMX_arch
[] = {"No", "WMMXv1", "WMMXv2"};
8906 static const char * arm_attr_tag_Advanced_SIMD_arch
[] = {"No", "NEONv1"};
8907 static const char * arm_attr_tag_PCS_config
[] =
8908 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
8909 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
8910 static const char * arm_attr_tag_ABI_PCS_R9_use
[] =
8911 {"V6", "SB", "TLS", "Unused"};
8912 static const char * arm_attr_tag_ABI_PCS_RW_data
[] =
8913 {"Absolute", "PC-relative", "SB-relative", "None"};
8914 static const char * arm_attr_tag_ABI_PCS_RO_data
[] =
8915 {"Absolute", "PC-relative", "None"};
8916 static const char * arm_attr_tag_ABI_PCS_GOT_use
[] =
8917 {"None", "direct", "GOT-indirect"};
8918 static const char * arm_attr_tag_ABI_PCS_wchar_t
[] =
8919 {"None", "??? 1", "2", "??? 3", "4"};
8920 static const char * arm_attr_tag_ABI_FP_rounding
[] = {"Unused", "Needed"};
8921 static const char * arm_attr_tag_ABI_FP_denormal
[] =
8922 {"Unused", "Needed", "Sign only"};
8923 static const char * arm_attr_tag_ABI_FP_exceptions
[] = {"Unused", "Needed"};
8924 static const char * arm_attr_tag_ABI_FP_user_exceptions
[] = {"Unused", "Needed"};
8925 static const char * arm_attr_tag_ABI_FP_number_model
[] =
8926 {"Unused", "Finite", "RTABI", "IEEE 754"};
8927 static const char * arm_attr_tag_ABI_align8_needed
[] = {"No", "Yes", "4-byte"};
8928 static const char * arm_attr_tag_ABI_align8_preserved
[] =
8929 {"No", "Yes, except leaf SP", "Yes"};
8930 static const char * arm_attr_tag_ABI_enum_size
[] =
8931 {"Unused", "small", "int", "forced to int"};
8932 static const char * arm_attr_tag_ABI_HardFP_use
[] =
8933 {"As Tag_VFP_arch", "SP only", "DP only", "SP and DP"};
8934 static const char * arm_attr_tag_ABI_VFP_args
[] =
8935 {"AAPCS", "VFP registers", "custom"};
8936 static const char * arm_attr_tag_ABI_WMMX_args
[] =
8937 {"AAPCS", "WMMX registers", "custom"};
8938 static const char * arm_attr_tag_ABI_optimization_goals
[] =
8939 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
8940 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
8941 static const char * arm_attr_tag_ABI_FP_optimization_goals
[] =
8942 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
8943 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
8944 static const char * arm_attr_tag_CPU_unaligned_access
[] = {"None", "v6"};
8945 static const char * arm_attr_tag_VFP_HP_extension
[] =
8946 {"Not Allowed", "Allowed"};
8947 static const char * arm_attr_tag_ABI_FP_16bit_format
[] =
8948 {"None", "IEEE 754", "Alternative Format"};
8949 static const char * arm_attr_tag_T2EE_use
[] = {"Not Allowed", "Allowed"};
8950 static const char * arm_attr_tag_Virtualization_use
[] =
8951 {"Not Allowed", "Allowed"};
8952 static const char * arm_attr_tag_MPextension_use
[] = {"Not Allowed", "Allowed"};
8954 #define LOOKUP(id, name) \
8955 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
8956 static arm_attr_public_tag arm_attr_public_tags
[] =
8958 {4, "CPU_raw_name", 1, NULL
},
8959 {5, "CPU_name", 1, NULL
},
8960 LOOKUP(6, CPU_arch
),
8961 {7, "CPU_arch_profile", 0, NULL
},
8962 LOOKUP(8, ARM_ISA_use
),
8963 LOOKUP(9, THUMB_ISA_use
),
8964 LOOKUP(10, VFP_arch
),
8965 LOOKUP(11, WMMX_arch
),
8966 LOOKUP(12, Advanced_SIMD_arch
),
8967 LOOKUP(13, PCS_config
),
8968 LOOKUP(14, ABI_PCS_R9_use
),
8969 LOOKUP(15, ABI_PCS_RW_data
),
8970 LOOKUP(16, ABI_PCS_RO_data
),
8971 LOOKUP(17, ABI_PCS_GOT_use
),
8972 LOOKUP(18, ABI_PCS_wchar_t
),
8973 LOOKUP(19, ABI_FP_rounding
),
8974 LOOKUP(20, ABI_FP_denormal
),
8975 LOOKUP(21, ABI_FP_exceptions
),
8976 LOOKUP(22, ABI_FP_user_exceptions
),
8977 LOOKUP(23, ABI_FP_number_model
),
8978 LOOKUP(24, ABI_align8_needed
),
8979 LOOKUP(25, ABI_align8_preserved
),
8980 LOOKUP(26, ABI_enum_size
),
8981 LOOKUP(27, ABI_HardFP_use
),
8982 LOOKUP(28, ABI_VFP_args
),
8983 LOOKUP(29, ABI_WMMX_args
),
8984 LOOKUP(30, ABI_optimization_goals
),
8985 LOOKUP(31, ABI_FP_optimization_goals
),
8986 {32, "compatibility", 0, NULL
},
8987 LOOKUP(34, CPU_unaligned_access
),
8988 LOOKUP(36, VFP_HP_extension
),
8989 LOOKUP(38, ABI_FP_16bit_format
),
8990 {64, "nodefaults", 0, NULL
},
8991 {65, "also_compatible_with", 0, NULL
},
8992 LOOKUP(66, T2EE_use
),
8993 {67, "conformance", 1, NULL
},
8994 LOOKUP(68, Virtualization_use
),
8995 LOOKUP(70, MPextension_use
)
8999 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
9003 read_uleb128 (unsigned char * p
, unsigned int * plen
)
9017 val
|= ((unsigned int)c
& 0x7f) << shift
;
9026 static unsigned char *
9027 display_arm_attribute (unsigned char * p
)
9032 arm_attr_public_tag
* attr
;
9036 tag
= read_uleb128 (p
, &len
);
9039 for (i
= 0; i
< ARRAY_SIZE (arm_attr_public_tags
); i
++)
9041 if (arm_attr_public_tags
[i
].tag
== tag
)
9043 attr
= &arm_attr_public_tags
[i
];
9050 printf (" Tag_%s: ", attr
->name
);
9056 case 7: /* Tag_CPU_arch_profile. */
9057 val
= read_uleb128 (p
, &len
);
9061 case 0: printf ("None\n"); break;
9062 case 'A': printf ("Application\n"); break;
9063 case 'R': printf ("Realtime\n"); break;
9064 case 'M': printf ("Microcontroller\n"); break;
9065 default: printf ("??? (%d)\n", val
); break;
9069 case 32: /* Tag_compatibility. */
9070 val
= read_uleb128 (p
, &len
);
9072 printf ("flag = %d, vendor = %s\n", val
, p
);
9073 p
+= strlen ((char *) p
) + 1;
9076 case 64: /* Tag_nodefaults. */
9081 case 65: /* Tag_also_compatible_with. */
9082 val
= read_uleb128 (p
, &len
);
9084 if (val
== 6 /* Tag_CPU_arch. */)
9086 val
= read_uleb128 (p
, &len
);
9088 if ((unsigned int)val
>= ARRAY_SIZE (arm_attr_tag_CPU_arch
))
9089 printf ("??? (%d)\n", val
);
9091 printf ("%s\n", arm_attr_tag_CPU_arch
[val
]);
9095 while (*(p
++) != '\0' /* NUL terminator. */);
9109 assert (attr
->type
& 0x80);
9110 val
= read_uleb128 (p
, &len
);
9112 type
= attr
->type
& 0x7f;
9114 printf ("??? (%d)\n", val
);
9116 printf ("%s\n", attr
->table
[val
]);
9123 type
= 1; /* String. */
9125 type
= 2; /* uleb128. */
9126 printf (" Tag_unknown_%d: ", tag
);
9131 printf ("\"%s\"\n", p
);
9132 p
+= strlen ((char *) p
) + 1;
9136 val
= read_uleb128 (p
, &len
);
9138 printf ("%d (0x%x)\n", val
, val
);
9144 static unsigned char *
9145 display_gnu_attribute (unsigned char * p
,
9146 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, int))
9153 tag
= read_uleb128 (p
, &len
);
9156 /* Tag_compatibility is the only generic GNU attribute defined at
9160 val
= read_uleb128 (p
, &len
);
9162 printf ("flag = %d, vendor = %s\n", val
, p
);
9163 p
+= strlen ((char *) p
) + 1;
9167 if ((tag
& 2) == 0 && display_proc_gnu_attribute
)
9168 return display_proc_gnu_attribute (p
, tag
);
9171 type
= 1; /* String. */
9173 type
= 2; /* uleb128. */
9174 printf (" Tag_unknown_%d: ", tag
);
9178 printf ("\"%s\"\n", p
);
9179 p
+= strlen ((char *) p
) + 1;
9183 val
= read_uleb128 (p
, &len
);
9185 printf ("%d (0x%x)\n", val
, val
);
9191 static unsigned char *
9192 display_power_gnu_attribute (unsigned char * p
, int tag
)
9198 if (tag
== Tag_GNU_Power_ABI_FP
)
9200 val
= read_uleb128 (p
, &len
);
9202 printf (" Tag_GNU_Power_ABI_FP: ");
9207 printf ("Hard or soft float\n");
9210 printf ("Hard float\n");
9213 printf ("Soft float\n");
9216 printf ("Single-precision hard float\n");
9219 printf ("??? (%d)\n", val
);
9225 if (tag
== Tag_GNU_Power_ABI_Vector
)
9227 val
= read_uleb128 (p
, &len
);
9229 printf (" Tag_GNU_Power_ABI_Vector: ");
9236 printf ("Generic\n");
9239 printf ("AltiVec\n");
9245 printf ("??? (%d)\n", val
);
9251 if (tag
== Tag_GNU_Power_ABI_Struct_Return
)
9253 val
= read_uleb128 (p
, &len
);
9255 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
9265 printf ("Memory\n");
9268 printf ("??? (%d)\n", val
);
9275 type
= 1; /* String. */
9277 type
= 2; /* uleb128. */
9278 printf (" Tag_unknown_%d: ", tag
);
9282 printf ("\"%s\"\n", p
);
9283 p
+= strlen ((char *) p
) + 1;
9287 val
= read_uleb128 (p
, &len
);
9289 printf ("%d (0x%x)\n", val
, val
);
9295 static unsigned char *
9296 display_mips_gnu_attribute (unsigned char * p
, int tag
)
9302 if (tag
== Tag_GNU_MIPS_ABI_FP
)
9304 val
= read_uleb128 (p
, &len
);
9306 printf (" Tag_GNU_MIPS_ABI_FP: ");
9311 printf ("Hard or soft float\n");
9314 printf ("Hard float (-mdouble-float)\n");
9317 printf ("Hard float (-msingle-float)\n");
9320 printf ("Soft float\n");
9323 printf ("64-bit float (-mips32r2 -mfp64)\n");
9326 printf ("??? (%d)\n", val
);
9333 type
= 1; /* String. */
9335 type
= 2; /* uleb128. */
9336 printf (" Tag_unknown_%d: ", tag
);
9340 printf ("\"%s\"\n", p
);
9341 p
+= strlen ((char *) p
) + 1;
9345 val
= read_uleb128 (p
, &len
);
9347 printf ("%d (0x%x)\n", val
, val
);
9354 process_attributes (FILE * file
,
9355 const char * public_name
,
9356 unsigned int proc_type
,
9357 unsigned char * (* display_pub_attribute
) (unsigned char *),
9358 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, int))
9360 Elf_Internal_Shdr
* sect
;
9361 unsigned char * contents
;
9363 unsigned char * end
;
9364 bfd_vma section_len
;
9368 /* Find the section header so that we get the size. */
9369 for (i
= 0, sect
= section_headers
;
9370 i
< elf_header
.e_shnum
;
9373 if (sect
->sh_type
!= proc_type
&& sect
->sh_type
!= SHT_GNU_ATTRIBUTES
)
9376 contents
= get_data (NULL
, file
, sect
->sh_offset
, 1, sect
->sh_size
,
9378 if (contents
== NULL
)
9384 len
= sect
->sh_size
- 1;
9390 bfd_boolean public_section
;
9391 bfd_boolean gnu_section
;
9393 section_len
= byte_get (p
, 4);
9396 if (section_len
> len
)
9398 printf (_("ERROR: Bad section length (%d > %d)\n"),
9399 (int) section_len
, (int) len
);
9404 printf ("Attribute Section: %s\n", p
);
9406 if (public_name
&& streq ((char *) p
, public_name
))
9407 public_section
= TRUE
;
9409 public_section
= FALSE
;
9411 if (streq ((char *) p
, "gnu"))
9414 gnu_section
= FALSE
;
9416 namelen
= strlen ((char *) p
) + 1;
9418 section_len
-= namelen
+ 4;
9420 while (section_len
> 0)
9426 size
= byte_get (p
, 4);
9427 if (size
> section_len
)
9429 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
9430 (int) size
, (int) section_len
);
9434 section_len
-= size
;
9441 printf ("File Attributes\n");
9444 printf ("Section Attributes:");
9447 printf ("Symbol Attributes:");
9453 val
= read_uleb128 (p
, &i
);
9457 printf (" %d", val
);
9462 printf ("Unknown tag: %d\n", tag
);
9463 public_section
= FALSE
;
9470 p
= display_pub_attribute (p
);
9472 else if (gnu_section
)
9475 p
= display_gnu_attribute (p
,
9476 display_proc_gnu_attribute
);
9480 /* ??? Do something sensible, like dump hex. */
9481 printf (" Unknown section contexts\n");
9488 printf (_("Unknown format '%c'\n"), *p
);
9496 process_arm_specific (FILE * file
)
9498 return process_attributes (file
, "aeabi", SHT_ARM_ATTRIBUTES
,
9499 display_arm_attribute
, NULL
);
9503 process_power_specific (FILE * file
)
9505 return process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
9506 display_power_gnu_attribute
);
9509 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
9510 Print the Address, Access and Initial fields of an entry at VMA ADDR
9511 and return the VMA of the next entry. */
9514 print_mips_got_entry (unsigned char * data
, bfd_vma pltgot
, bfd_vma addr
)
9517 print_vma (addr
, LONG_HEX
);
9519 if (addr
< pltgot
+ 0xfff0)
9520 printf ("%6d(gp)", (int) (addr
- pltgot
- 0x7ff0));
9522 printf ("%10s", "");
9525 printf ("%*s", is_32bit_elf
? 8 : 16, "<unknown>");
9530 entry
= byte_get (data
+ addr
- pltgot
, is_32bit_elf
? 4 : 8);
9531 print_vma (entry
, LONG_HEX
);
9533 return addr
+ (is_32bit_elf
? 4 : 8);
9536 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
9537 PLTGOT. Print the Address and Initial fields of an entry at VMA
9538 ADDR and return the VMA of the next entry. */
9541 print_mips_pltgot_entry (unsigned char * data
, bfd_vma pltgot
, bfd_vma addr
)
9544 print_vma (addr
, LONG_HEX
);
9547 printf ("%*s", is_32bit_elf
? 8 : 16, "<unknown>");
9552 entry
= byte_get (data
+ addr
- pltgot
, is_32bit_elf
? 4 : 8);
9553 print_vma (entry
, LONG_HEX
);
9555 return addr
+ (is_32bit_elf
? 4 : 8);
9559 process_mips_specific (FILE * file
)
9561 Elf_Internal_Dyn
* entry
;
9562 size_t liblist_offset
= 0;
9563 size_t liblistno
= 0;
9564 size_t conflictsno
= 0;
9565 size_t options_offset
= 0;
9566 size_t conflicts_offset
= 0;
9567 size_t pltrelsz
= 0;
9570 bfd_vma mips_pltgot
= 0;
9572 bfd_vma local_gotno
= 0;
9574 bfd_vma symtabno
= 0;
9576 process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
9577 display_mips_gnu_attribute
);
9579 /* We have a lot of special sections. Thanks SGI! */
9580 if (dynamic_section
== NULL
)
9581 /* No information available. */
9584 for (entry
= dynamic_section
; entry
->d_tag
!= DT_NULL
; ++entry
)
9585 switch (entry
->d_tag
)
9587 case DT_MIPS_LIBLIST
:
9589 = offset_from_vma (file
, entry
->d_un
.d_val
,
9590 liblistno
* sizeof (Elf32_External_Lib
));
9592 case DT_MIPS_LIBLISTNO
:
9593 liblistno
= entry
->d_un
.d_val
;
9595 case DT_MIPS_OPTIONS
:
9596 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
9598 case DT_MIPS_CONFLICT
:
9600 = offset_from_vma (file
, entry
->d_un
.d_val
,
9601 conflictsno
* sizeof (Elf32_External_Conflict
));
9603 case DT_MIPS_CONFLICTNO
:
9604 conflictsno
= entry
->d_un
.d_val
;
9607 pltgot
= entry
->d_un
.d_ptr
;
9609 case DT_MIPS_LOCAL_GOTNO
:
9610 local_gotno
= entry
->d_un
.d_val
;
9612 case DT_MIPS_GOTSYM
:
9613 gotsym
= entry
->d_un
.d_val
;
9615 case DT_MIPS_SYMTABNO
:
9616 symtabno
= entry
->d_un
.d_val
;
9618 case DT_MIPS_PLTGOT
:
9619 mips_pltgot
= entry
->d_un
.d_ptr
;
9622 pltrel
= entry
->d_un
.d_val
;
9625 pltrelsz
= entry
->d_un
.d_val
;
9628 jmprel
= entry
->d_un
.d_ptr
;
9634 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
9636 Elf32_External_Lib
* elib
;
9639 elib
= get_data (NULL
, file
, liblist_offset
,
9640 liblistno
, sizeof (Elf32_External_Lib
),
9644 printf ("\nSection '.liblist' contains %lu entries:\n",
9645 (unsigned long) liblistno
);
9646 fputs (" Library Time Stamp Checksum Version Flags\n",
9649 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
9656 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9657 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9658 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9659 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9660 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9662 tmp
= gmtime (&time
);
9663 snprintf (timebuf
, sizeof (timebuf
),
9664 "%04u-%02u-%02uT%02u:%02u:%02u",
9665 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9666 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9668 printf ("%3lu: ", (unsigned long) cnt
);
9669 if (VALID_DYNAMIC_NAME (liblist
.l_name
))
9670 print_symbol (20, GET_DYNAMIC_NAME (liblist
.l_name
));
9672 printf ("<corrupt: %9ld>", liblist
.l_name
);
9673 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
9676 if (liblist
.l_flags
== 0)
9687 { " EXACT_MATCH", LL_EXACT_MATCH
},
9688 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
9689 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
9690 { " EXPORTS", LL_EXPORTS
},
9691 { " DELAY_LOAD", LL_DELAY_LOAD
},
9692 { " DELTA", LL_DELTA
}
9694 int flags
= liblist
.l_flags
;
9697 for (fcnt
= 0; fcnt
< ARRAY_SIZE (l_flags_vals
); ++fcnt
)
9698 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
9700 fputs (l_flags_vals
[fcnt
].name
, stdout
);
9701 flags
^= l_flags_vals
[fcnt
].bit
;
9704 printf (" %#x", (unsigned int) flags
);
9714 if (options_offset
!= 0)
9716 Elf_External_Options
* eopt
;
9717 Elf_Internal_Shdr
* sect
= section_headers
;
9718 Elf_Internal_Options
* iopt
;
9719 Elf_Internal_Options
* option
;
9723 /* Find the section header so that we get the size. */
9724 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
9727 eopt
= get_data (NULL
, file
, options_offset
, 1, sect
->sh_size
,
9731 iopt
= cmalloc ((sect
->sh_size
/ sizeof (eopt
)), sizeof (* iopt
));
9734 error (_("Out of memory\n"));
9741 while (offset
< sect
->sh_size
)
9743 Elf_External_Options
* eoption
;
9745 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
9747 option
->kind
= BYTE_GET (eoption
->kind
);
9748 option
->size
= BYTE_GET (eoption
->size
);
9749 option
->section
= BYTE_GET (eoption
->section
);
9750 option
->info
= BYTE_GET (eoption
->info
);
9752 offset
+= option
->size
;
9758 printf (_("\nSection '%s' contains %d entries:\n"),
9759 SECTION_NAME (sect
), cnt
);
9767 switch (option
->kind
)
9770 /* This shouldn't happen. */
9771 printf (" NULL %d %lx", option
->section
, option
->info
);
9774 printf (" REGINFO ");
9775 if (elf_header
.e_machine
== EM_MIPS
)
9778 Elf32_External_RegInfo
* ereg
;
9779 Elf32_RegInfo reginfo
;
9781 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
9782 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9783 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9784 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9785 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9786 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9787 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9789 printf ("GPR %08lx GP 0x%lx\n",
9791 (unsigned long) reginfo
.ri_gp_value
);
9792 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9793 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9794 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9799 Elf64_External_RegInfo
* ereg
;
9800 Elf64_Internal_RegInfo reginfo
;
9802 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
9803 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9804 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9805 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9806 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9807 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9808 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9810 printf ("GPR %08lx GP 0x",
9811 reginfo
.ri_gprmask
);
9812 printf_vma (reginfo
.ri_gp_value
);
9815 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9816 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9817 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9821 case ODK_EXCEPTIONS
:
9822 fputs (" EXCEPTIONS fpe_min(", stdout
);
9823 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
9824 fputs (") fpe_max(", stdout
);
9825 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
9826 fputs (")", stdout
);
9828 if (option
->info
& OEX_PAGE0
)
9829 fputs (" PAGE0", stdout
);
9830 if (option
->info
& OEX_SMM
)
9831 fputs (" SMM", stdout
);
9832 if (option
->info
& OEX_FPDBUG
)
9833 fputs (" FPDBUG", stdout
);
9834 if (option
->info
& OEX_DISMISS
)
9835 fputs (" DISMISS", stdout
);
9838 fputs (" PAD ", stdout
);
9839 if (option
->info
& OPAD_PREFIX
)
9840 fputs (" PREFIX", stdout
);
9841 if (option
->info
& OPAD_POSTFIX
)
9842 fputs (" POSTFIX", stdout
);
9843 if (option
->info
& OPAD_SYMBOL
)
9844 fputs (" SYMBOL", stdout
);
9847 fputs (" HWPATCH ", stdout
);
9848 if (option
->info
& OHW_R4KEOP
)
9849 fputs (" R4KEOP", stdout
);
9850 if (option
->info
& OHW_R8KPFETCH
)
9851 fputs (" R8KPFETCH", stdout
);
9852 if (option
->info
& OHW_R5KEOP
)
9853 fputs (" R5KEOP", stdout
);
9854 if (option
->info
& OHW_R5KCVTL
)
9855 fputs (" R5KCVTL", stdout
);
9858 fputs (" FILL ", stdout
);
9859 /* XXX Print content of info word? */
9862 fputs (" TAGS ", stdout
);
9863 /* XXX Print content of info word? */
9866 fputs (" HWAND ", stdout
);
9867 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9868 fputs (" R4KEOP_CHECKED", stdout
);
9869 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9870 fputs (" R4KEOP_CLEAN", stdout
);
9873 fputs (" HWOR ", stdout
);
9874 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9875 fputs (" R4KEOP_CHECKED", stdout
);
9876 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9877 fputs (" R4KEOP_CLEAN", stdout
);
9880 printf (" GP_GROUP %#06lx self-contained %#06lx",
9881 option
->info
& OGP_GROUP
,
9882 (option
->info
& OGP_SELF
) >> 16);
9885 printf (" IDENT %#06lx self-contained %#06lx",
9886 option
->info
& OGP_GROUP
,
9887 (option
->info
& OGP_SELF
) >> 16);
9890 /* This shouldn't happen. */
9891 printf (" %3d ??? %d %lx",
9892 option
->kind
, option
->section
, option
->info
);
9896 len
= sizeof (* eopt
);
9897 while (len
< option
->size
)
9898 if (((char *) option
)[len
] >= ' '
9899 && ((char *) option
)[len
] < 0x7f)
9900 printf ("%c", ((char *) option
)[len
++]);
9902 printf ("\\%03o", ((char *) option
)[len
++]);
9904 fputs ("\n", stdout
);
9912 if (conflicts_offset
!= 0 && conflictsno
!= 0)
9914 Elf32_Conflict
* iconf
;
9917 if (dynamic_symbols
== NULL
)
9919 error (_("conflict list found without a dynamic symbol table\n"));
9923 iconf
= cmalloc (conflictsno
, sizeof (* iconf
));
9926 error (_("Out of memory\n"));
9932 Elf32_External_Conflict
* econf32
;
9934 econf32
= get_data (NULL
, file
, conflicts_offset
,
9935 conflictsno
, sizeof (* econf32
), _("conflict"));
9939 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9940 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
9946 Elf64_External_Conflict
* econf64
;
9948 econf64
= get_data (NULL
, file
, conflicts_offset
,
9949 conflictsno
, sizeof (* econf64
), _("conflict"));
9953 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9954 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
9959 printf (_("\nSection '.conflict' contains %lu entries:\n"),
9960 (unsigned long) conflictsno
);
9961 puts (_(" Num: Index Value Name"));
9963 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9965 Elf_Internal_Sym
* psym
= & dynamic_symbols
[iconf
[cnt
]];
9967 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
9968 print_vma (psym
->st_value
, FULL_HEX
);
9970 if (VALID_DYNAMIC_NAME (psym
->st_name
))
9971 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
9973 printf ("<corrupt: %14ld>", psym
->st_name
);
9980 if (pltgot
!= 0 && local_gotno
!= 0)
9982 bfd_vma entry
, local_end
, global_end
;
9984 unsigned char * data
;
9988 addr_size
= (is_32bit_elf
? 4 : 8);
9989 local_end
= pltgot
+ local_gotno
* addr_size
;
9990 global_end
= local_end
+ (symtabno
- gotsym
) * addr_size
;
9992 offset
= offset_from_vma (file
, pltgot
, global_end
- pltgot
);
9993 data
= get_data (NULL
, file
, offset
, global_end
- pltgot
, 1, _("GOT"));
9994 printf (_("\nPrimary GOT:\n"));
9995 printf (_(" Canonical gp value: "));
9996 print_vma (pltgot
+ 0x7ff0, LONG_HEX
);
9999 printf (_(" Reserved entries:\n"));
10000 printf (_(" %*s %10s %*s Purpose\n"),
10001 addr_size
* 2, "Address", "Access",
10002 addr_size
* 2, "Initial");
10003 entry
= print_mips_got_entry (data
, pltgot
, entry
);
10004 printf (" Lazy resolver\n");
10006 && (byte_get (data
+ entry
- pltgot
, addr_size
)
10007 >> (addr_size
* 8 - 1)) != 0)
10009 entry
= print_mips_got_entry (data
, pltgot
, entry
);
10010 printf (" Module pointer (GNU extension)\n");
10014 if (entry
< local_end
)
10016 printf (_(" Local entries:\n"));
10017 printf (_(" %*s %10s %*s\n"),
10018 addr_size
* 2, "Address", "Access",
10019 addr_size
* 2, "Initial");
10020 while (entry
< local_end
)
10022 entry
= print_mips_got_entry (data
, pltgot
, entry
);
10028 if (gotsym
< symtabno
)
10032 printf (_(" Global entries:\n"));
10033 printf (_(" %*s %10s %*s %*s %-7s %3s %s\n"),
10034 addr_size
* 2, "Address", "Access",
10035 addr_size
* 2, "Initial",
10036 addr_size
* 2, "Sym.Val.", "Type", "Ndx", "Name");
10037 sym_width
= (is_32bit_elf
? 80 : 160) - 28 - addr_size
* 6 - 1;
10038 for (i
= gotsym
; i
< symtabno
; i
++)
10040 Elf_Internal_Sym
* psym
;
10042 psym
= dynamic_symbols
+ i
;
10043 entry
= print_mips_got_entry (data
, pltgot
, entry
);
10045 print_vma (psym
->st_value
, LONG_HEX
);
10046 printf (" %-7s %3s ",
10047 get_symbol_type (ELF_ST_TYPE (psym
->st_info
)),
10048 get_symbol_index_type (psym
->st_shndx
));
10049 if (VALID_DYNAMIC_NAME (psym
->st_name
))
10050 print_symbol (sym_width
, GET_DYNAMIC_NAME (psym
->st_name
));
10052 printf ("<corrupt: %14ld>", psym
->st_name
);
10062 if (mips_pltgot
!= 0 && jmprel
!= 0 && pltrel
!= 0 && pltrelsz
!= 0)
10064 bfd_vma entry
, end
;
10065 size_t offset
, rel_offset
;
10066 unsigned long count
, i
;
10067 unsigned char * data
;
10068 int addr_size
, sym_width
;
10069 Elf_Internal_Rela
* rels
;
10071 rel_offset
= offset_from_vma (file
, jmprel
, pltrelsz
);
10072 if (pltrel
== DT_RELA
)
10074 if (!slurp_rela_relocs (file
, rel_offset
, pltrelsz
, &rels
, &count
))
10079 if (!slurp_rel_relocs (file
, rel_offset
, pltrelsz
, &rels
, &count
))
10083 entry
= mips_pltgot
;
10084 addr_size
= (is_32bit_elf
? 4 : 8);
10085 end
= mips_pltgot
+ (2 + count
) * addr_size
;
10087 offset
= offset_from_vma (file
, mips_pltgot
, end
- mips_pltgot
);
10088 data
= get_data (NULL
, file
, offset
, end
- mips_pltgot
, 1, _("PLT GOT"));
10089 printf (_("\nPLT GOT:\n\n"));
10090 printf (_(" Reserved entries:\n"));
10091 printf (_(" %*s %*s Purpose\n"),
10092 addr_size
* 2, "Address", addr_size
* 2, "Initial");
10093 entry
= print_mips_pltgot_entry (data
, mips_pltgot
, entry
);
10094 printf (" PLT lazy resolver\n");
10095 entry
= print_mips_pltgot_entry (data
, mips_pltgot
, entry
);
10096 printf (" Module pointer\n");
10099 printf (_(" Entries:\n"));
10100 printf (_(" %*s %*s %*s %-7s %3s %s\n"),
10101 addr_size
* 2, "Address",
10102 addr_size
* 2, "Initial",
10103 addr_size
* 2, "Sym.Val.", "Type", "Ndx", "Name");
10104 sym_width
= (is_32bit_elf
? 80 : 160) - 17 - addr_size
* 6 - 1;
10105 for (i
= 0; i
< count
; i
++)
10107 Elf_Internal_Sym
* psym
;
10109 psym
= dynamic_symbols
+ get_reloc_symindex (rels
[i
].r_info
);
10110 entry
= print_mips_pltgot_entry (data
, mips_pltgot
, entry
);
10112 print_vma (psym
->st_value
, LONG_HEX
);
10113 printf (" %-7s %3s ",
10114 get_symbol_type (ELF_ST_TYPE (psym
->st_info
)),
10115 get_symbol_index_type (psym
->st_shndx
));
10116 if (VALID_DYNAMIC_NAME (psym
->st_name
))
10117 print_symbol (sym_width
, GET_DYNAMIC_NAME (psym
->st_name
));
10119 printf ("<corrupt: %14ld>", psym
->st_name
);
10133 process_gnu_liblist (FILE * file
)
10135 Elf_Internal_Shdr
* section
;
10136 Elf_Internal_Shdr
* string_sec
;
10137 Elf32_External_Lib
* elib
;
10139 size_t strtab_size
;
10146 for (i
= 0, section
= section_headers
;
10147 i
< elf_header
.e_shnum
;
10150 switch (section
->sh_type
)
10152 case SHT_GNU_LIBLIST
:
10153 if (section
->sh_link
>= elf_header
.e_shnum
)
10156 elib
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
10161 string_sec
= section_headers
+ section
->sh_link
;
10163 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
10164 string_sec
->sh_size
, _("liblist string table"));
10165 strtab_size
= string_sec
->sh_size
;
10168 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
10174 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
10175 SECTION_NAME (section
),
10176 (unsigned long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
10178 puts (" Library Time Stamp Checksum Version Flags");
10180 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
10188 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
10189 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
10190 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
10191 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
10192 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
10194 tmp
= gmtime (&time
);
10195 snprintf (timebuf
, sizeof (timebuf
),
10196 "%04u-%02u-%02uT%02u:%02u:%02u",
10197 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
10198 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
10200 printf ("%3lu: ", (unsigned long) cnt
);
10202 printf ("%-20s", liblist
.l_name
< strtab_size
10203 ? strtab
+ liblist
.l_name
: "<corrupt>");
10205 printf ("%-20.20s", liblist
.l_name
< strtab_size
10206 ? strtab
+ liblist
.l_name
: "<corrupt>");
10207 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
10208 liblist
.l_version
, liblist
.l_flags
);
10218 static const char *
10219 get_note_type (unsigned e_type
)
10221 static char buff
[64];
10223 if (elf_header
.e_type
== ET_CORE
)
10227 return _("NT_AUXV (auxiliary vector)");
10229 return _("NT_PRSTATUS (prstatus structure)");
10231 return _("NT_FPREGSET (floating point registers)");
10233 return _("NT_PRPSINFO (prpsinfo structure)");
10234 case NT_TASKSTRUCT
:
10235 return _("NT_TASKSTRUCT (task structure)");
10237 return _("NT_PRXFPREG (user_xfpregs structure)");
10239 return _("NT_PPC_VMX (ppc Altivec registers)");
10241 return _("NT_PPC_VSX (ppc VSX registers)");
10243 return _("NT_PSTATUS (pstatus structure)");
10245 return _("NT_FPREGS (floating point registers)");
10247 return _("NT_PSINFO (psinfo structure)");
10249 return _("NT_LWPSTATUS (lwpstatus_t structure)");
10251 return _("NT_LWPSINFO (lwpsinfo_t structure)");
10252 case NT_WIN32PSTATUS
:
10253 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
10261 return _("NT_VERSION (version)");
10263 return _("NT_ARCH (architecture)");
10268 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
10272 static const char *
10273 get_gnu_elf_note_type (unsigned e_type
)
10275 static char buff
[64];
10279 case NT_GNU_ABI_TAG
:
10280 return _("NT_GNU_ABI_TAG (ABI version tag)");
10282 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
10283 case NT_GNU_BUILD_ID
:
10284 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
10285 case NT_GNU_GOLD_VERSION
:
10286 return _("NT_GNU_GOLD_VERSION (gold version)");
10291 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
10295 static const char *
10296 get_netbsd_elfcore_note_type (unsigned e_type
)
10298 static char buff
[64];
10300 if (e_type
== NT_NETBSDCORE_PROCINFO
)
10302 /* NetBSD core "procinfo" structure. */
10303 return _("NetBSD procinfo structure");
10306 /* As of Jan 2002 there are no other machine-independent notes
10307 defined for NetBSD core files. If the note type is less
10308 than the start of the machine-dependent note types, we don't
10311 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
10313 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
10317 switch (elf_header
.e_machine
)
10319 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
10320 and PT_GETFPREGS == mach+2. */
10325 case EM_SPARC32PLUS
:
10329 case NT_NETBSDCORE_FIRSTMACH
+0:
10330 return _("PT_GETREGS (reg structure)");
10331 case NT_NETBSDCORE_FIRSTMACH
+2:
10332 return _("PT_GETFPREGS (fpreg structure)");
10338 /* On all other arch's, PT_GETREGS == mach+1 and
10339 PT_GETFPREGS == mach+3. */
10343 case NT_NETBSDCORE_FIRSTMACH
+1:
10344 return _("PT_GETREGS (reg structure)");
10345 case NT_NETBSDCORE_FIRSTMACH
+3:
10346 return _("PT_GETFPREGS (fpreg structure)");
10352 snprintf (buff
, sizeof (buff
), _("PT_FIRSTMACH+%d"),
10353 e_type
- NT_NETBSDCORE_FIRSTMACH
);
10357 /* Note that by the ELF standard, the name field is already null byte
10358 terminated, and namesz includes the terminating null byte.
10359 I.E. the value of namesz for the name "FSF" is 4.
10361 If the value of namesz is zero, there is no name present. */
10363 process_note (Elf_Internal_Note
* pnote
)
10365 const char * name
= pnote
->namesz
? pnote
->namedata
: "(NONE)";
10368 if (pnote
->namesz
== 0)
10369 /* If there is no note name, then use the default set of
10370 note type strings. */
10371 nt
= get_note_type (pnote
->type
);
10373 else if (const_strneq (pnote
->namedata
, "GNU"))
10374 /* GNU-specific object file notes. */
10375 nt
= get_gnu_elf_note_type (pnote
->type
);
10377 else if (const_strneq (pnote
->namedata
, "NetBSD-CORE"))
10378 /* NetBSD-specific core file notes. */
10379 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
10381 else if (strneq (pnote
->namedata
, "SPU/", 4))
10383 /* SPU-specific core file notes. */
10384 nt
= pnote
->namedata
+ 4;
10389 /* Don't recognize this note name; just use the default set of
10390 note type strings. */
10391 nt
= get_note_type (pnote
->type
);
10393 printf (" %s\t\t0x%08lx\t%s\n", name
, pnote
->descsz
, nt
);
10399 process_corefile_note_segment (FILE * file
, bfd_vma offset
, bfd_vma length
)
10401 Elf_External_Note
* pnotes
;
10402 Elf_External_Note
* external
;
10408 pnotes
= get_data (NULL
, file
, offset
, 1, length
, _("notes"));
10414 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
10415 (unsigned long) offset
, (unsigned long) length
);
10416 printf (_(" Owner\t\tData size\tDescription\n"));
10418 while (external
< (Elf_External_Note
*) ((char *) pnotes
+ length
))
10420 Elf_External_Note
* next
;
10421 Elf_Internal_Note inote
;
10422 char * temp
= NULL
;
10424 inote
.type
= BYTE_GET (external
->type
);
10425 inote
.namesz
= BYTE_GET (external
->namesz
);
10426 inote
.namedata
= external
->name
;
10427 inote
.descsz
= BYTE_GET (external
->descsz
);
10428 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
10429 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
10431 next
= (Elf_External_Note
*) (inote
.descdata
+ align_power (inote
.descsz
, 2));
10433 if (((char *) next
) > (((char *) pnotes
) + length
))
10435 warn (_("corrupt note found at offset %lx into core notes\n"),
10436 (unsigned long) ((char *) external
- (char *) pnotes
));
10437 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
10438 inote
.type
, inote
.namesz
, inote
.descsz
);
10444 /* Verify that name is null terminated. It appears that at least
10445 one version of Linux (RedHat 6.0) generates corefiles that don't
10446 comply with the ELF spec by failing to include the null byte in
10448 if (inote
.namedata
[inote
.namesz
] != '\0')
10450 temp
= malloc (inote
.namesz
+ 1);
10454 error (_("Out of memory\n"));
10459 strncpy (temp
, inote
.namedata
, inote
.namesz
);
10460 temp
[inote
.namesz
] = 0;
10462 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
10463 inote
.namedata
= temp
;
10466 res
&= process_note (& inote
);
10481 process_corefile_note_segments (FILE * file
)
10483 Elf_Internal_Phdr
* segment
;
10487 if (! get_program_headers (file
))
10490 for (i
= 0, segment
= program_headers
;
10491 i
< elf_header
.e_phnum
;
10494 if (segment
->p_type
== PT_NOTE
)
10495 res
&= process_corefile_note_segment (file
,
10496 (bfd_vma
) segment
->p_offset
,
10497 (bfd_vma
) segment
->p_filesz
);
10504 process_note_sections (FILE * file
)
10506 Elf_Internal_Shdr
* section
;
10510 for (i
= 0, section
= section_headers
;
10511 i
< elf_header
.e_shnum
;
10513 if (section
->sh_type
== SHT_NOTE
)
10514 res
&= process_corefile_note_segment (file
,
10515 (bfd_vma
) section
->sh_offset
,
10516 (bfd_vma
) section
->sh_size
);
10522 process_notes (FILE * file
)
10524 /* If we have not been asked to display the notes then do nothing. */
10528 if (elf_header
.e_type
!= ET_CORE
)
10529 return process_note_sections (file
);
10531 /* No program headers means no NOTE segment. */
10532 if (elf_header
.e_phnum
> 0)
10533 return process_corefile_note_segments (file
);
10535 printf (_("No note segments present in the core file.\n"));
10540 process_arch_specific (FILE * file
)
10545 switch (elf_header
.e_machine
)
10548 return process_arm_specific (file
);
10550 case EM_MIPS_RS3_LE
:
10551 return process_mips_specific (file
);
10554 return process_power_specific (file
);
10563 get_file_header (FILE * file
)
10565 /* Read in the identity array. */
10566 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
10569 /* Determine how to read the rest of the header. */
10570 switch (elf_header
.e_ident
[EI_DATA
])
10572 default: /* fall through */
10573 case ELFDATANONE
: /* fall through */
10575 byte_get
= byte_get_little_endian
;
10576 byte_put
= byte_put_little_endian
;
10579 byte_get
= byte_get_big_endian
;
10580 byte_put
= byte_put_big_endian
;
10584 /* For now we only support 32 bit and 64 bit ELF files. */
10585 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
10587 /* Read in the rest of the header. */
10590 Elf32_External_Ehdr ehdr32
;
10592 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
10595 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
10596 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
10597 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
10598 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
10599 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
10600 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
10601 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
10602 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
10603 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
10604 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
10605 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
10606 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
10607 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
10611 Elf64_External_Ehdr ehdr64
;
10613 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10614 we will not be able to cope with the 64bit data found in
10615 64 ELF files. Detect this now and abort before we start
10616 overwriting things. */
10617 if (sizeof (bfd_vma
) < 8)
10619 error (_("This instance of readelf has been built without support for a\n\
10620 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10624 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
10627 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
10628 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
10629 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
10630 elf_header
.e_entry
= BYTE_GET (ehdr64
.e_entry
);
10631 elf_header
.e_phoff
= BYTE_GET (ehdr64
.e_phoff
);
10632 elf_header
.e_shoff
= BYTE_GET (ehdr64
.e_shoff
);
10633 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
10634 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
10635 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
10636 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
10637 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
10638 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
10639 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
10642 if (elf_header
.e_shoff
)
10644 /* There may be some extensions in the first section header. Don't
10645 bomb if we can't read it. */
10647 get_32bit_section_headers (file
, 1);
10649 get_64bit_section_headers (file
, 1);
10655 /* Process one ELF object file according to the command line options.
10656 This file may actually be stored in an archive. The file is
10657 positioned at the start of the ELF object. */
10660 process_object (char * file_name
, FILE * file
)
10664 if (! get_file_header (file
))
10666 error (_("%s: Failed to read file header\n"), file_name
);
10670 /* Initialise per file variables. */
10671 for (i
= ARRAY_SIZE (version_info
); i
--;)
10672 version_info
[i
] = 0;
10674 for (i
= ARRAY_SIZE (dynamic_info
); i
--;)
10675 dynamic_info
[i
] = 0;
10677 /* Process the file. */
10679 printf (_("\nFile: %s\n"), file_name
);
10681 /* Initialise the dump_sects array from the cmdline_dump_sects array.
10682 Note we do this even if cmdline_dump_sects is empty because we
10683 must make sure that the dump_sets array is zeroed out before each
10684 object file is processed. */
10685 if (num_dump_sects
> num_cmdline_dump_sects
)
10686 memset (dump_sects
, 0, num_dump_sects
* sizeof (* dump_sects
));
10688 if (num_cmdline_dump_sects
> 0)
10690 if (num_dump_sects
== 0)
10691 /* A sneaky way of allocating the dump_sects array. */
10692 request_dump_bynumber (num_cmdline_dump_sects
, 0);
10694 assert (num_dump_sects
>= num_cmdline_dump_sects
);
10695 memcpy (dump_sects
, cmdline_dump_sects
,
10696 num_cmdline_dump_sects
* sizeof (* dump_sects
));
10699 if (! process_file_header ())
10702 if (! process_section_headers (file
))
10704 /* Without loaded section headers we cannot process lots of
10706 do_unwind
= do_version
= do_dump
= do_arch
= 0;
10708 if (! do_using_dynamic
)
10709 do_syms
= do_reloc
= 0;
10712 if (! process_section_groups (file
))
10714 /* Without loaded section groups we cannot process unwind. */
10718 if (process_program_headers (file
))
10719 process_dynamic_section (file
);
10721 process_relocs (file
);
10723 process_unwind (file
);
10725 process_symbol_table (file
);
10727 process_syminfo (file
);
10729 process_version_sections (file
);
10731 process_section_contents (file
);
10733 process_notes (file
);
10735 process_gnu_liblist (file
);
10737 process_arch_specific (file
);
10739 if (program_headers
)
10741 free (program_headers
);
10742 program_headers
= NULL
;
10745 if (section_headers
)
10747 free (section_headers
);
10748 section_headers
= NULL
;
10753 free (string_table
);
10754 string_table
= NULL
;
10755 string_table_length
= 0;
10758 if (dynamic_strings
)
10760 free (dynamic_strings
);
10761 dynamic_strings
= NULL
;
10762 dynamic_strings_length
= 0;
10765 if (dynamic_symbols
)
10767 free (dynamic_symbols
);
10768 dynamic_symbols
= NULL
;
10769 num_dynamic_syms
= 0;
10772 if (dynamic_syminfo
)
10774 free (dynamic_syminfo
);
10775 dynamic_syminfo
= NULL
;
10778 if (section_headers_groups
)
10780 free (section_headers_groups
);
10781 section_headers_groups
= NULL
;
10784 if (section_groups
)
10786 struct group_list
* g
;
10787 struct group_list
* next
;
10789 for (i
= 0; i
< group_count
; i
++)
10791 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
10798 free (section_groups
);
10799 section_groups
= NULL
;
10802 free_debug_memory ();
10807 /* Return the path name for a proxy entry in a thin archive, adjusted relative
10808 to the path name of the thin archive itself if necessary. Always returns
10809 a pointer to malloc'ed memory. */
10812 adjust_relative_path (char * file_name
, char * name
, int name_len
)
10814 char * member_file_name
;
10815 const char * base_name
= lbasename (file_name
);
10817 /* This is a proxy entry for a thin archive member.
10818 If the extended name table contains an absolute path
10819 name, or if the archive is in the current directory,
10820 use the path name as given. Otherwise, we need to
10821 find the member relative to the directory where the
10822 archive is located. */
10823 if (IS_ABSOLUTE_PATH (name
) || base_name
== file_name
)
10825 member_file_name
= malloc (name_len
+ 1);
10826 if (member_file_name
== NULL
)
10828 error (_("Out of memory\n"));
10831 memcpy (member_file_name
, name
, name_len
);
10832 member_file_name
[name_len
] = '\0';
10836 /* Concatenate the path components of the archive file name
10837 to the relative path name from the extended name table. */
10838 size_t prefix_len
= base_name
- file_name
;
10839 member_file_name
= malloc (prefix_len
+ name_len
+ 1);
10840 if (member_file_name
== NULL
)
10842 error (_("Out of memory\n"));
10845 memcpy (member_file_name
, file_name
, prefix_len
);
10846 memcpy (member_file_name
+ prefix_len
, name
, name_len
);
10847 member_file_name
[prefix_len
+ name_len
] = '\0';
10849 return member_file_name
;
10852 /* Structure to hold information about an archive file. */
10854 struct archive_info
10856 char * file_name
; /* Archive file name. */
10857 FILE * file
; /* Open file descriptor. */
10858 unsigned long index_num
; /* Number of symbols in table. */
10859 unsigned long * index_array
; /* The array of member offsets. */
10860 char * sym_table
; /* The symbol table. */
10861 unsigned long sym_size
; /* Size of the symbol table. */
10862 char * longnames
; /* The long file names table. */
10863 unsigned long longnames_size
; /* Size of the long file names table. */
10864 unsigned long nested_member_origin
; /* Origin in the nested archive of the current member. */
10865 unsigned long next_arhdr_offset
; /* Offset of the next archive header. */
10866 bfd_boolean is_thin_archive
; /* TRUE if this is a thin archive. */
10867 struct ar_hdr arhdr
; /* Current archive header. */
10870 /* Read the symbol table and long-name table from an archive. */
10873 setup_archive (struct archive_info
* arch
, char * file_name
, FILE * file
,
10874 bfd_boolean is_thin_archive
, bfd_boolean read_symbols
)
10877 unsigned long size
;
10879 arch
->file_name
= strdup (file_name
);
10881 arch
->index_num
= 0;
10882 arch
->index_array
= NULL
;
10883 arch
->sym_table
= NULL
;
10884 arch
->sym_size
= 0;
10885 arch
->longnames
= NULL
;
10886 arch
->longnames_size
= 0;
10887 arch
->nested_member_origin
= 0;
10888 arch
->is_thin_archive
= is_thin_archive
;
10889 arch
->next_arhdr_offset
= SARMAG
;
10891 /* Read the first archive member header. */
10892 if (fseek (file
, SARMAG
, SEEK_SET
) != 0)
10894 error (_("%s: failed to seek to first archive header\n"), file_name
);
10897 got
= fread (&arch
->arhdr
, 1, sizeof arch
->arhdr
, file
);
10898 if (got
!= sizeof arch
->arhdr
)
10903 error (_("%s: failed to read archive header\n"), file_name
);
10907 /* See if this is the archive symbol table. */
10908 if (const_strneq (arch
->arhdr
.ar_name
, "/ ")
10909 || const_strneq (arch
->arhdr
.ar_name
, "/SYM64/ "))
10911 size
= strtoul (arch
->arhdr
.ar_size
, NULL
, 10);
10912 size
= size
+ (size
& 1);
10914 arch
->next_arhdr_offset
+= sizeof arch
->arhdr
+ size
;
10919 /* A buffer used to hold numbers read in from an archive index.
10920 These are always 4 bytes long and stored in big-endian format. */
10921 #define SIZEOF_AR_INDEX_NUMBERS 4
10922 unsigned char integer_buffer
[SIZEOF_AR_INDEX_NUMBERS
];
10923 unsigned char * index_buffer
;
10925 /* Check the size of the archive index. */
10926 if (size
< SIZEOF_AR_INDEX_NUMBERS
)
10928 error (_("%s: the archive index is empty\n"), file_name
);
10932 /* Read the numer of entries in the archive index. */
10933 got
= fread (integer_buffer
, 1, sizeof integer_buffer
, file
);
10934 if (got
!= sizeof (integer_buffer
))
10936 error (_("%s: failed to read archive index\n"), file_name
);
10939 arch
->index_num
= byte_get_big_endian (integer_buffer
, sizeof integer_buffer
);
10940 size
-= SIZEOF_AR_INDEX_NUMBERS
;
10942 /* Read in the archive index. */
10943 if (size
< arch
->index_num
* SIZEOF_AR_INDEX_NUMBERS
)
10945 error (_("%s: the archive index is supposed to have %ld entries, but the size in the header is too small\n"),
10946 file_name
, arch
->index_num
);
10949 index_buffer
= malloc (arch
->index_num
* SIZEOF_AR_INDEX_NUMBERS
);
10950 if (index_buffer
== NULL
)
10952 error (_("Out of memory whilst trying to read archive symbol index\n"));
10955 got
= fread (index_buffer
, SIZEOF_AR_INDEX_NUMBERS
, arch
->index_num
, file
);
10956 if (got
!= arch
->index_num
)
10958 free (index_buffer
);
10959 error (_("%s: failed to read archive index\n"), file_name
);
10962 size
-= arch
->index_num
* SIZEOF_AR_INDEX_NUMBERS
;
10964 /* Convert the index numbers into the host's numeric format. */
10965 arch
->index_array
= malloc (arch
->index_num
* sizeof (* arch
->index_array
));
10966 if (arch
->index_array
== NULL
)
10968 free (index_buffer
);
10969 error (_("Out of memory whilst trying to convert the archive symbol index\n"));
10973 for (i
= 0; i
< arch
->index_num
; i
++)
10974 arch
->index_array
[i
] = byte_get_big_endian ((unsigned char *) (index_buffer
+ (i
* SIZEOF_AR_INDEX_NUMBERS
)),
10975 SIZEOF_AR_INDEX_NUMBERS
);
10976 free (index_buffer
);
10978 /* The remaining space in the header is taken up by the symbol table. */
10981 error (_("%s: the archive has an index but no symbols\n"), file_name
);
10984 arch
->sym_table
= malloc (size
);
10985 arch
->sym_size
= size
;
10986 if (arch
->sym_table
== NULL
)
10988 error (_("Out of memory whilst trying to read archive index symbol table\n"));
10991 got
= fread (arch
->sym_table
, 1, size
, file
);
10994 error (_("%s: failed to read archive index symbol table\n"), file_name
);
11000 if (fseek (file
, size
, SEEK_CUR
) != 0)
11002 error (_("%s: failed to skip archive symbol table\n"), file_name
);
11007 /* Read the next archive header. */
11008 got
= fread (&arch
->arhdr
, 1, sizeof arch
->arhdr
, file
);
11009 if (got
!= sizeof arch
->arhdr
)
11013 error (_("%s: failed to read archive header following archive index\n"), file_name
);
11017 else if (read_symbols
)
11018 printf (_("%s has no archive index\n"), file_name
);
11020 if (const_strneq (arch
->arhdr
.ar_name
, "// "))
11022 /* This is the archive string table holding long member names. */
11023 arch
->longnames_size
= strtoul (arch
->arhdr
.ar_size
, NULL
, 10);
11024 arch
->next_arhdr_offset
+= sizeof arch
->arhdr
+ arch
->longnames_size
;
11026 arch
->longnames
= malloc (arch
->longnames_size
);
11027 if (arch
->longnames
== NULL
)
11029 error (_("Out of memory reading long symbol names in archive\n"));
11033 if (fread (arch
->longnames
, arch
->longnames_size
, 1, file
) != 1)
11035 free (arch
->longnames
);
11036 arch
->longnames
= NULL
;
11037 error (_("%s: failed to read long symbol name string table\n"), file_name
);
11041 if ((arch
->longnames_size
& 1) != 0)
11048 /* Release the memory used for the archive information. */
11051 release_archive (struct archive_info
* arch
)
11053 if (arch
->file_name
!= NULL
)
11054 free (arch
->file_name
);
11055 if (arch
->index_array
!= NULL
)
11056 free (arch
->index_array
);
11057 if (arch
->sym_table
!= NULL
)
11058 free (arch
->sym_table
);
11059 if (arch
->longnames
!= NULL
)
11060 free (arch
->longnames
);
11063 /* Open and setup a nested archive, if not already open. */
11066 setup_nested_archive (struct archive_info
* nested_arch
, char * member_file_name
)
11068 FILE * member_file
;
11070 /* Have we already setup this archive? */
11071 if (nested_arch
->file_name
!= NULL
11072 && streq (nested_arch
->file_name
, member_file_name
))
11075 /* Close previous file and discard cached information. */
11076 if (nested_arch
->file
!= NULL
)
11077 fclose (nested_arch
->file
);
11078 release_archive (nested_arch
);
11080 member_file
= fopen (member_file_name
, "rb");
11081 if (member_file
== NULL
)
11083 return setup_archive (nested_arch
, member_file_name
, member_file
, FALSE
, FALSE
);
11087 get_archive_member_name_at (struct archive_info
* arch
,
11088 unsigned long offset
,
11089 struct archive_info
* nested_arch
);
11091 /* Get the name of an archive member from the current archive header.
11092 For simple names, this will modify the ar_name field of the current
11093 archive header. For long names, it will return a pointer to the
11094 longnames table. For nested archives, it will open the nested archive
11095 and get the name recursively. NESTED_ARCH is a single-entry cache so
11096 we don't keep rereading the same information from a nested archive. */
11099 get_archive_member_name (struct archive_info
* arch
,
11100 struct archive_info
* nested_arch
)
11102 unsigned long j
, k
;
11104 if (arch
->arhdr
.ar_name
[0] == '/')
11106 /* We have a long name. */
11108 char * member_file_name
;
11109 char * member_name
;
11111 arch
->nested_member_origin
= 0;
11112 k
= j
= strtoul (arch
->arhdr
.ar_name
+ 1, &endp
, 10);
11113 if (arch
->is_thin_archive
&& endp
!= NULL
&& * endp
== ':')
11114 arch
->nested_member_origin
= strtoul (endp
+ 1, NULL
, 10);
11116 while ((j
< arch
->longnames_size
)
11117 && (arch
->longnames
[j
] != '\n')
11118 && (arch
->longnames
[j
] != '\0'))
11120 if (arch
->longnames
[j
-1] == '/')
11122 arch
->longnames
[j
] = '\0';
11124 if (!arch
->is_thin_archive
|| arch
->nested_member_origin
== 0)
11125 return arch
->longnames
+ k
;
11127 /* This is a proxy for a member of a nested archive.
11128 Find the name of the member in that archive. */
11129 member_file_name
= adjust_relative_path (arch
->file_name
, arch
->longnames
+ k
, j
- k
);
11130 if (member_file_name
!= NULL
11131 && setup_nested_archive (nested_arch
, member_file_name
) == 0
11132 && (member_name
= get_archive_member_name_at (nested_arch
, arch
->nested_member_origin
, NULL
)) != NULL
)
11134 free (member_file_name
);
11135 return member_name
;
11137 free (member_file_name
);
11139 /* Last resort: just return the name of the nested archive. */
11140 return arch
->longnames
+ k
;
11143 /* We have a normal (short) name. */
11145 while ((arch
->arhdr
.ar_name
[j
] != '/') && (j
< 16))
11147 arch
->arhdr
.ar_name
[j
] = '\0';
11148 return arch
->arhdr
.ar_name
;
11151 /* Get the name of an archive member at a given OFFSET within an archive ARCH. */
11154 get_archive_member_name_at (struct archive_info
* arch
,
11155 unsigned long offset
,
11156 struct archive_info
* nested_arch
)
11160 if (fseek (arch
->file
, offset
, SEEK_SET
) != 0)
11162 error (_("%s: failed to seek to next file name\n"), arch
->file_name
);
11165 got
= fread (&arch
->arhdr
, 1, sizeof arch
->arhdr
, arch
->file
);
11166 if (got
!= sizeof arch
->arhdr
)
11168 error (_("%s: failed to read archive header\n"), arch
->file_name
);
11171 if (memcmp (arch
->arhdr
.ar_fmag
, ARFMAG
, 2) != 0)
11173 error (_("%s: did not find a valid archive header\n"), arch
->file_name
);
11177 return get_archive_member_name (arch
, nested_arch
);
11180 /* Construct a string showing the name of the archive member, qualified
11181 with the name of the containing archive file. For thin archives, we
11182 use square brackets to denote the indirection. For nested archives,
11183 we show the qualified name of the external member inside the square
11184 brackets (e.g., "thin.a[normal.a(foo.o)]"). */
11187 make_qualified_name (struct archive_info
* arch
,
11188 struct archive_info
* nested_arch
,
11189 char * member_name
)
11194 len
= strlen (arch
->file_name
) + strlen (member_name
) + 3;
11195 if (arch
->is_thin_archive
&& arch
->nested_member_origin
!= 0)
11196 len
+= strlen (nested_arch
->file_name
) + 2;
11198 name
= malloc (len
);
11201 error (_("Out of memory\n"));
11205 if (arch
->is_thin_archive
&& arch
->nested_member_origin
!= 0)
11206 snprintf (name
, len
, "%s[%s(%s)]", arch
->file_name
, nested_arch
->file_name
, member_name
);
11207 else if (arch
->is_thin_archive
)
11208 snprintf (name
, len
, "%s[%s]", arch
->file_name
, member_name
);
11210 snprintf (name
, len
, "%s(%s)", arch
->file_name
, member_name
);
11215 /* Process an ELF archive.
11216 On entry the file is positioned just after the ARMAG string. */
11219 process_archive (char * file_name
, FILE * file
, bfd_boolean is_thin_archive
)
11221 struct archive_info arch
;
11222 struct archive_info nested_arch
;
11224 size_t file_name_size
;
11229 /* The ARCH structure is used to hold information about this archive. */
11230 arch
.file_name
= NULL
;
11232 arch
.index_array
= NULL
;
11233 arch
.sym_table
= NULL
;
11234 arch
.longnames
= NULL
;
11236 /* The NESTED_ARCH structure is used as a single-item cache of information
11237 about a nested archive (when members of a thin archive reside within
11238 another regular archive file). */
11239 nested_arch
.file_name
= NULL
;
11240 nested_arch
.file
= NULL
;
11241 nested_arch
.index_array
= NULL
;
11242 nested_arch
.sym_table
= NULL
;
11243 nested_arch
.longnames
= NULL
;
11245 if (setup_archive (&arch
, file_name
, file
, is_thin_archive
, do_archive_index
) != 0)
11251 if (do_archive_index
)
11253 if (arch
.sym_table
== NULL
)
11254 error (_("%s: unable to dump the index as none was found\n"), file_name
);
11258 unsigned long current_pos
;
11260 printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
11261 file_name
, arch
.index_num
, arch
.sym_size
);
11262 current_pos
= ftell (file
);
11264 for (i
= l
= 0; i
< arch
.index_num
; i
++)
11266 if ((i
== 0) || ((i
> 0) && (arch
.index_array
[i
] != arch
.index_array
[i
- 1])))
11268 char * member_name
;
11270 member_name
= get_archive_member_name_at (&arch
, arch
.index_array
[i
], &nested_arch
);
11272 if (member_name
!= NULL
)
11274 char * qualified_name
= make_qualified_name (&arch
, &nested_arch
, member_name
);
11276 if (qualified_name
!= NULL
)
11278 printf (_("Binary %s contains:\n"), qualified_name
);
11279 free (qualified_name
);
11284 if (l
>= arch
.sym_size
)
11286 error (_("%s: end of the symbol table reached before the end of the index\n"),
11290 printf ("\t%s\n", arch
.sym_table
+ l
);
11291 l
+= strlen (arch
.sym_table
+ l
) + 1;
11296 if (l
< arch
.sym_size
)
11297 error (_("%s: symbols remain in the index symbol table, but without corresponding entries in the index table\n"),
11300 if (fseek (file
, current_pos
, SEEK_SET
) != 0)
11302 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name
);
11308 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
11309 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
11310 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
11311 && !do_section_groups
)
11313 ret
= 0; /* Archive index only. */
11318 file_name_size
= strlen (file_name
);
11325 char * qualified_name
;
11327 /* Read the next archive header. */
11328 if (fseek (file
, arch
.next_arhdr_offset
, SEEK_SET
) != 0)
11330 error (_("%s: failed to seek to next archive header\n"), file_name
);
11333 got
= fread (&arch
.arhdr
, 1, sizeof arch
.arhdr
, file
);
11334 if (got
!= sizeof arch
.arhdr
)
11338 error (_("%s: failed to read archive header\n"), file_name
);
11342 if (memcmp (arch
.arhdr
.ar_fmag
, ARFMAG
, 2) != 0)
11344 error (_("%s: did not find a valid archive header\n"), arch
.file_name
);
11349 arch
.next_arhdr_offset
+= sizeof arch
.arhdr
;
11351 archive_file_size
= strtoul (arch
.arhdr
.ar_size
, NULL
, 10);
11352 if (archive_file_size
& 01)
11353 ++archive_file_size
;
11355 name
= get_archive_member_name (&arch
, &nested_arch
);
11358 error (_("%s: bad archive file name\n"), file_name
);
11362 namelen
= strlen (name
);
11364 qualified_name
= make_qualified_name (&arch
, &nested_arch
, name
);
11365 if (qualified_name
== NULL
)
11367 error (_("%s: bad archive file name\n"), file_name
);
11372 if (is_thin_archive
&& arch
.nested_member_origin
== 0)
11374 /* This is a proxy for an external member of a thin archive. */
11375 FILE * member_file
;
11376 char * member_file_name
= adjust_relative_path (file_name
, name
, namelen
);
11377 if (member_file_name
== NULL
)
11383 member_file
= fopen (member_file_name
, "rb");
11384 if (member_file
== NULL
)
11386 error (_("Input file '%s' is not readable.\n"), member_file_name
);
11387 free (member_file_name
);
11392 archive_file_offset
= arch
.nested_member_origin
;
11394 ret
|= process_object (qualified_name
, member_file
);
11396 fclose (member_file
);
11397 free (member_file_name
);
11399 else if (is_thin_archive
)
11401 /* This is a proxy for a member of a nested archive. */
11402 archive_file_offset
= arch
.nested_member_origin
+ sizeof arch
.arhdr
;
11404 /* The nested archive file will have been opened and setup by
11405 get_archive_member_name. */
11406 if (fseek (nested_arch
.file
, archive_file_offset
, SEEK_SET
) != 0)
11408 error (_("%s: failed to seek to archive member.\n"), nested_arch
.file_name
);
11413 ret
|= process_object (qualified_name
, nested_arch
.file
);
11417 archive_file_offset
= arch
.next_arhdr_offset
;
11418 arch
.next_arhdr_offset
+= archive_file_size
;
11420 ret
|= process_object (qualified_name
, file
);
11423 free (qualified_name
);
11427 if (nested_arch
.file
!= NULL
)
11428 fclose (nested_arch
.file
);
11429 release_archive (&nested_arch
);
11430 release_archive (&arch
);
11436 process_file (char * file_name
)
11439 struct stat statbuf
;
11440 char armag
[SARMAG
];
11443 if (stat (file_name
, &statbuf
) < 0)
11445 if (errno
== ENOENT
)
11446 error (_("'%s': No such file\n"), file_name
);
11448 error (_("Could not locate '%s'. System error message: %s\n"),
11449 file_name
, strerror (errno
));
11453 if (! S_ISREG (statbuf
.st_mode
))
11455 error (_("'%s' is not an ordinary file\n"), file_name
);
11459 file
= fopen (file_name
, "rb");
11462 error (_("Input file '%s' is not readable.\n"), file_name
);
11466 if (fread (armag
, SARMAG
, 1, file
) != 1)
11468 error (_("%s: Failed to read file's magic number\n"), file_name
);
11473 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
11474 ret
= process_archive (file_name
, file
, FALSE
);
11475 else if (memcmp (armag
, ARMAGT
, SARMAG
) == 0)
11476 ret
= process_archive (file_name
, file
, TRUE
);
11479 if (do_archive_index
)
11480 error (_("File %s is not an archive so its index cannot be displayed.\n"),
11484 archive_file_size
= archive_file_offset
= 0;
11485 ret
= process_object (file_name
, file
);
11493 #ifdef SUPPORT_DISASSEMBLY
11494 /* Needed by the i386 disassembler. For extra credit, someone could
11495 fix this so that we insert symbolic addresses here, esp for GOT/PLT
11499 print_address (unsigned int addr
, FILE * outfile
)
11501 fprintf (outfile
,"0x%8.8x", addr
);
11504 /* Needed by the i386 disassembler. */
11506 db_task_printsym (unsigned int addr
)
11508 print_address (addr
, stderr
);
11513 main (int argc
, char ** argv
)
11517 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
11518 setlocale (LC_MESSAGES
, "");
11520 #if defined (HAVE_SETLOCALE)
11521 setlocale (LC_CTYPE
, "");
11523 bindtextdomain (PACKAGE
, LOCALEDIR
);
11524 textdomain (PACKAGE
);
11526 expandargv (&argc
, &argv
);
11528 parse_args (argc
, argv
);
11530 if (num_dump_sects
> 0)
11532 /* Make a copy of the dump_sects array. */
11533 cmdline_dump_sects
= malloc (num_dump_sects
* sizeof (* dump_sects
));
11534 if (cmdline_dump_sects
== NULL
)
11535 error (_("Out of memory allocating dump request table.\n"));
11538 memcpy (cmdline_dump_sects
, dump_sects
,
11539 num_dump_sects
* sizeof (* dump_sects
));
11540 num_cmdline_dump_sects
= num_dump_sects
;
11544 if (optind
< (argc
- 1))
11548 while (optind
< argc
)
11549 err
|= process_file (argv
[optind
++]);
11551 if (dump_sects
!= NULL
)
11553 if (cmdline_dump_sects
!= NULL
)
11554 free (cmdline_dump_sects
);