1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998-2016 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
24 /* The difference between readelf and objdump:
26 Both programs are capable of displaying the contents of ELF format files,
27 so why does the binutils project have two file dumpers ?
29 The reason is that objdump sees an ELF file through a BFD filter of the
30 world; if BFD has a bug where, say, it disagrees about a machine constant
31 in e_flags, then the odds are good that it will remain internally
32 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
33 GAS sees it the BFD way. There was need for a tool to go find out what
34 the file actually says.
36 This is why the readelf program does not link against the BFD library - it
37 exists as an independent program to help verify the correct working of BFD.
39 There is also the case that readelf can provide more information about an
40 ELF file than is provided by objdump. In particular it can display DWARF
41 debugging information which (at the moment) objdump cannot. */
52 /* Define BFD64 here, even if our default architecture is 32 bit ELF
53 as this will allow us to read in and parse 64bit and 32bit ELF files.
54 Only do this if we believe that the compiler can support a 64 bit
55 data type. For now we only rely on GCC being able to do this. */
64 #include "elf/common.h"
65 #include "elf/external.h"
66 #include "elf/internal.h"
69 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
70 we can obtain the H8 reloc numbers. We need these for the
71 get_reloc_size() function. We include h8.h again after defining
72 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
77 /* Undo the effects of #including reloc-macros.h. */
79 #undef START_RELOC_NUMBERS
83 #undef END_RELOC_NUMBERS
84 #undef _RELOC_MACROS_H
86 /* The following headers use the elf/reloc-macros.h file to
87 automatically generate relocation recognition functions
88 such as elf_mips_reloc_type() */
90 #define RELOC_MACROS_GEN_FUNC
92 #include "elf/aarch64.h"
93 #include "elf/alpha.h"
101 #include "elf/d10v.h"
102 #include "elf/d30v.h"
104 #include "elf/epiphany.h"
105 #include "elf/fr30.h"
107 #include "elf/ft32.h"
109 #include "elf/hppa.h"
110 #include "elf/i386.h"
111 #include "elf/i370.h"
112 #include "elf/i860.h"
113 #include "elf/i960.h"
114 #include "elf/ia64.h"
115 #include "elf/ip2k.h"
116 #include "elf/lm32.h"
117 #include "elf/iq2000.h"
118 #include "elf/m32c.h"
119 #include "elf/m32r.h"
120 #include "elf/m68k.h"
121 #include "elf/m68hc11.h"
122 #include "elf/mcore.h"
124 #include "elf/metag.h"
125 #include "elf/microblaze.h"
126 #include "elf/mips.h"
127 #include "elf/mmix.h"
128 #include "elf/mn10200.h"
129 #include "elf/mn10300.h"
130 #include "elf/moxie.h"
132 #include "elf/msp430.h"
133 #include "elf/nds32.h"
134 #include "elf/nios2.h"
135 #include "elf/or1k.h"
138 #include "elf/ppc64.h"
139 #include "elf/rl78.h"
141 #include "elf/s390.h"
142 #include "elf/score.h"
144 #include "elf/sparc.h"
146 #include "elf/tic6x.h"
147 #include "elf/tilegx.h"
148 #include "elf/tilepro.h"
149 #include "elf/v850.h"
151 #include "elf/visium.h"
152 #include "elf/x86-64.h"
153 #include "elf/xc16x.h"
154 #include "elf/xgate.h"
155 #include "elf/xstormy16.h"
156 #include "elf/xtensa.h"
159 #include "libiberty.h"
160 #include "safe-ctype.h"
161 #include "filenames.h"
164 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
167 typedef struct elf_section_list
169 Elf_Internal_Shdr
* hdr
;
170 struct elf_section_list
* next
;
173 char * program_name
= "readelf";
174 static unsigned long archive_file_offset
;
175 static unsigned long archive_file_size
;
176 static bfd_size_type current_file_size
;
177 static unsigned long dynamic_addr
;
178 static bfd_size_type dynamic_size
;
179 static size_t dynamic_nent
;
180 static char * dynamic_strings
;
181 static unsigned long dynamic_strings_length
;
182 static char * string_table
;
183 static unsigned long string_table_length
;
184 static unsigned long num_dynamic_syms
;
185 static Elf_Internal_Sym
* dynamic_symbols
;
186 static Elf_Internal_Syminfo
* dynamic_syminfo
;
187 static unsigned long dynamic_syminfo_offset
;
188 static unsigned int dynamic_syminfo_nent
;
189 static char program_interpreter
[PATH_MAX
];
190 static bfd_vma dynamic_info
[DT_ENCODING
];
191 static bfd_vma dynamic_info_DT_GNU_HASH
;
192 static bfd_vma version_info
[16];
193 static Elf_Internal_Ehdr elf_header
;
194 static Elf_Internal_Shdr
* section_headers
;
195 static Elf_Internal_Phdr
* program_headers
;
196 static Elf_Internal_Dyn
* dynamic_section
;
197 static elf_section_list
* symtab_shndx_list
;
198 static int show_name
;
199 static int do_dynamic
;
201 static int do_dyn_syms
;
203 static int do_sections
;
204 static int do_section_groups
;
205 static int do_section_details
;
206 static int do_segments
;
207 static int do_unwind
;
208 static int do_using_dynamic
;
209 static int do_header
;
211 static int do_version
;
212 static int do_histogram
;
213 static int do_debugging
;
216 static int do_archive_index
;
217 static int is_32bit_elf
;
218 static int decompress_dumps
;
222 struct group_list
* next
;
223 unsigned int section_index
;
228 struct group_list
* root
;
229 unsigned int group_index
;
232 static size_t group_count
;
233 static struct group
* section_groups
;
234 static struct group
** section_headers_groups
;
237 /* Flag bits indicating particular types of dump. */
238 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
239 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
240 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
241 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
242 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
244 typedef unsigned char dump_type
;
246 /* A linked list of the section names for which dumps were requested. */
247 struct dump_list_entry
251 struct dump_list_entry
* next
;
253 static struct dump_list_entry
* dump_sects_byname
;
255 /* A dynamic array of flags indicating for which sections a dump
256 has been requested via command line switches. */
257 static dump_type
* cmdline_dump_sects
= NULL
;
258 static unsigned int num_cmdline_dump_sects
= 0;
260 /* A dynamic array of flags indicating for which sections a dump of
261 some kind has been requested. It is reset on a per-object file
262 basis and then initialised from the cmdline_dump_sects array,
263 the results of interpreting the -w switch, and the
264 dump_sects_byname list. */
265 static dump_type
* dump_sects
= NULL
;
266 static unsigned int num_dump_sects
= 0;
269 /* How to print a vma value. */
270 typedef enum print_mode
282 /* Versioned symbol info. */
283 enum versioned_symbol_info
290 static const char *get_symbol_version_string
291 (FILE *file
, int is_dynsym
, const char *strtab
,
292 unsigned long int strtab_size
, unsigned int si
,
293 Elf_Internal_Sym
*psym
, enum versioned_symbol_info
*sym_info
,
294 unsigned short *vna_other
);
298 #define SECTION_NAME(X) \
299 ((X) == NULL ? _("<none>") \
300 : string_table == NULL ? _("<no-name>") \
301 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
302 : string_table + (X)->sh_name))
304 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
306 #define GET_ELF_SYMBOLS(file, section, sym_count) \
307 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
308 : get_64bit_elf_symbols (file, section, sym_count))
310 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
311 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
312 already been called and verified that the string exists. */
313 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
315 #define REMOVE_ARCH_BITS(ADDR) \
318 if (elf_header.e_machine == EM_ARM) \
323 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
324 the offset of the current archive member, if we are examining an archive.
325 Put the retrieved data into VAR, if it is not NULL. Otherwise allocate a buffer
326 using malloc and fill that. In either case return the pointer to the start of
327 the retrieved data or NULL if something went wrong. If something does go wrong
328 and REASON is not NULL then emit an error message using REASON as part of the
332 get_data (void * var
, FILE * file
, unsigned long offset
, bfd_size_type size
,
333 bfd_size_type nmemb
, const char * reason
)
336 bfd_size_type amt
= size
* nmemb
;
338 if (size
== 0 || nmemb
== 0)
341 /* If the size_t type is smaller than the bfd_size_type, eg because
342 you are building a 32-bit tool on a 64-bit host, then make sure
343 that when the sizes are cast to (size_t) no information is lost. */
344 if (sizeof (size_t) < sizeof (bfd_size_type
)
345 && ( (bfd_size_type
) ((size_t) size
) != size
346 || (bfd_size_type
) ((size_t) nmemb
) != nmemb
))
349 error (_("Size truncation prevents reading 0x%llx elements of size 0x%llx for %s\n"),
350 (unsigned long long) nmemb
, (unsigned long long) size
, reason
);
354 /* Check for size overflow. */
358 error (_("Size overflow prevents reading 0x%llx elements of size 0x%llx for %s\n"),
359 (unsigned long long) nmemb
, (unsigned long long) size
, reason
);
363 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
364 attempting to allocate memory when the read is bound to fail. */
365 if (amt
> current_file_size
366 || offset
+ archive_file_offset
+ amt
> current_file_size
)
369 error (_("Reading 0x%llx bytes extends past end of file for %s\n"),
370 (unsigned long long) amt
, reason
);
374 if (fseek (file
, archive_file_offset
+ offset
, SEEK_SET
))
377 error (_("Unable to seek to 0x%lx for %s\n"),
378 (unsigned long) archive_file_offset
+ offset
, reason
);
385 /* Check for overflow. */
386 if (nmemb
< (~(bfd_size_type
) 0 - 1) / size
)
387 /* + 1 so that we can '\0' terminate invalid string table sections. */
388 mvar
= malloc ((size_t) amt
+ 1);
393 error (_("Out of memory allocating 0x%llx bytes for %s\n"),
394 (unsigned long long) amt
, reason
);
398 ((char *) mvar
)[amt
] = '\0';
401 if (fread (mvar
, (size_t) size
, (size_t) nmemb
, file
) != nmemb
)
404 error (_("Unable to read in 0x%llx bytes of %s\n"),
405 (unsigned long long) amt
, reason
);
414 /* Print a VMA value. */
417 print_vma (bfd_vma vma
, print_mode mode
)
430 return nc
+ printf ("%8.8" BFD_VMA_FMT
"x", vma
);
437 return printf ("%5" BFD_VMA_FMT
"d", vma
);
445 return nc
+ printf ("%" BFD_VMA_FMT
"x", vma
);
448 return printf ("%" BFD_VMA_FMT
"d", vma
);
451 return printf ("%" BFD_VMA_FMT
"u", vma
);
456 /* Display a symbol on stdout. Handles the display of control characters and
457 multibye characters (assuming the host environment supports them).
459 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
461 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
462 padding as necessary.
464 Returns the number of emitted characters. */
467 print_symbol (int width
, const char *symbol
)
469 bfd_boolean extra_padding
= FALSE
;
471 #ifdef HAVE_MBSTATE_T
478 /* Keep the width positive. This also helps. */
480 extra_padding
= TRUE
;
485 /* Set the remaining width to a very large value.
486 This simplifies the code below. */
487 width_remaining
= INT_MAX
;
489 width_remaining
= width
;
491 #ifdef HAVE_MBSTATE_T
492 /* Initialise the multibyte conversion state. */
493 memset (& state
, 0, sizeof (state
));
496 while (width_remaining
)
499 const char c
= *symbol
++;
504 /* Do not print control characters directly as they can affect terminal
505 settings. Such characters usually appear in the names generated
506 by the assembler for local labels. */
509 if (width_remaining
< 2)
512 printf ("^%c", c
+ 0x40);
513 width_remaining
-= 2;
516 else if (ISPRINT (c
))
524 #ifdef HAVE_MBSTATE_T
527 /* Let printf do the hard work of displaying multibyte characters. */
528 printf ("%.1s", symbol
- 1);
532 #ifdef HAVE_MBSTATE_T
533 /* Try to find out how many bytes made up the character that was
534 just printed. Advance the symbol pointer past the bytes that
536 n
= mbrtowc (& w
, symbol
- 1, MB_CUR_MAX
, & state
);
540 if (n
!= (size_t) -1 && n
!= (size_t) -2 && n
> 0)
545 if (extra_padding
&& num_printed
< width
)
547 /* Fill in the remaining spaces. */
548 printf ("%-*s", width
- num_printed
, " ");
555 /* Returns a pointer to a static buffer containing a printable version of
556 the given section's name. Like print_symbol, except that it does not try
557 to print multibyte characters, it just interprets them as hex values. */
560 printable_section_name (const Elf_Internal_Shdr
* sec
)
562 #define MAX_PRINT_SEC_NAME_LEN 128
563 static char sec_name_buf
[MAX_PRINT_SEC_NAME_LEN
+ 1];
564 const char * name
= SECTION_NAME (sec
);
565 char * buf
= sec_name_buf
;
567 unsigned int remaining
= MAX_PRINT_SEC_NAME_LEN
;
569 while ((c
= * name
++) != 0)
580 else if (ISPRINT (c
))
587 static char hex
[17] = "0123456789ABCDEF";
592 * buf
++ = hex
[(c
& 0xf0) >> 4];
593 * buf
++ = hex
[c
& 0x0f];
607 printable_section_name_from_index (unsigned long ndx
)
609 if (ndx
>= elf_header
.e_shnum
)
610 return _("<corrupt>");
612 return printable_section_name (section_headers
+ ndx
);
615 /* Return a pointer to section NAME, or NULL if no such section exists. */
617 static Elf_Internal_Shdr
*
618 find_section (const char * name
)
622 for (i
= 0; i
< elf_header
.e_shnum
; i
++)
623 if (streq (SECTION_NAME (section_headers
+ i
), name
))
624 return section_headers
+ i
;
629 /* Return a pointer to a section containing ADDR, or NULL if no such
632 static Elf_Internal_Shdr
*
633 find_section_by_address (bfd_vma addr
)
637 for (i
= 0; i
< elf_header
.e_shnum
; i
++)
639 Elf_Internal_Shdr
*sec
= section_headers
+ i
;
640 if (addr
>= sec
->sh_addr
&& addr
< sec
->sh_addr
+ sec
->sh_size
)
647 static Elf_Internal_Shdr
*
648 find_section_by_type (unsigned int type
)
652 for (i
= 0; i
< elf_header
.e_shnum
; i
++)
654 Elf_Internal_Shdr
*sec
= section_headers
+ i
;
655 if (sec
->sh_type
== type
)
662 /* Return a pointer to section NAME, or NULL if no such section exists,
663 restricted to the list of sections given in SET. */
665 static Elf_Internal_Shdr
*
666 find_section_in_set (const char * name
, unsigned int * set
)
672 while ((i
= *set
++) > 0)
673 if (streq (SECTION_NAME (section_headers
+ i
), name
))
674 return section_headers
+ i
;
677 return find_section (name
);
680 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
683 static inline unsigned long
684 read_uleb128 (unsigned char *data
,
685 unsigned int *length_return
,
686 const unsigned char * const end
)
688 return read_leb128 (data
, length_return
, FALSE
, end
);
691 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
692 This OS has so many departures from the ELF standard that we test it at
698 return elf_header
.e_machine
== EM_IA_64
699 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_OPENVMS
;
702 /* Guess the relocation size commonly used by the specific machines. */
705 guess_is_rela (unsigned int e_machine
)
709 /* Targets that use REL relocations. */
724 /* Targets that use RELA relocations. */
728 case EM_ADAPTEVA_EPIPHANY
:
730 case EM_ALTERA_NIOS2
:
733 case EM_ARC_COMPACT2
:
753 case EM_LATTICEMICO32
:
762 case EM_CYGNUS_MN10200
:
764 case EM_CYGNUS_MN10300
:
798 case EM_MICROBLAZE_OLD
:
819 warn (_("Don't know about relocations on this machine architecture\n"));
825 slurp_rela_relocs (FILE * file
,
826 unsigned long rel_offset
,
827 unsigned long rel_size
,
828 Elf_Internal_Rela
** relasp
,
829 unsigned long * nrelasp
)
831 Elf_Internal_Rela
* relas
;
837 Elf32_External_Rela
* erelas
;
839 erelas
= (Elf32_External_Rela
*) get_data (NULL
, file
, rel_offset
, 1,
840 rel_size
, _("32-bit relocation data"));
844 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
846 relas
= (Elf_Internal_Rela
*) cmalloc (nrelas
,
847 sizeof (Elf_Internal_Rela
));
852 error (_("out of memory parsing relocs\n"));
856 for (i
= 0; i
< nrelas
; i
++)
858 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
859 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
860 relas
[i
].r_addend
= BYTE_GET_SIGNED (erelas
[i
].r_addend
);
867 Elf64_External_Rela
* erelas
;
869 erelas
= (Elf64_External_Rela
*) get_data (NULL
, file
, rel_offset
, 1,
870 rel_size
, _("64-bit relocation data"));
874 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
876 relas
= (Elf_Internal_Rela
*) cmalloc (nrelas
,
877 sizeof (Elf_Internal_Rela
));
882 error (_("out of memory parsing relocs\n"));
886 for (i
= 0; i
< nrelas
; i
++)
888 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
889 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
890 relas
[i
].r_addend
= BYTE_GET_SIGNED (erelas
[i
].r_addend
);
892 /* The #ifdef BFD64 below is to prevent a compile time
893 warning. We know that if we do not have a 64 bit data
894 type that we will never execute this code anyway. */
896 if (elf_header
.e_machine
== EM_MIPS
897 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
899 /* In little-endian objects, r_info isn't really a
900 64-bit little-endian value: it has a 32-bit
901 little-endian symbol index followed by four
902 individual byte fields. Reorder INFO
904 bfd_vma inf
= relas
[i
].r_info
;
905 inf
= (((inf
& 0xffffffff) << 32)
906 | ((inf
>> 56) & 0xff)
907 | ((inf
>> 40) & 0xff00)
908 | ((inf
>> 24) & 0xff0000)
909 | ((inf
>> 8) & 0xff000000));
910 relas
[i
].r_info
= inf
;
923 slurp_rel_relocs (FILE * file
,
924 unsigned long rel_offset
,
925 unsigned long rel_size
,
926 Elf_Internal_Rela
** relsp
,
927 unsigned long * nrelsp
)
929 Elf_Internal_Rela
* rels
;
935 Elf32_External_Rel
* erels
;
937 erels
= (Elf32_External_Rel
*) get_data (NULL
, file
, rel_offset
, 1,
938 rel_size
, _("32-bit relocation data"));
942 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
944 rels
= (Elf_Internal_Rela
*) cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
949 error (_("out of memory parsing relocs\n"));
953 for (i
= 0; i
< nrels
; i
++)
955 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
956 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
957 rels
[i
].r_addend
= 0;
964 Elf64_External_Rel
* erels
;
966 erels
= (Elf64_External_Rel
*) get_data (NULL
, file
, rel_offset
, 1,
967 rel_size
, _("64-bit relocation data"));
971 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
973 rels
= (Elf_Internal_Rela
*) cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
978 error (_("out of memory parsing relocs\n"));
982 for (i
= 0; i
< nrels
; i
++)
984 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
985 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
986 rels
[i
].r_addend
= 0;
988 /* The #ifdef BFD64 below is to prevent a compile time
989 warning. We know that if we do not have a 64 bit data
990 type that we will never execute this code anyway. */
992 if (elf_header
.e_machine
== EM_MIPS
993 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
995 /* In little-endian objects, r_info isn't really a
996 64-bit little-endian value: it has a 32-bit
997 little-endian symbol index followed by four
998 individual byte fields. Reorder INFO
1000 bfd_vma inf
= rels
[i
].r_info
;
1001 inf
= (((inf
& 0xffffffff) << 32)
1002 | ((inf
>> 56) & 0xff)
1003 | ((inf
>> 40) & 0xff00)
1004 | ((inf
>> 24) & 0xff0000)
1005 | ((inf
>> 8) & 0xff000000));
1006 rels
[i
].r_info
= inf
;
1018 /* Returns the reloc type extracted from the reloc info field. */
1021 get_reloc_type (bfd_vma reloc_info
)
1024 return ELF32_R_TYPE (reloc_info
);
1026 switch (elf_header
.e_machine
)
1029 /* Note: We assume that reloc_info has already been adjusted for us. */
1030 return ELF64_MIPS_R_TYPE (reloc_info
);
1033 return ELF64_R_TYPE_ID (reloc_info
);
1036 return ELF64_R_TYPE (reloc_info
);
1040 /* Return the symbol index extracted from the reloc info field. */
1043 get_reloc_symindex (bfd_vma reloc_info
)
1045 return is_32bit_elf
? ELF32_R_SYM (reloc_info
) : ELF64_R_SYM (reloc_info
);
1048 static inline bfd_boolean
1049 uses_msp430x_relocs (void)
1052 elf_header
.e_machine
== EM_MSP430
/* Paranoia. */
1053 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1054 && (((elf_header
.e_flags
& EF_MSP430_MACH
) == E_MSP430_MACH_MSP430X
)
1055 /* TI compiler uses ELFOSABI_NONE. */
1056 || (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_NONE
));
1059 /* Display the contents of the relocation data found at the specified
1063 dump_relocations (FILE * file
,
1064 unsigned long rel_offset
,
1065 unsigned long rel_size
,
1066 Elf_Internal_Sym
* symtab
,
1067 unsigned long nsyms
,
1069 unsigned long strtablen
,
1074 Elf_Internal_Rela
* rels
;
1076 if (is_rela
== UNKNOWN
)
1077 is_rela
= guess_is_rela (elf_header
.e_machine
);
1081 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
1086 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
1095 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1097 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1102 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1104 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1112 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
1114 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1119 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1121 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1125 for (i
= 0; i
< rel_size
; i
++)
1130 bfd_vma symtab_index
;
1133 offset
= rels
[i
].r_offset
;
1134 inf
= rels
[i
].r_info
;
1136 type
= get_reloc_type (inf
);
1137 symtab_index
= get_reloc_symindex (inf
);
1141 printf ("%8.8lx %8.8lx ",
1142 (unsigned long) offset
& 0xffffffff,
1143 (unsigned long) inf
& 0xffffffff);
1147 #if BFD_HOST_64BIT_LONG
1149 ? "%16.16lx %16.16lx "
1150 : "%12.12lx %12.12lx ",
1152 #elif BFD_HOST_64BIT_LONG_LONG
1155 ? "%16.16llx %16.16llx "
1156 : "%12.12llx %12.12llx ",
1160 ? "%16.16I64x %16.16I64x "
1161 : "%12.12I64x %12.12I64x ",
1166 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1167 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1168 _bfd_int64_high (offset
),
1169 _bfd_int64_low (offset
),
1170 _bfd_int64_high (inf
),
1171 _bfd_int64_low (inf
));
1175 switch (elf_header
.e_machine
)
1182 rtype
= elf_aarch64_reloc_type (type
);
1186 case EM_CYGNUS_M32R
:
1187 rtype
= elf_m32r_reloc_type (type
);
1192 rtype
= elf_i386_reloc_type (type
);
1197 rtype
= elf_m68hc11_reloc_type (type
);
1201 rtype
= elf_m68k_reloc_type (type
);
1205 rtype
= elf_i960_reloc_type (type
);
1210 rtype
= elf_avr_reloc_type (type
);
1213 case EM_OLD_SPARCV9
:
1214 case EM_SPARC32PLUS
:
1217 rtype
= elf_sparc_reloc_type (type
);
1221 rtype
= elf_spu_reloc_type (type
);
1225 rtype
= v800_reloc_type (type
);
1228 case EM_CYGNUS_V850
:
1229 rtype
= v850_reloc_type (type
);
1233 case EM_CYGNUS_D10V
:
1234 rtype
= elf_d10v_reloc_type (type
);
1238 case EM_CYGNUS_D30V
:
1239 rtype
= elf_d30v_reloc_type (type
);
1243 rtype
= elf_dlx_reloc_type (type
);
1247 rtype
= elf_sh_reloc_type (type
);
1251 case EM_CYGNUS_MN10300
:
1252 rtype
= elf_mn10300_reloc_type (type
);
1256 case EM_CYGNUS_MN10200
:
1257 rtype
= elf_mn10200_reloc_type (type
);
1261 case EM_CYGNUS_FR30
:
1262 rtype
= elf_fr30_reloc_type (type
);
1266 rtype
= elf_frv_reloc_type (type
);
1270 rtype
= elf_ft32_reloc_type (type
);
1274 rtype
= elf_mcore_reloc_type (type
);
1278 rtype
= elf_mmix_reloc_type (type
);
1282 rtype
= elf_moxie_reloc_type (type
);
1286 if (uses_msp430x_relocs ())
1288 rtype
= elf_msp430x_reloc_type (type
);
1292 rtype
= elf_msp430_reloc_type (type
);
1296 rtype
= elf_nds32_reloc_type (type
);
1300 rtype
= elf_ppc_reloc_type (type
);
1304 rtype
= elf_ppc64_reloc_type (type
);
1308 case EM_MIPS_RS3_LE
:
1309 rtype
= elf_mips_reloc_type (type
);
1313 rtype
= elf_alpha_reloc_type (type
);
1317 rtype
= elf_arm_reloc_type (type
);
1321 case EM_ARC_COMPACT
:
1322 case EM_ARC_COMPACT2
:
1323 rtype
= elf_arc_reloc_type (type
);
1327 rtype
= elf_hppa_reloc_type (type
);
1333 rtype
= elf_h8_reloc_type (type
);
1337 rtype
= elf_or1k_reloc_type (type
);
1342 rtype
= elf_pj_reloc_type (type
);
1345 rtype
= elf_ia64_reloc_type (type
);
1349 rtype
= elf_cris_reloc_type (type
);
1353 rtype
= elf_i860_reloc_type (type
);
1359 rtype
= elf_x86_64_reloc_type (type
);
1363 rtype
= i370_reloc_type (type
);
1368 rtype
= elf_s390_reloc_type (type
);
1372 rtype
= elf_score_reloc_type (type
);
1376 rtype
= elf_xstormy16_reloc_type (type
);
1380 rtype
= elf_crx_reloc_type (type
);
1384 rtype
= elf_vax_reloc_type (type
);
1388 rtype
= elf_visium_reloc_type (type
);
1391 case EM_ADAPTEVA_EPIPHANY
:
1392 rtype
= elf_epiphany_reloc_type (type
);
1397 rtype
= elf_ip2k_reloc_type (type
);
1401 rtype
= elf_iq2000_reloc_type (type
);
1406 rtype
= elf_xtensa_reloc_type (type
);
1409 case EM_LATTICEMICO32
:
1410 rtype
= elf_lm32_reloc_type (type
);
1415 rtype
= elf_m32c_reloc_type (type
);
1419 rtype
= elf_mt_reloc_type (type
);
1423 rtype
= elf_bfin_reloc_type (type
);
1427 rtype
= elf_mep_reloc_type (type
);
1431 rtype
= elf_cr16_reloc_type (type
);
1435 case EM_MICROBLAZE_OLD
:
1436 rtype
= elf_microblaze_reloc_type (type
);
1440 rtype
= elf_rl78_reloc_type (type
);
1444 rtype
= elf_rx_reloc_type (type
);
1448 rtype
= elf_metag_reloc_type (type
);
1453 rtype
= elf_xc16x_reloc_type (type
);
1457 rtype
= elf_tic6x_reloc_type (type
);
1461 rtype
= elf_tilegx_reloc_type (type
);
1465 rtype
= elf_tilepro_reloc_type (type
);
1469 rtype
= elf_xgate_reloc_type (type
);
1472 case EM_ALTERA_NIOS2
:
1473 rtype
= elf_nios2_reloc_type (type
);
1478 printf (_("unrecognized: %-7lx"), (unsigned long) type
& 0xffffffff);
1480 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1482 if (elf_header
.e_machine
== EM_ALPHA
1484 && streq (rtype
, "R_ALPHA_LITUSE")
1487 switch (rels
[i
].r_addend
)
1489 case LITUSE_ALPHA_ADDR
: rtype
= "ADDR"; break;
1490 case LITUSE_ALPHA_BASE
: rtype
= "BASE"; break;
1491 case LITUSE_ALPHA_BYTOFF
: rtype
= "BYTOFF"; break;
1492 case LITUSE_ALPHA_JSR
: rtype
= "JSR"; break;
1493 case LITUSE_ALPHA_TLSGD
: rtype
= "TLSGD"; break;
1494 case LITUSE_ALPHA_TLSLDM
: rtype
= "TLSLDM"; break;
1495 case LITUSE_ALPHA_JSRDIRECT
: rtype
= "JSRDIRECT"; break;
1496 default: rtype
= NULL
;
1499 printf (" (%s)", rtype
);
1503 printf (_("<unknown addend: %lx>"),
1504 (unsigned long) rels
[i
].r_addend
);
1507 else if (symtab_index
)
1509 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1510 printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index
);
1513 Elf_Internal_Sym
* psym
;
1514 const char * version_string
;
1515 enum versioned_symbol_info sym_info
;
1516 unsigned short vna_other
;
1518 psym
= symtab
+ symtab_index
;
1521 = get_symbol_version_string (file
, is_dynsym
,
1530 if (ELF_ST_TYPE (psym
->st_info
) == STT_GNU_IFUNC
)
1534 unsigned int width
= is_32bit_elf
? 8 : 14;
1536 /* Relocations against GNU_IFUNC symbols do not use the value
1537 of the symbol as the address to relocate against. Instead
1538 they invoke the function named by the symbol and use its
1539 result as the address for relocation.
1541 To indicate this to the user, do not display the value of
1542 the symbol in the "Symbols's Value" field. Instead show
1543 its name followed by () as a hint that the symbol is
1547 || psym
->st_name
== 0
1548 || psym
->st_name
>= strtablen
)
1551 name
= strtab
+ psym
->st_name
;
1553 len
= print_symbol (width
, name
);
1555 printf (sym_info
== symbol_public
? "@@%s" : "@%s",
1557 printf ("()%-*s", len
<= width
? (width
+ 1) - len
: 1, " ");
1561 print_vma (psym
->st_value
, LONG_HEX
);
1563 printf (is_32bit_elf
? " " : " ");
1566 if (psym
->st_name
== 0)
1568 const char * sec_name
= "<null>";
1571 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1573 if (psym
->st_shndx
< elf_header
.e_shnum
)
1574 sec_name
= SECTION_NAME (section_headers
+ psym
->st_shndx
);
1575 else if (psym
->st_shndx
== SHN_ABS
)
1577 else if (psym
->st_shndx
== SHN_COMMON
)
1578 sec_name
= "COMMON";
1579 else if ((elf_header
.e_machine
== EM_MIPS
1580 && psym
->st_shndx
== SHN_MIPS_SCOMMON
)
1581 || (elf_header
.e_machine
== EM_TI_C6000
1582 && psym
->st_shndx
== SHN_TIC6X_SCOMMON
))
1583 sec_name
= "SCOMMON";
1584 else if (elf_header
.e_machine
== EM_MIPS
1585 && psym
->st_shndx
== SHN_MIPS_SUNDEFINED
)
1586 sec_name
= "SUNDEF";
1587 else if ((elf_header
.e_machine
== EM_X86_64
1588 || elf_header
.e_machine
== EM_L1OM
1589 || elf_header
.e_machine
== EM_K1OM
)
1590 && psym
->st_shndx
== SHN_X86_64_LCOMMON
)
1591 sec_name
= "LARGE_COMMON";
1592 else if (elf_header
.e_machine
== EM_IA_64
1593 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1594 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1595 sec_name
= "ANSI_COM";
1596 else if (is_ia64_vms ()
1597 && psym
->st_shndx
== SHN_IA_64_VMS_SYMVEC
)
1598 sec_name
= "VMS_SYMVEC";
1601 sprintf (name_buf
, "<section 0x%x>",
1602 (unsigned int) psym
->st_shndx
);
1603 sec_name
= name_buf
;
1606 print_symbol (22, sec_name
);
1608 else if (strtab
== NULL
)
1609 printf (_("<string table index: %3ld>"), psym
->st_name
);
1610 else if (psym
->st_name
>= strtablen
)
1611 printf (_("<corrupt string table index: %3ld>"), psym
->st_name
);
1614 print_symbol (22, strtab
+ psym
->st_name
);
1616 printf (sym_info
== symbol_public
? "@@%s" : "@%s",
1622 bfd_vma off
= rels
[i
].r_addend
;
1624 if ((bfd_signed_vma
) off
< 0)
1625 printf (" - %" BFD_VMA_FMT
"x", - off
);
1627 printf (" + %" BFD_VMA_FMT
"x", off
);
1633 bfd_vma off
= rels
[i
].r_addend
;
1635 printf ("%*c", is_32bit_elf
? 12 : 20, ' ');
1636 if ((bfd_signed_vma
) off
< 0)
1637 printf ("-%" BFD_VMA_FMT
"x", - off
);
1639 printf ("%" BFD_VMA_FMT
"x", off
);
1642 if (elf_header
.e_machine
== EM_SPARCV9
1644 && streq (rtype
, "R_SPARC_OLO10"))
1645 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf
));
1650 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1652 bfd_vma type2
= ELF64_MIPS_R_TYPE2 (inf
);
1653 bfd_vma type3
= ELF64_MIPS_R_TYPE3 (inf
);
1654 const char * rtype2
= elf_mips_reloc_type (type2
);
1655 const char * rtype3
= elf_mips_reloc_type (type3
);
1657 printf (" Type2: ");
1660 printf (_("unrecognized: %-7lx"),
1661 (unsigned long) type2
& 0xffffffff);
1663 printf ("%-17.17s", rtype2
);
1665 printf ("\n Type3: ");
1668 printf (_("unrecognized: %-7lx"),
1669 (unsigned long) type3
& 0xffffffff);
1671 printf ("%-17.17s", rtype3
);
1682 get_mips_dynamic_type (unsigned long type
)
1686 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1687 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1688 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1689 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1690 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1691 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1692 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1693 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1694 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1695 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1696 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1697 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1698 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1699 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1700 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1701 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1702 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1703 case DT_MIPS_RLD_MAP_REL
: return "MIPS_RLD_MAP_REL";
1704 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1705 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1706 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1707 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1708 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1709 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1710 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1711 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1712 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1713 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1714 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1715 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1716 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1717 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1718 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1719 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1720 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1721 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1722 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1723 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1724 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1725 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1726 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1727 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1728 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1729 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1730 case DT_MIPS_PLTGOT
: return "MIPS_PLTGOT";
1731 case DT_MIPS_RWPLT
: return "MIPS_RWPLT";
1738 get_sparc64_dynamic_type (unsigned long type
)
1742 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1749 get_ppc_dynamic_type (unsigned long type
)
1753 case DT_PPC_GOT
: return "PPC_GOT";
1754 case DT_PPC_OPT
: return "PPC_OPT";
1761 get_ppc64_dynamic_type (unsigned long type
)
1765 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1766 case DT_PPC64_OPD
: return "PPC64_OPD";
1767 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1768 case DT_PPC64_OPT
: return "PPC64_OPT";
1775 get_parisc_dynamic_type (unsigned long type
)
1779 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1780 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1781 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1782 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1783 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1784 case DT_HP_PREINIT
: return "HP_PREINIT";
1785 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1786 case DT_HP_NEEDED
: return "HP_NEEDED";
1787 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1788 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1789 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1790 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1791 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1792 case DT_HP_EPLTREL
: return "HP_GST_EPLTREL";
1793 case DT_HP_EPLTRELSZ
: return "HP_GST_EPLTRELSZ";
1794 case DT_HP_FILTERED
: return "HP_FILTERED";
1795 case DT_HP_FILTER_TLS
: return "HP_FILTER_TLS";
1796 case DT_HP_COMPAT_FILTERED
: return "HP_COMPAT_FILTERED";
1797 case DT_HP_LAZYLOAD
: return "HP_LAZYLOAD";
1798 case DT_HP_BIND_NOW_COUNT
: return "HP_BIND_NOW_COUNT";
1799 case DT_PLT
: return "PLT";
1800 case DT_PLT_SIZE
: return "PLT_SIZE";
1801 case DT_DLT
: return "DLT";
1802 case DT_DLT_SIZE
: return "DLT_SIZE";
1809 get_ia64_dynamic_type (unsigned long type
)
1813 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1814 case DT_IA_64_VMS_SUBTYPE
: return "VMS_SUBTYPE";
1815 case DT_IA_64_VMS_IMGIOCNT
: return "VMS_IMGIOCNT";
1816 case DT_IA_64_VMS_LNKFLAGS
: return "VMS_LNKFLAGS";
1817 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ
: return "VMS_VIR_MEM_BLK_SIZ";
1818 case DT_IA_64_VMS_IDENT
: return "VMS_IDENT";
1819 case DT_IA_64_VMS_NEEDED_IDENT
: return "VMS_NEEDED_IDENT";
1820 case DT_IA_64_VMS_IMG_RELA_CNT
: return "VMS_IMG_RELA_CNT";
1821 case DT_IA_64_VMS_SEG_RELA_CNT
: return "VMS_SEG_RELA_CNT";
1822 case DT_IA_64_VMS_FIXUP_RELA_CNT
: return "VMS_FIXUP_RELA_CNT";
1823 case DT_IA_64_VMS_FIXUP_NEEDED
: return "VMS_FIXUP_NEEDED";
1824 case DT_IA_64_VMS_SYMVEC_CNT
: return "VMS_SYMVEC_CNT";
1825 case DT_IA_64_VMS_XLATED
: return "VMS_XLATED";
1826 case DT_IA_64_VMS_STACKSIZE
: return "VMS_STACKSIZE";
1827 case DT_IA_64_VMS_UNWINDSZ
: return "VMS_UNWINDSZ";
1828 case DT_IA_64_VMS_UNWIND_CODSEG
: return "VMS_UNWIND_CODSEG";
1829 case DT_IA_64_VMS_UNWIND_INFOSEG
: return "VMS_UNWIND_INFOSEG";
1830 case DT_IA_64_VMS_LINKTIME
: return "VMS_LINKTIME";
1831 case DT_IA_64_VMS_SEG_NO
: return "VMS_SEG_NO";
1832 case DT_IA_64_VMS_SYMVEC_OFFSET
: return "VMS_SYMVEC_OFFSET";
1833 case DT_IA_64_VMS_SYMVEC_SEG
: return "VMS_SYMVEC_SEG";
1834 case DT_IA_64_VMS_UNWIND_OFFSET
: return "VMS_UNWIND_OFFSET";
1835 case DT_IA_64_VMS_UNWIND_SEG
: return "VMS_UNWIND_SEG";
1836 case DT_IA_64_VMS_STRTAB_OFFSET
: return "VMS_STRTAB_OFFSET";
1837 case DT_IA_64_VMS_SYSVER_OFFSET
: return "VMS_SYSVER_OFFSET";
1838 case DT_IA_64_VMS_IMG_RELA_OFF
: return "VMS_IMG_RELA_OFF";
1839 case DT_IA_64_VMS_SEG_RELA_OFF
: return "VMS_SEG_RELA_OFF";
1840 case DT_IA_64_VMS_FIXUP_RELA_OFF
: return "VMS_FIXUP_RELA_OFF";
1841 case DT_IA_64_VMS_PLTGOT_OFFSET
: return "VMS_PLTGOT_OFFSET";
1842 case DT_IA_64_VMS_PLTGOT_SEG
: return "VMS_PLTGOT_SEG";
1843 case DT_IA_64_VMS_FPMODE
: return "VMS_FPMODE";
1850 get_alpha_dynamic_type (unsigned long type
)
1854 case DT_ALPHA_PLTRO
: return "ALPHA_PLTRO";
1861 get_score_dynamic_type (unsigned long type
)
1865 case DT_SCORE_BASE_ADDRESS
: return "SCORE_BASE_ADDRESS";
1866 case DT_SCORE_LOCAL_GOTNO
: return "SCORE_LOCAL_GOTNO";
1867 case DT_SCORE_SYMTABNO
: return "SCORE_SYMTABNO";
1868 case DT_SCORE_GOTSYM
: return "SCORE_GOTSYM";
1869 case DT_SCORE_UNREFEXTNO
: return "SCORE_UNREFEXTNO";
1870 case DT_SCORE_HIPAGENO
: return "SCORE_HIPAGENO";
1877 get_tic6x_dynamic_type (unsigned long type
)
1881 case DT_C6000_GSYM_OFFSET
: return "C6000_GSYM_OFFSET";
1882 case DT_C6000_GSTR_OFFSET
: return "C6000_GSTR_OFFSET";
1883 case DT_C6000_DSBT_BASE
: return "C6000_DSBT_BASE";
1884 case DT_C6000_DSBT_SIZE
: return "C6000_DSBT_SIZE";
1885 case DT_C6000_PREEMPTMAP
: return "C6000_PREEMPTMAP";
1886 case DT_C6000_DSBT_INDEX
: return "C6000_DSBT_INDEX";
1893 get_nios2_dynamic_type (unsigned long type
)
1897 case DT_NIOS2_GP
: return "NIOS2_GP";
1904 get_dynamic_type (unsigned long type
)
1906 static char buff
[64];
1910 case DT_NULL
: return "NULL";
1911 case DT_NEEDED
: return "NEEDED";
1912 case DT_PLTRELSZ
: return "PLTRELSZ";
1913 case DT_PLTGOT
: return "PLTGOT";
1914 case DT_HASH
: return "HASH";
1915 case DT_STRTAB
: return "STRTAB";
1916 case DT_SYMTAB
: return "SYMTAB";
1917 case DT_RELA
: return "RELA";
1918 case DT_RELASZ
: return "RELASZ";
1919 case DT_RELAENT
: return "RELAENT";
1920 case DT_STRSZ
: return "STRSZ";
1921 case DT_SYMENT
: return "SYMENT";
1922 case DT_INIT
: return "INIT";
1923 case DT_FINI
: return "FINI";
1924 case DT_SONAME
: return "SONAME";
1925 case DT_RPATH
: return "RPATH";
1926 case DT_SYMBOLIC
: return "SYMBOLIC";
1927 case DT_REL
: return "REL";
1928 case DT_RELSZ
: return "RELSZ";
1929 case DT_RELENT
: return "RELENT";
1930 case DT_PLTREL
: return "PLTREL";
1931 case DT_DEBUG
: return "DEBUG";
1932 case DT_TEXTREL
: return "TEXTREL";
1933 case DT_JMPREL
: return "JMPREL";
1934 case DT_BIND_NOW
: return "BIND_NOW";
1935 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1936 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1937 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1938 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1939 case DT_RUNPATH
: return "RUNPATH";
1940 case DT_FLAGS
: return "FLAGS";
1942 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1943 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1945 case DT_CHECKSUM
: return "CHECKSUM";
1946 case DT_PLTPADSZ
: return "PLTPADSZ";
1947 case DT_MOVEENT
: return "MOVEENT";
1948 case DT_MOVESZ
: return "MOVESZ";
1949 case DT_FEATURE
: return "FEATURE";
1950 case DT_POSFLAG_1
: return "POSFLAG_1";
1951 case DT_SYMINSZ
: return "SYMINSZ";
1952 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1954 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1955 case DT_CONFIG
: return "CONFIG";
1956 case DT_DEPAUDIT
: return "DEPAUDIT";
1957 case DT_AUDIT
: return "AUDIT";
1958 case DT_PLTPAD
: return "PLTPAD";
1959 case DT_MOVETAB
: return "MOVETAB";
1960 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1962 case DT_VERSYM
: return "VERSYM";
1964 case DT_TLSDESC_GOT
: return "TLSDESC_GOT";
1965 case DT_TLSDESC_PLT
: return "TLSDESC_PLT";
1966 case DT_RELACOUNT
: return "RELACOUNT";
1967 case DT_RELCOUNT
: return "RELCOUNT";
1968 case DT_FLAGS_1
: return "FLAGS_1";
1969 case DT_VERDEF
: return "VERDEF";
1970 case DT_VERDEFNUM
: return "VERDEFNUM";
1971 case DT_VERNEED
: return "VERNEED";
1972 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1974 case DT_AUXILIARY
: return "AUXILIARY";
1975 case DT_USED
: return "USED";
1976 case DT_FILTER
: return "FILTER";
1978 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1979 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1980 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1981 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1982 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1983 case DT_GNU_HASH
: return "GNU_HASH";
1986 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1988 const char * result
;
1990 switch (elf_header
.e_machine
)
1993 case EM_MIPS_RS3_LE
:
1994 result
= get_mips_dynamic_type (type
);
1997 result
= get_sparc64_dynamic_type (type
);
2000 result
= get_ppc_dynamic_type (type
);
2003 result
= get_ppc64_dynamic_type (type
);
2006 result
= get_ia64_dynamic_type (type
);
2009 result
= get_alpha_dynamic_type (type
);
2012 result
= get_score_dynamic_type (type
);
2015 result
= get_tic6x_dynamic_type (type
);
2017 case EM_ALTERA_NIOS2
:
2018 result
= get_nios2_dynamic_type (type
);
2028 snprintf (buff
, sizeof (buff
), _("Processor Specific: %lx"), type
);
2030 else if (((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
2031 || (elf_header
.e_machine
== EM_PARISC
2032 && (type
>= OLD_DT_LOOS
) && (type
<= OLD_DT_HIOS
)))
2034 const char * result
;
2036 switch (elf_header
.e_machine
)
2039 result
= get_parisc_dynamic_type (type
);
2042 result
= get_ia64_dynamic_type (type
);
2052 snprintf (buff
, sizeof (buff
), _("Operating System specific: %lx"),
2056 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), type
);
2063 get_file_type (unsigned e_type
)
2065 static char buff
[32];
2069 case ET_NONE
: return _("NONE (None)");
2070 case ET_REL
: return _("REL (Relocatable file)");
2071 case ET_EXEC
: return _("EXEC (Executable file)");
2072 case ET_DYN
: return _("DYN (Shared object file)");
2073 case ET_CORE
: return _("CORE (Core file)");
2076 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
2077 snprintf (buff
, sizeof (buff
), _("Processor Specific: (%x)"), e_type
);
2078 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
2079 snprintf (buff
, sizeof (buff
), _("OS Specific: (%x)"), e_type
);
2081 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_type
);
2087 get_machine_name (unsigned e_machine
)
2089 static char buff
[64]; /* XXX */
2093 case EM_NONE
: return _("None");
2094 case EM_AARCH64
: return "AArch64";
2095 case EM_M32
: return "WE32100";
2096 case EM_SPARC
: return "Sparc";
2097 case EM_SPU
: return "SPU";
2098 case EM_386
: return "Intel 80386";
2099 case EM_68K
: return "MC68000";
2100 case EM_88K
: return "MC88000";
2101 case EM_IAMCU
: return "Intel MCU";
2102 case EM_860
: return "Intel 80860";
2103 case EM_MIPS
: return "MIPS R3000";
2104 case EM_S370
: return "IBM System/370";
2105 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
2106 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
2107 case EM_PARISC
: return "HPPA";
2108 case EM_PPC_OLD
: return "Power PC (old)";
2109 case EM_SPARC32PLUS
: return "Sparc v8+" ;
2110 case EM_960
: return "Intel 90860";
2111 case EM_PPC
: return "PowerPC";
2112 case EM_PPC64
: return "PowerPC64";
2113 case EM_FR20
: return "Fujitsu FR20";
2114 case EM_FT32
: return "FTDI FT32";
2115 case EM_RH32
: return "TRW RH32";
2116 case EM_MCORE
: return "MCORE";
2117 case EM_ARM
: return "ARM";
2118 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
2119 case EM_SH
: return "Renesas / SuperH SH";
2120 case EM_SPARCV9
: return "Sparc v9";
2121 case EM_TRICORE
: return "Siemens Tricore";
2122 case EM_ARC
: return "ARC";
2123 case EM_ARC_COMPACT
: return "ARCompact";
2124 case EM_ARC_COMPACT2
: return "ARCv2";
2125 case EM_H8_300
: return "Renesas H8/300";
2126 case EM_H8_300H
: return "Renesas H8/300H";
2127 case EM_H8S
: return "Renesas H8S";
2128 case EM_H8_500
: return "Renesas H8/500";
2129 case EM_IA_64
: return "Intel IA-64";
2130 case EM_MIPS_X
: return "Stanford MIPS-X";
2131 case EM_COLDFIRE
: return "Motorola Coldfire";
2132 case EM_ALPHA
: return "Alpha";
2133 case EM_CYGNUS_D10V
:
2134 case EM_D10V
: return "d10v";
2135 case EM_CYGNUS_D30V
:
2136 case EM_D30V
: return "d30v";
2137 case EM_CYGNUS_M32R
:
2138 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
2139 case EM_CYGNUS_V850
:
2140 case EM_V800
: return "Renesas V850 (using RH850 ABI)";
2141 case EM_V850
: return "Renesas V850";
2142 case EM_CYGNUS_MN10300
:
2143 case EM_MN10300
: return "mn10300";
2144 case EM_CYGNUS_MN10200
:
2145 case EM_MN10200
: return "mn10200";
2146 case EM_MOXIE
: return "Moxie";
2147 case EM_CYGNUS_FR30
:
2148 case EM_FR30
: return "Fujitsu FR30";
2149 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
2151 case EM_PJ
: return "picoJava";
2152 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
2153 case EM_PCP
: return "Siemens PCP";
2154 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
2155 case EM_NDR1
: return "Denso NDR1 microprocesspr";
2156 case EM_STARCORE
: return "Motorola Star*Core processor";
2157 case EM_ME16
: return "Toyota ME16 processor";
2158 case EM_ST100
: return "STMicroelectronics ST100 processor";
2159 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
2160 case EM_PDSP
: return "Sony DSP processor";
2161 case EM_PDP10
: return "Digital Equipment Corp. PDP-10";
2162 case EM_PDP11
: return "Digital Equipment Corp. PDP-11";
2163 case EM_FX66
: return "Siemens FX66 microcontroller";
2164 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2165 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
2166 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
2167 case EM_68HC12
: return "Motorola MC68HC12 Microcontroller";
2168 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
2169 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
2170 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
2171 case EM_SVX
: return "Silicon Graphics SVx";
2172 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
2173 case EM_VAX
: return "Digital VAX";
2174 case EM_VISIUM
: return "CDS VISIUMcore processor";
2176 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
2177 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
2178 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
2179 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
2180 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
2181 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
2182 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
2183 case EM_PRISM
: return "Vitesse Prism";
2184 case EM_X86_64
: return "Advanced Micro Devices X86-64";
2185 case EM_L1OM
: return "Intel L1OM";
2186 case EM_K1OM
: return "Intel K1OM";
2188 case EM_S390
: return "IBM S/390";
2189 case EM_SCORE
: return "SUNPLUS S+Core";
2190 case EM_XSTORMY16
: return "Sanyo XStormy16 CPU core";
2191 case EM_OR1K
: return "OpenRISC 1000";
2192 case EM_CRX
: return "National Semiconductor CRX microprocessor";
2193 case EM_ADAPTEVA_EPIPHANY
: return "Adapteva EPIPHANY";
2194 case EM_DLX
: return "OpenDLX";
2196 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
2197 case EM_IQ2000
: return "Vitesse IQ2000";
2199 case EM_XTENSA
: return "Tensilica Xtensa Processor";
2200 case EM_VIDEOCORE
: return "Alphamosaic VideoCore processor";
2201 case EM_TMM_GPP
: return "Thompson Multimedia General Purpose Processor";
2202 case EM_NS32K
: return "National Semiconductor 32000 series";
2203 case EM_TPC
: return "Tenor Network TPC processor";
2204 case EM_ST200
: return "STMicroelectronics ST200 microcontroller";
2205 case EM_MAX
: return "MAX Processor";
2206 case EM_CR
: return "National Semiconductor CompactRISC";
2207 case EM_F2MC16
: return "Fujitsu F2MC16";
2208 case EM_MSP430
: return "Texas Instruments msp430 microcontroller";
2209 case EM_LATTICEMICO32
: return "Lattice Mico32";
2211 case EM_M32C
: return "Renesas M32c";
2212 case EM_MT
: return "Morpho Techologies MT processor";
2213 case EM_BLACKFIN
: return "Analog Devices Blackfin";
2214 case EM_SE_C33
: return "S1C33 Family of Seiko Epson processors";
2215 case EM_SEP
: return "Sharp embedded microprocessor";
2216 case EM_ARCA
: return "Arca RISC microprocessor";
2217 case EM_UNICORE
: return "Unicore";
2218 case EM_EXCESS
: return "eXcess 16/32/64-bit configurable embedded CPU";
2219 case EM_DXP
: return "Icera Semiconductor Inc. Deep Execution Processor";
2220 case EM_NIOS32
: return "Altera Nios";
2221 case EM_ALTERA_NIOS2
: return "Altera Nios II";
2223 case EM_XC16X
: return "Infineon Technologies xc16x";
2224 case EM_M16C
: return "Renesas M16C series microprocessors";
2225 case EM_DSPIC30F
: return "Microchip Technology dsPIC30F Digital Signal Controller";
2226 case EM_CE
: return "Freescale Communication Engine RISC core";
2227 case EM_TSK3000
: return "Altium TSK3000 core";
2228 case EM_RS08
: return "Freescale RS08 embedded processor";
2229 case EM_ECOG2
: return "Cyan Technology eCOG2 microprocessor";
2230 case EM_DSP24
: return "New Japan Radio (NJR) 24-bit DSP Processor";
2231 case EM_VIDEOCORE3
: return "Broadcom VideoCore III processor";
2232 case EM_SE_C17
: return "Seiko Epson C17 family";
2233 case EM_TI_C6000
: return "Texas Instruments TMS320C6000 DSP family";
2234 case EM_TI_C2000
: return "Texas Instruments TMS320C2000 DSP family";
2235 case EM_TI_C5500
: return "Texas Instruments TMS320C55x DSP family";
2236 case EM_MMDSP_PLUS
: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2237 case EM_CYPRESS_M8C
: return "Cypress M8C microprocessor";
2238 case EM_R32C
: return "Renesas R32C series microprocessors";
2239 case EM_TRIMEDIA
: return "NXP Semiconductors TriMedia architecture family";
2240 case EM_QDSP6
: return "QUALCOMM DSP6 Processor";
2241 case EM_8051
: return "Intel 8051 and variants";
2242 case EM_STXP7X
: return "STMicroelectronics STxP7x family";
2243 case EM_NDS32
: return "Andes Technology compact code size embedded RISC processor family";
2244 case EM_ECOG1X
: return "Cyan Technology eCOG1X family";
2245 case EM_MAXQ30
: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2246 case EM_XIMO16
: return "New Japan Radio (NJR) 16-bit DSP Processor";
2247 case EM_MANIK
: return "M2000 Reconfigurable RISC Microprocessor";
2248 case EM_CRAYNV2
: return "Cray Inc. NV2 vector architecture";
2249 case EM_CYGNUS_MEP
: return "Toshiba MeP Media Engine";
2252 case EM_MICROBLAZE_OLD
: return "Xilinx MicroBlaze";
2253 case EM_RL78
: return "Renesas RL78";
2254 case EM_RX
: return "Renesas RX";
2255 case EM_METAG
: return "Imagination Technologies Meta processor architecture";
2256 case EM_MCST_ELBRUS
: return "MCST Elbrus general purpose hardware architecture";
2257 case EM_ECOG16
: return "Cyan Technology eCOG16 family";
2258 case EM_ETPU
: return "Freescale Extended Time Processing Unit";
2259 case EM_SLE9X
: return "Infineon Technologies SLE9X core";
2260 case EM_AVR32
: return "Atmel Corporation 32-bit microprocessor family";
2261 case EM_STM8
: return "STMicroeletronics STM8 8-bit microcontroller";
2262 case EM_TILE64
: return "Tilera TILE64 multicore architecture family";
2263 case EM_TILEPRO
: return "Tilera TILEPro multicore architecture family";
2264 case EM_TILEGX
: return "Tilera TILE-Gx multicore architecture family";
2265 case EM_CUDA
: return "NVIDIA CUDA architecture";
2266 case EM_XGATE
: return "Motorola XGATE embedded processor";
2268 snprintf (buff
, sizeof (buff
), _("<unknown>: 0x%x"), e_machine
);
2274 decode_ARC_machine_flags (unsigned e_flags
, unsigned e_machine
, char buf
[])
2276 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2277 other compilers don't a specific architecture type in the e_flags, and
2278 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2279 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2282 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2283 but also sets a specific architecture type in the e_flags field.
2285 However, when decoding the flags we don't worry if we see an
2286 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2287 ARCEM architecture type. */
2289 switch (e_flags
& EF_ARC_MACH_MSK
)
2291 /* We only expect these to occur for EM_ARC_COMPACT2. */
2292 case EF_ARC_CPU_ARCV2EM
:
2293 strcat (buf
, ", ARC EM");
2295 case EF_ARC_CPU_ARCV2HS
:
2296 strcat (buf
, ", ARC HS");
2299 /* We only expect these to occur for EM_ARC_COMPACT. */
2300 case E_ARC_MACH_ARC600
:
2301 strcat (buf
, ", ARC600");
2303 case E_ARC_MACH_ARC601
:
2304 strcat (buf
, ", ARC601");
2306 case E_ARC_MACH_ARC700
:
2307 strcat (buf
, ", ARC700");
2310 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2311 new ELF with new architecture being read by an old version of
2312 readelf, or (c) An ELF built with non-GNU compiler that does not
2313 set the architecture in the e_flags. */
2315 if (e_machine
== EM_ARC_COMPACT
)
2316 strcat (buf
, ", Unknown ARCompact");
2318 strcat (buf
, ", Unknown ARC");
2322 switch (e_flags
& EF_ARC_OSABI_MSK
)
2324 case E_ARC_OSABI_ORIG
:
2325 strcat (buf
, ", (ABI:legacy)");
2327 case E_ARC_OSABI_V2
:
2328 strcat (buf
, ", (ABI:v2)");
2330 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2331 case E_ARC_OSABI_V3
:
2332 strcat (buf
, ", v3 no-legacy-syscalls ABI");
2335 strcat (buf
, ", unrecognised ARC OSABI flag");
2341 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
2346 eabi
= EF_ARM_EABI_VERSION (e_flags
);
2347 e_flags
&= ~ EF_ARM_EABIMASK
;
2349 /* Handle "generic" ARM flags. */
2350 if (e_flags
& EF_ARM_RELEXEC
)
2352 strcat (buf
, ", relocatable executable");
2353 e_flags
&= ~ EF_ARM_RELEXEC
;
2356 /* Now handle EABI specific flags. */
2360 strcat (buf
, ", <unrecognized EABI>");
2365 case EF_ARM_EABI_VER1
:
2366 strcat (buf
, ", Version1 EABI");
2371 /* Process flags one bit at a time. */
2372 flag
= e_flags
& - e_flags
;
2377 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
2378 strcat (buf
, ", sorted symbol tables");
2388 case EF_ARM_EABI_VER2
:
2389 strcat (buf
, ", Version2 EABI");
2394 /* Process flags one bit at a time. */
2395 flag
= e_flags
& - e_flags
;
2400 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
2401 strcat (buf
, ", sorted symbol tables");
2404 case EF_ARM_DYNSYMSUSESEGIDX
:
2405 strcat (buf
, ", dynamic symbols use segment index");
2408 case EF_ARM_MAPSYMSFIRST
:
2409 strcat (buf
, ", mapping symbols precede others");
2419 case EF_ARM_EABI_VER3
:
2420 strcat (buf
, ", Version3 EABI");
2423 case EF_ARM_EABI_VER4
:
2424 strcat (buf
, ", Version4 EABI");
2429 /* Process flags one bit at a time. */
2430 flag
= e_flags
& - e_flags
;
2436 strcat (buf
, ", BE8");
2440 strcat (buf
, ", LE8");
2451 case EF_ARM_EABI_VER5
:
2452 strcat (buf
, ", Version5 EABI");
2457 /* Process flags one bit at a time. */
2458 flag
= e_flags
& - e_flags
;
2464 strcat (buf
, ", BE8");
2468 strcat (buf
, ", LE8");
2471 case EF_ARM_ABI_FLOAT_SOFT
: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2472 strcat (buf
, ", soft-float ABI");
2475 case EF_ARM_ABI_FLOAT_HARD
: /* Conflicts with EF_ARM_VFP_FLOAT. */
2476 strcat (buf
, ", hard-float ABI");
2486 case EF_ARM_EABI_UNKNOWN
:
2487 strcat (buf
, ", GNU EABI");
2492 /* Process flags one bit at a time. */
2493 flag
= e_flags
& - e_flags
;
2498 case EF_ARM_INTERWORK
:
2499 strcat (buf
, ", interworking enabled");
2502 case EF_ARM_APCS_26
:
2503 strcat (buf
, ", uses APCS/26");
2506 case EF_ARM_APCS_FLOAT
:
2507 strcat (buf
, ", uses APCS/float");
2511 strcat (buf
, ", position independent");
2515 strcat (buf
, ", 8 bit structure alignment");
2518 case EF_ARM_NEW_ABI
:
2519 strcat (buf
, ", uses new ABI");
2522 case EF_ARM_OLD_ABI
:
2523 strcat (buf
, ", uses old ABI");
2526 case EF_ARM_SOFT_FLOAT
:
2527 strcat (buf
, ", software FP");
2530 case EF_ARM_VFP_FLOAT
:
2531 strcat (buf
, ", VFP");
2534 case EF_ARM_MAVERICK_FLOAT
:
2535 strcat (buf
, ", Maverick FP");
2546 strcat (buf
,_(", <unknown>"));
2550 decode_AVR_machine_flags (unsigned e_flags
, char buf
[], size_t size
)
2552 --size
; /* Leave space for null terminator. */
2554 switch (e_flags
& EF_AVR_MACH
)
2556 case E_AVR_MACH_AVR1
:
2557 strncat (buf
, ", avr:1", size
);
2559 case E_AVR_MACH_AVR2
:
2560 strncat (buf
, ", avr:2", size
);
2562 case E_AVR_MACH_AVR25
:
2563 strncat (buf
, ", avr:25", size
);
2565 case E_AVR_MACH_AVR3
:
2566 strncat (buf
, ", avr:3", size
);
2568 case E_AVR_MACH_AVR31
:
2569 strncat (buf
, ", avr:31", size
);
2571 case E_AVR_MACH_AVR35
:
2572 strncat (buf
, ", avr:35", size
);
2574 case E_AVR_MACH_AVR4
:
2575 strncat (buf
, ", avr:4", size
);
2577 case E_AVR_MACH_AVR5
:
2578 strncat (buf
, ", avr:5", size
);
2580 case E_AVR_MACH_AVR51
:
2581 strncat (buf
, ", avr:51", size
);
2583 case E_AVR_MACH_AVR6
:
2584 strncat (buf
, ", avr:6", size
);
2586 case E_AVR_MACH_AVRTINY
:
2587 strncat (buf
, ", avr:100", size
);
2589 case E_AVR_MACH_XMEGA1
:
2590 strncat (buf
, ", avr:101", size
);
2592 case E_AVR_MACH_XMEGA2
:
2593 strncat (buf
, ", avr:102", size
);
2595 case E_AVR_MACH_XMEGA3
:
2596 strncat (buf
, ", avr:103", size
);
2598 case E_AVR_MACH_XMEGA4
:
2599 strncat (buf
, ", avr:104", size
);
2601 case E_AVR_MACH_XMEGA5
:
2602 strncat (buf
, ", avr:105", size
);
2604 case E_AVR_MACH_XMEGA6
:
2605 strncat (buf
, ", avr:106", size
);
2607 case E_AVR_MACH_XMEGA7
:
2608 strncat (buf
, ", avr:107", size
);
2611 strncat (buf
, ", avr:<unknown>", size
);
2615 size
-= strlen (buf
);
2616 if (e_flags
& EF_AVR_LINKRELAX_PREPARED
)
2617 strncat (buf
, ", link-relax", size
);
2621 decode_NDS32_machine_flags (unsigned e_flags
, char buf
[], size_t size
)
2630 static const char *ABI_STRINGS
[] =
2632 "ABI v0", /* use r5 as return register; only used in N1213HC */
2633 "ABI v1", /* use r0 as return register */
2634 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2635 "ABI v2fp", /* for FPU */
2639 static const char *VER_STRINGS
[] =
2641 "Andes ELF V1.3 or older",
2645 static const char *ARCH_STRINGS
[] =
2654 abi
= EF_NDS_ABI
& e_flags
;
2655 arch
= EF_NDS_ARCH
& e_flags
;
2656 config
= EF_NDS_INST
& e_flags
;
2657 version
= EF_NDS32_ELF_VERSION
& e_flags
;
2659 memset (buf
, 0, size
);
2666 case E_NDS_ABI_V2FP
:
2667 case E_NDS_ABI_AABI
:
2668 case E_NDS_ABI_V2FP_PLUS
:
2669 /* In case there are holes in the array. */
2670 r
+= snprintf (buf
+ r
, size
- r
, ", %s", ABI_STRINGS
[abi
>> EF_NDS_ABI_SHIFT
]);
2674 r
+= snprintf (buf
+ r
, size
- r
, ", <unrecognized ABI>");
2680 case E_NDS32_ELF_VER_1_2
:
2681 case E_NDS32_ELF_VER_1_3
:
2682 case E_NDS32_ELF_VER_1_4
:
2683 r
+= snprintf (buf
+ r
, size
- r
, ", %s", VER_STRINGS
[version
>> EF_NDS32_ELF_VERSION_SHIFT
]);
2687 r
+= snprintf (buf
+ r
, size
- r
, ", <unrecognized ELF version number>");
2691 if (E_NDS_ABI_V0
== abi
)
2693 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2694 r
+= snprintf (buf
+ r
, size
- r
, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2695 if (arch
== E_NDS_ARCH_STAR_V1_0
)
2696 r
+= snprintf (buf
+ r
, size
-r
, ", 16b"); /* has 16-bit instructions */
2702 case E_NDS_ARCH_STAR_V1_0
:
2703 case E_NDS_ARCH_STAR_V2_0
:
2704 case E_NDS_ARCH_STAR_V3_0
:
2705 case E_NDS_ARCH_STAR_V3_M
:
2706 r
+= snprintf (buf
+ r
, size
- r
, ", %s", ARCH_STRINGS
[arch
>> EF_NDS_ARCH_SHIFT
]);
2710 r
+= snprintf (buf
+ r
, size
- r
, ", <unrecognized architecture>");
2711 /* ARCH version determines how the e_flags are interpreted.
2712 If it is unknown, we cannot proceed. */
2716 /* Newer ABI; Now handle architecture specific flags. */
2717 if (arch
== E_NDS_ARCH_STAR_V1_0
)
2719 if (config
& E_NDS32_HAS_MFUSR_PC_INST
)
2720 r
+= snprintf (buf
+ r
, size
-r
, ", MFUSR_PC");
2722 if (!(config
& E_NDS32_HAS_NO_MAC_INST
))
2723 r
+= snprintf (buf
+ r
, size
-r
, ", MAC");
2725 if (config
& E_NDS32_HAS_DIV_INST
)
2726 r
+= snprintf (buf
+ r
, size
-r
, ", DIV");
2728 if (config
& E_NDS32_HAS_16BIT_INST
)
2729 r
+= snprintf (buf
+ r
, size
-r
, ", 16b");
2733 if (config
& E_NDS32_HAS_MFUSR_PC_INST
)
2735 if (version
<= E_NDS32_ELF_VER_1_3
)
2736 r
+= snprintf (buf
+ r
, size
-r
, ", [B8]");
2738 r
+= snprintf (buf
+ r
, size
-r
, ", EX9");
2741 if (config
& E_NDS32_HAS_MAC_DX_INST
)
2742 r
+= snprintf (buf
+ r
, size
-r
, ", MAC_DX");
2744 if (config
& E_NDS32_HAS_DIV_DX_INST
)
2745 r
+= snprintf (buf
+ r
, size
-r
, ", DIV_DX");
2747 if (config
& E_NDS32_HAS_16BIT_INST
)
2749 if (version
<= E_NDS32_ELF_VER_1_3
)
2750 r
+= snprintf (buf
+ r
, size
-r
, ", 16b");
2752 r
+= snprintf (buf
+ r
, size
-r
, ", IFC");
2756 if (config
& E_NDS32_HAS_EXT_INST
)
2757 r
+= snprintf (buf
+ r
, size
-r
, ", PERF1");
2759 if (config
& E_NDS32_HAS_EXT2_INST
)
2760 r
+= snprintf (buf
+ r
, size
-r
, ", PERF2");
2762 if (config
& E_NDS32_HAS_FPU_INST
)
2765 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_SP");
2768 if (config
& E_NDS32_HAS_FPU_DP_INST
)
2771 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_DP");
2774 if (config
& E_NDS32_HAS_FPU_MAC_INST
)
2777 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_MAC");
2782 switch ((config
& E_NDS32_FPU_REG_CONF
) >> E_NDS32_FPU_REG_CONF_SHIFT
)
2784 case E_NDS32_FPU_REG_8SP_4DP
:
2785 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_REG:8/4");
2787 case E_NDS32_FPU_REG_16SP_8DP
:
2788 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_REG:16/8");
2790 case E_NDS32_FPU_REG_32SP_16DP
:
2791 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_REG:32/16");
2793 case E_NDS32_FPU_REG_32SP_32DP
:
2794 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_REG:32/32");
2799 if (config
& E_NDS32_HAS_AUDIO_INST
)
2800 r
+= snprintf (buf
+ r
, size
-r
, ", AUDIO");
2802 if (config
& E_NDS32_HAS_STRING_INST
)
2803 r
+= snprintf (buf
+ r
, size
-r
, ", STR");
2805 if (config
& E_NDS32_HAS_REDUCED_REGS
)
2806 r
+= snprintf (buf
+ r
, size
-r
, ", 16REG");
2808 if (config
& E_NDS32_HAS_VIDEO_INST
)
2810 if (version
<= E_NDS32_ELF_VER_1_3
)
2811 r
+= snprintf (buf
+ r
, size
-r
, ", VIDEO");
2813 r
+= snprintf (buf
+ r
, size
-r
, ", SATURATION");
2816 if (config
& E_NDS32_HAS_ENCRIPT_INST
)
2817 r
+= snprintf (buf
+ r
, size
-r
, ", ENCRP");
2819 if (config
& E_NDS32_HAS_L2C_INST
)
2820 r
+= snprintf (buf
+ r
, size
-r
, ", L2C");
2824 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
2826 static char buf
[1024];
2837 case EM_ARC_COMPACT2
:
2838 case EM_ARC_COMPACT
:
2839 decode_ARC_machine_flags (e_flags
, e_machine
, buf
);
2843 decode_ARM_machine_flags (e_flags
, buf
);
2847 decode_AVR_machine_flags (e_flags
, buf
, sizeof buf
);
2851 if (e_flags
& EF_BFIN_PIC
)
2852 strcat (buf
, ", PIC");
2854 if (e_flags
& EF_BFIN_FDPIC
)
2855 strcat (buf
, ", FDPIC");
2857 if (e_flags
& EF_BFIN_CODE_IN_L1
)
2858 strcat (buf
, ", code in L1");
2860 if (e_flags
& EF_BFIN_DATA_IN_L1
)
2861 strcat (buf
, ", data in L1");
2866 switch (e_flags
& EF_FRV_CPU_MASK
)
2868 case EF_FRV_CPU_GENERIC
:
2872 strcat (buf
, ", fr???");
2875 case EF_FRV_CPU_FR300
:
2876 strcat (buf
, ", fr300");
2879 case EF_FRV_CPU_FR400
:
2880 strcat (buf
, ", fr400");
2882 case EF_FRV_CPU_FR405
:
2883 strcat (buf
, ", fr405");
2886 case EF_FRV_CPU_FR450
:
2887 strcat (buf
, ", fr450");
2890 case EF_FRV_CPU_FR500
:
2891 strcat (buf
, ", fr500");
2893 case EF_FRV_CPU_FR550
:
2894 strcat (buf
, ", fr550");
2897 case EF_FRV_CPU_SIMPLE
:
2898 strcat (buf
, ", simple");
2900 case EF_FRV_CPU_TOMCAT
:
2901 strcat (buf
, ", tomcat");
2907 if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_M68000
)
2908 strcat (buf
, ", m68000");
2909 else if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_CPU32
)
2910 strcat (buf
, ", cpu32");
2911 else if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_FIDO
)
2912 strcat (buf
, ", fido_a");
2915 char const * isa
= _("unknown");
2916 char const * mac
= _("unknown mac");
2917 char const * additional
= NULL
;
2919 switch (e_flags
& EF_M68K_CF_ISA_MASK
)
2921 case EF_M68K_CF_ISA_A_NODIV
:
2923 additional
= ", nodiv";
2925 case EF_M68K_CF_ISA_A
:
2928 case EF_M68K_CF_ISA_A_PLUS
:
2931 case EF_M68K_CF_ISA_B_NOUSP
:
2933 additional
= ", nousp";
2935 case EF_M68K_CF_ISA_B
:
2938 case EF_M68K_CF_ISA_C
:
2941 case EF_M68K_CF_ISA_C_NODIV
:
2943 additional
= ", nodiv";
2946 strcat (buf
, ", cf, isa ");
2949 strcat (buf
, additional
);
2950 if (e_flags
& EF_M68K_CF_FLOAT
)
2951 strcat (buf
, ", float");
2952 switch (e_flags
& EF_M68K_CF_MAC_MASK
)
2957 case EF_M68K_CF_MAC
:
2960 case EF_M68K_CF_EMAC
:
2963 case EF_M68K_CF_EMAC_B
:
2976 switch (e_flags
& EF_MEP_CPU_MASK
)
2978 case EF_MEP_CPU_MEP
: strcat (buf
, ", generic MeP"); break;
2979 case EF_MEP_CPU_C2
: strcat (buf
, ", MeP C2"); break;
2980 case EF_MEP_CPU_C3
: strcat (buf
, ", MeP C3"); break;
2981 case EF_MEP_CPU_C4
: strcat (buf
, ", MeP C4"); break;
2982 case EF_MEP_CPU_C5
: strcat (buf
, ", MeP C5"); break;
2983 case EF_MEP_CPU_H1
: strcat (buf
, ", MeP H1"); break;
2984 default: strcat (buf
, _(", <unknown MeP cpu type>")); break;
2987 switch (e_flags
& EF_MEP_COP_MASK
)
2989 case EF_MEP_COP_NONE
: break;
2990 case EF_MEP_COP_AVC
: strcat (buf
, ", AVC coprocessor"); break;
2991 case EF_MEP_COP_AVC2
: strcat (buf
, ", AVC2 coprocessor"); break;
2992 case EF_MEP_COP_FMAX
: strcat (buf
, ", FMAX coprocessor"); break;
2993 case EF_MEP_COP_IVC2
: strcat (buf
, ", IVC2 coprocessor"); break;
2994 default: strcat (buf
, _("<unknown MeP copro type>")); break;
2997 if (e_flags
& EF_MEP_LIBRARY
)
2998 strcat (buf
, ", Built for Library");
3000 if (e_flags
& EF_MEP_INDEX_MASK
)
3001 sprintf (buf
+ strlen (buf
), ", Configuration Index: %#x",
3002 e_flags
& EF_MEP_INDEX_MASK
);
3004 if (e_flags
& ~ EF_MEP_ALL_FLAGS
)
3005 sprintf (buf
+ strlen (buf
), _(", unknown flags bits: %#x"),
3006 e_flags
& ~ EF_MEP_ALL_FLAGS
);
3010 if (e_flags
& EF_PPC_EMB
)
3011 strcat (buf
, ", emb");
3013 if (e_flags
& EF_PPC_RELOCATABLE
)
3014 strcat (buf
, _(", relocatable"));
3016 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
3017 strcat (buf
, _(", relocatable-lib"));
3021 if (e_flags
& EF_PPC64_ABI
)
3023 char abi
[] = ", abiv0";
3025 abi
[6] += e_flags
& EF_PPC64_ABI
;
3031 if ((e_flags
& EF_RH850_ABI
) == EF_RH850_ABI
)
3032 strcat (buf
, ", RH850 ABI");
3034 if (e_flags
& EF_V800_850E3
)
3035 strcat (buf
, ", V3 architecture");
3037 if ((e_flags
& (EF_RH850_FPU_DOUBLE
| EF_RH850_FPU_SINGLE
)) == 0)
3038 strcat (buf
, ", FPU not used");
3040 if ((e_flags
& (EF_RH850_REGMODE22
| EF_RH850_REGMODE32
)) == 0)
3041 strcat (buf
, ", regmode: COMMON");
3043 if ((e_flags
& (EF_RH850_GP_FIX
| EF_RH850_GP_NOFIX
)) == 0)
3044 strcat (buf
, ", r4 not used");
3046 if ((e_flags
& (EF_RH850_EP_FIX
| EF_RH850_EP_NOFIX
)) == 0)
3047 strcat (buf
, ", r30 not used");
3049 if ((e_flags
& (EF_RH850_TP_FIX
| EF_RH850_TP_NOFIX
)) == 0)
3050 strcat (buf
, ", r5 not used");
3052 if ((e_flags
& (EF_RH850_REG2_RESERVE
| EF_RH850_REG2_NORESERVE
)) == 0)
3053 strcat (buf
, ", r2 not used");
3055 for (e_flags
&= 0xFFFF; e_flags
; e_flags
&= ~ (e_flags
& - e_flags
))
3057 switch (e_flags
& - e_flags
)
3059 case EF_RH850_FPU_DOUBLE
: strcat (buf
, ", double precision FPU"); break;
3060 case EF_RH850_FPU_SINGLE
: strcat (buf
, ", single precision FPU"); break;
3061 case EF_RH850_REGMODE22
: strcat (buf
, ", regmode:22"); break;
3062 case EF_RH850_REGMODE32
: strcat (buf
, ", regmode:23"); break;
3063 case EF_RH850_GP_FIX
: strcat (buf
, ", r4 fixed"); break;
3064 case EF_RH850_GP_NOFIX
: strcat (buf
, ", r4 free"); break;
3065 case EF_RH850_EP_FIX
: strcat (buf
, ", r30 fixed"); break;
3066 case EF_RH850_EP_NOFIX
: strcat (buf
, ", r30 free"); break;
3067 case EF_RH850_TP_FIX
: strcat (buf
, ", r5 fixed"); break;
3068 case EF_RH850_TP_NOFIX
: strcat (buf
, ", r5 free"); break;
3069 case EF_RH850_REG2_RESERVE
: strcat (buf
, ", r2 fixed"); break;
3070 case EF_RH850_REG2_NORESERVE
: strcat (buf
, ", r2 free"); break;
3077 case EM_CYGNUS_V850
:
3078 switch (e_flags
& EF_V850_ARCH
)
3080 case E_V850E3V5_ARCH
:
3081 strcat (buf
, ", v850e3v5");
3083 case E_V850E2V3_ARCH
:
3084 strcat (buf
, ", v850e2v3");
3087 strcat (buf
, ", v850e2");
3090 strcat (buf
, ", v850e1");
3093 strcat (buf
, ", v850e");
3096 strcat (buf
, ", v850");
3099 strcat (buf
, _(", unknown v850 architecture variant"));
3105 case EM_CYGNUS_M32R
:
3106 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
3107 strcat (buf
, ", m32r");
3111 case EM_MIPS_RS3_LE
:
3112 if (e_flags
& EF_MIPS_NOREORDER
)
3113 strcat (buf
, ", noreorder");
3115 if (e_flags
& EF_MIPS_PIC
)
3116 strcat (buf
, ", pic");
3118 if (e_flags
& EF_MIPS_CPIC
)
3119 strcat (buf
, ", cpic");
3121 if (e_flags
& EF_MIPS_UCODE
)
3122 strcat (buf
, ", ugen_reserved");
3124 if (e_flags
& EF_MIPS_ABI2
)
3125 strcat (buf
, ", abi2");
3127 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
3128 strcat (buf
, ", odk first");
3130 if (e_flags
& EF_MIPS_32BITMODE
)
3131 strcat (buf
, ", 32bitmode");
3133 if (e_flags
& EF_MIPS_NAN2008
)
3134 strcat (buf
, ", nan2008");
3136 if (e_flags
& EF_MIPS_FP64
)
3137 strcat (buf
, ", fp64");
3139 switch ((e_flags
& EF_MIPS_MACH
))
3141 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
3142 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
3143 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
3144 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
3145 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
3146 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
3147 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
3148 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
3149 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
3150 case E_MIPS_MACH_9000
: strcat (buf
, ", 9000"); break;
3151 case E_MIPS_MACH_LS2E
: strcat (buf
, ", loongson-2e"); break;
3152 case E_MIPS_MACH_LS2F
: strcat (buf
, ", loongson-2f"); break;
3153 case E_MIPS_MACH_LS3A
: strcat (buf
, ", loongson-3a"); break;
3154 case E_MIPS_MACH_OCTEON
: strcat (buf
, ", octeon"); break;
3155 case E_MIPS_MACH_OCTEON2
: strcat (buf
, ", octeon2"); break;
3156 case E_MIPS_MACH_OCTEON3
: strcat (buf
, ", octeon3"); break;
3157 case E_MIPS_MACH_XLR
: strcat (buf
, ", xlr"); break;
3159 /* We simply ignore the field in this case to avoid confusion:
3160 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3163 default: strcat (buf
, _(", unknown CPU")); break;
3166 switch ((e_flags
& EF_MIPS_ABI
))
3168 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
3169 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
3170 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
3171 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
3173 /* We simply ignore the field in this case to avoid confusion:
3174 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3175 This means it is likely to be an o32 file, but not for
3178 default: strcat (buf
, _(", unknown ABI")); break;
3181 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
3182 strcat (buf
, ", mdmx");
3184 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
3185 strcat (buf
, ", mips16");
3187 if (e_flags
& EF_MIPS_ARCH_ASE_MICROMIPS
)
3188 strcat (buf
, ", micromips");
3190 switch ((e_flags
& EF_MIPS_ARCH
))
3192 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
3193 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
3194 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
3195 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
3196 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
3197 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
3198 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
3199 case E_MIPS_ARCH_32R6
: strcat (buf
, ", mips32r6"); break;
3200 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
3201 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
3202 case E_MIPS_ARCH_64R6
: strcat (buf
, ", mips64r6"); break;
3203 default: strcat (buf
, _(", unknown ISA")); break;
3208 decode_NDS32_machine_flags (e_flags
, buf
, sizeof buf
);
3212 switch ((e_flags
& EF_SH_MACH_MASK
))
3214 case EF_SH1
: strcat (buf
, ", sh1"); break;
3215 case EF_SH2
: strcat (buf
, ", sh2"); break;
3216 case EF_SH3
: strcat (buf
, ", sh3"); break;
3217 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
3218 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
3219 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
3220 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
3221 case EF_SH4
: strcat (buf
, ", sh4"); break;
3222 case EF_SH5
: strcat (buf
, ", sh5"); break;
3223 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
3224 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
3225 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
3226 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
3227 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
3228 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
3229 case EF_SH3_NOMMU
: strcat (buf
, ", sh3-nommu"); break;
3230 case EF_SH4_NOMMU_NOFPU
: strcat (buf
, ", sh4-nommu-nofpu"); break;
3231 case EF_SH2A_SH4_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3232 case EF_SH2A_SH3_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh3-nommu"); break;
3233 case EF_SH2A_SH4
: strcat (buf
, ", sh2a-or-sh4"); break;
3234 case EF_SH2A_SH3E
: strcat (buf
, ", sh2a-or-sh3e"); break;
3235 default: strcat (buf
, _(", unknown ISA")); break;
3238 if (e_flags
& EF_SH_PIC
)
3239 strcat (buf
, ", pic");
3241 if (e_flags
& EF_SH_FDPIC
)
3242 strcat (buf
, ", fdpic");
3246 if (e_flags
& EF_OR1K_NODELAY
)
3247 strcat (buf
, ", no delay");
3251 if (e_flags
& EF_SPARC_32PLUS
)
3252 strcat (buf
, ", v8+");
3254 if (e_flags
& EF_SPARC_SUN_US1
)
3255 strcat (buf
, ", ultrasparcI");
3257 if (e_flags
& EF_SPARC_SUN_US3
)
3258 strcat (buf
, ", ultrasparcIII");
3260 if (e_flags
& EF_SPARC_HAL_R1
)
3261 strcat (buf
, ", halr1");
3263 if (e_flags
& EF_SPARC_LEDATA
)
3264 strcat (buf
, ", ledata");
3266 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
3267 strcat (buf
, ", tso");
3269 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
3270 strcat (buf
, ", pso");
3272 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
3273 strcat (buf
, ", rmo");
3277 switch (e_flags
& EF_PARISC_ARCH
)
3279 case EFA_PARISC_1_0
:
3280 strcpy (buf
, ", PA-RISC 1.0");
3282 case EFA_PARISC_1_1
:
3283 strcpy (buf
, ", PA-RISC 1.1");
3285 case EFA_PARISC_2_0
:
3286 strcpy (buf
, ", PA-RISC 2.0");
3291 if (e_flags
& EF_PARISC_TRAPNIL
)
3292 strcat (buf
, ", trapnil");
3293 if (e_flags
& EF_PARISC_EXT
)
3294 strcat (buf
, ", ext");
3295 if (e_flags
& EF_PARISC_LSB
)
3296 strcat (buf
, ", lsb");
3297 if (e_flags
& EF_PARISC_WIDE
)
3298 strcat (buf
, ", wide");
3299 if (e_flags
& EF_PARISC_NO_KABP
)
3300 strcat (buf
, ", no kabp");
3301 if (e_flags
& EF_PARISC_LAZYSWAP
)
3302 strcat (buf
, ", lazyswap");
3307 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
3308 strcat (buf
, ", new calling convention");
3310 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
3311 strcat (buf
, ", gnu calling convention");
3315 if ((e_flags
& EF_IA_64_ABI64
))
3316 strcat (buf
, ", 64-bit");
3318 strcat (buf
, ", 32-bit");
3319 if ((e_flags
& EF_IA_64_REDUCEDFP
))
3320 strcat (buf
, ", reduced fp model");
3321 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
3322 strcat (buf
, ", no function descriptors, constant gp");
3323 else if ((e_flags
& EF_IA_64_CONS_GP
))
3324 strcat (buf
, ", constant gp");
3325 if ((e_flags
& EF_IA_64_ABSOLUTE
))
3326 strcat (buf
, ", absolute");
3327 if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_OPENVMS
)
3329 if ((e_flags
& EF_IA_64_VMS_LINKAGES
))
3330 strcat (buf
, ", vms_linkages");
3331 switch ((e_flags
& EF_IA_64_VMS_COMCOD
))
3333 case EF_IA_64_VMS_COMCOD_SUCCESS
:
3335 case EF_IA_64_VMS_COMCOD_WARNING
:
3336 strcat (buf
, ", warning");
3338 case EF_IA_64_VMS_COMCOD_ERROR
:
3339 strcat (buf
, ", error");
3341 case EF_IA_64_VMS_COMCOD_ABORT
:
3342 strcat (buf
, ", abort");
3345 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3346 e_flags
& EF_IA_64_VMS_COMCOD
);
3347 strcat (buf
, ", <unknown>");
3353 if ((e_flags
& EF_VAX_NONPIC
))
3354 strcat (buf
, ", non-PIC");
3355 if ((e_flags
& EF_VAX_DFLOAT
))
3356 strcat (buf
, ", D-Float");
3357 if ((e_flags
& EF_VAX_GFLOAT
))
3358 strcat (buf
, ", G-Float");
3362 if (e_flags
& EF_VISIUM_ARCH_MCM
)
3363 strcat (buf
, ", mcm");
3364 else if (e_flags
& EF_VISIUM_ARCH_MCM24
)
3365 strcat (buf
, ", mcm24");
3366 if (e_flags
& EF_VISIUM_ARCH_GR6
)
3367 strcat (buf
, ", gr6");
3371 switch (e_flags
& E_FLAG_RL78_CPU_MASK
)
3373 case E_FLAG_RL78_ANY_CPU
: break;
3374 case E_FLAG_RL78_G10
: strcat (buf
, ", G10"); break;
3375 case E_FLAG_RL78_G13
: strcat (buf
, ", G13"); break;
3376 case E_FLAG_RL78_G14
: strcat (buf
, ", G14"); break;
3378 if (e_flags
& E_FLAG_RL78_64BIT_DOUBLES
)
3379 strcat (buf
, ", 64-bit doubles");
3383 if (e_flags
& E_FLAG_RX_64BIT_DOUBLES
)
3384 strcat (buf
, ", 64-bit doubles");
3385 if (e_flags
& E_FLAG_RX_DSP
)
3386 strcat (buf
, ", dsp");
3387 if (e_flags
& E_FLAG_RX_PID
)
3388 strcat (buf
, ", pid");
3389 if (e_flags
& E_FLAG_RX_ABI
)
3390 strcat (buf
, ", RX ABI");
3391 if (e_flags
& E_FLAG_RX_SINSNS_SET
)
3392 strcat (buf
, e_flags
& E_FLAG_RX_SINSNS_YES
3393 ? ", uses String instructions" : ", bans String instructions");
3394 if (e_flags
& E_FLAG_RX_V2
)
3395 strcat (buf
, ", V2");
3399 if (e_flags
& EF_S390_HIGH_GPRS
)
3400 strcat (buf
, ", highgprs");
3404 if ((e_flags
& EF_C6000_REL
))
3405 strcat (buf
, ", relocatable module");
3409 strcat (buf
, _(": architecture variant: "));
3410 switch (e_flags
& EF_MSP430_MACH
)
3412 case E_MSP430_MACH_MSP430x11
: strcat (buf
, "MSP430x11"); break;
3413 case E_MSP430_MACH_MSP430x11x1
: strcat (buf
, "MSP430x11x1 "); break;
3414 case E_MSP430_MACH_MSP430x12
: strcat (buf
, "MSP430x12"); break;
3415 case E_MSP430_MACH_MSP430x13
: strcat (buf
, "MSP430x13"); break;
3416 case E_MSP430_MACH_MSP430x14
: strcat (buf
, "MSP430x14"); break;
3417 case E_MSP430_MACH_MSP430x15
: strcat (buf
, "MSP430x15"); break;
3418 case E_MSP430_MACH_MSP430x16
: strcat (buf
, "MSP430x16"); break;
3419 case E_MSP430_MACH_MSP430x31
: strcat (buf
, "MSP430x31"); break;
3420 case E_MSP430_MACH_MSP430x32
: strcat (buf
, "MSP430x32"); break;
3421 case E_MSP430_MACH_MSP430x33
: strcat (buf
, "MSP430x33"); break;
3422 case E_MSP430_MACH_MSP430x41
: strcat (buf
, "MSP430x41"); break;
3423 case E_MSP430_MACH_MSP430x42
: strcat (buf
, "MSP430x42"); break;
3424 case E_MSP430_MACH_MSP430x43
: strcat (buf
, "MSP430x43"); break;
3425 case E_MSP430_MACH_MSP430x44
: strcat (buf
, "MSP430x44"); break;
3426 case E_MSP430_MACH_MSP430X
: strcat (buf
, "MSP430X"); break;
3428 strcat (buf
, _(": unknown")); break;
3431 if (e_flags
& ~ EF_MSP430_MACH
)
3432 strcat (buf
, _(": unknown extra flag bits also present"));
3440 get_osabi_name (unsigned int osabi
)
3442 static char buff
[32];
3446 case ELFOSABI_NONE
: return "UNIX - System V";
3447 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
3448 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
3449 case ELFOSABI_GNU
: return "UNIX - GNU";
3450 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
3451 case ELFOSABI_AIX
: return "UNIX - AIX";
3452 case ELFOSABI_IRIX
: return "UNIX - IRIX";
3453 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
3454 case ELFOSABI_TRU64
: return "UNIX - TRU64";
3455 case ELFOSABI_MODESTO
: return "Novell - Modesto";
3456 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
3457 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
3458 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
3459 case ELFOSABI_AROS
: return "AROS";
3460 case ELFOSABI_FENIXOS
: return "FenixOS";
3463 switch (elf_header
.e_machine
)
3468 case ELFOSABI_ARM
: return "ARM";
3479 case ELFOSABI_STANDALONE
: return _("Standalone App");
3488 case ELFOSABI_C6000_ELFABI
: return _("Bare-metal C6000");
3489 case ELFOSABI_C6000_LINUX
: return "Linux C6000";
3498 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), osabi
);
3504 get_aarch64_segment_type (unsigned long type
)
3508 case PT_AARCH64_ARCHEXT
:
3509 return "AARCH64_ARCHEXT";
3518 get_arm_segment_type (unsigned long type
)
3532 get_mips_segment_type (unsigned long type
)
3536 case PT_MIPS_REGINFO
:
3538 case PT_MIPS_RTPROC
:
3540 case PT_MIPS_OPTIONS
:
3542 case PT_MIPS_ABIFLAGS
:
3552 get_parisc_segment_type (unsigned long type
)
3556 case PT_HP_TLS
: return "HP_TLS";
3557 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
3558 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
3559 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
3560 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
3561 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
3562 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
3563 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
3564 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
3565 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
3566 case PT_HP_PARALLEL
: return "HP_PARALLEL";
3567 case PT_HP_FASTBIND
: return "HP_FASTBIND";
3568 case PT_HP_OPT_ANNOT
: return "HP_OPT_ANNOT";
3569 case PT_HP_HSL_ANNOT
: return "HP_HSL_ANNOT";
3570 case PT_HP_STACK
: return "HP_STACK";
3571 case PT_HP_CORE_UTSNAME
: return "HP_CORE_UTSNAME";
3572 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
3573 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
3574 case PT_PARISC_WEAKORDER
: return "PARISC_WEAKORDER";
3583 get_ia64_segment_type (unsigned long type
)
3587 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
3588 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
3589 case PT_HP_TLS
: return "HP_TLS";
3590 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
3591 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
3592 case PT_IA_64_HP_STACK
: return "HP_STACK";
3601 get_tic6x_segment_type (unsigned long type
)
3605 case PT_C6000_PHATTR
: return "C6000_PHATTR";
3614 get_segment_type (unsigned long p_type
)
3616 static char buff
[32];
3620 case PT_NULL
: return "NULL";
3621 case PT_LOAD
: return "LOAD";
3622 case PT_DYNAMIC
: return "DYNAMIC";
3623 case PT_INTERP
: return "INTERP";
3624 case PT_NOTE
: return "NOTE";
3625 case PT_SHLIB
: return "SHLIB";
3626 case PT_PHDR
: return "PHDR";
3627 case PT_TLS
: return "TLS";
3629 case PT_GNU_EH_FRAME
:
3630 return "GNU_EH_FRAME";
3631 case PT_GNU_STACK
: return "GNU_STACK";
3632 case PT_GNU_RELRO
: return "GNU_RELRO";
3635 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
3637 const char * result
;
3639 switch (elf_header
.e_machine
)
3642 result
= get_aarch64_segment_type (p_type
);
3645 result
= get_arm_segment_type (p_type
);
3648 case EM_MIPS_RS3_LE
:
3649 result
= get_mips_segment_type (p_type
);
3652 result
= get_parisc_segment_type (p_type
);
3655 result
= get_ia64_segment_type (p_type
);
3658 result
= get_tic6x_segment_type (p_type
);
3668 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
3670 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
3672 const char * result
;
3674 switch (elf_header
.e_machine
)
3677 result
= get_parisc_segment_type (p_type
);
3680 result
= get_ia64_segment_type (p_type
);
3690 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
3693 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), p_type
);
3700 get_mips_section_type_name (unsigned int sh_type
)
3704 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
3705 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
3706 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
3707 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
3708 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
3709 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
3710 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
3711 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
3712 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
3713 case SHT_MIPS_RELD
: return "MIPS_RELD";
3714 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
3715 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
3716 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
3717 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
3718 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
3719 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
3720 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
3721 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
3722 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
3723 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
3724 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
3725 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
3726 case SHT_MIPS_LINE
: return "MIPS_LINE";
3727 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
3728 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
3729 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
3730 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
3731 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
3732 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
3733 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
3734 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
3735 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
3736 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
3737 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
3738 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
3739 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
3740 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
3741 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
3742 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
3743 case SHT_MIPS_ABIFLAGS
: return "MIPS_ABIFLAGS";
3751 get_parisc_section_type_name (unsigned int sh_type
)
3755 case SHT_PARISC_EXT
: return "PARISC_EXT";
3756 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
3757 case SHT_PARISC_DOC
: return "PARISC_DOC";
3758 case SHT_PARISC_ANNOT
: return "PARISC_ANNOT";
3759 case SHT_PARISC_SYMEXTN
: return "PARISC_SYMEXTN";
3760 case SHT_PARISC_STUBS
: return "PARISC_STUBS";
3761 case SHT_PARISC_DLKM
: return "PARISC_DLKM";
3769 get_ia64_section_type_name (unsigned int sh_type
)
3771 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
3772 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
3773 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
3777 case SHT_IA_64_EXT
: return "IA_64_EXT";
3778 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
3779 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
3780 case SHT_IA_64_VMS_TRACE
: return "VMS_TRACE";
3781 case SHT_IA_64_VMS_TIE_SIGNATURES
: return "VMS_TIE_SIGNATURES";
3782 case SHT_IA_64_VMS_DEBUG
: return "VMS_DEBUG";
3783 case SHT_IA_64_VMS_DEBUG_STR
: return "VMS_DEBUG_STR";
3784 case SHT_IA_64_VMS_LINKAGES
: return "VMS_LINKAGES";
3785 case SHT_IA_64_VMS_SYMBOL_VECTOR
: return "VMS_SYMBOL_VECTOR";
3786 case SHT_IA_64_VMS_FIXUP
: return "VMS_FIXUP";
3794 get_x86_64_section_type_name (unsigned int sh_type
)
3798 case SHT_X86_64_UNWIND
: return "X86_64_UNWIND";
3806 get_aarch64_section_type_name (unsigned int sh_type
)
3810 case SHT_AARCH64_ATTRIBUTES
:
3811 return "AARCH64_ATTRIBUTES";
3819 get_arm_section_type_name (unsigned int sh_type
)
3823 case SHT_ARM_EXIDX
: return "ARM_EXIDX";
3824 case SHT_ARM_PREEMPTMAP
: return "ARM_PREEMPTMAP";
3825 case SHT_ARM_ATTRIBUTES
: return "ARM_ATTRIBUTES";
3826 case SHT_ARM_DEBUGOVERLAY
: return "ARM_DEBUGOVERLAY";
3827 case SHT_ARM_OVERLAYSECTION
: return "ARM_OVERLAYSECTION";
3835 get_tic6x_section_type_name (unsigned int sh_type
)
3839 case SHT_C6000_UNWIND
:
3840 return "C6000_UNWIND";
3841 case SHT_C6000_PREEMPTMAP
:
3842 return "C6000_PREEMPTMAP";
3843 case SHT_C6000_ATTRIBUTES
:
3844 return "C6000_ATTRIBUTES";
3849 case SHT_TI_HANDLER
:
3850 return "TI_HANDLER";
3851 case SHT_TI_INITINFO
:
3852 return "TI_INITINFO";
3853 case SHT_TI_PHATTRS
:
3854 return "TI_PHATTRS";
3862 get_msp430x_section_type_name (unsigned int sh_type
)
3866 case SHT_MSP430_SEC_FLAGS
: return "MSP430_SEC_FLAGS";
3867 case SHT_MSP430_SYM_ALIASES
: return "MSP430_SYM_ALIASES";
3868 case SHT_MSP430_ATTRIBUTES
: return "MSP430_ATTRIBUTES";
3869 default: return NULL
;
3874 get_v850_section_type_name (unsigned int sh_type
)
3878 case SHT_V850_SCOMMON
: return "V850 Small Common";
3879 case SHT_V850_TCOMMON
: return "V850 Tiny Common";
3880 case SHT_V850_ZCOMMON
: return "V850 Zero Common";
3881 case SHT_RENESAS_IOP
: return "RENESAS IOP";
3882 case SHT_RENESAS_INFO
: return "RENESAS INFO";
3883 default: return NULL
;
3888 get_section_type_name (unsigned int sh_type
)
3890 static char buff
[32];
3891 const char * result
;
3895 case SHT_NULL
: return "NULL";
3896 case SHT_PROGBITS
: return "PROGBITS";
3897 case SHT_SYMTAB
: return "SYMTAB";
3898 case SHT_STRTAB
: return "STRTAB";
3899 case SHT_RELA
: return "RELA";
3900 case SHT_HASH
: return "HASH";
3901 case SHT_DYNAMIC
: return "DYNAMIC";
3902 case SHT_NOTE
: return "NOTE";
3903 case SHT_NOBITS
: return "NOBITS";
3904 case SHT_REL
: return "REL";
3905 case SHT_SHLIB
: return "SHLIB";
3906 case SHT_DYNSYM
: return "DYNSYM";
3907 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
3908 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
3909 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
3910 case SHT_GNU_HASH
: return "GNU_HASH";
3911 case SHT_GROUP
: return "GROUP";
3912 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
3913 case SHT_GNU_verdef
: return "VERDEF";
3914 case SHT_GNU_verneed
: return "VERNEED";
3915 case SHT_GNU_versym
: return "VERSYM";
3916 case 0x6ffffff0: return "VERSYM";
3917 case 0x6ffffffc: return "VERDEF";
3918 case 0x7ffffffd: return "AUXILIARY";
3919 case 0x7fffffff: return "FILTER";
3920 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
3923 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
3925 switch (elf_header
.e_machine
)
3928 case EM_MIPS_RS3_LE
:
3929 result
= get_mips_section_type_name (sh_type
);
3932 result
= get_parisc_section_type_name (sh_type
);
3935 result
= get_ia64_section_type_name (sh_type
);
3940 result
= get_x86_64_section_type_name (sh_type
);
3943 result
= get_aarch64_section_type_name (sh_type
);
3946 result
= get_arm_section_type_name (sh_type
);
3949 result
= get_tic6x_section_type_name (sh_type
);
3952 result
= get_msp430x_section_type_name (sh_type
);
3956 case EM_CYGNUS_V850
:
3957 result
= get_v850_section_type_name (sh_type
);
3967 sprintf (buff
, "LOPROC+%#x", sh_type
- SHT_LOPROC
);
3969 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
3971 switch (elf_header
.e_machine
)
3974 result
= get_ia64_section_type_name (sh_type
);
3984 sprintf (buff
, "LOOS+%#x", sh_type
- SHT_LOOS
);
3986 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
3988 switch (elf_header
.e_machine
)
3992 case EM_CYGNUS_V850
:
3993 result
= get_v850_section_type_name (sh_type
);
4003 sprintf (buff
, "LOUSER+%#x", sh_type
- SHT_LOUSER
);
4006 /* This message is probably going to be displayed in a 15
4007 character wide field, so put the hex value first. */
4008 snprintf (buff
, sizeof (buff
), _("%08x: <unknown>"), sh_type
);
4014 #define OPTION_DEBUG_DUMP 512
4015 #define OPTION_DYN_SYMS 513
4016 #define OPTION_DWARF_DEPTH 514
4017 #define OPTION_DWARF_START 515
4018 #define OPTION_DWARF_CHECK 516
4020 static struct option options
[] =
4022 {"all", no_argument
, 0, 'a'},
4023 {"file-header", no_argument
, 0, 'h'},
4024 {"program-headers", no_argument
, 0, 'l'},
4025 {"headers", no_argument
, 0, 'e'},
4026 {"histogram", no_argument
, 0, 'I'},
4027 {"segments", no_argument
, 0, 'l'},
4028 {"sections", no_argument
, 0, 'S'},
4029 {"section-headers", no_argument
, 0, 'S'},
4030 {"section-groups", no_argument
, 0, 'g'},
4031 {"section-details", no_argument
, 0, 't'},
4032 {"full-section-name",no_argument
, 0, 'N'},
4033 {"symbols", no_argument
, 0, 's'},
4034 {"syms", no_argument
, 0, 's'},
4035 {"dyn-syms", no_argument
, 0, OPTION_DYN_SYMS
},
4036 {"relocs", no_argument
, 0, 'r'},
4037 {"notes", no_argument
, 0, 'n'},
4038 {"dynamic", no_argument
, 0, 'd'},
4039 {"arch-specific", no_argument
, 0, 'A'},
4040 {"version-info", no_argument
, 0, 'V'},
4041 {"use-dynamic", no_argument
, 0, 'D'},
4042 {"unwind", no_argument
, 0, 'u'},
4043 {"archive-index", no_argument
, 0, 'c'},
4044 {"hex-dump", required_argument
, 0, 'x'},
4045 {"relocated-dump", required_argument
, 0, 'R'},
4046 {"string-dump", required_argument
, 0, 'p'},
4047 {"decompress", no_argument
, 0, 'z'},
4048 #ifdef SUPPORT_DISASSEMBLY
4049 {"instruction-dump", required_argument
, 0, 'i'},
4051 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
4053 {"dwarf-depth", required_argument
, 0, OPTION_DWARF_DEPTH
},
4054 {"dwarf-start", required_argument
, 0, OPTION_DWARF_START
},
4055 {"dwarf-check", no_argument
, 0, OPTION_DWARF_CHECK
},
4057 {"version", no_argument
, 0, 'v'},
4058 {"wide", no_argument
, 0, 'W'},
4059 {"help", no_argument
, 0, 'H'},
4060 {0, no_argument
, 0, 0}
4064 usage (FILE * stream
)
4066 fprintf (stream
, _("Usage: readelf <option(s)> elf-file(s)\n"));
4067 fprintf (stream
, _(" Display information about the contents of ELF format files\n"));
4068 fprintf (stream
, _(" Options are:\n\
4069 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4070 -h --file-header Display the ELF file header\n\
4071 -l --program-headers Display the program headers\n\
4072 --segments An alias for --program-headers\n\
4073 -S --section-headers Display the sections' header\n\
4074 --sections An alias for --section-headers\n\
4075 -g --section-groups Display the section groups\n\
4076 -t --section-details Display the section details\n\
4077 -e --headers Equivalent to: -h -l -S\n\
4078 -s --syms Display the symbol table\n\
4079 --symbols An alias for --syms\n\
4080 --dyn-syms Display the dynamic symbol table\n\
4081 -n --notes Display the core notes (if present)\n\
4082 -r --relocs Display the relocations (if present)\n\
4083 -u --unwind Display the unwind info (if present)\n\
4084 -d --dynamic Display the dynamic section (if present)\n\
4085 -V --version-info Display the version sections (if present)\n\
4086 -A --arch-specific Display architecture specific information (if any)\n\
4087 -c --archive-index Display the symbol/file index in an archive\n\
4088 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
4089 -x --hex-dump=<number|name>\n\
4090 Dump the contents of section <number|name> as bytes\n\
4091 -p --string-dump=<number|name>\n\
4092 Dump the contents of section <number|name> as strings\n\
4093 -R --relocated-dump=<number|name>\n\
4094 Dump the contents of section <number|name> as relocated bytes\n\
4095 -z --decompress Decompress section before dumping it\n\
4096 -w[lLiaprmfFsoRt] or\n\
4097 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4098 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4099 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4101 Display the contents of DWARF2 debug sections\n"));
4102 fprintf (stream
, _("\
4103 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4104 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4106 #ifdef SUPPORT_DISASSEMBLY
4107 fprintf (stream
, _("\
4108 -i --instruction-dump=<number|name>\n\
4109 Disassemble the contents of section <number|name>\n"));
4111 fprintf (stream
, _("\
4112 -I --histogram Display histogram of bucket list lengths\n\
4113 -W --wide Allow output width to exceed 80 characters\n\
4114 @<file> Read options from <file>\n\
4115 -H --help Display this information\n\
4116 -v --version Display the version number of readelf\n"));
4118 if (REPORT_BUGS_TO
[0] && stream
== stdout
)
4119 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
4121 exit (stream
== stdout
? 0 : 1);
4124 /* Record the fact that the user wants the contents of section number
4125 SECTION to be displayed using the method(s) encoded as flags bits
4126 in TYPE. Note, TYPE can be zero if we are creating the array for
4130 request_dump_bynumber (unsigned int section
, dump_type type
)
4132 if (section
>= num_dump_sects
)
4134 dump_type
* new_dump_sects
;
4136 new_dump_sects
= (dump_type
*) calloc (section
+ 1,
4137 sizeof (* dump_sects
));
4139 if (new_dump_sects
== NULL
)
4140 error (_("Out of memory allocating dump request table.\n"));
4143 /* Copy current flag settings. */
4144 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
* sizeof (* dump_sects
));
4148 dump_sects
= new_dump_sects
;
4149 num_dump_sects
= section
+ 1;
4154 dump_sects
[section
] |= type
;
4159 /* Request a dump by section name. */
4162 request_dump_byname (const char * section
, dump_type type
)
4164 struct dump_list_entry
* new_request
;
4166 new_request
= (struct dump_list_entry
*)
4167 malloc (sizeof (struct dump_list_entry
));
4169 error (_("Out of memory allocating dump request table.\n"));
4171 new_request
->name
= strdup (section
);
4172 if (!new_request
->name
)
4173 error (_("Out of memory allocating dump request table.\n"));
4175 new_request
->type
= type
;
4177 new_request
->next
= dump_sects_byname
;
4178 dump_sects_byname
= new_request
;
4182 request_dump (dump_type type
)
4188 section
= strtoul (optarg
, & cp
, 0);
4190 if (! *cp
&& section
>= 0)
4191 request_dump_bynumber (section
, type
);
4193 request_dump_byname (optarg
, type
);
4198 parse_args (int argc
, char ** argv
)
4205 while ((c
= getopt_long
4206 (argc
, argv
, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options
, NULL
)) != EOF
)
4224 do_section_groups
++;
4232 do_section_groups
++;
4237 do_section_details
++;
4281 request_dump (HEX_DUMP
);
4284 request_dump (STRING_DUMP
);
4287 request_dump (RELOC_DUMP
);
4297 dwarf_select_sections_all ();
4302 dwarf_select_sections_by_letters (optarg
);
4305 case OPTION_DEBUG_DUMP
:
4312 dwarf_select_sections_by_names (optarg
);
4315 case OPTION_DWARF_DEPTH
:
4319 dwarf_cutoff_level
= strtoul (optarg
, & cp
, 0);
4322 case OPTION_DWARF_START
:
4326 dwarf_start_die
= strtoul (optarg
, & cp
, 0);
4329 case OPTION_DWARF_CHECK
:
4332 case OPTION_DYN_SYMS
:
4335 #ifdef SUPPORT_DISASSEMBLY
4337 request_dump (DISASS_DUMP
);
4341 print_version (program_name
);
4350 /* xgettext:c-format */
4351 error (_("Invalid option '-%c'\n"), c
);
4358 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
4359 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
4360 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
4361 && !do_section_groups
&& !do_archive_index
4367 get_elf_class (unsigned int elf_class
)
4369 static char buff
[32];
4373 case ELFCLASSNONE
: return _("none");
4374 case ELFCLASS32
: return "ELF32";
4375 case ELFCLASS64
: return "ELF64";
4377 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), elf_class
);
4383 get_data_encoding (unsigned int encoding
)
4385 static char buff
[32];
4389 case ELFDATANONE
: return _("none");
4390 case ELFDATA2LSB
: return _("2's complement, little endian");
4391 case ELFDATA2MSB
: return _("2's complement, big endian");
4393 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), encoding
);
4398 /* Decode the data held in 'elf_header'. */
4401 process_file_header (void)
4403 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
4404 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
4405 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
4406 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
4409 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4413 init_dwarf_regnames (elf_header
.e_machine
);
4419 printf (_("ELF Header:\n"));
4420 printf (_(" Magic: "));
4421 for (i
= 0; i
< EI_NIDENT
; i
++)
4422 printf ("%2.2x ", elf_header
.e_ident
[i
]);
4424 printf (_(" Class: %s\n"),
4425 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
4426 printf (_(" Data: %s\n"),
4427 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
4428 printf (_(" Version: %d %s\n"),
4429 elf_header
.e_ident
[EI_VERSION
],
4430 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
4432 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
4433 ? _("<unknown: %lx>")
4435 printf (_(" OS/ABI: %s\n"),
4436 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
4437 printf (_(" ABI Version: %d\n"),
4438 elf_header
.e_ident
[EI_ABIVERSION
]);
4439 printf (_(" Type: %s\n"),
4440 get_file_type (elf_header
.e_type
));
4441 printf (_(" Machine: %s\n"),
4442 get_machine_name (elf_header
.e_machine
));
4443 printf (_(" Version: 0x%lx\n"),
4444 (unsigned long) elf_header
.e_version
);
4446 printf (_(" Entry point address: "));
4447 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
4448 printf (_("\n Start of program headers: "));
4449 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
4450 printf (_(" (bytes into file)\n Start of section headers: "));
4451 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
4452 printf (_(" (bytes into file)\n"));
4454 printf (_(" Flags: 0x%lx%s\n"),
4455 (unsigned long) elf_header
.e_flags
,
4456 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
4457 printf (_(" Size of this header: %ld (bytes)\n"),
4458 (long) elf_header
.e_ehsize
);
4459 printf (_(" Size of program headers: %ld (bytes)\n"),
4460 (long) elf_header
.e_phentsize
);
4461 printf (_(" Number of program headers: %ld"),
4462 (long) elf_header
.e_phnum
);
4463 if (section_headers
!= NULL
4464 && elf_header
.e_phnum
== PN_XNUM
4465 && section_headers
[0].sh_info
!= 0)
4466 printf (" (%ld)", (long) section_headers
[0].sh_info
);
4467 putc ('\n', stdout
);
4468 printf (_(" Size of section headers: %ld (bytes)\n"),
4469 (long) elf_header
.e_shentsize
);
4470 printf (_(" Number of section headers: %ld"),
4471 (long) elf_header
.e_shnum
);
4472 if (section_headers
!= NULL
&& elf_header
.e_shnum
== SHN_UNDEF
)
4473 printf (" (%ld)", (long) section_headers
[0].sh_size
);
4474 putc ('\n', stdout
);
4475 printf (_(" Section header string table index: %ld"),
4476 (long) elf_header
.e_shstrndx
);
4477 if (section_headers
!= NULL
4478 && elf_header
.e_shstrndx
== (SHN_XINDEX
& 0xffff))
4479 printf (" (%u)", section_headers
[0].sh_link
);
4480 else if (elf_header
.e_shstrndx
!= SHN_UNDEF
4481 && elf_header
.e_shstrndx
>= elf_header
.e_shnum
)
4482 printf (_(" <corrupt: out of range>"));
4483 putc ('\n', stdout
);
4486 if (section_headers
!= NULL
)
4488 if (elf_header
.e_phnum
== PN_XNUM
4489 && section_headers
[0].sh_info
!= 0)
4490 elf_header
.e_phnum
= section_headers
[0].sh_info
;
4491 if (elf_header
.e_shnum
== SHN_UNDEF
)
4492 elf_header
.e_shnum
= section_headers
[0].sh_size
;
4493 if (elf_header
.e_shstrndx
== (SHN_XINDEX
& 0xffff))
4494 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
4495 else if (elf_header
.e_shstrndx
>= elf_header
.e_shnum
)
4496 elf_header
.e_shstrndx
= SHN_UNDEF
;
4497 free (section_headers
);
4498 section_headers
= NULL
;
4505 get_32bit_program_headers (FILE * file
, Elf_Internal_Phdr
* pheaders
)
4507 Elf32_External_Phdr
* phdrs
;
4508 Elf32_External_Phdr
* external
;
4509 Elf_Internal_Phdr
* internal
;
4511 unsigned int size
= elf_header
.e_phentsize
;
4512 unsigned int num
= elf_header
.e_phnum
;
4514 /* PR binutils/17531: Cope with unexpected section header sizes. */
4515 if (size
== 0 || num
== 0)
4517 if (size
< sizeof * phdrs
)
4519 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4522 if (size
> sizeof * phdrs
)
4523 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4525 phdrs
= (Elf32_External_Phdr
*) get_data (NULL
, file
, elf_header
.e_phoff
,
4526 size
, num
, _("program headers"));
4530 for (i
= 0, internal
= pheaders
, external
= phdrs
;
4531 i
< elf_header
.e_phnum
;
4532 i
++, internal
++, external
++)
4534 internal
->p_type
= BYTE_GET (external
->p_type
);
4535 internal
->p_offset
= BYTE_GET (external
->p_offset
);
4536 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
4537 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
4538 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
4539 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
4540 internal
->p_flags
= BYTE_GET (external
->p_flags
);
4541 internal
->p_align
= BYTE_GET (external
->p_align
);
4549 get_64bit_program_headers (FILE * file
, Elf_Internal_Phdr
* pheaders
)
4551 Elf64_External_Phdr
* phdrs
;
4552 Elf64_External_Phdr
* external
;
4553 Elf_Internal_Phdr
* internal
;
4555 unsigned int size
= elf_header
.e_phentsize
;
4556 unsigned int num
= elf_header
.e_phnum
;
4558 /* PR binutils/17531: Cope with unexpected section header sizes. */
4559 if (size
== 0 || num
== 0)
4561 if (size
< sizeof * phdrs
)
4563 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4566 if (size
> sizeof * phdrs
)
4567 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4569 phdrs
= (Elf64_External_Phdr
*) get_data (NULL
, file
, elf_header
.e_phoff
,
4570 size
, num
, _("program headers"));
4574 for (i
= 0, internal
= pheaders
, external
= phdrs
;
4575 i
< elf_header
.e_phnum
;
4576 i
++, internal
++, external
++)
4578 internal
->p_type
= BYTE_GET (external
->p_type
);
4579 internal
->p_flags
= BYTE_GET (external
->p_flags
);
4580 internal
->p_offset
= BYTE_GET (external
->p_offset
);
4581 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
4582 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
4583 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
4584 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
4585 internal
->p_align
= BYTE_GET (external
->p_align
);
4592 /* Returns 1 if the program headers were read into `program_headers'. */
4595 get_program_headers (FILE * file
)
4597 Elf_Internal_Phdr
* phdrs
;
4599 /* Check cache of prior read. */
4600 if (program_headers
!= NULL
)
4603 phdrs
= (Elf_Internal_Phdr
*) cmalloc (elf_header
.e_phnum
,
4604 sizeof (Elf_Internal_Phdr
));
4608 error (_("Out of memory reading %u program headers\n"),
4609 elf_header
.e_phnum
);
4614 ? get_32bit_program_headers (file
, phdrs
)
4615 : get_64bit_program_headers (file
, phdrs
))
4617 program_headers
= phdrs
;
4625 /* Returns 1 if the program headers were loaded. */
4628 process_program_headers (FILE * file
)
4630 Elf_Internal_Phdr
* segment
;
4633 if (elf_header
.e_phnum
== 0)
4635 /* PR binutils/12467. */
4636 if (elf_header
.e_phoff
!= 0)
4637 warn (_("possibly corrupt ELF header - it has a non-zero program"
4638 " header offset, but no program headers\n"));
4639 else if (do_segments
)
4640 printf (_("\nThere are no program headers in this file.\n"));
4644 if (do_segments
&& !do_header
)
4646 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
4647 printf (_("Entry point "));
4648 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
4649 printf (_("\nThere are %d program headers, starting at offset "),
4650 elf_header
.e_phnum
);
4651 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
4655 if (! get_program_headers (file
))
4660 if (elf_header
.e_phnum
> 1)
4661 printf (_("\nProgram Headers:\n"));
4663 printf (_("\nProgram Headers:\n"));
4667 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4670 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4674 (_(" Type Offset VirtAddr PhysAddr\n"));
4676 (_(" FileSiz MemSiz Flags Align\n"));
4683 for (i
= 0, segment
= program_headers
;
4684 i
< elf_header
.e_phnum
;
4689 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
4693 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
4694 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
4695 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
4696 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
4697 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
4699 (segment
->p_flags
& PF_R
? 'R' : ' '),
4700 (segment
->p_flags
& PF_W
? 'W' : ' '),
4701 (segment
->p_flags
& PF_X
? 'E' : ' '));
4702 printf ("%#lx", (unsigned long) segment
->p_align
);
4706 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
4707 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
4710 print_vma (segment
->p_offset
, FULL_HEX
);
4714 print_vma (segment
->p_vaddr
, FULL_HEX
);
4716 print_vma (segment
->p_paddr
, FULL_HEX
);
4719 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
4720 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
4723 print_vma (segment
->p_filesz
, FULL_HEX
);
4727 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
4728 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
4731 print_vma (segment
->p_memsz
, FULL_HEX
);
4735 (segment
->p_flags
& PF_R
? 'R' : ' '),
4736 (segment
->p_flags
& PF_W
? 'W' : ' '),
4737 (segment
->p_flags
& PF_X
? 'E' : ' '));
4739 if ((unsigned long) segment
->p_align
== segment
->p_align
)
4740 printf ("%#lx", (unsigned long) segment
->p_align
);
4743 print_vma (segment
->p_align
, PREFIX_HEX
);
4748 print_vma (segment
->p_offset
, FULL_HEX
);
4750 print_vma (segment
->p_vaddr
, FULL_HEX
);
4752 print_vma (segment
->p_paddr
, FULL_HEX
);
4754 print_vma (segment
->p_filesz
, FULL_HEX
);
4756 print_vma (segment
->p_memsz
, FULL_HEX
);
4758 (segment
->p_flags
& PF_R
? 'R' : ' '),
4759 (segment
->p_flags
& PF_W
? 'W' : ' '),
4760 (segment
->p_flags
& PF_X
? 'E' : ' '));
4761 print_vma (segment
->p_align
, HEX
);
4766 putc ('\n', stdout
);
4768 switch (segment
->p_type
)
4772 error (_("more than one dynamic segment\n"));
4774 /* By default, assume that the .dynamic section is the first
4775 section in the DYNAMIC segment. */
4776 dynamic_addr
= segment
->p_offset
;
4777 dynamic_size
= segment
->p_filesz
;
4778 /* PR binutils/17512: Avoid corrupt dynamic section info in the segment. */
4779 if (dynamic_addr
+ dynamic_size
>= current_file_size
)
4781 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4782 dynamic_addr
= dynamic_size
= 0;
4785 /* Try to locate the .dynamic section. If there is
4786 a section header table, we can easily locate it. */
4787 if (section_headers
!= NULL
)
4789 Elf_Internal_Shdr
* sec
;
4791 sec
= find_section (".dynamic");
4792 if (sec
== NULL
|| sec
->sh_size
== 0)
4794 /* A corresponding .dynamic section is expected, but on
4795 IA-64/OpenVMS it is OK for it to be missing. */
4796 if (!is_ia64_vms ())
4797 error (_("no .dynamic section in the dynamic segment\n"));
4801 if (sec
->sh_type
== SHT_NOBITS
)
4807 dynamic_addr
= sec
->sh_offset
;
4808 dynamic_size
= sec
->sh_size
;
4810 if (dynamic_addr
< segment
->p_offset
4811 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
4812 warn (_("the .dynamic section is not contained"
4813 " within the dynamic segment\n"));
4814 else if (dynamic_addr
> segment
->p_offset
)
4815 warn (_("the .dynamic section is not the first section"
4816 " in the dynamic segment.\n"));
4821 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
4823 error (_("Unable to find program interpreter name\n"));
4827 int ret
= snprintf (fmt
, sizeof (fmt
), "%%%ds", PATH_MAX
- 1);
4829 if (ret
>= (int) sizeof (fmt
) || ret
< 0)
4830 error (_("Internal error: failed to create format string to display program interpreter\n"));
4832 program_interpreter
[0] = 0;
4833 if (fscanf (file
, fmt
, program_interpreter
) <= 0)
4834 error (_("Unable to read program interpreter name\n"));
4837 printf (_(" [Requesting program interpreter: %s]\n"),
4838 program_interpreter
);
4844 if (do_segments
&& section_headers
!= NULL
&& string_table
!= NULL
)
4846 printf (_("\n Section to Segment mapping:\n"));
4847 printf (_(" Segment Sections...\n"));
4849 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
4852 Elf_Internal_Shdr
* section
;
4854 segment
= program_headers
+ i
;
4855 section
= section_headers
+ 1;
4857 printf (" %2.2d ", i
);
4859 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
4861 if (!ELF_TBSS_SPECIAL (section
, segment
)
4862 && ELF_SECTION_IN_SEGMENT_STRICT (section
, segment
))
4863 printf ("%s ", printable_section_name (section
));
4874 /* Find the file offset corresponding to VMA by using the program headers. */
4877 offset_from_vma (FILE * file
, bfd_vma vma
, bfd_size_type size
)
4879 Elf_Internal_Phdr
* seg
;
4881 if (! get_program_headers (file
))
4883 warn (_("Cannot interpret virtual addresses without program headers.\n"));
4887 for (seg
= program_headers
;
4888 seg
< program_headers
+ elf_header
.e_phnum
;
4891 if (seg
->p_type
!= PT_LOAD
)
4894 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
4895 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
4896 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
4899 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4900 (unsigned long) vma
);
4905 /* Allocate memory and load the sections headers into the global pointer
4906 SECTION_HEADERS. If PROBE is true, this is just a probe and we do not
4907 generate any error messages if the load fails. */
4910 get_32bit_section_headers (FILE * file
, bfd_boolean probe
)
4912 Elf32_External_Shdr
* shdrs
;
4913 Elf_Internal_Shdr
* internal
;
4915 unsigned int size
= elf_header
.e_shentsize
;
4916 unsigned int num
= probe
? 1 : elf_header
.e_shnum
;
4918 /* PR binutils/17531: Cope with unexpected section header sizes. */
4919 if (size
== 0 || num
== 0)
4921 if (size
< sizeof * shdrs
)
4924 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4927 if (!probe
&& size
> sizeof * shdrs
)
4928 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4930 shdrs
= (Elf32_External_Shdr
*) get_data (NULL
, file
, elf_header
.e_shoff
,
4932 probe
? NULL
: _("section headers"));
4936 if (section_headers
!= NULL
)
4937 free (section_headers
);
4938 section_headers
= (Elf_Internal_Shdr
*) cmalloc (num
,
4939 sizeof (Elf_Internal_Shdr
));
4940 if (section_headers
== NULL
)
4943 error (_("Out of memory reading %u section headers\n"), num
);
4947 for (i
= 0, internal
= section_headers
;
4951 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
4952 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
4953 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
4954 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
4955 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
4956 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
4957 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
4958 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
4959 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
4960 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
4968 get_64bit_section_headers (FILE * file
, bfd_boolean probe
)
4970 Elf64_External_Shdr
* shdrs
;
4971 Elf_Internal_Shdr
* internal
;
4973 unsigned int size
= elf_header
.e_shentsize
;
4974 unsigned int num
= probe
? 1 : elf_header
.e_shnum
;
4976 /* PR binutils/17531: Cope with unexpected section header sizes. */
4977 if (size
== 0 || num
== 0)
4979 if (size
< sizeof * shdrs
)
4982 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4985 if (! probe
&& size
> sizeof * shdrs
)
4986 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4988 shdrs
= (Elf64_External_Shdr
*) get_data (NULL
, file
, elf_header
.e_shoff
,
4990 probe
? NULL
: _("section headers"));
4994 if (section_headers
!= NULL
)
4995 free (section_headers
);
4996 section_headers
= (Elf_Internal_Shdr
*) cmalloc (num
,
4997 sizeof (Elf_Internal_Shdr
));
4998 if (section_headers
== NULL
)
5001 error (_("Out of memory reading %u section headers\n"), num
);
5005 for (i
= 0, internal
= section_headers
;
5009 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
5010 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
5011 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
5012 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
5013 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
5014 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
5015 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
5016 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
5017 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
5018 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
5025 static Elf_Internal_Sym
*
5026 get_32bit_elf_symbols (FILE * file
,
5027 Elf_Internal_Shdr
* section
,
5028 unsigned long * num_syms_return
)
5030 unsigned long number
= 0;
5031 Elf32_External_Sym
* esyms
= NULL
;
5032 Elf_External_Sym_Shndx
* shndx
= NULL
;
5033 Elf_Internal_Sym
* isyms
= NULL
;
5034 Elf_Internal_Sym
* psym
;
5037 if (section
->sh_size
== 0)
5039 if (num_syms_return
!= NULL
)
5040 * num_syms_return
= 0;
5044 /* Run some sanity checks first. */
5045 if (section
->sh_entsize
== 0 || section
->sh_entsize
> section
->sh_size
)
5047 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5048 printable_section_name (section
), (unsigned long) section
->sh_entsize
);
5052 if (section
->sh_size
> current_file_size
)
5054 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5055 printable_section_name (section
), (unsigned long) section
->sh_size
);
5059 number
= section
->sh_size
/ section
->sh_entsize
;
5061 if (number
* sizeof (Elf32_External_Sym
) > section
->sh_size
+ 1)
5063 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5064 (unsigned long) section
->sh_size
,
5065 printable_section_name (section
),
5066 (unsigned long) section
->sh_entsize
);
5070 esyms
= (Elf32_External_Sym
*) get_data (NULL
, file
, section
->sh_offset
, 1,
5071 section
->sh_size
, _("symbols"));
5076 elf_section_list
* entry
;
5079 for (entry
= symtab_shndx_list
; entry
!= NULL
; entry
= entry
->next
)
5080 if (entry
->hdr
->sh_link
== (unsigned long) (section
- section_headers
))
5082 shndx
= (Elf_External_Sym_Shndx
*) get_data (NULL
, file
,
5083 entry
->hdr
->sh_offset
,
5084 1, entry
->hdr
->sh_size
,
5085 _("symbol table section indicies"));
5088 /* PR17531: file: heap-buffer-overflow */
5089 else if (entry
->hdr
->sh_size
/ sizeof (Elf_External_Sym_Shndx
) < number
)
5091 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5092 printable_section_name (entry
->hdr
),
5093 (unsigned long) entry
->hdr
->sh_size
,
5094 (unsigned long) section
->sh_size
);
5100 isyms
= (Elf_Internal_Sym
*) cmalloc (number
, sizeof (Elf_Internal_Sym
));
5104 error (_("Out of memory reading %lu symbols\n"),
5105 (unsigned long) number
);
5109 for (j
= 0, psym
= isyms
; j
< number
; j
++, psym
++)
5111 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
5112 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
5113 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
5114 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
5115 if (psym
->st_shndx
== (SHN_XINDEX
& 0xffff) && shndx
!= NULL
)
5117 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
5118 else if (psym
->st_shndx
>= (SHN_LORESERVE
& 0xffff))
5119 psym
->st_shndx
+= SHN_LORESERVE
- (SHN_LORESERVE
& 0xffff);
5120 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
5121 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
5130 if (num_syms_return
!= NULL
)
5131 * num_syms_return
= isyms
== NULL
? 0 : number
;
5136 static Elf_Internal_Sym
*
5137 get_64bit_elf_symbols (FILE * file
,
5138 Elf_Internal_Shdr
* section
,
5139 unsigned long * num_syms_return
)
5141 unsigned long number
= 0;
5142 Elf64_External_Sym
* esyms
= NULL
;
5143 Elf_External_Sym_Shndx
* shndx
= NULL
;
5144 Elf_Internal_Sym
* isyms
= NULL
;
5145 Elf_Internal_Sym
* psym
;
5148 if (section
->sh_size
== 0)
5150 if (num_syms_return
!= NULL
)
5151 * num_syms_return
= 0;
5155 /* Run some sanity checks first. */
5156 if (section
->sh_entsize
== 0 || section
->sh_entsize
> section
->sh_size
)
5158 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5159 printable_section_name (section
),
5160 (unsigned long) section
->sh_entsize
);
5164 if (section
->sh_size
> current_file_size
)
5166 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5167 printable_section_name (section
),
5168 (unsigned long) section
->sh_size
);
5172 number
= section
->sh_size
/ section
->sh_entsize
;
5174 if (number
* sizeof (Elf64_External_Sym
) > section
->sh_size
+ 1)
5176 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5177 (unsigned long) section
->sh_size
,
5178 printable_section_name (section
),
5179 (unsigned long) section
->sh_entsize
);
5183 esyms
= (Elf64_External_Sym
*) get_data (NULL
, file
, section
->sh_offset
, 1,
5184 section
->sh_size
, _("symbols"));
5189 elf_section_list
* entry
;
5192 for (entry
= symtab_shndx_list
; entry
!= NULL
; entry
= entry
->next
)
5193 if (entry
->hdr
->sh_link
== (unsigned long) (section
- section_headers
))
5195 shndx
= (Elf_External_Sym_Shndx
*) get_data (NULL
, file
,
5196 entry
->hdr
->sh_offset
,
5197 1, entry
->hdr
->sh_size
,
5198 _("symbol table section indicies"));
5201 /* PR17531: file: heap-buffer-overflow */
5202 else if (entry
->hdr
->sh_size
/ sizeof (Elf_External_Sym_Shndx
) < number
)
5204 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5205 printable_section_name (entry
->hdr
),
5206 (unsigned long) entry
->hdr
->sh_size
,
5207 (unsigned long) section
->sh_size
);
5213 isyms
= (Elf_Internal_Sym
*) cmalloc (number
, sizeof (Elf_Internal_Sym
));
5217 error (_("Out of memory reading %lu symbols\n"),
5218 (unsigned long) number
);
5222 for (j
= 0, psym
= isyms
; j
< number
; j
++, psym
++)
5224 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
5225 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
5226 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
5227 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
5229 if (psym
->st_shndx
== (SHN_XINDEX
& 0xffff) && shndx
!= NULL
)
5231 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
5232 else if (psym
->st_shndx
>= (SHN_LORESERVE
& 0xffff))
5233 psym
->st_shndx
+= SHN_LORESERVE
- (SHN_LORESERVE
& 0xffff);
5235 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
5236 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
5245 if (num_syms_return
!= NULL
)
5246 * num_syms_return
= isyms
== NULL
? 0 : number
;
5252 get_elf_section_flags (bfd_vma sh_flags
)
5254 static char buff
[1024];
5256 int field_size
= is_32bit_elf
? 8 : 16;
5258 int size
= sizeof (buff
) - (field_size
+ 4 + 1);
5259 bfd_vma os_flags
= 0;
5260 bfd_vma proc_flags
= 0;
5261 bfd_vma unknown_flags
= 0;
5269 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5270 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5271 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5272 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5273 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5274 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5275 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5276 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5277 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5278 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5279 /* IA-64 specific. */
5280 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5281 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5282 /* IA-64 OpenVMS specific. */
5283 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5284 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5285 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5286 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5287 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5288 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5290 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5291 /* SPARC specific. */
5292 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5293 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5295 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5296 /* 22 */ { STRING_COMMA_LEN ("ARM_NOREAD") },
5297 /* 23 */ { STRING_COMMA_LEN ("COMDEF") }
5300 if (do_section_details
)
5302 sprintf (buff
, "[%*.*lx]: ",
5303 field_size
, field_size
, (unsigned long) sh_flags
);
5304 p
+= field_size
+ 4;
5311 flag
= sh_flags
& - sh_flags
;
5314 if (do_section_details
)
5318 case SHF_WRITE
: sindex
= 0; break;
5319 case SHF_ALLOC
: sindex
= 1; break;
5320 case SHF_EXECINSTR
: sindex
= 2; break;
5321 case SHF_MERGE
: sindex
= 3; break;
5322 case SHF_STRINGS
: sindex
= 4; break;
5323 case SHF_INFO_LINK
: sindex
= 5; break;
5324 case SHF_LINK_ORDER
: sindex
= 6; break;
5325 case SHF_OS_NONCONFORMING
: sindex
= 7; break;
5326 case SHF_GROUP
: sindex
= 8; break;
5327 case SHF_TLS
: sindex
= 9; break;
5328 case SHF_EXCLUDE
: sindex
= 18; break;
5329 case SHF_COMPRESSED
: sindex
= 20; break;
5333 switch (elf_header
.e_machine
)
5336 if (flag
== SHF_IA_64_SHORT
)
5338 else if (flag
== SHF_IA_64_NORECOV
)
5341 else if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_OPENVMS
)
5344 case SHF_IA_64_VMS_GLOBAL
: sindex
= 12; break;
5345 case SHF_IA_64_VMS_OVERLAID
: sindex
= 13; break;
5346 case SHF_IA_64_VMS_SHARED
: sindex
= 14; break;
5347 case SHF_IA_64_VMS_VECTOR
: sindex
= 15; break;
5348 case SHF_IA_64_VMS_ALLOC_64BIT
: sindex
= 16; break;
5349 case SHF_IA_64_VMS_PROTECTED
: sindex
= 17; break;
5360 case EM_OLD_SPARCV9
:
5361 case EM_SPARC32PLUS
:
5364 if (flag
== SHF_ORDERED
)
5371 case SHF_ENTRYSECT
: sindex
= 21; break;
5372 case SHF_ARM_NOREAD
: sindex
= 22; break;
5373 case SHF_COMDEF
: sindex
= 23; break;
5385 if (p
!= buff
+ field_size
+ 4)
5387 if (size
< (10 + 2))
5389 warn (_("Internal error: not enough buffer room for section flag info"));
5390 return _("<unknown>");
5397 size
-= flags
[sindex
].len
;
5398 p
= stpcpy (p
, flags
[sindex
].str
);
5400 else if (flag
& SHF_MASKOS
)
5402 else if (flag
& SHF_MASKPROC
)
5405 unknown_flags
|= flag
;
5411 case SHF_WRITE
: *p
= 'W'; break;
5412 case SHF_ALLOC
: *p
= 'A'; break;
5413 case SHF_EXECINSTR
: *p
= 'X'; break;
5414 case SHF_MERGE
: *p
= 'M'; break;
5415 case SHF_STRINGS
: *p
= 'S'; break;
5416 case SHF_INFO_LINK
: *p
= 'I'; break;
5417 case SHF_LINK_ORDER
: *p
= 'L'; break;
5418 case SHF_OS_NONCONFORMING
: *p
= 'O'; break;
5419 case SHF_GROUP
: *p
= 'G'; break;
5420 case SHF_TLS
: *p
= 'T'; break;
5421 case SHF_EXCLUDE
: *p
= 'E'; break;
5422 case SHF_COMPRESSED
: *p
= 'C'; break;
5425 if ((elf_header
.e_machine
== EM_X86_64
5426 || elf_header
.e_machine
== EM_L1OM
5427 || elf_header
.e_machine
== EM_K1OM
)
5428 && flag
== SHF_X86_64_LARGE
)
5430 else if (elf_header
.e_machine
== EM_ARM
5431 && flag
== SHF_ARM_NOREAD
)
5433 else if (flag
& SHF_MASKOS
)
5436 sh_flags
&= ~ SHF_MASKOS
;
5438 else if (flag
& SHF_MASKPROC
)
5441 sh_flags
&= ~ SHF_MASKPROC
;
5451 if (do_section_details
)
5455 size
-= 5 + field_size
;
5456 if (p
!= buff
+ field_size
+ 4)
5460 warn (_("Internal error: not enough buffer room for section flag info"));
5461 return _("<unknown>");
5467 sprintf (p
, "OS (%*.*lx)", field_size
, field_size
,
5468 (unsigned long) os_flags
);
5469 p
+= 5 + field_size
;
5473 size
-= 7 + field_size
;
5474 if (p
!= buff
+ field_size
+ 4)
5478 warn (_("Internal error: not enough buffer room for section flag info"));
5479 return _("<unknown>");
5485 sprintf (p
, "PROC (%*.*lx)", field_size
, field_size
,
5486 (unsigned long) proc_flags
);
5487 p
+= 7 + field_size
;
5491 size
-= 10 + field_size
;
5492 if (p
!= buff
+ field_size
+ 4)
5496 warn (_("Internal error: not enough buffer room for section flag info"));
5497 return _("<unknown>");
5503 sprintf (p
, _("UNKNOWN (%*.*lx)"), field_size
, field_size
,
5504 (unsigned long) unknown_flags
);
5505 p
+= 10 + field_size
;
5514 get_compression_header (Elf_Internal_Chdr
*chdr
, unsigned char *buf
)
5518 Elf32_External_Chdr
*echdr
= (Elf32_External_Chdr
*) buf
;
5519 chdr
->ch_type
= BYTE_GET (echdr
->ch_type
);
5520 chdr
->ch_size
= BYTE_GET (echdr
->ch_size
);
5521 chdr
->ch_addralign
= BYTE_GET (echdr
->ch_addralign
);
5522 return sizeof (*echdr
);
5526 Elf64_External_Chdr
*echdr
= (Elf64_External_Chdr
*) buf
;
5527 chdr
->ch_type
= BYTE_GET (echdr
->ch_type
);
5528 chdr
->ch_size
= BYTE_GET (echdr
->ch_size
);
5529 chdr
->ch_addralign
= BYTE_GET (echdr
->ch_addralign
);
5530 return sizeof (*echdr
);
5535 process_section_headers (FILE * file
)
5537 Elf_Internal_Shdr
* section
;
5540 section_headers
= NULL
;
5542 if (elf_header
.e_shnum
== 0)
5544 /* PR binutils/12467. */
5545 if (elf_header
.e_shoff
!= 0)
5546 warn (_("possibly corrupt ELF file header - it has a non-zero"
5547 " section header offset, but no section headers\n"));
5548 else if (do_sections
)
5549 printf (_("\nThere are no sections in this file.\n"));
5554 if (do_sections
&& !do_header
)
5555 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5556 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
5560 if (! get_32bit_section_headers (file
, FALSE
))
5563 else if (! get_64bit_section_headers (file
, FALSE
))
5566 /* Read in the string table, so that we have names to display. */
5567 if (elf_header
.e_shstrndx
!= SHN_UNDEF
5568 && elf_header
.e_shstrndx
< elf_header
.e_shnum
)
5570 section
= section_headers
+ elf_header
.e_shstrndx
;
5572 if (section
->sh_size
!= 0)
5574 string_table
= (char *) get_data (NULL
, file
, section
->sh_offset
,
5575 1, section
->sh_size
,
5578 string_table_length
= string_table
!= NULL
? section
->sh_size
: 0;
5582 /* Scan the sections for the dynamic symbol table
5583 and dynamic string table and debug sections. */
5584 dynamic_symbols
= NULL
;
5585 dynamic_strings
= NULL
;
5586 dynamic_syminfo
= NULL
;
5587 symtab_shndx_list
= NULL
;
5589 eh_addr_size
= is_32bit_elf
? 4 : 8;
5590 switch (elf_header
.e_machine
)
5593 case EM_MIPS_RS3_LE
:
5594 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5595 FDE addresses. However, the ABI also has a semi-official ILP32
5596 variant for which the normal FDE address size rules apply.
5598 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5599 section, where XX is the size of longs in bits. Unfortunately,
5600 earlier compilers provided no way of distinguishing ILP32 objects
5601 from LP64 objects, so if there's any doubt, we should assume that
5602 the official LP64 form is being used. */
5603 if ((elf_header
.e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
5604 && find_section (".gcc_compiled_long32") == NULL
)
5610 switch (elf_header
.e_flags
& EF_H8_MACH
)
5612 case E_H8_MACH_H8300
:
5613 case E_H8_MACH_H8300HN
:
5614 case E_H8_MACH_H8300SN
:
5615 case E_H8_MACH_H8300SXN
:
5618 case E_H8_MACH_H8300H
:
5619 case E_H8_MACH_H8300S
:
5620 case E_H8_MACH_H8300SX
:
5628 switch (elf_header
.e_flags
& EF_M32C_CPU_MASK
)
5630 case EF_M32C_CPU_M16C
:
5637 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
5640 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
5641 if (section->sh_entsize != expected_entsize) \
5644 sprintf_vma (buf, section->sh_entsize); \
5645 /* Note: coded this way so that there is a single string for \
5647 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5648 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5649 (unsigned) expected_entsize); \
5650 section->sh_entsize = expected_entsize; \
5655 #define CHECK_ENTSIZE(section, i, type) \
5656 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
5657 sizeof (Elf64_External_##type))
5659 for (i
= 0, section
= section_headers
;
5660 i
< elf_header
.e_shnum
;
5663 char * name
= SECTION_NAME (section
);
5665 if (section
->sh_type
== SHT_DYNSYM
)
5667 if (dynamic_symbols
!= NULL
)
5669 error (_("File contains multiple dynamic symbol tables\n"));
5673 CHECK_ENTSIZE (section
, i
, Sym
);
5674 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
, & num_dynamic_syms
);
5676 else if (section
->sh_type
== SHT_STRTAB
5677 && streq (name
, ".dynstr"))
5679 if (dynamic_strings
!= NULL
)
5681 error (_("File contains multiple dynamic string tables\n"));
5685 dynamic_strings
= (char *) get_data (NULL
, file
, section
->sh_offset
,
5686 1, section
->sh_size
,
5687 _("dynamic strings"));
5688 dynamic_strings_length
= dynamic_strings
== NULL
? 0 : section
->sh_size
;
5690 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
5692 elf_section_list
* entry
= xmalloc (sizeof * entry
);
5693 entry
->hdr
= section
;
5694 entry
->next
= symtab_shndx_list
;
5695 symtab_shndx_list
= entry
;
5697 else if (section
->sh_type
== SHT_SYMTAB
)
5698 CHECK_ENTSIZE (section
, i
, Sym
);
5699 else if (section
->sh_type
== SHT_GROUP
)
5700 CHECK_ENTSIZE_VALUES (section
, i
, GRP_ENTRY_SIZE
, GRP_ENTRY_SIZE
);
5701 else if (section
->sh_type
== SHT_REL
)
5702 CHECK_ENTSIZE (section
, i
, Rel
);
5703 else if (section
->sh_type
== SHT_RELA
)
5704 CHECK_ENTSIZE (section
, i
, Rela
);
5705 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
5706 || do_debug_lines
|| do_debug_pubnames
|| do_debug_pubtypes
5707 || do_debug_aranges
|| do_debug_frames
|| do_debug_macinfo
5708 || do_debug_str
|| do_debug_loc
|| do_debug_ranges
5709 || do_debug_addr
|| do_debug_cu_index
)
5710 && (const_strneq (name
, ".debug_")
5711 || const_strneq (name
, ".zdebug_")))
5714 name
+= sizeof (".zdebug_") - 1;
5716 name
+= sizeof (".debug_") - 1;
5719 || (do_debug_info
&& const_strneq (name
, "info"))
5720 || (do_debug_info
&& const_strneq (name
, "types"))
5721 || (do_debug_abbrevs
&& const_strneq (name
, "abbrev"))
5722 || (do_debug_lines
&& strcmp (name
, "line") == 0)
5723 || (do_debug_lines
&& const_strneq (name
, "line."))
5724 || (do_debug_pubnames
&& const_strneq (name
, "pubnames"))
5725 || (do_debug_pubtypes
&& const_strneq (name
, "pubtypes"))
5726 || (do_debug_pubnames
&& const_strneq (name
, "gnu_pubnames"))
5727 || (do_debug_pubtypes
&& const_strneq (name
, "gnu_pubtypes"))
5728 || (do_debug_aranges
&& const_strneq (name
, "aranges"))
5729 || (do_debug_ranges
&& const_strneq (name
, "ranges"))
5730 || (do_debug_frames
&& const_strneq (name
, "frame"))
5731 || (do_debug_macinfo
&& const_strneq (name
, "macinfo"))
5732 || (do_debug_macinfo
&& const_strneq (name
, "macro"))
5733 || (do_debug_str
&& const_strneq (name
, "str"))
5734 || (do_debug_loc
&& const_strneq (name
, "loc"))
5735 || (do_debug_addr
&& const_strneq (name
, "addr"))
5736 || (do_debug_cu_index
&& const_strneq (name
, "cu_index"))
5737 || (do_debug_cu_index
&& const_strneq (name
, "tu_index"))
5739 request_dump_bynumber (i
, DEBUG_DUMP
);
5741 /* Linkonce section to be combined with .debug_info at link time. */
5742 else if ((do_debugging
|| do_debug_info
)
5743 && const_strneq (name
, ".gnu.linkonce.wi."))
5744 request_dump_bynumber (i
, DEBUG_DUMP
);
5745 else if (do_debug_frames
&& streq (name
, ".eh_frame"))
5746 request_dump_bynumber (i
, DEBUG_DUMP
);
5747 else if (do_gdb_index
&& streq (name
, ".gdb_index"))
5748 request_dump_bynumber (i
, DEBUG_DUMP
);
5749 /* Trace sections for Itanium VMS. */
5750 else if ((do_debugging
|| do_trace_info
|| do_trace_abbrevs
5751 || do_trace_aranges
)
5752 && const_strneq (name
, ".trace_"))
5754 name
+= sizeof (".trace_") - 1;
5757 || (do_trace_info
&& streq (name
, "info"))
5758 || (do_trace_abbrevs
&& streq (name
, "abbrev"))
5759 || (do_trace_aranges
&& streq (name
, "aranges"))
5761 request_dump_bynumber (i
, DEBUG_DUMP
);
5768 if (elf_header
.e_shnum
> 1)
5769 printf (_("\nSection Headers:\n"));
5771 printf (_("\nSection Header:\n"));
5775 if (do_section_details
)
5777 printf (_(" [Nr] Name\n"));
5778 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
5782 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
5786 if (do_section_details
)
5788 printf (_(" [Nr] Name\n"));
5789 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
5793 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
5797 if (do_section_details
)
5799 printf (_(" [Nr] Name\n"));
5800 printf (_(" Type Address Offset Link\n"));
5801 printf (_(" Size EntSize Info Align\n"));
5805 printf (_(" [Nr] Name Type Address Offset\n"));
5806 printf (_(" Size EntSize Flags Link Info Align\n"));
5810 if (do_section_details
)
5811 printf (_(" Flags\n"));
5813 for (i
= 0, section
= section_headers
;
5814 i
< elf_header
.e_shnum
;
5817 printf (" [%2u] ", i
);
5818 if (do_section_details
)
5819 printf ("%s\n ", printable_section_name (section
));
5821 print_symbol (-17, SECTION_NAME (section
));
5823 printf (do_wide
? " %-15s " : " %-15.15s ",
5824 get_section_type_name (section
->sh_type
));
5828 const char * link_too_big
= NULL
;
5830 print_vma (section
->sh_addr
, LONG_HEX
);
5832 printf ( " %6.6lx %6.6lx %2.2lx",
5833 (unsigned long) section
->sh_offset
,
5834 (unsigned long) section
->sh_size
,
5835 (unsigned long) section
->sh_entsize
);
5837 if (do_section_details
)
5838 fputs (" ", stdout
);
5840 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
5842 if (section
->sh_link
>= elf_header
.e_shnum
)
5845 /* The sh_link value is out of range. Normally this indicates
5846 an error but it can have special values in Solaris binaries. */
5847 switch (elf_header
.e_machine
)
5854 case EM_OLD_SPARCV9
:
5855 case EM_SPARC32PLUS
:
5858 if (section
->sh_link
== (SHN_BEFORE
& 0xffff))
5859 link_too_big
= "BEFORE";
5860 else if (section
->sh_link
== (SHN_AFTER
& 0xffff))
5861 link_too_big
= "AFTER";
5868 if (do_section_details
)
5870 if (link_too_big
!= NULL
&& * link_too_big
)
5871 printf ("<%s> ", link_too_big
);
5873 printf ("%2u ", section
->sh_link
);
5874 printf ("%3u %2lu\n", section
->sh_info
,
5875 (unsigned long) section
->sh_addralign
);
5878 printf ("%2u %3u %2lu\n",
5881 (unsigned long) section
->sh_addralign
);
5883 if (link_too_big
&& ! * link_too_big
)
5884 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5885 i
, section
->sh_link
);
5889 print_vma (section
->sh_addr
, LONG_HEX
);
5891 if ((long) section
->sh_offset
== section
->sh_offset
)
5892 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
5896 print_vma (section
->sh_offset
, LONG_HEX
);
5899 if ((unsigned long) section
->sh_size
== section
->sh_size
)
5900 printf (" %6.6lx", (unsigned long) section
->sh_size
);
5904 print_vma (section
->sh_size
, LONG_HEX
);
5907 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
5908 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
5912 print_vma (section
->sh_entsize
, LONG_HEX
);
5915 if (do_section_details
)
5916 fputs (" ", stdout
);
5918 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
5920 printf ("%2u %3u ", section
->sh_link
, section
->sh_info
);
5922 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
5923 printf ("%2lu\n", (unsigned long) section
->sh_addralign
);
5926 print_vma (section
->sh_addralign
, DEC
);
5930 else if (do_section_details
)
5932 printf (" %-15.15s ",
5933 get_section_type_name (section
->sh_type
));
5934 print_vma (section
->sh_addr
, LONG_HEX
);
5935 if ((long) section
->sh_offset
== section
->sh_offset
)
5936 printf (" %16.16lx", (unsigned long) section
->sh_offset
);
5940 print_vma (section
->sh_offset
, LONG_HEX
);
5942 printf (" %u\n ", section
->sh_link
);
5943 print_vma (section
->sh_size
, LONG_HEX
);
5945 print_vma (section
->sh_entsize
, LONG_HEX
);
5947 printf (" %-16u %lu\n",
5949 (unsigned long) section
->sh_addralign
);
5954 print_vma (section
->sh_addr
, LONG_HEX
);
5955 if ((long) section
->sh_offset
== section
->sh_offset
)
5956 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
5960 print_vma (section
->sh_offset
, LONG_HEX
);
5963 print_vma (section
->sh_size
, LONG_HEX
);
5965 print_vma (section
->sh_entsize
, LONG_HEX
);
5967 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
5969 printf (" %2u %3u %lu\n",
5972 (unsigned long) section
->sh_addralign
);
5975 if (do_section_details
)
5977 printf (" %s\n", get_elf_section_flags (section
->sh_flags
));
5978 if ((section
->sh_flags
& SHF_COMPRESSED
) != 0)
5980 /* Minimum section size is 12 bytes for 32-bit compression
5981 header + 12 bytes for compressed data header. */
5982 unsigned char buf
[24];
5983 assert (sizeof (buf
) >= sizeof (Elf64_External_Chdr
));
5984 if (get_data (&buf
, (FILE *) file
, section
->sh_offset
, 1,
5985 sizeof (buf
), _("compression header")))
5987 Elf_Internal_Chdr chdr
;
5988 get_compression_header (&chdr
, buf
);
5989 if (chdr
.ch_type
== ELFCOMPRESS_ZLIB
)
5992 printf (_(" [<unknown>: 0x%x], "),
5994 print_vma (chdr
.ch_size
, LONG_HEX
);
5995 printf (", %lu\n", (unsigned long) chdr
.ch_addralign
);
6001 if (!do_section_details
)
6003 /* The ordering of the letters shown here matches the ordering of the
6004 corresponding SHF_xxx values, and hence the order in which these
6005 letters will be displayed to the user. */
6006 printf (_("Key to Flags:\n\
6007 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6008 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6009 C (compressed), x (unknown), o (OS specific), E (exclude),\n"));
6010 if (elf_header
.e_machine
== EM_X86_64
6011 || elf_header
.e_machine
== EM_L1OM
6012 || elf_header
.e_machine
== EM_K1OM
)
6013 printf (_("l (large), "));
6014 else if (elf_header
.e_machine
== EM_ARM
)
6015 printf (_("y (noread), "));
6016 printf ("p (processor specific)\n");
6023 get_group_flags (unsigned int flags
)
6025 static char buff
[32];
6035 snprintf (buff
, sizeof (buff
), _("[<unknown>: 0x%x] "), flags
);
6042 process_section_groups (FILE * file
)
6044 Elf_Internal_Shdr
* section
;
6046 struct group
* group
;
6047 Elf_Internal_Shdr
* symtab_sec
;
6048 Elf_Internal_Shdr
* strtab_sec
;
6049 Elf_Internal_Sym
* symtab
;
6050 unsigned long num_syms
;
6054 /* Don't process section groups unless needed. */
6055 if (!do_unwind
&& !do_section_groups
)
6058 if (elf_header
.e_shnum
== 0)
6060 if (do_section_groups
)
6061 printf (_("\nThere are no sections to group in this file.\n"));
6066 if (section_headers
== NULL
)
6068 error (_("Section headers are not available!\n"));
6069 /* PR 13622: This can happen with a corrupt ELF header. */
6073 section_headers_groups
= (struct group
**) calloc (elf_header
.e_shnum
,
6074 sizeof (struct group
*));
6076 if (section_headers_groups
== NULL
)
6078 error (_("Out of memory reading %u section group headers\n"),
6079 elf_header
.e_shnum
);
6083 /* Scan the sections for the group section. */
6085 for (i
= 0, section
= section_headers
;
6086 i
< elf_header
.e_shnum
;
6088 if (section
->sh_type
== SHT_GROUP
)
6091 if (group_count
== 0)
6093 if (do_section_groups
)
6094 printf (_("\nThere are no section groups in this file.\n"));
6099 section_groups
= (struct group
*) calloc (group_count
, sizeof (struct group
));
6101 if (section_groups
== NULL
)
6103 error (_("Out of memory reading %lu groups\n"),
6104 (unsigned long) group_count
);
6114 for (i
= 0, section
= section_headers
, group
= section_groups
;
6115 i
< elf_header
.e_shnum
;
6118 if (section
->sh_type
== SHT_GROUP
)
6120 const char * name
= printable_section_name (section
);
6121 const char * group_name
;
6122 unsigned char * start
;
6123 unsigned char * indices
;
6124 unsigned int entry
, j
, size
;
6125 Elf_Internal_Shdr
* sec
;
6126 Elf_Internal_Sym
* sym
;
6128 /* Get the symbol table. */
6129 if (section
->sh_link
>= elf_header
.e_shnum
6130 || ((sec
= section_headers
+ section
->sh_link
)->sh_type
6133 error (_("Bad sh_link in group section `%s'\n"), name
);
6137 if (symtab_sec
!= sec
)
6142 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
, & num_syms
);
6147 error (_("Corrupt header in group section `%s'\n"), name
);
6151 if (section
->sh_info
>= num_syms
)
6153 error (_("Bad sh_info in group section `%s'\n"), name
);
6157 sym
= symtab
+ section
->sh_info
;
6159 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
6161 if (sym
->st_shndx
== 0
6162 || sym
->st_shndx
>= elf_header
.e_shnum
)
6164 error (_("Bad sh_info in group section `%s'\n"), name
);
6168 group_name
= SECTION_NAME (section_headers
+ sym
->st_shndx
);
6177 /* Get the string table. */
6178 if (symtab_sec
->sh_link
>= elf_header
.e_shnum
)
6187 != (sec
= section_headers
+ symtab_sec
->sh_link
))
6193 strtab
= (char *) get_data (NULL
, file
, strtab_sec
->sh_offset
,
6194 1, strtab_sec
->sh_size
,
6196 strtab_size
= strtab
!= NULL
? strtab_sec
->sh_size
: 0;
6198 group_name
= sym
->st_name
< strtab_size
6199 ? strtab
+ sym
->st_name
: _("<corrupt>");
6202 /* PR 17531: file: loop. */
6203 if (section
->sh_entsize
> section
->sh_size
)
6205 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6206 printable_section_name (section
),
6207 (unsigned long) section
->sh_entsize
,
6208 (unsigned long) section
->sh_size
);
6212 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
,
6213 1, section
->sh_size
,
6219 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
6220 entry
= byte_get (indices
, 4);
6223 if (do_section_groups
)
6225 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6226 get_group_flags (entry
), i
, name
, group_name
, size
);
6228 printf (_(" [Index] Name\n"));
6231 group
->group_index
= i
;
6233 for (j
= 0; j
< size
; j
++)
6235 struct group_list
* g
;
6237 entry
= byte_get (indices
, 4);
6240 if (entry
>= elf_header
.e_shnum
)
6242 static unsigned num_group_errors
= 0;
6244 if (num_group_errors
++ < 10)
6246 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6247 entry
, i
, elf_header
.e_shnum
- 1);
6248 if (num_group_errors
== 10)
6249 warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6254 if (section_headers_groups
[entry
] != NULL
)
6258 static unsigned num_errs
= 0;
6260 if (num_errs
++ < 10)
6262 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6264 section_headers_groups
[entry
]->group_index
);
6266 warn (_("Further error messages about already contained group sections suppressed\n"));
6272 /* Intel C/C++ compiler may put section 0 in a
6273 section group. We just warn it the first time
6274 and ignore it afterwards. */
6275 static int warned
= 0;
6278 error (_("section 0 in group section [%5u]\n"),
6279 section_headers_groups
[entry
]->group_index
);
6285 section_headers_groups
[entry
] = group
;
6287 if (do_section_groups
)
6289 sec
= section_headers
+ entry
;
6290 printf (" [%5u] %s\n", entry
, printable_section_name (sec
));
6293 g
= (struct group_list
*) xmalloc (sizeof (struct group_list
));
6294 g
->section_index
= entry
;
6295 g
->next
= group
->root
;
6313 /* Data used to display dynamic fixups. */
6315 struct ia64_vms_dynfixup
6317 bfd_vma needed_ident
; /* Library ident number. */
6318 bfd_vma needed
; /* Index in the dstrtab of the library name. */
6319 bfd_vma fixup_needed
; /* Index of the library. */
6320 bfd_vma fixup_rela_cnt
; /* Number of fixups. */
6321 bfd_vma fixup_rela_off
; /* Fixups offset in the dynamic segment. */
6324 /* Data used to display dynamic relocations. */
6326 struct ia64_vms_dynimgrela
6328 bfd_vma img_rela_cnt
; /* Number of relocations. */
6329 bfd_vma img_rela_off
; /* Reloc offset in the dynamic segment. */
6332 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6336 dump_ia64_vms_dynamic_fixups (FILE *file
, struct ia64_vms_dynfixup
*fixup
,
6337 const char *strtab
, unsigned int strtab_sz
)
6339 Elf64_External_VMS_IMAGE_FIXUP
*imfs
;
6341 const char *lib_name
;
6343 imfs
= get_data (NULL
, file
, dynamic_addr
+ fixup
->fixup_rela_off
,
6344 1, fixup
->fixup_rela_cnt
* sizeof (*imfs
),
6345 _("dynamic section image fixups"));
6349 if (fixup
->needed
< strtab_sz
)
6350 lib_name
= strtab
+ fixup
->needed
;
6353 warn ("corrupt library name index of 0x%lx found in dynamic entry",
6354 (unsigned long) fixup
->needed
);
6357 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6358 (int) fixup
->fixup_needed
, lib_name
, (long) fixup
->needed_ident
);
6360 (_("Seg Offset Type SymVec DataType\n"));
6362 for (i
= 0; i
< (long) fixup
->fixup_rela_cnt
; i
++)
6367 printf ("%3u ", (unsigned) BYTE_GET (imfs
[i
].fixup_seg
));
6368 printf_vma ((bfd_vma
) BYTE_GET (imfs
[i
].fixup_offset
));
6369 type
= BYTE_GET (imfs
[i
].type
);
6370 rtype
= elf_ia64_reloc_type (type
);
6372 printf (" 0x%08x ", type
);
6374 printf (" %-32s ", rtype
);
6375 printf ("%6u ", (unsigned) BYTE_GET (imfs
[i
].symvec_index
));
6376 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs
[i
].data_type
));
6382 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6385 dump_ia64_vms_dynamic_relocs (FILE *file
, struct ia64_vms_dynimgrela
*imgrela
)
6387 Elf64_External_VMS_IMAGE_RELA
*imrs
;
6390 imrs
= get_data (NULL
, file
, dynamic_addr
+ imgrela
->img_rela_off
,
6391 1, imgrela
->img_rela_cnt
* sizeof (*imrs
),
6392 _("dynamic section image relocations"));
6396 printf (_("\nImage relocs\n"));
6398 (_("Seg Offset Type Addend Seg Sym Off\n"));
6400 for (i
= 0; i
< (long) imgrela
->img_rela_cnt
; i
++)
6405 printf ("%3u ", (unsigned) BYTE_GET (imrs
[i
].rela_seg
));
6406 printf ("%08" BFD_VMA_FMT
"x ",
6407 (bfd_vma
) BYTE_GET (imrs
[i
].rela_offset
));
6408 type
= BYTE_GET (imrs
[i
].type
);
6409 rtype
= elf_ia64_reloc_type (type
);
6411 printf ("0x%08x ", type
);
6413 printf ("%-31s ", rtype
);
6414 print_vma (BYTE_GET (imrs
[i
].addend
), FULL_HEX
);
6415 printf ("%3u ", (unsigned) BYTE_GET (imrs
[i
].sym_seg
));
6416 printf ("%08" BFD_VMA_FMT
"x\n",
6417 (bfd_vma
) BYTE_GET (imrs
[i
].sym_offset
));
6423 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
6426 process_ia64_vms_dynamic_relocs (FILE *file
)
6428 struct ia64_vms_dynfixup fixup
;
6429 struct ia64_vms_dynimgrela imgrela
;
6430 Elf_Internal_Dyn
*entry
;
6432 bfd_vma strtab_off
= 0;
6433 bfd_vma strtab_sz
= 0;
6434 char *strtab
= NULL
;
6436 memset (&fixup
, 0, sizeof (fixup
));
6437 memset (&imgrela
, 0, sizeof (imgrela
));
6439 /* Note: the order of the entries is specified by the OpenVMS specs. */
6440 for (entry
= dynamic_section
;
6441 entry
< dynamic_section
+ dynamic_nent
;
6444 switch (entry
->d_tag
)
6446 case DT_IA_64_VMS_STRTAB_OFFSET
:
6447 strtab_off
= entry
->d_un
.d_val
;
6450 strtab_sz
= entry
->d_un
.d_val
;
6452 strtab
= get_data (NULL
, file
, dynamic_addr
+ strtab_off
,
6453 1, strtab_sz
, _("dynamic string section"));
6456 case DT_IA_64_VMS_NEEDED_IDENT
:
6457 fixup
.needed_ident
= entry
->d_un
.d_val
;
6460 fixup
.needed
= entry
->d_un
.d_val
;
6462 case DT_IA_64_VMS_FIXUP_NEEDED
:
6463 fixup
.fixup_needed
= entry
->d_un
.d_val
;
6465 case DT_IA_64_VMS_FIXUP_RELA_CNT
:
6466 fixup
.fixup_rela_cnt
= entry
->d_un
.d_val
;
6468 case DT_IA_64_VMS_FIXUP_RELA_OFF
:
6469 fixup
.fixup_rela_off
= entry
->d_un
.d_val
;
6471 dump_ia64_vms_dynamic_fixups (file
, &fixup
, strtab
, strtab_sz
);
6474 case DT_IA_64_VMS_IMG_RELA_CNT
:
6475 imgrela
.img_rela_cnt
= entry
->d_un
.d_val
;
6477 case DT_IA_64_VMS_IMG_RELA_OFF
:
6478 imgrela
.img_rela_off
= entry
->d_un
.d_val
;
6480 dump_ia64_vms_dynamic_relocs (file
, &imgrela
);
6500 } dynamic_relocations
[] =
6502 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
6503 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
6504 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
6507 /* Process the reloc section. */
6510 process_relocs (FILE * file
)
6512 unsigned long rel_size
;
6513 unsigned long rel_offset
;
6519 if (do_using_dynamic
)
6523 int has_dynamic_reloc
;
6526 has_dynamic_reloc
= 0;
6528 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
6530 is_rela
= dynamic_relocations
[i
].rela
;
6531 name
= dynamic_relocations
[i
].name
;
6532 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
6533 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
6535 has_dynamic_reloc
|= rel_size
;
6537 if (is_rela
== UNKNOWN
)
6539 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
6540 switch (dynamic_info
[DT_PLTREL
])
6554 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6555 name
, rel_offset
, rel_size
);
6557 dump_relocations (file
,
6558 offset_from_vma (file
, rel_offset
, rel_size
),
6560 dynamic_symbols
, num_dynamic_syms
,
6561 dynamic_strings
, dynamic_strings_length
,
6567 has_dynamic_reloc
|= process_ia64_vms_dynamic_relocs (file
);
6569 if (! has_dynamic_reloc
)
6570 printf (_("\nThere are no dynamic relocations in this file.\n"));
6574 Elf_Internal_Shdr
* section
;
6578 for (i
= 0, section
= section_headers
;
6579 i
< elf_header
.e_shnum
;
6582 if ( section
->sh_type
!= SHT_RELA
6583 && section
->sh_type
!= SHT_REL
)
6586 rel_offset
= section
->sh_offset
;
6587 rel_size
= section
->sh_size
;
6591 Elf_Internal_Shdr
* strsec
;
6594 printf (_("\nRelocation section "));
6596 if (string_table
== NULL
)
6597 printf ("%d", section
->sh_name
);
6599 printf ("'%s'", printable_section_name (section
));
6601 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6602 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
6604 is_rela
= section
->sh_type
== SHT_RELA
;
6606 if (section
->sh_link
!= 0
6607 && section
->sh_link
< elf_header
.e_shnum
)
6609 Elf_Internal_Shdr
* symsec
;
6610 Elf_Internal_Sym
* symtab
;
6611 unsigned long nsyms
;
6612 unsigned long strtablen
= 0;
6613 char * strtab
= NULL
;
6615 symsec
= section_headers
+ section
->sh_link
;
6616 if (symsec
->sh_type
!= SHT_SYMTAB
6617 && symsec
->sh_type
!= SHT_DYNSYM
)
6620 symtab
= GET_ELF_SYMBOLS (file
, symsec
, & nsyms
);
6625 if (symsec
->sh_link
!= 0
6626 && symsec
->sh_link
< elf_header
.e_shnum
)
6628 strsec
= section_headers
+ symsec
->sh_link
;
6630 strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
6633 strtablen
= strtab
== NULL
? 0 : strsec
->sh_size
;
6636 dump_relocations (file
, rel_offset
, rel_size
,
6637 symtab
, nsyms
, strtab
, strtablen
,
6639 symsec
->sh_type
== SHT_DYNSYM
);
6645 dump_relocations (file
, rel_offset
, rel_size
,
6646 NULL
, 0, NULL
, 0, is_rela
, 0);
6653 printf (_("\nThere are no relocations in this file.\n"));
6659 /* An absolute address consists of a section and an offset. If the
6660 section is NULL, the offset itself is the address, otherwise, the
6661 address equals to LOAD_ADDRESS(section) + offset. */
6665 unsigned short section
;
6669 #define ABSADDR(a) \
6671 ? section_headers [(a).section].sh_addr + (a).offset \
6674 /* Find the nearest symbol at or below ADDR. Returns the symbol
6675 name, if found, and the offset from the symbol to ADDR. */
6678 find_symbol_for_address (Elf_Internal_Sym
* symtab
,
6679 unsigned long nsyms
,
6680 const char * strtab
,
6681 unsigned long strtab_size
,
6682 struct absaddr addr
,
6683 const char ** symname
,
6686 bfd_vma dist
= 0x100000;
6687 Elf_Internal_Sym
* sym
;
6688 Elf_Internal_Sym
* beg
;
6689 Elf_Internal_Sym
* end
;
6690 Elf_Internal_Sym
* best
= NULL
;
6692 REMOVE_ARCH_BITS (addr
.offset
);
6694 end
= symtab
+ nsyms
;
6700 sym
= beg
+ (end
- beg
) / 2;
6702 value
= sym
->st_value
;
6703 REMOVE_ARCH_BITS (value
);
6705 if (sym
->st_name
!= 0
6706 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
6707 && addr
.offset
>= value
6708 && addr
.offset
- value
< dist
)
6711 dist
= addr
.offset
- value
;
6716 if (addr
.offset
< value
)
6724 *symname
= (best
->st_name
>= strtab_size
6725 ? _("<corrupt>") : strtab
+ best
->st_name
);
6731 *offset
= addr
.offset
;
6735 symcmp (const void *p
, const void *q
)
6737 Elf_Internal_Sym
*sp
= (Elf_Internal_Sym
*) p
;
6738 Elf_Internal_Sym
*sq
= (Elf_Internal_Sym
*) q
;
6740 return sp
->st_value
> sq
->st_value
? 1 : (sp
->st_value
< sq
->st_value
? -1 : 0);
6743 /* Process the unwind section. */
6745 #include "unwind-ia64.h"
6747 struct ia64_unw_table_entry
6749 struct absaddr start
;
6751 struct absaddr info
;
6754 struct ia64_unw_aux_info
6756 struct ia64_unw_table_entry
*table
; /* Unwind table. */
6757 unsigned long table_len
; /* Length of unwind table. */
6758 unsigned char * info
; /* Unwind info. */
6759 unsigned long info_size
; /* Size of unwind info. */
6760 bfd_vma info_addr
; /* Starting address of unwind info. */
6761 bfd_vma seg_base
; /* Starting address of segment. */
6762 Elf_Internal_Sym
* symtab
; /* The symbol table. */
6763 unsigned long nsyms
; /* Number of symbols. */
6764 Elf_Internal_Sym
* funtab
; /* Sorted table of STT_FUNC symbols. */
6765 unsigned long nfuns
; /* Number of entries in funtab. */
6766 char * strtab
; /* The string table. */
6767 unsigned long strtab_size
; /* Size of string table. */
6771 dump_ia64_unwind (struct ia64_unw_aux_info
* aux
)
6773 struct ia64_unw_table_entry
* tp
;
6774 unsigned long j
, nfuns
;
6777 aux
->funtab
= xmalloc (aux
->nsyms
* sizeof (Elf_Internal_Sym
));
6778 for (nfuns
= 0, j
= 0; j
< aux
->nsyms
; j
++)
6779 if (aux
->symtab
[j
].st_value
&& ELF_ST_TYPE (aux
->symtab
[j
].st_info
) == STT_FUNC
)
6780 aux
->funtab
[nfuns
++] = aux
->symtab
[j
];
6782 qsort (aux
->funtab
, aux
->nfuns
, sizeof (Elf_Internal_Sym
), symcmp
);
6784 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
6788 const unsigned char * dp
;
6789 const unsigned char * head
;
6790 const unsigned char * end
;
6791 const char * procname
;
6793 find_symbol_for_address (aux
->funtab
, aux
->nfuns
, aux
->strtab
,
6794 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
6796 fputs ("\n<", stdout
);
6800 fputs (procname
, stdout
);
6803 printf ("+%lx", (unsigned long) offset
);
6806 fputs (">: [", stdout
);
6807 print_vma (tp
->start
.offset
, PREFIX_HEX
);
6808 fputc ('-', stdout
);
6809 print_vma (tp
->end
.offset
, PREFIX_HEX
);
6810 printf ("], info at +0x%lx\n",
6811 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
6813 /* PR 17531: file: 86232b32. */
6814 if (aux
->info
== NULL
)
6817 /* PR 17531: file: 0997b4d1. */
6818 if ((ABSADDR (tp
->info
) - aux
->info_addr
) >= aux
->info_size
)
6820 warn (_("Invalid offset %lx in table entry %ld\n"),
6821 (long) tp
->info
.offset
, (long) (tp
- aux
->table
));
6825 head
= aux
->info
+ (ABSADDR (tp
->info
) - aux
->info_addr
);
6826 stamp
= byte_get ((unsigned char *) head
, sizeof (stamp
));
6828 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
6829 (unsigned) UNW_VER (stamp
),
6830 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
6831 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
6832 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
6833 (unsigned long) (eh_addr_size
* UNW_LENGTH (stamp
)));
6835 if (UNW_VER (stamp
) != 1)
6837 printf (_("\tUnknown version.\n"));
6842 end
= head
+ 8 + eh_addr_size
* UNW_LENGTH (stamp
);
6843 /* PR 17531: file: 16ceda89. */
6844 if (end
> aux
->info
+ aux
->info_size
)
6845 end
= aux
->info
+ aux
->info_size
;
6846 for (dp
= head
+ 8; dp
< end
;)
6847 dp
= unw_decode (dp
, in_body
, & in_body
, end
);
6854 slurp_ia64_unwind_table (FILE * file
,
6855 struct ia64_unw_aux_info
* aux
,
6856 Elf_Internal_Shdr
* sec
)
6858 unsigned long size
, nrelas
, i
;
6859 Elf_Internal_Phdr
* seg
;
6860 struct ia64_unw_table_entry
* tep
;
6861 Elf_Internal_Shdr
* relsec
;
6862 Elf_Internal_Rela
* rela
;
6863 Elf_Internal_Rela
* rp
;
6864 unsigned char * table
;
6866 Elf_Internal_Sym
* sym
;
6867 const char * relname
;
6871 /* First, find the starting address of the segment that includes
6874 if (elf_header
.e_phnum
)
6876 if (! get_program_headers (file
))
6879 for (seg
= program_headers
;
6880 seg
< program_headers
+ elf_header
.e_phnum
;
6883 if (seg
->p_type
!= PT_LOAD
)
6886 if (sec
->sh_addr
>= seg
->p_vaddr
6887 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
6889 aux
->seg_base
= seg
->p_vaddr
;
6895 /* Second, build the unwind table from the contents of the unwind section: */
6896 size
= sec
->sh_size
;
6897 table
= (unsigned char *) get_data (NULL
, file
, sec
->sh_offset
, 1, size
,
6902 aux
->table_len
= size
/ (3 * eh_addr_size
);
6903 aux
->table
= (struct ia64_unw_table_entry
*)
6904 xcmalloc (aux
->table_len
, sizeof (aux
->table
[0]));
6907 for (tp
= table
; tp
<= table
+ size
- (3 * eh_addr_size
); ++tep
)
6909 tep
->start
.section
= SHN_UNDEF
;
6910 tep
->end
.section
= SHN_UNDEF
;
6911 tep
->info
.section
= SHN_UNDEF
;
6912 tep
->start
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
6913 tep
->end
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
6914 tep
->info
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
6915 tep
->start
.offset
+= aux
->seg_base
;
6916 tep
->end
.offset
+= aux
->seg_base
;
6917 tep
->info
.offset
+= aux
->seg_base
;
6921 /* Third, apply any relocations to the unwind table: */
6922 for (relsec
= section_headers
;
6923 relsec
< section_headers
+ elf_header
.e_shnum
;
6926 if (relsec
->sh_type
!= SHT_RELA
6927 || relsec
->sh_info
>= elf_header
.e_shnum
6928 || section_headers
+ relsec
->sh_info
!= sec
)
6931 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
6940 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
6942 relname
= elf_ia64_reloc_type (get_reloc_type (rp
->r_info
));
6943 sym
= aux
->symtab
+ get_reloc_symindex (rp
->r_info
);
6945 /* PR 17531: file: 9fa67536. */
6946 if (relname
== NULL
)
6948 warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp
->r_info
));
6952 if (! const_strneq (relname
, "R_IA64_SEGREL"))
6954 warn (_("Skipping unexpected relocation type: %s\n"), relname
);
6958 i
= rp
->r_offset
/ (3 * eh_addr_size
);
6960 /* PR 17531: file: 5bc8d9bf. */
6961 if (i
>= aux
->table_len
)
6963 warn (_("Skipping reloc with overlarge offset: %lx\n"), i
);
6967 switch (rp
->r_offset
/ eh_addr_size
% 3)
6970 aux
->table
[i
].start
.section
= sym
->st_shndx
;
6971 aux
->table
[i
].start
.offset
= rp
->r_addend
+ sym
->st_value
;
6974 aux
->table
[i
].end
.section
= sym
->st_shndx
;
6975 aux
->table
[i
].end
.offset
= rp
->r_addend
+ sym
->st_value
;
6978 aux
->table
[i
].info
.section
= sym
->st_shndx
;
6979 aux
->table
[i
].info
.offset
= rp
->r_addend
+ sym
->st_value
;
6993 ia64_process_unwind (FILE * file
)
6995 Elf_Internal_Shdr
* sec
;
6996 Elf_Internal_Shdr
* unwsec
= NULL
;
6997 Elf_Internal_Shdr
* strsec
;
6998 unsigned long i
, unwcount
= 0, unwstart
= 0;
6999 struct ia64_unw_aux_info aux
;
7001 memset (& aux
, 0, sizeof (aux
));
7003 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
7005 if (sec
->sh_type
== SHT_SYMTAB
7006 && sec
->sh_link
< elf_header
.e_shnum
)
7008 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
, & aux
.nsyms
);
7010 strsec
= section_headers
+ sec
->sh_link
;
7011 if (aux
.strtab
!= NULL
)
7013 error (_("Multiple auxillary string tables encountered\n"));
7016 aux
.strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
7019 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
7021 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
7026 printf (_("\nThere are no unwind sections in this file.\n"));
7028 while (unwcount
-- > 0)
7033 for (i
= unwstart
, sec
= section_headers
+ unwstart
, unwsec
= NULL
;
7034 i
< elf_header
.e_shnum
; ++i
, ++sec
)
7035 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
7040 /* We have already counted the number of SHT_IA64_UNWIND
7041 sections so the loop above should never fail. */
7042 assert (unwsec
!= NULL
);
7045 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
7047 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
7049 /* We need to find which section group it is in. */
7050 struct group_list
* g
;
7052 if (section_headers_groups
== NULL
7053 || section_headers_groups
[i
] == NULL
)
7054 i
= elf_header
.e_shnum
;
7057 g
= section_headers_groups
[i
]->root
;
7059 for (; g
!= NULL
; g
= g
->next
)
7061 sec
= section_headers
+ g
->section_index
;
7063 if (streq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
))
7068 i
= elf_header
.e_shnum
;
7071 else if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
, len
))
7073 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
7074 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
7075 suffix
= SECTION_NAME (unwsec
) + len
;
7076 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
7078 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info_once
, len2
)
7079 && streq (SECTION_NAME (sec
) + len2
, suffix
))
7084 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7085 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
7086 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
7087 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
7089 if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
, len
))
7090 suffix
= SECTION_NAME (unwsec
) + len
;
7091 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
7093 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
, len2
)
7094 && streq (SECTION_NAME (sec
) + len2
, suffix
))
7098 if (i
== elf_header
.e_shnum
)
7100 printf (_("\nCould not find unwind info section for "));
7102 if (string_table
== NULL
)
7103 printf ("%d", unwsec
->sh_name
);
7105 printf ("'%s'", printable_section_name (unwsec
));
7109 aux
.info_addr
= sec
->sh_addr
;
7110 aux
.info
= (unsigned char *) get_data (NULL
, file
, sec
->sh_offset
, 1,
7113 aux
.info_size
= aux
.info
== NULL
? 0 : sec
->sh_size
;
7115 printf (_("\nUnwind section "));
7117 if (string_table
== NULL
)
7118 printf ("%d", unwsec
->sh_name
);
7120 printf ("'%s'", printable_section_name (unwsec
));
7122 printf (_(" at offset 0x%lx contains %lu entries:\n"),
7123 (unsigned long) unwsec
->sh_offset
,
7124 (unsigned long) (unwsec
->sh_size
/ (3 * eh_addr_size
)));
7126 if (slurp_ia64_unwind_table (file
, & aux
, unwsec
)
7127 && aux
.table_len
> 0)
7128 dump_ia64_unwind (& aux
);
7131 free ((char *) aux
.table
);
7133 free ((char *) aux
.info
);
7142 free ((char *) aux
.strtab
);
7145 struct hppa_unw_table_entry
7147 struct absaddr start
;
7149 unsigned int Cannot_unwind
:1; /* 0 */
7150 unsigned int Millicode
:1; /* 1 */
7151 unsigned int Millicode_save_sr0
:1; /* 2 */
7152 unsigned int Region_description
:2; /* 3..4 */
7153 unsigned int reserved1
:1; /* 5 */
7154 unsigned int Entry_SR
:1; /* 6 */
7155 unsigned int Entry_FR
:4; /* number saved */ /* 7..10 */
7156 unsigned int Entry_GR
:5; /* number saved */ /* 11..15 */
7157 unsigned int Args_stored
:1; /* 16 */
7158 unsigned int Variable_Frame
:1; /* 17 */
7159 unsigned int Separate_Package_Body
:1; /* 18 */
7160 unsigned int Frame_Extension_Millicode
:1; /* 19 */
7161 unsigned int Stack_Overflow_Check
:1; /* 20 */
7162 unsigned int Two_Instruction_SP_Increment
:1;/* 21 */
7163 unsigned int Ada_Region
:1; /* 22 */
7164 unsigned int cxx_info
:1; /* 23 */
7165 unsigned int cxx_try_catch
:1; /* 24 */
7166 unsigned int sched_entry_seq
:1; /* 25 */
7167 unsigned int reserved2
:1; /* 26 */
7168 unsigned int Save_SP
:1; /* 27 */
7169 unsigned int Save_RP
:1; /* 28 */
7170 unsigned int Save_MRP_in_frame
:1; /* 29 */
7171 unsigned int extn_ptr_defined
:1; /* 30 */
7172 unsigned int Cleanup_defined
:1; /* 31 */
7174 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
7175 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
7176 unsigned int Large_frame
:1; /* 2 */
7177 unsigned int Pseudo_SP_Set
:1; /* 3 */
7178 unsigned int reserved4
:1; /* 4 */
7179 unsigned int Total_frame_size
:27; /* 5..31 */
7182 struct hppa_unw_aux_info
7184 struct hppa_unw_table_entry
* table
; /* Unwind table. */
7185 unsigned long table_len
; /* Length of unwind table. */
7186 bfd_vma seg_base
; /* Starting address of segment. */
7187 Elf_Internal_Sym
* symtab
; /* The symbol table. */
7188 unsigned long nsyms
; /* Number of symbols. */
7189 Elf_Internal_Sym
* funtab
; /* Sorted table of STT_FUNC symbols. */
7190 unsigned long nfuns
; /* Number of entries in funtab. */
7191 char * strtab
; /* The string table. */
7192 unsigned long strtab_size
; /* Size of string table. */
7196 dump_hppa_unwind (struct hppa_unw_aux_info
* aux
)
7198 struct hppa_unw_table_entry
* tp
;
7199 unsigned long j
, nfuns
;
7201 aux
->funtab
= xmalloc (aux
->nsyms
* sizeof (Elf_Internal_Sym
));
7202 for (nfuns
= 0, j
= 0; j
< aux
->nsyms
; j
++)
7203 if (aux
->symtab
[j
].st_value
&& ELF_ST_TYPE (aux
->symtab
[j
].st_info
) == STT_FUNC
)
7204 aux
->funtab
[nfuns
++] = aux
->symtab
[j
];
7206 qsort (aux
->funtab
, aux
->nfuns
, sizeof (Elf_Internal_Sym
), symcmp
);
7208 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
7211 const char * procname
;
7213 find_symbol_for_address (aux
->funtab
, aux
->nfuns
, aux
->strtab
,
7214 aux
->strtab_size
, tp
->start
, &procname
,
7217 fputs ("\n<", stdout
);
7221 fputs (procname
, stdout
);
7224 printf ("+%lx", (unsigned long) offset
);
7227 fputs (">: [", stdout
);
7228 print_vma (tp
->start
.offset
, PREFIX_HEX
);
7229 fputc ('-', stdout
);
7230 print_vma (tp
->end
.offset
, PREFIX_HEX
);
7233 #define PF(_m) if (tp->_m) printf (#_m " ");
7234 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7237 PF(Millicode_save_sr0
);
7238 /* PV(Region_description); */
7244 PF(Separate_Package_Body
);
7245 PF(Frame_Extension_Millicode
);
7246 PF(Stack_Overflow_Check
);
7247 PF(Two_Instruction_SP_Increment
);
7251 PF(sched_entry_seq
);
7254 PF(Save_MRP_in_frame
);
7255 PF(extn_ptr_defined
);
7256 PF(Cleanup_defined
);
7257 PF(MPE_XL_interrupt_marker
);
7258 PF(HP_UX_interrupt_marker
);
7261 PV(Total_frame_size
);
7272 slurp_hppa_unwind_table (FILE * file
,
7273 struct hppa_unw_aux_info
* aux
,
7274 Elf_Internal_Shdr
* sec
)
7276 unsigned long size
, unw_ent_size
, nentries
, nrelas
, i
;
7277 Elf_Internal_Phdr
* seg
;
7278 struct hppa_unw_table_entry
* tep
;
7279 Elf_Internal_Shdr
* relsec
;
7280 Elf_Internal_Rela
* rela
;
7281 Elf_Internal_Rela
* rp
;
7282 unsigned char * table
;
7284 Elf_Internal_Sym
* sym
;
7285 const char * relname
;
7287 /* First, find the starting address of the segment that includes
7290 if (elf_header
.e_phnum
)
7292 if (! get_program_headers (file
))
7295 for (seg
= program_headers
;
7296 seg
< program_headers
+ elf_header
.e_phnum
;
7299 if (seg
->p_type
!= PT_LOAD
)
7302 if (sec
->sh_addr
>= seg
->p_vaddr
7303 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
7305 aux
->seg_base
= seg
->p_vaddr
;
7311 /* Second, build the unwind table from the contents of the unwind
7313 size
= sec
->sh_size
;
7314 table
= (unsigned char *) get_data (NULL
, file
, sec
->sh_offset
, 1, size
,
7320 nentries
= size
/ unw_ent_size
;
7321 size
= unw_ent_size
* nentries
;
7323 tep
= aux
->table
= (struct hppa_unw_table_entry
*)
7324 xcmalloc (nentries
, sizeof (aux
->table
[0]));
7326 for (tp
= table
; tp
< table
+ size
; tp
+= unw_ent_size
, ++tep
)
7328 unsigned int tmp1
, tmp2
;
7330 tep
->start
.section
= SHN_UNDEF
;
7331 tep
->end
.section
= SHN_UNDEF
;
7333 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
7334 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
7335 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
7336 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
7338 tep
->start
.offset
+= aux
->seg_base
;
7339 tep
->end
.offset
+= aux
->seg_base
;
7341 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
7342 tep
->Millicode
= (tmp1
>> 30) & 0x1;
7343 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
7344 tep
->Region_description
= (tmp1
>> 27) & 0x3;
7345 tep
->reserved1
= (tmp1
>> 26) & 0x1;
7346 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
7347 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
7348 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
7349 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
7350 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
7351 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
7352 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
7353 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
7354 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
7355 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
7356 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
7357 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
7358 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
7359 tep
->reserved2
= (tmp1
>> 5) & 0x1;
7360 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
7361 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
7362 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
7363 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
7364 tep
->Cleanup_defined
= tmp1
& 0x1;
7366 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
7367 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
7368 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
7369 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
7370 tep
->reserved4
= (tmp2
>> 27) & 0x1;
7371 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
7375 /* Third, apply any relocations to the unwind table. */
7376 for (relsec
= section_headers
;
7377 relsec
< section_headers
+ elf_header
.e_shnum
;
7380 if (relsec
->sh_type
!= SHT_RELA
7381 || relsec
->sh_info
>= elf_header
.e_shnum
7382 || section_headers
+ relsec
->sh_info
!= sec
)
7385 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
7389 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
7391 relname
= elf_hppa_reloc_type (get_reloc_type (rp
->r_info
));
7392 sym
= aux
->symtab
+ get_reloc_symindex (rp
->r_info
);
7394 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
7395 if (! const_strneq (relname
, "R_PARISC_SEGREL"))
7397 warn (_("Skipping unexpected relocation type %s\n"), relname
);
7401 i
= rp
->r_offset
/ unw_ent_size
;
7403 switch ((rp
->r_offset
% unw_ent_size
) / eh_addr_size
)
7406 aux
->table
[i
].start
.section
= sym
->st_shndx
;
7407 aux
->table
[i
].start
.offset
= sym
->st_value
+ rp
->r_addend
;
7410 aux
->table
[i
].end
.section
= sym
->st_shndx
;
7411 aux
->table
[i
].end
.offset
= sym
->st_value
+ rp
->r_addend
;
7421 aux
->table_len
= nentries
;
7427 hppa_process_unwind (FILE * file
)
7429 struct hppa_unw_aux_info aux
;
7430 Elf_Internal_Shdr
* unwsec
= NULL
;
7431 Elf_Internal_Shdr
* strsec
;
7432 Elf_Internal_Shdr
* sec
;
7435 if (string_table
== NULL
)
7438 memset (& aux
, 0, sizeof (aux
));
7440 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
7442 if (sec
->sh_type
== SHT_SYMTAB
7443 && sec
->sh_link
< elf_header
.e_shnum
)
7445 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
, & aux
.nsyms
);
7447 strsec
= section_headers
+ sec
->sh_link
;
7448 if (aux
.strtab
!= NULL
)
7450 error (_("Multiple auxillary string tables encountered\n"));
7453 aux
.strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
7456 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
7458 else if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
7463 printf (_("\nThere are no unwind sections in this file.\n"));
7465 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
7467 if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
7469 printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7470 printable_section_name (sec
),
7471 (unsigned long) sec
->sh_offset
,
7472 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
+ 8)));
7474 slurp_hppa_unwind_table (file
, &aux
, sec
);
7475 if (aux
.table_len
> 0)
7476 dump_hppa_unwind (&aux
);
7479 free ((char *) aux
.table
);
7487 free ((char *) aux
.strtab
);
7492 unsigned char * data
; /* The unwind data. */
7493 Elf_Internal_Shdr
* sec
; /* The cached unwind section header. */
7494 Elf_Internal_Rela
* rela
; /* The cached relocations for this section. */
7495 unsigned long nrelas
; /* The number of relocations. */
7496 unsigned int rel_type
; /* REL or RELA ? */
7497 Elf_Internal_Rela
* next_rela
; /* Cyclic pointer to the next reloc to process. */
7500 struct arm_unw_aux_info
7502 FILE * file
; /* The file containing the unwind sections. */
7503 Elf_Internal_Sym
* symtab
; /* The file's symbol table. */
7504 unsigned long nsyms
; /* Number of symbols. */
7505 Elf_Internal_Sym
* funtab
; /* Sorted table of STT_FUNC symbols. */
7506 unsigned long nfuns
; /* Number of these symbols. */
7507 char * strtab
; /* The file's string table. */
7508 unsigned long strtab_size
; /* Size of string table. */
7512 arm_print_vma_and_name (struct arm_unw_aux_info
*aux
,
7513 bfd_vma fn
, struct absaddr addr
)
7515 const char *procname
;
7518 if (addr
.section
== SHN_UNDEF
)
7521 find_symbol_for_address (aux
->funtab
, aux
->nfuns
, aux
->strtab
,
7522 aux
->strtab_size
, addr
, &procname
,
7525 print_vma (fn
, PREFIX_HEX
);
7529 fputs (" <", stdout
);
7530 fputs (procname
, stdout
);
7533 printf ("+0x%lx", (unsigned long) sym_offset
);
7534 fputc ('>', stdout
);
7541 arm_free_section (struct arm_section
*arm_sec
)
7543 if (arm_sec
->data
!= NULL
)
7544 free (arm_sec
->data
);
7546 if (arm_sec
->rela
!= NULL
)
7547 free (arm_sec
->rela
);
7550 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7551 cached section and install SEC instead.
7552 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7553 and return its valued in * WORDP, relocating if necessary.
7554 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7555 relocation's offset in ADDR.
7556 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7557 into the string table of the symbol associated with the reloc. If no
7558 reloc was applied store -1 there.
7559 5) Return TRUE upon success, FALSE otherwise. */
7562 get_unwind_section_word (struct arm_unw_aux_info
* aux
,
7563 struct arm_section
* arm_sec
,
7564 Elf_Internal_Shdr
* sec
,
7565 bfd_vma word_offset
,
7566 unsigned int * wordp
,
7567 struct absaddr
* addr
,
7570 Elf_Internal_Rela
*rp
;
7571 Elf_Internal_Sym
*sym
;
7572 const char * relname
;
7574 bfd_boolean wrapped
;
7576 if (sec
== NULL
|| arm_sec
== NULL
)
7579 addr
->section
= SHN_UNDEF
;
7582 if (sym_name
!= NULL
)
7583 *sym_name
= (bfd_vma
) -1;
7585 /* If necessary, update the section cache. */
7586 if (sec
!= arm_sec
->sec
)
7588 Elf_Internal_Shdr
*relsec
;
7590 arm_free_section (arm_sec
);
7593 arm_sec
->data
= get_data (NULL
, aux
->file
, sec
->sh_offset
, 1,
7594 sec
->sh_size
, _("unwind data"));
7595 arm_sec
->rela
= NULL
;
7596 arm_sec
->nrelas
= 0;
7598 for (relsec
= section_headers
;
7599 relsec
< section_headers
+ elf_header
.e_shnum
;
7602 if (relsec
->sh_info
>= elf_header
.e_shnum
7603 || section_headers
+ relsec
->sh_info
!= sec
7604 /* PR 15745: Check the section type as well. */
7605 || (relsec
->sh_type
!= SHT_REL
7606 && relsec
->sh_type
!= SHT_RELA
))
7609 arm_sec
->rel_type
= relsec
->sh_type
;
7610 if (relsec
->sh_type
== SHT_REL
)
7612 if (!slurp_rel_relocs (aux
->file
, relsec
->sh_offset
,
7614 & arm_sec
->rela
, & arm_sec
->nrelas
))
7617 else /* relsec->sh_type == SHT_RELA */
7619 if (!slurp_rela_relocs (aux
->file
, relsec
->sh_offset
,
7621 & arm_sec
->rela
, & arm_sec
->nrelas
))
7627 arm_sec
->next_rela
= arm_sec
->rela
;
7630 /* If there is no unwind data we can do nothing. */
7631 if (arm_sec
->data
== NULL
)
7634 /* If the offset is invalid then fail. */
7635 if (word_offset
> (sec
->sh_size
- 4)
7637 || (sec
->sh_size
< 5 && word_offset
>= sec
->sh_size
)
7638 || ((bfd_signed_vma
) word_offset
) < 0)
7641 /* Get the word at the required offset. */
7642 word
= byte_get (arm_sec
->data
+ word_offset
, 4);
7644 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
7645 if (arm_sec
->rela
== NULL
)
7651 /* Look through the relocs to find the one that applies to the provided offset. */
7653 for (rp
= arm_sec
->next_rela
; rp
!= arm_sec
->rela
+ arm_sec
->nrelas
; rp
++)
7655 bfd_vma prelval
, offset
;
7657 if (rp
->r_offset
> word_offset
&& !wrapped
)
7662 if (rp
->r_offset
> word_offset
)
7665 if (rp
->r_offset
& 3)
7667 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7668 (unsigned long) rp
->r_offset
);
7672 if (rp
->r_offset
< word_offset
)
7675 /* PR 17531: file: 027-161405-0.004 */
7676 if (aux
->symtab
== NULL
)
7679 if (arm_sec
->rel_type
== SHT_REL
)
7681 offset
= word
& 0x7fffffff;
7682 if (offset
& 0x40000000)
7683 offset
|= ~ (bfd_vma
) 0x7fffffff;
7685 else if (arm_sec
->rel_type
== SHT_RELA
)
7686 offset
= rp
->r_addend
;
7689 error (_("Unknown section relocation type %d encountered\n"),
7694 /* PR 17531 file: 027-1241568-0.004. */
7695 if (ELF32_R_SYM (rp
->r_info
) >= aux
->nsyms
)
7697 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7698 (unsigned long) ELF32_R_SYM (rp
->r_info
), aux
->nsyms
);
7702 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
7703 offset
+= sym
->st_value
;
7704 prelval
= offset
- (arm_sec
->sec
->sh_addr
+ rp
->r_offset
);
7706 /* Check that we are processing the expected reloc type. */
7707 if (elf_header
.e_machine
== EM_ARM
)
7709 relname
= elf_arm_reloc_type (ELF32_R_TYPE (rp
->r_info
));
7710 if (relname
== NULL
)
7712 warn (_("Skipping unknown ARM relocation type: %d\n"),
7713 (int) ELF32_R_TYPE (rp
->r_info
));
7717 if (streq (relname
, "R_ARM_NONE"))
7720 if (! streq (relname
, "R_ARM_PREL31"))
7722 warn (_("Skipping unexpected ARM relocation type %s\n"), relname
);
7726 else if (elf_header
.e_machine
== EM_TI_C6000
)
7728 relname
= elf_tic6x_reloc_type (ELF32_R_TYPE (rp
->r_info
));
7729 if (relname
== NULL
)
7731 warn (_("Skipping unknown C6000 relocation type: %d\n"),
7732 (int) ELF32_R_TYPE (rp
->r_info
));
7736 if (streq (relname
, "R_C6000_NONE"))
7739 if (! streq (relname
, "R_C6000_PREL31"))
7741 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname
);
7749 /* This function currently only supports ARM and TI unwinders. */
7750 warn (_("Only TI and ARM unwinders are currently supported\n"));
7754 word
= (word
& ~ (bfd_vma
) 0x7fffffff) | (prelval
& 0x7fffffff);
7755 addr
->section
= sym
->st_shndx
;
7756 addr
->offset
= offset
;
7759 * sym_name
= sym
->st_name
;
7764 arm_sec
->next_rela
= rp
;
7769 static const char *tic6x_unwind_regnames
[16] =
7771 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7772 "A14", "A13", "A12", "A11", "A10",
7773 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
7777 decode_tic6x_unwind_regmask (unsigned int mask
)
7781 for (i
= 12; mask
; mask
>>= 1, i
--)
7785 fputs (tic6x_unwind_regnames
[i
], stdout
);
7787 fputs (", ", stdout
);
7793 if (remaining == 0 && more_words) \
7796 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
7797 data_offset, & word, & addr, NULL)) \
7803 #define GET_OP(OP) \
7808 (OP) = word >> 24; \
7813 printf (_("[Truncated opcode]\n")); \
7816 printf ("0x%02x ", OP)
7819 decode_arm_unwind_bytecode (struct arm_unw_aux_info
* aux
,
7821 unsigned int remaining
,
7822 unsigned int more_words
,
7823 bfd_vma data_offset
,
7824 Elf_Internal_Shdr
* data_sec
,
7825 struct arm_section
* data_arm_sec
)
7827 struct absaddr addr
;
7829 /* Decode the unwinding instructions. */
7832 unsigned int op
, op2
;
7841 printf (" 0x%02x ", op
);
7843 if ((op
& 0xc0) == 0x00)
7845 int offset
= ((op
& 0x3f) << 2) + 4;
7847 printf (" vsp = vsp + %d", offset
);
7849 else if ((op
& 0xc0) == 0x40)
7851 int offset
= ((op
& 0x3f) << 2) + 4;
7853 printf (" vsp = vsp - %d", offset
);
7855 else if ((op
& 0xf0) == 0x80)
7858 if (op
== 0x80 && op2
== 0)
7859 printf (_("Refuse to unwind"));
7862 unsigned int mask
= ((op
& 0x0f) << 8) | op2
;
7867 for (i
= 0; i
< 12; i
++)
7868 if (mask
& (1 << i
))
7874 printf ("r%d", 4 + i
);
7879 else if ((op
& 0xf0) == 0x90)
7881 if (op
== 0x9d || op
== 0x9f)
7882 printf (_(" [Reserved]"));
7884 printf (" vsp = r%d", op
& 0x0f);
7886 else if ((op
& 0xf0) == 0xa0)
7888 int end
= 4 + (op
& 0x07);
7893 for (i
= 4; i
<= end
; i
++)
7909 else if (op
== 0xb0)
7910 printf (_(" finish"));
7911 else if (op
== 0xb1)
7914 if (op2
== 0 || (op2
& 0xf0) != 0)
7915 printf (_("[Spare]"));
7918 unsigned int mask
= op2
& 0x0f;
7923 for (i
= 0; i
< 12; i
++)
7924 if (mask
& (1 << i
))
7935 else if (op
== 0xb2)
7937 unsigned char buf
[9];
7938 unsigned int i
, len
;
7939 unsigned long offset
;
7941 for (i
= 0; i
< sizeof (buf
); i
++)
7944 if ((buf
[i
] & 0x80) == 0)
7947 if (i
== sizeof (buf
))
7948 printf (_("corrupt change to vsp"));
7951 offset
= read_uleb128 (buf
, &len
, buf
+ i
+ 1);
7952 assert (len
== i
+ 1);
7953 offset
= offset
* 4 + 0x204;
7954 printf ("vsp = vsp + %ld", offset
);
7957 else if (op
== 0xb3 || op
== 0xc8 || op
== 0xc9)
7959 unsigned int first
, last
;
7966 printf ("pop {D%d", first
);
7968 printf ("-D%d", first
+ last
);
7971 else if ((op
& 0xf8) == 0xb8 || (op
& 0xf8) == 0xd0)
7973 unsigned int count
= op
& 0x07;
7977 printf ("-D%d", 8 + count
);
7980 else if (op
>= 0xc0 && op
<= 0xc5)
7982 unsigned int count
= op
& 0x07;
7984 printf (" pop {wR10");
7986 printf ("-wR%d", 10 + count
);
7989 else if (op
== 0xc6)
7991 unsigned int first
, last
;
7996 printf ("pop {wR%d", first
);
7998 printf ("-wR%d", first
+ last
);
8001 else if (op
== 0xc7)
8004 if (op2
== 0 || (op2
& 0xf0) != 0)
8005 printf (_("[Spare]"));
8008 unsigned int mask
= op2
& 0x0f;
8013 for (i
= 0; i
< 4; i
++)
8014 if (mask
& (1 << i
))
8020 printf ("wCGR%d", i
);
8026 printf (_(" [unsupported opcode]"));
8032 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info
* aux
,
8034 unsigned int remaining
,
8035 unsigned int more_words
,
8036 bfd_vma data_offset
,
8037 Elf_Internal_Shdr
* data_sec
,
8038 struct arm_section
* data_arm_sec
)
8040 struct absaddr addr
;
8042 /* Decode the unwinding instructions. */
8045 unsigned int op
, op2
;
8054 printf (" 0x%02x ", op
);
8056 if ((op
& 0xc0) == 0x00)
8058 int offset
= ((op
& 0x3f) << 3) + 8;
8059 printf (" sp = sp + %d", offset
);
8061 else if ((op
& 0xc0) == 0x80)
8064 if (op
== 0x80 && op2
== 0)
8065 printf (_("Refuse to unwind"));
8068 unsigned int mask
= ((op
& 0x1f) << 8) | op2
;
8070 printf ("pop compact {");
8074 decode_tic6x_unwind_regmask (mask
);
8078 else if ((op
& 0xf0) == 0xc0)
8086 unsigned int offset
;
8090 /* Scan entire instruction first so that GET_OP output is not
8091 interleaved with disassembly. */
8093 for (i
= 0; nregs
< (op
& 0xf); i
++)
8099 regpos
[nregs
].offset
= i
* 2;
8100 regpos
[nregs
].reg
= reg
;
8107 regpos
[nregs
].offset
= i
* 2 + 1;
8108 regpos
[nregs
].reg
= reg
;
8113 printf (_("pop frame {"));
8115 for (i
= i
* 2; i
> 0; i
--)
8117 if (regpos
[reg
].offset
== i
- 1)
8119 name
= tic6x_unwind_regnames
[regpos
[reg
].reg
];
8126 fputs (name
, stdout
);
8133 else if (op
== 0xd0)
8134 printf (" MOV FP, SP");
8135 else if (op
== 0xd1)
8136 printf (" __c6xabi_pop_rts");
8137 else if (op
== 0xd2)
8139 unsigned char buf
[9];
8140 unsigned int i
, len
;
8141 unsigned long offset
;
8143 for (i
= 0; i
< sizeof (buf
); i
++)
8146 if ((buf
[i
] & 0x80) == 0)
8149 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8150 if (i
== sizeof (buf
))
8152 printf ("<corrupt sp adjust>\n");
8153 warn (_("Corrupt stack pointer adjustment detected\n"));
8157 offset
= read_uleb128 (buf
, &len
, buf
+ i
+ 1);
8158 assert (len
== i
+ 1);
8159 offset
= offset
* 8 + 0x408;
8160 printf (_("sp = sp + %ld"), offset
);
8162 else if ((op
& 0xf0) == 0xe0)
8164 if ((op
& 0x0f) == 7)
8167 printf (" MV %s, B3", tic6x_unwind_regnames
[op
& 0x0f]);
8171 printf (_(" [unsupported opcode]"));
8178 arm_expand_prel31 (bfd_vma word
, bfd_vma where
)
8182 offset
= word
& 0x7fffffff;
8183 if (offset
& 0x40000000)
8184 offset
|= ~ (bfd_vma
) 0x7fffffff;
8186 if (elf_header
.e_machine
== EM_TI_C6000
)
8189 return offset
+ where
;
8193 decode_arm_unwind (struct arm_unw_aux_info
* aux
,
8195 unsigned int remaining
,
8196 bfd_vma data_offset
,
8197 Elf_Internal_Shdr
* data_sec
,
8198 struct arm_section
* data_arm_sec
)
8201 unsigned int more_words
= 0;
8202 struct absaddr addr
;
8203 bfd_vma sym_name
= (bfd_vma
) -1;
8207 /* Fetch the first word.
8208 Note - when decoding an object file the address extracted
8209 here will always be 0. So we also pass in the sym_name
8210 parameter so that we can find the symbol associated with
8211 the personality routine. */
8212 if (! get_unwind_section_word (aux
, data_arm_sec
, data_sec
, data_offset
,
8213 & word
, & addr
, & sym_name
))
8219 if ((word
& 0x80000000) == 0)
8221 /* Expand prel31 for personality routine. */
8223 const char *procname
;
8225 fn
= arm_expand_prel31 (word
, data_sec
->sh_addr
+ data_offset
);
8226 printf (_(" Personality routine: "));
8228 && addr
.section
== SHN_UNDEF
&& addr
.offset
== 0
8229 && sym_name
!= (bfd_vma
) -1 && sym_name
< aux
->strtab_size
)
8231 procname
= aux
->strtab
+ sym_name
;
8232 print_vma (fn
, PREFIX_HEX
);
8235 fputs (" <", stdout
);
8236 fputs (procname
, stdout
);
8237 fputc ('>', stdout
);
8241 procname
= arm_print_vma_and_name (aux
, fn
, addr
);
8242 fputc ('\n', stdout
);
8244 /* The GCC personality routines use the standard compact
8245 encoding, starting with one byte giving the number of
8247 if (procname
!= NULL
8248 && (const_strneq (procname
, "__gcc_personality_v0")
8249 || const_strneq (procname
, "__gxx_personality_v0")
8250 || const_strneq (procname
, "__gcj_personality_v0")
8251 || const_strneq (procname
, "__gnu_objc_personality_v0")))
8258 printf (_(" [Truncated data]\n"));
8261 more_words
= word
>> 24;
8271 /* ARM EHABI Section 6.3:
8273 An exception-handling table entry for the compact model looks like:
8277 1 0 index Data for personalityRoutine[index] */
8279 if (elf_header
.e_machine
== EM_ARM
8280 && (word
& 0x70000000))
8281 warn (_("Corrupt ARM compact model table entry: %x \n"), word
);
8283 per_index
= (word
>> 24) & 0x7f;
8284 printf (_(" Compact model index: %d\n"), per_index
);
8291 else if (per_index
< 3)
8293 more_words
= (word
>> 16) & 0xff;
8299 switch (elf_header
.e_machine
)
8304 decode_arm_unwind_bytecode (aux
, word
, remaining
, more_words
,
8305 data_offset
, data_sec
, data_arm_sec
);
8309 warn (_("Unknown ARM compact model index encountered\n"));
8310 printf (_(" [reserved]\n"));
8317 decode_tic6x_unwind_bytecode (aux
, word
, remaining
, more_words
,
8318 data_offset
, data_sec
, data_arm_sec
);
8320 else if (per_index
< 5)
8322 if (((word
>> 17) & 0x7f) == 0x7f)
8323 printf (_(" Restore stack from frame pointer\n"));
8325 printf (_(" Stack increment %d\n"), (word
>> 14) & 0x1fc);
8326 printf (_(" Registers restored: "));
8328 printf (" (compact) ");
8329 decode_tic6x_unwind_regmask ((word
>> 4) & 0x1fff);
8331 printf (_(" Return register: %s\n"),
8332 tic6x_unwind_regnames
[word
& 0xf]);
8335 printf (_(" [reserved (%d)]\n"), per_index
);
8339 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8340 elf_header
.e_machine
);
8343 /* Decode the descriptors. Not implemented. */
8347 dump_arm_unwind (struct arm_unw_aux_info
*aux
, Elf_Internal_Shdr
*exidx_sec
)
8349 struct arm_section exidx_arm_sec
, extab_arm_sec
;
8350 unsigned int i
, exidx_len
;
8351 unsigned long j
, nfuns
;
8353 memset (&exidx_arm_sec
, 0, sizeof (exidx_arm_sec
));
8354 memset (&extab_arm_sec
, 0, sizeof (extab_arm_sec
));
8355 exidx_len
= exidx_sec
->sh_size
/ 8;
8357 aux
->funtab
= xmalloc (aux
->nsyms
* sizeof (Elf_Internal_Sym
));
8358 for (nfuns
= 0, j
= 0; j
< aux
->nsyms
; j
++)
8359 if (aux
->symtab
[j
].st_value
&& ELF_ST_TYPE (aux
->symtab
[j
].st_info
) == STT_FUNC
)
8360 aux
->funtab
[nfuns
++] = aux
->symtab
[j
];
8362 qsort (aux
->funtab
, aux
->nfuns
, sizeof (Elf_Internal_Sym
), symcmp
);
8364 for (i
= 0; i
< exidx_len
; i
++)
8366 unsigned int exidx_fn
, exidx_entry
;
8367 struct absaddr fn_addr
, entry_addr
;
8370 fputc ('\n', stdout
);
8372 if (! get_unwind_section_word (aux
, & exidx_arm_sec
, exidx_sec
,
8373 8 * i
, & exidx_fn
, & fn_addr
, NULL
)
8374 || ! get_unwind_section_word (aux
, & exidx_arm_sec
, exidx_sec
,
8375 8 * i
+ 4, & exidx_entry
, & entry_addr
, NULL
))
8378 arm_free_section (& exidx_arm_sec
);
8379 arm_free_section (& extab_arm_sec
);
8383 /* ARM EHABI, Section 5:
8384 An index table entry consists of 2 words.
8385 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
8386 if (exidx_fn
& 0x80000000)
8387 warn (_("corrupt index table entry: %x\n"), exidx_fn
);
8389 fn
= arm_expand_prel31 (exidx_fn
, exidx_sec
->sh_addr
+ 8 * i
);
8391 arm_print_vma_and_name (aux
, fn
, fn_addr
);
8392 fputs (": ", stdout
);
8394 if (exidx_entry
== 1)
8396 print_vma (exidx_entry
, PREFIX_HEX
);
8397 fputs (" [cantunwind]\n", stdout
);
8399 else if (exidx_entry
& 0x80000000)
8401 print_vma (exidx_entry
, PREFIX_HEX
);
8402 fputc ('\n', stdout
);
8403 decode_arm_unwind (aux
, exidx_entry
, 4, 0, NULL
, NULL
);
8407 bfd_vma table
, table_offset
= 0;
8408 Elf_Internal_Shdr
*table_sec
;
8410 fputs ("@", stdout
);
8411 table
= arm_expand_prel31 (exidx_entry
, exidx_sec
->sh_addr
+ 8 * i
+ 4);
8412 print_vma (table
, PREFIX_HEX
);
8415 /* Locate the matching .ARM.extab. */
8416 if (entry_addr
.section
!= SHN_UNDEF
8417 && entry_addr
.section
< elf_header
.e_shnum
)
8419 table_sec
= section_headers
+ entry_addr
.section
;
8420 table_offset
= entry_addr
.offset
;
8422 if (table_offset
> table_sec
->sh_size
8423 || ((bfd_signed_vma
) table_offset
) < 0)
8425 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8426 (unsigned long) table_offset
,
8427 printable_section_name (table_sec
));
8433 table_sec
= find_section_by_address (table
);
8434 if (table_sec
!= NULL
)
8435 table_offset
= table
- table_sec
->sh_addr
;
8437 if (table_sec
== NULL
)
8439 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8440 (unsigned long) table
);
8443 decode_arm_unwind (aux
, 0, 0, table_offset
, table_sec
,
8451 arm_free_section (&exidx_arm_sec
);
8452 arm_free_section (&extab_arm_sec
);
8455 /* Used for both ARM and C6X unwinding tables. */
8458 arm_process_unwind (FILE *file
)
8460 struct arm_unw_aux_info aux
;
8461 Elf_Internal_Shdr
*unwsec
= NULL
;
8462 Elf_Internal_Shdr
*strsec
;
8463 Elf_Internal_Shdr
*sec
;
8465 unsigned int sec_type
;
8467 switch (elf_header
.e_machine
)
8470 sec_type
= SHT_ARM_EXIDX
;
8474 sec_type
= SHT_C6000_UNWIND
;
8478 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
8479 elf_header
.e_machine
);
8483 if (string_table
== NULL
)
8486 memset (& aux
, 0, sizeof (aux
));
8489 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
8491 if (sec
->sh_type
== SHT_SYMTAB
&& sec
->sh_link
< elf_header
.e_shnum
)
8493 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
, & aux
.nsyms
);
8495 strsec
= section_headers
+ sec
->sh_link
;
8497 /* PR binutils/17531 file: 011-12666-0.004. */
8498 if (aux
.strtab
!= NULL
)
8500 error (_("Multiple string tables found in file.\n"));
8503 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
8504 1, strsec
->sh_size
, _("string table"));
8505 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
8507 else if (sec
->sh_type
== sec_type
)
8512 printf (_("\nThere are no unwind sections in this file.\n"));
8514 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
8516 if (sec
->sh_type
== sec_type
)
8518 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8519 printable_section_name (sec
),
8520 (unsigned long) sec
->sh_offset
,
8521 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
)));
8523 dump_arm_unwind (&aux
, sec
);
8530 free ((char *) aux
.strtab
);
8534 process_unwind (FILE * file
)
8536 struct unwind_handler
8539 void (* handler
)(FILE *);
8542 { EM_ARM
, arm_process_unwind
},
8543 { EM_IA_64
, ia64_process_unwind
},
8544 { EM_PARISC
, hppa_process_unwind
},
8545 { EM_TI_C6000
, arm_process_unwind
},
8553 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
8554 if (elf_header
.e_machine
== handlers
[i
].machtype
)
8556 handlers
[i
].handler (file
);
8560 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8561 get_machine_name (elf_header
.e_machine
));
8565 dynamic_section_mips_val (Elf_Internal_Dyn
* entry
)
8567 switch (entry
->d_tag
)
8570 if (entry
->d_un
.d_val
== 0)
8574 static const char * opts
[] =
8576 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8577 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8578 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8579 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8585 for (cnt
= 0; cnt
< ARRAY_SIZE (opts
); ++cnt
)
8586 if (entry
->d_un
.d_val
& (1 << cnt
))
8588 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
8594 case DT_MIPS_IVERSION
:
8595 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
8596 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
8600 sprintf_vma (buf
, entry
->d_un
.d_ptr
);
8601 /* Note: coded this way so that there is a single string for translation. */
8602 printf (_("<corrupt: %s>"), buf
);
8606 case DT_MIPS_TIME_STAMP
:
8610 time_t atime
= entry
->d_un
.d_val
;
8612 tmp
= gmtime (&atime
);
8613 /* PR 17531: file: 6accc532. */
8615 snprintf (timebuf
, sizeof (timebuf
), _("<corrupt>"));
8617 snprintf (timebuf
, sizeof (timebuf
), "%04u-%02u-%02uT%02u:%02u:%02u",
8618 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
8619 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
8620 printf (_("Time Stamp: %s"), timebuf
);
8624 case DT_MIPS_RLD_VERSION
:
8625 case DT_MIPS_LOCAL_GOTNO
:
8626 case DT_MIPS_CONFLICTNO
:
8627 case DT_MIPS_LIBLISTNO
:
8628 case DT_MIPS_SYMTABNO
:
8629 case DT_MIPS_UNREFEXTNO
:
8630 case DT_MIPS_HIPAGENO
:
8631 case DT_MIPS_DELTA_CLASS_NO
:
8632 case DT_MIPS_DELTA_INSTANCE_NO
:
8633 case DT_MIPS_DELTA_RELOC_NO
:
8634 case DT_MIPS_DELTA_SYM_NO
:
8635 case DT_MIPS_DELTA_CLASSSYM_NO
:
8636 case DT_MIPS_COMPACT_SIZE
:
8637 print_vma (entry
->d_un
.d_ptr
, DEC
);
8641 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
8647 dynamic_section_parisc_val (Elf_Internal_Dyn
* entry
)
8649 switch (entry
->d_tag
)
8651 case DT_HP_DLD_FLAGS
:
8660 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
8661 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
8662 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
8663 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
8664 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
8665 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
8666 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
8667 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
8668 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
8669 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
8670 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" },
8671 { DT_HP_GST
, "HP_GST" },
8672 { DT_HP_SHLIB_FIXED
, "HP_SHLIB_FIXED" },
8673 { DT_HP_MERGE_SHLIB_SEG
, "HP_MERGE_SHLIB_SEG" },
8674 { DT_HP_NODELETE
, "HP_NODELETE" },
8675 { DT_HP_GROUP
, "HP_GROUP" },
8676 { DT_HP_PROTECT_LINKAGE_TABLE
, "HP_PROTECT_LINKAGE_TABLE" }
8680 bfd_vma val
= entry
->d_un
.d_val
;
8682 for (cnt
= 0; cnt
< ARRAY_SIZE (flags
); ++cnt
)
8683 if (val
& flags
[cnt
].bit
)
8687 fputs (flags
[cnt
].str
, stdout
);
8689 val
^= flags
[cnt
].bit
;
8692 if (val
!= 0 || first
)
8696 print_vma (val
, HEX
);
8702 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
8710 /* VMS vs Unix time offset and factor. */
8712 #define VMS_EPOCH_OFFSET 35067168000000000LL
8713 #define VMS_GRANULARITY_FACTOR 10000000
8715 /* Display a VMS time in a human readable format. */
8718 print_vms_time (bfd_int64_t vmstime
)
8723 unxtime
= (vmstime
- VMS_EPOCH_OFFSET
) / VMS_GRANULARITY_FACTOR
;
8724 tm
= gmtime (&unxtime
);
8725 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8726 tm
->tm_year
+ 1900, tm
->tm_mon
+ 1, tm
->tm_mday
,
8727 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
8732 dynamic_section_ia64_val (Elf_Internal_Dyn
* entry
)
8734 switch (entry
->d_tag
)
8736 case DT_IA_64_PLT_RESERVE
:
8737 /* First 3 slots reserved. */
8738 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
8740 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
8743 case DT_IA_64_VMS_LINKTIME
:
8745 print_vms_time (entry
->d_un
.d_val
);
8749 case DT_IA_64_VMS_LNKFLAGS
:
8750 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
8751 if (entry
->d_un
.d_val
& VMS_LF_CALL_DEBUG
)
8752 printf (" CALL_DEBUG");
8753 if (entry
->d_un
.d_val
& VMS_LF_NOP0BUFS
)
8754 printf (" NOP0BUFS");
8755 if (entry
->d_un
.d_val
& VMS_LF_P0IMAGE
)
8756 printf (" P0IMAGE");
8757 if (entry
->d_un
.d_val
& VMS_LF_MKTHREADS
)
8758 printf (" MKTHREADS");
8759 if (entry
->d_un
.d_val
& VMS_LF_UPCALLS
)
8760 printf (" UPCALLS");
8761 if (entry
->d_un
.d_val
& VMS_LF_IMGSTA
)
8763 if (entry
->d_un
.d_val
& VMS_LF_INITIALIZE
)
8764 printf (" INITIALIZE");
8765 if (entry
->d_un
.d_val
& VMS_LF_MAIN
)
8767 if (entry
->d_un
.d_val
& VMS_LF_EXE_INIT
)
8768 printf (" EXE_INIT");
8769 if (entry
->d_un
.d_val
& VMS_LF_TBK_IN_IMG
)
8770 printf (" TBK_IN_IMG");
8771 if (entry
->d_un
.d_val
& VMS_LF_DBG_IN_IMG
)
8772 printf (" DBG_IN_IMG");
8773 if (entry
->d_un
.d_val
& VMS_LF_TBK_IN_DSF
)
8774 printf (" TBK_IN_DSF");
8775 if (entry
->d_un
.d_val
& VMS_LF_DBG_IN_DSF
)
8776 printf (" DBG_IN_DSF");
8777 if (entry
->d_un
.d_val
& VMS_LF_SIGNATURES
)
8778 printf (" SIGNATURES");
8779 if (entry
->d_un
.d_val
& VMS_LF_REL_SEG_OFF
)
8780 printf (" REL_SEG_OFF");
8784 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
8791 get_32bit_dynamic_section (FILE * file
)
8793 Elf32_External_Dyn
* edyn
;
8794 Elf32_External_Dyn
* ext
;
8795 Elf_Internal_Dyn
* entry
;
8797 edyn
= (Elf32_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
, 1,
8798 dynamic_size
, _("dynamic section"));
8802 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8803 might not have the luxury of section headers. Look for the DT_NULL
8804 terminator to determine the number of entries. */
8805 for (ext
= edyn
, dynamic_nent
= 0;
8806 (char *) (ext
+ 1) <= (char *) edyn
+ dynamic_size
;
8810 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
8814 dynamic_section
= (Elf_Internal_Dyn
*) cmalloc (dynamic_nent
,
8816 if (dynamic_section
== NULL
)
8818 error (_("Out of memory allocating space for %lu dynamic entries\n"),
8819 (unsigned long) dynamic_nent
);
8824 for (ext
= edyn
, entry
= dynamic_section
;
8825 entry
< dynamic_section
+ dynamic_nent
;
8828 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
8829 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
8838 get_64bit_dynamic_section (FILE * file
)
8840 Elf64_External_Dyn
* edyn
;
8841 Elf64_External_Dyn
* ext
;
8842 Elf_Internal_Dyn
* entry
;
8844 /* Read in the data. */
8845 edyn
= (Elf64_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
, 1,
8846 dynamic_size
, _("dynamic section"));
8850 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8851 might not have the luxury of section headers. Look for the DT_NULL
8852 terminator to determine the number of entries. */
8853 for (ext
= edyn
, dynamic_nent
= 0;
8854 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
8855 (char *) (ext
+ 1) <= (char *) edyn
+ dynamic_size
;
8859 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
8863 dynamic_section
= (Elf_Internal_Dyn
*) cmalloc (dynamic_nent
,
8865 if (dynamic_section
== NULL
)
8867 error (_("Out of memory allocating space for %lu dynamic entries\n"),
8868 (unsigned long) dynamic_nent
);
8873 /* Convert from external to internal formats. */
8874 for (ext
= edyn
, entry
= dynamic_section
;
8875 entry
< dynamic_section
+ dynamic_nent
;
8878 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
8879 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
8888 print_dynamic_flags (bfd_vma flags
)
8896 flag
= flags
& - flags
;
8906 case DF_ORIGIN
: fputs ("ORIGIN", stdout
); break;
8907 case DF_SYMBOLIC
: fputs ("SYMBOLIC", stdout
); break;
8908 case DF_TEXTREL
: fputs ("TEXTREL", stdout
); break;
8909 case DF_BIND_NOW
: fputs ("BIND_NOW", stdout
); break;
8910 case DF_STATIC_TLS
: fputs ("STATIC_TLS", stdout
); break;
8911 default: fputs (_("unknown"), stdout
); break;
8917 /* Parse and display the contents of the dynamic section. */
8920 process_dynamic_section (FILE * file
)
8922 Elf_Internal_Dyn
* entry
;
8924 if (dynamic_size
== 0)
8927 printf (_("\nThere is no dynamic section in this file.\n"));
8934 if (! get_32bit_dynamic_section (file
))
8937 else if (! get_64bit_dynamic_section (file
))
8940 /* Find the appropriate symbol table. */
8941 if (dynamic_symbols
== NULL
)
8943 for (entry
= dynamic_section
;
8944 entry
< dynamic_section
+ dynamic_nent
;
8947 Elf_Internal_Shdr section
;
8949 if (entry
->d_tag
!= DT_SYMTAB
)
8952 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
8954 /* Since we do not know how big the symbol table is,
8955 we default to reading in the entire file (!) and
8956 processing that. This is overkill, I know, but it
8958 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
8960 if (archive_file_offset
!= 0)
8961 section
.sh_size
= archive_file_size
- section
.sh_offset
;
8964 if (fseek (file
, 0, SEEK_END
))
8965 error (_("Unable to seek to end of file!\n"));
8967 section
.sh_size
= ftell (file
) - section
.sh_offset
;
8971 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
8973 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
8974 section
.sh_name
= string_table_length
;
8976 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
, & num_dynamic_syms
);
8977 if (num_dynamic_syms
< 1)
8979 error (_("Unable to determine the number of symbols to load\n"));
8985 /* Similarly find a string table. */
8986 if (dynamic_strings
== NULL
)
8988 for (entry
= dynamic_section
;
8989 entry
< dynamic_section
+ dynamic_nent
;
8992 unsigned long offset
;
8995 if (entry
->d_tag
!= DT_STRTAB
)
8998 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
9000 /* Since we do not know how big the string table is,
9001 we default to reading in the entire file (!) and
9002 processing that. This is overkill, I know, but it
9005 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
9007 if (archive_file_offset
!= 0)
9008 str_tab_len
= archive_file_size
- offset
;
9011 if (fseek (file
, 0, SEEK_END
))
9012 error (_("Unable to seek to end of file\n"));
9013 str_tab_len
= ftell (file
) - offset
;
9016 if (str_tab_len
< 1)
9019 (_("Unable to determine the length of the dynamic string table\n"));
9023 dynamic_strings
= (char *) get_data (NULL
, file
, offset
, 1,
9025 _("dynamic string table"));
9026 dynamic_strings_length
= dynamic_strings
== NULL
? 0 : str_tab_len
;
9031 /* And find the syminfo section if available. */
9032 if (dynamic_syminfo
== NULL
)
9034 unsigned long syminsz
= 0;
9036 for (entry
= dynamic_section
;
9037 entry
< dynamic_section
+ dynamic_nent
;
9040 if (entry
->d_tag
== DT_SYMINENT
)
9042 /* Note: these braces are necessary to avoid a syntax
9043 error from the SunOS4 C compiler. */
9044 /* PR binutils/17531: A corrupt file can trigger this test.
9045 So do not use an assert, instead generate an error message. */
9046 if (sizeof (Elf_External_Syminfo
) != entry
->d_un
.d_val
)
9047 error (_("Bad value (%d) for SYMINENT entry\n"),
9048 (int) entry
->d_un
.d_val
);
9050 else if (entry
->d_tag
== DT_SYMINSZ
)
9051 syminsz
= entry
->d_un
.d_val
;
9052 else if (entry
->d_tag
== DT_SYMINFO
)
9053 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
9057 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
9059 Elf_External_Syminfo
* extsyminfo
;
9060 Elf_External_Syminfo
* extsym
;
9061 Elf_Internal_Syminfo
* syminfo
;
9063 /* There is a syminfo section. Read the data. */
9064 extsyminfo
= (Elf_External_Syminfo
*)
9065 get_data (NULL
, file
, dynamic_syminfo_offset
, 1, syminsz
,
9066 _("symbol information"));
9070 dynamic_syminfo
= (Elf_Internal_Syminfo
*) malloc (syminsz
);
9071 if (dynamic_syminfo
== NULL
)
9073 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9074 (unsigned long) syminsz
);
9078 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
9079 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
9080 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
9081 ++syminfo
, ++extsym
)
9083 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
9084 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
9091 if (do_dynamic
&& dynamic_addr
)
9092 printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9093 dynamic_addr
, (unsigned long) dynamic_nent
);
9095 printf (_(" Tag Type Name/Value\n"));
9097 for (entry
= dynamic_section
;
9098 entry
< dynamic_section
+ dynamic_nent
;
9106 print_vma (entry
->d_tag
, FULL_HEX
);
9107 dtype
= get_dynamic_type (entry
->d_tag
);
9108 printf (" (%s)%*s", dtype
,
9109 ((is_32bit_elf
? 27 : 19)
9110 - (int) strlen (dtype
)),
9114 switch (entry
->d_tag
)
9118 print_dynamic_flags (entry
->d_un
.d_val
);
9128 switch (entry
->d_tag
)
9131 printf (_("Auxiliary library"));
9135 printf (_("Filter library"));
9139 printf (_("Configuration file"));
9143 printf (_("Dependency audit library"));
9147 printf (_("Audit library"));
9151 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
9152 printf (": [%s]\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
9156 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
9165 printf (_("Flags:"));
9167 if (entry
->d_un
.d_val
== 0)
9168 printf (_(" None\n"));
9171 unsigned long int val
= entry
->d_un
.d_val
;
9173 if (val
& DTF_1_PARINIT
)
9175 printf (" PARINIT");
9176 val
^= DTF_1_PARINIT
;
9178 if (val
& DTF_1_CONFEXP
)
9180 printf (" CONFEXP");
9181 val
^= DTF_1_CONFEXP
;
9184 printf (" %lx", val
);
9193 printf (_("Flags:"));
9195 if (entry
->d_un
.d_val
== 0)
9196 printf (_(" None\n"));
9199 unsigned long int val
= entry
->d_un
.d_val
;
9201 if (val
& DF_P1_LAZYLOAD
)
9203 printf (" LAZYLOAD");
9204 val
^= DF_P1_LAZYLOAD
;
9206 if (val
& DF_P1_GROUPPERM
)
9208 printf (" GROUPPERM");
9209 val
^= DF_P1_GROUPPERM
;
9212 printf (" %lx", val
);
9221 printf (_("Flags:"));
9222 if (entry
->d_un
.d_val
== 0)
9223 printf (_(" None\n"));
9226 unsigned long int val
= entry
->d_un
.d_val
;
9233 if (val
& DF_1_GLOBAL
)
9238 if (val
& DF_1_GROUP
)
9243 if (val
& DF_1_NODELETE
)
9245 printf (" NODELETE");
9246 val
^= DF_1_NODELETE
;
9248 if (val
& DF_1_LOADFLTR
)
9250 printf (" LOADFLTR");
9251 val
^= DF_1_LOADFLTR
;
9253 if (val
& DF_1_INITFIRST
)
9255 printf (" INITFIRST");
9256 val
^= DF_1_INITFIRST
;
9258 if (val
& DF_1_NOOPEN
)
9263 if (val
& DF_1_ORIGIN
)
9268 if (val
& DF_1_DIRECT
)
9273 if (val
& DF_1_TRANS
)
9278 if (val
& DF_1_INTERPOSE
)
9280 printf (" INTERPOSE");
9281 val
^= DF_1_INTERPOSE
;
9283 if (val
& DF_1_NODEFLIB
)
9285 printf (" NODEFLIB");
9286 val
^= DF_1_NODEFLIB
;
9288 if (val
& DF_1_NODUMP
)
9293 if (val
& DF_1_CONFALT
)
9295 printf (" CONFALT");
9296 val
^= DF_1_CONFALT
;
9298 if (val
& DF_1_ENDFILTEE
)
9300 printf (" ENDFILTEE");
9301 val
^= DF_1_ENDFILTEE
;
9303 if (val
& DF_1_DISPRELDNE
)
9305 printf (" DISPRELDNE");
9306 val
^= DF_1_DISPRELDNE
;
9308 if (val
& DF_1_DISPRELPND
)
9310 printf (" DISPRELPND");
9311 val
^= DF_1_DISPRELPND
;
9313 if (val
& DF_1_NODIRECT
)
9315 printf (" NODIRECT");
9316 val
^= DF_1_NODIRECT
;
9318 if (val
& DF_1_IGNMULDEF
)
9320 printf (" IGNMULDEF");
9321 val
^= DF_1_IGNMULDEF
;
9323 if (val
& DF_1_NOKSYMS
)
9325 printf (" NOKSYMS");
9326 val
^= DF_1_NOKSYMS
;
9328 if (val
& DF_1_NOHDR
)
9333 if (val
& DF_1_EDITED
)
9338 if (val
& DF_1_NORELOC
)
9340 printf (" NORELOC");
9341 val
^= DF_1_NORELOC
;
9343 if (val
& DF_1_SYMINTPOSE
)
9345 printf (" SYMINTPOSE");
9346 val
^= DF_1_SYMINTPOSE
;
9348 if (val
& DF_1_GLOBAUDIT
)
9350 printf (" GLOBAUDIT");
9351 val
^= DF_1_GLOBAUDIT
;
9353 if (val
& DF_1_SINGLETON
)
9355 printf (" SINGLETON");
9356 val
^= DF_1_SINGLETON
;
9358 if (val
& DF_1_STUB
)
9369 printf (" %lx", val
);
9376 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
9378 puts (get_dynamic_type (entry
->d_un
.d_val
));
9398 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
9404 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
9405 name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
9411 switch (entry
->d_tag
)
9414 printf (_("Shared library: [%s]"), name
);
9416 if (streq (name
, program_interpreter
))
9417 printf (_(" program interpreter"));
9421 printf (_("Library soname: [%s]"), name
);
9425 printf (_("Library rpath: [%s]"), name
);
9429 printf (_("Library runpath: [%s]"), name
);
9433 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
9438 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
9451 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
9455 case DT_INIT_ARRAYSZ
:
9456 case DT_FINI_ARRAYSZ
:
9457 case DT_GNU_CONFLICTSZ
:
9458 case DT_GNU_LIBLISTSZ
:
9461 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
9462 printf (_(" (bytes)\n"));
9472 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
9485 if (entry
->d_tag
== DT_USED
9486 && VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
9488 char * name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
9492 printf (_("Not needed object: [%s]\n"), name
);
9497 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
9503 /* The value of this entry is ignored. */
9508 case DT_GNU_PRELINKED
:
9512 time_t atime
= entry
->d_un
.d_val
;
9514 tmp
= gmtime (&atime
);
9515 /* PR 17533 file: 041-1244816-0.004. */
9517 printf (_("<corrupt time val: %lx"),
9518 (unsigned long) atime
);
9520 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9521 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9522 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9528 dynamic_info_DT_GNU_HASH
= entry
->d_un
.d_val
;
9531 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
9537 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
9538 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
9543 switch (elf_header
.e_machine
)
9546 case EM_MIPS_RS3_LE
:
9547 dynamic_section_mips_val (entry
);
9550 dynamic_section_parisc_val (entry
);
9553 dynamic_section_ia64_val (entry
);
9556 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
9568 get_ver_flags (unsigned int flags
)
9570 static char buff
[32];
9577 if (flags
& VER_FLG_BASE
)
9578 strcat (buff
, "BASE ");
9580 if (flags
& VER_FLG_WEAK
)
9582 if (flags
& VER_FLG_BASE
)
9583 strcat (buff
, "| ");
9585 strcat (buff
, "WEAK ");
9588 if (flags
& VER_FLG_INFO
)
9590 if (flags
& (VER_FLG_BASE
|VER_FLG_WEAK
))
9591 strcat (buff
, "| ");
9593 strcat (buff
, "INFO ");
9596 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
| VER_FLG_INFO
))
9597 strcat (buff
, _("| <unknown>"));
9602 /* Display the contents of the version sections. */
9605 process_version_sections (FILE * file
)
9607 Elf_Internal_Shdr
* section
;
9614 for (i
= 0, section
= section_headers
;
9615 i
< elf_header
.e_shnum
;
9618 switch (section
->sh_type
)
9620 case SHT_GNU_verdef
:
9622 Elf_External_Verdef
* edefs
;
9629 printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9630 printable_section_name (section
),
9633 printf (_(" Addr: 0x"));
9634 printf_vma (section
->sh_addr
);
9635 printf (_(" Offset: %#08lx Link: %u (%s)"),
9636 (unsigned long) section
->sh_offset
, section
->sh_link
,
9637 printable_section_name_from_index (section
->sh_link
));
9639 edefs
= (Elf_External_Verdef
*)
9640 get_data (NULL
, file
, section
->sh_offset
, 1,section
->sh_size
,
9641 _("version definition section"));
9644 endbuf
= (char *) edefs
+ section
->sh_size
;
9646 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
9649 Elf_External_Verdef
* edef
;
9650 Elf_Internal_Verdef ent
;
9651 Elf_External_Verdaux
* eaux
;
9652 Elf_Internal_Verdaux aux
;
9656 /* Check for very large indicies. */
9657 if (idx
> (size_t) (endbuf
- (char *) edefs
))
9660 vstart
= ((char *) edefs
) + idx
;
9661 if (vstart
+ sizeof (*edef
) > endbuf
)
9664 edef
= (Elf_External_Verdef
*) vstart
;
9666 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
9667 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
9668 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
9669 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
9670 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
9671 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
9672 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
9674 printf (_(" %#06x: Rev: %d Flags: %s"),
9675 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
9677 printf (_(" Index: %d Cnt: %d "),
9678 ent
.vd_ndx
, ent
.vd_cnt
);
9680 /* Check for overflow. */
9681 if (ent
.vd_aux
> (size_t) (endbuf
- vstart
))
9684 vstart
+= ent
.vd_aux
;
9686 eaux
= (Elf_External_Verdaux
*) vstart
;
9688 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
9689 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
9691 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
9692 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux
.vda_name
));
9694 printf (_("Name index: %ld\n"), aux
.vda_name
);
9696 isum
= idx
+ ent
.vd_aux
;
9698 for (j
= 1; j
< ent
.vd_cnt
; j
++)
9700 /* Check for overflow. */
9701 if (aux
.vda_next
> (size_t) (endbuf
- vstart
))
9704 isum
+= aux
.vda_next
;
9705 vstart
+= aux
.vda_next
;
9707 eaux
= (Elf_External_Verdaux
*) vstart
;
9708 if (vstart
+ sizeof (*eaux
) > endbuf
)
9711 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
9712 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
9714 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
9715 printf (_(" %#06x: Parent %d: %s\n"),
9716 isum
, j
, GET_DYNAMIC_NAME (aux
.vda_name
));
9718 printf (_(" %#06x: Parent %d, name index: %ld\n"),
9719 isum
, j
, aux
.vda_name
);
9723 printf (_(" Version def aux past end of section\n"));
9725 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2. */
9726 if (idx
+ ent
.vd_next
<= idx
)
9732 if (cnt
< section
->sh_info
)
9733 printf (_(" Version definition past end of section\n"));
9739 case SHT_GNU_verneed
:
9741 Elf_External_Verneed
* eneed
;
9748 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
9749 printable_section_name (section
), section
->sh_info
);
9751 printf (_(" Addr: 0x"));
9752 printf_vma (section
->sh_addr
);
9753 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
9754 (unsigned long) section
->sh_offset
, section
->sh_link
,
9755 printable_section_name_from_index (section
->sh_link
));
9757 eneed
= (Elf_External_Verneed
*) get_data (NULL
, file
,
9758 section
->sh_offset
, 1,
9760 _("Version Needs section"));
9763 endbuf
= (char *) eneed
+ section
->sh_size
;
9765 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
9767 Elf_External_Verneed
* entry
;
9768 Elf_Internal_Verneed ent
;
9773 if (idx
> (size_t) (endbuf
- (char *) eneed
))
9776 vstart
= ((char *) eneed
) + idx
;
9777 if (vstart
+ sizeof (*entry
) > endbuf
)
9780 entry
= (Elf_External_Verneed
*) vstart
;
9782 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
9783 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
9784 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
9785 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
9786 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
9788 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
9790 if (VALID_DYNAMIC_NAME (ent
.vn_file
))
9791 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent
.vn_file
));
9793 printf (_(" File: %lx"), ent
.vn_file
);
9795 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
9797 /* Check for overflow. */
9798 if (ent
.vn_aux
> (size_t) (endbuf
- vstart
))
9800 vstart
+= ent
.vn_aux
;
9802 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
9804 Elf_External_Vernaux
* eaux
;
9805 Elf_Internal_Vernaux aux
;
9807 if (vstart
+ sizeof (*eaux
) > endbuf
)
9809 eaux
= (Elf_External_Vernaux
*) vstart
;
9811 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
9812 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
9813 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
9814 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
9815 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
9817 if (VALID_DYNAMIC_NAME (aux
.vna_name
))
9818 printf (_(" %#06x: Name: %s"),
9819 isum
, GET_DYNAMIC_NAME (aux
.vna_name
));
9821 printf (_(" %#06x: Name index: %lx"),
9822 isum
, aux
.vna_name
);
9824 printf (_(" Flags: %s Version: %d\n"),
9825 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
9827 /* Check for overflow. */
9828 if (aux
.vna_next
> (size_t) (endbuf
- vstart
)
9829 || (aux
.vna_next
== 0 && j
< ent
.vn_cnt
- 1))
9831 warn (_("Invalid vna_next field of %lx\n"),
9836 isum
+= aux
.vna_next
;
9837 vstart
+= aux
.vna_next
;
9841 warn (_("Missing Version Needs auxillary information\n"));
9843 if (ent
.vn_next
== 0 && cnt
< section
->sh_info
- 1)
9845 warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
9846 cnt
= section
->sh_info
;
9852 if (cnt
< section
->sh_info
)
9853 warn (_("Missing Version Needs information\n"));
9859 case SHT_GNU_versym
:
9861 Elf_Internal_Shdr
* link_section
;
9864 unsigned char * edata
;
9865 unsigned short * data
;
9867 Elf_Internal_Sym
* symbols
;
9868 Elf_Internal_Shdr
* string_sec
;
9869 unsigned long num_syms
;
9872 if (section
->sh_link
>= elf_header
.e_shnum
)
9875 link_section
= section_headers
+ section
->sh_link
;
9876 total
= section
->sh_size
/ sizeof (Elf_External_Versym
);
9878 if (link_section
->sh_link
>= elf_header
.e_shnum
)
9883 symbols
= GET_ELF_SYMBOLS (file
, link_section
, & num_syms
);
9884 if (symbols
== NULL
)
9887 string_sec
= section_headers
+ link_section
->sh_link
;
9889 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
, 1,
9890 string_sec
->sh_size
,
9891 _("version string table"));
9898 printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
9899 printable_section_name (section
), (unsigned long) total
);
9901 printf (_(" Addr: "));
9902 printf_vma (section
->sh_addr
);
9903 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
9904 (unsigned long) section
->sh_offset
, section
->sh_link
,
9905 printable_section_name (link_section
));
9907 off
= offset_from_vma (file
,
9908 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
9909 total
* sizeof (short));
9910 edata
= (unsigned char *) get_data (NULL
, file
, off
, total
,
9912 _("version symbol data"));
9920 data
= (short unsigned int *) cmalloc (total
, sizeof (short));
9922 for (cnt
= total
; cnt
--;)
9923 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
9928 for (cnt
= 0; cnt
< total
; cnt
+= 4)
9932 char *invalid
= _("*invalid*");
9934 printf (" %03x:", cnt
);
9936 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
9937 switch (data
[cnt
+ j
])
9940 fputs (_(" 0 (*local*) "), stdout
);
9944 fputs (_(" 1 (*global*) "), stdout
);
9948 nn
= printf ("%4x%c", data
[cnt
+ j
] & VERSYM_VERSION
,
9949 data
[cnt
+ j
] & VERSYM_HIDDEN
? 'h' : ' ');
9951 /* If this index value is greater than the size of the symbols
9952 array, break to avoid an out-of-bounds read. */
9953 if ((unsigned long)(cnt
+ j
) >= num_syms
)
9955 warn (_("invalid index into symbol array\n"));
9960 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
9962 Elf_Internal_Verneed ivn
;
9963 unsigned long offset
;
9965 offset
= offset_from_vma
9966 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
9967 sizeof (Elf_External_Verneed
));
9971 Elf_Internal_Vernaux ivna
;
9972 Elf_External_Verneed evn
;
9973 Elf_External_Vernaux evna
;
9974 unsigned long a_off
;
9976 if (get_data (&evn
, file
, offset
, sizeof (evn
), 1,
9977 _("version need")) == NULL
)
9980 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
9981 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
9983 a_off
= offset
+ ivn
.vn_aux
;
9987 if (get_data (&evna
, file
, a_off
, sizeof (evna
),
9988 1, _("version need aux (2)")) == NULL
)
9995 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
9996 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
9999 a_off
+= ivna
.vna_next
;
10001 while (ivna
.vna_other
!= data
[cnt
+ j
]
10002 && ivna
.vna_next
!= 0);
10004 if (ivna
.vna_other
== data
[cnt
+ j
])
10006 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
10008 if (ivna
.vna_name
>= string_sec
->sh_size
)
10011 name
= strtab
+ ivna
.vna_name
;
10015 offset
+= ivn
.vn_next
;
10017 while (ivn
.vn_next
);
10020 if (data
[cnt
+ j
] != 0x8001
10021 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
10023 Elf_Internal_Verdef ivd
;
10024 Elf_External_Verdef evd
;
10025 unsigned long offset
;
10027 offset
= offset_from_vma
10028 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
10033 if (get_data (&evd
, file
, offset
, sizeof (evd
), 1,
10034 _("version def")) == NULL
)
10037 /* PR 17531: file: 046-1082287-0.004. */
10038 ivd
.vd_ndx
= (data
[cnt
+ j
] & VERSYM_VERSION
) + 1;
10043 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
10044 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
10047 offset
+= ivd
.vd_next
;
10049 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & VERSYM_VERSION
)
10050 && ivd
.vd_next
!= 0);
10052 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & VERSYM_VERSION
))
10054 Elf_External_Verdaux evda
;
10055 Elf_Internal_Verdaux ivda
;
10057 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
10059 if (get_data (&evda
, file
,
10060 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
10062 _("version def aux")) == NULL
)
10065 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
10067 if (ivda
.vda_name
>= string_sec
->sh_size
)
10069 else if (name
!= NULL
&& name
!= invalid
)
10070 name
= _("*both*");
10072 name
= strtab
+ ivda
.vda_name
;
10076 nn
+= printf ("(%s%-*s",
10078 12 - (int) strlen (name
),
10082 printf ("%*c", 18 - nn
, ' ');
10100 printf (_("\nNo version information found in this file.\n"));
10105 static const char *
10106 get_symbol_binding (unsigned int binding
)
10108 static char buff
[32];
10112 case STB_LOCAL
: return "LOCAL";
10113 case STB_GLOBAL
: return "GLOBAL";
10114 case STB_WEAK
: return "WEAK";
10116 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
10117 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"),
10119 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
10121 if (binding
== STB_GNU_UNIQUE
10122 && (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_GNU
10123 /* GNU is still using the default value 0. */
10124 || elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_NONE
))
10126 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), binding
);
10129 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), binding
);
10134 static const char *
10135 get_symbol_type (unsigned int type
)
10137 static char buff
[32];
10141 case STT_NOTYPE
: return "NOTYPE";
10142 case STT_OBJECT
: return "OBJECT";
10143 case STT_FUNC
: return "FUNC";
10144 case STT_SECTION
: return "SECTION";
10145 case STT_FILE
: return "FILE";
10146 case STT_COMMON
: return "COMMON";
10147 case STT_TLS
: return "TLS";
10148 case STT_RELC
: return "RELC";
10149 case STT_SRELC
: return "SRELC";
10151 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
10153 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
10154 return "THUMB_FUNC";
10156 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
10159 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
10160 return "PARISC_MILLI";
10162 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"), type
);
10164 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
10166 if (elf_header
.e_machine
== EM_PARISC
)
10168 if (type
== STT_HP_OPAQUE
)
10169 return "HP_OPAQUE";
10170 if (type
== STT_HP_STUB
)
10174 if (type
== STT_GNU_IFUNC
10175 && (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_GNU
10176 || elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_FREEBSD
10177 /* GNU is still using the default value 0. */
10178 || elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_NONE
))
10181 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), type
);
10184 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), type
);
10189 static const char *
10190 get_symbol_visibility (unsigned int visibility
)
10192 switch (visibility
)
10194 case STV_DEFAULT
: return "DEFAULT";
10195 case STV_INTERNAL
: return "INTERNAL";
10196 case STV_HIDDEN
: return "HIDDEN";
10197 case STV_PROTECTED
: return "PROTECTED";
10199 error (_("Unrecognized visibility value: %u"), visibility
);
10200 return _("<unknown>");
10204 static const char *
10205 get_mips_symbol_other (unsigned int other
)
10215 case STO_MICROMIPS
:
10216 return "MICROMIPS";
10217 case STO_MICROMIPS
| STO_MIPS_PIC
:
10218 return "MICROMIPS, MIPS PIC";
10226 static const char *
10227 get_ia64_symbol_other (unsigned int other
)
10229 if (is_ia64_vms ())
10231 static char res
[32];
10235 /* Function types is for images and .STB files only. */
10236 switch (elf_header
.e_type
)
10240 switch (VMS_ST_FUNC_TYPE (other
))
10242 case VMS_SFT_CODE_ADDR
:
10243 strcat (res
, " CA");
10245 case VMS_SFT_SYMV_IDX
:
10246 strcat (res
, " VEC");
10249 strcat (res
, " FD");
10251 case VMS_SFT_RESERVE
:
10252 strcat (res
, " RSV");
10255 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10256 VMS_ST_FUNC_TYPE (other
));
10257 strcat (res
, " <unknown>");
10264 switch (VMS_ST_LINKAGE (other
))
10266 case VMS_STL_IGNORE
:
10267 strcat (res
, " IGN");
10269 case VMS_STL_RESERVE
:
10270 strcat (res
, " RSV");
10273 strcat (res
, " STD");
10276 strcat (res
, " LNK");
10279 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10280 VMS_ST_LINKAGE (other
));
10281 strcat (res
, " <unknown>");
10293 static const char *
10294 get_ppc64_symbol_other (unsigned int other
)
10296 if (PPC64_LOCAL_ENTRY_OFFSET (other
) != 0)
10298 static char buf
[32];
10299 snprintf (buf
, sizeof buf
, _("<localentry>: %d"),
10300 PPC64_LOCAL_ENTRY_OFFSET (other
));
10306 static const char *
10307 get_symbol_other (unsigned int other
)
10309 const char * result
= NULL
;
10310 static char buff
[32];
10315 switch (elf_header
.e_machine
)
10318 result
= get_mips_symbol_other (other
);
10321 result
= get_ia64_symbol_other (other
);
10324 result
= get_ppc64_symbol_other (other
);
10333 snprintf (buff
, sizeof buff
, _("<other>: %x"), other
);
10337 static const char *
10338 get_symbol_index_type (unsigned int type
)
10340 static char buff
[32];
10344 case SHN_UNDEF
: return "UND";
10345 case SHN_ABS
: return "ABS";
10346 case SHN_COMMON
: return "COM";
10348 if (type
== SHN_IA_64_ANSI_COMMON
10349 && elf_header
.e_machine
== EM_IA_64
10350 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
10352 else if ((elf_header
.e_machine
== EM_X86_64
10353 || elf_header
.e_machine
== EM_L1OM
10354 || elf_header
.e_machine
== EM_K1OM
)
10355 && type
== SHN_X86_64_LCOMMON
)
10356 return "LARGE_COM";
10357 else if ((type
== SHN_MIPS_SCOMMON
10358 && elf_header
.e_machine
== EM_MIPS
)
10359 || (type
== SHN_TIC6X_SCOMMON
10360 && elf_header
.e_machine
== EM_TI_C6000
))
10362 else if (type
== SHN_MIPS_SUNDEFINED
10363 && elf_header
.e_machine
== EM_MIPS
)
10365 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
10366 sprintf (buff
, "PRC[0x%04x]", type
& 0xffff);
10367 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
10368 sprintf (buff
, "OS [0x%04x]", type
& 0xffff);
10369 else if (type
>= SHN_LORESERVE
)
10370 sprintf (buff
, "RSV[0x%04x]", type
& 0xffff);
10371 else if (type
>= elf_header
.e_shnum
)
10372 sprintf (buff
, _("bad section index[%3d]"), type
);
10374 sprintf (buff
, "%3d", type
);
10382 get_dynamic_data (FILE * file
, bfd_size_type number
, unsigned int ent_size
)
10384 unsigned char * e_data
;
10387 /* If the size_t type is smaller than the bfd_size_type, eg because
10388 you are building a 32-bit tool on a 64-bit host, then make sure
10389 that when (number) is cast to (size_t) no information is lost. */
10390 if (sizeof (size_t) < sizeof (bfd_size_type
)
10391 && (bfd_size_type
) ((size_t) number
) != number
)
10393 error (_("Size truncation prevents reading %llu elements of size %u\n"),
10394 (unsigned long long) number
, ent_size
);
10398 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10399 attempting to allocate memory when the read is bound to fail. */
10400 if (ent_size
* number
> current_file_size
)
10402 error (_("Invalid number of dynamic entries: %llu\n"),
10403 (unsigned long long) number
);
10407 e_data
= (unsigned char *) cmalloc ((size_t) number
, ent_size
);
10408 if (e_data
== NULL
)
10410 error (_("Out of memory reading %llu dynamic entries\n"),
10411 (unsigned long long) number
);
10415 if (fread (e_data
, ent_size
, (size_t) number
, file
) != number
)
10417 error (_("Unable to read in %llu bytes of dynamic data\n"),
10418 (unsigned long long) (number
* ent_size
));
10423 i_data
= (bfd_vma
*) cmalloc ((size_t) number
, sizeof (*i_data
));
10424 if (i_data
== NULL
)
10426 error (_("Out of memory allocating space for %llu dynamic entries\n"),
10427 (unsigned long long) number
);
10433 i_data
[number
] = byte_get (e_data
+ number
* ent_size
, ent_size
);
10441 print_dynamic_symbol (bfd_vma si
, unsigned long hn
)
10443 Elf_Internal_Sym
* psym
;
10446 n
= print_vma (si
, DEC_5
);
10448 fputs (&" "[n
], stdout
);
10449 printf (" %3lu: ", hn
);
10451 if (dynamic_symbols
== NULL
|| si
>= num_dynamic_syms
)
10453 printf (_("<No info available for dynamic symbol number %lu>\n"),
10454 (unsigned long) si
);
10458 psym
= dynamic_symbols
+ si
;
10459 print_vma (psym
->st_value
, LONG_HEX
);
10461 print_vma (psym
->st_size
, DEC_5
);
10463 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
10464 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
10465 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
10466 /* Check to see if any other bits in the st_other field are set.
10467 Note - displaying this information disrupts the layout of the
10468 table being generated, but for the moment this case is very
10470 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
10471 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
10472 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
10473 if (VALID_DYNAMIC_NAME (psym
->st_name
))
10474 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
10476 printf (_(" <corrupt: %14ld>"), psym
->st_name
);
10480 static const char *
10481 get_symbol_version_string (FILE *file
, int is_dynsym
,
10482 const char *strtab
,
10483 unsigned long int strtab_size
,
10484 unsigned int si
, Elf_Internal_Sym
*psym
,
10485 enum versioned_symbol_info
*sym_info
,
10486 unsigned short *vna_other
)
10488 unsigned char data
[2];
10489 unsigned short vers_data
;
10490 unsigned long offset
;
10493 || version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] == 0)
10496 offset
= offset_from_vma (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
10497 sizeof data
+ si
* sizeof (vers_data
));
10499 if (get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
10500 sizeof (data
), 1, _("version data")) == NULL
)
10503 vers_data
= byte_get (data
, 2);
10505 if ((vers_data
& VERSYM_HIDDEN
) == 0 && vers_data
<= 1)
10508 /* Usually we'd only see verdef for defined symbols, and verneed for
10509 undefined symbols. However, symbols defined by the linker in
10510 .dynbss for variables copied from a shared library in order to
10511 avoid text relocations are defined yet have verneed. We could
10512 use a heuristic to detect the special case, for example, check
10513 for verneed first on symbols defined in SHT_NOBITS sections, but
10514 it is simpler and more reliable to just look for both verdef and
10515 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
10517 if (psym
->st_shndx
!= SHN_UNDEF
10518 && vers_data
!= 0x8001
10519 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
10521 Elf_Internal_Verdef ivd
;
10522 Elf_Internal_Verdaux ivda
;
10523 Elf_External_Verdaux evda
;
10526 off
= offset_from_vma (file
,
10527 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
10528 sizeof (Elf_External_Verdef
));
10532 Elf_External_Verdef evd
;
10534 if (get_data (&evd
, file
, off
, sizeof (evd
), 1,
10535 _("version def")) == NULL
)
10543 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
10544 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
10545 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
10548 off
+= ivd
.vd_next
;
10550 while (ivd
.vd_ndx
!= (vers_data
& VERSYM_VERSION
) && ivd
.vd_next
!= 0);
10552 if (ivd
.vd_ndx
== (vers_data
& VERSYM_VERSION
))
10554 off
-= ivd
.vd_next
;
10557 if (get_data (&evda
, file
, off
, sizeof (evda
), 1,
10558 _("version def aux")) != NULL
)
10560 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
10562 if (psym
->st_name
!= ivda
.vda_name
)
10564 *sym_info
= ((vers_data
& VERSYM_HIDDEN
) != 0
10565 ? symbol_hidden
: symbol_public
);
10566 return (ivda
.vda_name
< strtab_size
10567 ? strtab
+ ivda
.vda_name
: _("<corrupt>"));
10573 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
10575 Elf_External_Verneed evn
;
10576 Elf_Internal_Verneed ivn
;
10577 Elf_Internal_Vernaux ivna
;
10579 offset
= offset_from_vma (file
,
10580 version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
10584 unsigned long vna_off
;
10586 if (get_data (&evn
, file
, offset
, sizeof (evn
), 1,
10587 _("version need")) == NULL
)
10590 ivna
.vna_other
= 0;
10595 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
10596 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
10598 vna_off
= offset
+ ivn
.vn_aux
;
10602 Elf_External_Vernaux evna
;
10604 if (get_data (&evna
, file
, vna_off
, sizeof (evna
), 1,
10605 _("version need aux (3)")) == NULL
)
10608 ivna
.vna_other
= 0;
10613 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
10614 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
10615 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
10618 vna_off
+= ivna
.vna_next
;
10620 while (ivna
.vna_other
!= vers_data
&& ivna
.vna_next
!= 0);
10622 if (ivna
.vna_other
== vers_data
)
10625 offset
+= ivn
.vn_next
;
10627 while (ivn
.vn_next
!= 0);
10629 if (ivna
.vna_other
== vers_data
)
10631 *sym_info
= symbol_undefined
;
10632 *vna_other
= ivna
.vna_other
;
10633 return (ivna
.vna_name
< strtab_size
10634 ? strtab
+ ivna
.vna_name
: _("<corrupt>"));
10640 /* Dump the symbol table. */
10642 process_symbol_table (FILE * file
)
10644 Elf_Internal_Shdr
* section
;
10645 bfd_size_type nbuckets
= 0;
10646 bfd_size_type nchains
= 0;
10647 bfd_vma
* buckets
= NULL
;
10648 bfd_vma
* chains
= NULL
;
10649 bfd_vma ngnubuckets
= 0;
10650 bfd_vma
* gnubuckets
= NULL
;
10651 bfd_vma
* gnuchains
= NULL
;
10652 bfd_vma gnusymidx
= 0;
10653 bfd_size_type ngnuchains
= 0;
10655 if (!do_syms
&& !do_dyn_syms
&& !do_histogram
)
10658 if (dynamic_info
[DT_HASH
]
10660 || (do_using_dynamic
10662 && dynamic_strings
!= NULL
)))
10664 unsigned char nb
[8];
10665 unsigned char nc
[8];
10666 unsigned int hash_ent_size
= 4;
10668 if ((elf_header
.e_machine
== EM_ALPHA
10669 || elf_header
.e_machine
== EM_S390
10670 || elf_header
.e_machine
== EM_S390_OLD
)
10671 && elf_header
.e_ident
[EI_CLASS
] == ELFCLASS64
)
10675 (archive_file_offset
10676 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
10677 sizeof nb
+ sizeof nc
)),
10680 error (_("Unable to seek to start of dynamic information\n"));
10684 if (fread (nb
, hash_ent_size
, 1, file
) != 1)
10686 error (_("Failed to read in number of buckets\n"));
10690 if (fread (nc
, hash_ent_size
, 1, file
) != 1)
10692 error (_("Failed to read in number of chains\n"));
10696 nbuckets
= byte_get (nb
, hash_ent_size
);
10697 nchains
= byte_get (nc
, hash_ent_size
);
10699 buckets
= get_dynamic_data (file
, nbuckets
, hash_ent_size
);
10700 chains
= get_dynamic_data (file
, nchains
, hash_ent_size
);
10703 if (buckets
== NULL
|| chains
== NULL
)
10705 if (do_using_dynamic
)
10716 if (dynamic_info_DT_GNU_HASH
10718 || (do_using_dynamic
10720 && dynamic_strings
!= NULL
)))
10722 unsigned char nb
[16];
10723 bfd_vma i
, maxchain
= 0xffffffff, bitmaskwords
;
10724 bfd_vma buckets_vma
;
10727 (archive_file_offset
10728 + offset_from_vma (file
, dynamic_info_DT_GNU_HASH
,
10732 error (_("Unable to seek to start of dynamic information\n"));
10736 if (fread (nb
, 16, 1, file
) != 1)
10738 error (_("Failed to read in number of buckets\n"));
10742 ngnubuckets
= byte_get (nb
, 4);
10743 gnusymidx
= byte_get (nb
+ 4, 4);
10744 bitmaskwords
= byte_get (nb
+ 8, 4);
10745 buckets_vma
= dynamic_info_DT_GNU_HASH
+ 16;
10747 buckets_vma
+= bitmaskwords
* 4;
10749 buckets_vma
+= bitmaskwords
* 8;
10752 (archive_file_offset
10753 + offset_from_vma (file
, buckets_vma
, 4)),
10756 error (_("Unable to seek to start of dynamic information\n"));
10760 gnubuckets
= get_dynamic_data (file
, ngnubuckets
, 4);
10762 if (gnubuckets
== NULL
)
10765 for (i
= 0; i
< ngnubuckets
; i
++)
10766 if (gnubuckets
[i
] != 0)
10768 if (gnubuckets
[i
] < gnusymidx
)
10771 if (maxchain
== 0xffffffff || gnubuckets
[i
] > maxchain
)
10772 maxchain
= gnubuckets
[i
];
10775 if (maxchain
== 0xffffffff)
10778 maxchain
-= gnusymidx
;
10781 (archive_file_offset
10782 + offset_from_vma (file
, buckets_vma
10783 + 4 * (ngnubuckets
+ maxchain
), 4)),
10786 error (_("Unable to seek to start of dynamic information\n"));
10792 if (fread (nb
, 4, 1, file
) != 1)
10794 error (_("Failed to determine last chain length\n"));
10798 if (maxchain
+ 1 == 0)
10803 while ((byte_get (nb
, 4) & 1) == 0);
10806 (archive_file_offset
10807 + offset_from_vma (file
, buckets_vma
+ 4 * ngnubuckets
, 4)),
10810 error (_("Unable to seek to start of dynamic information\n"));
10814 gnuchains
= get_dynamic_data (file
, maxchain
, 4);
10815 ngnuchains
= maxchain
;
10818 if (gnuchains
== NULL
)
10823 if (do_using_dynamic
)
10828 if ((dynamic_info
[DT_HASH
] || dynamic_info_DT_GNU_HASH
)
10830 && do_using_dynamic
10831 && dynamic_strings
!= NULL
10832 && dynamic_symbols
!= NULL
)
10836 if (dynamic_info
[DT_HASH
])
10840 printf (_("\nSymbol table for image:\n"));
10842 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10844 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10846 for (hn
= 0; hn
< nbuckets
; hn
++)
10851 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
10852 print_dynamic_symbol (si
, hn
);
10856 if (dynamic_info_DT_GNU_HASH
)
10858 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
10860 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10862 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10864 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
10865 if (gnubuckets
[hn
] != 0)
10867 bfd_vma si
= gnubuckets
[hn
];
10868 bfd_vma off
= si
- gnusymidx
;
10872 print_dynamic_symbol (si
, hn
);
10875 while (off
< ngnuchains
&& (gnuchains
[off
++] & 1) == 0);
10879 else if ((do_dyn_syms
|| (do_syms
&& !do_using_dynamic
))
10880 && section_headers
!= NULL
)
10884 for (i
= 0, section
= section_headers
;
10885 i
< elf_header
.e_shnum
;
10889 char * strtab
= NULL
;
10890 unsigned long int strtab_size
= 0;
10891 Elf_Internal_Sym
* symtab
;
10892 Elf_Internal_Sym
* psym
;
10893 unsigned long num_syms
;
10895 if ((section
->sh_type
!= SHT_SYMTAB
10896 && section
->sh_type
!= SHT_DYNSYM
)
10898 && section
->sh_type
== SHT_SYMTAB
))
10901 if (section
->sh_entsize
== 0)
10903 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
10904 printable_section_name (section
));
10908 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
10909 printable_section_name (section
),
10910 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
10913 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
10915 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
10917 symtab
= GET_ELF_SYMBOLS (file
, section
, & num_syms
);
10918 if (symtab
== NULL
)
10921 if (section
->sh_link
== elf_header
.e_shstrndx
)
10923 strtab
= string_table
;
10924 strtab_size
= string_table_length
;
10926 else if (section
->sh_link
< elf_header
.e_shnum
)
10928 Elf_Internal_Shdr
* string_sec
;
10930 string_sec
= section_headers
+ section
->sh_link
;
10932 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
10933 1, string_sec
->sh_size
,
10934 _("string table"));
10935 strtab_size
= strtab
!= NULL
? string_sec
->sh_size
: 0;
10938 for (si
= 0, psym
= symtab
; si
< num_syms
; si
++, psym
++)
10940 const char *version_string
;
10941 enum versioned_symbol_info sym_info
;
10942 unsigned short vna_other
;
10944 printf ("%6d: ", si
);
10945 print_vma (psym
->st_value
, LONG_HEX
);
10947 print_vma (psym
->st_size
, DEC_5
);
10948 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
10949 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
10950 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
10951 /* Check to see if any other bits in the st_other field are set.
10952 Note - displaying this information disrupts the layout of the
10953 table being generated, but for the moment this case is very rare. */
10954 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
10955 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
10956 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
10957 print_symbol (25, psym
->st_name
< strtab_size
10958 ? strtab
+ psym
->st_name
: _("<corrupt>"));
10961 = get_symbol_version_string (file
,
10962 section
->sh_type
== SHT_DYNSYM
,
10963 strtab
, strtab_size
, si
,
10964 psym
, &sym_info
, &vna_other
);
10965 if (version_string
)
10967 if (sym_info
== symbol_undefined
)
10968 printf ("@%s (%d)", version_string
, vna_other
);
10970 printf (sym_info
== symbol_hidden
? "@%s" : "@@%s",
10978 if (strtab
!= string_table
)
10984 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
10986 if (do_histogram
&& buckets
!= NULL
)
10988 unsigned long * lengths
;
10989 unsigned long * counts
;
10992 unsigned long maxlength
= 0;
10993 unsigned long nzero_counts
= 0;
10994 unsigned long nsyms
= 0;
10995 unsigned long chained
;
10997 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
10998 (unsigned long) nbuckets
);
11000 lengths
= (unsigned long *) calloc (nbuckets
, sizeof (*lengths
));
11001 if (lengths
== NULL
)
11003 error (_("Out of memory allocating space for histogram buckets\n"));
11007 printf (_(" Length Number %% of total Coverage\n"));
11008 for (hn
= 0; hn
< nbuckets
; ++hn
)
11010 for (si
= buckets
[hn
], chained
= 0;
11011 si
> 0 && si
< nchains
&& si
< nbuckets
&& chained
<= nchains
;
11012 si
= chains
[si
], ++chained
)
11015 if (maxlength
< ++lengths
[hn
])
11019 /* PR binutils/17531: A corrupt binary could contain broken
11020 histogram data. Do not go into an infinite loop trying
11022 if (chained
> nchains
)
11024 error (_("histogram chain is corrupt\n"));
11029 counts
= (unsigned long *) calloc (maxlength
+ 1, sizeof (*counts
));
11030 if (counts
== NULL
)
11033 error (_("Out of memory allocating space for histogram counts\n"));
11037 for (hn
= 0; hn
< nbuckets
; ++hn
)
11038 ++counts
[lengths
[hn
]];
11043 printf (" 0 %-10lu (%5.1f%%)\n",
11044 counts
[0], (counts
[0] * 100.0) / nbuckets
);
11045 for (i
= 1; i
<= maxlength
; ++i
)
11047 nzero_counts
+= counts
[i
] * i
;
11048 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11049 i
, counts
[i
], (counts
[i
] * 100.0) / nbuckets
,
11050 (nzero_counts
* 100.0) / nsyms
);
11058 if (buckets
!= NULL
)
11064 if (do_histogram
&& gnubuckets
!= NULL
)
11066 unsigned long * lengths
;
11067 unsigned long * counts
;
11069 unsigned long maxlength
= 0;
11070 unsigned long nzero_counts
= 0;
11071 unsigned long nsyms
= 0;
11073 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11074 (unsigned long) ngnubuckets
);
11076 lengths
= (unsigned long *) calloc (ngnubuckets
, sizeof (*lengths
));
11077 if (lengths
== NULL
)
11079 error (_("Out of memory allocating space for gnu histogram buckets\n"));
11083 printf (_(" Length Number %% of total Coverage\n"));
11085 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
11086 if (gnubuckets
[hn
] != 0)
11088 bfd_vma off
, length
= 1;
11090 for (off
= gnubuckets
[hn
] - gnusymidx
;
11091 /* PR 17531 file: 010-77222-0.004. */
11092 off
< ngnuchains
&& (gnuchains
[off
] & 1) == 0;
11095 lengths
[hn
] = length
;
11096 if (length
> maxlength
)
11097 maxlength
= length
;
11101 counts
= (unsigned long *) calloc (maxlength
+ 1, sizeof (*counts
));
11102 if (counts
== NULL
)
11105 error (_("Out of memory allocating space for gnu histogram counts\n"));
11109 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
11110 ++counts
[lengths
[hn
]];
11112 if (ngnubuckets
> 0)
11115 printf (" 0 %-10lu (%5.1f%%)\n",
11116 counts
[0], (counts
[0] * 100.0) / ngnubuckets
);
11117 for (j
= 1; j
<= maxlength
; ++j
)
11119 nzero_counts
+= counts
[j
] * j
;
11120 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11121 j
, counts
[j
], (counts
[j
] * 100.0) / ngnubuckets
,
11122 (nzero_counts
* 100.0) / nsyms
);
11136 process_syminfo (FILE * file ATTRIBUTE_UNUSED
)
11140 if (dynamic_syminfo
== NULL
11142 /* No syminfo, this is ok. */
11145 /* There better should be a dynamic symbol section. */
11146 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
11150 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11151 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
11153 printf (_(" Num: Name BoundTo Flags\n"));
11154 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
11156 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
11158 printf ("%4d: ", i
);
11159 if (i
>= num_dynamic_syms
)
11160 printf (_("<corrupt index>"));
11161 else if (VALID_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
))
11162 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
));
11164 printf (_("<corrupt: %19ld>"), dynamic_symbols
[i
].st_name
);
11167 switch (dynamic_syminfo
[i
].si_boundto
)
11169 case SYMINFO_BT_SELF
:
11170 fputs ("SELF ", stdout
);
11172 case SYMINFO_BT_PARENT
:
11173 fputs ("PARENT ", stdout
);
11176 if (dynamic_syminfo
[i
].si_boundto
> 0
11177 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
11178 && VALID_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
11180 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
11184 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
11188 if (flags
& SYMINFO_FLG_DIRECT
)
11189 printf (" DIRECT");
11190 if (flags
& SYMINFO_FLG_PASSTHRU
)
11191 printf (" PASSTHRU");
11192 if (flags
& SYMINFO_FLG_COPY
)
11194 if (flags
& SYMINFO_FLG_LAZYLOAD
)
11195 printf (" LAZYLOAD");
11203 /* Check to see if the given reloc needs to be handled in a target specific
11204 manner. If so then process the reloc and return TRUE otherwise return
11208 target_specific_reloc_handling (Elf_Internal_Rela
* reloc
,
11209 unsigned char * start
,
11210 Elf_Internal_Sym
* symtab
)
11212 unsigned int reloc_type
= get_reloc_type (reloc
->r_info
);
11214 switch (elf_header
.e_machine
)
11217 case EM_MSP430_OLD
:
11219 static Elf_Internal_Sym
* saved_sym
= NULL
;
11221 switch (reloc_type
)
11223 case 10: /* R_MSP430_SYM_DIFF */
11224 if (uses_msp430x_relocs ())
11226 case 21: /* R_MSP430X_SYM_DIFF */
11227 saved_sym
= symtab
+ get_reloc_symindex (reloc
->r_info
);
11230 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11231 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11232 goto handle_sym_diff
;
11234 case 5: /* R_MSP430_16_BYTE */
11235 case 9: /* R_MSP430_8 */
11236 if (uses_msp430x_relocs ())
11238 goto handle_sym_diff
;
11240 case 2: /* R_MSP430_ABS16 */
11241 case 15: /* R_MSP430X_ABS16 */
11242 if (! uses_msp430x_relocs ())
11244 goto handle_sym_diff
;
11247 if (saved_sym
!= NULL
)
11251 value
= reloc
->r_addend
11252 + (symtab
[get_reloc_symindex (reloc
->r_info
)].st_value
11253 - saved_sym
->st_value
);
11255 byte_put (start
+ reloc
->r_offset
, value
, reloc_type
== 1 ? 4 : 2);
11263 if (saved_sym
!= NULL
)
11264 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
11271 case EM_CYGNUS_MN10300
:
11273 static Elf_Internal_Sym
* saved_sym
= NULL
;
11275 switch (reloc_type
)
11277 case 34: /* R_MN10300_ALIGN */
11279 case 33: /* R_MN10300_SYM_DIFF */
11280 saved_sym
= symtab
+ get_reloc_symindex (reloc
->r_info
);
11282 case 1: /* R_MN10300_32 */
11283 case 2: /* R_MN10300_16 */
11284 if (saved_sym
!= NULL
)
11288 value
= reloc
->r_addend
11289 + (symtab
[get_reloc_symindex (reloc
->r_info
)].st_value
11290 - saved_sym
->st_value
);
11292 byte_put (start
+ reloc
->r_offset
, value
, reloc_type
== 1 ? 4 : 2);
11299 if (saved_sym
!= NULL
)
11300 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
11308 static bfd_vma saved_sym1
= 0;
11309 static bfd_vma saved_sym2
= 0;
11310 static bfd_vma value
;
11312 switch (reloc_type
)
11314 case 0x80: /* R_RL78_SYM. */
11315 saved_sym1
= saved_sym2
;
11316 saved_sym2
= symtab
[get_reloc_symindex (reloc
->r_info
)].st_value
;
11317 saved_sym2
+= reloc
->r_addend
;
11320 case 0x83: /* R_RL78_OPsub. */
11321 value
= saved_sym1
- saved_sym2
;
11322 saved_sym2
= saved_sym1
= 0;
11326 case 0x41: /* R_RL78_ABS32. */
11327 byte_put (start
+ reloc
->r_offset
, value
, 4);
11331 case 0x43: /* R_RL78_ABS16. */
11332 byte_put (start
+ reloc
->r_offset
, value
, 2);
11346 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11347 DWARF debug sections. This is a target specific test. Note - we do not
11348 go through the whole including-target-headers-multiple-times route, (as
11349 we have already done with <elf/h8.h>) because this would become very
11350 messy and even then this function would have to contain target specific
11351 information (the names of the relocs instead of their numeric values).
11352 FIXME: This is not the correct way to solve this problem. The proper way
11353 is to have target specific reloc sizing and typing functions created by
11354 the reloc-macros.h header, in the same way that it already creates the
11355 reloc naming functions. */
11358 is_32bit_abs_reloc (unsigned int reloc_type
)
11360 switch (elf_header
.e_machine
)
11364 return reloc_type
== 1; /* R_386_32. */
11366 return reloc_type
== 1; /* R_68K_32. */
11368 return reloc_type
== 1; /* R_860_32. */
11370 return reloc_type
== 2; /* R_960_32. */
11372 return reloc_type
== 258; /* R_AARCH64_ABS32 */
11374 return reloc_type
== 1; /* R_ALPHA_REFLONG. */
11376 return reloc_type
== 1; /* R_ARC_32. */
11377 case EM_ARC_COMPACT
:
11378 case EM_ARC_COMPACT2
:
11379 return reloc_type
== 4; /* R_ARC_32. */
11381 return reloc_type
== 2; /* R_ARM_ABS32 */
11384 return reloc_type
== 1;
11385 case EM_ADAPTEVA_EPIPHANY
:
11386 return reloc_type
== 3;
11388 return reloc_type
== 0x12; /* R_byte4_data. */
11390 return reloc_type
== 3; /* R_CRIS_32. */
11392 return reloc_type
== 3; /* R_CR16_NUM32. */
11394 return reloc_type
== 15; /* R_CRX_NUM32. */
11395 case EM_CYGNUS_FRV
:
11396 return reloc_type
== 1;
11397 case EM_CYGNUS_D10V
:
11399 return reloc_type
== 6; /* R_D10V_32. */
11400 case EM_CYGNUS_D30V
:
11402 return reloc_type
== 12; /* R_D30V_32_NORMAL. */
11404 return reloc_type
== 3; /* R_DLX_RELOC_32. */
11405 case EM_CYGNUS_FR30
:
11407 return reloc_type
== 3; /* R_FR30_32. */
11409 return reloc_type
== 1; /* R_FT32_32. */
11413 return reloc_type
== 1; /* R_H8_DIR32. */
11415 return reloc_type
== 0x65 /* R_IA64_SECREL32LSB. */
11416 || reloc_type
== 0x25; /* R_IA64_DIR32LSB. */
11419 return reloc_type
== 2; /* R_IP2K_32. */
11421 return reloc_type
== 2; /* R_IQ2000_32. */
11422 case EM_LATTICEMICO32
:
11423 return reloc_type
== 3; /* R_LM32_32. */
11426 return reloc_type
== 3; /* R_M32C_32. */
11428 return reloc_type
== 34; /* R_M32R_32_RELA. */
11431 return reloc_type
== 6; /* R_M68HC11_32. */
11433 return reloc_type
== 1; /* R_MCORE_ADDR32. */
11434 case EM_CYGNUS_MEP
:
11435 return reloc_type
== 4; /* R_MEP_32. */
11437 return reloc_type
== 2; /* R_METAG_ADDR32. */
11438 case EM_MICROBLAZE
:
11439 return reloc_type
== 1; /* R_MICROBLAZE_32. */
11441 return reloc_type
== 2; /* R_MIPS_32. */
11443 return reloc_type
== 4; /* R_MMIX_32. */
11444 case EM_CYGNUS_MN10200
:
11446 return reloc_type
== 1; /* R_MN10200_32. */
11447 case EM_CYGNUS_MN10300
:
11449 return reloc_type
== 1; /* R_MN10300_32. */
11451 return reloc_type
== 1; /* R_MOXIE_32. */
11452 case EM_MSP430_OLD
:
11454 return reloc_type
== 1; /* R_MSP430_32 or R_MSP320_ABS32. */
11456 return reloc_type
== 2; /* R_MT_32. */
11458 return reloc_type
== 20; /* R_NDS32_RELA. */
11459 case EM_ALTERA_NIOS2
:
11460 return reloc_type
== 12; /* R_NIOS2_BFD_RELOC_32. */
11462 return reloc_type
== 1; /* R_NIOS_32. */
11464 return reloc_type
== 1; /* R_OR1K_32. */
11466 return (reloc_type
== 1 /* R_PARISC_DIR32. */
11467 || reloc_type
== 41); /* R_PARISC_SECREL32. */
11470 return reloc_type
== 1; /* R_PJ_DATA_DIR32. */
11472 return reloc_type
== 1; /* R_PPC64_ADDR32. */
11474 return reloc_type
== 1; /* R_PPC_ADDR32. */
11476 return reloc_type
== 1; /* R_RL78_DIR32. */
11478 return reloc_type
== 1; /* R_RX_DIR32. */
11480 return reloc_type
== 1; /* R_I370_ADDR31. */
11483 return reloc_type
== 4; /* R_S390_32. */
11485 return reloc_type
== 8; /* R_SCORE_ABS32. */
11487 return reloc_type
== 1; /* R_SH_DIR32. */
11488 case EM_SPARC32PLUS
:
11491 return reloc_type
== 3 /* R_SPARC_32. */
11492 || reloc_type
== 23; /* R_SPARC_UA32. */
11494 return reloc_type
== 6; /* R_SPU_ADDR32 */
11496 return reloc_type
== 1; /* R_C6000_ABS32. */
11498 return reloc_type
== 2; /* R_TILEGX_32. */
11500 return reloc_type
== 1; /* R_TILEPRO_32. */
11501 case EM_CYGNUS_V850
:
11503 return reloc_type
== 6; /* R_V850_ABS32. */
11505 return reloc_type
== 0x33; /* R_V810_WORD. */
11507 return reloc_type
== 1; /* R_VAX_32. */
11509 return reloc_type
== 3; /* R_VISIUM_32. */
11513 return reloc_type
== 10; /* R_X86_64_32. */
11516 return reloc_type
== 3; /* R_XC16C_ABS_32. */
11518 return reloc_type
== 4; /* R_XGATE_32. */
11520 return reloc_type
== 1; /* R_XSTROMY16_32. */
11521 case EM_XTENSA_OLD
:
11523 return reloc_type
== 1; /* R_XTENSA_32. */
11526 static unsigned int prev_warn
= 0;
11528 /* Avoid repeating the same warning multiple times. */
11529 if (prev_warn
!= elf_header
.e_machine
)
11530 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11531 elf_header
.e_machine
);
11532 prev_warn
= elf_header
.e_machine
;
11538 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11539 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
11542 is_32bit_pcrel_reloc (unsigned int reloc_type
)
11544 switch (elf_header
.e_machine
)
11548 return reloc_type
== 2; /* R_386_PC32. */
11550 return reloc_type
== 4; /* R_68K_PC32. */
11552 return reloc_type
== 261; /* R_AARCH64_PREL32 */
11553 case EM_ADAPTEVA_EPIPHANY
:
11554 return reloc_type
== 6;
11556 return reloc_type
== 10; /* R_ALPHA_SREL32. */
11557 case EM_ARC_COMPACT
:
11558 case EM_ARC_COMPACT2
:
11559 return reloc_type
== 49; /* R_ARC_32_PCREL. */
11561 return reloc_type
== 3; /* R_ARM_REL32 */
11562 case EM_MICROBLAZE
:
11563 return reloc_type
== 2; /* R_MICROBLAZE_32_PCREL. */
11565 return reloc_type
== 9; /* R_OR1K_32_PCREL. */
11567 return reloc_type
== 9; /* R_PARISC_PCREL32. */
11569 return reloc_type
== 26; /* R_PPC_REL32. */
11571 return reloc_type
== 26; /* R_PPC64_REL32. */
11574 return reloc_type
== 5; /* R_390_PC32. */
11576 return reloc_type
== 2; /* R_SH_REL32. */
11577 case EM_SPARC32PLUS
:
11580 return reloc_type
== 6; /* R_SPARC_DISP32. */
11582 return reloc_type
== 13; /* R_SPU_REL32. */
11584 return reloc_type
== 6; /* R_TILEGX_32_PCREL. */
11586 return reloc_type
== 4; /* R_TILEPRO_32_PCREL. */
11588 return reloc_type
== 6; /* R_VISIUM_32_PCREL */
11592 return reloc_type
== 2; /* R_X86_64_PC32. */
11593 case EM_XTENSA_OLD
:
11595 return reloc_type
== 14; /* R_XTENSA_32_PCREL. */
11597 /* Do not abort or issue an error message here. Not all targets use
11598 pc-relative 32-bit relocs in their DWARF debug information and we
11599 have already tested for target coverage in is_32bit_abs_reloc. A
11600 more helpful warning message will be generated by apply_relocations
11601 anyway, so just return. */
11606 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11607 a 64-bit absolute RELA relocation used in DWARF debug sections. */
11610 is_64bit_abs_reloc (unsigned int reloc_type
)
11612 switch (elf_header
.e_machine
)
11615 return reloc_type
== 257; /* R_AARCH64_ABS64. */
11617 return reloc_type
== 2; /* R_ALPHA_REFQUAD. */
11619 return reloc_type
== 0x27; /* R_IA64_DIR64LSB. */
11621 return reloc_type
== 80; /* R_PARISC_DIR64. */
11623 return reloc_type
== 38; /* R_PPC64_ADDR64. */
11624 case EM_SPARC32PLUS
:
11627 return reloc_type
== 54; /* R_SPARC_UA64. */
11631 return reloc_type
== 1; /* R_X86_64_64. */
11634 return reloc_type
== 22; /* R_S390_64. */
11636 return reloc_type
== 1; /* R_TILEGX_64. */
11638 return reloc_type
== 18; /* R_MIPS_64. */
11644 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11645 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
11648 is_64bit_pcrel_reloc (unsigned int reloc_type
)
11650 switch (elf_header
.e_machine
)
11653 return reloc_type
== 260; /* R_AARCH64_PREL64. */
11655 return reloc_type
== 11; /* R_ALPHA_SREL64. */
11657 return reloc_type
== 0x4f; /* R_IA64_PCREL64LSB. */
11659 return reloc_type
== 72; /* R_PARISC_PCREL64. */
11661 return reloc_type
== 44; /* R_PPC64_REL64. */
11662 case EM_SPARC32PLUS
:
11665 return reloc_type
== 46; /* R_SPARC_DISP64. */
11669 return reloc_type
== 24; /* R_X86_64_PC64. */
11672 return reloc_type
== 23; /* R_S390_PC64. */
11674 return reloc_type
== 5; /* R_TILEGX_64_PCREL. */
11680 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11681 a 24-bit absolute RELA relocation used in DWARF debug sections. */
11684 is_24bit_abs_reloc (unsigned int reloc_type
)
11686 switch (elf_header
.e_machine
)
11688 case EM_CYGNUS_MN10200
:
11690 return reloc_type
== 4; /* R_MN10200_24. */
11696 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11697 a 16-bit absolute RELA relocation used in DWARF debug sections. */
11700 is_16bit_abs_reloc (unsigned int reloc_type
)
11702 switch (elf_header
.e_machine
)
11705 case EM_ARC_COMPACT
:
11706 case EM_ARC_COMPACT2
:
11707 return reloc_type
== 2; /* R_ARC_16. */
11710 return reloc_type
== 4; /* R_AVR_16. */
11711 case EM_ADAPTEVA_EPIPHANY
:
11712 return reloc_type
== 5;
11713 case EM_CYGNUS_D10V
:
11715 return reloc_type
== 3; /* R_D10V_16. */
11719 return reloc_type
== R_H8_DIR16
;
11722 return reloc_type
== 1; /* R_IP2K_16. */
11725 return reloc_type
== 1; /* R_M32C_16 */
11727 if (uses_msp430x_relocs ())
11728 return reloc_type
== 2; /* R_MSP430_ABS16. */
11729 case EM_MSP430_OLD
:
11730 return reloc_type
== 5; /* R_MSP430_16_BYTE. */
11732 return reloc_type
== 19; /* R_NDS32_RELA. */
11733 case EM_ALTERA_NIOS2
:
11734 return reloc_type
== 13; /* R_NIOS2_BFD_RELOC_16. */
11736 return reloc_type
== 9; /* R_NIOS_16. */
11738 return reloc_type
== 2; /* R_OR1K_16. */
11740 return reloc_type
== 2; /* R_C6000_ABS16. */
11743 return reloc_type
== 2; /* R_XC16C_ABS_16. */
11744 case EM_CYGNUS_MN10200
:
11746 return reloc_type
== 2; /* R_MN10200_16. */
11747 case EM_CYGNUS_MN10300
:
11749 return reloc_type
== 2; /* R_MN10300_16. */
11751 return reloc_type
== 2; /* R_VISIUM_16. */
11753 return reloc_type
== 3; /* R_XGATE_16. */
11759 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
11760 relocation entries (possibly formerly used for SHT_GROUP sections). */
11763 is_none_reloc (unsigned int reloc_type
)
11765 switch (elf_header
.e_machine
)
11767 case EM_68K
: /* R_68K_NONE. */
11768 case EM_386
: /* R_386_NONE. */
11769 case EM_SPARC32PLUS
:
11771 case EM_SPARC
: /* R_SPARC_NONE. */
11772 case EM_MIPS
: /* R_MIPS_NONE. */
11773 case EM_PARISC
: /* R_PARISC_NONE. */
11774 case EM_ALPHA
: /* R_ALPHA_NONE. */
11775 case EM_ADAPTEVA_EPIPHANY
:
11776 case EM_PPC
: /* R_PPC_NONE. */
11777 case EM_PPC64
: /* R_PPC64_NONE. */
11778 case EM_ARC
: /* R_ARC_NONE. */
11779 case EM_ARC_COMPACT
: /* R_ARC_NONE. */
11780 case EM_ARC_COMPACT2
: /* R_ARC_NONE. */
11781 case EM_ARM
: /* R_ARM_NONE. */
11782 case EM_IA_64
: /* R_IA64_NONE. */
11783 case EM_SH
: /* R_SH_NONE. */
11785 case EM_S390
: /* R_390_NONE. */
11786 case EM_CRIS
: /* R_CRIS_NONE. */
11787 case EM_X86_64
: /* R_X86_64_NONE. */
11788 case EM_L1OM
: /* R_X86_64_NONE. */
11789 case EM_K1OM
: /* R_X86_64_NONE. */
11790 case EM_MN10300
: /* R_MN10300_NONE. */
11791 case EM_FT32
: /* R_FT32_NONE. */
11792 case EM_MOXIE
: /* R_MOXIE_NONE. */
11793 case EM_M32R
: /* R_M32R_NONE. */
11794 case EM_TI_C6000
:/* R_C6000_NONE. */
11795 case EM_TILEGX
: /* R_TILEGX_NONE. */
11796 case EM_TILEPRO
: /* R_TILEPRO_NONE. */
11798 case EM_C166
: /* R_XC16X_NONE. */
11799 case EM_ALTERA_NIOS2
: /* R_NIOS2_NONE. */
11800 case EM_NIOS32
: /* R_NIOS_NONE. */
11801 case EM_OR1K
: /* R_OR1K_NONE. */
11802 return reloc_type
== 0;
11804 return reloc_type
== 0 || reloc_type
== 256;
11806 return (reloc_type
== 0 /* R_XTENSA_NONE. */
11807 || reloc_type
== 204 /* R_NDS32_DIFF8. */
11808 || reloc_type
== 205 /* R_NDS32_DIFF16. */
11809 || reloc_type
== 206 /* R_NDS32_DIFF32. */
11810 || reloc_type
== 207 /* R_NDS32_ULEB128. */);
11811 case EM_XTENSA_OLD
:
11813 return (reloc_type
== 0 /* R_XTENSA_NONE. */
11814 || reloc_type
== 17 /* R_XTENSA_DIFF8. */
11815 || reloc_type
== 18 /* R_XTENSA_DIFF16. */
11816 || reloc_type
== 19 /* R_XTENSA_DIFF32. */);
11818 return reloc_type
== 3; /* R_METAG_NONE. */
11823 /* Returns TRUE if there is a relocation against
11824 section NAME at OFFSET bytes. */
11827 reloc_at (struct dwarf_section
* dsec
, dwarf_vma offset
)
11829 Elf_Internal_Rela
* relocs
;
11830 Elf_Internal_Rela
* rp
;
11832 if (dsec
== NULL
|| dsec
->reloc_info
== NULL
)
11835 relocs
= (Elf_Internal_Rela
*) dsec
->reloc_info
;
11837 for (rp
= relocs
; rp
< relocs
+ dsec
->num_relocs
; ++rp
)
11838 if (rp
->r_offset
== offset
)
11844 /* Apply relocations to a section.
11845 Note: So far support has been added only for those relocations
11846 which can be found in debug sections.
11847 If RELOCS_RETURN is non-NULL then returns in it a pointer to the
11848 loaded relocs. It is then the caller's responsibility to free them.
11849 FIXME: Add support for more relocations ? */
11852 apply_relocations (void * file
,
11853 const Elf_Internal_Shdr
* section
,
11854 unsigned char * start
,
11855 bfd_size_type size
,
11856 void ** relocs_return
,
11857 unsigned long * num_relocs_return
)
11859 Elf_Internal_Shdr
* relsec
;
11860 unsigned char * end
= start
+ size
;
11862 if (relocs_return
!= NULL
)
11864 * (Elf_Internal_Rela
**) relocs_return
= NULL
;
11865 * num_relocs_return
= 0;
11868 if (elf_header
.e_type
!= ET_REL
)
11871 /* Find the reloc section associated with the section. */
11872 for (relsec
= section_headers
;
11873 relsec
< section_headers
+ elf_header
.e_shnum
;
11876 bfd_boolean is_rela
;
11877 unsigned long num_relocs
;
11878 Elf_Internal_Rela
* relocs
;
11879 Elf_Internal_Rela
* rp
;
11880 Elf_Internal_Shdr
* symsec
;
11881 Elf_Internal_Sym
* symtab
;
11882 unsigned long num_syms
;
11883 Elf_Internal_Sym
* sym
;
11885 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
11886 || relsec
->sh_info
>= elf_header
.e_shnum
11887 || section_headers
+ relsec
->sh_info
!= section
11888 || relsec
->sh_size
== 0
11889 || relsec
->sh_link
>= elf_header
.e_shnum
)
11892 is_rela
= relsec
->sh_type
== SHT_RELA
;
11896 if (!slurp_rela_relocs ((FILE *) file
, relsec
->sh_offset
,
11897 relsec
->sh_size
, & relocs
, & num_relocs
))
11902 if (!slurp_rel_relocs ((FILE *) file
, relsec
->sh_offset
,
11903 relsec
->sh_size
, & relocs
, & num_relocs
))
11907 /* SH uses RELA but uses in place value instead of the addend field. */
11908 if (elf_header
.e_machine
== EM_SH
)
11911 symsec
= section_headers
+ relsec
->sh_link
;
11912 symtab
= GET_ELF_SYMBOLS ((FILE *) file
, symsec
, & num_syms
);
11914 for (rp
= relocs
; rp
< relocs
+ num_relocs
; ++rp
)
11917 unsigned int reloc_type
;
11918 unsigned int reloc_size
;
11919 unsigned char * rloc
;
11920 unsigned long sym_index
;
11922 reloc_type
= get_reloc_type (rp
->r_info
);
11924 if (target_specific_reloc_handling (rp
, start
, symtab
))
11926 else if (is_none_reloc (reloc_type
))
11928 else if (is_32bit_abs_reloc (reloc_type
)
11929 || is_32bit_pcrel_reloc (reloc_type
))
11931 else if (is_64bit_abs_reloc (reloc_type
)
11932 || is_64bit_pcrel_reloc (reloc_type
))
11934 else if (is_24bit_abs_reloc (reloc_type
))
11936 else if (is_16bit_abs_reloc (reloc_type
))
11940 static unsigned int prev_reloc
= 0;
11941 if (reloc_type
!= prev_reloc
)
11942 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
11943 reloc_type
, printable_section_name (section
));
11944 prev_reloc
= reloc_type
;
11948 rloc
= start
+ rp
->r_offset
;
11949 if ((rloc
+ reloc_size
) > end
|| (rloc
< start
))
11951 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
11952 (unsigned long) rp
->r_offset
,
11953 printable_section_name (section
));
11957 sym_index
= (unsigned long) get_reloc_symindex (rp
->r_info
);
11958 if (sym_index
>= num_syms
)
11960 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
11961 sym_index
, printable_section_name (section
));
11964 sym
= symtab
+ sym_index
;
11966 /* If the reloc has a symbol associated with it,
11967 make sure that it is of an appropriate type.
11969 Relocations against symbols without type can happen.
11970 Gcc -feliminate-dwarf2-dups may generate symbols
11971 without type for debug info.
11973 Icc generates relocations against function symbols
11974 instead of local labels.
11976 Relocations against object symbols can happen, eg when
11977 referencing a global array. For an example of this see
11978 the _clz.o binary in libgcc.a. */
11980 && ELF_ST_TYPE (sym
->st_info
) != STT_COMMON
11981 && ELF_ST_TYPE (sym
->st_info
) > STT_SECTION
)
11983 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
11984 get_symbol_type (ELF_ST_TYPE (sym
->st_info
)),
11985 (long int)(rp
- relocs
),
11986 printable_section_name (relsec
));
11992 addend
+= rp
->r_addend
;
11993 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
11994 partial_inplace. */
11996 || (elf_header
.e_machine
== EM_XTENSA
11997 && reloc_type
== 1)
11998 || ((elf_header
.e_machine
== EM_PJ
11999 || elf_header
.e_machine
== EM_PJ_OLD
)
12000 && reloc_type
== 1)
12001 || ((elf_header
.e_machine
== EM_D30V
12002 || elf_header
.e_machine
== EM_CYGNUS_D30V
)
12003 && reloc_type
== 12))
12004 addend
+= byte_get (rloc
, reloc_size
);
12006 if (is_32bit_pcrel_reloc (reloc_type
)
12007 || is_64bit_pcrel_reloc (reloc_type
))
12009 /* On HPPA, all pc-relative relocations are biased by 8. */
12010 if (elf_header
.e_machine
== EM_PARISC
)
12012 byte_put (rloc
, (addend
+ sym
->st_value
) - rp
->r_offset
,
12016 byte_put (rloc
, addend
+ sym
->st_value
, reloc_size
);
12023 * (Elf_Internal_Rela
**) relocs_return
= relocs
;
12024 * num_relocs_return
= num_relocs
;
12033 #ifdef SUPPORT_DISASSEMBLY
12035 disassemble_section (Elf_Internal_Shdr
* section
, FILE * file
)
12037 printf (_("\nAssembly dump of section %s\n"), printable_section_name (section
));
12039 /* FIXME: XXX -- to be done --- XXX */
12045 /* Reads in the contents of SECTION from FILE, returning a pointer
12046 to a malloc'ed buffer or NULL if something went wrong. */
12049 get_section_contents (Elf_Internal_Shdr
* section
, FILE * file
)
12051 bfd_size_type num_bytes
;
12053 num_bytes
= section
->sh_size
;
12055 if (num_bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
12057 printf (_("\nSection '%s' has no data to dump.\n"),
12058 printable_section_name (section
));
12062 return (char *) get_data (NULL
, file
, section
->sh_offset
, 1, num_bytes
,
12063 _("section contents"));
12066 /* Uncompresses a section that was compressed using zlib, in place. */
12069 uncompress_section_contents (unsigned char **buffer
,
12070 dwarf_size_type uncompressed_size
,
12071 dwarf_size_type
*size
)
12073 dwarf_size_type compressed_size
= *size
;
12074 unsigned char * compressed_buffer
= *buffer
;
12075 unsigned char * uncompressed_buffer
;
12079 /* It is possible the section consists of several compressed
12080 buffers concatenated together, so we uncompress in a loop. */
12081 /* PR 18313: The state field in the z_stream structure is supposed
12082 to be invisible to the user (ie us), but some compilers will
12083 still complain about it being used without initialisation. So
12084 we first zero the entire z_stream structure and then set the fields
12086 memset (& strm
, 0, sizeof strm
);
12087 strm
.avail_in
= compressed_size
;
12088 strm
.next_in
= (Bytef
*) compressed_buffer
;
12089 strm
.avail_out
= uncompressed_size
;
12090 uncompressed_buffer
= (unsigned char *) xmalloc (uncompressed_size
);
12092 rc
= inflateInit (& strm
);
12093 while (strm
.avail_in
> 0)
12097 strm
.next_out
= ((Bytef
*) uncompressed_buffer
12098 + (uncompressed_size
- strm
.avail_out
));
12099 rc
= inflate (&strm
, Z_FINISH
);
12100 if (rc
!= Z_STREAM_END
)
12102 rc
= inflateReset (& strm
);
12104 rc
= inflateEnd (& strm
);
12106 || strm
.avail_out
!= 0)
12109 *buffer
= uncompressed_buffer
;
12110 *size
= uncompressed_size
;
12114 free (uncompressed_buffer
);
12115 /* Indicate decompression failure. */
12121 dump_section_as_strings (Elf_Internal_Shdr
* section
, FILE * file
)
12123 Elf_Internal_Shdr
* relsec
;
12124 bfd_size_type num_bytes
;
12125 unsigned char * data
;
12126 unsigned char * end
;
12127 unsigned char * real_start
;
12128 unsigned char * start
;
12129 bfd_boolean some_strings_shown
;
12131 real_start
= start
= (unsigned char *) get_section_contents (section
,
12135 num_bytes
= section
->sh_size
;
12137 printf (_("\nString dump of section '%s':\n"), printable_section_name (section
));
12139 if (decompress_dumps
)
12141 dwarf_size_type new_size
= num_bytes
;
12142 dwarf_size_type uncompressed_size
= 0;
12144 if ((section
->sh_flags
& SHF_COMPRESSED
) != 0)
12146 Elf_Internal_Chdr chdr
;
12147 unsigned int compression_header_size
12148 = get_compression_header (& chdr
, (unsigned char *) start
);
12150 if (chdr
.ch_type
!= ELFCOMPRESS_ZLIB
)
12152 warn (_("section '%s' has unsupported compress type: %d\n"),
12153 printable_section_name (section
), chdr
.ch_type
);
12156 else if (chdr
.ch_addralign
!= section
->sh_addralign
)
12158 warn (_("compressed section '%s' is corrupted\n"),
12159 printable_section_name (section
));
12162 uncompressed_size
= chdr
.ch_size
;
12163 start
+= compression_header_size
;
12164 new_size
-= compression_header_size
;
12166 else if (new_size
> 12 && streq ((char *) start
, "ZLIB"))
12168 /* Read the zlib header. In this case, it should be "ZLIB"
12169 followed by the uncompressed section size, 8 bytes in
12170 big-endian order. */
12171 uncompressed_size
= start
[4]; uncompressed_size
<<= 8;
12172 uncompressed_size
+= start
[5]; uncompressed_size
<<= 8;
12173 uncompressed_size
+= start
[6]; uncompressed_size
<<= 8;
12174 uncompressed_size
+= start
[7]; uncompressed_size
<<= 8;
12175 uncompressed_size
+= start
[8]; uncompressed_size
<<= 8;
12176 uncompressed_size
+= start
[9]; uncompressed_size
<<= 8;
12177 uncompressed_size
+= start
[10]; uncompressed_size
<<= 8;
12178 uncompressed_size
+= start
[11];
12183 if (uncompressed_size
12184 && uncompress_section_contents (& start
,
12185 uncompressed_size
, & new_size
))
12186 num_bytes
= new_size
;
12189 /* If the section being dumped has relocations against it the user might
12190 be expecting these relocations to have been applied. Check for this
12191 case and issue a warning message in order to avoid confusion.
12192 FIXME: Maybe we ought to have an option that dumps a section with
12193 relocs applied ? */
12194 for (relsec
= section_headers
;
12195 relsec
< section_headers
+ elf_header
.e_shnum
;
12198 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
12199 || relsec
->sh_info
>= elf_header
.e_shnum
12200 || section_headers
+ relsec
->sh_info
!= section
12201 || relsec
->sh_size
== 0
12202 || relsec
->sh_link
>= elf_header
.e_shnum
)
12205 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12210 end
= start
+ num_bytes
;
12211 some_strings_shown
= FALSE
;
12215 while (!ISPRINT (* data
))
12216 if (++ data
>= end
)
12221 size_t maxlen
= end
- data
;
12224 /* PR 11128: Use two separate invocations in order to work
12225 around bugs in the Solaris 8 implementation of printf. */
12226 printf (" [%6tx] ", data
- start
);
12228 printf (" [%6Ix] ", (size_t) (data
- start
));
12232 print_symbol ((int) maxlen
, (const char *) data
);
12234 data
+= strnlen ((const char *) data
, maxlen
);
12238 printf (_("<corrupt>\n"));
12241 some_strings_shown
= TRUE
;
12245 if (! some_strings_shown
)
12246 printf (_(" No strings found in this section."));
12254 dump_section_as_bytes (Elf_Internal_Shdr
* section
,
12256 bfd_boolean relocate
)
12258 Elf_Internal_Shdr
* relsec
;
12259 bfd_size_type bytes
;
12260 bfd_size_type section_size
;
12262 unsigned char * data
;
12263 unsigned char * real_start
;
12264 unsigned char * start
;
12266 real_start
= start
= (unsigned char *) get_section_contents (section
, file
);
12269 section_size
= section
->sh_size
;
12271 printf (_("\nHex dump of section '%s':\n"), printable_section_name (section
));
12273 if (decompress_dumps
)
12275 dwarf_size_type new_size
= section_size
;
12276 dwarf_size_type uncompressed_size
= 0;
12278 if ((section
->sh_flags
& SHF_COMPRESSED
) != 0)
12280 Elf_Internal_Chdr chdr
;
12281 unsigned int compression_header_size
12282 = get_compression_header (& chdr
, start
);
12284 if (chdr
.ch_type
!= ELFCOMPRESS_ZLIB
)
12286 warn (_("section '%s' has unsupported compress type: %d\n"),
12287 printable_section_name (section
), chdr
.ch_type
);
12290 else if (chdr
.ch_addralign
!= section
->sh_addralign
)
12292 warn (_("compressed section '%s' is corrupted\n"),
12293 printable_section_name (section
));
12296 uncompressed_size
= chdr
.ch_size
;
12297 start
+= compression_header_size
;
12298 new_size
-= compression_header_size
;
12300 else if (new_size
> 12 && streq ((char *) start
, "ZLIB"))
12302 /* Read the zlib header. In this case, it should be "ZLIB"
12303 followed by the uncompressed section size, 8 bytes in
12304 big-endian order. */
12305 uncompressed_size
= start
[4]; uncompressed_size
<<= 8;
12306 uncompressed_size
+= start
[5]; uncompressed_size
<<= 8;
12307 uncompressed_size
+= start
[6]; uncompressed_size
<<= 8;
12308 uncompressed_size
+= start
[7]; uncompressed_size
<<= 8;
12309 uncompressed_size
+= start
[8]; uncompressed_size
<<= 8;
12310 uncompressed_size
+= start
[9]; uncompressed_size
<<= 8;
12311 uncompressed_size
+= start
[10]; uncompressed_size
<<= 8;
12312 uncompressed_size
+= start
[11];
12317 if (uncompressed_size
12318 && uncompress_section_contents (& start
, uncompressed_size
,
12320 section_size
= new_size
;
12325 apply_relocations (file
, section
, start
, section_size
, NULL
, NULL
);
12329 /* If the section being dumped has relocations against it the user might
12330 be expecting these relocations to have been applied. Check for this
12331 case and issue a warning message in order to avoid confusion.
12332 FIXME: Maybe we ought to have an option that dumps a section with
12333 relocs applied ? */
12334 for (relsec
= section_headers
;
12335 relsec
< section_headers
+ elf_header
.e_shnum
;
12338 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
12339 || relsec
->sh_info
>= elf_header
.e_shnum
12340 || section_headers
+ relsec
->sh_info
!= section
12341 || relsec
->sh_size
== 0
12342 || relsec
->sh_link
>= elf_header
.e_shnum
)
12345 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12350 addr
= section
->sh_addr
;
12351 bytes
= section_size
;
12360 lbytes
= (bytes
> 16 ? 16 : bytes
);
12362 printf (" 0x%8.8lx ", (unsigned long) addr
);
12364 for (j
= 0; j
< 16; j
++)
12367 printf ("%2.2x", data
[j
]);
12375 for (j
= 0; j
< lbytes
; j
++)
12378 if (k
>= ' ' && k
< 0x7f)
12397 load_specific_debug_section (enum dwarf_section_display_enum debug
,
12398 const Elf_Internal_Shdr
* sec
, void * file
)
12400 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
12403 /* If it is already loaded, do nothing. */
12404 if (section
->start
!= NULL
)
12407 snprintf (buf
, sizeof (buf
), _("%s section data"), section
->name
);
12408 section
->address
= sec
->sh_addr
;
12409 section
->user_data
= NULL
;
12410 section
->start
= (unsigned char *) get_data (NULL
, (FILE *) file
,
12412 sec
->sh_size
, buf
);
12413 if (section
->start
== NULL
)
12417 unsigned char *start
= section
->start
;
12418 dwarf_size_type size
= sec
->sh_size
;
12419 dwarf_size_type uncompressed_size
= 0;
12421 if ((sec
->sh_flags
& SHF_COMPRESSED
) != 0)
12423 Elf_Internal_Chdr chdr
;
12424 unsigned int compression_header_size
12425 = get_compression_header (&chdr
, start
);
12426 if (chdr
.ch_type
!= ELFCOMPRESS_ZLIB
)
12428 warn (_("section '%s' has unsupported compress type: %d\n"),
12429 section
->name
, chdr
.ch_type
);
12432 else if (chdr
.ch_addralign
!= sec
->sh_addralign
)
12434 warn (_("compressed section '%s' is corrupted\n"),
12438 uncompressed_size
= chdr
.ch_size
;
12439 start
+= compression_header_size
;
12440 size
-= compression_header_size
;
12442 else if (size
> 12 && streq ((char *) start
, "ZLIB"))
12444 /* Read the zlib header. In this case, it should be "ZLIB"
12445 followed by the uncompressed section size, 8 bytes in
12446 big-endian order. */
12447 uncompressed_size
= start
[4]; uncompressed_size
<<= 8;
12448 uncompressed_size
+= start
[5]; uncompressed_size
<<= 8;
12449 uncompressed_size
+= start
[6]; uncompressed_size
<<= 8;
12450 uncompressed_size
+= start
[7]; uncompressed_size
<<= 8;
12451 uncompressed_size
+= start
[8]; uncompressed_size
<<= 8;
12452 uncompressed_size
+= start
[9]; uncompressed_size
<<= 8;
12453 uncompressed_size
+= start
[10]; uncompressed_size
<<= 8;
12454 uncompressed_size
+= start
[11];
12459 if (uncompressed_size
12460 && uncompress_section_contents (&start
, uncompressed_size
,
12463 /* Free the compressed buffer, update the section buffer
12464 and the section size if uncompress is successful. */
12465 free (section
->start
);
12466 section
->start
= start
;
12468 section
->size
= size
;
12471 if (section
->start
== NULL
)
12474 if (debug_displays
[debug
].relocate
)
12475 apply_relocations ((FILE *) file
, sec
, section
->start
, section
->size
,
12476 & section
->reloc_info
, & section
->num_relocs
);
12479 section
->reloc_info
= NULL
;
12480 section
->num_relocs
= 0;
12486 /* If this is not NULL, load_debug_section will only look for sections
12487 within the list of sections given here. */
12488 unsigned int *section_subset
= NULL
;
12491 load_debug_section (enum dwarf_section_display_enum debug
, void * file
)
12493 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
12494 Elf_Internal_Shdr
* sec
;
12496 /* Locate the debug section. */
12497 sec
= find_section_in_set (section
->uncompressed_name
, section_subset
);
12499 section
->name
= section
->uncompressed_name
;
12502 sec
= find_section_in_set (section
->compressed_name
, section_subset
);
12504 section
->name
= section
->compressed_name
;
12509 /* If we're loading from a subset of sections, and we've loaded
12510 a section matching this name before, it's likely that it's a
12512 if (section_subset
!= NULL
)
12513 free_debug_section (debug
);
12515 return load_specific_debug_section (debug
, sec
, (FILE *) file
);
12519 free_debug_section (enum dwarf_section_display_enum debug
)
12521 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
12523 if (section
->start
== NULL
)
12526 free ((char *) section
->start
);
12527 section
->start
= NULL
;
12528 section
->address
= 0;
12533 display_debug_section (int shndx
, Elf_Internal_Shdr
* section
, FILE * file
)
12535 char * name
= SECTION_NAME (section
);
12536 const char * print_name
= printable_section_name (section
);
12537 bfd_size_type length
;
12541 length
= section
->sh_size
;
12544 printf (_("\nSection '%s' has no debugging data.\n"), print_name
);
12547 if (section
->sh_type
== SHT_NOBITS
)
12549 /* There is no point in dumping the contents of a debugging section
12550 which has the NOBITS type - the bits in the file will be random.
12551 This can happen when a file containing a .eh_frame section is
12552 stripped with the --only-keep-debug command line option. */
12553 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12558 if (const_strneq (name
, ".gnu.linkonce.wi."))
12559 name
= ".debug_info";
12561 /* See if we know how to display the contents of this section. */
12562 for (i
= 0; i
< max
; i
++)
12563 if (streq (debug_displays
[i
].section
.uncompressed_name
, name
)
12564 || (i
== line
&& const_strneq (name
, ".debug_line."))
12565 || streq (debug_displays
[i
].section
.compressed_name
, name
))
12567 struct dwarf_section
* sec
= &debug_displays
[i
].section
;
12568 int secondary
= (section
!= find_section (name
));
12571 free_debug_section ((enum dwarf_section_display_enum
) i
);
12573 if (i
== line
&& const_strneq (name
, ".debug_line."))
12575 else if (streq (sec
->uncompressed_name
, name
))
12576 sec
->name
= sec
->uncompressed_name
;
12578 sec
->name
= sec
->compressed_name
;
12579 if (load_specific_debug_section ((enum dwarf_section_display_enum
) i
,
12582 /* If this debug section is part of a CU/TU set in a .dwp file,
12583 restrict load_debug_section to the sections in that set. */
12584 section_subset
= find_cu_tu_set (file
, shndx
);
12586 result
&= debug_displays
[i
].display (sec
, file
);
12588 section_subset
= NULL
;
12590 if (secondary
|| (i
!= info
&& i
!= abbrev
))
12591 free_debug_section ((enum dwarf_section_display_enum
) i
);
12599 printf (_("Unrecognized debug section: %s\n"), print_name
);
12606 /* Set DUMP_SECTS for all sections where dumps were requested
12607 based on section name. */
12610 initialise_dumps_byname (void)
12612 struct dump_list_entry
* cur
;
12614 for (cur
= dump_sects_byname
; cur
; cur
= cur
->next
)
12619 for (i
= 0, any
= 0; i
< elf_header
.e_shnum
; i
++)
12620 if (streq (SECTION_NAME (section_headers
+ i
), cur
->name
))
12622 request_dump_bynumber (i
, cur
->type
);
12627 warn (_("Section '%s' was not dumped because it does not exist!\n"),
12633 process_section_contents (FILE * file
)
12635 Elf_Internal_Shdr
* section
;
12641 initialise_dumps_byname ();
12643 for (i
= 0, section
= section_headers
;
12644 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
12647 #ifdef SUPPORT_DISASSEMBLY
12648 if (dump_sects
[i
] & DISASS_DUMP
)
12649 disassemble_section (section
, file
);
12651 if (dump_sects
[i
] & HEX_DUMP
)
12652 dump_section_as_bytes (section
, file
, FALSE
);
12654 if (dump_sects
[i
] & RELOC_DUMP
)
12655 dump_section_as_bytes (section
, file
, TRUE
);
12657 if (dump_sects
[i
] & STRING_DUMP
)
12658 dump_section_as_strings (section
, file
);
12660 if (dump_sects
[i
] & DEBUG_DUMP
)
12661 display_debug_section (i
, section
, file
);
12664 /* Check to see if the user requested a
12665 dump of a section that does not exist. */
12666 while (i
++ < num_dump_sects
)
12668 warn (_("Section %d was not dumped because it does not exist!\n"), i
);
12672 process_mips_fpe_exception (int mask
)
12677 if (mask
& OEX_FPU_INEX
)
12678 fputs ("INEX", stdout
), first
= 0;
12679 if (mask
& OEX_FPU_UFLO
)
12680 printf ("%sUFLO", first
? "" : "|"), first
= 0;
12681 if (mask
& OEX_FPU_OFLO
)
12682 printf ("%sOFLO", first
? "" : "|"), first
= 0;
12683 if (mask
& OEX_FPU_DIV0
)
12684 printf ("%sDIV0", first
? "" : "|"), first
= 0;
12685 if (mask
& OEX_FPU_INVAL
)
12686 printf ("%sINVAL", first
? "" : "|");
12689 fputs ("0", stdout
);
12692 /* Display's the value of TAG at location P. If TAG is
12693 greater than 0 it is assumed to be an unknown tag, and
12694 a message is printed to this effect. Otherwise it is
12695 assumed that a message has already been printed.
12697 If the bottom bit of TAG is set it assumed to have a
12698 string value, otherwise it is assumed to have an integer
12701 Returns an updated P pointing to the first unread byte
12702 beyond the end of TAG's value.
12704 Reads at or beyond END will not be made. */
12706 static unsigned char *
12707 display_tag_value (int tag
,
12709 const unsigned char * const end
)
12714 printf (" Tag_unknown_%d: ", tag
);
12718 warn (_("<corrupt tag>\n"));
12722 /* PR 17531 file: 027-19978-0.004. */
12723 size_t maxlen
= (end
- p
) - 1;
12728 print_symbol ((int) maxlen
, (const char *) p
);
12729 p
+= strnlen ((char *) p
, maxlen
) + 1;
12733 printf (_("<corrupt string tag>"));
12734 p
= (unsigned char *) end
;
12742 val
= read_uleb128 (p
, &len
, end
);
12744 printf ("%ld (0x%lx)\n", val
, val
);
12751 /* ARM EABI attributes section. */
12756 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
12758 const char ** table
;
12759 } arm_attr_public_tag
;
12761 static const char * arm_attr_tag_CPU_arch
[] =
12762 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
12763 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
12765 static const char * arm_attr_tag_ARM_ISA_use
[] = {"No", "Yes"};
12766 static const char * arm_attr_tag_THUMB_ISA_use
[] =
12767 {"No", "Thumb-1", "Thumb-2", "Yes"};
12768 static const char * arm_attr_tag_FP_arch
[] =
12769 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
12770 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
12771 static const char * arm_attr_tag_WMMX_arch
[] = {"No", "WMMXv1", "WMMXv2"};
12772 static const char * arm_attr_tag_Advanced_SIMD_arch
[] =
12773 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
12774 "NEON for ARMv8.1"};
12775 static const char * arm_attr_tag_PCS_config
[] =
12776 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
12777 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
12778 static const char * arm_attr_tag_ABI_PCS_R9_use
[] =
12779 {"V6", "SB", "TLS", "Unused"};
12780 static const char * arm_attr_tag_ABI_PCS_RW_data
[] =
12781 {"Absolute", "PC-relative", "SB-relative", "None"};
12782 static const char * arm_attr_tag_ABI_PCS_RO_data
[] =
12783 {"Absolute", "PC-relative", "None"};
12784 static const char * arm_attr_tag_ABI_PCS_GOT_use
[] =
12785 {"None", "direct", "GOT-indirect"};
12786 static const char * arm_attr_tag_ABI_PCS_wchar_t
[] =
12787 {"None", "??? 1", "2", "??? 3", "4"};
12788 static const char * arm_attr_tag_ABI_FP_rounding
[] = {"Unused", "Needed"};
12789 static const char * arm_attr_tag_ABI_FP_denormal
[] =
12790 {"Unused", "Needed", "Sign only"};
12791 static const char * arm_attr_tag_ABI_FP_exceptions
[] = {"Unused", "Needed"};
12792 static const char * arm_attr_tag_ABI_FP_user_exceptions
[] = {"Unused", "Needed"};
12793 static const char * arm_attr_tag_ABI_FP_number_model
[] =
12794 {"Unused", "Finite", "RTABI", "IEEE 754"};
12795 static const char * arm_attr_tag_ABI_enum_size
[] =
12796 {"Unused", "small", "int", "forced to int"};
12797 static const char * arm_attr_tag_ABI_HardFP_use
[] =
12798 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
12799 static const char * arm_attr_tag_ABI_VFP_args
[] =
12800 {"AAPCS", "VFP registers", "custom", "compatible"};
12801 static const char * arm_attr_tag_ABI_WMMX_args
[] =
12802 {"AAPCS", "WMMX registers", "custom"};
12803 static const char * arm_attr_tag_ABI_optimization_goals
[] =
12804 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12805 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
12806 static const char * arm_attr_tag_ABI_FP_optimization_goals
[] =
12807 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12808 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
12809 static const char * arm_attr_tag_CPU_unaligned_access
[] = {"None", "v6"};
12810 static const char * arm_attr_tag_FP_HP_extension
[] =
12811 {"Not Allowed", "Allowed"};
12812 static const char * arm_attr_tag_ABI_FP_16bit_format
[] =
12813 {"None", "IEEE 754", "Alternative Format"};
12814 static const char * arm_attr_tag_MPextension_use
[] =
12815 {"Not Allowed", "Allowed"};
12816 static const char * arm_attr_tag_DIV_use
[] =
12817 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
12818 "Allowed in v7-A with integer division extension"};
12819 static const char * arm_attr_tag_T2EE_use
[] = {"Not Allowed", "Allowed"};
12820 static const char * arm_attr_tag_Virtualization_use
[] =
12821 {"Not Allowed", "TrustZone", "Virtualization Extensions",
12822 "TrustZone and Virtualization Extensions"};
12823 static const char * arm_attr_tag_MPextension_use_legacy
[] =
12824 {"Not Allowed", "Allowed"};
12826 #define LOOKUP(id, name) \
12827 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
12828 static arm_attr_public_tag arm_attr_public_tags
[] =
12830 {4, "CPU_raw_name", 1, NULL
},
12831 {5, "CPU_name", 1, NULL
},
12832 LOOKUP(6, CPU_arch
),
12833 {7, "CPU_arch_profile", 0, NULL
},
12834 LOOKUP(8, ARM_ISA_use
),
12835 LOOKUP(9, THUMB_ISA_use
),
12836 LOOKUP(10, FP_arch
),
12837 LOOKUP(11, WMMX_arch
),
12838 LOOKUP(12, Advanced_SIMD_arch
),
12839 LOOKUP(13, PCS_config
),
12840 LOOKUP(14, ABI_PCS_R9_use
),
12841 LOOKUP(15, ABI_PCS_RW_data
),
12842 LOOKUP(16, ABI_PCS_RO_data
),
12843 LOOKUP(17, ABI_PCS_GOT_use
),
12844 LOOKUP(18, ABI_PCS_wchar_t
),
12845 LOOKUP(19, ABI_FP_rounding
),
12846 LOOKUP(20, ABI_FP_denormal
),
12847 LOOKUP(21, ABI_FP_exceptions
),
12848 LOOKUP(22, ABI_FP_user_exceptions
),
12849 LOOKUP(23, ABI_FP_number_model
),
12850 {24, "ABI_align_needed", 0, NULL
},
12851 {25, "ABI_align_preserved", 0, NULL
},
12852 LOOKUP(26, ABI_enum_size
),
12853 LOOKUP(27, ABI_HardFP_use
),
12854 LOOKUP(28, ABI_VFP_args
),
12855 LOOKUP(29, ABI_WMMX_args
),
12856 LOOKUP(30, ABI_optimization_goals
),
12857 LOOKUP(31, ABI_FP_optimization_goals
),
12858 {32, "compatibility", 0, NULL
},
12859 LOOKUP(34, CPU_unaligned_access
),
12860 LOOKUP(36, FP_HP_extension
),
12861 LOOKUP(38, ABI_FP_16bit_format
),
12862 LOOKUP(42, MPextension_use
),
12863 LOOKUP(44, DIV_use
),
12864 {64, "nodefaults", 0, NULL
},
12865 {65, "also_compatible_with", 0, NULL
},
12866 LOOKUP(66, T2EE_use
),
12867 {67, "conformance", 1, NULL
},
12868 LOOKUP(68, Virtualization_use
),
12869 LOOKUP(70, MPextension_use_legacy
)
12873 static unsigned char *
12874 display_arm_attribute (unsigned char * p
,
12875 const unsigned char * const end
)
12880 arm_attr_public_tag
* attr
;
12884 tag
= read_uleb128 (p
, &len
, end
);
12887 for (i
= 0; i
< ARRAY_SIZE (arm_attr_public_tags
); i
++)
12889 if (arm_attr_public_tags
[i
].tag
== tag
)
12891 attr
= &arm_attr_public_tags
[i
];
12898 printf (" Tag_%s: ", attr
->name
);
12899 switch (attr
->type
)
12904 case 7: /* Tag_CPU_arch_profile. */
12905 val
= read_uleb128 (p
, &len
, end
);
12909 case 0: printf (_("None\n")); break;
12910 case 'A': printf (_("Application\n")); break;
12911 case 'R': printf (_("Realtime\n")); break;
12912 case 'M': printf (_("Microcontroller\n")); break;
12913 case 'S': printf (_("Application or Realtime\n")); break;
12914 default: printf ("??? (%d)\n", val
); break;
12918 case 24: /* Tag_align_needed. */
12919 val
= read_uleb128 (p
, &len
, end
);
12923 case 0: printf (_("None\n")); break;
12924 case 1: printf (_("8-byte\n")); break;
12925 case 2: printf (_("4-byte\n")); break;
12926 case 3: printf ("??? 3\n"); break;
12929 printf (_("8-byte and up to %d-byte extended\n"),
12932 printf ("??? (%d)\n", val
);
12937 case 25: /* Tag_align_preserved. */
12938 val
= read_uleb128 (p
, &len
, end
);
12942 case 0: printf (_("None\n")); break;
12943 case 1: printf (_("8-byte, except leaf SP\n")); break;
12944 case 2: printf (_("8-byte\n")); break;
12945 case 3: printf ("??? 3\n"); break;
12948 printf (_("8-byte and up to %d-byte extended\n"),
12951 printf ("??? (%d)\n", val
);
12956 case 32: /* Tag_compatibility. */
12958 val
= read_uleb128 (p
, &len
, end
);
12960 printf (_("flag = %d, vendor = "), val
);
12963 size_t maxlen
= (end
- p
) - 1;
12965 print_symbol ((int) maxlen
, (const char *) p
);
12966 p
+= strnlen ((char *) p
, maxlen
) + 1;
12970 printf (_("<corrupt>"));
12971 p
= (unsigned char *) end
;
12977 case 64: /* Tag_nodefaults. */
12978 /* PR 17531: file: 001-505008-0.01. */
12981 printf (_("True\n"));
12984 case 65: /* Tag_also_compatible_with. */
12985 val
= read_uleb128 (p
, &len
, end
);
12987 if (val
== 6 /* Tag_CPU_arch. */)
12989 val
= read_uleb128 (p
, &len
, end
);
12991 if ((unsigned int) val
>= ARRAY_SIZE (arm_attr_tag_CPU_arch
))
12992 printf ("??? (%d)\n", val
);
12994 printf ("%s\n", arm_attr_tag_CPU_arch
[val
]);
12998 while (p
< end
&& *(p
++) != '\0' /* NUL terminator. */)
13003 printf (_("<unknown: %d>\n"), tag
);
13009 return display_tag_value (-1, p
, end
);
13011 return display_tag_value (0, p
, end
);
13014 assert (attr
->type
& 0x80);
13015 val
= read_uleb128 (p
, &len
, end
);
13017 type
= attr
->type
& 0x7f;
13019 printf ("??? (%d)\n", val
);
13021 printf ("%s\n", attr
->table
[val
]);
13026 return display_tag_value (tag
, p
, end
);
13029 static unsigned char *
13030 display_gnu_attribute (unsigned char * p
,
13031 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, int, const unsigned char * const),
13032 const unsigned char * const end
)
13038 tag
= read_uleb128 (p
, &len
, end
);
13041 /* Tag_compatibility is the only generic GNU attribute defined at
13045 val
= read_uleb128 (p
, &len
, end
);
13048 printf (_("flag = %d, vendor = "), val
);
13051 printf (_("<corrupt>\n"));
13052 warn (_("corrupt vendor attribute\n"));
13058 size_t maxlen
= (end
- p
) - 1;
13060 print_symbol ((int) maxlen
, (const char *) p
);
13061 p
+= strnlen ((char *) p
, maxlen
) + 1;
13065 printf (_("<corrupt>"));
13066 p
= (unsigned char *) end
;
13073 if ((tag
& 2) == 0 && display_proc_gnu_attribute
)
13074 return display_proc_gnu_attribute (p
, tag
, end
);
13076 return display_tag_value (tag
, p
, end
);
13079 static unsigned char *
13080 display_power_gnu_attribute (unsigned char * p
,
13082 const unsigned char * const end
)
13087 if (tag
== Tag_GNU_Power_ABI_FP
)
13089 val
= read_uleb128 (p
, &len
, end
);
13091 printf (" Tag_GNU_Power_ABI_FP: ");
13096 printf (_("Hard or soft float\n"));
13099 printf (_("Hard float\n"));
13102 printf (_("Soft float\n"));
13105 printf (_("Single-precision hard float\n"));
13108 printf ("??? (%d)\n", val
);
13114 if (tag
== Tag_GNU_Power_ABI_Vector
)
13116 val
= read_uleb128 (p
, &len
, end
);
13118 printf (" Tag_GNU_Power_ABI_Vector: ");
13122 printf (_("Any\n"));
13125 printf (_("Generic\n"));
13128 printf ("AltiVec\n");
13134 printf ("??? (%d)\n", val
);
13140 if (tag
== Tag_GNU_Power_ABI_Struct_Return
)
13144 warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
13148 val
= read_uleb128 (p
, &len
, end
);
13150 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
13154 printf (_("Any\n"));
13157 printf ("r3/r4\n");
13160 printf (_("Memory\n"));
13163 printf ("??? (%d)\n", val
);
13169 return display_tag_value (tag
& 1, p
, end
);
13172 static unsigned char *
13173 display_s390_gnu_attribute (unsigned char * p
,
13175 const unsigned char * const end
)
13180 if (tag
== Tag_GNU_S390_ABI_Vector
)
13182 val
= read_uleb128 (p
, &len
, end
);
13184 printf (" Tag_GNU_S390_ABI_Vector: ");
13189 printf (_("any\n"));
13192 printf (_("software\n"));
13195 printf (_("hardware\n"));
13198 printf ("??? (%d)\n", val
);
13204 return display_tag_value (tag
& 1, p
, end
);
13208 display_sparc_hwcaps (int mask
)
13214 if (mask
& ELF_SPARC_HWCAP_MUL32
)
13215 fputs ("mul32", stdout
), first
= 0;
13216 if (mask
& ELF_SPARC_HWCAP_DIV32
)
13217 printf ("%sdiv32", first
? "" : "|"), first
= 0;
13218 if (mask
& ELF_SPARC_HWCAP_FSMULD
)
13219 printf ("%sfsmuld", first
? "" : "|"), first
= 0;
13220 if (mask
& ELF_SPARC_HWCAP_V8PLUS
)
13221 printf ("%sv8plus", first
? "" : "|"), first
= 0;
13222 if (mask
& ELF_SPARC_HWCAP_POPC
)
13223 printf ("%spopc", first
? "" : "|"), first
= 0;
13224 if (mask
& ELF_SPARC_HWCAP_VIS
)
13225 printf ("%svis", first
? "" : "|"), first
= 0;
13226 if (mask
& ELF_SPARC_HWCAP_VIS2
)
13227 printf ("%svis2", first
? "" : "|"), first
= 0;
13228 if (mask
& ELF_SPARC_HWCAP_ASI_BLK_INIT
)
13229 printf ("%sASIBlkInit", first
? "" : "|"), first
= 0;
13230 if (mask
& ELF_SPARC_HWCAP_FMAF
)
13231 printf ("%sfmaf", first
? "" : "|"), first
= 0;
13232 if (mask
& ELF_SPARC_HWCAP_VIS3
)
13233 printf ("%svis3", first
? "" : "|"), first
= 0;
13234 if (mask
& ELF_SPARC_HWCAP_HPC
)
13235 printf ("%shpc", first
? "" : "|"), first
= 0;
13236 if (mask
& ELF_SPARC_HWCAP_RANDOM
)
13237 printf ("%srandom", first
? "" : "|"), first
= 0;
13238 if (mask
& ELF_SPARC_HWCAP_TRANS
)
13239 printf ("%strans", first
? "" : "|"), first
= 0;
13240 if (mask
& ELF_SPARC_HWCAP_FJFMAU
)
13241 printf ("%sfjfmau", first
? "" : "|"), first
= 0;
13242 if (mask
& ELF_SPARC_HWCAP_IMA
)
13243 printf ("%sima", first
? "" : "|"), first
= 0;
13244 if (mask
& ELF_SPARC_HWCAP_ASI_CACHE_SPARING
)
13245 printf ("%scspare", first
? "" : "|"), first
= 0;
13248 fputc ('0', stdout
);
13249 fputc ('\n', stdout
);
13253 display_sparc_hwcaps2 (int mask
)
13259 if (mask
& ELF_SPARC_HWCAP2_FJATHPLUS
)
13260 fputs ("fjathplus", stdout
), first
= 0;
13261 if (mask
& ELF_SPARC_HWCAP2_VIS3B
)
13262 printf ("%svis3b", first
? "" : "|"), first
= 0;
13263 if (mask
& ELF_SPARC_HWCAP2_ADP
)
13264 printf ("%sadp", first
? "" : "|"), first
= 0;
13265 if (mask
& ELF_SPARC_HWCAP2_SPARC5
)
13266 printf ("%ssparc5", first
? "" : "|"), first
= 0;
13267 if (mask
& ELF_SPARC_HWCAP2_MWAIT
)
13268 printf ("%smwait", first
? "" : "|"), first
= 0;
13269 if (mask
& ELF_SPARC_HWCAP2_XMPMUL
)
13270 printf ("%sxmpmul", first
? "" : "|"), first
= 0;
13271 if (mask
& ELF_SPARC_HWCAP2_XMONT
)
13272 printf ("%sxmont2", first
? "" : "|"), first
= 0;
13273 if (mask
& ELF_SPARC_HWCAP2_NSEC
)
13274 printf ("%snsec", first
? "" : "|"), first
= 0;
13275 if (mask
& ELF_SPARC_HWCAP2_FJATHHPC
)
13276 printf ("%sfjathhpc", first
? "" : "|"), first
= 0;
13277 if (mask
& ELF_SPARC_HWCAP2_FJDES
)
13278 printf ("%sfjdes", first
? "" : "|"), first
= 0;
13279 if (mask
& ELF_SPARC_HWCAP2_FJAES
)
13280 printf ("%sfjaes", first
? "" : "|"), first
= 0;
13283 fputc ('0', stdout
);
13284 fputc ('\n', stdout
);
13287 static unsigned char *
13288 display_sparc_gnu_attribute (unsigned char * p
,
13290 const unsigned char * const end
)
13295 if (tag
== Tag_GNU_Sparc_HWCAPS
)
13297 val
= read_uleb128 (p
, &len
, end
);
13299 printf (" Tag_GNU_Sparc_HWCAPS: ");
13300 display_sparc_hwcaps (val
);
13303 if (tag
== Tag_GNU_Sparc_HWCAPS2
)
13305 val
= read_uleb128 (p
, &len
, end
);
13307 printf (" Tag_GNU_Sparc_HWCAPS2: ");
13308 display_sparc_hwcaps2 (val
);
13312 return display_tag_value (tag
, p
, end
);
13316 print_mips_fp_abi_value (int val
)
13320 case Val_GNU_MIPS_ABI_FP_ANY
:
13321 printf (_("Hard or soft float\n"));
13323 case Val_GNU_MIPS_ABI_FP_DOUBLE
:
13324 printf (_("Hard float (double precision)\n"));
13326 case Val_GNU_MIPS_ABI_FP_SINGLE
:
13327 printf (_("Hard float (single precision)\n"));
13329 case Val_GNU_MIPS_ABI_FP_SOFT
:
13330 printf (_("Soft float\n"));
13332 case Val_GNU_MIPS_ABI_FP_OLD_64
:
13333 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13335 case Val_GNU_MIPS_ABI_FP_XX
:
13336 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13338 case Val_GNU_MIPS_ABI_FP_64
:
13339 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13341 case Val_GNU_MIPS_ABI_FP_64A
:
13342 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13344 case Val_GNU_MIPS_ABI_FP_NAN2008
:
13345 printf (_("NaN 2008 compatibility\n"));
13348 printf ("??? (%d)\n", val
);
13353 static unsigned char *
13354 display_mips_gnu_attribute (unsigned char * p
,
13356 const unsigned char * const end
)
13358 if (tag
== Tag_GNU_MIPS_ABI_FP
)
13363 val
= read_uleb128 (p
, &len
, end
);
13365 printf (" Tag_GNU_MIPS_ABI_FP: ");
13367 print_mips_fp_abi_value (val
);
13372 if (tag
== Tag_GNU_MIPS_ABI_MSA
)
13377 val
= read_uleb128 (p
, &len
, end
);
13379 printf (" Tag_GNU_MIPS_ABI_MSA: ");
13383 case Val_GNU_MIPS_ABI_MSA_ANY
:
13384 printf (_("Any MSA or not\n"));
13386 case Val_GNU_MIPS_ABI_MSA_128
:
13387 printf (_("128-bit MSA\n"));
13390 printf ("??? (%d)\n", val
);
13396 return display_tag_value (tag
& 1, p
, end
);
13399 static unsigned char *
13400 display_tic6x_attribute (unsigned char * p
,
13401 const unsigned char * const end
)
13407 tag
= read_uleb128 (p
, &len
, end
);
13413 val
= read_uleb128 (p
, &len
, end
);
13415 printf (" Tag_ISA: ");
13419 case C6XABI_Tag_ISA_none
:
13420 printf (_("None\n"));
13422 case C6XABI_Tag_ISA_C62X
:
13425 case C6XABI_Tag_ISA_C67X
:
13428 case C6XABI_Tag_ISA_C67XP
:
13429 printf ("C67x+\n");
13431 case C6XABI_Tag_ISA_C64X
:
13434 case C6XABI_Tag_ISA_C64XP
:
13435 printf ("C64x+\n");
13437 case C6XABI_Tag_ISA_C674X
:
13438 printf ("C674x\n");
13441 printf ("??? (%d)\n", val
);
13446 case Tag_ABI_wchar_t
:
13447 val
= read_uleb128 (p
, &len
, end
);
13449 printf (" Tag_ABI_wchar_t: ");
13453 printf (_("Not used\n"));
13456 printf (_("2 bytes\n"));
13459 printf (_("4 bytes\n"));
13462 printf ("??? (%d)\n", val
);
13467 case Tag_ABI_stack_align_needed
:
13468 val
= read_uleb128 (p
, &len
, end
);
13470 printf (" Tag_ABI_stack_align_needed: ");
13474 printf (_("8-byte\n"));
13477 printf (_("16-byte\n"));
13480 printf ("??? (%d)\n", val
);
13485 case Tag_ABI_stack_align_preserved
:
13486 val
= read_uleb128 (p
, &len
, end
);
13488 printf (" Tag_ABI_stack_align_preserved: ");
13492 printf (_("8-byte\n"));
13495 printf (_("16-byte\n"));
13498 printf ("??? (%d)\n", val
);
13504 val
= read_uleb128 (p
, &len
, end
);
13506 printf (" Tag_ABI_DSBT: ");
13510 printf (_("DSBT addressing not used\n"));
13513 printf (_("DSBT addressing used\n"));
13516 printf ("??? (%d)\n", val
);
13522 val
= read_uleb128 (p
, &len
, end
);
13524 printf (" Tag_ABI_PID: ");
13528 printf (_("Data addressing position-dependent\n"));
13531 printf (_("Data addressing position-independent, GOT near DP\n"));
13534 printf (_("Data addressing position-independent, GOT far from DP\n"));
13537 printf ("??? (%d)\n", val
);
13543 val
= read_uleb128 (p
, &len
, end
);
13545 printf (" Tag_ABI_PIC: ");
13549 printf (_("Code addressing position-dependent\n"));
13552 printf (_("Code addressing position-independent\n"));
13555 printf ("??? (%d)\n", val
);
13560 case Tag_ABI_array_object_alignment
:
13561 val
= read_uleb128 (p
, &len
, end
);
13563 printf (" Tag_ABI_array_object_alignment: ");
13567 printf (_("8-byte\n"));
13570 printf (_("4-byte\n"));
13573 printf (_("16-byte\n"));
13576 printf ("??? (%d)\n", val
);
13581 case Tag_ABI_array_object_align_expected
:
13582 val
= read_uleb128 (p
, &len
, end
);
13584 printf (" Tag_ABI_array_object_align_expected: ");
13588 printf (_("8-byte\n"));
13591 printf (_("4-byte\n"));
13594 printf (_("16-byte\n"));
13597 printf ("??? (%d)\n", val
);
13602 case Tag_ABI_compatibility
:
13604 val
= read_uleb128 (p
, &len
, end
);
13606 printf (" Tag_ABI_compatibility: ");
13607 printf (_("flag = %d, vendor = "), val
);
13610 size_t maxlen
= (end
- p
) - 1;
13612 print_symbol ((int) maxlen
, (const char *) p
);
13613 p
+= strnlen ((char *) p
, maxlen
) + 1;
13617 printf (_("<corrupt>"));
13618 p
= (unsigned char *) end
;
13624 case Tag_ABI_conformance
:
13626 printf (" Tag_ABI_conformance: \"");
13629 size_t maxlen
= (end
- p
) - 1;
13631 print_symbol ((int) maxlen
, (const char *) p
);
13632 p
+= strnlen ((char *) p
, maxlen
) + 1;
13636 printf (_("<corrupt>"));
13637 p
= (unsigned char *) end
;
13644 return display_tag_value (tag
, p
, end
);
13648 display_raw_attribute (unsigned char * p
, unsigned char * end
)
13650 unsigned long addr
= 0;
13651 size_t bytes
= end
- p
;
13658 int lbytes
= (bytes
> 16 ? 16 : bytes
);
13660 printf (" 0x%8.8lx ", addr
);
13662 for (j
= 0; j
< 16; j
++)
13665 printf ("%2.2x", p
[j
]);
13673 for (j
= 0; j
< lbytes
; j
++)
13676 if (k
>= ' ' && k
< 0x7f)
13692 static unsigned char *
13693 display_msp430x_attribute (unsigned char * p
,
13694 const unsigned char * const end
)
13700 tag
= read_uleb128 (p
, & len
, end
);
13705 case OFBA_MSPABI_Tag_ISA
:
13706 val
= read_uleb128 (p
, &len
, end
);
13708 printf (" Tag_ISA: ");
13711 case 0: printf (_("None\n")); break;
13712 case 1: printf (_("MSP430\n")); break;
13713 case 2: printf (_("MSP430X\n")); break;
13714 default: printf ("??? (%d)\n", val
); break;
13718 case OFBA_MSPABI_Tag_Code_Model
:
13719 val
= read_uleb128 (p
, &len
, end
);
13721 printf (" Tag_Code_Model: ");
13724 case 0: printf (_("None\n")); break;
13725 case 1: printf (_("Small\n")); break;
13726 case 2: printf (_("Large\n")); break;
13727 default: printf ("??? (%d)\n", val
); break;
13731 case OFBA_MSPABI_Tag_Data_Model
:
13732 val
= read_uleb128 (p
, &len
, end
);
13734 printf (" Tag_Data_Model: ");
13737 case 0: printf (_("None\n")); break;
13738 case 1: printf (_("Small\n")); break;
13739 case 2: printf (_("Large\n")); break;
13740 case 3: printf (_("Restricted Large\n")); break;
13741 default: printf ("??? (%d)\n", val
); break;
13746 printf (_(" <unknown tag %d>: "), tag
);
13753 size_t maxlen
= (end
- p
) - 1;
13755 print_symbol ((int) maxlen
, (const char *) p
);
13756 p
+= strnlen ((char *) p
, maxlen
) + 1;
13760 printf (_("<corrupt>"));
13761 p
= (unsigned char *) end
;
13767 val
= read_uleb128 (p
, &len
, end
);
13769 printf ("%d (0x%x)\n", val
, val
);
13779 process_attributes (FILE * file
,
13780 const char * public_name
,
13781 unsigned int proc_type
,
13782 unsigned char * (* display_pub_attribute
) (unsigned char *, const unsigned char * const),
13783 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, int, const unsigned char * const))
13785 Elf_Internal_Shdr
* sect
;
13788 /* Find the section header so that we get the size. */
13789 for (i
= 0, sect
= section_headers
;
13790 i
< elf_header
.e_shnum
;
13793 unsigned char * contents
;
13796 if (sect
->sh_type
!= proc_type
&& sect
->sh_type
!= SHT_GNU_ATTRIBUTES
)
13799 contents
= (unsigned char *) get_data (NULL
, file
, sect
->sh_offset
, 1,
13800 sect
->sh_size
, _("attributes"));
13801 if (contents
== NULL
)
13807 bfd_vma section_len
;
13809 section_len
= sect
->sh_size
- 1;
13812 while (section_len
> 0)
13815 unsigned int namelen
;
13816 bfd_boolean public_section
;
13817 bfd_boolean gnu_section
;
13819 if (section_len
<= 4)
13821 error (_("Tag section ends prematurely\n"));
13824 attr_len
= byte_get (p
, 4);
13827 if (attr_len
> section_len
)
13829 error (_("Bad attribute length (%u > %u)\n"),
13830 (unsigned) attr_len
, (unsigned) section_len
);
13831 attr_len
= section_len
;
13833 /* PR 17531: file: 001-101425-0.004 */
13834 else if (attr_len
< 5)
13836 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len
);
13840 section_len
-= attr_len
;
13843 namelen
= strnlen ((char *) p
, attr_len
) + 1;
13844 if (namelen
== 0 || namelen
>= attr_len
)
13846 error (_("Corrupt attribute section name\n"));
13850 printf (_("Attribute Section: "));
13851 print_symbol (INT_MAX
, (const char *) p
);
13854 if (public_name
&& streq ((char *) p
, public_name
))
13855 public_section
= TRUE
;
13857 public_section
= FALSE
;
13859 if (streq ((char *) p
, "gnu"))
13860 gnu_section
= TRUE
;
13862 gnu_section
= FALSE
;
13865 attr_len
-= namelen
;
13867 while (attr_len
> 0 && p
< contents
+ sect
->sh_size
)
13872 unsigned char * end
;
13874 /* PR binutils/17531: Safe handling of corrupt files. */
13877 error (_("Unused bytes at end of section\n"));
13883 size
= byte_get (p
, 4);
13884 if (size
> attr_len
)
13886 error (_("Bad subsection length (%u > %u)\n"),
13887 (unsigned) size
, (unsigned) attr_len
);
13890 /* PR binutils/17531: Safe handling of corrupt files. */
13893 error (_("Bad subsection length (%u < 6)\n"),
13900 end
= p
+ size
- 1;
13901 assert (end
<= contents
+ sect
->sh_size
);
13907 printf (_("File Attributes\n"));
13910 printf (_("Section Attributes:"));
13913 printf (_("Symbol Attributes:"));
13919 val
= read_uleb128 (p
, &j
, end
);
13923 printf (" %d", val
);
13928 printf (_("Unknown tag: %d\n"), tag
);
13929 public_section
= FALSE
;
13933 if (public_section
&& display_pub_attribute
!= NULL
)
13936 p
= display_pub_attribute (p
, end
);
13939 else if (gnu_section
&& display_proc_gnu_attribute
!= NULL
)
13942 p
= display_gnu_attribute (p
,
13943 display_proc_gnu_attribute
,
13949 printf (_(" Unknown attribute:\n"));
13950 display_raw_attribute (p
, end
);
13959 printf (_("Unknown format '%c' (%d)\n"), *p
, *p
);
13967 process_arm_specific (FILE * file
)
13969 return process_attributes (file
, "aeabi", SHT_ARM_ATTRIBUTES
,
13970 display_arm_attribute
, NULL
);
13974 process_power_specific (FILE * file
)
13976 return process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
13977 display_power_gnu_attribute
);
13981 process_s390_specific (FILE * file
)
13983 return process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
13984 display_s390_gnu_attribute
);
13988 process_sparc_specific (FILE * file
)
13990 return process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
13991 display_sparc_gnu_attribute
);
13995 process_tic6x_specific (FILE * file
)
13997 return process_attributes (file
, "c6xabi", SHT_C6000_ATTRIBUTES
,
13998 display_tic6x_attribute
, NULL
);
14002 process_msp430x_specific (FILE * file
)
14004 return process_attributes (file
, "mspabi", SHT_MSP430_ATTRIBUTES
,
14005 display_msp430x_attribute
, NULL
);
14008 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14009 Print the Address, Access and Initial fields of an entry at VMA ADDR
14010 and return the VMA of the next entry, or -1 if there was a problem.
14011 Does not read from DATA_END or beyond. */
14014 print_mips_got_entry (unsigned char * data
, bfd_vma pltgot
, bfd_vma addr
,
14015 unsigned char * data_end
)
14018 print_vma (addr
, LONG_HEX
);
14020 if (addr
< pltgot
+ 0xfff0)
14021 printf ("%6d(gp)", (int) (addr
- pltgot
- 0x7ff0));
14023 printf ("%10s", "");
14026 printf ("%*s", is_32bit_elf
? 8 : 16, _("<unknown>"));
14030 unsigned char * from
= data
+ addr
- pltgot
;
14032 if (from
+ (is_32bit_elf
? 4 : 8) > data_end
)
14034 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14035 printf ("%*s", is_32bit_elf
? 8 : 16, _("<corrupt>"));
14036 return (bfd_vma
) -1;
14040 entry
= byte_get (data
+ addr
- pltgot
, is_32bit_elf
? 4 : 8);
14041 print_vma (entry
, LONG_HEX
);
14044 return addr
+ (is_32bit_elf
? 4 : 8);
14047 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14048 PLTGOT. Print the Address and Initial fields of an entry at VMA
14049 ADDR and return the VMA of the next entry. */
14052 print_mips_pltgot_entry (unsigned char * data
, bfd_vma pltgot
, bfd_vma addr
)
14055 print_vma (addr
, LONG_HEX
);
14058 printf ("%*s", is_32bit_elf
? 8 : 16, _("<unknown>"));
14063 entry
= byte_get (data
+ addr
- pltgot
, is_32bit_elf
? 4 : 8);
14064 print_vma (entry
, LONG_HEX
);
14066 return addr
+ (is_32bit_elf
? 4 : 8);
14070 print_mips_ases (unsigned int mask
)
14072 if (mask
& AFL_ASE_DSP
)
14073 fputs ("\n\tDSP ASE", stdout
);
14074 if (mask
& AFL_ASE_DSPR2
)
14075 fputs ("\n\tDSP R2 ASE", stdout
);
14076 if (mask
& AFL_ASE_EVA
)
14077 fputs ("\n\tEnhanced VA Scheme", stdout
);
14078 if (mask
& AFL_ASE_MCU
)
14079 fputs ("\n\tMCU (MicroController) ASE", stdout
);
14080 if (mask
& AFL_ASE_MDMX
)
14081 fputs ("\n\tMDMX ASE", stdout
);
14082 if (mask
& AFL_ASE_MIPS3D
)
14083 fputs ("\n\tMIPS-3D ASE", stdout
);
14084 if (mask
& AFL_ASE_MT
)
14085 fputs ("\n\tMT ASE", stdout
);
14086 if (mask
& AFL_ASE_SMARTMIPS
)
14087 fputs ("\n\tSmartMIPS ASE", stdout
);
14088 if (mask
& AFL_ASE_VIRT
)
14089 fputs ("\n\tVZ ASE", stdout
);
14090 if (mask
& AFL_ASE_MSA
)
14091 fputs ("\n\tMSA ASE", stdout
);
14092 if (mask
& AFL_ASE_MIPS16
)
14093 fputs ("\n\tMIPS16 ASE", stdout
);
14094 if (mask
& AFL_ASE_MICROMIPS
)
14095 fputs ("\n\tMICROMIPS ASE", stdout
);
14096 if (mask
& AFL_ASE_XPA
)
14097 fputs ("\n\tXPA ASE", stdout
);
14099 fprintf (stdout
, "\n\t%s", _("None"));
14100 else if ((mask
& ~AFL_ASE_MASK
) != 0)
14101 fprintf (stdout
, "\n\t%s (%x)", _("Unknown"), mask
& ~AFL_ASE_MASK
);
14105 print_mips_isa_ext (unsigned int isa_ext
)
14110 fputs (_("None"), stdout
);
14113 fputs ("RMI XLR", stdout
);
14115 case AFL_EXT_OCTEON3
:
14116 fputs ("Cavium Networks Octeon3", stdout
);
14118 case AFL_EXT_OCTEON2
:
14119 fputs ("Cavium Networks Octeon2", stdout
);
14121 case AFL_EXT_OCTEONP
:
14122 fputs ("Cavium Networks OcteonP", stdout
);
14124 case AFL_EXT_LOONGSON_3A
:
14125 fputs ("Loongson 3A", stdout
);
14127 case AFL_EXT_OCTEON
:
14128 fputs ("Cavium Networks Octeon", stdout
);
14131 fputs ("Toshiba R5900", stdout
);
14134 fputs ("MIPS R4650", stdout
);
14137 fputs ("LSI R4010", stdout
);
14140 fputs ("NEC VR4100", stdout
);
14143 fputs ("Toshiba R3900", stdout
);
14145 case AFL_EXT_10000
:
14146 fputs ("MIPS R10000", stdout
);
14149 fputs ("Broadcom SB-1", stdout
);
14152 fputs ("NEC VR4111/VR4181", stdout
);
14155 fputs ("NEC VR4120", stdout
);
14158 fputs ("NEC VR5400", stdout
);
14161 fputs ("NEC VR5500", stdout
);
14163 case AFL_EXT_LOONGSON_2E
:
14164 fputs ("ST Microelectronics Loongson 2E", stdout
);
14166 case AFL_EXT_LOONGSON_2F
:
14167 fputs ("ST Microelectronics Loongson 2F", stdout
);
14170 fprintf (stdout
, "%s (%d)", _("Unknown"), isa_ext
);
14175 get_mips_reg_size (int reg_size
)
14177 return (reg_size
== AFL_REG_NONE
) ? 0
14178 : (reg_size
== AFL_REG_32
) ? 32
14179 : (reg_size
== AFL_REG_64
) ? 64
14180 : (reg_size
== AFL_REG_128
) ? 128
14185 process_mips_specific (FILE * file
)
14187 Elf_Internal_Dyn
* entry
;
14188 Elf_Internal_Shdr
*sect
= NULL
;
14189 size_t liblist_offset
= 0;
14190 size_t liblistno
= 0;
14191 size_t conflictsno
= 0;
14192 size_t options_offset
= 0;
14193 size_t conflicts_offset
= 0;
14194 size_t pltrelsz
= 0;
14196 bfd_vma pltgot
= 0;
14197 bfd_vma mips_pltgot
= 0;
14198 bfd_vma jmprel
= 0;
14199 bfd_vma local_gotno
= 0;
14200 bfd_vma gotsym
= 0;
14201 bfd_vma symtabno
= 0;
14203 process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
14204 display_mips_gnu_attribute
);
14206 sect
= find_section (".MIPS.abiflags");
14210 Elf_External_ABIFlags_v0
*abiflags_ext
;
14211 Elf_Internal_ABIFlags_v0 abiflags_in
;
14213 if (sizeof (Elf_External_ABIFlags_v0
) != sect
->sh_size
)
14214 fputs ("\nCorrupt ABI Flags section.\n", stdout
);
14217 abiflags_ext
= get_data (NULL
, file
, sect
->sh_offset
, 1,
14218 sect
->sh_size
, _("MIPS ABI Flags section"));
14221 abiflags_in
.version
= BYTE_GET (abiflags_ext
->version
);
14222 abiflags_in
.isa_level
= BYTE_GET (abiflags_ext
->isa_level
);
14223 abiflags_in
.isa_rev
= BYTE_GET (abiflags_ext
->isa_rev
);
14224 abiflags_in
.gpr_size
= BYTE_GET (abiflags_ext
->gpr_size
);
14225 abiflags_in
.cpr1_size
= BYTE_GET (abiflags_ext
->cpr1_size
);
14226 abiflags_in
.cpr2_size
= BYTE_GET (abiflags_ext
->cpr2_size
);
14227 abiflags_in
.fp_abi
= BYTE_GET (abiflags_ext
->fp_abi
);
14228 abiflags_in
.isa_ext
= BYTE_GET (abiflags_ext
->isa_ext
);
14229 abiflags_in
.ases
= BYTE_GET (abiflags_ext
->ases
);
14230 abiflags_in
.flags1
= BYTE_GET (abiflags_ext
->flags1
);
14231 abiflags_in
.flags2
= BYTE_GET (abiflags_ext
->flags2
);
14233 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in
.version
);
14234 printf ("\nISA: MIPS%d", abiflags_in
.isa_level
);
14235 if (abiflags_in
.isa_rev
> 1)
14236 printf ("r%d", abiflags_in
.isa_rev
);
14237 printf ("\nGPR size: %d",
14238 get_mips_reg_size (abiflags_in
.gpr_size
));
14239 printf ("\nCPR1 size: %d",
14240 get_mips_reg_size (abiflags_in
.cpr1_size
));
14241 printf ("\nCPR2 size: %d",
14242 get_mips_reg_size (abiflags_in
.cpr2_size
));
14243 fputs ("\nFP ABI: ", stdout
);
14244 print_mips_fp_abi_value (abiflags_in
.fp_abi
);
14245 fputs ("ISA Extension: ", stdout
);
14246 print_mips_isa_ext (abiflags_in
.isa_ext
);
14247 fputs ("\nASEs:", stdout
);
14248 print_mips_ases (abiflags_in
.ases
);
14249 printf ("\nFLAGS 1: %8.8lx", abiflags_in
.flags1
);
14250 printf ("\nFLAGS 2: %8.8lx", abiflags_in
.flags2
);
14251 fputc ('\n', stdout
);
14252 free (abiflags_ext
);
14257 /* We have a lot of special sections. Thanks SGI! */
14258 if (dynamic_section
== NULL
)
14259 /* No information available. */
14262 for (entry
= dynamic_section
;
14263 /* PR 17531 file: 012-50589-0.004. */
14264 entry
< dynamic_section
+ dynamic_nent
&& entry
->d_tag
!= DT_NULL
;
14266 switch (entry
->d_tag
)
14268 case DT_MIPS_LIBLIST
:
14270 = offset_from_vma (file
, entry
->d_un
.d_val
,
14271 liblistno
* sizeof (Elf32_External_Lib
));
14273 case DT_MIPS_LIBLISTNO
:
14274 liblistno
= entry
->d_un
.d_val
;
14276 case DT_MIPS_OPTIONS
:
14277 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
14279 case DT_MIPS_CONFLICT
:
14281 = offset_from_vma (file
, entry
->d_un
.d_val
,
14282 conflictsno
* sizeof (Elf32_External_Conflict
));
14284 case DT_MIPS_CONFLICTNO
:
14285 conflictsno
= entry
->d_un
.d_val
;
14288 pltgot
= entry
->d_un
.d_ptr
;
14290 case DT_MIPS_LOCAL_GOTNO
:
14291 local_gotno
= entry
->d_un
.d_val
;
14293 case DT_MIPS_GOTSYM
:
14294 gotsym
= entry
->d_un
.d_val
;
14296 case DT_MIPS_SYMTABNO
:
14297 symtabno
= entry
->d_un
.d_val
;
14299 case DT_MIPS_PLTGOT
:
14300 mips_pltgot
= entry
->d_un
.d_ptr
;
14303 pltrel
= entry
->d_un
.d_val
;
14306 pltrelsz
= entry
->d_un
.d_val
;
14309 jmprel
= entry
->d_un
.d_ptr
;
14315 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
14317 Elf32_External_Lib
* elib
;
14320 elib
= (Elf32_External_Lib
*) get_data (NULL
, file
, liblist_offset
,
14322 sizeof (Elf32_External_Lib
),
14323 _("liblist section data"));
14326 printf (_("\nSection '.liblist' contains %lu entries:\n"),
14327 (unsigned long) liblistno
);
14328 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
14331 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
14338 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
14339 atime
= BYTE_GET (elib
[cnt
].l_time_stamp
);
14340 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
14341 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
14342 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
14344 tmp
= gmtime (&atime
);
14345 snprintf (timebuf
, sizeof (timebuf
),
14346 "%04u-%02u-%02uT%02u:%02u:%02u",
14347 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
14348 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
14350 printf ("%3lu: ", (unsigned long) cnt
);
14351 if (VALID_DYNAMIC_NAME (liblist
.l_name
))
14352 print_symbol (20, GET_DYNAMIC_NAME (liblist
.l_name
));
14354 printf (_("<corrupt: %9ld>"), liblist
.l_name
);
14355 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
14356 liblist
.l_version
);
14358 if (liblist
.l_flags
== 0)
14362 static const struct
14369 { " EXACT_MATCH", LL_EXACT_MATCH
},
14370 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
14371 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
14372 { " EXPORTS", LL_EXPORTS
},
14373 { " DELAY_LOAD", LL_DELAY_LOAD
},
14374 { " DELTA", LL_DELTA
}
14376 int flags
= liblist
.l_flags
;
14379 for (fcnt
= 0; fcnt
< ARRAY_SIZE (l_flags_vals
); ++fcnt
)
14380 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
14382 fputs (l_flags_vals
[fcnt
].name
, stdout
);
14383 flags
^= l_flags_vals
[fcnt
].bit
;
14386 printf (" %#x", (unsigned int) flags
);
14396 if (options_offset
!= 0)
14398 Elf_External_Options
* eopt
;
14399 Elf_Internal_Options
* iopt
;
14400 Elf_Internal_Options
* option
;
14403 sect
= section_headers
;
14405 /* Find the section header so that we get the size. */
14406 sect
= find_section_by_type (SHT_MIPS_OPTIONS
);
14407 /* PR 17533 file: 012-277276-0.004. */
14410 error (_("No MIPS_OPTIONS header found\n"));
14414 eopt
= (Elf_External_Options
*) get_data (NULL
, file
, options_offset
, 1,
14415 sect
->sh_size
, _("options"));
14418 iopt
= (Elf_Internal_Options
*)
14419 cmalloc ((sect
->sh_size
/ sizeof (eopt
)), sizeof (* iopt
));
14422 error (_("Out of memory allocatinf space for MIPS options\n"));
14429 while (offset
<= sect
->sh_size
- sizeof (* eopt
))
14431 Elf_External_Options
* eoption
;
14433 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
14435 option
->kind
= BYTE_GET (eoption
->kind
);
14436 option
->size
= BYTE_GET (eoption
->size
);
14437 option
->section
= BYTE_GET (eoption
->section
);
14438 option
->info
= BYTE_GET (eoption
->info
);
14440 /* PR 17531: file: ffa0fa3b. */
14441 if (option
->size
< sizeof (* eopt
)
14442 || offset
+ option
->size
> sect
->sh_size
)
14444 error (_("Invalid size (%u) for MIPS option\n"), option
->size
);
14447 offset
+= option
->size
;
14453 printf (_("\nSection '%s' contains %d entries:\n"),
14454 printable_section_name (sect
), cnt
);
14463 switch (option
->kind
)
14466 /* This shouldn't happen. */
14467 printf (" NULL %d %lx", option
->section
, option
->info
);
14470 printf (" REGINFO ");
14471 if (elf_header
.e_machine
== EM_MIPS
)
14474 Elf32_External_RegInfo
* ereg
;
14475 Elf32_RegInfo reginfo
;
14477 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
14478 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
14479 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
14480 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
14481 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
14482 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
14483 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
14485 printf ("GPR %08lx GP 0x%lx\n",
14486 reginfo
.ri_gprmask
,
14487 (unsigned long) reginfo
.ri_gp_value
);
14488 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14489 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
14490 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
14495 Elf64_External_RegInfo
* ereg
;
14496 Elf64_Internal_RegInfo reginfo
;
14498 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
14499 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
14500 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
14501 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
14502 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
14503 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
14504 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
14506 printf ("GPR %08lx GP 0x",
14507 reginfo
.ri_gprmask
);
14508 printf_vma (reginfo
.ri_gp_value
);
14511 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14512 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
14513 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
14517 case ODK_EXCEPTIONS
:
14518 fputs (" EXCEPTIONS fpe_min(", stdout
);
14519 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
14520 fputs (") fpe_max(", stdout
);
14521 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
14522 fputs (")", stdout
);
14524 if (option
->info
& OEX_PAGE0
)
14525 fputs (" PAGE0", stdout
);
14526 if (option
->info
& OEX_SMM
)
14527 fputs (" SMM", stdout
);
14528 if (option
->info
& OEX_FPDBUG
)
14529 fputs (" FPDBUG", stdout
);
14530 if (option
->info
& OEX_DISMISS
)
14531 fputs (" DISMISS", stdout
);
14534 fputs (" PAD ", stdout
);
14535 if (option
->info
& OPAD_PREFIX
)
14536 fputs (" PREFIX", stdout
);
14537 if (option
->info
& OPAD_POSTFIX
)
14538 fputs (" POSTFIX", stdout
);
14539 if (option
->info
& OPAD_SYMBOL
)
14540 fputs (" SYMBOL", stdout
);
14543 fputs (" HWPATCH ", stdout
);
14544 if (option
->info
& OHW_R4KEOP
)
14545 fputs (" R4KEOP", stdout
);
14546 if (option
->info
& OHW_R8KPFETCH
)
14547 fputs (" R8KPFETCH", stdout
);
14548 if (option
->info
& OHW_R5KEOP
)
14549 fputs (" R5KEOP", stdout
);
14550 if (option
->info
& OHW_R5KCVTL
)
14551 fputs (" R5KCVTL", stdout
);
14554 fputs (" FILL ", stdout
);
14555 /* XXX Print content of info word? */
14558 fputs (" TAGS ", stdout
);
14559 /* XXX Print content of info word? */
14562 fputs (" HWAND ", stdout
);
14563 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
14564 fputs (" R4KEOP_CHECKED", stdout
);
14565 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
14566 fputs (" R4KEOP_CLEAN", stdout
);
14569 fputs (" HWOR ", stdout
);
14570 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
14571 fputs (" R4KEOP_CHECKED", stdout
);
14572 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
14573 fputs (" R4KEOP_CLEAN", stdout
);
14576 printf (" GP_GROUP %#06lx self-contained %#06lx",
14577 option
->info
& OGP_GROUP
,
14578 (option
->info
& OGP_SELF
) >> 16);
14581 printf (" IDENT %#06lx self-contained %#06lx",
14582 option
->info
& OGP_GROUP
,
14583 (option
->info
& OGP_SELF
) >> 16);
14586 /* This shouldn't happen. */
14587 printf (" %3d ??? %d %lx",
14588 option
->kind
, option
->section
, option
->info
);
14592 len
= sizeof (* eopt
);
14593 while (len
< option
->size
)
14595 unsigned char datum
= * ((unsigned char *) eopt
+ offset
+ len
);
14597 if (ISPRINT (datum
))
14598 printf ("%c", datum
);
14600 printf ("\\%03o", datum
);
14603 fputs ("\n", stdout
);
14605 offset
+= option
->size
;
14613 if (conflicts_offset
!= 0 && conflictsno
!= 0)
14615 Elf32_Conflict
* iconf
;
14618 if (dynamic_symbols
== NULL
)
14620 error (_("conflict list found without a dynamic symbol table\n"));
14624 iconf
= (Elf32_Conflict
*) cmalloc (conflictsno
, sizeof (* iconf
));
14627 error (_("Out of memory allocating space for dynamic conflicts\n"));
14633 Elf32_External_Conflict
* econf32
;
14635 econf32
= (Elf32_External_Conflict
*)
14636 get_data (NULL
, file
, conflicts_offset
, conflictsno
,
14637 sizeof (* econf32
), _("conflict"));
14641 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
14642 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
14648 Elf64_External_Conflict
* econf64
;
14650 econf64
= (Elf64_External_Conflict
*)
14651 get_data (NULL
, file
, conflicts_offset
, conflictsno
,
14652 sizeof (* econf64
), _("conflict"));
14656 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
14657 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
14662 printf (_("\nSection '.conflict' contains %lu entries:\n"),
14663 (unsigned long) conflictsno
);
14664 puts (_(" Num: Index Value Name"));
14666 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
14668 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
14670 if (iconf
[cnt
] >= num_dynamic_syms
)
14671 printf (_("<corrupt symbol index>"));
14674 Elf_Internal_Sym
* psym
;
14676 psym
= & dynamic_symbols
[iconf
[cnt
]];
14677 print_vma (psym
->st_value
, FULL_HEX
);
14679 if (VALID_DYNAMIC_NAME (psym
->st_name
))
14680 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
14682 printf (_("<corrupt: %14ld>"), psym
->st_name
);
14690 if (pltgot
!= 0 && local_gotno
!= 0)
14692 bfd_vma ent
, local_end
, global_end
;
14694 unsigned char * data
;
14695 unsigned char * data_end
;
14699 addr_size
= (is_32bit_elf
? 4 : 8);
14700 local_end
= pltgot
+ local_gotno
* addr_size
;
14702 /* PR binutils/17533 file: 012-111227-0.004 */
14703 if (symtabno
< gotsym
)
14705 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
14706 (unsigned long) gotsym
, (unsigned long) symtabno
);
14710 global_end
= local_end
+ (symtabno
- gotsym
) * addr_size
;
14711 /* PR 17531: file: 54c91a34. */
14712 if (global_end
< local_end
)
14714 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno
);
14718 offset
= offset_from_vma (file
, pltgot
, global_end
- pltgot
);
14719 data
= (unsigned char *) get_data (NULL
, file
, offset
,
14720 global_end
- pltgot
, 1,
14721 _("Global Offset Table data"));
14724 data_end
= data
+ (global_end
- pltgot
);
14726 printf (_("\nPrimary GOT:\n"));
14727 printf (_(" Canonical gp value: "));
14728 print_vma (pltgot
+ 0x7ff0, LONG_HEX
);
14731 printf (_(" Reserved entries:\n"));
14732 printf (_(" %*s %10s %*s Purpose\n"),
14733 addr_size
* 2, _("Address"), _("Access"),
14734 addr_size
* 2, _("Initial"));
14735 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
14736 printf (_(" Lazy resolver\n"));
14737 if (ent
== (bfd_vma
) -1)
14738 goto got_print_fail
;
14740 && (byte_get (data
+ ent
- pltgot
, addr_size
)
14741 >> (addr_size
* 8 - 1)) != 0)
14743 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
14744 printf (_(" Module pointer (GNU extension)\n"));
14745 if (ent
== (bfd_vma
) -1)
14746 goto got_print_fail
;
14750 if (ent
< local_end
)
14752 printf (_(" Local entries:\n"));
14753 printf (" %*s %10s %*s\n",
14754 addr_size
* 2, _("Address"), _("Access"),
14755 addr_size
* 2, _("Initial"));
14756 while (ent
< local_end
)
14758 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
14760 if (ent
== (bfd_vma
) -1)
14761 goto got_print_fail
;
14766 if (gotsym
< symtabno
)
14770 printf (_(" Global entries:\n"));
14771 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
14772 addr_size
* 2, _("Address"),
14774 addr_size
* 2, _("Initial"),
14775 addr_size
* 2, _("Sym.Val."),
14777 /* Note for translators: "Ndx" = abbreviated form of "Index". */
14778 _("Ndx"), _("Name"));
14780 sym_width
= (is_32bit_elf
? 80 : 160) - 28 - addr_size
* 6 - 1;
14782 for (i
= gotsym
; i
< symtabno
; i
++)
14784 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
14787 if (dynamic_symbols
== NULL
)
14788 printf (_("<no dynamic symbols>"));
14789 else if (i
< num_dynamic_syms
)
14791 Elf_Internal_Sym
* psym
= dynamic_symbols
+ i
;
14793 print_vma (psym
->st_value
, LONG_HEX
);
14794 printf (" %-7s %3s ",
14795 get_symbol_type (ELF_ST_TYPE (psym
->st_info
)),
14796 get_symbol_index_type (psym
->st_shndx
));
14798 if (VALID_DYNAMIC_NAME (psym
->st_name
))
14799 print_symbol (sym_width
, GET_DYNAMIC_NAME (psym
->st_name
));
14801 printf (_("<corrupt: %14ld>"), psym
->st_name
);
14804 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
14805 (unsigned long) i
);
14808 if (ent
== (bfd_vma
) -1)
14819 if (mips_pltgot
!= 0 && jmprel
!= 0 && pltrel
!= 0 && pltrelsz
!= 0)
14822 size_t offset
, rel_offset
;
14823 unsigned long count
, i
;
14824 unsigned char * data
;
14825 int addr_size
, sym_width
;
14826 Elf_Internal_Rela
* rels
;
14828 rel_offset
= offset_from_vma (file
, jmprel
, pltrelsz
);
14829 if (pltrel
== DT_RELA
)
14831 if (!slurp_rela_relocs (file
, rel_offset
, pltrelsz
, &rels
, &count
))
14836 if (!slurp_rel_relocs (file
, rel_offset
, pltrelsz
, &rels
, &count
))
14841 addr_size
= (is_32bit_elf
? 4 : 8);
14842 end
= mips_pltgot
+ (2 + count
) * addr_size
;
14844 offset
= offset_from_vma (file
, mips_pltgot
, end
- mips_pltgot
);
14845 data
= (unsigned char *) get_data (NULL
, file
, offset
, end
- mips_pltgot
,
14846 1, _("Procedure Linkage Table data"));
14850 printf ("\nPLT GOT:\n\n");
14851 printf (_(" Reserved entries:\n"));
14852 printf (_(" %*s %*s Purpose\n"),
14853 addr_size
* 2, _("Address"), addr_size
* 2, _("Initial"));
14854 ent
= print_mips_pltgot_entry (data
, mips_pltgot
, ent
);
14855 printf (_(" PLT lazy resolver\n"));
14856 ent
= print_mips_pltgot_entry (data
, mips_pltgot
, ent
);
14857 printf (_(" Module pointer\n"));
14860 printf (_(" Entries:\n"));
14861 printf (" %*s %*s %*s %-7s %3s %s\n",
14862 addr_size
* 2, _("Address"),
14863 addr_size
* 2, _("Initial"),
14864 addr_size
* 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
14865 sym_width
= (is_32bit_elf
? 80 : 160) - 17 - addr_size
* 6 - 1;
14866 for (i
= 0; i
< count
; i
++)
14868 unsigned long idx
= get_reloc_symindex (rels
[i
].r_info
);
14870 ent
= print_mips_pltgot_entry (data
, mips_pltgot
, ent
);
14873 if (idx
>= num_dynamic_syms
)
14874 printf (_("<corrupt symbol index: %lu>"), idx
);
14877 Elf_Internal_Sym
* psym
= dynamic_symbols
+ idx
;
14879 print_vma (psym
->st_value
, LONG_HEX
);
14880 printf (" %-7s %3s ",
14881 get_symbol_type (ELF_ST_TYPE (psym
->st_info
)),
14882 get_symbol_index_type (psym
->st_shndx
));
14883 if (VALID_DYNAMIC_NAME (psym
->st_name
))
14884 print_symbol (sym_width
, GET_DYNAMIC_NAME (psym
->st_name
));
14886 printf (_("<corrupt: %14ld>"), psym
->st_name
);
14901 process_nds32_specific (FILE * file
)
14903 Elf_Internal_Shdr
*sect
= NULL
;
14905 sect
= find_section (".nds32_e_flags");
14908 unsigned int *flag
;
14910 printf ("\nNDS32 elf flags section:\n");
14911 flag
= get_data (NULL
, file
, sect
->sh_offset
, 1,
14912 sect
->sh_size
, _("NDS32 elf flags section"));
14914 switch ((*flag
) & 0x3)
14917 printf ("(VEC_SIZE):\tNo entry.\n");
14920 printf ("(VEC_SIZE):\t4 bytes\n");
14923 printf ("(VEC_SIZE):\t16 bytes\n");
14926 printf ("(VEC_SIZE):\treserved\n");
14935 process_gnu_liblist (FILE * file
)
14937 Elf_Internal_Shdr
* section
;
14938 Elf_Internal_Shdr
* string_sec
;
14939 Elf32_External_Lib
* elib
;
14941 size_t strtab_size
;
14948 for (i
= 0, section
= section_headers
;
14949 i
< elf_header
.e_shnum
;
14952 switch (section
->sh_type
)
14954 case SHT_GNU_LIBLIST
:
14955 if (section
->sh_link
>= elf_header
.e_shnum
)
14958 elib
= (Elf32_External_Lib
*)
14959 get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
14960 _("liblist section data"));
14964 string_sec
= section_headers
+ section
->sh_link
;
14966 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
, 1,
14967 string_sec
->sh_size
,
14968 _("liblist string table"));
14970 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
14976 strtab_size
= string_sec
->sh_size
;
14978 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
14979 printable_section_name (section
),
14980 (unsigned long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
14982 puts (_(" Library Time Stamp Checksum Version Flags"));
14984 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
14992 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
14993 atime
= BYTE_GET (elib
[cnt
].l_time_stamp
);
14994 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
14995 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
14996 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
14998 tmp
= gmtime (&atime
);
14999 snprintf (timebuf
, sizeof (timebuf
),
15000 "%04u-%02u-%02uT%02u:%02u:%02u",
15001 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
15002 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
15004 printf ("%3lu: ", (unsigned long) cnt
);
15006 printf ("%-20s", liblist
.l_name
< strtab_size
15007 ? strtab
+ liblist
.l_name
: _("<corrupt>"));
15009 printf ("%-20.20s", liblist
.l_name
< strtab_size
15010 ? strtab
+ liblist
.l_name
: _("<corrupt>"));
15011 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
15012 liblist
.l_version
, liblist
.l_flags
);
15023 static const char *
15024 get_note_type (unsigned e_type
)
15026 static char buff
[64];
15028 if (elf_header
.e_type
== ET_CORE
)
15032 return _("NT_AUXV (auxiliary vector)");
15034 return _("NT_PRSTATUS (prstatus structure)");
15036 return _("NT_FPREGSET (floating point registers)");
15038 return _("NT_PRPSINFO (prpsinfo structure)");
15039 case NT_TASKSTRUCT
:
15040 return _("NT_TASKSTRUCT (task structure)");
15042 return _("NT_PRXFPREG (user_xfpregs structure)");
15044 return _("NT_PPC_VMX (ppc Altivec registers)");
15046 return _("NT_PPC_VSX (ppc VSX registers)");
15048 return _("NT_386_TLS (x86 TLS information)");
15049 case NT_386_IOPERM
:
15050 return _("NT_386_IOPERM (x86 I/O permissions)");
15051 case NT_X86_XSTATE
:
15052 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
15053 case NT_S390_HIGH_GPRS
:
15054 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
15055 case NT_S390_TIMER
:
15056 return _("NT_S390_TIMER (s390 timer register)");
15057 case NT_S390_TODCMP
:
15058 return _("NT_S390_TODCMP (s390 TOD comparator register)");
15059 case NT_S390_TODPREG
:
15060 return _("NT_S390_TODPREG (s390 TOD programmable register)");
15062 return _("NT_S390_CTRS (s390 control registers)");
15063 case NT_S390_PREFIX
:
15064 return _("NT_S390_PREFIX (s390 prefix register)");
15065 case NT_S390_LAST_BREAK
:
15066 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15067 case NT_S390_SYSTEM_CALL
:
15068 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
15070 return _("NT_S390_TDB (s390 transaction diagnostic block)");
15071 case NT_S390_VXRS_LOW
:
15072 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15073 case NT_S390_VXRS_HIGH
:
15074 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
15076 return _("NT_ARM_VFP (arm VFP registers)");
15078 return _("NT_ARM_TLS (AArch TLS registers)");
15079 case NT_ARM_HW_BREAK
:
15080 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15081 case NT_ARM_HW_WATCH
:
15082 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
15084 return _("NT_PSTATUS (pstatus structure)");
15086 return _("NT_FPREGS (floating point registers)");
15088 return _("NT_PSINFO (psinfo structure)");
15090 return _("NT_LWPSTATUS (lwpstatus_t structure)");
15092 return _("NT_LWPSINFO (lwpsinfo_t structure)");
15093 case NT_WIN32PSTATUS
:
15094 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
15096 return _("NT_SIGINFO (siginfo_t data)");
15098 return _("NT_FILE (mapped files)");
15106 return _("NT_VERSION (version)");
15108 return _("NT_ARCH (architecture)");
15113 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
15118 print_core_note (Elf_Internal_Note
*pnote
)
15120 unsigned int addr_size
= is_32bit_elf
? 4 : 8;
15121 bfd_vma count
, page_size
;
15122 unsigned char *descdata
, *filenames
, *descend
;
15124 if (pnote
->type
!= NT_FILE
)
15130 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
15131 /* Still "successful". */
15136 if (pnote
->descsz
< 2 * addr_size
)
15138 printf (_(" Malformed note - too short for header\n"));
15142 descdata
= (unsigned char *) pnote
->descdata
;
15143 descend
= descdata
+ pnote
->descsz
;
15145 if (descdata
[pnote
->descsz
- 1] != '\0')
15147 printf (_(" Malformed note - does not end with \\0\n"));
15151 count
= byte_get (descdata
, addr_size
);
15152 descdata
+= addr_size
;
15154 page_size
= byte_get (descdata
, addr_size
);
15155 descdata
+= addr_size
;
15157 if (pnote
->descsz
< 2 * addr_size
+ count
* 3 * addr_size
)
15159 printf (_(" Malformed note - too short for supplied file count\n"));
15163 printf (_(" Page size: "));
15164 print_vma (page_size
, DEC
);
15167 printf (_(" %*s%*s%*s\n"),
15168 (int) (2 + 2 * addr_size
), _("Start"),
15169 (int) (4 + 2 * addr_size
), _("End"),
15170 (int) (4 + 2 * addr_size
), _("Page Offset"));
15171 filenames
= descdata
+ count
* 3 * addr_size
;
15172 while (count
-- > 0)
15174 bfd_vma start
, end
, file_ofs
;
15176 if (filenames
== descend
)
15178 printf (_(" Malformed note - filenames end too early\n"));
15182 start
= byte_get (descdata
, addr_size
);
15183 descdata
+= addr_size
;
15184 end
= byte_get (descdata
, addr_size
);
15185 descdata
+= addr_size
;
15186 file_ofs
= byte_get (descdata
, addr_size
);
15187 descdata
+= addr_size
;
15190 print_vma (start
, FULL_HEX
);
15192 print_vma (end
, FULL_HEX
);
15194 print_vma (file_ofs
, FULL_HEX
);
15195 printf ("\n %s\n", filenames
);
15197 filenames
+= 1 + strlen ((char *) filenames
);
15203 static const char *
15204 get_gnu_elf_note_type (unsigned e_type
)
15206 static char buff
[64];
15210 case NT_GNU_ABI_TAG
:
15211 return _("NT_GNU_ABI_TAG (ABI version tag)");
15213 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15214 case NT_GNU_BUILD_ID
:
15215 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
15216 case NT_GNU_GOLD_VERSION
:
15217 return _("NT_GNU_GOLD_VERSION (gold version)");
15222 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
15227 print_gnu_note (Elf_Internal_Note
*pnote
)
15229 switch (pnote
->type
)
15231 case NT_GNU_BUILD_ID
:
15235 printf (_(" Build ID: "));
15236 for (i
= 0; i
< pnote
->descsz
; ++i
)
15237 printf ("%02x", pnote
->descdata
[i
] & 0xff);
15242 case NT_GNU_ABI_TAG
:
15244 unsigned long os
, major
, minor
, subminor
;
15245 const char *osname
;
15247 /* PR 17531: file: 030-599401-0.004. */
15248 if (pnote
->descsz
< 16)
15250 printf (_(" <corrupt GNU_ABI_TAG>\n"));
15254 os
= byte_get ((unsigned char *) pnote
->descdata
, 4);
15255 major
= byte_get ((unsigned char *) pnote
->descdata
+ 4, 4);
15256 minor
= byte_get ((unsigned char *) pnote
->descdata
+ 8, 4);
15257 subminor
= byte_get ((unsigned char *) pnote
->descdata
+ 12, 4);
15261 case GNU_ABI_TAG_LINUX
:
15264 case GNU_ABI_TAG_HURD
:
15267 case GNU_ABI_TAG_SOLARIS
:
15268 osname
= "Solaris";
15270 case GNU_ABI_TAG_FREEBSD
:
15271 osname
= "FreeBSD";
15273 case GNU_ABI_TAG_NETBSD
:
15276 case GNU_ABI_TAG_SYLLABLE
:
15277 osname
= "Syllable";
15279 case GNU_ABI_TAG_NACL
:
15283 osname
= "Unknown";
15287 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname
,
15288 major
, minor
, subminor
);
15292 case NT_GNU_GOLD_VERSION
:
15296 printf (_(" Version: "));
15297 for (i
= 0; i
< pnote
->descsz
&& pnote
->descdata
[i
] != '\0'; ++i
)
15298 printf ("%c", pnote
->descdata
[i
]);
15307 static const char *
15308 get_v850_elf_note_type (enum v850_notes n_type
)
15310 static char buff
[64];
15314 case V850_NOTE_ALIGNMENT
: return _("Alignment of 8-byte objects");
15315 case V850_NOTE_DATA_SIZE
: return _("Sizeof double and long double");
15316 case V850_NOTE_FPU_INFO
: return _("Type of FPU support needed");
15317 case V850_NOTE_SIMD_INFO
: return _("Use of SIMD instructions");
15318 case V850_NOTE_CACHE_INFO
: return _("Use of cache");
15319 case V850_NOTE_MMU_INFO
: return _("Use of MMU");
15321 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), n_type
);
15327 print_v850_note (Elf_Internal_Note
* pnote
)
15331 if (pnote
->descsz
!= 4)
15333 val
= byte_get ((unsigned char *) pnote
->descdata
, pnote
->descsz
);
15337 printf (_("not set\n"));
15341 switch (pnote
->type
)
15343 case V850_NOTE_ALIGNMENT
:
15346 case EF_RH850_DATA_ALIGN4
: printf (_("4-byte\n")); return 1;
15347 case EF_RH850_DATA_ALIGN8
: printf (_("8-byte\n")); return 1;
15351 case V850_NOTE_DATA_SIZE
:
15354 case EF_RH850_DOUBLE32
: printf (_("4-bytes\n")); return 1;
15355 case EF_RH850_DOUBLE64
: printf (_("8-bytes\n")); return 1;
15359 case V850_NOTE_FPU_INFO
:
15362 case EF_RH850_FPU20
: printf (_("FPU-2.0\n")); return 1;
15363 case EF_RH850_FPU30
: printf (_("FPU-3.0\n")); return 1;
15367 case V850_NOTE_MMU_INFO
:
15368 case V850_NOTE_CACHE_INFO
:
15369 case V850_NOTE_SIMD_INFO
:
15370 if (val
== EF_RH850_SIMD
)
15372 printf (_("yes\n"));
15378 /* An 'unknown note type' message will already have been displayed. */
15382 printf (_("unknown value: %x\n"), val
);
15387 process_netbsd_elf_note (Elf_Internal_Note
* pnote
)
15389 unsigned int version
;
15391 switch (pnote
->type
)
15393 case NT_NETBSD_IDENT
:
15394 version
= byte_get ((unsigned char *) pnote
->descdata
, sizeof (version
));
15395 if ((version
/ 10000) % 100)
15396 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote
->descsz
,
15397 version
, version
/ 100000000, (version
/ 1000000) % 100,
15398 (version
/ 10000) % 100 > 26 ? "Z" : "",
15399 'A' + (version
/ 10000) % 26);
15401 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote
->descsz
,
15402 version
, version
/ 100000000, (version
/ 1000000) % 100,
15403 (version
/ 100) % 100);
15406 case NT_NETBSD_MARCH
:
15407 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote
->descsz
,
15415 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote
->descsz
,
15420 static const char *
15421 get_freebsd_elfcore_note_type (unsigned e_type
)
15425 case NT_FREEBSD_THRMISC
:
15426 return _("NT_THRMISC (thrmisc structure)");
15427 case NT_FREEBSD_PROCSTAT_PROC
:
15428 return _("NT_PROCSTAT_PROC (proc data)");
15429 case NT_FREEBSD_PROCSTAT_FILES
:
15430 return _("NT_PROCSTAT_FILES (files data)");
15431 case NT_FREEBSD_PROCSTAT_VMMAP
:
15432 return _("NT_PROCSTAT_VMMAP (vmmap data)");
15433 case NT_FREEBSD_PROCSTAT_GROUPS
:
15434 return _("NT_PROCSTAT_GROUPS (groups data)");
15435 case NT_FREEBSD_PROCSTAT_UMASK
:
15436 return _("NT_PROCSTAT_UMASK (umask data)");
15437 case NT_FREEBSD_PROCSTAT_RLIMIT
:
15438 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
15439 case NT_FREEBSD_PROCSTAT_OSREL
:
15440 return _("NT_PROCSTAT_OSREL (osreldate data)");
15441 case NT_FREEBSD_PROCSTAT_PSSTRINGS
:
15442 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
15443 case NT_FREEBSD_PROCSTAT_AUXV
:
15444 return _("NT_PROCSTAT_AUXV (auxv data)");
15446 return get_note_type (e_type
);
15449 static const char *
15450 get_netbsd_elfcore_note_type (unsigned e_type
)
15452 static char buff
[64];
15454 if (e_type
== NT_NETBSDCORE_PROCINFO
)
15456 /* NetBSD core "procinfo" structure. */
15457 return _("NetBSD procinfo structure");
15460 /* As of Jan 2002 there are no other machine-independent notes
15461 defined for NetBSD core files. If the note type is less
15462 than the start of the machine-dependent note types, we don't
15465 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
15467 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
15471 switch (elf_header
.e_machine
)
15473 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
15474 and PT_GETFPREGS == mach+2. */
15479 case EM_SPARC32PLUS
:
15483 case NT_NETBSDCORE_FIRSTMACH
+ 0:
15484 return _("PT_GETREGS (reg structure)");
15485 case NT_NETBSDCORE_FIRSTMACH
+ 2:
15486 return _("PT_GETFPREGS (fpreg structure)");
15492 /* On all other arch's, PT_GETREGS == mach+1 and
15493 PT_GETFPREGS == mach+3. */
15497 case NT_NETBSDCORE_FIRSTMACH
+ 1:
15498 return _("PT_GETREGS (reg structure)");
15499 case NT_NETBSDCORE_FIRSTMACH
+ 3:
15500 return _("PT_GETFPREGS (fpreg structure)");
15506 snprintf (buff
, sizeof (buff
), "PT_FIRSTMACH+%d",
15507 e_type
- NT_NETBSDCORE_FIRSTMACH
);
15511 static const char *
15512 get_stapsdt_note_type (unsigned e_type
)
15514 static char buff
[64];
15519 return _("NT_STAPSDT (SystemTap probe descriptors)");
15525 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
15530 print_stapsdt_note (Elf_Internal_Note
*pnote
)
15532 int addr_size
= is_32bit_elf
? 4 : 8;
15533 char *data
= pnote
->descdata
;
15534 char *data_end
= pnote
->descdata
+ pnote
->descsz
;
15535 bfd_vma pc
, base_addr
, semaphore
;
15536 char *provider
, *probe
, *arg_fmt
;
15538 pc
= byte_get ((unsigned char *) data
, addr_size
);
15540 base_addr
= byte_get ((unsigned char *) data
, addr_size
);
15542 semaphore
= byte_get ((unsigned char *) data
, addr_size
);
15546 data
+= strlen (data
) + 1;
15548 data
+= strlen (data
) + 1;
15550 data
+= strlen (data
) + 1;
15552 printf (_(" Provider: %s\n"), provider
);
15553 printf (_(" Name: %s\n"), probe
);
15554 printf (_(" Location: "));
15555 print_vma (pc
, FULL_HEX
);
15556 printf (_(", Base: "));
15557 print_vma (base_addr
, FULL_HEX
);
15558 printf (_(", Semaphore: "));
15559 print_vma (semaphore
, FULL_HEX
);
15561 printf (_(" Arguments: %s\n"), arg_fmt
);
15563 return data
== data_end
;
15566 static const char *
15567 get_ia64_vms_note_type (unsigned e_type
)
15569 static char buff
[64];
15574 return _("NT_VMS_MHD (module header)");
15576 return _("NT_VMS_LNM (language name)");
15578 return _("NT_VMS_SRC (source files)");
15580 return "NT_VMS_TITLE";
15582 return _("NT_VMS_EIDC (consistency check)");
15583 case NT_VMS_FPMODE
:
15584 return _("NT_VMS_FPMODE (FP mode)");
15585 case NT_VMS_LINKTIME
:
15586 return "NT_VMS_LINKTIME";
15587 case NT_VMS_IMGNAM
:
15588 return _("NT_VMS_IMGNAM (image name)");
15590 return _("NT_VMS_IMGID (image id)");
15591 case NT_VMS_LINKID
:
15592 return _("NT_VMS_LINKID (link id)");
15593 case NT_VMS_IMGBID
:
15594 return _("NT_VMS_IMGBID (build id)");
15595 case NT_VMS_GSTNAM
:
15596 return _("NT_VMS_GSTNAM (sym table name)");
15597 case NT_VMS_ORIG_DYN
:
15598 return "NT_VMS_ORIG_DYN";
15599 case NT_VMS_PATCHTIME
:
15600 return "NT_VMS_PATCHTIME";
15602 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
15608 print_ia64_vms_note (Elf_Internal_Note
* pnote
)
15610 switch (pnote
->type
)
15613 if (pnote
->descsz
> 36)
15615 size_t l
= strlen (pnote
->descdata
+ 34);
15616 printf (_(" Creation date : %.17s\n"), pnote
->descdata
);
15617 printf (_(" Last patch date: %.17s\n"), pnote
->descdata
+ 17);
15618 printf (_(" Module name : %s\n"), pnote
->descdata
+ 34);
15619 printf (_(" Module version : %s\n"), pnote
->descdata
+ 34 + l
+ 1);
15622 printf (_(" Invalid size\n"));
15625 printf (_(" Language: %s\n"), pnote
->descdata
);
15628 case NT_VMS_FPMODE
:
15629 printf (_(" Floating Point mode: "));
15630 printf ("0x%016" BFD_VMA_FMT
"x\n",
15631 (bfd_vma
) byte_get ((unsigned char *)pnote
->descdata
, 8));
15633 case NT_VMS_LINKTIME
:
15634 printf (_(" Link time: "));
15636 ((bfd_int64_t
) byte_get ((unsigned char *)pnote
->descdata
, 8));
15639 case NT_VMS_PATCHTIME
:
15640 printf (_(" Patch time: "));
15642 ((bfd_int64_t
) byte_get ((unsigned char *)pnote
->descdata
, 8));
15645 case NT_VMS_ORIG_DYN
:
15646 printf (_(" Major id: %u, minor id: %u\n"),
15647 (unsigned) byte_get ((unsigned char *)pnote
->descdata
, 4),
15648 (unsigned) byte_get ((unsigned char *)pnote
->descdata
+ 4, 4));
15649 printf (_(" Last modified : "));
15651 ((bfd_int64_t
) byte_get ((unsigned char *)pnote
->descdata
+ 8, 8));
15652 printf (_("\n Link flags : "));
15653 printf ("0x%016" BFD_VMA_FMT
"x\n",
15654 (bfd_vma
) byte_get ((unsigned char *)pnote
->descdata
+ 16, 8));
15655 printf (_(" Header flags: 0x%08x\n"),
15656 (unsigned) byte_get ((unsigned char *)pnote
->descdata
+ 24, 4));
15657 printf (_(" Image id : %s\n"), pnote
->descdata
+ 32);
15660 case NT_VMS_IMGNAM
:
15661 printf (_(" Image name: %s\n"), pnote
->descdata
);
15663 case NT_VMS_GSTNAM
:
15664 printf (_(" Global symbol table name: %s\n"), pnote
->descdata
);
15667 printf (_(" Image id: %s\n"), pnote
->descdata
);
15669 case NT_VMS_LINKID
:
15670 printf (_(" Linker id: %s\n"), pnote
->descdata
);
15678 /* Note that by the ELF standard, the name field is already null byte
15679 terminated, and namesz includes the terminating null byte.
15680 I.E. the value of namesz for the name "FSF" is 4.
15682 If the value of namesz is zero, there is no name present. */
15684 process_note (Elf_Internal_Note
* pnote
)
15686 const char * name
= pnote
->namesz
? pnote
->namedata
: "(NONE)";
15689 if (pnote
->namesz
== 0)
15690 /* If there is no note name, then use the default set of
15691 note type strings. */
15692 nt
= get_note_type (pnote
->type
);
15694 else if (const_strneq (pnote
->namedata
, "GNU"))
15695 /* GNU-specific object file notes. */
15696 nt
= get_gnu_elf_note_type (pnote
->type
);
15698 else if (const_strneq (pnote
->namedata
, "FreeBSD"))
15699 /* FreeBSD-specific core file notes. */
15700 nt
= get_freebsd_elfcore_note_type (pnote
->type
);
15702 else if (const_strneq (pnote
->namedata
, "NetBSD-CORE"))
15703 /* NetBSD-specific core file notes. */
15704 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
15706 else if (const_strneq (pnote
->namedata
, "NetBSD"))
15707 /* NetBSD-specific core file notes. */
15708 return process_netbsd_elf_note (pnote
);
15710 else if (strneq (pnote
->namedata
, "SPU/", 4))
15712 /* SPU-specific core file notes. */
15713 nt
= pnote
->namedata
+ 4;
15717 else if (const_strneq (pnote
->namedata
, "IPF/VMS"))
15718 /* VMS/ia64-specific file notes. */
15719 nt
= get_ia64_vms_note_type (pnote
->type
);
15721 else if (const_strneq (pnote
->namedata
, "stapsdt"))
15722 nt
= get_stapsdt_note_type (pnote
->type
);
15725 /* Don't recognize this note name; just use the default set of
15726 note type strings. */
15727 nt
= get_note_type (pnote
->type
);
15729 printf (" %-20s 0x%08lx\t%s\n", name
, pnote
->descsz
, nt
);
15731 if (const_strneq (pnote
->namedata
, "IPF/VMS"))
15732 return print_ia64_vms_note (pnote
);
15733 else if (const_strneq (pnote
->namedata
, "GNU"))
15734 return print_gnu_note (pnote
);
15735 else if (const_strneq (pnote
->namedata
, "stapsdt"))
15736 return print_stapsdt_note (pnote
);
15737 else if (const_strneq (pnote
->namedata
, "CORE"))
15738 return print_core_note (pnote
);
15745 process_corefile_note_segment (FILE * file
, bfd_vma offset
, bfd_vma length
)
15747 Elf_External_Note
* pnotes
;
15748 Elf_External_Note
* external
;
15755 pnotes
= (Elf_External_Note
*) get_data (NULL
, file
, offset
, 1, length
,
15757 if (pnotes
== NULL
)
15762 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
15763 (unsigned long) offset
, (unsigned long) length
);
15764 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
15766 end
= (char *) pnotes
+ length
;
15767 while ((char *) external
< end
)
15769 Elf_Internal_Note inote
;
15772 char * temp
= NULL
;
15773 size_t data_remaining
= end
- (char *) external
;
15775 if (!is_ia64_vms ())
15777 /* PR binutils/15191
15778 Make sure that there is enough data to read. */
15779 min_notesz
= offsetof (Elf_External_Note
, name
);
15780 if (data_remaining
< min_notesz
)
15782 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15783 (int) data_remaining
);
15786 inote
.type
= BYTE_GET (external
->type
);
15787 inote
.namesz
= BYTE_GET (external
->namesz
);
15788 inote
.namedata
= external
->name
;
15789 inote
.descsz
= BYTE_GET (external
->descsz
);
15790 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
15791 /* PR 17531: file: 3443835e. */
15792 if (inote
.descdata
< (char *) pnotes
|| inote
.descdata
> end
)
15794 warn (_("Corrupt note: name size is too big: %lx\n"), inote
.namesz
);
15795 inote
.descdata
= inote
.namedata
;
15799 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
15800 next
= inote
.descdata
+ align_power (inote
.descsz
, 2);
15804 Elf64_External_VMS_Note
*vms_external
;
15806 /* PR binutils/15191
15807 Make sure that there is enough data to read. */
15808 min_notesz
= offsetof (Elf64_External_VMS_Note
, name
);
15809 if (data_remaining
< min_notesz
)
15811 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15812 (int) data_remaining
);
15816 vms_external
= (Elf64_External_VMS_Note
*) external
;
15817 inote
.type
= BYTE_GET (vms_external
->type
);
15818 inote
.namesz
= BYTE_GET (vms_external
->namesz
);
15819 inote
.namedata
= vms_external
->name
;
15820 inote
.descsz
= BYTE_GET (vms_external
->descsz
);
15821 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 3);
15822 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
15823 next
= inote
.descdata
+ align_power (inote
.descsz
, 3);
15826 if (inote
.descdata
< (char *) external
+ min_notesz
15827 || next
< (char *) external
+ min_notesz
15828 /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
15829 || inote
.namedata
+ inote
.namesz
< inote
.namedata
15830 || inote
.descdata
+ inote
.descsz
< inote
.descdata
15831 || data_remaining
< (size_t)(next
- (char *) external
))
15833 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
15834 (unsigned long) ((char *) external
- (char *) pnotes
));
15835 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
15836 inote
.type
, inote
.namesz
, inote
.descsz
);
15840 external
= (Elf_External_Note
*) next
;
15842 /* Verify that name is null terminated. It appears that at least
15843 one version of Linux (RedHat 6.0) generates corefiles that don't
15844 comply with the ELF spec by failing to include the null byte in
15846 if (inote
.namedata
[inote
.namesz
- 1] != '\0')
15848 temp
= (char *) malloc (inote
.namesz
+ 1);
15851 error (_("Out of memory allocating space for inote name\n"));
15856 strncpy (temp
, inote
.namedata
, inote
.namesz
);
15857 temp
[inote
.namesz
] = 0;
15859 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
15860 inote
.namedata
= temp
;
15863 res
&= process_note (& inote
);
15878 process_corefile_note_segments (FILE * file
)
15880 Elf_Internal_Phdr
* segment
;
15884 if (! get_program_headers (file
))
15887 for (i
= 0, segment
= program_headers
;
15888 i
< elf_header
.e_phnum
;
15891 if (segment
->p_type
== PT_NOTE
)
15892 res
&= process_corefile_note_segment (file
,
15893 (bfd_vma
) segment
->p_offset
,
15894 (bfd_vma
) segment
->p_filesz
);
15901 process_v850_notes (FILE * file
, bfd_vma offset
, bfd_vma length
)
15903 Elf_External_Note
* pnotes
;
15904 Elf_External_Note
* external
;
15911 pnotes
= (Elf_External_Note
*) get_data (NULL
, file
, offset
, 1, length
,
15913 if (pnotes
== NULL
)
15917 end
= (char*) pnotes
+ length
;
15919 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
15920 (unsigned long) offset
, (unsigned long) length
);
15922 while ((char *) external
+ sizeof (Elf_External_Note
) < end
)
15924 Elf_External_Note
* next
;
15925 Elf_Internal_Note inote
;
15927 inote
.type
= BYTE_GET (external
->type
);
15928 inote
.namesz
= BYTE_GET (external
->namesz
);
15929 inote
.namedata
= external
->name
;
15930 inote
.descsz
= BYTE_GET (external
->descsz
);
15931 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
15932 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
15934 if (inote
.descdata
< (char *) pnotes
|| inote
.descdata
>= end
)
15936 warn (_("Corrupt note: name size is too big: %lx\n"), inote
.namesz
);
15937 inote
.descdata
= inote
.namedata
;
15941 next
= (Elf_External_Note
*) (inote
.descdata
+ align_power (inote
.descsz
, 2));
15943 if ( ((char *) next
> end
)
15944 || ((char *) next
< (char *) pnotes
))
15946 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
15947 (unsigned long) ((char *) external
- (char *) pnotes
));
15948 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
15949 inote
.type
, inote
.namesz
, inote
.descsz
);
15955 /* Prevent out-of-bounds indexing. */
15956 if ( inote
.namedata
+ inote
.namesz
> end
15957 || inote
.namedata
+ inote
.namesz
< inote
.namedata
)
15959 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
15960 (unsigned long) ((char *) external
- (char *) pnotes
));
15961 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
15962 inote
.type
, inote
.namesz
, inote
.descsz
);
15966 printf (" %s: ", get_v850_elf_note_type (inote
.type
));
15968 if (! print_v850_note (& inote
))
15971 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
15972 inote
.namesz
, inote
.descsz
);
15982 process_note_sections (FILE * file
)
15984 Elf_Internal_Shdr
* section
;
15989 for (i
= 0, section
= section_headers
;
15990 i
< elf_header
.e_shnum
&& section
!= NULL
;
15993 if (section
->sh_type
== SHT_NOTE
)
15995 res
&= process_corefile_note_segment (file
,
15996 (bfd_vma
) section
->sh_offset
,
15997 (bfd_vma
) section
->sh_size
);
16001 if (( elf_header
.e_machine
== EM_V800
16002 || elf_header
.e_machine
== EM_V850
16003 || elf_header
.e_machine
== EM_CYGNUS_V850
)
16004 && section
->sh_type
== SHT_RENESAS_INFO
)
16006 res
&= process_v850_notes (file
,
16007 (bfd_vma
) section
->sh_offset
,
16008 (bfd_vma
) section
->sh_size
);
16014 /* Try processing NOTE segments instead. */
16015 return process_corefile_note_segments (file
);
16021 process_notes (FILE * file
)
16023 /* If we have not been asked to display the notes then do nothing. */
16027 if (elf_header
.e_type
!= ET_CORE
)
16028 return process_note_sections (file
);
16030 /* No program headers means no NOTE segment. */
16031 if (elf_header
.e_phnum
> 0)
16032 return process_corefile_note_segments (file
);
16034 printf (_("No note segments present in the core file.\n"));
16039 process_arch_specific (FILE * file
)
16044 switch (elf_header
.e_machine
)
16047 return process_arm_specific (file
);
16049 case EM_MIPS_RS3_LE
:
16050 return process_mips_specific (file
);
16053 return process_nds32_specific (file
);
16056 return process_power_specific (file
);
16060 return process_s390_specific (file
);
16063 case EM_SPARC32PLUS
:
16065 return process_sparc_specific (file
);
16068 return process_tic6x_specific (file
);
16071 return process_msp430x_specific (file
);
16079 get_file_header (FILE * file
)
16081 /* Read in the identity array. */
16082 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
16085 /* Determine how to read the rest of the header. */
16086 switch (elf_header
.e_ident
[EI_DATA
])
16088 default: /* fall through */
16089 case ELFDATANONE
: /* fall through */
16091 byte_get
= byte_get_little_endian
;
16092 byte_put
= byte_put_little_endian
;
16095 byte_get
= byte_get_big_endian
;
16096 byte_put
= byte_put_big_endian
;
16100 /* For now we only support 32 bit and 64 bit ELF files. */
16101 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
16103 /* Read in the rest of the header. */
16106 Elf32_External_Ehdr ehdr32
;
16108 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
16111 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
16112 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
16113 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
16114 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
16115 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
16116 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
16117 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
16118 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
16119 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
16120 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
16121 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
16122 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
16123 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
16127 Elf64_External_Ehdr ehdr64
;
16129 /* If we have been compiled with sizeof (bfd_vma) == 4, then
16130 we will not be able to cope with the 64bit data found in
16131 64 ELF files. Detect this now and abort before we start
16132 overwriting things. */
16133 if (sizeof (bfd_vma
) < 8)
16135 error (_("This instance of readelf has been built without support for a\n\
16136 64 bit data type and so it cannot read 64 bit ELF files.\n"));
16140 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
16143 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
16144 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
16145 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
16146 elf_header
.e_entry
= BYTE_GET (ehdr64
.e_entry
);
16147 elf_header
.e_phoff
= BYTE_GET (ehdr64
.e_phoff
);
16148 elf_header
.e_shoff
= BYTE_GET (ehdr64
.e_shoff
);
16149 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
16150 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
16151 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
16152 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
16153 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
16154 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
16155 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
16158 if (elf_header
.e_shoff
)
16160 /* There may be some extensions in the first section header. Don't
16161 bomb if we can't read it. */
16163 get_32bit_section_headers (file
, TRUE
);
16165 get_64bit_section_headers (file
, TRUE
);
16171 /* Process one ELF object file according to the command line options.
16172 This file may actually be stored in an archive. The file is
16173 positioned at the start of the ELF object. */
16176 process_object (char * file_name
, FILE * file
)
16180 if (! get_file_header (file
))
16182 error (_("%s: Failed to read file header\n"), file_name
);
16186 /* Initialise per file variables. */
16187 for (i
= ARRAY_SIZE (version_info
); i
--;)
16188 version_info
[i
] = 0;
16190 for (i
= ARRAY_SIZE (dynamic_info
); i
--;)
16191 dynamic_info
[i
] = 0;
16192 dynamic_info_DT_GNU_HASH
= 0;
16194 /* Process the file. */
16196 printf (_("\nFile: %s\n"), file_name
);
16198 /* Initialise the dump_sects array from the cmdline_dump_sects array.
16199 Note we do this even if cmdline_dump_sects is empty because we
16200 must make sure that the dump_sets array is zeroed out before each
16201 object file is processed. */
16202 if (num_dump_sects
> num_cmdline_dump_sects
)
16203 memset (dump_sects
, 0, num_dump_sects
* sizeof (* dump_sects
));
16205 if (num_cmdline_dump_sects
> 0)
16207 if (num_dump_sects
== 0)
16208 /* A sneaky way of allocating the dump_sects array. */
16209 request_dump_bynumber (num_cmdline_dump_sects
, 0);
16211 assert (num_dump_sects
>= num_cmdline_dump_sects
);
16212 memcpy (dump_sects
, cmdline_dump_sects
,
16213 num_cmdline_dump_sects
* sizeof (* dump_sects
));
16216 if (! process_file_header ())
16219 if (! process_section_headers (file
))
16221 /* Without loaded section headers we cannot process lots of
16223 do_unwind
= do_version
= do_dump
= do_arch
= 0;
16225 if (! do_using_dynamic
)
16226 do_syms
= do_dyn_syms
= do_reloc
= 0;
16229 if (! process_section_groups (file
))
16231 /* Without loaded section groups we cannot process unwind. */
16235 if (process_program_headers (file
))
16236 process_dynamic_section (file
);
16238 process_relocs (file
);
16240 process_unwind (file
);
16242 process_symbol_table (file
);
16244 process_syminfo (file
);
16246 process_version_sections (file
);
16248 process_section_contents (file
);
16250 process_notes (file
);
16252 process_gnu_liblist (file
);
16254 process_arch_specific (file
);
16256 if (program_headers
)
16258 free (program_headers
);
16259 program_headers
= NULL
;
16262 if (section_headers
)
16264 free (section_headers
);
16265 section_headers
= NULL
;
16270 free (string_table
);
16271 string_table
= NULL
;
16272 string_table_length
= 0;
16275 if (dynamic_strings
)
16277 free (dynamic_strings
);
16278 dynamic_strings
= NULL
;
16279 dynamic_strings_length
= 0;
16282 if (dynamic_symbols
)
16284 free (dynamic_symbols
);
16285 dynamic_symbols
= NULL
;
16286 num_dynamic_syms
= 0;
16289 if (dynamic_syminfo
)
16291 free (dynamic_syminfo
);
16292 dynamic_syminfo
= NULL
;
16295 if (dynamic_section
)
16297 free (dynamic_section
);
16298 dynamic_section
= NULL
;
16301 if (section_headers_groups
)
16303 free (section_headers_groups
);
16304 section_headers_groups
= NULL
;
16307 if (section_groups
)
16309 struct group_list
* g
;
16310 struct group_list
* next
;
16312 for (i
= 0; i
< group_count
; i
++)
16314 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
16321 free (section_groups
);
16322 section_groups
= NULL
;
16325 free_debug_memory ();
16330 /* Process an ELF archive.
16331 On entry the file is positioned just after the ARMAG string. */
16334 process_archive (char * file_name
, FILE * file
, bfd_boolean is_thin_archive
)
16336 struct archive_info arch
;
16337 struct archive_info nested_arch
;
16343 /* The ARCH structure is used to hold information about this archive. */
16344 arch
.file_name
= NULL
;
16346 arch
.index_array
= NULL
;
16347 arch
.sym_table
= NULL
;
16348 arch
.longnames
= NULL
;
16350 /* The NESTED_ARCH structure is used as a single-item cache of information
16351 about a nested archive (when members of a thin archive reside within
16352 another regular archive file). */
16353 nested_arch
.file_name
= NULL
;
16354 nested_arch
.file
= NULL
;
16355 nested_arch
.index_array
= NULL
;
16356 nested_arch
.sym_table
= NULL
;
16357 nested_arch
.longnames
= NULL
;
16359 if (setup_archive (&arch
, file_name
, file
, is_thin_archive
, do_archive_index
) != 0)
16365 if (do_archive_index
)
16367 if (arch
.sym_table
== NULL
)
16368 error (_("%s: unable to dump the index as none was found\n"), file_name
);
16371 unsigned long i
, l
;
16372 unsigned long current_pos
;
16374 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
16375 file_name
, (unsigned long) arch
.index_num
, arch
.sym_size
);
16376 current_pos
= ftell (file
);
16378 for (i
= l
= 0; i
< arch
.index_num
; i
++)
16380 if ((i
== 0) || ((i
> 0) && (arch
.index_array
[i
] != arch
.index_array
[i
- 1])))
16382 char * member_name
;
16384 member_name
= get_archive_member_name_at (&arch
, arch
.index_array
[i
], &nested_arch
);
16386 if (member_name
!= NULL
)
16388 char * qualified_name
= make_qualified_name (&arch
, &nested_arch
, member_name
);
16390 if (qualified_name
!= NULL
)
16392 printf (_("Contents of binary %s at offset "), qualified_name
);
16393 (void) print_vma (arch
.index_array
[i
], PREFIX_HEX
);
16395 free (qualified_name
);
16400 if (l
>= arch
.sym_size
)
16402 error (_("%s: end of the symbol table reached before the end of the index\n"),
16406 /* PR 17531: file: 0b6630b2. */
16407 printf ("\t%.*s\n", (int) (arch
.sym_size
- l
), arch
.sym_table
+ l
);
16408 l
+= strnlen (arch
.sym_table
+ l
, arch
.sym_size
- l
) + 1;
16411 if (arch
.uses_64bit_indicies
)
16416 if (l
< arch
.sym_size
)
16417 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
16418 file_name
, arch
.sym_size
- l
);
16420 if (fseek (file
, current_pos
, SEEK_SET
) != 0)
16422 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name
);
16428 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
16429 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
16430 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
16431 && !do_section_groups
&& !do_dyn_syms
)
16433 ret
= 0; /* Archive index only. */
16444 char * qualified_name
;
16446 /* Read the next archive header. */
16447 if (fseek (file
, arch
.next_arhdr_offset
, SEEK_SET
) != 0)
16449 error (_("%s: failed to seek to next archive header\n"), file_name
);
16452 got
= fread (&arch
.arhdr
, 1, sizeof arch
.arhdr
, file
);
16453 if (got
!= sizeof arch
.arhdr
)
16457 error (_("%s: failed to read archive header\n"), file_name
);
16461 if (memcmp (arch
.arhdr
.ar_fmag
, ARFMAG
, 2) != 0)
16463 error (_("%s: did not find a valid archive header\n"), arch
.file_name
);
16468 arch
.next_arhdr_offset
+= sizeof arch
.arhdr
;
16470 archive_file_size
= strtoul (arch
.arhdr
.ar_size
, NULL
, 10);
16471 if (archive_file_size
& 01)
16472 ++archive_file_size
;
16474 name
= get_archive_member_name (&arch
, &nested_arch
);
16477 error (_("%s: bad archive file name\n"), file_name
);
16481 namelen
= strlen (name
);
16483 qualified_name
= make_qualified_name (&arch
, &nested_arch
, name
);
16484 if (qualified_name
== NULL
)
16486 error (_("%s: bad archive file name\n"), file_name
);
16491 if (is_thin_archive
&& arch
.nested_member_origin
== 0)
16493 /* This is a proxy for an external member of a thin archive. */
16494 FILE * member_file
;
16495 char * member_file_name
= adjust_relative_path (file_name
, name
, namelen
);
16496 if (member_file_name
== NULL
)
16502 member_file
= fopen (member_file_name
, "rb");
16503 if (member_file
== NULL
)
16505 error (_("Input file '%s' is not readable.\n"), member_file_name
);
16506 free (member_file_name
);
16511 archive_file_offset
= arch
.nested_member_origin
;
16513 ret
|= process_object (qualified_name
, member_file
);
16515 fclose (member_file
);
16516 free (member_file_name
);
16518 else if (is_thin_archive
)
16520 /* PR 15140: Allow for corrupt thin archives. */
16521 if (nested_arch
.file
== NULL
)
16523 error (_("%s: contains corrupt thin archive: %s\n"),
16529 /* This is a proxy for a member of a nested archive. */
16530 archive_file_offset
= arch
.nested_member_origin
+ sizeof arch
.arhdr
;
16532 /* The nested archive file will have been opened and setup by
16533 get_archive_member_name. */
16534 if (fseek (nested_arch
.file
, archive_file_offset
, SEEK_SET
) != 0)
16536 error (_("%s: failed to seek to archive member.\n"), nested_arch
.file_name
);
16541 ret
|= process_object (qualified_name
, nested_arch
.file
);
16545 archive_file_offset
= arch
.next_arhdr_offset
;
16546 arch
.next_arhdr_offset
+= archive_file_size
;
16548 ret
|= process_object (qualified_name
, file
);
16551 if (dump_sects
!= NULL
)
16555 num_dump_sects
= 0;
16558 free (qualified_name
);
16562 if (nested_arch
.file
!= NULL
)
16563 fclose (nested_arch
.file
);
16564 release_archive (&nested_arch
);
16565 release_archive (&arch
);
16571 process_file (char * file_name
)
16574 struct stat statbuf
;
16575 char armag
[SARMAG
];
16578 if (stat (file_name
, &statbuf
) < 0)
16580 if (errno
== ENOENT
)
16581 error (_("'%s': No such file\n"), file_name
);
16583 error (_("Could not locate '%s'. System error message: %s\n"),
16584 file_name
, strerror (errno
));
16588 if (! S_ISREG (statbuf
.st_mode
))
16590 error (_("'%s' is not an ordinary file\n"), file_name
);
16594 file
= fopen (file_name
, "rb");
16597 error (_("Input file '%s' is not readable.\n"), file_name
);
16601 if (fread (armag
, SARMAG
, 1, file
) != 1)
16603 error (_("%s: Failed to read file's magic number\n"), file_name
);
16608 current_file_size
= (bfd_size_type
) statbuf
.st_size
;
16610 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
16611 ret
= process_archive (file_name
, file
, FALSE
);
16612 else if (memcmp (armag
, ARMAGT
, SARMAG
) == 0)
16613 ret
= process_archive (file_name
, file
, TRUE
);
16616 if (do_archive_index
)
16617 error (_("File %s is not an archive so its index cannot be displayed.\n"),
16621 archive_file_size
= archive_file_offset
= 0;
16622 ret
= process_object (file_name
, file
);
16627 current_file_size
= 0;
16631 #ifdef SUPPORT_DISASSEMBLY
16632 /* Needed by the i386 disassembler. For extra credit, someone could
16633 fix this so that we insert symbolic addresses here, esp for GOT/PLT
16637 print_address (unsigned int addr
, FILE * outfile
)
16639 fprintf (outfile
,"0x%8.8x", addr
);
16642 /* Needed by the i386 disassembler. */
16644 db_task_printsym (unsigned int addr
)
16646 print_address (addr
, stderr
);
16651 main (int argc
, char ** argv
)
16655 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
16656 setlocale (LC_MESSAGES
, "");
16658 #if defined (HAVE_SETLOCALE)
16659 setlocale (LC_CTYPE
, "");
16661 bindtextdomain (PACKAGE
, LOCALEDIR
);
16662 textdomain (PACKAGE
);
16664 expandargv (&argc
, &argv
);
16666 parse_args (argc
, argv
);
16668 if (num_dump_sects
> 0)
16670 /* Make a copy of the dump_sects array. */
16671 cmdline_dump_sects
= (dump_type
*)
16672 malloc (num_dump_sects
* sizeof (* dump_sects
));
16673 if (cmdline_dump_sects
== NULL
)
16674 error (_("Out of memory allocating dump request table.\n"));
16677 memcpy (cmdline_dump_sects
, dump_sects
,
16678 num_dump_sects
* sizeof (* dump_sects
));
16679 num_cmdline_dump_sects
= num_dump_sects
;
16683 if (optind
< (argc
- 1))
16685 else if (optind
>= argc
)
16687 warn (_("Nothing to do.\n"));
16692 while (optind
< argc
)
16693 err
|= process_file (argv
[optind
++]);
16695 if (dump_sects
!= NULL
)
16697 if (cmdline_dump_sects
!= NULL
)
16698 free (cmdline_dump_sects
);