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/riscv.h"
128 #include "elf/mmix.h"
129 #include "elf/mn10200.h"
130 #include "elf/mn10300.h"
131 #include "elf/moxie.h"
133 #include "elf/msp430.h"
134 #include "elf/nds32.h"
135 #include "elf/nios2.h"
136 #include "elf/or1k.h"
139 #include "elf/ppc64.h"
140 #include "elf/rl78.h"
142 #include "elf/s390.h"
143 #include "elf/score.h"
145 #include "elf/sparc.h"
147 #include "elf/tic6x.h"
148 #include "elf/tilegx.h"
149 #include "elf/tilepro.h"
150 #include "elf/v850.h"
152 #include "elf/visium.h"
153 #include "elf/x86-64.h"
154 #include "elf/xc16x.h"
155 #include "elf/xgate.h"
156 #include "elf/xstormy16.h"
157 #include "elf/xtensa.h"
160 #include "libiberty.h"
161 #include "safe-ctype.h"
162 #include "filenames.h"
165 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
168 typedef struct elf_section_list
170 Elf_Internal_Shdr
* hdr
;
171 struct elf_section_list
* next
;
174 char * program_name
= "readelf";
175 static unsigned long archive_file_offset
;
176 static unsigned long archive_file_size
;
177 static bfd_size_type current_file_size
;
178 static unsigned long dynamic_addr
;
179 static bfd_size_type dynamic_size
;
180 static size_t dynamic_nent
;
181 static char * dynamic_strings
;
182 static unsigned long dynamic_strings_length
;
183 static char * string_table
;
184 static unsigned long string_table_length
;
185 static unsigned long num_dynamic_syms
;
186 static Elf_Internal_Sym
* dynamic_symbols
;
187 static Elf_Internal_Syminfo
* dynamic_syminfo
;
188 static unsigned long dynamic_syminfo_offset
;
189 static unsigned int dynamic_syminfo_nent
;
190 static char program_interpreter
[PATH_MAX
];
191 static bfd_vma dynamic_info
[DT_ENCODING
];
192 static bfd_vma dynamic_info_DT_GNU_HASH
;
193 static bfd_vma version_info
[16];
194 static Elf_Internal_Ehdr elf_header
;
195 static Elf_Internal_Shdr
* section_headers
;
196 static Elf_Internal_Phdr
* program_headers
;
197 static Elf_Internal_Dyn
* dynamic_section
;
198 static elf_section_list
* symtab_shndx_list
;
199 static int show_name
;
200 static int do_dynamic
;
202 static int do_dyn_syms
;
204 static int do_sections
;
205 static int do_section_groups
;
206 static int do_section_details
;
207 static int do_segments
;
208 static int do_unwind
;
209 static int do_using_dynamic
;
210 static int do_header
;
212 static int do_version
;
213 static int do_histogram
;
214 static int do_debugging
;
217 static int do_archive_index
;
218 static int is_32bit_elf
;
219 static int decompress_dumps
;
223 struct group_list
* next
;
224 unsigned int section_index
;
229 struct group_list
* root
;
230 unsigned int group_index
;
233 static size_t group_count
;
234 static struct group
* section_groups
;
235 static struct group
** section_headers_groups
;
238 /* Flag bits indicating particular types of dump. */
239 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
240 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
241 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
242 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
243 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
245 typedef unsigned char dump_type
;
247 /* A linked list of the section names for which dumps were requested. */
248 struct dump_list_entry
252 struct dump_list_entry
* next
;
254 static struct dump_list_entry
* dump_sects_byname
;
256 /* A dynamic array of flags indicating for which sections a dump
257 has been requested via command line switches. */
258 static dump_type
* cmdline_dump_sects
= NULL
;
259 static unsigned int num_cmdline_dump_sects
= 0;
261 /* A dynamic array of flags indicating for which sections a dump of
262 some kind has been requested. It is reset on a per-object file
263 basis and then initialised from the cmdline_dump_sects array,
264 the results of interpreting the -w switch, and the
265 dump_sects_byname list. */
266 static dump_type
* dump_sects
= NULL
;
267 static unsigned int num_dump_sects
= 0;
270 /* How to print a vma value. */
271 typedef enum print_mode
283 /* Versioned symbol info. */
284 enum versioned_symbol_info
291 static const char *get_symbol_version_string
292 (FILE *file
, int is_dynsym
, const char *strtab
,
293 unsigned long int strtab_size
, unsigned int si
,
294 Elf_Internal_Sym
*psym
, enum versioned_symbol_info
*sym_info
,
295 unsigned short *vna_other
);
299 #define SECTION_NAME(X) \
300 ((X) == NULL ? _("<none>") \
301 : string_table == NULL ? _("<no-name>") \
302 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
303 : string_table + (X)->sh_name))
305 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
307 #define GET_ELF_SYMBOLS(file, section, sym_count) \
308 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
309 : get_64bit_elf_symbols (file, section, sym_count))
311 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
312 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
313 already been called and verified that the string exists. */
314 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
316 #define REMOVE_ARCH_BITS(ADDR) \
319 if (elf_header.e_machine == EM_ARM) \
324 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
325 the offset of the current archive member, if we are examining an archive.
326 Put the retrieved data into VAR, if it is not NULL. Otherwise allocate a buffer
327 using malloc and fill that. In either case return the pointer to the start of
328 the retrieved data or NULL if something went wrong. If something does go wrong
329 and REASON is not NULL then emit an error message using REASON as part of the
333 get_data (void * var
, FILE * file
, unsigned long offset
, bfd_size_type size
,
334 bfd_size_type nmemb
, const char * reason
)
337 bfd_size_type amt
= size
* nmemb
;
339 if (size
== 0 || nmemb
== 0)
342 /* If the size_t type is smaller than the bfd_size_type, eg because
343 you are building a 32-bit tool on a 64-bit host, then make sure
344 that when the sizes are cast to (size_t) no information is lost. */
345 if (sizeof (size_t) < sizeof (bfd_size_type
)
346 && ( (bfd_size_type
) ((size_t) size
) != size
347 || (bfd_size_type
) ((size_t) nmemb
) != nmemb
))
350 error (_("Size truncation prevents reading 0x%" BFD_VMA_FMT
"x"
351 " elements of size 0x%" BFD_VMA_FMT
"x for %s\n"),
352 nmemb
, size
, reason
);
356 /* Check for size overflow. */
360 error (_("Size overflow prevents reading 0x%" BFD_VMA_FMT
"x"
361 " elements of size 0x%" BFD_VMA_FMT
"x for %s\n"),
362 nmemb
, size
, reason
);
366 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
367 attempting to allocate memory when the read is bound to fail. */
368 if (amt
> current_file_size
369 || offset
+ archive_file_offset
+ amt
> current_file_size
)
372 error (_("Reading 0x%" BFD_VMA_FMT
"x"
373 " bytes extends past end of file for %s\n"),
378 if (fseek (file
, archive_file_offset
+ offset
, SEEK_SET
))
381 error (_("Unable to seek to 0x%lx for %s\n"),
382 archive_file_offset
+ offset
, reason
);
389 /* Check for overflow. */
390 if (nmemb
< (~(bfd_size_type
) 0 - 1) / size
)
391 /* + 1 so that we can '\0' terminate invalid string table sections. */
392 mvar
= malloc ((size_t) amt
+ 1);
397 error (_("Out of memory allocating 0x%" BFD_VMA_FMT
"x"
403 ((char *) mvar
)[amt
] = '\0';
406 if (fread (mvar
, (size_t) size
, (size_t) nmemb
, file
) != nmemb
)
409 error (_("Unable to read in 0x%" BFD_VMA_FMT
"x bytes of %s\n"),
419 /* Print a VMA value. */
422 print_vma (bfd_vma vma
, print_mode mode
)
435 return nc
+ printf ("%8.8" BFD_VMA_FMT
"x", vma
);
442 return printf ("%5" BFD_VMA_FMT
"d", vma
);
450 return nc
+ printf ("%" BFD_VMA_FMT
"x", vma
);
453 return printf ("%" BFD_VMA_FMT
"d", vma
);
456 return printf ("%" BFD_VMA_FMT
"u", vma
);
461 /* Display a symbol on stdout. Handles the display of control characters and
462 multibye characters (assuming the host environment supports them).
464 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
466 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
467 padding as necessary.
469 Returns the number of emitted characters. */
472 print_symbol (int width
, const char *symbol
)
474 bfd_boolean extra_padding
= FALSE
;
476 #ifdef HAVE_MBSTATE_T
483 /* Keep the width positive. This also helps. */
485 extra_padding
= TRUE
;
490 /* Set the remaining width to a very large value.
491 This simplifies the code below. */
492 width_remaining
= INT_MAX
;
494 width_remaining
= width
;
496 #ifdef HAVE_MBSTATE_T
497 /* Initialise the multibyte conversion state. */
498 memset (& state
, 0, sizeof (state
));
501 while (width_remaining
)
504 const char c
= *symbol
++;
509 /* Do not print control characters directly as they can affect terminal
510 settings. Such characters usually appear in the names generated
511 by the assembler for local labels. */
514 if (width_remaining
< 2)
517 printf ("^%c", c
+ 0x40);
518 width_remaining
-= 2;
521 else if (ISPRINT (c
))
529 #ifdef HAVE_MBSTATE_T
532 /* Let printf do the hard work of displaying multibyte characters. */
533 printf ("%.1s", symbol
- 1);
537 #ifdef HAVE_MBSTATE_T
538 /* Try to find out how many bytes made up the character that was
539 just printed. Advance the symbol pointer past the bytes that
541 n
= mbrtowc (& w
, symbol
- 1, MB_CUR_MAX
, & state
);
545 if (n
!= (size_t) -1 && n
!= (size_t) -2 && n
> 0)
550 if (extra_padding
&& num_printed
< width
)
552 /* Fill in the remaining spaces. */
553 printf ("%-*s", width
- num_printed
, " ");
560 /* Returns a pointer to a static buffer containing a printable version of
561 the given section's name. Like print_symbol, except that it does not try
562 to print multibyte characters, it just interprets them as hex values. */
565 printable_section_name (const Elf_Internal_Shdr
* sec
)
567 #define MAX_PRINT_SEC_NAME_LEN 128
568 static char sec_name_buf
[MAX_PRINT_SEC_NAME_LEN
+ 1];
569 const char * name
= SECTION_NAME (sec
);
570 char * buf
= sec_name_buf
;
572 unsigned int remaining
= MAX_PRINT_SEC_NAME_LEN
;
574 while ((c
= * name
++) != 0)
585 else if (ISPRINT (c
))
592 static char hex
[17] = "0123456789ABCDEF";
597 * buf
++ = hex
[(c
& 0xf0) >> 4];
598 * buf
++ = hex
[c
& 0x0f];
612 printable_section_name_from_index (unsigned long ndx
)
614 if (ndx
>= elf_header
.e_shnum
)
615 return _("<corrupt>");
617 return printable_section_name (section_headers
+ ndx
);
620 /* Return a pointer to section NAME, or NULL if no such section exists. */
622 static Elf_Internal_Shdr
*
623 find_section (const char * name
)
627 for (i
= 0; i
< elf_header
.e_shnum
; i
++)
628 if (streq (SECTION_NAME (section_headers
+ i
), name
))
629 return section_headers
+ i
;
634 /* Return a pointer to a section containing ADDR, or NULL if no such
637 static Elf_Internal_Shdr
*
638 find_section_by_address (bfd_vma addr
)
642 for (i
= 0; i
< elf_header
.e_shnum
; i
++)
644 Elf_Internal_Shdr
*sec
= section_headers
+ i
;
645 if (addr
>= sec
->sh_addr
&& addr
< sec
->sh_addr
+ sec
->sh_size
)
652 static Elf_Internal_Shdr
*
653 find_section_by_type (unsigned int type
)
657 for (i
= 0; i
< elf_header
.e_shnum
; i
++)
659 Elf_Internal_Shdr
*sec
= section_headers
+ i
;
660 if (sec
->sh_type
== type
)
667 /* Return a pointer to section NAME, or NULL if no such section exists,
668 restricted to the list of sections given in SET. */
670 static Elf_Internal_Shdr
*
671 find_section_in_set (const char * name
, unsigned int * set
)
677 while ((i
= *set
++) > 0)
678 if (streq (SECTION_NAME (section_headers
+ i
), name
))
679 return section_headers
+ i
;
682 return find_section (name
);
685 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
688 static inline unsigned long
689 read_uleb128 (unsigned char *data
,
690 unsigned int *length_return
,
691 const unsigned char * const end
)
693 return read_leb128 (data
, length_return
, FALSE
, end
);
696 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
697 This OS has so many departures from the ELF standard that we test it at
703 return elf_header
.e_machine
== EM_IA_64
704 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_OPENVMS
;
707 /* Guess the relocation size commonly used by the specific machines. */
710 guess_is_rela (unsigned int e_machine
)
714 /* Targets that use REL relocations. */
729 /* Targets that use RELA relocations. */
733 case EM_ADAPTEVA_EPIPHANY
:
735 case EM_ALTERA_NIOS2
:
738 case EM_ARC_COMPACT2
:
758 case EM_LATTICEMICO32
:
767 case EM_CYGNUS_MN10200
:
769 case EM_CYGNUS_MN10300
:
804 case EM_MICROBLAZE_OLD
:
825 warn (_("Don't know about relocations on this machine architecture\n"));
831 slurp_rela_relocs (FILE * file
,
832 unsigned long rel_offset
,
833 unsigned long rel_size
,
834 Elf_Internal_Rela
** relasp
,
835 unsigned long * nrelasp
)
837 Elf_Internal_Rela
* relas
;
843 Elf32_External_Rela
* erelas
;
845 erelas
= (Elf32_External_Rela
*) get_data (NULL
, file
, rel_offset
, 1,
846 rel_size
, _("32-bit relocation data"));
850 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
852 relas
= (Elf_Internal_Rela
*) cmalloc (nrelas
,
853 sizeof (Elf_Internal_Rela
));
858 error (_("out of memory parsing relocs\n"));
862 for (i
= 0; i
< nrelas
; i
++)
864 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
865 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
866 relas
[i
].r_addend
= BYTE_GET_SIGNED (erelas
[i
].r_addend
);
873 Elf64_External_Rela
* erelas
;
875 erelas
= (Elf64_External_Rela
*) get_data (NULL
, file
, rel_offset
, 1,
876 rel_size
, _("64-bit relocation data"));
880 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
882 relas
= (Elf_Internal_Rela
*) cmalloc (nrelas
,
883 sizeof (Elf_Internal_Rela
));
888 error (_("out of memory parsing relocs\n"));
892 for (i
= 0; i
< nrelas
; i
++)
894 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
895 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
896 relas
[i
].r_addend
= BYTE_GET_SIGNED (erelas
[i
].r_addend
);
898 /* The #ifdef BFD64 below is to prevent a compile time
899 warning. We know that if we do not have a 64 bit data
900 type that we will never execute this code anyway. */
902 if (elf_header
.e_machine
== EM_MIPS
903 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
905 /* In little-endian objects, r_info isn't really a
906 64-bit little-endian value: it has a 32-bit
907 little-endian symbol index followed by four
908 individual byte fields. Reorder INFO
910 bfd_vma inf
= relas
[i
].r_info
;
911 inf
= (((inf
& 0xffffffff) << 32)
912 | ((inf
>> 56) & 0xff)
913 | ((inf
>> 40) & 0xff00)
914 | ((inf
>> 24) & 0xff0000)
915 | ((inf
>> 8) & 0xff000000));
916 relas
[i
].r_info
= inf
;
929 slurp_rel_relocs (FILE * file
,
930 unsigned long rel_offset
,
931 unsigned long rel_size
,
932 Elf_Internal_Rela
** relsp
,
933 unsigned long * nrelsp
)
935 Elf_Internal_Rela
* rels
;
941 Elf32_External_Rel
* erels
;
943 erels
= (Elf32_External_Rel
*) get_data (NULL
, file
, rel_offset
, 1,
944 rel_size
, _("32-bit relocation data"));
948 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
950 rels
= (Elf_Internal_Rela
*) cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
955 error (_("out of memory parsing relocs\n"));
959 for (i
= 0; i
< nrels
; i
++)
961 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
962 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
963 rels
[i
].r_addend
= 0;
970 Elf64_External_Rel
* erels
;
972 erels
= (Elf64_External_Rel
*) get_data (NULL
, file
, rel_offset
, 1,
973 rel_size
, _("64-bit relocation data"));
977 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
979 rels
= (Elf_Internal_Rela
*) cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
984 error (_("out of memory parsing relocs\n"));
988 for (i
= 0; i
< nrels
; i
++)
990 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
991 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
992 rels
[i
].r_addend
= 0;
994 /* The #ifdef BFD64 below is to prevent a compile time
995 warning. We know that if we do not have a 64 bit data
996 type that we will never execute this code anyway. */
998 if (elf_header
.e_machine
== EM_MIPS
999 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
1001 /* In little-endian objects, r_info isn't really a
1002 64-bit little-endian value: it has a 32-bit
1003 little-endian symbol index followed by four
1004 individual byte fields. Reorder INFO
1006 bfd_vma inf
= rels
[i
].r_info
;
1007 inf
= (((inf
& 0xffffffff) << 32)
1008 | ((inf
>> 56) & 0xff)
1009 | ((inf
>> 40) & 0xff00)
1010 | ((inf
>> 24) & 0xff0000)
1011 | ((inf
>> 8) & 0xff000000));
1012 rels
[i
].r_info
= inf
;
1024 /* Returns the reloc type extracted from the reloc info field. */
1027 get_reloc_type (bfd_vma reloc_info
)
1030 return ELF32_R_TYPE (reloc_info
);
1032 switch (elf_header
.e_machine
)
1035 /* Note: We assume that reloc_info has already been adjusted for us. */
1036 return ELF64_MIPS_R_TYPE (reloc_info
);
1039 return ELF64_R_TYPE_ID (reloc_info
);
1042 return ELF64_R_TYPE (reloc_info
);
1046 /* Return the symbol index extracted from the reloc info field. */
1049 get_reloc_symindex (bfd_vma reloc_info
)
1051 return is_32bit_elf
? ELF32_R_SYM (reloc_info
) : ELF64_R_SYM (reloc_info
);
1054 static inline bfd_boolean
1055 uses_msp430x_relocs (void)
1058 elf_header
.e_machine
== EM_MSP430
/* Paranoia. */
1059 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1060 && (((elf_header
.e_flags
& EF_MSP430_MACH
) == E_MSP430_MACH_MSP430X
)
1061 /* TI compiler uses ELFOSABI_NONE. */
1062 || (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_NONE
));
1065 /* Display the contents of the relocation data found at the specified
1069 dump_relocations (FILE * file
,
1070 unsigned long rel_offset
,
1071 unsigned long rel_size
,
1072 Elf_Internal_Sym
* symtab
,
1073 unsigned long nsyms
,
1075 unsigned long strtablen
,
1080 Elf_Internal_Rela
* rels
;
1082 if (is_rela
== UNKNOWN
)
1083 is_rela
= guess_is_rela (elf_header
.e_machine
);
1087 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
1092 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
1101 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1103 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1108 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1110 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1118 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
1120 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1125 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1127 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1131 for (i
= 0; i
< rel_size
; i
++)
1136 bfd_vma symtab_index
;
1139 offset
= rels
[i
].r_offset
;
1140 inf
= rels
[i
].r_info
;
1142 type
= get_reloc_type (inf
);
1143 symtab_index
= get_reloc_symindex (inf
);
1147 printf ("%8.8lx %8.8lx ",
1148 (unsigned long) offset
& 0xffffffff,
1149 (unsigned long) inf
& 0xffffffff);
1153 #if BFD_HOST_64BIT_LONG
1155 ? "%16.16lx %16.16lx "
1156 : "%12.12lx %12.12lx ",
1158 #elif BFD_HOST_64BIT_LONG_LONG
1161 ? "%16.16llx %16.16llx "
1162 : "%12.12llx %12.12llx ",
1166 ? "%16.16I64x %16.16I64x "
1167 : "%12.12I64x %12.12I64x ",
1172 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1173 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1174 _bfd_int64_high (offset
),
1175 _bfd_int64_low (offset
),
1176 _bfd_int64_high (inf
),
1177 _bfd_int64_low (inf
));
1181 switch (elf_header
.e_machine
)
1188 rtype
= elf_aarch64_reloc_type (type
);
1192 case EM_CYGNUS_M32R
:
1193 rtype
= elf_m32r_reloc_type (type
);
1198 rtype
= elf_i386_reloc_type (type
);
1203 rtype
= elf_m68hc11_reloc_type (type
);
1207 rtype
= elf_m68k_reloc_type (type
);
1211 rtype
= elf_i960_reloc_type (type
);
1216 rtype
= elf_avr_reloc_type (type
);
1219 case EM_OLD_SPARCV9
:
1220 case EM_SPARC32PLUS
:
1223 rtype
= elf_sparc_reloc_type (type
);
1227 rtype
= elf_spu_reloc_type (type
);
1231 rtype
= v800_reloc_type (type
);
1234 case EM_CYGNUS_V850
:
1235 rtype
= v850_reloc_type (type
);
1239 case EM_CYGNUS_D10V
:
1240 rtype
= elf_d10v_reloc_type (type
);
1244 case EM_CYGNUS_D30V
:
1245 rtype
= elf_d30v_reloc_type (type
);
1249 rtype
= elf_dlx_reloc_type (type
);
1253 rtype
= elf_sh_reloc_type (type
);
1257 case EM_CYGNUS_MN10300
:
1258 rtype
= elf_mn10300_reloc_type (type
);
1262 case EM_CYGNUS_MN10200
:
1263 rtype
= elf_mn10200_reloc_type (type
);
1267 case EM_CYGNUS_FR30
:
1268 rtype
= elf_fr30_reloc_type (type
);
1272 rtype
= elf_frv_reloc_type (type
);
1276 rtype
= elf_ft32_reloc_type (type
);
1280 rtype
= elf_mcore_reloc_type (type
);
1284 rtype
= elf_mmix_reloc_type (type
);
1288 rtype
= elf_moxie_reloc_type (type
);
1292 if (uses_msp430x_relocs ())
1294 rtype
= elf_msp430x_reloc_type (type
);
1299 rtype
= elf_msp430_reloc_type (type
);
1303 rtype
= elf_nds32_reloc_type (type
);
1307 rtype
= elf_ppc_reloc_type (type
);
1311 rtype
= elf_ppc64_reloc_type (type
);
1315 case EM_MIPS_RS3_LE
:
1316 rtype
= elf_mips_reloc_type (type
);
1320 rtype
= elf_riscv_reloc_type (type
);
1324 rtype
= elf_alpha_reloc_type (type
);
1328 rtype
= elf_arm_reloc_type (type
);
1332 case EM_ARC_COMPACT
:
1333 case EM_ARC_COMPACT2
:
1334 rtype
= elf_arc_reloc_type (type
);
1338 rtype
= elf_hppa_reloc_type (type
);
1344 rtype
= elf_h8_reloc_type (type
);
1348 rtype
= elf_or1k_reloc_type (type
);
1353 rtype
= elf_pj_reloc_type (type
);
1356 rtype
= elf_ia64_reloc_type (type
);
1360 rtype
= elf_cris_reloc_type (type
);
1364 rtype
= elf_i860_reloc_type (type
);
1370 rtype
= elf_x86_64_reloc_type (type
);
1374 rtype
= i370_reloc_type (type
);
1379 rtype
= elf_s390_reloc_type (type
);
1383 rtype
= elf_score_reloc_type (type
);
1387 rtype
= elf_xstormy16_reloc_type (type
);
1391 rtype
= elf_crx_reloc_type (type
);
1395 rtype
= elf_vax_reloc_type (type
);
1399 rtype
= elf_visium_reloc_type (type
);
1402 case EM_ADAPTEVA_EPIPHANY
:
1403 rtype
= elf_epiphany_reloc_type (type
);
1408 rtype
= elf_ip2k_reloc_type (type
);
1412 rtype
= elf_iq2000_reloc_type (type
);
1417 rtype
= elf_xtensa_reloc_type (type
);
1420 case EM_LATTICEMICO32
:
1421 rtype
= elf_lm32_reloc_type (type
);
1426 rtype
= elf_m32c_reloc_type (type
);
1430 rtype
= elf_mt_reloc_type (type
);
1434 rtype
= elf_bfin_reloc_type (type
);
1438 rtype
= elf_mep_reloc_type (type
);
1442 rtype
= elf_cr16_reloc_type (type
);
1446 case EM_MICROBLAZE_OLD
:
1447 rtype
= elf_microblaze_reloc_type (type
);
1451 rtype
= elf_rl78_reloc_type (type
);
1455 rtype
= elf_rx_reloc_type (type
);
1459 rtype
= elf_metag_reloc_type (type
);
1464 rtype
= elf_xc16x_reloc_type (type
);
1468 rtype
= elf_tic6x_reloc_type (type
);
1472 rtype
= elf_tilegx_reloc_type (type
);
1476 rtype
= elf_tilepro_reloc_type (type
);
1480 rtype
= elf_xgate_reloc_type (type
);
1483 case EM_ALTERA_NIOS2
:
1484 rtype
= elf_nios2_reloc_type (type
);
1489 printf (_("unrecognized: %-7lx"), (unsigned long) type
& 0xffffffff);
1491 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1493 if (elf_header
.e_machine
== EM_ALPHA
1495 && streq (rtype
, "R_ALPHA_LITUSE")
1498 switch (rels
[i
].r_addend
)
1500 case LITUSE_ALPHA_ADDR
: rtype
= "ADDR"; break;
1501 case LITUSE_ALPHA_BASE
: rtype
= "BASE"; break;
1502 case LITUSE_ALPHA_BYTOFF
: rtype
= "BYTOFF"; break;
1503 case LITUSE_ALPHA_JSR
: rtype
= "JSR"; break;
1504 case LITUSE_ALPHA_TLSGD
: rtype
= "TLSGD"; break;
1505 case LITUSE_ALPHA_TLSLDM
: rtype
= "TLSLDM"; break;
1506 case LITUSE_ALPHA_JSRDIRECT
: rtype
= "JSRDIRECT"; break;
1507 default: rtype
= NULL
;
1510 printf (" (%s)", rtype
);
1514 printf (_("<unknown addend: %lx>"),
1515 (unsigned long) rels
[i
].r_addend
);
1518 else if (symtab_index
)
1520 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1521 printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index
);
1524 Elf_Internal_Sym
* psym
;
1525 const char * version_string
;
1526 enum versioned_symbol_info sym_info
;
1527 unsigned short vna_other
;
1529 psym
= symtab
+ symtab_index
;
1532 = get_symbol_version_string (file
, is_dynsym
,
1541 if (ELF_ST_TYPE (psym
->st_info
) == STT_GNU_IFUNC
)
1545 unsigned int width
= is_32bit_elf
? 8 : 14;
1547 /* Relocations against GNU_IFUNC symbols do not use the value
1548 of the symbol as the address to relocate against. Instead
1549 they invoke the function named by the symbol and use its
1550 result as the address for relocation.
1552 To indicate this to the user, do not display the value of
1553 the symbol in the "Symbols's Value" field. Instead show
1554 its name followed by () as a hint that the symbol is
1558 || psym
->st_name
== 0
1559 || psym
->st_name
>= strtablen
)
1562 name
= strtab
+ psym
->st_name
;
1564 len
= print_symbol (width
, name
);
1566 printf (sym_info
== symbol_public
? "@@%s" : "@%s",
1568 printf ("()%-*s", len
<= width
? (width
+ 1) - len
: 1, " ");
1572 print_vma (psym
->st_value
, LONG_HEX
);
1574 printf (is_32bit_elf
? " " : " ");
1577 if (psym
->st_name
== 0)
1579 const char * sec_name
= "<null>";
1582 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1584 if (psym
->st_shndx
< elf_header
.e_shnum
)
1585 sec_name
= SECTION_NAME (section_headers
+ psym
->st_shndx
);
1586 else if (psym
->st_shndx
== SHN_ABS
)
1588 else if (psym
->st_shndx
== SHN_COMMON
)
1589 sec_name
= "COMMON";
1590 else if ((elf_header
.e_machine
== EM_MIPS
1591 && psym
->st_shndx
== SHN_MIPS_SCOMMON
)
1592 || (elf_header
.e_machine
== EM_TI_C6000
1593 && psym
->st_shndx
== SHN_TIC6X_SCOMMON
))
1594 sec_name
= "SCOMMON";
1595 else if (elf_header
.e_machine
== EM_MIPS
1596 && psym
->st_shndx
== SHN_MIPS_SUNDEFINED
)
1597 sec_name
= "SUNDEF";
1598 else if ((elf_header
.e_machine
== EM_X86_64
1599 || elf_header
.e_machine
== EM_L1OM
1600 || elf_header
.e_machine
== EM_K1OM
)
1601 && psym
->st_shndx
== SHN_X86_64_LCOMMON
)
1602 sec_name
= "LARGE_COMMON";
1603 else if (elf_header
.e_machine
== EM_IA_64
1604 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1605 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1606 sec_name
= "ANSI_COM";
1607 else if (is_ia64_vms ()
1608 && psym
->st_shndx
== SHN_IA_64_VMS_SYMVEC
)
1609 sec_name
= "VMS_SYMVEC";
1612 sprintf (name_buf
, "<section 0x%x>",
1613 (unsigned int) psym
->st_shndx
);
1614 sec_name
= name_buf
;
1617 print_symbol (22, sec_name
);
1619 else if (strtab
== NULL
)
1620 printf (_("<string table index: %3ld>"), psym
->st_name
);
1621 else if (psym
->st_name
>= strtablen
)
1622 printf (_("<corrupt string table index: %3ld>"), psym
->st_name
);
1625 print_symbol (22, strtab
+ psym
->st_name
);
1627 printf (sym_info
== symbol_public
? "@@%s" : "@%s",
1633 bfd_vma off
= rels
[i
].r_addend
;
1635 if ((bfd_signed_vma
) off
< 0)
1636 printf (" - %" BFD_VMA_FMT
"x", - off
);
1638 printf (" + %" BFD_VMA_FMT
"x", off
);
1644 bfd_vma off
= rels
[i
].r_addend
;
1646 printf ("%*c", is_32bit_elf
? 12 : 20, ' ');
1647 if ((bfd_signed_vma
) off
< 0)
1648 printf ("-%" BFD_VMA_FMT
"x", - off
);
1650 printf ("%" BFD_VMA_FMT
"x", off
);
1653 if (elf_header
.e_machine
== EM_SPARCV9
1655 && streq (rtype
, "R_SPARC_OLO10"))
1656 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf
));
1661 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1663 bfd_vma type2
= ELF64_MIPS_R_TYPE2 (inf
);
1664 bfd_vma type3
= ELF64_MIPS_R_TYPE3 (inf
);
1665 const char * rtype2
= elf_mips_reloc_type (type2
);
1666 const char * rtype3
= elf_mips_reloc_type (type3
);
1668 printf (" Type2: ");
1671 printf (_("unrecognized: %-7lx"),
1672 (unsigned long) type2
& 0xffffffff);
1674 printf ("%-17.17s", rtype2
);
1676 printf ("\n Type3: ");
1679 printf (_("unrecognized: %-7lx"),
1680 (unsigned long) type3
& 0xffffffff);
1682 printf ("%-17.17s", rtype3
);
1693 get_mips_dynamic_type (unsigned long type
)
1697 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1698 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1699 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1700 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1701 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1702 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1703 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1704 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1705 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1706 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1707 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1708 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1709 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1710 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1711 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1712 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1713 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1714 case DT_MIPS_RLD_MAP_REL
: return "MIPS_RLD_MAP_REL";
1715 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1716 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1717 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1718 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1719 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1720 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1721 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1722 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1723 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1724 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1725 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1726 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1727 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1728 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1729 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1730 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1731 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1732 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1733 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1734 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1735 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1736 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1737 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1738 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1739 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1740 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1741 case DT_MIPS_PLTGOT
: return "MIPS_PLTGOT";
1742 case DT_MIPS_RWPLT
: return "MIPS_RWPLT";
1749 get_sparc64_dynamic_type (unsigned long type
)
1753 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1760 get_ppc_dynamic_type (unsigned long type
)
1764 case DT_PPC_GOT
: return "PPC_GOT";
1765 case DT_PPC_OPT
: return "PPC_OPT";
1772 get_ppc64_dynamic_type (unsigned long type
)
1776 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1777 case DT_PPC64_OPD
: return "PPC64_OPD";
1778 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1779 case DT_PPC64_OPT
: return "PPC64_OPT";
1786 get_parisc_dynamic_type (unsigned long type
)
1790 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1791 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1792 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1793 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1794 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1795 case DT_HP_PREINIT
: return "HP_PREINIT";
1796 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1797 case DT_HP_NEEDED
: return "HP_NEEDED";
1798 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1799 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1800 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1801 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1802 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1803 case DT_HP_EPLTREL
: return "HP_GST_EPLTREL";
1804 case DT_HP_EPLTRELSZ
: return "HP_GST_EPLTRELSZ";
1805 case DT_HP_FILTERED
: return "HP_FILTERED";
1806 case DT_HP_FILTER_TLS
: return "HP_FILTER_TLS";
1807 case DT_HP_COMPAT_FILTERED
: return "HP_COMPAT_FILTERED";
1808 case DT_HP_LAZYLOAD
: return "HP_LAZYLOAD";
1809 case DT_HP_BIND_NOW_COUNT
: return "HP_BIND_NOW_COUNT";
1810 case DT_PLT
: return "PLT";
1811 case DT_PLT_SIZE
: return "PLT_SIZE";
1812 case DT_DLT
: return "DLT";
1813 case DT_DLT_SIZE
: return "DLT_SIZE";
1820 get_ia64_dynamic_type (unsigned long type
)
1824 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1825 case DT_IA_64_VMS_SUBTYPE
: return "VMS_SUBTYPE";
1826 case DT_IA_64_VMS_IMGIOCNT
: return "VMS_IMGIOCNT";
1827 case DT_IA_64_VMS_LNKFLAGS
: return "VMS_LNKFLAGS";
1828 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ
: return "VMS_VIR_MEM_BLK_SIZ";
1829 case DT_IA_64_VMS_IDENT
: return "VMS_IDENT";
1830 case DT_IA_64_VMS_NEEDED_IDENT
: return "VMS_NEEDED_IDENT";
1831 case DT_IA_64_VMS_IMG_RELA_CNT
: return "VMS_IMG_RELA_CNT";
1832 case DT_IA_64_VMS_SEG_RELA_CNT
: return "VMS_SEG_RELA_CNT";
1833 case DT_IA_64_VMS_FIXUP_RELA_CNT
: return "VMS_FIXUP_RELA_CNT";
1834 case DT_IA_64_VMS_FIXUP_NEEDED
: return "VMS_FIXUP_NEEDED";
1835 case DT_IA_64_VMS_SYMVEC_CNT
: return "VMS_SYMVEC_CNT";
1836 case DT_IA_64_VMS_XLATED
: return "VMS_XLATED";
1837 case DT_IA_64_VMS_STACKSIZE
: return "VMS_STACKSIZE";
1838 case DT_IA_64_VMS_UNWINDSZ
: return "VMS_UNWINDSZ";
1839 case DT_IA_64_VMS_UNWIND_CODSEG
: return "VMS_UNWIND_CODSEG";
1840 case DT_IA_64_VMS_UNWIND_INFOSEG
: return "VMS_UNWIND_INFOSEG";
1841 case DT_IA_64_VMS_LINKTIME
: return "VMS_LINKTIME";
1842 case DT_IA_64_VMS_SEG_NO
: return "VMS_SEG_NO";
1843 case DT_IA_64_VMS_SYMVEC_OFFSET
: return "VMS_SYMVEC_OFFSET";
1844 case DT_IA_64_VMS_SYMVEC_SEG
: return "VMS_SYMVEC_SEG";
1845 case DT_IA_64_VMS_UNWIND_OFFSET
: return "VMS_UNWIND_OFFSET";
1846 case DT_IA_64_VMS_UNWIND_SEG
: return "VMS_UNWIND_SEG";
1847 case DT_IA_64_VMS_STRTAB_OFFSET
: return "VMS_STRTAB_OFFSET";
1848 case DT_IA_64_VMS_SYSVER_OFFSET
: return "VMS_SYSVER_OFFSET";
1849 case DT_IA_64_VMS_IMG_RELA_OFF
: return "VMS_IMG_RELA_OFF";
1850 case DT_IA_64_VMS_SEG_RELA_OFF
: return "VMS_SEG_RELA_OFF";
1851 case DT_IA_64_VMS_FIXUP_RELA_OFF
: return "VMS_FIXUP_RELA_OFF";
1852 case DT_IA_64_VMS_PLTGOT_OFFSET
: return "VMS_PLTGOT_OFFSET";
1853 case DT_IA_64_VMS_PLTGOT_SEG
: return "VMS_PLTGOT_SEG";
1854 case DT_IA_64_VMS_FPMODE
: return "VMS_FPMODE";
1861 get_solaris_section_type (unsigned long type
)
1865 case 0x6fffffee: return "SUNW_ancillary";
1866 case 0x6fffffef: return "SUNW_capchain";
1867 case 0x6ffffff0: return "SUNW_capinfo";
1868 case 0x6ffffff1: return "SUNW_symsort";
1869 case 0x6ffffff2: return "SUNW_tlssort";
1870 case 0x6ffffff3: return "SUNW_LDYNSYM";
1871 case 0x6ffffff4: return "SUNW_dof";
1872 case 0x6ffffff5: return "SUNW_cap";
1873 case 0x6ffffff6: return "SUNW_SIGNATURE";
1874 case 0x6ffffff7: return "SUNW_ANNOTATE";
1875 case 0x6ffffff8: return "SUNW_DEBUGSTR";
1876 case 0x6ffffff9: return "SUNW_DEBUG";
1877 case 0x6ffffffa: return "SUNW_move";
1878 case 0x6ffffffb: return "SUNW_COMDAT";
1879 case 0x6ffffffc: return "SUNW_syminfo";
1880 case 0x6ffffffd: return "SUNW_verdef";
1881 case 0x6ffffffe: return "SUNW_verneed";
1882 case 0x6fffffff: return "SUNW_versym";
1883 case 0x70000000: return "SPARC_GOTDATA";
1884 default: return NULL
;
1889 get_alpha_dynamic_type (unsigned long type
)
1893 case DT_ALPHA_PLTRO
: return "ALPHA_PLTRO";
1900 get_score_dynamic_type (unsigned long type
)
1904 case DT_SCORE_BASE_ADDRESS
: return "SCORE_BASE_ADDRESS";
1905 case DT_SCORE_LOCAL_GOTNO
: return "SCORE_LOCAL_GOTNO";
1906 case DT_SCORE_SYMTABNO
: return "SCORE_SYMTABNO";
1907 case DT_SCORE_GOTSYM
: return "SCORE_GOTSYM";
1908 case DT_SCORE_UNREFEXTNO
: return "SCORE_UNREFEXTNO";
1909 case DT_SCORE_HIPAGENO
: return "SCORE_HIPAGENO";
1916 get_tic6x_dynamic_type (unsigned long type
)
1920 case DT_C6000_GSYM_OFFSET
: return "C6000_GSYM_OFFSET";
1921 case DT_C6000_GSTR_OFFSET
: return "C6000_GSTR_OFFSET";
1922 case DT_C6000_DSBT_BASE
: return "C6000_DSBT_BASE";
1923 case DT_C6000_DSBT_SIZE
: return "C6000_DSBT_SIZE";
1924 case DT_C6000_PREEMPTMAP
: return "C6000_PREEMPTMAP";
1925 case DT_C6000_DSBT_INDEX
: return "C6000_DSBT_INDEX";
1932 get_nios2_dynamic_type (unsigned long type
)
1936 case DT_NIOS2_GP
: return "NIOS2_GP";
1943 get_solaris_dynamic_type (unsigned long type
)
1947 case 0x6000000d: return "SUNW_AUXILIARY";
1948 case 0x6000000e: return "SUNW_RTLDINF";
1949 case 0x6000000f: return "SUNW_FILTER";
1950 case 0x60000010: return "SUNW_CAP";
1951 case 0x60000011: return "SUNW_SYMTAB";
1952 case 0x60000012: return "SUNW_SYMSZ";
1953 case 0x60000013: return "SUNW_SORTENT";
1954 case 0x60000014: return "SUNW_SYMSORT";
1955 case 0x60000015: return "SUNW_SYMSORTSZ";
1956 case 0x60000016: return "SUNW_TLSSORT";
1957 case 0x60000017: return "SUNW_TLSSORTSZ";
1958 case 0x60000018: return "SUNW_CAPINFO";
1959 case 0x60000019: return "SUNW_STRPAD";
1960 case 0x6000001a: return "SUNW_CAPCHAIN";
1961 case 0x6000001b: return "SUNW_LDMACH";
1962 case 0x6000001d: return "SUNW_CAPCHAINENT";
1963 case 0x6000001f: return "SUNW_CAPCHAINSZ";
1964 case 0x60000021: return "SUNW_PARENT";
1965 case 0x60000023: return "SUNW_ASLR";
1966 case 0x60000025: return "SUNW_RELAX";
1967 case 0x60000029: return "SUNW_NXHEAP";
1968 case 0x6000002b: return "SUNW_NXSTACK";
1970 case 0x70000001: return "SPARC_REGISTER";
1971 case 0x7ffffffd: return "AUXILIARY";
1972 case 0x7ffffffe: return "USED";
1973 case 0x7fffffff: return "FILTER";
1975 default: return NULL
;
1980 get_dynamic_type (unsigned long type
)
1982 static char buff
[64];
1986 case DT_NULL
: return "NULL";
1987 case DT_NEEDED
: return "NEEDED";
1988 case DT_PLTRELSZ
: return "PLTRELSZ";
1989 case DT_PLTGOT
: return "PLTGOT";
1990 case DT_HASH
: return "HASH";
1991 case DT_STRTAB
: return "STRTAB";
1992 case DT_SYMTAB
: return "SYMTAB";
1993 case DT_RELA
: return "RELA";
1994 case DT_RELASZ
: return "RELASZ";
1995 case DT_RELAENT
: return "RELAENT";
1996 case DT_STRSZ
: return "STRSZ";
1997 case DT_SYMENT
: return "SYMENT";
1998 case DT_INIT
: return "INIT";
1999 case DT_FINI
: return "FINI";
2000 case DT_SONAME
: return "SONAME";
2001 case DT_RPATH
: return "RPATH";
2002 case DT_SYMBOLIC
: return "SYMBOLIC";
2003 case DT_REL
: return "REL";
2004 case DT_RELSZ
: return "RELSZ";
2005 case DT_RELENT
: return "RELENT";
2006 case DT_PLTREL
: return "PLTREL";
2007 case DT_DEBUG
: return "DEBUG";
2008 case DT_TEXTREL
: return "TEXTREL";
2009 case DT_JMPREL
: return "JMPREL";
2010 case DT_BIND_NOW
: return "BIND_NOW";
2011 case DT_INIT_ARRAY
: return "INIT_ARRAY";
2012 case DT_FINI_ARRAY
: return "FINI_ARRAY";
2013 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
2014 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
2015 case DT_RUNPATH
: return "RUNPATH";
2016 case DT_FLAGS
: return "FLAGS";
2018 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2019 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
2020 case DT_SYMTAB_SHNDX
: return "SYMTAB_SHNDX";
2022 case DT_CHECKSUM
: return "CHECKSUM";
2023 case DT_PLTPADSZ
: return "PLTPADSZ";
2024 case DT_MOVEENT
: return "MOVEENT";
2025 case DT_MOVESZ
: return "MOVESZ";
2026 case DT_FEATURE
: return "FEATURE";
2027 case DT_POSFLAG_1
: return "POSFLAG_1";
2028 case DT_SYMINSZ
: return "SYMINSZ";
2029 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
2031 case DT_ADDRRNGLO
: return "ADDRRNGLO";
2032 case DT_CONFIG
: return "CONFIG";
2033 case DT_DEPAUDIT
: return "DEPAUDIT";
2034 case DT_AUDIT
: return "AUDIT";
2035 case DT_PLTPAD
: return "PLTPAD";
2036 case DT_MOVETAB
: return "MOVETAB";
2037 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
2039 case DT_VERSYM
: return "VERSYM";
2041 case DT_TLSDESC_GOT
: return "TLSDESC_GOT";
2042 case DT_TLSDESC_PLT
: return "TLSDESC_PLT";
2043 case DT_RELACOUNT
: return "RELACOUNT";
2044 case DT_RELCOUNT
: return "RELCOUNT";
2045 case DT_FLAGS_1
: return "FLAGS_1";
2046 case DT_VERDEF
: return "VERDEF";
2047 case DT_VERDEFNUM
: return "VERDEFNUM";
2048 case DT_VERNEED
: return "VERNEED";
2049 case DT_VERNEEDNUM
: return "VERNEEDNUM";
2051 case DT_AUXILIARY
: return "AUXILIARY";
2052 case DT_USED
: return "USED";
2053 case DT_FILTER
: return "FILTER";
2055 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
2056 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
2057 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
2058 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
2059 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
2060 case DT_GNU_HASH
: return "GNU_HASH";
2063 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
2065 const char * result
;
2067 switch (elf_header
.e_machine
)
2070 case EM_MIPS_RS3_LE
:
2071 result
= get_mips_dynamic_type (type
);
2074 result
= get_sparc64_dynamic_type (type
);
2077 result
= get_ppc_dynamic_type (type
);
2080 result
= get_ppc64_dynamic_type (type
);
2083 result
= get_ia64_dynamic_type (type
);
2086 result
= get_alpha_dynamic_type (type
);
2089 result
= get_score_dynamic_type (type
);
2092 result
= get_tic6x_dynamic_type (type
);
2094 case EM_ALTERA_NIOS2
:
2095 result
= get_nios2_dynamic_type (type
);
2098 if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_SOLARIS
)
2099 result
= get_solaris_dynamic_type (type
);
2108 snprintf (buff
, sizeof (buff
), _("Processor Specific: %lx"), type
);
2110 else if (((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
2111 || (elf_header
.e_machine
== EM_PARISC
2112 && (type
>= OLD_DT_LOOS
) && (type
<= OLD_DT_HIOS
)))
2114 const char * result
;
2116 switch (elf_header
.e_machine
)
2119 result
= get_parisc_dynamic_type (type
);
2122 result
= get_ia64_dynamic_type (type
);
2125 if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_SOLARIS
)
2126 result
= get_solaris_dynamic_type (type
);
2135 snprintf (buff
, sizeof (buff
), _("Operating System specific: %lx"),
2139 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), type
);
2146 get_file_type (unsigned e_type
)
2148 static char buff
[32];
2152 case ET_NONE
: return _("NONE (None)");
2153 case ET_REL
: return _("REL (Relocatable file)");
2154 case ET_EXEC
: return _("EXEC (Executable file)");
2155 case ET_DYN
: return _("DYN (Shared object file)");
2156 case ET_CORE
: return _("CORE (Core file)");
2159 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
2160 snprintf (buff
, sizeof (buff
), _("Processor Specific: (%x)"), e_type
);
2161 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
2162 snprintf (buff
, sizeof (buff
), _("OS Specific: (%x)"), e_type
);
2164 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_type
);
2170 get_machine_name (unsigned e_machine
)
2172 static char buff
[64]; /* XXX */
2176 case EM_NONE
: return _("None");
2177 case EM_AARCH64
: return "AArch64";
2178 case EM_M32
: return "WE32100";
2179 case EM_SPARC
: return "Sparc";
2180 case EM_SPU
: return "SPU";
2181 case EM_386
: return "Intel 80386";
2182 case EM_68K
: return "MC68000";
2183 case EM_88K
: return "MC88000";
2184 case EM_IAMCU
: return "Intel MCU";
2185 case EM_860
: return "Intel 80860";
2186 case EM_MIPS
: return "MIPS R3000";
2187 case EM_S370
: return "IBM System/370";
2188 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
2189 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
2190 case EM_PARISC
: return "HPPA";
2191 case EM_PPC_OLD
: return "Power PC (old)";
2192 case EM_SPARC32PLUS
: return "Sparc v8+" ;
2193 case EM_960
: return "Intel 90860";
2194 case EM_PPC
: return "PowerPC";
2195 case EM_PPC64
: return "PowerPC64";
2196 case EM_FR20
: return "Fujitsu FR20";
2197 case EM_FT32
: return "FTDI FT32";
2198 case EM_RH32
: return "TRW RH32";
2199 case EM_MCORE
: return "MCORE";
2200 case EM_ARM
: return "ARM";
2201 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
2202 case EM_SH
: return "Renesas / SuperH SH";
2203 case EM_SPARCV9
: return "Sparc v9";
2204 case EM_TRICORE
: return "Siemens Tricore";
2205 case EM_ARC
: return "ARC";
2206 case EM_ARC_COMPACT
: return "ARCompact";
2207 case EM_ARC_COMPACT2
: return "ARCv2";
2208 case EM_H8_300
: return "Renesas H8/300";
2209 case EM_H8_300H
: return "Renesas H8/300H";
2210 case EM_H8S
: return "Renesas H8S";
2211 case EM_H8_500
: return "Renesas H8/500";
2212 case EM_IA_64
: return "Intel IA-64";
2213 case EM_MIPS_X
: return "Stanford MIPS-X";
2214 case EM_COLDFIRE
: return "Motorola Coldfire";
2215 case EM_ALPHA
: return "Alpha";
2216 case EM_CYGNUS_D10V
:
2217 case EM_D10V
: return "d10v";
2218 case EM_CYGNUS_D30V
:
2219 case EM_D30V
: return "d30v";
2220 case EM_CYGNUS_M32R
:
2221 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
2222 case EM_CYGNUS_V850
:
2223 case EM_V800
: return "Renesas V850 (using RH850 ABI)";
2224 case EM_V850
: return "Renesas V850";
2225 case EM_CYGNUS_MN10300
:
2226 case EM_MN10300
: return "mn10300";
2227 case EM_CYGNUS_MN10200
:
2228 case EM_MN10200
: return "mn10200";
2229 case EM_MOXIE
: return "Moxie";
2230 case EM_CYGNUS_FR30
:
2231 case EM_FR30
: return "Fujitsu FR30";
2232 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
2234 case EM_PJ
: return "picoJava";
2235 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
2236 case EM_PCP
: return "Siemens PCP";
2237 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
2238 case EM_NDR1
: return "Denso NDR1 microprocesspr";
2239 case EM_STARCORE
: return "Motorola Star*Core processor";
2240 case EM_ME16
: return "Toyota ME16 processor";
2241 case EM_ST100
: return "STMicroelectronics ST100 processor";
2242 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
2243 case EM_PDSP
: return "Sony DSP processor";
2244 case EM_PDP10
: return "Digital Equipment Corp. PDP-10";
2245 case EM_PDP11
: return "Digital Equipment Corp. PDP-11";
2246 case EM_FX66
: return "Siemens FX66 microcontroller";
2247 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2248 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
2249 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
2250 case EM_68HC12
: return "Motorola MC68HC12 Microcontroller";
2251 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
2252 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
2253 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
2254 case EM_SVX
: return "Silicon Graphics SVx";
2255 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
2256 case EM_VAX
: return "Digital VAX";
2257 case EM_VISIUM
: return "CDS VISIUMcore processor";
2259 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
2260 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
2261 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
2262 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
2263 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
2264 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
2265 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
2266 case EM_PRISM
: return "Vitesse Prism";
2267 case EM_X86_64
: return "Advanced Micro Devices X86-64";
2268 case EM_L1OM
: return "Intel L1OM";
2269 case EM_K1OM
: return "Intel K1OM";
2271 case EM_S390
: return "IBM S/390";
2272 case EM_SCORE
: return "SUNPLUS S+Core";
2273 case EM_XSTORMY16
: return "Sanyo XStormy16 CPU core";
2274 case EM_OR1K
: return "OpenRISC 1000";
2275 case EM_CRX
: return "National Semiconductor CRX microprocessor";
2276 case EM_ADAPTEVA_EPIPHANY
: return "Adapteva EPIPHANY";
2277 case EM_DLX
: return "OpenDLX";
2279 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
2280 case EM_IQ2000
: return "Vitesse IQ2000";
2282 case EM_XTENSA
: return "Tensilica Xtensa Processor";
2283 case EM_VIDEOCORE
: return "Alphamosaic VideoCore processor";
2284 case EM_TMM_GPP
: return "Thompson Multimedia General Purpose Processor";
2285 case EM_NS32K
: return "National Semiconductor 32000 series";
2286 case EM_TPC
: return "Tenor Network TPC processor";
2287 case EM_ST200
: return "STMicroelectronics ST200 microcontroller";
2288 case EM_MAX
: return "MAX Processor";
2289 case EM_CR
: return "National Semiconductor CompactRISC";
2290 case EM_F2MC16
: return "Fujitsu F2MC16";
2291 case EM_MSP430
: return "Texas Instruments msp430 microcontroller";
2292 case EM_LATTICEMICO32
: return "Lattice Mico32";
2294 case EM_M32C
: return "Renesas M32c";
2295 case EM_MT
: return "Morpho Techologies MT processor";
2296 case EM_BLACKFIN
: return "Analog Devices Blackfin";
2297 case EM_SE_C33
: return "S1C33 Family of Seiko Epson processors";
2298 case EM_SEP
: return "Sharp embedded microprocessor";
2299 case EM_ARCA
: return "Arca RISC microprocessor";
2300 case EM_UNICORE
: return "Unicore";
2301 case EM_EXCESS
: return "eXcess 16/32/64-bit configurable embedded CPU";
2302 case EM_DXP
: return "Icera Semiconductor Inc. Deep Execution Processor";
2303 case EM_NIOS32
: return "Altera Nios";
2304 case EM_ALTERA_NIOS2
: return "Altera Nios II";
2306 case EM_XC16X
: return "Infineon Technologies xc16x";
2307 case EM_M16C
: return "Renesas M16C series microprocessors";
2308 case EM_DSPIC30F
: return "Microchip Technology dsPIC30F Digital Signal Controller";
2309 case EM_CE
: return "Freescale Communication Engine RISC core";
2310 case EM_TSK3000
: return "Altium TSK3000 core";
2311 case EM_RS08
: return "Freescale RS08 embedded processor";
2312 case EM_ECOG2
: return "Cyan Technology eCOG2 microprocessor";
2313 case EM_DSP24
: return "New Japan Radio (NJR) 24-bit DSP Processor";
2314 case EM_VIDEOCORE3
: return "Broadcom VideoCore III processor";
2315 case EM_SE_C17
: return "Seiko Epson C17 family";
2316 case EM_TI_C6000
: return "Texas Instruments TMS320C6000 DSP family";
2317 case EM_TI_C2000
: return "Texas Instruments TMS320C2000 DSP family";
2318 case EM_TI_C5500
: return "Texas Instruments TMS320C55x DSP family";
2319 case EM_MMDSP_PLUS
: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2320 case EM_CYPRESS_M8C
: return "Cypress M8C microprocessor";
2321 case EM_R32C
: return "Renesas R32C series microprocessors";
2322 case EM_TRIMEDIA
: return "NXP Semiconductors TriMedia architecture family";
2323 case EM_QDSP6
: return "QUALCOMM DSP6 Processor";
2324 case EM_8051
: return "Intel 8051 and variants";
2325 case EM_STXP7X
: return "STMicroelectronics STxP7x family";
2326 case EM_NDS32
: return "Andes Technology compact code size embedded RISC processor family";
2327 case EM_ECOG1X
: return "Cyan Technology eCOG1X family";
2328 case EM_MAXQ30
: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2329 case EM_XIMO16
: return "New Japan Radio (NJR) 16-bit DSP Processor";
2330 case EM_MANIK
: return "M2000 Reconfigurable RISC Microprocessor";
2331 case EM_CRAYNV2
: return "Cray Inc. NV2 vector architecture";
2332 case EM_CYGNUS_MEP
: return "Toshiba MeP Media Engine";
2335 case EM_MICROBLAZE_OLD
: return "Xilinx MicroBlaze";
2336 case EM_RISCV
: return "RISC-V";
2337 case EM_RL78
: return "Renesas RL78";
2338 case EM_RX
: return "Renesas RX";
2339 case EM_METAG
: return "Imagination Technologies Meta processor architecture";
2340 case EM_MCST_ELBRUS
: return "MCST Elbrus general purpose hardware architecture";
2341 case EM_ECOG16
: return "Cyan Technology eCOG16 family";
2342 case EM_ETPU
: return "Freescale Extended Time Processing Unit";
2343 case EM_SLE9X
: return "Infineon Technologies SLE9X core";
2344 case EM_AVR32
: return "Atmel Corporation 32-bit microprocessor family";
2345 case EM_STM8
: return "STMicroeletronics STM8 8-bit microcontroller";
2346 case EM_TILE64
: return "Tilera TILE64 multicore architecture family";
2347 case EM_TILEPRO
: return "Tilera TILEPro multicore architecture family";
2348 case EM_TILEGX
: return "Tilera TILE-Gx multicore architecture family";
2349 case EM_CUDA
: return "NVIDIA CUDA architecture";
2350 case EM_XGATE
: return "Motorola XGATE embedded processor";
2351 case EM_CLOUDSHIELD
: return "CloudShield architecture family";
2352 case EM_COREA_1ST
: return "KIPO-KAIST Core-A 1st generation processor family";
2353 case EM_COREA_2ND
: return "KIPO-KAIST Core-A 2nd generation processor family";
2354 case EM_OPEN8
: return "Open8 8-bit RISC soft processor core";
2355 case EM_VIDEOCORE5
: return "Broadcom VideoCore V processor";
2356 case EM_56800EX
: return "Freescale 56800EX Digital Signal Controller (DSC)";
2357 case EM_BA1
: return "Beyond BA1 CPU architecture";
2358 case EM_BA2
: return "Beyond BA2 CPU architecture";
2359 case EM_XCORE
: return "XMOS xCORE processor family";
2360 case EM_MCHP_PIC
: return "Microchip 8-bit PIC(r) family";
2361 case EM_KM32
: return "KM211 KM32 32-bit processor";
2362 case EM_KMX32
: return "KM211 KMX32 32-bit processor";
2363 case EM_KMX16
: return "KM211 KMX16 16-bit processor";
2364 case EM_KMX8
: return "KM211 KMX8 8-bit processor";
2365 case EM_KVARC
: return "KM211 KVARC processor";
2366 case EM_CDP
: return "Paneve CDP architecture family";
2367 case EM_COGE
: return "Cognitive Smart Memory Processor";
2368 case EM_COOL
: return "Bluechip Systems CoolEngine";
2369 case EM_NORC
: return "Nanoradio Optimized RISC";
2370 case EM_CSR_KALIMBA
: return "CSR Kalimba architecture family";
2371 case EM_Z80
: return "Zilog Z80";
2372 case EM_AMDGPU
: return "AMD GPU architecture";
2374 snprintf (buff
, sizeof (buff
), _("<unknown>: 0x%x"), e_machine
);
2380 decode_ARC_machine_flags (unsigned e_flags
, unsigned e_machine
, char buf
[])
2382 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2383 other compilers don't a specific architecture type in the e_flags, and
2384 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2385 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2388 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2389 but also sets a specific architecture type in the e_flags field.
2391 However, when decoding the flags we don't worry if we see an
2392 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2393 ARCEM architecture type. */
2395 switch (e_flags
& EF_ARC_MACH_MSK
)
2397 /* We only expect these to occur for EM_ARC_COMPACT2. */
2398 case EF_ARC_CPU_ARCV2EM
:
2399 strcat (buf
, ", ARC EM");
2401 case EF_ARC_CPU_ARCV2HS
:
2402 strcat (buf
, ", ARC HS");
2405 /* We only expect these to occur for EM_ARC_COMPACT. */
2406 case E_ARC_MACH_ARC600
:
2407 strcat (buf
, ", ARC600");
2409 case E_ARC_MACH_ARC601
:
2410 strcat (buf
, ", ARC601");
2412 case E_ARC_MACH_ARC700
:
2413 strcat (buf
, ", ARC700");
2416 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2417 new ELF with new architecture being read by an old version of
2418 readelf, or (c) An ELF built with non-GNU compiler that does not
2419 set the architecture in the e_flags. */
2421 if (e_machine
== EM_ARC_COMPACT
)
2422 strcat (buf
, ", Unknown ARCompact");
2424 strcat (buf
, ", Unknown ARC");
2428 switch (e_flags
& EF_ARC_OSABI_MSK
)
2430 case E_ARC_OSABI_ORIG
:
2431 strcat (buf
, ", (ABI:legacy)");
2433 case E_ARC_OSABI_V2
:
2434 strcat (buf
, ", (ABI:v2)");
2436 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2437 case E_ARC_OSABI_V3
:
2438 strcat (buf
, ", v3 no-legacy-syscalls ABI");
2441 strcat (buf
, ", unrecognised ARC OSABI flag");
2447 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
2452 eabi
= EF_ARM_EABI_VERSION (e_flags
);
2453 e_flags
&= ~ EF_ARM_EABIMASK
;
2455 /* Handle "generic" ARM flags. */
2456 if (e_flags
& EF_ARM_RELEXEC
)
2458 strcat (buf
, ", relocatable executable");
2459 e_flags
&= ~ EF_ARM_RELEXEC
;
2462 /* Now handle EABI specific flags. */
2466 strcat (buf
, ", <unrecognized EABI>");
2471 case EF_ARM_EABI_VER1
:
2472 strcat (buf
, ", Version1 EABI");
2477 /* Process flags one bit at a time. */
2478 flag
= e_flags
& - e_flags
;
2483 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
2484 strcat (buf
, ", sorted symbol tables");
2494 case EF_ARM_EABI_VER2
:
2495 strcat (buf
, ", Version2 EABI");
2500 /* Process flags one bit at a time. */
2501 flag
= e_flags
& - e_flags
;
2506 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
2507 strcat (buf
, ", sorted symbol tables");
2510 case EF_ARM_DYNSYMSUSESEGIDX
:
2511 strcat (buf
, ", dynamic symbols use segment index");
2514 case EF_ARM_MAPSYMSFIRST
:
2515 strcat (buf
, ", mapping symbols precede others");
2525 case EF_ARM_EABI_VER3
:
2526 strcat (buf
, ", Version3 EABI");
2529 case EF_ARM_EABI_VER4
:
2530 strcat (buf
, ", Version4 EABI");
2535 /* Process flags one bit at a time. */
2536 flag
= e_flags
& - e_flags
;
2542 strcat (buf
, ", BE8");
2546 strcat (buf
, ", LE8");
2557 case EF_ARM_EABI_VER5
:
2558 strcat (buf
, ", Version5 EABI");
2563 /* Process flags one bit at a time. */
2564 flag
= e_flags
& - e_flags
;
2570 strcat (buf
, ", BE8");
2574 strcat (buf
, ", LE8");
2577 case EF_ARM_ABI_FLOAT_SOFT
: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2578 strcat (buf
, ", soft-float ABI");
2581 case EF_ARM_ABI_FLOAT_HARD
: /* Conflicts with EF_ARM_VFP_FLOAT. */
2582 strcat (buf
, ", hard-float ABI");
2592 case EF_ARM_EABI_UNKNOWN
:
2593 strcat (buf
, ", GNU EABI");
2598 /* Process flags one bit at a time. */
2599 flag
= e_flags
& - e_flags
;
2604 case EF_ARM_INTERWORK
:
2605 strcat (buf
, ", interworking enabled");
2608 case EF_ARM_APCS_26
:
2609 strcat (buf
, ", uses APCS/26");
2612 case EF_ARM_APCS_FLOAT
:
2613 strcat (buf
, ", uses APCS/float");
2617 strcat (buf
, ", position independent");
2621 strcat (buf
, ", 8 bit structure alignment");
2624 case EF_ARM_NEW_ABI
:
2625 strcat (buf
, ", uses new ABI");
2628 case EF_ARM_OLD_ABI
:
2629 strcat (buf
, ", uses old ABI");
2632 case EF_ARM_SOFT_FLOAT
:
2633 strcat (buf
, ", software FP");
2636 case EF_ARM_VFP_FLOAT
:
2637 strcat (buf
, ", VFP");
2640 case EF_ARM_MAVERICK_FLOAT
:
2641 strcat (buf
, ", Maverick FP");
2652 strcat (buf
,_(", <unknown>"));
2656 decode_AVR_machine_flags (unsigned e_flags
, char buf
[], size_t size
)
2658 --size
; /* Leave space for null terminator. */
2660 switch (e_flags
& EF_AVR_MACH
)
2662 case E_AVR_MACH_AVR1
:
2663 strncat (buf
, ", avr:1", size
);
2665 case E_AVR_MACH_AVR2
:
2666 strncat (buf
, ", avr:2", size
);
2668 case E_AVR_MACH_AVR25
:
2669 strncat (buf
, ", avr:25", size
);
2671 case E_AVR_MACH_AVR3
:
2672 strncat (buf
, ", avr:3", size
);
2674 case E_AVR_MACH_AVR31
:
2675 strncat (buf
, ", avr:31", size
);
2677 case E_AVR_MACH_AVR35
:
2678 strncat (buf
, ", avr:35", size
);
2680 case E_AVR_MACH_AVR4
:
2681 strncat (buf
, ", avr:4", size
);
2683 case E_AVR_MACH_AVR5
:
2684 strncat (buf
, ", avr:5", size
);
2686 case E_AVR_MACH_AVR51
:
2687 strncat (buf
, ", avr:51", size
);
2689 case E_AVR_MACH_AVR6
:
2690 strncat (buf
, ", avr:6", size
);
2692 case E_AVR_MACH_AVRTINY
:
2693 strncat (buf
, ", avr:100", size
);
2695 case E_AVR_MACH_XMEGA1
:
2696 strncat (buf
, ", avr:101", size
);
2698 case E_AVR_MACH_XMEGA2
:
2699 strncat (buf
, ", avr:102", size
);
2701 case E_AVR_MACH_XMEGA3
:
2702 strncat (buf
, ", avr:103", size
);
2704 case E_AVR_MACH_XMEGA4
:
2705 strncat (buf
, ", avr:104", size
);
2707 case E_AVR_MACH_XMEGA5
:
2708 strncat (buf
, ", avr:105", size
);
2710 case E_AVR_MACH_XMEGA6
:
2711 strncat (buf
, ", avr:106", size
);
2713 case E_AVR_MACH_XMEGA7
:
2714 strncat (buf
, ", avr:107", size
);
2717 strncat (buf
, ", avr:<unknown>", size
);
2721 size
-= strlen (buf
);
2722 if (e_flags
& EF_AVR_LINKRELAX_PREPARED
)
2723 strncat (buf
, ", link-relax", size
);
2727 decode_NDS32_machine_flags (unsigned e_flags
, char buf
[], size_t size
)
2736 static const char *ABI_STRINGS
[] =
2738 "ABI v0", /* use r5 as return register; only used in N1213HC */
2739 "ABI v1", /* use r0 as return register */
2740 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2741 "ABI v2fp", /* for FPU */
2745 static const char *VER_STRINGS
[] =
2747 "Andes ELF V1.3 or older",
2751 static const char *ARCH_STRINGS
[] =
2760 abi
= EF_NDS_ABI
& e_flags
;
2761 arch
= EF_NDS_ARCH
& e_flags
;
2762 config
= EF_NDS_INST
& e_flags
;
2763 version
= EF_NDS32_ELF_VERSION
& e_flags
;
2765 memset (buf
, 0, size
);
2772 case E_NDS_ABI_V2FP
:
2773 case E_NDS_ABI_AABI
:
2774 case E_NDS_ABI_V2FP_PLUS
:
2775 /* In case there are holes in the array. */
2776 r
+= snprintf (buf
+ r
, size
- r
, ", %s", ABI_STRINGS
[abi
>> EF_NDS_ABI_SHIFT
]);
2780 r
+= snprintf (buf
+ r
, size
- r
, ", <unrecognized ABI>");
2786 case E_NDS32_ELF_VER_1_2
:
2787 case E_NDS32_ELF_VER_1_3
:
2788 case E_NDS32_ELF_VER_1_4
:
2789 r
+= snprintf (buf
+ r
, size
- r
, ", %s", VER_STRINGS
[version
>> EF_NDS32_ELF_VERSION_SHIFT
]);
2793 r
+= snprintf (buf
+ r
, size
- r
, ", <unrecognized ELF version number>");
2797 if (E_NDS_ABI_V0
== abi
)
2799 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2800 r
+= snprintf (buf
+ r
, size
- r
, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2801 if (arch
== E_NDS_ARCH_STAR_V1_0
)
2802 r
+= snprintf (buf
+ r
, size
-r
, ", 16b"); /* has 16-bit instructions */
2808 case E_NDS_ARCH_STAR_V1_0
:
2809 case E_NDS_ARCH_STAR_V2_0
:
2810 case E_NDS_ARCH_STAR_V3_0
:
2811 case E_NDS_ARCH_STAR_V3_M
:
2812 r
+= snprintf (buf
+ r
, size
- r
, ", %s", ARCH_STRINGS
[arch
>> EF_NDS_ARCH_SHIFT
]);
2816 r
+= snprintf (buf
+ r
, size
- r
, ", <unrecognized architecture>");
2817 /* ARCH version determines how the e_flags are interpreted.
2818 If it is unknown, we cannot proceed. */
2822 /* Newer ABI; Now handle architecture specific flags. */
2823 if (arch
== E_NDS_ARCH_STAR_V1_0
)
2825 if (config
& E_NDS32_HAS_MFUSR_PC_INST
)
2826 r
+= snprintf (buf
+ r
, size
-r
, ", MFUSR_PC");
2828 if (!(config
& E_NDS32_HAS_NO_MAC_INST
))
2829 r
+= snprintf (buf
+ r
, size
-r
, ", MAC");
2831 if (config
& E_NDS32_HAS_DIV_INST
)
2832 r
+= snprintf (buf
+ r
, size
-r
, ", DIV");
2834 if (config
& E_NDS32_HAS_16BIT_INST
)
2835 r
+= snprintf (buf
+ r
, size
-r
, ", 16b");
2839 if (config
& E_NDS32_HAS_MFUSR_PC_INST
)
2841 if (version
<= E_NDS32_ELF_VER_1_3
)
2842 r
+= snprintf (buf
+ r
, size
-r
, ", [B8]");
2844 r
+= snprintf (buf
+ r
, size
-r
, ", EX9");
2847 if (config
& E_NDS32_HAS_MAC_DX_INST
)
2848 r
+= snprintf (buf
+ r
, size
-r
, ", MAC_DX");
2850 if (config
& E_NDS32_HAS_DIV_DX_INST
)
2851 r
+= snprintf (buf
+ r
, size
-r
, ", DIV_DX");
2853 if (config
& E_NDS32_HAS_16BIT_INST
)
2855 if (version
<= E_NDS32_ELF_VER_1_3
)
2856 r
+= snprintf (buf
+ r
, size
-r
, ", 16b");
2858 r
+= snprintf (buf
+ r
, size
-r
, ", IFC");
2862 if (config
& E_NDS32_HAS_EXT_INST
)
2863 r
+= snprintf (buf
+ r
, size
-r
, ", PERF1");
2865 if (config
& E_NDS32_HAS_EXT2_INST
)
2866 r
+= snprintf (buf
+ r
, size
-r
, ", PERF2");
2868 if (config
& E_NDS32_HAS_FPU_INST
)
2871 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_SP");
2874 if (config
& E_NDS32_HAS_FPU_DP_INST
)
2877 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_DP");
2880 if (config
& E_NDS32_HAS_FPU_MAC_INST
)
2883 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_MAC");
2888 switch ((config
& E_NDS32_FPU_REG_CONF
) >> E_NDS32_FPU_REG_CONF_SHIFT
)
2890 case E_NDS32_FPU_REG_8SP_4DP
:
2891 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_REG:8/4");
2893 case E_NDS32_FPU_REG_16SP_8DP
:
2894 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_REG:16/8");
2896 case E_NDS32_FPU_REG_32SP_16DP
:
2897 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_REG:32/16");
2899 case E_NDS32_FPU_REG_32SP_32DP
:
2900 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_REG:32/32");
2905 if (config
& E_NDS32_HAS_AUDIO_INST
)
2906 r
+= snprintf (buf
+ r
, size
-r
, ", AUDIO");
2908 if (config
& E_NDS32_HAS_STRING_INST
)
2909 r
+= snprintf (buf
+ r
, size
-r
, ", STR");
2911 if (config
& E_NDS32_HAS_REDUCED_REGS
)
2912 r
+= snprintf (buf
+ r
, size
-r
, ", 16REG");
2914 if (config
& E_NDS32_HAS_VIDEO_INST
)
2916 if (version
<= E_NDS32_ELF_VER_1_3
)
2917 r
+= snprintf (buf
+ r
, size
-r
, ", VIDEO");
2919 r
+= snprintf (buf
+ r
, size
-r
, ", SATURATION");
2922 if (config
& E_NDS32_HAS_ENCRIPT_INST
)
2923 r
+= snprintf (buf
+ r
, size
-r
, ", ENCRP");
2925 if (config
& E_NDS32_HAS_L2C_INST
)
2926 r
+= snprintf (buf
+ r
, size
-r
, ", L2C");
2930 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
2932 static char buf
[1024];
2943 case EM_ARC_COMPACT2
:
2944 case EM_ARC_COMPACT
:
2945 decode_ARC_machine_flags (e_flags
, e_machine
, buf
);
2949 decode_ARM_machine_flags (e_flags
, buf
);
2953 decode_AVR_machine_flags (e_flags
, buf
, sizeof buf
);
2957 if (e_flags
& EF_BFIN_PIC
)
2958 strcat (buf
, ", PIC");
2960 if (e_flags
& EF_BFIN_FDPIC
)
2961 strcat (buf
, ", FDPIC");
2963 if (e_flags
& EF_BFIN_CODE_IN_L1
)
2964 strcat (buf
, ", code in L1");
2966 if (e_flags
& EF_BFIN_DATA_IN_L1
)
2967 strcat (buf
, ", data in L1");
2972 switch (e_flags
& EF_FRV_CPU_MASK
)
2974 case EF_FRV_CPU_GENERIC
:
2978 strcat (buf
, ", fr???");
2981 case EF_FRV_CPU_FR300
:
2982 strcat (buf
, ", fr300");
2985 case EF_FRV_CPU_FR400
:
2986 strcat (buf
, ", fr400");
2988 case EF_FRV_CPU_FR405
:
2989 strcat (buf
, ", fr405");
2992 case EF_FRV_CPU_FR450
:
2993 strcat (buf
, ", fr450");
2996 case EF_FRV_CPU_FR500
:
2997 strcat (buf
, ", fr500");
2999 case EF_FRV_CPU_FR550
:
3000 strcat (buf
, ", fr550");
3003 case EF_FRV_CPU_SIMPLE
:
3004 strcat (buf
, ", simple");
3006 case EF_FRV_CPU_TOMCAT
:
3007 strcat (buf
, ", tomcat");
3013 if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_M68000
)
3014 strcat (buf
, ", m68000");
3015 else if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_CPU32
)
3016 strcat (buf
, ", cpu32");
3017 else if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_FIDO
)
3018 strcat (buf
, ", fido_a");
3021 char const * isa
= _("unknown");
3022 char const * mac
= _("unknown mac");
3023 char const * additional
= NULL
;
3025 switch (e_flags
& EF_M68K_CF_ISA_MASK
)
3027 case EF_M68K_CF_ISA_A_NODIV
:
3029 additional
= ", nodiv";
3031 case EF_M68K_CF_ISA_A
:
3034 case EF_M68K_CF_ISA_A_PLUS
:
3037 case EF_M68K_CF_ISA_B_NOUSP
:
3039 additional
= ", nousp";
3041 case EF_M68K_CF_ISA_B
:
3044 case EF_M68K_CF_ISA_C
:
3047 case EF_M68K_CF_ISA_C_NODIV
:
3049 additional
= ", nodiv";
3052 strcat (buf
, ", cf, isa ");
3055 strcat (buf
, additional
);
3056 if (e_flags
& EF_M68K_CF_FLOAT
)
3057 strcat (buf
, ", float");
3058 switch (e_flags
& EF_M68K_CF_MAC_MASK
)
3063 case EF_M68K_CF_MAC
:
3066 case EF_M68K_CF_EMAC
:
3069 case EF_M68K_CF_EMAC_B
:
3082 switch (e_flags
& EF_MEP_CPU_MASK
)
3084 case EF_MEP_CPU_MEP
: strcat (buf
, ", generic MeP"); break;
3085 case EF_MEP_CPU_C2
: strcat (buf
, ", MeP C2"); break;
3086 case EF_MEP_CPU_C3
: strcat (buf
, ", MeP C3"); break;
3087 case EF_MEP_CPU_C4
: strcat (buf
, ", MeP C4"); break;
3088 case EF_MEP_CPU_C5
: strcat (buf
, ", MeP C5"); break;
3089 case EF_MEP_CPU_H1
: strcat (buf
, ", MeP H1"); break;
3090 default: strcat (buf
, _(", <unknown MeP cpu type>")); break;
3093 switch (e_flags
& EF_MEP_COP_MASK
)
3095 case EF_MEP_COP_NONE
: break;
3096 case EF_MEP_COP_AVC
: strcat (buf
, ", AVC coprocessor"); break;
3097 case EF_MEP_COP_AVC2
: strcat (buf
, ", AVC2 coprocessor"); break;
3098 case EF_MEP_COP_FMAX
: strcat (buf
, ", FMAX coprocessor"); break;
3099 case EF_MEP_COP_IVC2
: strcat (buf
, ", IVC2 coprocessor"); break;
3100 default: strcat (buf
, _("<unknown MeP copro type>")); break;
3103 if (e_flags
& EF_MEP_LIBRARY
)
3104 strcat (buf
, ", Built for Library");
3106 if (e_flags
& EF_MEP_INDEX_MASK
)
3107 sprintf (buf
+ strlen (buf
), ", Configuration Index: %#x",
3108 e_flags
& EF_MEP_INDEX_MASK
);
3110 if (e_flags
& ~ EF_MEP_ALL_FLAGS
)
3111 sprintf (buf
+ strlen (buf
), _(", unknown flags bits: %#x"),
3112 e_flags
& ~ EF_MEP_ALL_FLAGS
);
3116 if (e_flags
& EF_PPC_EMB
)
3117 strcat (buf
, ", emb");
3119 if (e_flags
& EF_PPC_RELOCATABLE
)
3120 strcat (buf
, _(", relocatable"));
3122 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
3123 strcat (buf
, _(", relocatable-lib"));
3127 if (e_flags
& EF_PPC64_ABI
)
3129 char abi
[] = ", abiv0";
3131 abi
[6] += e_flags
& EF_PPC64_ABI
;
3137 if ((e_flags
& EF_RH850_ABI
) == EF_RH850_ABI
)
3138 strcat (buf
, ", RH850 ABI");
3140 if (e_flags
& EF_V800_850E3
)
3141 strcat (buf
, ", V3 architecture");
3143 if ((e_flags
& (EF_RH850_FPU_DOUBLE
| EF_RH850_FPU_SINGLE
)) == 0)
3144 strcat (buf
, ", FPU not used");
3146 if ((e_flags
& (EF_RH850_REGMODE22
| EF_RH850_REGMODE32
)) == 0)
3147 strcat (buf
, ", regmode: COMMON");
3149 if ((e_flags
& (EF_RH850_GP_FIX
| EF_RH850_GP_NOFIX
)) == 0)
3150 strcat (buf
, ", r4 not used");
3152 if ((e_flags
& (EF_RH850_EP_FIX
| EF_RH850_EP_NOFIX
)) == 0)
3153 strcat (buf
, ", r30 not used");
3155 if ((e_flags
& (EF_RH850_TP_FIX
| EF_RH850_TP_NOFIX
)) == 0)
3156 strcat (buf
, ", r5 not used");
3158 if ((e_flags
& (EF_RH850_REG2_RESERVE
| EF_RH850_REG2_NORESERVE
)) == 0)
3159 strcat (buf
, ", r2 not used");
3161 for (e_flags
&= 0xFFFF; e_flags
; e_flags
&= ~ (e_flags
& - e_flags
))
3163 switch (e_flags
& - e_flags
)
3165 case EF_RH850_FPU_DOUBLE
: strcat (buf
, ", double precision FPU"); break;
3166 case EF_RH850_FPU_SINGLE
: strcat (buf
, ", single precision FPU"); break;
3167 case EF_RH850_REGMODE22
: strcat (buf
, ", regmode:22"); break;
3168 case EF_RH850_REGMODE32
: strcat (buf
, ", regmode:23"); break;
3169 case EF_RH850_GP_FIX
: strcat (buf
, ", r4 fixed"); break;
3170 case EF_RH850_GP_NOFIX
: strcat (buf
, ", r4 free"); break;
3171 case EF_RH850_EP_FIX
: strcat (buf
, ", r30 fixed"); break;
3172 case EF_RH850_EP_NOFIX
: strcat (buf
, ", r30 free"); break;
3173 case EF_RH850_TP_FIX
: strcat (buf
, ", r5 fixed"); break;
3174 case EF_RH850_TP_NOFIX
: strcat (buf
, ", r5 free"); break;
3175 case EF_RH850_REG2_RESERVE
: strcat (buf
, ", r2 fixed"); break;
3176 case EF_RH850_REG2_NORESERVE
: strcat (buf
, ", r2 free"); break;
3183 case EM_CYGNUS_V850
:
3184 switch (e_flags
& EF_V850_ARCH
)
3186 case E_V850E3V5_ARCH
:
3187 strcat (buf
, ", v850e3v5");
3189 case E_V850E2V3_ARCH
:
3190 strcat (buf
, ", v850e2v3");
3193 strcat (buf
, ", v850e2");
3196 strcat (buf
, ", v850e1");
3199 strcat (buf
, ", v850e");
3202 strcat (buf
, ", v850");
3205 strcat (buf
, _(", unknown v850 architecture variant"));
3211 case EM_CYGNUS_M32R
:
3212 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
3213 strcat (buf
, ", m32r");
3217 case EM_MIPS_RS3_LE
:
3218 if (e_flags
& EF_MIPS_NOREORDER
)
3219 strcat (buf
, ", noreorder");
3221 if (e_flags
& EF_MIPS_PIC
)
3222 strcat (buf
, ", pic");
3224 if (e_flags
& EF_MIPS_CPIC
)
3225 strcat (buf
, ", cpic");
3227 if (e_flags
& EF_MIPS_UCODE
)
3228 strcat (buf
, ", ugen_reserved");
3230 if (e_flags
& EF_MIPS_ABI2
)
3231 strcat (buf
, ", abi2");
3233 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
3234 strcat (buf
, ", odk first");
3236 if (e_flags
& EF_MIPS_32BITMODE
)
3237 strcat (buf
, ", 32bitmode");
3239 if (e_flags
& EF_MIPS_NAN2008
)
3240 strcat (buf
, ", nan2008");
3242 if (e_flags
& EF_MIPS_FP64
)
3243 strcat (buf
, ", fp64");
3245 switch ((e_flags
& EF_MIPS_MACH
))
3247 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
3248 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
3249 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
3250 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
3251 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
3252 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
3253 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
3254 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
3255 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
3256 case E_MIPS_MACH_9000
: strcat (buf
, ", 9000"); break;
3257 case E_MIPS_MACH_LS2E
: strcat (buf
, ", loongson-2e"); break;
3258 case E_MIPS_MACH_LS2F
: strcat (buf
, ", loongson-2f"); break;
3259 case E_MIPS_MACH_LS3A
: strcat (buf
, ", loongson-3a"); break;
3260 case E_MIPS_MACH_OCTEON
: strcat (buf
, ", octeon"); break;
3261 case E_MIPS_MACH_OCTEON2
: strcat (buf
, ", octeon2"); break;
3262 case E_MIPS_MACH_OCTEON3
: strcat (buf
, ", octeon3"); break;
3263 case E_MIPS_MACH_XLR
: strcat (buf
, ", xlr"); break;
3265 /* We simply ignore the field in this case to avoid confusion:
3266 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3269 default: strcat (buf
, _(", unknown CPU")); break;
3272 switch ((e_flags
& EF_MIPS_ABI
))
3274 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
3275 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
3276 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
3277 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
3279 /* We simply ignore the field in this case to avoid confusion:
3280 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3281 This means it is likely to be an o32 file, but not for
3284 default: strcat (buf
, _(", unknown ABI")); break;
3287 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
3288 strcat (buf
, ", mdmx");
3290 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
3291 strcat (buf
, ", mips16");
3293 if (e_flags
& EF_MIPS_ARCH_ASE_MICROMIPS
)
3294 strcat (buf
, ", micromips");
3296 switch ((e_flags
& EF_MIPS_ARCH
))
3298 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
3299 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
3300 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
3301 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
3302 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
3303 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
3304 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
3305 case E_MIPS_ARCH_32R6
: strcat (buf
, ", mips32r6"); break;
3306 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
3307 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
3308 case E_MIPS_ARCH_64R6
: strcat (buf
, ", mips64r6"); break;
3309 default: strcat (buf
, _(", unknown ISA")); break;
3314 decode_NDS32_machine_flags (e_flags
, buf
, sizeof buf
);
3318 if (e_flags
& EF_RISCV_RVC
)
3319 strcat (buf
, ", RVC");
3320 if (e_flags
& EF_RISCV_SOFT_FLOAT
)
3321 strcat (buf
, ", soft-float ABI");
3325 switch ((e_flags
& EF_SH_MACH_MASK
))
3327 case EF_SH1
: strcat (buf
, ", sh1"); break;
3328 case EF_SH2
: strcat (buf
, ", sh2"); break;
3329 case EF_SH3
: strcat (buf
, ", sh3"); break;
3330 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
3331 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
3332 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
3333 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
3334 case EF_SH4
: strcat (buf
, ", sh4"); break;
3335 case EF_SH5
: strcat (buf
, ", sh5"); break;
3336 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
3337 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
3338 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
3339 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
3340 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
3341 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
3342 case EF_SH3_NOMMU
: strcat (buf
, ", sh3-nommu"); break;
3343 case EF_SH4_NOMMU_NOFPU
: strcat (buf
, ", sh4-nommu-nofpu"); break;
3344 case EF_SH2A_SH4_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3345 case EF_SH2A_SH3_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh3-nommu"); break;
3346 case EF_SH2A_SH4
: strcat (buf
, ", sh2a-or-sh4"); break;
3347 case EF_SH2A_SH3E
: strcat (buf
, ", sh2a-or-sh3e"); break;
3348 default: strcat (buf
, _(", unknown ISA")); break;
3351 if (e_flags
& EF_SH_PIC
)
3352 strcat (buf
, ", pic");
3354 if (e_flags
& EF_SH_FDPIC
)
3355 strcat (buf
, ", fdpic");
3359 if (e_flags
& EF_OR1K_NODELAY
)
3360 strcat (buf
, ", no delay");
3364 if (e_flags
& EF_SPARC_32PLUS
)
3365 strcat (buf
, ", v8+");
3367 if (e_flags
& EF_SPARC_SUN_US1
)
3368 strcat (buf
, ", ultrasparcI");
3370 if (e_flags
& EF_SPARC_SUN_US3
)
3371 strcat (buf
, ", ultrasparcIII");
3373 if (e_flags
& EF_SPARC_HAL_R1
)
3374 strcat (buf
, ", halr1");
3376 if (e_flags
& EF_SPARC_LEDATA
)
3377 strcat (buf
, ", ledata");
3379 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
3380 strcat (buf
, ", tso");
3382 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
3383 strcat (buf
, ", pso");
3385 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
3386 strcat (buf
, ", rmo");
3390 switch (e_flags
& EF_PARISC_ARCH
)
3392 case EFA_PARISC_1_0
:
3393 strcpy (buf
, ", PA-RISC 1.0");
3395 case EFA_PARISC_1_1
:
3396 strcpy (buf
, ", PA-RISC 1.1");
3398 case EFA_PARISC_2_0
:
3399 strcpy (buf
, ", PA-RISC 2.0");
3404 if (e_flags
& EF_PARISC_TRAPNIL
)
3405 strcat (buf
, ", trapnil");
3406 if (e_flags
& EF_PARISC_EXT
)
3407 strcat (buf
, ", ext");
3408 if (e_flags
& EF_PARISC_LSB
)
3409 strcat (buf
, ", lsb");
3410 if (e_flags
& EF_PARISC_WIDE
)
3411 strcat (buf
, ", wide");
3412 if (e_flags
& EF_PARISC_NO_KABP
)
3413 strcat (buf
, ", no kabp");
3414 if (e_flags
& EF_PARISC_LAZYSWAP
)
3415 strcat (buf
, ", lazyswap");
3420 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
3421 strcat (buf
, ", new calling convention");
3423 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
3424 strcat (buf
, ", gnu calling convention");
3428 if ((e_flags
& EF_IA_64_ABI64
))
3429 strcat (buf
, ", 64-bit");
3431 strcat (buf
, ", 32-bit");
3432 if ((e_flags
& EF_IA_64_REDUCEDFP
))
3433 strcat (buf
, ", reduced fp model");
3434 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
3435 strcat (buf
, ", no function descriptors, constant gp");
3436 else if ((e_flags
& EF_IA_64_CONS_GP
))
3437 strcat (buf
, ", constant gp");
3438 if ((e_flags
& EF_IA_64_ABSOLUTE
))
3439 strcat (buf
, ", absolute");
3440 if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_OPENVMS
)
3442 if ((e_flags
& EF_IA_64_VMS_LINKAGES
))
3443 strcat (buf
, ", vms_linkages");
3444 switch ((e_flags
& EF_IA_64_VMS_COMCOD
))
3446 case EF_IA_64_VMS_COMCOD_SUCCESS
:
3448 case EF_IA_64_VMS_COMCOD_WARNING
:
3449 strcat (buf
, ", warning");
3451 case EF_IA_64_VMS_COMCOD_ERROR
:
3452 strcat (buf
, ", error");
3454 case EF_IA_64_VMS_COMCOD_ABORT
:
3455 strcat (buf
, ", abort");
3458 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3459 e_flags
& EF_IA_64_VMS_COMCOD
);
3460 strcat (buf
, ", <unknown>");
3466 if ((e_flags
& EF_VAX_NONPIC
))
3467 strcat (buf
, ", non-PIC");
3468 if ((e_flags
& EF_VAX_DFLOAT
))
3469 strcat (buf
, ", D-Float");
3470 if ((e_flags
& EF_VAX_GFLOAT
))
3471 strcat (buf
, ", G-Float");
3475 if (e_flags
& EF_VISIUM_ARCH_MCM
)
3476 strcat (buf
, ", mcm");
3477 else if (e_flags
& EF_VISIUM_ARCH_MCM24
)
3478 strcat (buf
, ", mcm24");
3479 if (e_flags
& EF_VISIUM_ARCH_GR6
)
3480 strcat (buf
, ", gr6");
3484 switch (e_flags
& E_FLAG_RL78_CPU_MASK
)
3486 case E_FLAG_RL78_ANY_CPU
: break;
3487 case E_FLAG_RL78_G10
: strcat (buf
, ", G10"); break;
3488 case E_FLAG_RL78_G13
: strcat (buf
, ", G13"); break;
3489 case E_FLAG_RL78_G14
: strcat (buf
, ", G14"); break;
3491 if (e_flags
& E_FLAG_RL78_64BIT_DOUBLES
)
3492 strcat (buf
, ", 64-bit doubles");
3496 if (e_flags
& E_FLAG_RX_64BIT_DOUBLES
)
3497 strcat (buf
, ", 64-bit doubles");
3498 if (e_flags
& E_FLAG_RX_DSP
)
3499 strcat (buf
, ", dsp");
3500 if (e_flags
& E_FLAG_RX_PID
)
3501 strcat (buf
, ", pid");
3502 if (e_flags
& E_FLAG_RX_ABI
)
3503 strcat (buf
, ", RX ABI");
3504 if (e_flags
& E_FLAG_RX_SINSNS_SET
)
3505 strcat (buf
, e_flags
& E_FLAG_RX_SINSNS_YES
3506 ? ", uses String instructions" : ", bans String instructions");
3507 if (e_flags
& E_FLAG_RX_V2
)
3508 strcat (buf
, ", V2");
3512 if (e_flags
& EF_S390_HIGH_GPRS
)
3513 strcat (buf
, ", highgprs");
3517 if ((e_flags
& EF_C6000_REL
))
3518 strcat (buf
, ", relocatable module");
3522 strcat (buf
, _(": architecture variant: "));
3523 switch (e_flags
& EF_MSP430_MACH
)
3525 case E_MSP430_MACH_MSP430x11
: strcat (buf
, "MSP430x11"); break;
3526 case E_MSP430_MACH_MSP430x11x1
: strcat (buf
, "MSP430x11x1 "); break;
3527 case E_MSP430_MACH_MSP430x12
: strcat (buf
, "MSP430x12"); break;
3528 case E_MSP430_MACH_MSP430x13
: strcat (buf
, "MSP430x13"); break;
3529 case E_MSP430_MACH_MSP430x14
: strcat (buf
, "MSP430x14"); break;
3530 case E_MSP430_MACH_MSP430x15
: strcat (buf
, "MSP430x15"); break;
3531 case E_MSP430_MACH_MSP430x16
: strcat (buf
, "MSP430x16"); break;
3532 case E_MSP430_MACH_MSP430x31
: strcat (buf
, "MSP430x31"); break;
3533 case E_MSP430_MACH_MSP430x32
: strcat (buf
, "MSP430x32"); break;
3534 case E_MSP430_MACH_MSP430x33
: strcat (buf
, "MSP430x33"); break;
3535 case E_MSP430_MACH_MSP430x41
: strcat (buf
, "MSP430x41"); break;
3536 case E_MSP430_MACH_MSP430x42
: strcat (buf
, "MSP430x42"); break;
3537 case E_MSP430_MACH_MSP430x43
: strcat (buf
, "MSP430x43"); break;
3538 case E_MSP430_MACH_MSP430x44
: strcat (buf
, "MSP430x44"); break;
3539 case E_MSP430_MACH_MSP430X
: strcat (buf
, "MSP430X"); break;
3541 strcat (buf
, _(": unknown")); break;
3544 if (e_flags
& ~ EF_MSP430_MACH
)
3545 strcat (buf
, _(": unknown extra flag bits also present"));
3553 get_osabi_name (unsigned int osabi
)
3555 static char buff
[32];
3559 case ELFOSABI_NONE
: return "UNIX - System V";
3560 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
3561 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
3562 case ELFOSABI_GNU
: return "UNIX - GNU";
3563 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
3564 case ELFOSABI_AIX
: return "UNIX - AIX";
3565 case ELFOSABI_IRIX
: return "UNIX - IRIX";
3566 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
3567 case ELFOSABI_TRU64
: return "UNIX - TRU64";
3568 case ELFOSABI_MODESTO
: return "Novell - Modesto";
3569 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
3570 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
3571 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
3572 case ELFOSABI_AROS
: return "AROS";
3573 case ELFOSABI_FENIXOS
: return "FenixOS";
3574 case ELFOSABI_CLOUDABI
: return "Nuxi CloudABI";
3575 case ELFOSABI_OPENVOS
: return "Stratus Technologies OpenVOS";
3578 switch (elf_header
.e_machine
)
3583 case ELFOSABI_ARM
: return "ARM";
3594 case ELFOSABI_STANDALONE
: return _("Standalone App");
3603 case ELFOSABI_C6000_ELFABI
: return _("Bare-metal C6000");
3604 case ELFOSABI_C6000_LINUX
: return "Linux C6000";
3613 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), osabi
);
3619 get_aarch64_segment_type (unsigned long type
)
3623 case PT_AARCH64_ARCHEXT
:
3624 return "AARCH64_ARCHEXT";
3633 get_arm_segment_type (unsigned long type
)
3647 get_mips_segment_type (unsigned long type
)
3651 case PT_MIPS_REGINFO
:
3653 case PT_MIPS_RTPROC
:
3655 case PT_MIPS_OPTIONS
:
3657 case PT_MIPS_ABIFLAGS
:
3667 get_parisc_segment_type (unsigned long type
)
3671 case PT_HP_TLS
: return "HP_TLS";
3672 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
3673 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
3674 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
3675 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
3676 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
3677 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
3678 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
3679 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
3680 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
3681 case PT_HP_PARALLEL
: return "HP_PARALLEL";
3682 case PT_HP_FASTBIND
: return "HP_FASTBIND";
3683 case PT_HP_OPT_ANNOT
: return "HP_OPT_ANNOT";
3684 case PT_HP_HSL_ANNOT
: return "HP_HSL_ANNOT";
3685 case PT_HP_STACK
: return "HP_STACK";
3686 case PT_HP_CORE_UTSNAME
: return "HP_CORE_UTSNAME";
3687 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
3688 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
3689 case PT_PARISC_WEAKORDER
: return "PARISC_WEAKORDER";
3698 get_ia64_segment_type (unsigned long type
)
3702 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
3703 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
3704 case PT_HP_TLS
: return "HP_TLS";
3705 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
3706 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
3707 case PT_IA_64_HP_STACK
: return "HP_STACK";
3716 get_tic6x_segment_type (unsigned long type
)
3720 case PT_C6000_PHATTR
: return "C6000_PHATTR";
3729 get_solaris_segment_type (unsigned long type
)
3733 case 0x6464e550: return "PT_SUNW_UNWIND";
3734 case 0x6474e550: return "PT_SUNW_EH_FRAME";
3735 case 0x6ffffff7: return "PT_LOSUNW";
3736 case 0x6ffffffa: return "PT_SUNWBSS";
3737 case 0x6ffffffb: return "PT_SUNWSTACK";
3738 case 0x6ffffffc: return "PT_SUNWDTRACE";
3739 case 0x6ffffffd: return "PT_SUNWCAP";
3740 case 0x6fffffff: return "PT_HISUNW";
3741 default: return NULL
;
3746 get_segment_type (unsigned long p_type
)
3748 static char buff
[32];
3752 case PT_NULL
: return "NULL";
3753 case PT_LOAD
: return "LOAD";
3754 case PT_DYNAMIC
: return "DYNAMIC";
3755 case PT_INTERP
: return "INTERP";
3756 case PT_NOTE
: return "NOTE";
3757 case PT_SHLIB
: return "SHLIB";
3758 case PT_PHDR
: return "PHDR";
3759 case PT_TLS
: return "TLS";
3761 case PT_GNU_EH_FRAME
:
3762 return "GNU_EH_FRAME";
3763 case PT_GNU_STACK
: return "GNU_STACK";
3764 case PT_GNU_RELRO
: return "GNU_RELRO";
3767 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
3769 const char * result
;
3771 switch (elf_header
.e_machine
)
3774 result
= get_aarch64_segment_type (p_type
);
3777 result
= get_arm_segment_type (p_type
);
3780 case EM_MIPS_RS3_LE
:
3781 result
= get_mips_segment_type (p_type
);
3784 result
= get_parisc_segment_type (p_type
);
3787 result
= get_ia64_segment_type (p_type
);
3790 result
= get_tic6x_segment_type (p_type
);
3800 sprintf (buff
, "LOPROC+%#lx", p_type
- PT_LOPROC
);
3802 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
3804 const char * result
;
3806 switch (elf_header
.e_machine
)
3809 result
= get_parisc_segment_type (p_type
);
3812 result
= get_ia64_segment_type (p_type
);
3815 if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_SOLARIS
)
3816 result
= get_solaris_segment_type (p_type
);
3825 sprintf (buff
, "LOOS+%#lx", p_type
- PT_LOOS
);
3828 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), p_type
);
3835 get_mips_section_type_name (unsigned int sh_type
)
3839 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
3840 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
3841 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
3842 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
3843 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
3844 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
3845 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
3846 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
3847 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
3848 case SHT_MIPS_RELD
: return "MIPS_RELD";
3849 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
3850 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
3851 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
3852 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
3853 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
3854 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
3855 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
3856 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
3857 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
3858 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
3859 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
3860 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
3861 case SHT_MIPS_LINE
: return "MIPS_LINE";
3862 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
3863 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
3864 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
3865 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
3866 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
3867 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
3868 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
3869 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
3870 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
3871 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
3872 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
3873 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
3874 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
3875 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
3876 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
3877 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
3878 case SHT_MIPS_ABIFLAGS
: return "MIPS_ABIFLAGS";
3886 get_parisc_section_type_name (unsigned int sh_type
)
3890 case SHT_PARISC_EXT
: return "PARISC_EXT";
3891 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
3892 case SHT_PARISC_DOC
: return "PARISC_DOC";
3893 case SHT_PARISC_ANNOT
: return "PARISC_ANNOT";
3894 case SHT_PARISC_SYMEXTN
: return "PARISC_SYMEXTN";
3895 case SHT_PARISC_STUBS
: return "PARISC_STUBS";
3896 case SHT_PARISC_DLKM
: return "PARISC_DLKM";
3904 get_ia64_section_type_name (unsigned int sh_type
)
3906 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
3907 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
3908 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
3912 case SHT_IA_64_EXT
: return "IA_64_EXT";
3913 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
3914 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
3915 case SHT_IA_64_VMS_TRACE
: return "VMS_TRACE";
3916 case SHT_IA_64_VMS_TIE_SIGNATURES
: return "VMS_TIE_SIGNATURES";
3917 case SHT_IA_64_VMS_DEBUG
: return "VMS_DEBUG";
3918 case SHT_IA_64_VMS_DEBUG_STR
: return "VMS_DEBUG_STR";
3919 case SHT_IA_64_VMS_LINKAGES
: return "VMS_LINKAGES";
3920 case SHT_IA_64_VMS_SYMBOL_VECTOR
: return "VMS_SYMBOL_VECTOR";
3921 case SHT_IA_64_VMS_FIXUP
: return "VMS_FIXUP";
3929 get_x86_64_section_type_name (unsigned int sh_type
)
3933 case SHT_X86_64_UNWIND
: return "X86_64_UNWIND";
3941 get_aarch64_section_type_name (unsigned int sh_type
)
3945 case SHT_AARCH64_ATTRIBUTES
:
3946 return "AARCH64_ATTRIBUTES";
3954 get_arm_section_type_name (unsigned int sh_type
)
3958 case SHT_ARM_EXIDX
: return "ARM_EXIDX";
3959 case SHT_ARM_PREEMPTMAP
: return "ARM_PREEMPTMAP";
3960 case SHT_ARM_ATTRIBUTES
: return "ARM_ATTRIBUTES";
3961 case SHT_ARM_DEBUGOVERLAY
: return "ARM_DEBUGOVERLAY";
3962 case SHT_ARM_OVERLAYSECTION
: return "ARM_OVERLAYSECTION";
3970 get_tic6x_section_type_name (unsigned int sh_type
)
3974 case SHT_C6000_UNWIND
:
3975 return "C6000_UNWIND";
3976 case SHT_C6000_PREEMPTMAP
:
3977 return "C6000_PREEMPTMAP";
3978 case SHT_C6000_ATTRIBUTES
:
3979 return "C6000_ATTRIBUTES";
3984 case SHT_TI_HANDLER
:
3985 return "TI_HANDLER";
3986 case SHT_TI_INITINFO
:
3987 return "TI_INITINFO";
3988 case SHT_TI_PHATTRS
:
3989 return "TI_PHATTRS";
3997 get_msp430x_section_type_name (unsigned int sh_type
)
4001 case SHT_MSP430_SEC_FLAGS
: return "MSP430_SEC_FLAGS";
4002 case SHT_MSP430_SYM_ALIASES
: return "MSP430_SYM_ALIASES";
4003 case SHT_MSP430_ATTRIBUTES
: return "MSP430_ATTRIBUTES";
4004 default: return NULL
;
4009 get_v850_section_type_name (unsigned int sh_type
)
4013 case SHT_V850_SCOMMON
: return "V850 Small Common";
4014 case SHT_V850_TCOMMON
: return "V850 Tiny Common";
4015 case SHT_V850_ZCOMMON
: return "V850 Zero Common";
4016 case SHT_RENESAS_IOP
: return "RENESAS IOP";
4017 case SHT_RENESAS_INFO
: return "RENESAS INFO";
4018 default: return NULL
;
4023 get_section_type_name (unsigned int sh_type
)
4025 static char buff
[32];
4026 const char * result
;
4030 case SHT_NULL
: return "NULL";
4031 case SHT_PROGBITS
: return "PROGBITS";
4032 case SHT_SYMTAB
: return "SYMTAB";
4033 case SHT_STRTAB
: return "STRTAB";
4034 case SHT_RELA
: return "RELA";
4035 case SHT_HASH
: return "HASH";
4036 case SHT_DYNAMIC
: return "DYNAMIC";
4037 case SHT_NOTE
: return "NOTE";
4038 case SHT_NOBITS
: return "NOBITS";
4039 case SHT_REL
: return "REL";
4040 case SHT_SHLIB
: return "SHLIB";
4041 case SHT_DYNSYM
: return "DYNSYM";
4042 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
4043 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
4044 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
4045 case SHT_GNU_HASH
: return "GNU_HASH";
4046 case SHT_GROUP
: return "GROUP";
4047 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
4048 case SHT_GNU_verdef
: return "VERDEF";
4049 case SHT_GNU_verneed
: return "VERNEED";
4050 case SHT_GNU_versym
: return "VERSYM";
4051 case 0x6ffffff0: return "VERSYM";
4052 case 0x6ffffffc: return "VERDEF";
4053 case 0x7ffffffd: return "AUXILIARY";
4054 case 0x7fffffff: return "FILTER";
4055 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
4058 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
4060 switch (elf_header
.e_machine
)
4063 case EM_MIPS_RS3_LE
:
4064 result
= get_mips_section_type_name (sh_type
);
4067 result
= get_parisc_section_type_name (sh_type
);
4070 result
= get_ia64_section_type_name (sh_type
);
4075 result
= get_x86_64_section_type_name (sh_type
);
4078 result
= get_aarch64_section_type_name (sh_type
);
4081 result
= get_arm_section_type_name (sh_type
);
4084 result
= get_tic6x_section_type_name (sh_type
);
4087 result
= get_msp430x_section_type_name (sh_type
);
4091 case EM_CYGNUS_V850
:
4092 result
= get_v850_section_type_name (sh_type
);
4102 sprintf (buff
, "LOPROC+%#x", sh_type
- SHT_LOPROC
);
4104 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
4106 switch (elf_header
.e_machine
)
4109 result
= get_ia64_section_type_name (sh_type
);
4112 if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_SOLARIS
)
4113 result
= get_solaris_section_type (sh_type
);
4122 sprintf (buff
, "LOOS+%#x", sh_type
- SHT_LOOS
);
4124 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
4126 switch (elf_header
.e_machine
)
4130 case EM_CYGNUS_V850
:
4131 result
= get_v850_section_type_name (sh_type
);
4141 sprintf (buff
, "LOUSER+%#x", sh_type
- SHT_LOUSER
);
4144 /* This message is probably going to be displayed in a 15
4145 character wide field, so put the hex value first. */
4146 snprintf (buff
, sizeof (buff
), _("%08x: <unknown>"), sh_type
);
4152 #define OPTION_DEBUG_DUMP 512
4153 #define OPTION_DYN_SYMS 513
4154 #define OPTION_DWARF_DEPTH 514
4155 #define OPTION_DWARF_START 515
4156 #define OPTION_DWARF_CHECK 516
4158 static struct option options
[] =
4160 {"all", no_argument
, 0, 'a'},
4161 {"file-header", no_argument
, 0, 'h'},
4162 {"program-headers", no_argument
, 0, 'l'},
4163 {"headers", no_argument
, 0, 'e'},
4164 {"histogram", no_argument
, 0, 'I'},
4165 {"segments", no_argument
, 0, 'l'},
4166 {"sections", no_argument
, 0, 'S'},
4167 {"section-headers", no_argument
, 0, 'S'},
4168 {"section-groups", no_argument
, 0, 'g'},
4169 {"section-details", no_argument
, 0, 't'},
4170 {"full-section-name",no_argument
, 0, 'N'},
4171 {"symbols", no_argument
, 0, 's'},
4172 {"syms", no_argument
, 0, 's'},
4173 {"dyn-syms", no_argument
, 0, OPTION_DYN_SYMS
},
4174 {"relocs", no_argument
, 0, 'r'},
4175 {"notes", no_argument
, 0, 'n'},
4176 {"dynamic", no_argument
, 0, 'd'},
4177 {"arch-specific", no_argument
, 0, 'A'},
4178 {"version-info", no_argument
, 0, 'V'},
4179 {"use-dynamic", no_argument
, 0, 'D'},
4180 {"unwind", no_argument
, 0, 'u'},
4181 {"archive-index", no_argument
, 0, 'c'},
4182 {"hex-dump", required_argument
, 0, 'x'},
4183 {"relocated-dump", required_argument
, 0, 'R'},
4184 {"string-dump", required_argument
, 0, 'p'},
4185 {"decompress", no_argument
, 0, 'z'},
4186 #ifdef SUPPORT_DISASSEMBLY
4187 {"instruction-dump", required_argument
, 0, 'i'},
4189 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
4191 {"dwarf-depth", required_argument
, 0, OPTION_DWARF_DEPTH
},
4192 {"dwarf-start", required_argument
, 0, OPTION_DWARF_START
},
4193 {"dwarf-check", no_argument
, 0, OPTION_DWARF_CHECK
},
4195 {"version", no_argument
, 0, 'v'},
4196 {"wide", no_argument
, 0, 'W'},
4197 {"help", no_argument
, 0, 'H'},
4198 {0, no_argument
, 0, 0}
4202 usage (FILE * stream
)
4204 fprintf (stream
, _("Usage: readelf <option(s)> elf-file(s)\n"));
4205 fprintf (stream
, _(" Display information about the contents of ELF format files\n"));
4206 fprintf (stream
, _(" Options are:\n\
4207 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4208 -h --file-header Display the ELF file header\n\
4209 -l --program-headers Display the program headers\n\
4210 --segments An alias for --program-headers\n\
4211 -S --section-headers Display the sections' header\n\
4212 --sections An alias for --section-headers\n\
4213 -g --section-groups Display the section groups\n\
4214 -t --section-details Display the section details\n\
4215 -e --headers Equivalent to: -h -l -S\n\
4216 -s --syms Display the symbol table\n\
4217 --symbols An alias for --syms\n\
4218 --dyn-syms Display the dynamic symbol table\n\
4219 -n --notes Display the core notes (if present)\n\
4220 -r --relocs Display the relocations (if present)\n\
4221 -u --unwind Display the unwind info (if present)\n\
4222 -d --dynamic Display the dynamic section (if present)\n\
4223 -V --version-info Display the version sections (if present)\n\
4224 -A --arch-specific Display architecture specific information (if any)\n\
4225 -c --archive-index Display the symbol/file index in an archive\n\
4226 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
4227 -x --hex-dump=<number|name>\n\
4228 Dump the contents of section <number|name> as bytes\n\
4229 -p --string-dump=<number|name>\n\
4230 Dump the contents of section <number|name> as strings\n\
4231 -R --relocated-dump=<number|name>\n\
4232 Dump the contents of section <number|name> as relocated bytes\n\
4233 -z --decompress Decompress section before dumping it\n\
4234 -w[lLiaprmfFsoRt] or\n\
4235 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4236 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4237 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4239 Display the contents of DWARF2 debug sections\n"));
4240 fprintf (stream
, _("\
4241 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4242 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4244 #ifdef SUPPORT_DISASSEMBLY
4245 fprintf (stream
, _("\
4246 -i --instruction-dump=<number|name>\n\
4247 Disassemble the contents of section <number|name>\n"));
4249 fprintf (stream
, _("\
4250 -I --histogram Display histogram of bucket list lengths\n\
4251 -W --wide Allow output width to exceed 80 characters\n\
4252 @<file> Read options from <file>\n\
4253 -H --help Display this information\n\
4254 -v --version Display the version number of readelf\n"));
4256 if (REPORT_BUGS_TO
[0] && stream
== stdout
)
4257 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
4259 exit (stream
== stdout
? 0 : 1);
4262 /* Record the fact that the user wants the contents of section number
4263 SECTION to be displayed using the method(s) encoded as flags bits
4264 in TYPE. Note, TYPE can be zero if we are creating the array for
4268 request_dump_bynumber (unsigned int section
, dump_type type
)
4270 if (section
>= num_dump_sects
)
4272 dump_type
* new_dump_sects
;
4274 new_dump_sects
= (dump_type
*) calloc (section
+ 1,
4275 sizeof (* dump_sects
));
4277 if (new_dump_sects
== NULL
)
4278 error (_("Out of memory allocating dump request table.\n"));
4283 /* Copy current flag settings. */
4284 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
* sizeof (* dump_sects
));
4289 dump_sects
= new_dump_sects
;
4290 num_dump_sects
= section
+ 1;
4295 dump_sects
[section
] |= type
;
4300 /* Request a dump by section name. */
4303 request_dump_byname (const char * section
, dump_type type
)
4305 struct dump_list_entry
* new_request
;
4307 new_request
= (struct dump_list_entry
*)
4308 malloc (sizeof (struct dump_list_entry
));
4310 error (_("Out of memory allocating dump request table.\n"));
4312 new_request
->name
= strdup (section
);
4313 if (!new_request
->name
)
4314 error (_("Out of memory allocating dump request table.\n"));
4316 new_request
->type
= type
;
4318 new_request
->next
= dump_sects_byname
;
4319 dump_sects_byname
= new_request
;
4323 request_dump (dump_type type
)
4329 section
= strtoul (optarg
, & cp
, 0);
4331 if (! *cp
&& section
>= 0)
4332 request_dump_bynumber (section
, type
);
4334 request_dump_byname (optarg
, type
);
4339 parse_args (int argc
, char ** argv
)
4346 while ((c
= getopt_long
4347 (argc
, argv
, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options
, NULL
)) != EOF
)
4365 do_section_groups
++;
4373 do_section_groups
++;
4378 do_section_details
++;
4422 request_dump (HEX_DUMP
);
4425 request_dump (STRING_DUMP
);
4428 request_dump (RELOC_DUMP
);
4438 dwarf_select_sections_all ();
4443 dwarf_select_sections_by_letters (optarg
);
4446 case OPTION_DEBUG_DUMP
:
4453 dwarf_select_sections_by_names (optarg
);
4456 case OPTION_DWARF_DEPTH
:
4460 dwarf_cutoff_level
= strtoul (optarg
, & cp
, 0);
4463 case OPTION_DWARF_START
:
4467 dwarf_start_die
= strtoul (optarg
, & cp
, 0);
4470 case OPTION_DWARF_CHECK
:
4473 case OPTION_DYN_SYMS
:
4476 #ifdef SUPPORT_DISASSEMBLY
4478 request_dump (DISASS_DUMP
);
4482 print_version (program_name
);
4491 /* xgettext:c-format */
4492 error (_("Invalid option '-%c'\n"), c
);
4499 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
4500 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
4501 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
4502 && !do_section_groups
&& !do_archive_index
4508 get_elf_class (unsigned int elf_class
)
4510 static char buff
[32];
4514 case ELFCLASSNONE
: return _("none");
4515 case ELFCLASS32
: return "ELF32";
4516 case ELFCLASS64
: return "ELF64";
4518 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), elf_class
);
4524 get_data_encoding (unsigned int encoding
)
4526 static char buff
[32];
4530 case ELFDATANONE
: return _("none");
4531 case ELFDATA2LSB
: return _("2's complement, little endian");
4532 case ELFDATA2MSB
: return _("2's complement, big endian");
4534 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), encoding
);
4539 /* Decode the data held in 'elf_header'. */
4542 process_file_header (void)
4544 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
4545 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
4546 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
4547 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
4550 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4554 init_dwarf_regnames (elf_header
.e_machine
);
4560 printf (_("ELF Header:\n"));
4561 printf (_(" Magic: "));
4562 for (i
= 0; i
< EI_NIDENT
; i
++)
4563 printf ("%2.2x ", elf_header
.e_ident
[i
]);
4565 printf (_(" Class: %s\n"),
4566 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
4567 printf (_(" Data: %s\n"),
4568 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
4569 printf (_(" Version: %d %s\n"),
4570 elf_header
.e_ident
[EI_VERSION
],
4571 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
4573 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
4574 ? _("<unknown: %lx>")
4576 printf (_(" OS/ABI: %s\n"),
4577 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
4578 printf (_(" ABI Version: %d\n"),
4579 elf_header
.e_ident
[EI_ABIVERSION
]);
4580 printf (_(" Type: %s\n"),
4581 get_file_type (elf_header
.e_type
));
4582 printf (_(" Machine: %s\n"),
4583 get_machine_name (elf_header
.e_machine
));
4584 printf (_(" Version: 0x%lx\n"),
4585 (unsigned long) elf_header
.e_version
);
4587 printf (_(" Entry point address: "));
4588 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
4589 printf (_("\n Start of program headers: "));
4590 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
4591 printf (_(" (bytes into file)\n Start of section headers: "));
4592 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
4593 printf (_(" (bytes into file)\n"));
4595 printf (_(" Flags: 0x%lx%s\n"),
4596 (unsigned long) elf_header
.e_flags
,
4597 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
4598 printf (_(" Size of this header: %ld (bytes)\n"),
4599 (long) elf_header
.e_ehsize
);
4600 printf (_(" Size of program headers: %ld (bytes)\n"),
4601 (long) elf_header
.e_phentsize
);
4602 printf (_(" Number of program headers: %ld"),
4603 (long) elf_header
.e_phnum
);
4604 if (section_headers
!= NULL
4605 && elf_header
.e_phnum
== PN_XNUM
4606 && section_headers
[0].sh_info
!= 0)
4607 printf (" (%ld)", (long) section_headers
[0].sh_info
);
4608 putc ('\n', stdout
);
4609 printf (_(" Size of section headers: %ld (bytes)\n"),
4610 (long) elf_header
.e_shentsize
);
4611 printf (_(" Number of section headers: %ld"),
4612 (long) elf_header
.e_shnum
);
4613 if (section_headers
!= NULL
&& elf_header
.e_shnum
== SHN_UNDEF
)
4614 printf (" (%ld)", (long) section_headers
[0].sh_size
);
4615 putc ('\n', stdout
);
4616 printf (_(" Section header string table index: %ld"),
4617 (long) elf_header
.e_shstrndx
);
4618 if (section_headers
!= NULL
4619 && elf_header
.e_shstrndx
== (SHN_XINDEX
& 0xffff))
4620 printf (" (%u)", section_headers
[0].sh_link
);
4621 else if (elf_header
.e_shstrndx
!= SHN_UNDEF
4622 && elf_header
.e_shstrndx
>= elf_header
.e_shnum
)
4623 printf (_(" <corrupt: out of range>"));
4624 putc ('\n', stdout
);
4627 if (section_headers
!= NULL
)
4629 if (elf_header
.e_phnum
== PN_XNUM
4630 && section_headers
[0].sh_info
!= 0)
4631 elf_header
.e_phnum
= section_headers
[0].sh_info
;
4632 if (elf_header
.e_shnum
== SHN_UNDEF
)
4633 elf_header
.e_shnum
= section_headers
[0].sh_size
;
4634 if (elf_header
.e_shstrndx
== (SHN_XINDEX
& 0xffff))
4635 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
4636 else if (elf_header
.e_shstrndx
>= elf_header
.e_shnum
)
4637 elf_header
.e_shstrndx
= SHN_UNDEF
;
4638 free (section_headers
);
4639 section_headers
= NULL
;
4646 get_32bit_program_headers (FILE * file
, Elf_Internal_Phdr
* pheaders
)
4648 Elf32_External_Phdr
* phdrs
;
4649 Elf32_External_Phdr
* external
;
4650 Elf_Internal_Phdr
* internal
;
4652 unsigned int size
= elf_header
.e_phentsize
;
4653 unsigned int num
= elf_header
.e_phnum
;
4655 /* PR binutils/17531: Cope with unexpected section header sizes. */
4656 if (size
== 0 || num
== 0)
4658 if (size
< sizeof * phdrs
)
4660 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4663 if (size
> sizeof * phdrs
)
4664 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4666 phdrs
= (Elf32_External_Phdr
*) get_data (NULL
, file
, elf_header
.e_phoff
,
4667 size
, num
, _("program headers"));
4671 for (i
= 0, internal
= pheaders
, external
= phdrs
;
4672 i
< elf_header
.e_phnum
;
4673 i
++, internal
++, external
++)
4675 internal
->p_type
= BYTE_GET (external
->p_type
);
4676 internal
->p_offset
= BYTE_GET (external
->p_offset
);
4677 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
4678 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
4679 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
4680 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
4681 internal
->p_flags
= BYTE_GET (external
->p_flags
);
4682 internal
->p_align
= BYTE_GET (external
->p_align
);
4690 get_64bit_program_headers (FILE * file
, Elf_Internal_Phdr
* pheaders
)
4692 Elf64_External_Phdr
* phdrs
;
4693 Elf64_External_Phdr
* external
;
4694 Elf_Internal_Phdr
* internal
;
4696 unsigned int size
= elf_header
.e_phentsize
;
4697 unsigned int num
= elf_header
.e_phnum
;
4699 /* PR binutils/17531: Cope with unexpected section header sizes. */
4700 if (size
== 0 || num
== 0)
4702 if (size
< sizeof * phdrs
)
4704 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4707 if (size
> sizeof * phdrs
)
4708 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4710 phdrs
= (Elf64_External_Phdr
*) get_data (NULL
, file
, elf_header
.e_phoff
,
4711 size
, num
, _("program headers"));
4715 for (i
= 0, internal
= pheaders
, external
= phdrs
;
4716 i
< elf_header
.e_phnum
;
4717 i
++, internal
++, external
++)
4719 internal
->p_type
= BYTE_GET (external
->p_type
);
4720 internal
->p_flags
= BYTE_GET (external
->p_flags
);
4721 internal
->p_offset
= BYTE_GET (external
->p_offset
);
4722 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
4723 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
4724 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
4725 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
4726 internal
->p_align
= BYTE_GET (external
->p_align
);
4733 /* Returns 1 if the program headers were read into `program_headers'. */
4736 get_program_headers (FILE * file
)
4738 Elf_Internal_Phdr
* phdrs
;
4740 /* Check cache of prior read. */
4741 if (program_headers
!= NULL
)
4744 phdrs
= (Elf_Internal_Phdr
*) cmalloc (elf_header
.e_phnum
,
4745 sizeof (Elf_Internal_Phdr
));
4749 error (_("Out of memory reading %u program headers\n"),
4750 elf_header
.e_phnum
);
4755 ? get_32bit_program_headers (file
, phdrs
)
4756 : get_64bit_program_headers (file
, phdrs
))
4758 program_headers
= phdrs
;
4766 /* Returns 1 if the program headers were loaded. */
4769 process_program_headers (FILE * file
)
4771 Elf_Internal_Phdr
* segment
;
4773 Elf_Internal_Phdr
* previous_load
= NULL
;
4775 if (elf_header
.e_phnum
== 0)
4777 /* PR binutils/12467. */
4778 if (elf_header
.e_phoff
!= 0)
4779 warn (_("possibly corrupt ELF header - it has a non-zero program"
4780 " header offset, but no program headers\n"));
4781 else if (do_segments
)
4782 printf (_("\nThere are no program headers in this file.\n"));
4786 if (do_segments
&& !do_header
)
4788 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
4789 printf (_("Entry point "));
4790 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
4791 printf (_("\nThere are %d program headers, starting at offset "),
4792 elf_header
.e_phnum
);
4793 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
4797 if (! get_program_headers (file
))
4802 if (elf_header
.e_phnum
> 1)
4803 printf (_("\nProgram Headers:\n"));
4805 printf (_("\nProgram Headers:\n"));
4809 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4812 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4816 (_(" Type Offset VirtAddr PhysAddr\n"));
4818 (_(" FileSiz MemSiz Flags Align\n"));
4825 for (i
= 0, segment
= program_headers
;
4826 i
< elf_header
.e_phnum
;
4831 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
4835 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
4836 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
4837 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
4838 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
4839 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
4841 (segment
->p_flags
& PF_R
? 'R' : ' '),
4842 (segment
->p_flags
& PF_W
? 'W' : ' '),
4843 (segment
->p_flags
& PF_X
? 'E' : ' '));
4844 printf ("%#lx", (unsigned long) segment
->p_align
);
4848 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
4849 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
4852 print_vma (segment
->p_offset
, FULL_HEX
);
4856 print_vma (segment
->p_vaddr
, FULL_HEX
);
4858 print_vma (segment
->p_paddr
, FULL_HEX
);
4861 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
4862 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
4865 print_vma (segment
->p_filesz
, FULL_HEX
);
4869 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
4870 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
4873 print_vma (segment
->p_memsz
, FULL_HEX
);
4877 (segment
->p_flags
& PF_R
? 'R' : ' '),
4878 (segment
->p_flags
& PF_W
? 'W' : ' '),
4879 (segment
->p_flags
& PF_X
? 'E' : ' '));
4881 if ((unsigned long) segment
->p_align
== segment
->p_align
)
4882 printf ("%#lx", (unsigned long) segment
->p_align
);
4885 print_vma (segment
->p_align
, PREFIX_HEX
);
4890 print_vma (segment
->p_offset
, FULL_HEX
);
4892 print_vma (segment
->p_vaddr
, FULL_HEX
);
4894 print_vma (segment
->p_paddr
, FULL_HEX
);
4896 print_vma (segment
->p_filesz
, FULL_HEX
);
4898 print_vma (segment
->p_memsz
, FULL_HEX
);
4900 (segment
->p_flags
& PF_R
? 'R' : ' '),
4901 (segment
->p_flags
& PF_W
? 'W' : ' '),
4902 (segment
->p_flags
& PF_X
? 'E' : ' '));
4903 print_vma (segment
->p_align
, HEX
);
4906 putc ('\n', stdout
);
4909 switch (segment
->p_type
)
4912 #if 0 /* Do not warn about out of order PT_LOAD segments. Although officially
4913 required by the ELF standard, several programs, including the Linux
4914 kernel, make use of non-ordered segments. */
4916 && previous_load
->p_vaddr
> segment
->p_vaddr
)
4917 error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
4919 if (segment
->p_memsz
< segment
->p_filesz
)
4920 error (_("the segment's file size is larger than its memory size\n"));
4921 previous_load
= segment
;
4925 /* PR 20815 - Verify that the program header is loaded into memory. */
4926 if (i
> 0 && previous_load
!= NULL
)
4927 error (_("the PHDR segment must occur before any LOAD segment\n"));
4928 if (elf_header
.e_machine
!= EM_PARISC
)
4932 for (j
= 1; j
< elf_header
.e_phnum
; j
++)
4933 if (program_headers
[j
].p_vaddr
<= segment
->p_vaddr
4934 && (program_headers
[j
].p_vaddr
+ program_headers
[j
].p_memsz
)
4935 >= (segment
->p_vaddr
+ segment
->p_filesz
))
4937 if (j
== elf_header
.e_phnum
)
4938 error (_("the PHDR segment is not covered by a LOAD segment\n"));
4944 error (_("more than one dynamic segment\n"));
4946 /* By default, assume that the .dynamic section is the first
4947 section in the DYNAMIC segment. */
4948 dynamic_addr
= segment
->p_offset
;
4949 dynamic_size
= segment
->p_filesz
;
4950 /* PR binutils/17512: Avoid corrupt dynamic section info in the segment. */
4951 if (dynamic_addr
+ dynamic_size
>= current_file_size
)
4953 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4954 dynamic_addr
= dynamic_size
= 0;
4957 /* Try to locate the .dynamic section. If there is
4958 a section header table, we can easily locate it. */
4959 if (section_headers
!= NULL
)
4961 Elf_Internal_Shdr
* sec
;
4963 sec
= find_section (".dynamic");
4964 if (sec
== NULL
|| sec
->sh_size
== 0)
4966 /* A corresponding .dynamic section is expected, but on
4967 IA-64/OpenVMS it is OK for it to be missing. */
4968 if (!is_ia64_vms ())
4969 error (_("no .dynamic section in the dynamic segment\n"));
4973 if (sec
->sh_type
== SHT_NOBITS
)
4979 dynamic_addr
= sec
->sh_offset
;
4980 dynamic_size
= sec
->sh_size
;
4982 if (dynamic_addr
< segment
->p_offset
4983 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
4984 warn (_("the .dynamic section is not contained"
4985 " within the dynamic segment\n"));
4986 else if (dynamic_addr
> segment
->p_offset
)
4987 warn (_("the .dynamic section is not the first section"
4988 " in the dynamic segment.\n"));
4993 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
4995 error (_("Unable to find program interpreter name\n"));
4999 int ret
= snprintf (fmt
, sizeof (fmt
), "%%%ds", PATH_MAX
- 1);
5001 if (ret
>= (int) sizeof (fmt
) || ret
< 0)
5002 error (_("Internal error: failed to create format string to display program interpreter\n"));
5004 program_interpreter
[0] = 0;
5005 if (fscanf (file
, fmt
, program_interpreter
) <= 0)
5006 error (_("Unable to read program interpreter name\n"));
5009 printf (_(" [Requesting program interpreter: %s]\n"),
5010 program_interpreter
);
5016 if (do_segments
&& section_headers
!= NULL
&& string_table
!= NULL
)
5018 printf (_("\n Section to Segment mapping:\n"));
5019 printf (_(" Segment Sections...\n"));
5021 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
5024 Elf_Internal_Shdr
* section
;
5026 segment
= program_headers
+ i
;
5027 section
= section_headers
+ 1;
5029 printf (" %2.2d ", i
);
5031 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
5033 if (!ELF_TBSS_SPECIAL (section
, segment
)
5034 && ELF_SECTION_IN_SEGMENT_STRICT (section
, segment
))
5035 printf ("%s ", printable_section_name (section
));
5046 /* Find the file offset corresponding to VMA by using the program headers. */
5049 offset_from_vma (FILE * file
, bfd_vma vma
, bfd_size_type size
)
5051 Elf_Internal_Phdr
* seg
;
5053 if (! get_program_headers (file
))
5055 warn (_("Cannot interpret virtual addresses without program headers.\n"));
5059 for (seg
= program_headers
;
5060 seg
< program_headers
+ elf_header
.e_phnum
;
5063 if (seg
->p_type
!= PT_LOAD
)
5066 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
5067 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
5068 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
5071 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5072 (unsigned long) vma
);
5077 /* Allocate memory and load the sections headers into the global pointer
5078 SECTION_HEADERS. If PROBE is true, this is just a probe and we do not
5079 generate any error messages if the load fails. */
5082 get_32bit_section_headers (FILE * file
, bfd_boolean probe
)
5084 Elf32_External_Shdr
* shdrs
;
5085 Elf_Internal_Shdr
* internal
;
5087 unsigned int size
= elf_header
.e_shentsize
;
5088 unsigned int num
= probe
? 1 : elf_header
.e_shnum
;
5090 /* PR binutils/17531: Cope with unexpected section header sizes. */
5091 if (size
== 0 || num
== 0)
5093 if (size
< sizeof * shdrs
)
5096 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5099 if (!probe
&& size
> sizeof * shdrs
)
5100 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5102 shdrs
= (Elf32_External_Shdr
*) get_data (NULL
, file
, elf_header
.e_shoff
,
5104 probe
? NULL
: _("section headers"));
5108 if (section_headers
!= NULL
)
5109 free (section_headers
);
5110 section_headers
= (Elf_Internal_Shdr
*) cmalloc (num
,
5111 sizeof (Elf_Internal_Shdr
));
5112 if (section_headers
== NULL
)
5115 error (_("Out of memory reading %u section headers\n"), num
);
5119 for (i
= 0, internal
= section_headers
;
5123 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
5124 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
5125 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
5126 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
5127 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
5128 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
5129 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
5130 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
5131 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
5132 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
5133 if (!probe
&& internal
->sh_link
> num
)
5134 warn (_("Section %u has an out of range sh_link value of %u\n"), i
, internal
->sh_link
);
5135 if (!probe
&& internal
->sh_flags
& SHF_INFO_LINK
&& internal
->sh_info
> num
)
5136 warn (_("Section %u has an out of range sh_info value of %u\n"), i
, internal
->sh_info
);
5144 get_64bit_section_headers (FILE * file
, bfd_boolean probe
)
5146 Elf64_External_Shdr
* shdrs
;
5147 Elf_Internal_Shdr
* internal
;
5149 unsigned int size
= elf_header
.e_shentsize
;
5150 unsigned int num
= probe
? 1 : elf_header
.e_shnum
;
5152 /* PR binutils/17531: Cope with unexpected section header sizes. */
5153 if (size
== 0 || num
== 0)
5155 if (size
< sizeof * shdrs
)
5158 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5161 if (! probe
&& size
> sizeof * shdrs
)
5162 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5164 shdrs
= (Elf64_External_Shdr
*) get_data (NULL
, file
, elf_header
.e_shoff
,
5166 probe
? NULL
: _("section headers"));
5170 if (section_headers
!= NULL
)
5171 free (section_headers
);
5172 section_headers
= (Elf_Internal_Shdr
*) cmalloc (num
,
5173 sizeof (Elf_Internal_Shdr
));
5174 if (section_headers
== NULL
)
5177 error (_("Out of memory reading %u section headers\n"), num
);
5181 for (i
= 0, internal
= section_headers
;
5185 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
5186 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
5187 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
5188 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
5189 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
5190 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
5191 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
5192 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
5193 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
5194 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
5195 if (!probe
&& internal
->sh_link
> num
)
5196 warn (_("Section %u has an out of range sh_link value of %u\n"), i
, internal
->sh_link
);
5197 if (!probe
&& internal
->sh_flags
& SHF_INFO_LINK
&& internal
->sh_info
> num
)
5198 warn (_("Section %u has an out of range sh_info value of %u\n"), i
, internal
->sh_info
);
5205 static Elf_Internal_Sym
*
5206 get_32bit_elf_symbols (FILE * file
,
5207 Elf_Internal_Shdr
* section
,
5208 unsigned long * num_syms_return
)
5210 unsigned long number
= 0;
5211 Elf32_External_Sym
* esyms
= NULL
;
5212 Elf_External_Sym_Shndx
* shndx
= NULL
;
5213 Elf_Internal_Sym
* isyms
= NULL
;
5214 Elf_Internal_Sym
* psym
;
5217 if (section
->sh_size
== 0)
5219 if (num_syms_return
!= NULL
)
5220 * num_syms_return
= 0;
5224 /* Run some sanity checks first. */
5225 if (section
->sh_entsize
== 0 || section
->sh_entsize
> section
->sh_size
)
5227 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5228 printable_section_name (section
), (unsigned long) section
->sh_entsize
);
5232 if (section
->sh_size
> current_file_size
)
5234 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5235 printable_section_name (section
), (unsigned long) section
->sh_size
);
5239 number
= section
->sh_size
/ section
->sh_entsize
;
5241 if (number
* sizeof (Elf32_External_Sym
) > section
->sh_size
+ 1)
5243 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5244 (unsigned long) section
->sh_size
,
5245 printable_section_name (section
),
5246 (unsigned long) section
->sh_entsize
);
5250 esyms
= (Elf32_External_Sym
*) get_data (NULL
, file
, section
->sh_offset
, 1,
5251 section
->sh_size
, _("symbols"));
5256 elf_section_list
* entry
;
5259 for (entry
= symtab_shndx_list
; entry
!= NULL
; entry
= entry
->next
)
5260 if (entry
->hdr
->sh_link
== (unsigned long) (section
- section_headers
))
5262 shndx
= (Elf_External_Sym_Shndx
*) get_data (NULL
, file
,
5263 entry
->hdr
->sh_offset
,
5264 1, entry
->hdr
->sh_size
,
5265 _("symbol table section indicies"));
5268 /* PR17531: file: heap-buffer-overflow */
5269 else if (entry
->hdr
->sh_size
/ sizeof (Elf_External_Sym_Shndx
) < number
)
5271 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5272 printable_section_name (entry
->hdr
),
5273 (unsigned long) entry
->hdr
->sh_size
,
5274 (unsigned long) section
->sh_size
);
5280 isyms
= (Elf_Internal_Sym
*) cmalloc (number
, sizeof (Elf_Internal_Sym
));
5284 error (_("Out of memory reading %lu symbols\n"),
5285 (unsigned long) number
);
5289 for (j
= 0, psym
= isyms
; j
< number
; j
++, psym
++)
5291 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
5292 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
5293 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
5294 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
5295 if (psym
->st_shndx
== (SHN_XINDEX
& 0xffff) && shndx
!= NULL
)
5297 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
5298 else if (psym
->st_shndx
>= (SHN_LORESERVE
& 0xffff))
5299 psym
->st_shndx
+= SHN_LORESERVE
- (SHN_LORESERVE
& 0xffff);
5300 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
5301 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
5310 if (num_syms_return
!= NULL
)
5311 * num_syms_return
= isyms
== NULL
? 0 : number
;
5316 static Elf_Internal_Sym
*
5317 get_64bit_elf_symbols (FILE * file
,
5318 Elf_Internal_Shdr
* section
,
5319 unsigned long * num_syms_return
)
5321 unsigned long number
= 0;
5322 Elf64_External_Sym
* esyms
= NULL
;
5323 Elf_External_Sym_Shndx
* shndx
= NULL
;
5324 Elf_Internal_Sym
* isyms
= NULL
;
5325 Elf_Internal_Sym
* psym
;
5328 if (section
->sh_size
== 0)
5330 if (num_syms_return
!= NULL
)
5331 * num_syms_return
= 0;
5335 /* Run some sanity checks first. */
5336 if (section
->sh_entsize
== 0 || section
->sh_entsize
> section
->sh_size
)
5338 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5339 printable_section_name (section
),
5340 (unsigned long) section
->sh_entsize
);
5344 if (section
->sh_size
> current_file_size
)
5346 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5347 printable_section_name (section
),
5348 (unsigned long) section
->sh_size
);
5352 number
= section
->sh_size
/ section
->sh_entsize
;
5354 if (number
* sizeof (Elf64_External_Sym
) > section
->sh_size
+ 1)
5356 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5357 (unsigned long) section
->sh_size
,
5358 printable_section_name (section
),
5359 (unsigned long) section
->sh_entsize
);
5363 esyms
= (Elf64_External_Sym
*) get_data (NULL
, file
, section
->sh_offset
, 1,
5364 section
->sh_size
, _("symbols"));
5369 elf_section_list
* entry
;
5372 for (entry
= symtab_shndx_list
; entry
!= NULL
; entry
= entry
->next
)
5373 if (entry
->hdr
->sh_link
== (unsigned long) (section
- section_headers
))
5375 shndx
= (Elf_External_Sym_Shndx
*) get_data (NULL
, file
,
5376 entry
->hdr
->sh_offset
,
5377 1, entry
->hdr
->sh_size
,
5378 _("symbol table section indicies"));
5381 /* PR17531: file: heap-buffer-overflow */
5382 else if (entry
->hdr
->sh_size
/ sizeof (Elf_External_Sym_Shndx
) < number
)
5384 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5385 printable_section_name (entry
->hdr
),
5386 (unsigned long) entry
->hdr
->sh_size
,
5387 (unsigned long) section
->sh_size
);
5393 isyms
= (Elf_Internal_Sym
*) cmalloc (number
, sizeof (Elf_Internal_Sym
));
5397 error (_("Out of memory reading %lu symbols\n"),
5398 (unsigned long) number
);
5402 for (j
= 0, psym
= isyms
; j
< number
; j
++, psym
++)
5404 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
5405 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
5406 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
5407 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
5409 if (psym
->st_shndx
== (SHN_XINDEX
& 0xffff) && shndx
!= NULL
)
5411 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
5412 else if (psym
->st_shndx
>= (SHN_LORESERVE
& 0xffff))
5413 psym
->st_shndx
+= SHN_LORESERVE
- (SHN_LORESERVE
& 0xffff);
5415 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
5416 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
5425 if (num_syms_return
!= NULL
)
5426 * num_syms_return
= isyms
== NULL
? 0 : number
;
5432 get_elf_section_flags (bfd_vma sh_flags
)
5434 static char buff
[1024];
5436 int field_size
= is_32bit_elf
? 8 : 16;
5438 int size
= sizeof (buff
) - (field_size
+ 4 + 1);
5439 bfd_vma os_flags
= 0;
5440 bfd_vma proc_flags
= 0;
5441 bfd_vma unknown_flags
= 0;
5449 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5450 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5451 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5452 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5453 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5454 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5455 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5456 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5457 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5458 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5459 /* IA-64 specific. */
5460 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5461 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5462 /* IA-64 OpenVMS specific. */
5463 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5464 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5465 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5466 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5467 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5468 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5470 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5471 /* SPARC specific. */
5472 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5473 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5475 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5476 /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5477 /* 23 */ { STRING_COMMA_LEN ("COMDEF") }
5480 if (do_section_details
)
5482 sprintf (buff
, "[%*.*lx]: ",
5483 field_size
, field_size
, (unsigned long) sh_flags
);
5484 p
+= field_size
+ 4;
5491 flag
= sh_flags
& - sh_flags
;
5494 if (do_section_details
)
5498 case SHF_WRITE
: sindex
= 0; break;
5499 case SHF_ALLOC
: sindex
= 1; break;
5500 case SHF_EXECINSTR
: sindex
= 2; break;
5501 case SHF_MERGE
: sindex
= 3; break;
5502 case SHF_STRINGS
: sindex
= 4; break;
5503 case SHF_INFO_LINK
: sindex
= 5; break;
5504 case SHF_LINK_ORDER
: sindex
= 6; break;
5505 case SHF_OS_NONCONFORMING
: sindex
= 7; break;
5506 case SHF_GROUP
: sindex
= 8; break;
5507 case SHF_TLS
: sindex
= 9; break;
5508 case SHF_EXCLUDE
: sindex
= 18; break;
5509 case SHF_COMPRESSED
: sindex
= 20; break;
5513 switch (elf_header
.e_machine
)
5516 if (flag
== SHF_IA_64_SHORT
)
5518 else if (flag
== SHF_IA_64_NORECOV
)
5521 else if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_OPENVMS
)
5524 case SHF_IA_64_VMS_GLOBAL
: sindex
= 12; break;
5525 case SHF_IA_64_VMS_OVERLAID
: sindex
= 13; break;
5526 case SHF_IA_64_VMS_SHARED
: sindex
= 14; break;
5527 case SHF_IA_64_VMS_VECTOR
: sindex
= 15; break;
5528 case SHF_IA_64_VMS_ALLOC_64BIT
: sindex
= 16; break;
5529 case SHF_IA_64_VMS_PROTECTED
: sindex
= 17; break;
5540 case EM_OLD_SPARCV9
:
5541 case EM_SPARC32PLUS
:
5544 if (flag
== SHF_ORDERED
)
5551 case SHF_ENTRYSECT
: sindex
= 21; break;
5552 case SHF_ARM_PURECODE
: sindex
= 22; break;
5553 case SHF_COMDEF
: sindex
= 23; break;
5565 if (p
!= buff
+ field_size
+ 4)
5567 if (size
< (10 + 2))
5569 warn (_("Internal error: not enough buffer room for section flag info"));
5570 return _("<unknown>");
5577 size
-= flags
[sindex
].len
;
5578 p
= stpcpy (p
, flags
[sindex
].str
);
5580 else if (flag
& SHF_MASKOS
)
5582 else if (flag
& SHF_MASKPROC
)
5585 unknown_flags
|= flag
;
5591 case SHF_WRITE
: *p
= 'W'; break;
5592 case SHF_ALLOC
: *p
= 'A'; break;
5593 case SHF_EXECINSTR
: *p
= 'X'; break;
5594 case SHF_MERGE
: *p
= 'M'; break;
5595 case SHF_STRINGS
: *p
= 'S'; break;
5596 case SHF_INFO_LINK
: *p
= 'I'; break;
5597 case SHF_LINK_ORDER
: *p
= 'L'; break;
5598 case SHF_OS_NONCONFORMING
: *p
= 'O'; break;
5599 case SHF_GROUP
: *p
= 'G'; break;
5600 case SHF_TLS
: *p
= 'T'; break;
5601 case SHF_EXCLUDE
: *p
= 'E'; break;
5602 case SHF_COMPRESSED
: *p
= 'C'; break;
5605 if ((elf_header
.e_machine
== EM_X86_64
5606 || elf_header
.e_machine
== EM_L1OM
5607 || elf_header
.e_machine
== EM_K1OM
)
5608 && flag
== SHF_X86_64_LARGE
)
5610 else if (elf_header
.e_machine
== EM_ARM
5611 && flag
== SHF_ARM_PURECODE
)
5613 else if (flag
& SHF_MASKOS
)
5616 sh_flags
&= ~ SHF_MASKOS
;
5618 else if (flag
& SHF_MASKPROC
)
5621 sh_flags
&= ~ SHF_MASKPROC
;
5631 if (do_section_details
)
5635 size
-= 5 + field_size
;
5636 if (p
!= buff
+ field_size
+ 4)
5640 warn (_("Internal error: not enough buffer room for section flag info"));
5641 return _("<unknown>");
5647 sprintf (p
, "OS (%*.*lx)", field_size
, field_size
,
5648 (unsigned long) os_flags
);
5649 p
+= 5 + field_size
;
5653 size
-= 7 + field_size
;
5654 if (p
!= buff
+ field_size
+ 4)
5658 warn (_("Internal error: not enough buffer room for section flag info"));
5659 return _("<unknown>");
5665 sprintf (p
, "PROC (%*.*lx)", field_size
, field_size
,
5666 (unsigned long) proc_flags
);
5667 p
+= 7 + field_size
;
5671 size
-= 10 + field_size
;
5672 if (p
!= buff
+ field_size
+ 4)
5676 warn (_("Internal error: not enough buffer room for section flag info"));
5677 return _("<unknown>");
5683 sprintf (p
, _("UNKNOWN (%*.*lx)"), field_size
, field_size
,
5684 (unsigned long) unknown_flags
);
5685 p
+= 10 + field_size
;
5694 get_compression_header (Elf_Internal_Chdr
*chdr
, unsigned char *buf
)
5698 Elf32_External_Chdr
*echdr
= (Elf32_External_Chdr
*) buf
;
5700 chdr
->ch_type
= BYTE_GET (echdr
->ch_type
);
5701 chdr
->ch_size
= BYTE_GET (echdr
->ch_size
);
5702 chdr
->ch_addralign
= BYTE_GET (echdr
->ch_addralign
);
5703 return sizeof (*echdr
);
5707 Elf64_External_Chdr
*echdr
= (Elf64_External_Chdr
*) buf
;
5709 chdr
->ch_type
= BYTE_GET (echdr
->ch_type
);
5710 chdr
->ch_size
= BYTE_GET (echdr
->ch_size
);
5711 chdr
->ch_addralign
= BYTE_GET (echdr
->ch_addralign
);
5712 return sizeof (*echdr
);
5717 process_section_headers (FILE * file
)
5719 Elf_Internal_Shdr
* section
;
5722 section_headers
= NULL
;
5724 if (elf_header
.e_shnum
== 0)
5726 /* PR binutils/12467. */
5727 if (elf_header
.e_shoff
!= 0)
5728 warn (_("possibly corrupt ELF file header - it has a non-zero"
5729 " section header offset, but no section headers\n"));
5730 else if (do_sections
)
5731 printf (_("\nThere are no sections in this file.\n"));
5736 if (do_sections
&& !do_header
)
5737 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5738 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
5742 if (! get_32bit_section_headers (file
, FALSE
))
5745 else if (! get_64bit_section_headers (file
, FALSE
))
5748 /* Read in the string table, so that we have names to display. */
5749 if (elf_header
.e_shstrndx
!= SHN_UNDEF
5750 && elf_header
.e_shstrndx
< elf_header
.e_shnum
)
5752 section
= section_headers
+ elf_header
.e_shstrndx
;
5754 if (section
->sh_size
!= 0)
5756 string_table
= (char *) get_data (NULL
, file
, section
->sh_offset
,
5757 1, section
->sh_size
,
5760 string_table_length
= string_table
!= NULL
? section
->sh_size
: 0;
5764 /* Scan the sections for the dynamic symbol table
5765 and dynamic string table and debug sections. */
5766 dynamic_symbols
= NULL
;
5767 dynamic_strings
= NULL
;
5768 dynamic_syminfo
= NULL
;
5769 symtab_shndx_list
= NULL
;
5771 eh_addr_size
= is_32bit_elf
? 4 : 8;
5772 switch (elf_header
.e_machine
)
5775 case EM_MIPS_RS3_LE
:
5776 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5777 FDE addresses. However, the ABI also has a semi-official ILP32
5778 variant for which the normal FDE address size rules apply.
5780 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5781 section, where XX is the size of longs in bits. Unfortunately,
5782 earlier compilers provided no way of distinguishing ILP32 objects
5783 from LP64 objects, so if there's any doubt, we should assume that
5784 the official LP64 form is being used. */
5785 if ((elf_header
.e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
5786 && find_section (".gcc_compiled_long32") == NULL
)
5792 switch (elf_header
.e_flags
& EF_H8_MACH
)
5794 case E_H8_MACH_H8300
:
5795 case E_H8_MACH_H8300HN
:
5796 case E_H8_MACH_H8300SN
:
5797 case E_H8_MACH_H8300SXN
:
5800 case E_H8_MACH_H8300H
:
5801 case E_H8_MACH_H8300S
:
5802 case E_H8_MACH_H8300SX
:
5810 switch (elf_header
.e_flags
& EF_M32C_CPU_MASK
)
5812 case EF_M32C_CPU_M16C
:
5819 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
5822 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
5823 if (section->sh_entsize != expected_entsize) \
5826 sprintf_vma (buf, section->sh_entsize); \
5827 /* Note: coded this way so that there is a single string for \
5829 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5830 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5831 (unsigned) expected_entsize); \
5832 section->sh_entsize = expected_entsize; \
5837 #define CHECK_ENTSIZE(section, i, type) \
5838 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
5839 sizeof (Elf64_External_##type))
5841 for (i
= 0, section
= section_headers
;
5842 i
< elf_header
.e_shnum
;
5845 char * name
= SECTION_NAME (section
);
5847 if (section
->sh_type
== SHT_DYNSYM
)
5849 if (dynamic_symbols
!= NULL
)
5851 error (_("File contains multiple dynamic symbol tables\n"));
5855 CHECK_ENTSIZE (section
, i
, Sym
);
5856 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
, & num_dynamic_syms
);
5858 else if (section
->sh_type
== SHT_STRTAB
5859 && streq (name
, ".dynstr"))
5861 if (dynamic_strings
!= NULL
)
5863 error (_("File contains multiple dynamic string tables\n"));
5867 dynamic_strings
= (char *) get_data (NULL
, file
, section
->sh_offset
,
5868 1, section
->sh_size
,
5869 _("dynamic strings"));
5870 dynamic_strings_length
= dynamic_strings
== NULL
? 0 : section
->sh_size
;
5872 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
5874 elf_section_list
* entry
= xmalloc (sizeof * entry
);
5875 entry
->hdr
= section
;
5876 entry
->next
= symtab_shndx_list
;
5877 symtab_shndx_list
= entry
;
5879 else if (section
->sh_type
== SHT_SYMTAB
)
5880 CHECK_ENTSIZE (section
, i
, Sym
);
5881 else if (section
->sh_type
== SHT_GROUP
)
5882 CHECK_ENTSIZE_VALUES (section
, i
, GRP_ENTRY_SIZE
, GRP_ENTRY_SIZE
);
5883 else if (section
->sh_type
== SHT_REL
)
5884 CHECK_ENTSIZE (section
, i
, Rel
);
5885 else if (section
->sh_type
== SHT_RELA
)
5886 CHECK_ENTSIZE (section
, i
, Rela
);
5887 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
5888 || do_debug_lines
|| do_debug_pubnames
|| do_debug_pubtypes
5889 || do_debug_aranges
|| do_debug_frames
|| do_debug_macinfo
5890 || do_debug_str
|| do_debug_loc
|| do_debug_ranges
5891 || do_debug_addr
|| do_debug_cu_index
)
5892 && (const_strneq (name
, ".debug_")
5893 || const_strneq (name
, ".zdebug_")))
5896 name
+= sizeof (".zdebug_") - 1;
5898 name
+= sizeof (".debug_") - 1;
5901 || (do_debug_info
&& const_strneq (name
, "info"))
5902 || (do_debug_info
&& const_strneq (name
, "types"))
5903 || (do_debug_abbrevs
&& const_strneq (name
, "abbrev"))
5904 || (do_debug_lines
&& strcmp (name
, "line") == 0)
5905 || (do_debug_lines
&& const_strneq (name
, "line."))
5906 || (do_debug_pubnames
&& const_strneq (name
, "pubnames"))
5907 || (do_debug_pubtypes
&& const_strneq (name
, "pubtypes"))
5908 || (do_debug_pubnames
&& const_strneq (name
, "gnu_pubnames"))
5909 || (do_debug_pubtypes
&& const_strneq (name
, "gnu_pubtypes"))
5910 || (do_debug_aranges
&& const_strneq (name
, "aranges"))
5911 || (do_debug_ranges
&& const_strneq (name
, "ranges"))
5912 || (do_debug_frames
&& const_strneq (name
, "frame"))
5913 || (do_debug_macinfo
&& const_strneq (name
, "macinfo"))
5914 || (do_debug_macinfo
&& const_strneq (name
, "macro"))
5915 || (do_debug_str
&& const_strneq (name
, "str"))
5916 || (do_debug_loc
&& const_strneq (name
, "loc"))
5917 || (do_debug_addr
&& const_strneq (name
, "addr"))
5918 || (do_debug_cu_index
&& const_strneq (name
, "cu_index"))
5919 || (do_debug_cu_index
&& const_strneq (name
, "tu_index"))
5921 request_dump_bynumber (i
, DEBUG_DUMP
);
5923 /* Linkonce section to be combined with .debug_info at link time. */
5924 else if ((do_debugging
|| do_debug_info
)
5925 && const_strneq (name
, ".gnu.linkonce.wi."))
5926 request_dump_bynumber (i
, DEBUG_DUMP
);
5927 else if (do_debug_frames
&& streq (name
, ".eh_frame"))
5928 request_dump_bynumber (i
, DEBUG_DUMP
);
5929 else if (do_gdb_index
&& streq (name
, ".gdb_index"))
5930 request_dump_bynumber (i
, DEBUG_DUMP
);
5931 /* Trace sections for Itanium VMS. */
5932 else if ((do_debugging
|| do_trace_info
|| do_trace_abbrevs
5933 || do_trace_aranges
)
5934 && const_strneq (name
, ".trace_"))
5936 name
+= sizeof (".trace_") - 1;
5939 || (do_trace_info
&& streq (name
, "info"))
5940 || (do_trace_abbrevs
&& streq (name
, "abbrev"))
5941 || (do_trace_aranges
&& streq (name
, "aranges"))
5943 request_dump_bynumber (i
, DEBUG_DUMP
);
5950 if (elf_header
.e_shnum
> 1)
5951 printf (_("\nSection Headers:\n"));
5953 printf (_("\nSection Header:\n"));
5957 if (do_section_details
)
5959 printf (_(" [Nr] Name\n"));
5960 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
5964 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
5968 if (do_section_details
)
5970 printf (_(" [Nr] Name\n"));
5971 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
5975 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
5979 if (do_section_details
)
5981 printf (_(" [Nr] Name\n"));
5982 printf (_(" Type Address Offset Link\n"));
5983 printf (_(" Size EntSize Info Align\n"));
5987 printf (_(" [Nr] Name Type Address Offset\n"));
5988 printf (_(" Size EntSize Flags Link Info Align\n"));
5992 if (do_section_details
)
5993 printf (_(" Flags\n"));
5995 for (i
= 0, section
= section_headers
;
5996 i
< elf_header
.e_shnum
;
5999 /* Run some sanity checks on the section header. */
6001 /* Check the sh_link field. */
6002 switch (section
->sh_type
)
6004 case SHT_SYMTAB_SHNDX
:
6008 case SHT_GNU_versym
:
6011 if (section
->sh_link
< 1
6012 || section
->sh_link
>= elf_header
.e_shnum
6013 || (section_headers
[section
->sh_link
].sh_type
!= SHT_SYMTAB
6014 && section_headers
[section
->sh_link
].sh_type
!= SHT_DYNSYM
))
6015 warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6016 i
, section
->sh_link
);
6022 case SHT_GNU_verneed
:
6023 case SHT_GNU_verdef
:
6024 case SHT_GNU_LIBLIST
:
6025 if (section
->sh_link
< 1
6026 || section
->sh_link
>= elf_header
.e_shnum
6027 || section_headers
[section
->sh_link
].sh_type
!= SHT_STRTAB
)
6028 warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6029 i
, section
->sh_link
);
6032 case SHT_INIT_ARRAY
:
6033 case SHT_FINI_ARRAY
:
6034 case SHT_PREINIT_ARRAY
:
6035 if (section
->sh_type
< SHT_LOOS
&& section
->sh_link
!= 0)
6036 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6037 i
, section
->sh_link
);
6041 /* FIXME: Add support for target specific section types. */
6042 #if 0 /* Currently we do not check other section types as there are too
6043 many special cases. Stab sections for example have a type
6044 of SHT_PROGBITS but an sh_link field that links to the .stabstr
6046 if (section
->sh_type
< SHT_LOOS
&& section
->sh_link
!= 0)
6047 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6048 i
, section
->sh_link
);
6053 /* Check the sh_info field. */
6054 switch (section
->sh_type
)
6058 if (section
->sh_info
< 1
6059 || section
->sh_info
>= elf_header
.e_shnum
6060 || (section_headers
[section
->sh_info
].sh_type
!= SHT_PROGBITS
6061 && section_headers
[section
->sh_info
].sh_type
!= SHT_NOBITS
6062 && section_headers
[section
->sh_info
].sh_type
!= SHT_NOTE
6063 && section_headers
[section
->sh_info
].sh_type
!= SHT_INIT_ARRAY
6064 /* FIXME: Are other section types valid ? */
6065 && section_headers
[section
->sh_info
].sh_type
< SHT_LOOS
))
6067 if (section
->sh_info
== 0
6068 && (streq (SECTION_NAME (section
), ".rel.dyn")
6069 || streq (SECTION_NAME (section
), ".rela.dyn")))
6070 /* The .rel.dyn and .rela.dyn sections have an sh_info field
6071 of zero. No idea why. I would have expected the index
6072 of the .plt section. */
6075 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6076 i
, section
->sh_info
);
6082 case SHT_SYMTAB_SHNDX
:
6083 case SHT_INIT_ARRAY
:
6084 case SHT_FINI_ARRAY
:
6085 case SHT_PREINIT_ARRAY
:
6086 if (section
->sh_info
!= 0)
6087 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6088 i
, section
->sh_info
);
6094 /* A symbol index - we assume that it is valid. */
6098 /* FIXME: Add support for target specific section types. */
6099 if (section
->sh_type
== SHT_NOBITS
)
6100 /* NOBITS section headers with non-zero sh_info fields can be
6101 created when a binary is stripped of everything but its debug
6102 information. The stripped sections have their headers
6103 preserved but their types set to SHT_NOBITS. So do not check
6104 this type of section. */
6106 else if (section
->sh_flags
& SHF_INFO_LINK
)
6108 if (section
->sh_info
< 1 || section
->sh_info
>= elf_header
.e_shnum
)
6109 warn (_("[%2u]: Expected link to another section in info field"), i
);
6111 else if (section
->sh_type
< SHT_LOOS
&& section
->sh_info
!= 0)
6112 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6113 i
, section
->sh_info
);
6117 printf (" [%2u] ", i
);
6118 if (do_section_details
)
6119 printf ("%s\n ", printable_section_name (section
));
6121 print_symbol (-17, SECTION_NAME (section
));
6123 printf (do_wide
? " %-15s " : " %-15.15s ",
6124 get_section_type_name (section
->sh_type
));
6128 const char * link_too_big
= NULL
;
6130 print_vma (section
->sh_addr
, LONG_HEX
);
6132 printf ( " %6.6lx %6.6lx %2.2lx",
6133 (unsigned long) section
->sh_offset
,
6134 (unsigned long) section
->sh_size
,
6135 (unsigned long) section
->sh_entsize
);
6137 if (do_section_details
)
6138 fputs (" ", stdout
);
6140 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
6142 if (section
->sh_link
>= elf_header
.e_shnum
)
6145 /* The sh_link value is out of range. Normally this indicates
6146 an error but it can have special values in Solaris binaries. */
6147 switch (elf_header
.e_machine
)
6154 case EM_OLD_SPARCV9
:
6155 case EM_SPARC32PLUS
:
6158 if (section
->sh_link
== (SHN_BEFORE
& 0xffff))
6159 link_too_big
= "BEFORE";
6160 else if (section
->sh_link
== (SHN_AFTER
& 0xffff))
6161 link_too_big
= "AFTER";
6168 if (do_section_details
)
6170 if (link_too_big
!= NULL
&& * link_too_big
)
6171 printf ("<%s> ", link_too_big
);
6173 printf ("%2u ", section
->sh_link
);
6174 printf ("%3u %2lu\n", section
->sh_info
,
6175 (unsigned long) section
->sh_addralign
);
6178 printf ("%2u %3u %2lu\n",
6181 (unsigned long) section
->sh_addralign
);
6183 if (link_too_big
&& ! * link_too_big
)
6184 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6185 i
, section
->sh_link
);
6189 print_vma (section
->sh_addr
, LONG_HEX
);
6191 if ((long) section
->sh_offset
== section
->sh_offset
)
6192 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
6196 print_vma (section
->sh_offset
, LONG_HEX
);
6199 if ((unsigned long) section
->sh_size
== section
->sh_size
)
6200 printf (" %6.6lx", (unsigned long) section
->sh_size
);
6204 print_vma (section
->sh_size
, LONG_HEX
);
6207 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
6208 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
6212 print_vma (section
->sh_entsize
, LONG_HEX
);
6215 if (do_section_details
)
6216 fputs (" ", stdout
);
6218 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
6220 printf ("%2u %3u ", section
->sh_link
, section
->sh_info
);
6222 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
6223 printf ("%2lu\n", (unsigned long) section
->sh_addralign
);
6226 print_vma (section
->sh_addralign
, DEC
);
6230 else if (do_section_details
)
6232 printf (" %-15.15s ",
6233 get_section_type_name (section
->sh_type
));
6234 print_vma (section
->sh_addr
, LONG_HEX
);
6235 if ((long) section
->sh_offset
== section
->sh_offset
)
6236 printf (" %16.16lx", (unsigned long) section
->sh_offset
);
6240 print_vma (section
->sh_offset
, LONG_HEX
);
6242 printf (" %u\n ", section
->sh_link
);
6243 print_vma (section
->sh_size
, LONG_HEX
);
6245 print_vma (section
->sh_entsize
, LONG_HEX
);
6247 printf (" %-16u %lu\n",
6249 (unsigned long) section
->sh_addralign
);
6254 print_vma (section
->sh_addr
, LONG_HEX
);
6255 if ((long) section
->sh_offset
== section
->sh_offset
)
6256 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
6260 print_vma (section
->sh_offset
, LONG_HEX
);
6263 print_vma (section
->sh_size
, LONG_HEX
);
6265 print_vma (section
->sh_entsize
, LONG_HEX
);
6267 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
6269 printf (" %2u %3u %lu\n",
6272 (unsigned long) section
->sh_addralign
);
6275 if (do_section_details
)
6277 printf (" %s\n", get_elf_section_flags (section
->sh_flags
));
6278 if ((section
->sh_flags
& SHF_COMPRESSED
) != 0)
6280 /* Minimum section size is 12 bytes for 32-bit compression
6281 header + 12 bytes for compressed data header. */
6282 unsigned char buf
[24];
6284 assert (sizeof (buf
) >= sizeof (Elf64_External_Chdr
));
6285 if (get_data (&buf
, (FILE *) file
, section
->sh_offset
, 1,
6286 sizeof (buf
), _("compression header")))
6288 Elf_Internal_Chdr chdr
;
6290 (void) get_compression_header (&chdr
, buf
);
6292 if (chdr
.ch_type
== ELFCOMPRESS_ZLIB
)
6295 printf (_(" [<unknown>: 0x%x], "),
6297 print_vma (chdr
.ch_size
, LONG_HEX
);
6298 printf (", %lu\n", (unsigned long) chdr
.ch_addralign
);
6304 if (!do_section_details
)
6306 /* The ordering of the letters shown here matches the ordering of the
6307 corresponding SHF_xxx values, and hence the order in which these
6308 letters will be displayed to the user. */
6309 printf (_("Key to Flags:\n\
6310 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6311 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6312 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
6313 if (elf_header
.e_machine
== EM_X86_64
6314 || elf_header
.e_machine
== EM_L1OM
6315 || elf_header
.e_machine
== EM_K1OM
)
6316 printf (_("l (large), "));
6317 else if (elf_header
.e_machine
== EM_ARM
)
6318 printf (_("y (purecode), "));
6319 printf ("p (processor specific)\n");
6326 get_group_flags (unsigned int flags
)
6328 static char buff
[128];
6332 else if (flags
== GRP_COMDAT
)
6335 snprintf (buff
, 14, _("[0x%x: "), flags
);
6337 flags
&= ~ GRP_COMDAT
;
6338 if (flags
& GRP_MASKOS
)
6340 strcat (buff
, "<OS specific>");
6341 flags
&= ~ GRP_MASKOS
;
6344 if (flags
& GRP_MASKPROC
)
6346 strcat (buff
, "<PROC specific>");
6347 flags
&= ~ GRP_MASKPROC
;
6351 strcat (buff
, "<unknown>");
6358 process_section_groups (FILE * file
)
6360 Elf_Internal_Shdr
* section
;
6362 struct group
* group
;
6363 Elf_Internal_Shdr
* symtab_sec
;
6364 Elf_Internal_Shdr
* strtab_sec
;
6365 Elf_Internal_Sym
* symtab
;
6366 unsigned long num_syms
;
6370 /* Don't process section groups unless needed. */
6371 if (!do_unwind
&& !do_section_groups
)
6374 if (elf_header
.e_shnum
== 0)
6376 if (do_section_groups
)
6377 printf (_("\nThere are no sections to group in this file.\n"));
6382 if (section_headers
== NULL
)
6384 error (_("Section headers are not available!\n"));
6385 /* PR 13622: This can happen with a corrupt ELF header. */
6389 section_headers_groups
= (struct group
**) calloc (elf_header
.e_shnum
,
6390 sizeof (struct group
*));
6392 if (section_headers_groups
== NULL
)
6394 error (_("Out of memory reading %u section group headers\n"),
6395 elf_header
.e_shnum
);
6399 /* Scan the sections for the group section. */
6401 for (i
= 0, section
= section_headers
;
6402 i
< elf_header
.e_shnum
;
6404 if (section
->sh_type
== SHT_GROUP
)
6407 if (group_count
== 0)
6409 if (do_section_groups
)
6410 printf (_("\nThere are no section groups in this file.\n"));
6415 section_groups
= (struct group
*) calloc (group_count
, sizeof (struct group
));
6417 if (section_groups
== NULL
)
6419 error (_("Out of memory reading %lu groups\n"),
6420 (unsigned long) group_count
);
6430 for (i
= 0, section
= section_headers
, group
= section_groups
;
6431 i
< elf_header
.e_shnum
;
6434 if (section
->sh_type
== SHT_GROUP
)
6436 const char * name
= printable_section_name (section
);
6437 const char * group_name
;
6438 unsigned char * start
;
6439 unsigned char * indices
;
6440 unsigned int entry
, j
, size
;
6441 Elf_Internal_Shdr
* sec
;
6442 Elf_Internal_Sym
* sym
;
6444 /* Get the symbol table. */
6445 if (section
->sh_link
>= elf_header
.e_shnum
6446 || ((sec
= section_headers
+ section
->sh_link
)->sh_type
6449 error (_("Bad sh_link in group section `%s'\n"), name
);
6453 if (symtab_sec
!= sec
)
6458 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
, & num_syms
);
6463 error (_("Corrupt header in group section `%s'\n"), name
);
6467 if (section
->sh_info
>= num_syms
)
6469 error (_("Bad sh_info in group section `%s'\n"), name
);
6473 sym
= symtab
+ section
->sh_info
;
6475 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
6477 if (sym
->st_shndx
== 0
6478 || sym
->st_shndx
>= elf_header
.e_shnum
)
6480 error (_("Bad sh_info in group section `%s'\n"), name
);
6484 group_name
= SECTION_NAME (section_headers
+ sym
->st_shndx
);
6493 /* Get the string table. */
6494 if (symtab_sec
->sh_link
>= elf_header
.e_shnum
)
6503 != (sec
= section_headers
+ symtab_sec
->sh_link
))
6509 strtab
= (char *) get_data (NULL
, file
, strtab_sec
->sh_offset
,
6510 1, strtab_sec
->sh_size
,
6512 strtab_size
= strtab
!= NULL
? strtab_sec
->sh_size
: 0;
6514 group_name
= sym
->st_name
< strtab_size
6515 ? strtab
+ sym
->st_name
: _("<corrupt>");
6518 /* PR 17531: file: loop. */
6519 if (section
->sh_entsize
> section
->sh_size
)
6521 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6522 printable_section_name (section
),
6523 (unsigned long) section
->sh_entsize
,
6524 (unsigned long) section
->sh_size
);
6528 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
,
6529 1, section
->sh_size
,
6535 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
6536 entry
= byte_get (indices
, 4);
6539 if (do_section_groups
)
6541 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6542 get_group_flags (entry
), i
, name
, group_name
, size
);
6544 printf (_(" [Index] Name\n"));
6547 group
->group_index
= i
;
6549 for (j
= 0; j
< size
; j
++)
6551 struct group_list
* g
;
6553 entry
= byte_get (indices
, 4);
6556 if (entry
>= elf_header
.e_shnum
)
6558 static unsigned num_group_errors
= 0;
6560 if (num_group_errors
++ < 10)
6562 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6563 entry
, i
, elf_header
.e_shnum
- 1);
6564 if (num_group_errors
== 10)
6565 warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6570 if (section_headers_groups
[entry
] != NULL
)
6574 static unsigned num_errs
= 0;
6576 if (num_errs
++ < 10)
6578 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6580 section_headers_groups
[entry
]->group_index
);
6582 warn (_("Further error messages about already contained group sections suppressed\n"));
6588 /* Intel C/C++ compiler may put section 0 in a
6589 section group. We just warn it the first time
6590 and ignore it afterwards. */
6591 static int warned
= 0;
6594 error (_("section 0 in group section [%5u]\n"),
6595 section_headers_groups
[entry
]->group_index
);
6601 section_headers_groups
[entry
] = group
;
6603 if (do_section_groups
)
6605 sec
= section_headers
+ entry
;
6606 printf (" [%5u] %s\n", entry
, printable_section_name (sec
));
6609 g
= (struct group_list
*) xmalloc (sizeof (struct group_list
));
6610 g
->section_index
= entry
;
6611 g
->next
= group
->root
;
6629 /* Data used to display dynamic fixups. */
6631 struct ia64_vms_dynfixup
6633 bfd_vma needed_ident
; /* Library ident number. */
6634 bfd_vma needed
; /* Index in the dstrtab of the library name. */
6635 bfd_vma fixup_needed
; /* Index of the library. */
6636 bfd_vma fixup_rela_cnt
; /* Number of fixups. */
6637 bfd_vma fixup_rela_off
; /* Fixups offset in the dynamic segment. */
6640 /* Data used to display dynamic relocations. */
6642 struct ia64_vms_dynimgrela
6644 bfd_vma img_rela_cnt
; /* Number of relocations. */
6645 bfd_vma img_rela_off
; /* Reloc offset in the dynamic segment. */
6648 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6652 dump_ia64_vms_dynamic_fixups (FILE *file
, struct ia64_vms_dynfixup
*fixup
,
6653 const char *strtab
, unsigned int strtab_sz
)
6655 Elf64_External_VMS_IMAGE_FIXUP
*imfs
;
6657 const char *lib_name
;
6659 imfs
= get_data (NULL
, file
, dynamic_addr
+ fixup
->fixup_rela_off
,
6660 1, fixup
->fixup_rela_cnt
* sizeof (*imfs
),
6661 _("dynamic section image fixups"));
6665 if (fixup
->needed
< strtab_sz
)
6666 lib_name
= strtab
+ fixup
->needed
;
6669 warn ("corrupt library name index of 0x%lx found in dynamic entry",
6670 (unsigned long) fixup
->needed
);
6673 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6674 (int) fixup
->fixup_needed
, lib_name
, (long) fixup
->needed_ident
);
6676 (_("Seg Offset Type SymVec DataType\n"));
6678 for (i
= 0; i
< (long) fixup
->fixup_rela_cnt
; i
++)
6683 printf ("%3u ", (unsigned) BYTE_GET (imfs
[i
].fixup_seg
));
6684 printf_vma ((bfd_vma
) BYTE_GET (imfs
[i
].fixup_offset
));
6685 type
= BYTE_GET (imfs
[i
].type
);
6686 rtype
= elf_ia64_reloc_type (type
);
6688 printf (" 0x%08x ", type
);
6690 printf (" %-32s ", rtype
);
6691 printf ("%6u ", (unsigned) BYTE_GET (imfs
[i
].symvec_index
));
6692 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs
[i
].data_type
));
6698 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6701 dump_ia64_vms_dynamic_relocs (FILE *file
, struct ia64_vms_dynimgrela
*imgrela
)
6703 Elf64_External_VMS_IMAGE_RELA
*imrs
;
6706 imrs
= get_data (NULL
, file
, dynamic_addr
+ imgrela
->img_rela_off
,
6707 1, imgrela
->img_rela_cnt
* sizeof (*imrs
),
6708 _("dynamic section image relocations"));
6712 printf (_("\nImage relocs\n"));
6714 (_("Seg Offset Type Addend Seg Sym Off\n"));
6716 for (i
= 0; i
< (long) imgrela
->img_rela_cnt
; i
++)
6721 printf ("%3u ", (unsigned) BYTE_GET (imrs
[i
].rela_seg
));
6722 printf ("%08" BFD_VMA_FMT
"x ",
6723 (bfd_vma
) BYTE_GET (imrs
[i
].rela_offset
));
6724 type
= BYTE_GET (imrs
[i
].type
);
6725 rtype
= elf_ia64_reloc_type (type
);
6727 printf ("0x%08x ", type
);
6729 printf ("%-31s ", rtype
);
6730 print_vma (BYTE_GET (imrs
[i
].addend
), FULL_HEX
);
6731 printf ("%3u ", (unsigned) BYTE_GET (imrs
[i
].sym_seg
));
6732 printf ("%08" BFD_VMA_FMT
"x\n",
6733 (bfd_vma
) BYTE_GET (imrs
[i
].sym_offset
));
6739 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
6742 process_ia64_vms_dynamic_relocs (FILE *file
)
6744 struct ia64_vms_dynfixup fixup
;
6745 struct ia64_vms_dynimgrela imgrela
;
6746 Elf_Internal_Dyn
*entry
;
6748 bfd_vma strtab_off
= 0;
6749 bfd_vma strtab_sz
= 0;
6750 char *strtab
= NULL
;
6752 memset (&fixup
, 0, sizeof (fixup
));
6753 memset (&imgrela
, 0, sizeof (imgrela
));
6755 /* Note: the order of the entries is specified by the OpenVMS specs. */
6756 for (entry
= dynamic_section
;
6757 entry
< dynamic_section
+ dynamic_nent
;
6760 switch (entry
->d_tag
)
6762 case DT_IA_64_VMS_STRTAB_OFFSET
:
6763 strtab_off
= entry
->d_un
.d_val
;
6766 strtab_sz
= entry
->d_un
.d_val
;
6768 strtab
= get_data (NULL
, file
, dynamic_addr
+ strtab_off
,
6769 1, strtab_sz
, _("dynamic string section"));
6772 case DT_IA_64_VMS_NEEDED_IDENT
:
6773 fixup
.needed_ident
= entry
->d_un
.d_val
;
6776 fixup
.needed
= entry
->d_un
.d_val
;
6778 case DT_IA_64_VMS_FIXUP_NEEDED
:
6779 fixup
.fixup_needed
= entry
->d_un
.d_val
;
6781 case DT_IA_64_VMS_FIXUP_RELA_CNT
:
6782 fixup
.fixup_rela_cnt
= entry
->d_un
.d_val
;
6784 case DT_IA_64_VMS_FIXUP_RELA_OFF
:
6785 fixup
.fixup_rela_off
= entry
->d_un
.d_val
;
6787 dump_ia64_vms_dynamic_fixups (file
, &fixup
, strtab
, strtab_sz
);
6790 case DT_IA_64_VMS_IMG_RELA_CNT
:
6791 imgrela
.img_rela_cnt
= entry
->d_un
.d_val
;
6793 case DT_IA_64_VMS_IMG_RELA_OFF
:
6794 imgrela
.img_rela_off
= entry
->d_un
.d_val
;
6796 dump_ia64_vms_dynamic_relocs (file
, &imgrela
);
6816 } dynamic_relocations
[] =
6818 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
6819 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
6820 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
6823 /* Process the reloc section. */
6826 process_relocs (FILE * file
)
6828 unsigned long rel_size
;
6829 unsigned long rel_offset
;
6835 if (do_using_dynamic
)
6839 int has_dynamic_reloc
;
6842 has_dynamic_reloc
= 0;
6844 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
6846 is_rela
= dynamic_relocations
[i
].rela
;
6847 name
= dynamic_relocations
[i
].name
;
6848 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
6849 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
6851 has_dynamic_reloc
|= rel_size
;
6853 if (is_rela
== UNKNOWN
)
6855 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
6856 switch (dynamic_info
[DT_PLTREL
])
6870 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6871 name
, rel_offset
, rel_size
);
6873 dump_relocations (file
,
6874 offset_from_vma (file
, rel_offset
, rel_size
),
6876 dynamic_symbols
, num_dynamic_syms
,
6877 dynamic_strings
, dynamic_strings_length
,
6883 has_dynamic_reloc
|= process_ia64_vms_dynamic_relocs (file
);
6885 if (! has_dynamic_reloc
)
6886 printf (_("\nThere are no dynamic relocations in this file.\n"));
6890 Elf_Internal_Shdr
* section
;
6894 for (i
= 0, section
= section_headers
;
6895 i
< elf_header
.e_shnum
;
6898 if ( section
->sh_type
!= SHT_RELA
6899 && section
->sh_type
!= SHT_REL
)
6902 rel_offset
= section
->sh_offset
;
6903 rel_size
= section
->sh_size
;
6907 Elf_Internal_Shdr
* strsec
;
6910 printf (_("\nRelocation section "));
6912 if (string_table
== NULL
)
6913 printf ("%d", section
->sh_name
);
6915 printf ("'%s'", printable_section_name (section
));
6917 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6918 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
6920 is_rela
= section
->sh_type
== SHT_RELA
;
6922 if (section
->sh_link
!= 0
6923 && section
->sh_link
< elf_header
.e_shnum
)
6925 Elf_Internal_Shdr
* symsec
;
6926 Elf_Internal_Sym
* symtab
;
6927 unsigned long nsyms
;
6928 unsigned long strtablen
= 0;
6929 char * strtab
= NULL
;
6931 symsec
= section_headers
+ section
->sh_link
;
6932 if (symsec
->sh_type
!= SHT_SYMTAB
6933 && symsec
->sh_type
!= SHT_DYNSYM
)
6936 symtab
= GET_ELF_SYMBOLS (file
, symsec
, & nsyms
);
6941 if (symsec
->sh_link
!= 0
6942 && symsec
->sh_link
< elf_header
.e_shnum
)
6944 strsec
= section_headers
+ symsec
->sh_link
;
6946 strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
6949 strtablen
= strtab
== NULL
? 0 : strsec
->sh_size
;
6952 dump_relocations (file
, rel_offset
, rel_size
,
6953 symtab
, nsyms
, strtab
, strtablen
,
6955 symsec
->sh_type
== SHT_DYNSYM
);
6961 dump_relocations (file
, rel_offset
, rel_size
,
6962 NULL
, 0, NULL
, 0, is_rela
, 0);
6969 printf (_("\nThere are no relocations in this file.\n"));
6975 /* An absolute address consists of a section and an offset. If the
6976 section is NULL, the offset itself is the address, otherwise, the
6977 address equals to LOAD_ADDRESS(section) + offset. */
6981 unsigned short section
;
6985 #define ABSADDR(a) \
6987 ? section_headers [(a).section].sh_addr + (a).offset \
6990 /* Find the nearest symbol at or below ADDR. Returns the symbol
6991 name, if found, and the offset from the symbol to ADDR. */
6994 find_symbol_for_address (Elf_Internal_Sym
* symtab
,
6995 unsigned long nsyms
,
6996 const char * strtab
,
6997 unsigned long strtab_size
,
6998 struct absaddr addr
,
6999 const char ** symname
,
7002 bfd_vma dist
= 0x100000;
7003 Elf_Internal_Sym
* sym
;
7004 Elf_Internal_Sym
* beg
;
7005 Elf_Internal_Sym
* end
;
7006 Elf_Internal_Sym
* best
= NULL
;
7008 REMOVE_ARCH_BITS (addr
.offset
);
7010 end
= symtab
+ nsyms
;
7016 sym
= beg
+ (end
- beg
) / 2;
7018 value
= sym
->st_value
;
7019 REMOVE_ARCH_BITS (value
);
7021 if (sym
->st_name
!= 0
7022 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
7023 && addr
.offset
>= value
7024 && addr
.offset
- value
< dist
)
7027 dist
= addr
.offset
- value
;
7032 if (addr
.offset
< value
)
7040 *symname
= (best
->st_name
>= strtab_size
7041 ? _("<corrupt>") : strtab
+ best
->st_name
);
7047 *offset
= addr
.offset
;
7051 symcmp (const void *p
, const void *q
)
7053 Elf_Internal_Sym
*sp
= (Elf_Internal_Sym
*) p
;
7054 Elf_Internal_Sym
*sq
= (Elf_Internal_Sym
*) q
;
7056 return sp
->st_value
> sq
->st_value
? 1 : (sp
->st_value
< sq
->st_value
? -1 : 0);
7059 /* Process the unwind section. */
7061 #include "unwind-ia64.h"
7063 struct ia64_unw_table_entry
7065 struct absaddr start
;
7067 struct absaddr info
;
7070 struct ia64_unw_aux_info
7072 struct ia64_unw_table_entry
*table
; /* Unwind table. */
7073 unsigned long table_len
; /* Length of unwind table. */
7074 unsigned char * info
; /* Unwind info. */
7075 unsigned long info_size
; /* Size of unwind info. */
7076 bfd_vma info_addr
; /* Starting address of unwind info. */
7077 bfd_vma seg_base
; /* Starting address of segment. */
7078 Elf_Internal_Sym
* symtab
; /* The symbol table. */
7079 unsigned long nsyms
; /* Number of symbols. */
7080 Elf_Internal_Sym
* funtab
; /* Sorted table of STT_FUNC symbols. */
7081 unsigned long nfuns
; /* Number of entries in funtab. */
7082 char * strtab
; /* The string table. */
7083 unsigned long strtab_size
; /* Size of string table. */
7087 dump_ia64_unwind (struct ia64_unw_aux_info
* aux
)
7089 struct ia64_unw_table_entry
* tp
;
7090 unsigned long j
, nfuns
;
7093 aux
->funtab
= xmalloc (aux
->nsyms
* sizeof (Elf_Internal_Sym
));
7094 for (nfuns
= 0, j
= 0; j
< aux
->nsyms
; j
++)
7095 if (aux
->symtab
[j
].st_value
&& ELF_ST_TYPE (aux
->symtab
[j
].st_info
) == STT_FUNC
)
7096 aux
->funtab
[nfuns
++] = aux
->symtab
[j
];
7098 qsort (aux
->funtab
, aux
->nfuns
, sizeof (Elf_Internal_Sym
), symcmp
);
7100 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
7104 const unsigned char * dp
;
7105 const unsigned char * head
;
7106 const unsigned char * end
;
7107 const char * procname
;
7109 find_symbol_for_address (aux
->funtab
, aux
->nfuns
, aux
->strtab
,
7110 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
7112 fputs ("\n<", stdout
);
7116 fputs (procname
, stdout
);
7119 printf ("+%lx", (unsigned long) offset
);
7122 fputs (">: [", stdout
);
7123 print_vma (tp
->start
.offset
, PREFIX_HEX
);
7124 fputc ('-', stdout
);
7125 print_vma (tp
->end
.offset
, PREFIX_HEX
);
7126 printf ("], info at +0x%lx\n",
7127 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
7129 /* PR 17531: file: 86232b32. */
7130 if (aux
->info
== NULL
)
7133 /* PR 17531: file: 0997b4d1. */
7134 if ((ABSADDR (tp
->info
) - aux
->info_addr
) >= aux
->info_size
)
7136 warn (_("Invalid offset %lx in table entry %ld\n"),
7137 (long) tp
->info
.offset
, (long) (tp
- aux
->table
));
7141 head
= aux
->info
+ (ABSADDR (tp
->info
) - aux
->info_addr
);
7142 stamp
= byte_get ((unsigned char *) head
, sizeof (stamp
));
7144 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7145 (unsigned) UNW_VER (stamp
),
7146 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
7147 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
7148 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
7149 (unsigned long) (eh_addr_size
* UNW_LENGTH (stamp
)));
7151 if (UNW_VER (stamp
) != 1)
7153 printf (_("\tUnknown version.\n"));
7158 end
= head
+ 8 + eh_addr_size
* UNW_LENGTH (stamp
);
7159 /* PR 17531: file: 16ceda89. */
7160 if (end
> aux
->info
+ aux
->info_size
)
7161 end
= aux
->info
+ aux
->info_size
;
7162 for (dp
= head
+ 8; dp
< end
;)
7163 dp
= unw_decode (dp
, in_body
, & in_body
, end
);
7170 slurp_ia64_unwind_table (FILE * file
,
7171 struct ia64_unw_aux_info
* aux
,
7172 Elf_Internal_Shdr
* sec
)
7174 unsigned long size
, nrelas
, i
;
7175 Elf_Internal_Phdr
* seg
;
7176 struct ia64_unw_table_entry
* tep
;
7177 Elf_Internal_Shdr
* relsec
;
7178 Elf_Internal_Rela
* rela
;
7179 Elf_Internal_Rela
* rp
;
7180 unsigned char * table
;
7182 Elf_Internal_Sym
* sym
;
7183 const char * relname
;
7187 /* First, find the starting address of the segment that includes
7190 if (elf_header
.e_phnum
)
7192 if (! get_program_headers (file
))
7195 for (seg
= program_headers
;
7196 seg
< program_headers
+ elf_header
.e_phnum
;
7199 if (seg
->p_type
!= PT_LOAD
)
7202 if (sec
->sh_addr
>= seg
->p_vaddr
7203 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
7205 aux
->seg_base
= seg
->p_vaddr
;
7211 /* Second, build the unwind table from the contents of the unwind section: */
7212 size
= sec
->sh_size
;
7213 table
= (unsigned char *) get_data (NULL
, file
, sec
->sh_offset
, 1, size
,
7218 aux
->table_len
= size
/ (3 * eh_addr_size
);
7219 aux
->table
= (struct ia64_unw_table_entry
*)
7220 xcmalloc (aux
->table_len
, sizeof (aux
->table
[0]));
7223 for (tp
= table
; tp
<= table
+ size
- (3 * eh_addr_size
); ++tep
)
7225 tep
->start
.section
= SHN_UNDEF
;
7226 tep
->end
.section
= SHN_UNDEF
;
7227 tep
->info
.section
= SHN_UNDEF
;
7228 tep
->start
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
7229 tep
->end
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
7230 tep
->info
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
7231 tep
->start
.offset
+= aux
->seg_base
;
7232 tep
->end
.offset
+= aux
->seg_base
;
7233 tep
->info
.offset
+= aux
->seg_base
;
7237 /* Third, apply any relocations to the unwind table: */
7238 for (relsec
= section_headers
;
7239 relsec
< section_headers
+ elf_header
.e_shnum
;
7242 if (relsec
->sh_type
!= SHT_RELA
7243 || relsec
->sh_info
>= elf_header
.e_shnum
7244 || section_headers
+ relsec
->sh_info
!= sec
)
7247 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
7256 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
7258 relname
= elf_ia64_reloc_type (get_reloc_type (rp
->r_info
));
7259 sym
= aux
->symtab
+ get_reloc_symindex (rp
->r_info
);
7261 /* PR 17531: file: 9fa67536. */
7262 if (relname
== NULL
)
7264 warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp
->r_info
));
7268 if (! const_strneq (relname
, "R_IA64_SEGREL"))
7270 warn (_("Skipping unexpected relocation type: %s\n"), relname
);
7274 i
= rp
->r_offset
/ (3 * eh_addr_size
);
7276 /* PR 17531: file: 5bc8d9bf. */
7277 if (i
>= aux
->table_len
)
7279 warn (_("Skipping reloc with overlarge offset: %lx\n"), i
);
7283 switch (rp
->r_offset
/ eh_addr_size
% 3)
7286 aux
->table
[i
].start
.section
= sym
->st_shndx
;
7287 aux
->table
[i
].start
.offset
= rp
->r_addend
+ sym
->st_value
;
7290 aux
->table
[i
].end
.section
= sym
->st_shndx
;
7291 aux
->table
[i
].end
.offset
= rp
->r_addend
+ sym
->st_value
;
7294 aux
->table
[i
].info
.section
= sym
->st_shndx
;
7295 aux
->table
[i
].info
.offset
= rp
->r_addend
+ sym
->st_value
;
7309 ia64_process_unwind (FILE * file
)
7311 Elf_Internal_Shdr
* sec
;
7312 Elf_Internal_Shdr
* unwsec
= NULL
;
7313 Elf_Internal_Shdr
* strsec
;
7314 unsigned long i
, unwcount
= 0, unwstart
= 0;
7315 struct ia64_unw_aux_info aux
;
7317 memset (& aux
, 0, sizeof (aux
));
7319 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
7321 if (sec
->sh_type
== SHT_SYMTAB
7322 && sec
->sh_link
< elf_header
.e_shnum
)
7324 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
, & aux
.nsyms
);
7326 strsec
= section_headers
+ sec
->sh_link
;
7327 if (aux
.strtab
!= NULL
)
7329 error (_("Multiple auxillary string tables encountered\n"));
7332 aux
.strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
7335 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
7337 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
7342 printf (_("\nThere are no unwind sections in this file.\n"));
7344 while (unwcount
-- > 0)
7349 for (i
= unwstart
, sec
= section_headers
+ unwstart
, unwsec
= NULL
;
7350 i
< elf_header
.e_shnum
; ++i
, ++sec
)
7351 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
7356 /* We have already counted the number of SHT_IA64_UNWIND
7357 sections so the loop above should never fail. */
7358 assert (unwsec
!= NULL
);
7361 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
7363 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
7365 /* We need to find which section group it is in. */
7366 struct group_list
* g
;
7368 if (section_headers_groups
== NULL
7369 || section_headers_groups
[i
] == NULL
)
7370 i
= elf_header
.e_shnum
;
7373 g
= section_headers_groups
[i
]->root
;
7375 for (; g
!= NULL
; g
= g
->next
)
7377 sec
= section_headers
+ g
->section_index
;
7379 if (streq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
))
7384 i
= elf_header
.e_shnum
;
7387 else if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
, len
))
7389 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
7390 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
7391 suffix
= SECTION_NAME (unwsec
) + len
;
7392 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
7394 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info_once
, len2
)
7395 && streq (SECTION_NAME (sec
) + len2
, suffix
))
7400 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7401 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
7402 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
7403 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
7405 if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
, len
))
7406 suffix
= SECTION_NAME (unwsec
) + len
;
7407 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
7409 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
, len2
)
7410 && streq (SECTION_NAME (sec
) + len2
, suffix
))
7414 if (i
== elf_header
.e_shnum
)
7416 printf (_("\nCould not find unwind info section for "));
7418 if (string_table
== NULL
)
7419 printf ("%d", unwsec
->sh_name
);
7421 printf ("'%s'", printable_section_name (unwsec
));
7425 aux
.info_addr
= sec
->sh_addr
;
7426 aux
.info
= (unsigned char *) get_data (NULL
, file
, sec
->sh_offset
, 1,
7429 aux
.info_size
= aux
.info
== NULL
? 0 : sec
->sh_size
;
7431 printf (_("\nUnwind section "));
7433 if (string_table
== NULL
)
7434 printf ("%d", unwsec
->sh_name
);
7436 printf ("'%s'", printable_section_name (unwsec
));
7438 printf (_(" at offset 0x%lx contains %lu entries:\n"),
7439 (unsigned long) unwsec
->sh_offset
,
7440 (unsigned long) (unwsec
->sh_size
/ (3 * eh_addr_size
)));
7442 if (slurp_ia64_unwind_table (file
, & aux
, unwsec
)
7443 && aux
.table_len
> 0)
7444 dump_ia64_unwind (& aux
);
7447 free ((char *) aux
.table
);
7449 free ((char *) aux
.info
);
7458 free ((char *) aux
.strtab
);
7461 struct hppa_unw_table_entry
7463 struct absaddr start
;
7465 unsigned int Cannot_unwind
:1; /* 0 */
7466 unsigned int Millicode
:1; /* 1 */
7467 unsigned int Millicode_save_sr0
:1; /* 2 */
7468 unsigned int Region_description
:2; /* 3..4 */
7469 unsigned int reserved1
:1; /* 5 */
7470 unsigned int Entry_SR
:1; /* 6 */
7471 unsigned int Entry_FR
:4; /* number saved */ /* 7..10 */
7472 unsigned int Entry_GR
:5; /* number saved */ /* 11..15 */
7473 unsigned int Args_stored
:1; /* 16 */
7474 unsigned int Variable_Frame
:1; /* 17 */
7475 unsigned int Separate_Package_Body
:1; /* 18 */
7476 unsigned int Frame_Extension_Millicode
:1; /* 19 */
7477 unsigned int Stack_Overflow_Check
:1; /* 20 */
7478 unsigned int Two_Instruction_SP_Increment
:1;/* 21 */
7479 unsigned int Ada_Region
:1; /* 22 */
7480 unsigned int cxx_info
:1; /* 23 */
7481 unsigned int cxx_try_catch
:1; /* 24 */
7482 unsigned int sched_entry_seq
:1; /* 25 */
7483 unsigned int reserved2
:1; /* 26 */
7484 unsigned int Save_SP
:1; /* 27 */
7485 unsigned int Save_RP
:1; /* 28 */
7486 unsigned int Save_MRP_in_frame
:1; /* 29 */
7487 unsigned int extn_ptr_defined
:1; /* 30 */
7488 unsigned int Cleanup_defined
:1; /* 31 */
7490 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
7491 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
7492 unsigned int Large_frame
:1; /* 2 */
7493 unsigned int Pseudo_SP_Set
:1; /* 3 */
7494 unsigned int reserved4
:1; /* 4 */
7495 unsigned int Total_frame_size
:27; /* 5..31 */
7498 struct hppa_unw_aux_info
7500 struct hppa_unw_table_entry
* table
; /* Unwind table. */
7501 unsigned long table_len
; /* Length of unwind table. */
7502 bfd_vma seg_base
; /* Starting address of segment. */
7503 Elf_Internal_Sym
* symtab
; /* The 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 entries in funtab. */
7507 char * strtab
; /* The string table. */
7508 unsigned long strtab_size
; /* Size of string table. */
7512 dump_hppa_unwind (struct hppa_unw_aux_info
* aux
)
7514 struct hppa_unw_table_entry
* tp
;
7515 unsigned long j
, nfuns
;
7517 aux
->funtab
= xmalloc (aux
->nsyms
* sizeof (Elf_Internal_Sym
));
7518 for (nfuns
= 0, j
= 0; j
< aux
->nsyms
; j
++)
7519 if (aux
->symtab
[j
].st_value
&& ELF_ST_TYPE (aux
->symtab
[j
].st_info
) == STT_FUNC
)
7520 aux
->funtab
[nfuns
++] = aux
->symtab
[j
];
7522 qsort (aux
->funtab
, aux
->nfuns
, sizeof (Elf_Internal_Sym
), symcmp
);
7524 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
7527 const char * procname
;
7529 find_symbol_for_address (aux
->funtab
, aux
->nfuns
, aux
->strtab
,
7530 aux
->strtab_size
, tp
->start
, &procname
,
7533 fputs ("\n<", stdout
);
7537 fputs (procname
, stdout
);
7540 printf ("+%lx", (unsigned long) offset
);
7543 fputs (">: [", stdout
);
7544 print_vma (tp
->start
.offset
, PREFIX_HEX
);
7545 fputc ('-', stdout
);
7546 print_vma (tp
->end
.offset
, PREFIX_HEX
);
7549 #define PF(_m) if (tp->_m) printf (#_m " ");
7550 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7553 PF(Millicode_save_sr0
);
7554 /* PV(Region_description); */
7560 PF(Separate_Package_Body
);
7561 PF(Frame_Extension_Millicode
);
7562 PF(Stack_Overflow_Check
);
7563 PF(Two_Instruction_SP_Increment
);
7567 PF(sched_entry_seq
);
7570 PF(Save_MRP_in_frame
);
7571 PF(extn_ptr_defined
);
7572 PF(Cleanup_defined
);
7573 PF(MPE_XL_interrupt_marker
);
7574 PF(HP_UX_interrupt_marker
);
7577 PV(Total_frame_size
);
7588 slurp_hppa_unwind_table (FILE * file
,
7589 struct hppa_unw_aux_info
* aux
,
7590 Elf_Internal_Shdr
* sec
)
7592 unsigned long size
, unw_ent_size
, nentries
, nrelas
, i
;
7593 Elf_Internal_Phdr
* seg
;
7594 struct hppa_unw_table_entry
* tep
;
7595 Elf_Internal_Shdr
* relsec
;
7596 Elf_Internal_Rela
* rela
;
7597 Elf_Internal_Rela
* rp
;
7598 unsigned char * table
;
7600 Elf_Internal_Sym
* sym
;
7601 const char * relname
;
7603 /* First, find the starting address of the segment that includes
7606 if (elf_header
.e_phnum
)
7608 if (! get_program_headers (file
))
7611 for (seg
= program_headers
;
7612 seg
< program_headers
+ elf_header
.e_phnum
;
7615 if (seg
->p_type
!= PT_LOAD
)
7618 if (sec
->sh_addr
>= seg
->p_vaddr
7619 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
7621 aux
->seg_base
= seg
->p_vaddr
;
7627 /* Second, build the unwind table from the contents of the unwind
7629 size
= sec
->sh_size
;
7630 table
= (unsigned char *) get_data (NULL
, file
, sec
->sh_offset
, 1, size
,
7636 nentries
= size
/ unw_ent_size
;
7637 size
= unw_ent_size
* nentries
;
7639 tep
= aux
->table
= (struct hppa_unw_table_entry
*)
7640 xcmalloc (nentries
, sizeof (aux
->table
[0]));
7642 for (tp
= table
; tp
< table
+ size
; tp
+= unw_ent_size
, ++tep
)
7644 unsigned int tmp1
, tmp2
;
7646 tep
->start
.section
= SHN_UNDEF
;
7647 tep
->end
.section
= SHN_UNDEF
;
7649 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
7650 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
7651 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
7652 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
7654 tep
->start
.offset
+= aux
->seg_base
;
7655 tep
->end
.offset
+= aux
->seg_base
;
7657 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
7658 tep
->Millicode
= (tmp1
>> 30) & 0x1;
7659 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
7660 tep
->Region_description
= (tmp1
>> 27) & 0x3;
7661 tep
->reserved1
= (tmp1
>> 26) & 0x1;
7662 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
7663 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
7664 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
7665 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
7666 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
7667 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
7668 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
7669 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
7670 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
7671 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
7672 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
7673 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
7674 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
7675 tep
->reserved2
= (tmp1
>> 5) & 0x1;
7676 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
7677 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
7678 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
7679 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
7680 tep
->Cleanup_defined
= tmp1
& 0x1;
7682 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
7683 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
7684 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
7685 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
7686 tep
->reserved4
= (tmp2
>> 27) & 0x1;
7687 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
7691 /* Third, apply any relocations to the unwind table. */
7692 for (relsec
= section_headers
;
7693 relsec
< section_headers
+ elf_header
.e_shnum
;
7696 if (relsec
->sh_type
!= SHT_RELA
7697 || relsec
->sh_info
>= elf_header
.e_shnum
7698 || section_headers
+ relsec
->sh_info
!= sec
)
7701 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
7705 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
7707 relname
= elf_hppa_reloc_type (get_reloc_type (rp
->r_info
));
7708 sym
= aux
->symtab
+ get_reloc_symindex (rp
->r_info
);
7710 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
7711 if (! const_strneq (relname
, "R_PARISC_SEGREL"))
7713 warn (_("Skipping unexpected relocation type %s\n"), relname
);
7717 i
= rp
->r_offset
/ unw_ent_size
;
7719 switch ((rp
->r_offset
% unw_ent_size
) / eh_addr_size
)
7722 aux
->table
[i
].start
.section
= sym
->st_shndx
;
7723 aux
->table
[i
].start
.offset
= sym
->st_value
+ rp
->r_addend
;
7726 aux
->table
[i
].end
.section
= sym
->st_shndx
;
7727 aux
->table
[i
].end
.offset
= sym
->st_value
+ rp
->r_addend
;
7737 aux
->table_len
= nentries
;
7743 hppa_process_unwind (FILE * file
)
7745 struct hppa_unw_aux_info aux
;
7746 Elf_Internal_Shdr
* unwsec
= NULL
;
7747 Elf_Internal_Shdr
* strsec
;
7748 Elf_Internal_Shdr
* sec
;
7751 if (string_table
== NULL
)
7754 memset (& aux
, 0, sizeof (aux
));
7756 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
7758 if (sec
->sh_type
== SHT_SYMTAB
7759 && sec
->sh_link
< elf_header
.e_shnum
)
7761 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
, & aux
.nsyms
);
7763 strsec
= section_headers
+ sec
->sh_link
;
7764 if (aux
.strtab
!= NULL
)
7766 error (_("Multiple auxillary string tables encountered\n"));
7769 aux
.strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
7772 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
7774 else if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
7779 printf (_("\nThere are no unwind sections in this file.\n"));
7781 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
7783 if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
7785 printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7786 printable_section_name (sec
),
7787 (unsigned long) sec
->sh_offset
,
7788 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
+ 8)));
7790 slurp_hppa_unwind_table (file
, &aux
, sec
);
7791 if (aux
.table_len
> 0)
7792 dump_hppa_unwind (&aux
);
7795 free ((char *) aux
.table
);
7803 free ((char *) aux
.strtab
);
7808 unsigned char * data
; /* The unwind data. */
7809 Elf_Internal_Shdr
* sec
; /* The cached unwind section header. */
7810 Elf_Internal_Rela
* rela
; /* The cached relocations for this section. */
7811 unsigned long nrelas
; /* The number of relocations. */
7812 unsigned int rel_type
; /* REL or RELA ? */
7813 Elf_Internal_Rela
* next_rela
; /* Cyclic pointer to the next reloc to process. */
7816 struct arm_unw_aux_info
7818 FILE * file
; /* The file containing the unwind sections. */
7819 Elf_Internal_Sym
* symtab
; /* The file's symbol table. */
7820 unsigned long nsyms
; /* Number of symbols. */
7821 Elf_Internal_Sym
* funtab
; /* Sorted table of STT_FUNC symbols. */
7822 unsigned long nfuns
; /* Number of these symbols. */
7823 char * strtab
; /* The file's string table. */
7824 unsigned long strtab_size
; /* Size of string table. */
7828 arm_print_vma_and_name (struct arm_unw_aux_info
*aux
,
7829 bfd_vma fn
, struct absaddr addr
)
7831 const char *procname
;
7834 if (addr
.section
== SHN_UNDEF
)
7837 find_symbol_for_address (aux
->funtab
, aux
->nfuns
, aux
->strtab
,
7838 aux
->strtab_size
, addr
, &procname
,
7841 print_vma (fn
, PREFIX_HEX
);
7845 fputs (" <", stdout
);
7846 fputs (procname
, stdout
);
7849 printf ("+0x%lx", (unsigned long) sym_offset
);
7850 fputc ('>', stdout
);
7857 arm_free_section (struct arm_section
*arm_sec
)
7859 if (arm_sec
->data
!= NULL
)
7860 free (arm_sec
->data
);
7862 if (arm_sec
->rela
!= NULL
)
7863 free (arm_sec
->rela
);
7866 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7867 cached section and install SEC instead.
7868 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7869 and return its valued in * WORDP, relocating if necessary.
7870 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7871 relocation's offset in ADDR.
7872 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7873 into the string table of the symbol associated with the reloc. If no
7874 reloc was applied store -1 there.
7875 5) Return TRUE upon success, FALSE otherwise. */
7878 get_unwind_section_word (struct arm_unw_aux_info
* aux
,
7879 struct arm_section
* arm_sec
,
7880 Elf_Internal_Shdr
* sec
,
7881 bfd_vma word_offset
,
7882 unsigned int * wordp
,
7883 struct absaddr
* addr
,
7886 Elf_Internal_Rela
*rp
;
7887 Elf_Internal_Sym
*sym
;
7888 const char * relname
;
7890 bfd_boolean wrapped
;
7892 if (sec
== NULL
|| arm_sec
== NULL
)
7895 addr
->section
= SHN_UNDEF
;
7898 if (sym_name
!= NULL
)
7899 *sym_name
= (bfd_vma
) -1;
7901 /* If necessary, update the section cache. */
7902 if (sec
!= arm_sec
->sec
)
7904 Elf_Internal_Shdr
*relsec
;
7906 arm_free_section (arm_sec
);
7909 arm_sec
->data
= get_data (NULL
, aux
->file
, sec
->sh_offset
, 1,
7910 sec
->sh_size
, _("unwind data"));
7911 arm_sec
->rela
= NULL
;
7912 arm_sec
->nrelas
= 0;
7914 for (relsec
= section_headers
;
7915 relsec
< section_headers
+ elf_header
.e_shnum
;
7918 if (relsec
->sh_info
>= elf_header
.e_shnum
7919 || section_headers
+ relsec
->sh_info
!= sec
7920 /* PR 15745: Check the section type as well. */
7921 || (relsec
->sh_type
!= SHT_REL
7922 && relsec
->sh_type
!= SHT_RELA
))
7925 arm_sec
->rel_type
= relsec
->sh_type
;
7926 if (relsec
->sh_type
== SHT_REL
)
7928 if (!slurp_rel_relocs (aux
->file
, relsec
->sh_offset
,
7930 & arm_sec
->rela
, & arm_sec
->nrelas
))
7933 else /* relsec->sh_type == SHT_RELA */
7935 if (!slurp_rela_relocs (aux
->file
, relsec
->sh_offset
,
7937 & arm_sec
->rela
, & arm_sec
->nrelas
))
7943 arm_sec
->next_rela
= arm_sec
->rela
;
7946 /* If there is no unwind data we can do nothing. */
7947 if (arm_sec
->data
== NULL
)
7950 /* If the offset is invalid then fail. */
7951 if (word_offset
> (sec
->sh_size
- 4)
7953 || (sec
->sh_size
< 5 && word_offset
>= sec
->sh_size
)
7954 || ((bfd_signed_vma
) word_offset
) < 0)
7957 /* Get the word at the required offset. */
7958 word
= byte_get (arm_sec
->data
+ word_offset
, 4);
7960 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
7961 if (arm_sec
->rela
== NULL
)
7967 /* Look through the relocs to find the one that applies to the provided offset. */
7969 for (rp
= arm_sec
->next_rela
; rp
!= arm_sec
->rela
+ arm_sec
->nrelas
; rp
++)
7971 bfd_vma prelval
, offset
;
7973 if (rp
->r_offset
> word_offset
&& !wrapped
)
7978 if (rp
->r_offset
> word_offset
)
7981 if (rp
->r_offset
& 3)
7983 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7984 (unsigned long) rp
->r_offset
);
7988 if (rp
->r_offset
< word_offset
)
7991 /* PR 17531: file: 027-161405-0.004 */
7992 if (aux
->symtab
== NULL
)
7995 if (arm_sec
->rel_type
== SHT_REL
)
7997 offset
= word
& 0x7fffffff;
7998 if (offset
& 0x40000000)
7999 offset
|= ~ (bfd_vma
) 0x7fffffff;
8001 else if (arm_sec
->rel_type
== SHT_RELA
)
8002 offset
= rp
->r_addend
;
8005 error (_("Unknown section relocation type %d encountered\n"),
8010 /* PR 17531 file: 027-1241568-0.004. */
8011 if (ELF32_R_SYM (rp
->r_info
) >= aux
->nsyms
)
8013 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8014 (unsigned long) ELF32_R_SYM (rp
->r_info
), aux
->nsyms
);
8018 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
8019 offset
+= sym
->st_value
;
8020 prelval
= offset
- (arm_sec
->sec
->sh_addr
+ rp
->r_offset
);
8022 /* Check that we are processing the expected reloc type. */
8023 if (elf_header
.e_machine
== EM_ARM
)
8025 relname
= elf_arm_reloc_type (ELF32_R_TYPE (rp
->r_info
));
8026 if (relname
== NULL
)
8028 warn (_("Skipping unknown ARM relocation type: %d\n"),
8029 (int) ELF32_R_TYPE (rp
->r_info
));
8033 if (streq (relname
, "R_ARM_NONE"))
8036 if (! streq (relname
, "R_ARM_PREL31"))
8038 warn (_("Skipping unexpected ARM relocation type %s\n"), relname
);
8042 else if (elf_header
.e_machine
== EM_TI_C6000
)
8044 relname
= elf_tic6x_reloc_type (ELF32_R_TYPE (rp
->r_info
));
8045 if (relname
== NULL
)
8047 warn (_("Skipping unknown C6000 relocation type: %d\n"),
8048 (int) ELF32_R_TYPE (rp
->r_info
));
8052 if (streq (relname
, "R_C6000_NONE"))
8055 if (! streq (relname
, "R_C6000_PREL31"))
8057 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname
);
8065 /* This function currently only supports ARM and TI unwinders. */
8066 warn (_("Only TI and ARM unwinders are currently supported\n"));
8070 word
= (word
& ~ (bfd_vma
) 0x7fffffff) | (prelval
& 0x7fffffff);
8071 addr
->section
= sym
->st_shndx
;
8072 addr
->offset
= offset
;
8075 * sym_name
= sym
->st_name
;
8080 arm_sec
->next_rela
= rp
;
8085 static const char *tic6x_unwind_regnames
[16] =
8087 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8088 "A14", "A13", "A12", "A11", "A10",
8089 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8093 decode_tic6x_unwind_regmask (unsigned int mask
)
8097 for (i
= 12; mask
; mask
>>= 1, i
--)
8101 fputs (tic6x_unwind_regnames
[i
], stdout
);
8103 fputs (", ", stdout
);
8109 if (remaining == 0 && more_words) \
8112 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
8113 data_offset, & word, & addr, NULL)) \
8119 #define GET_OP(OP) \
8124 (OP) = word >> 24; \
8129 printf (_("[Truncated opcode]\n")); \
8132 printf ("0x%02x ", OP)
8135 decode_arm_unwind_bytecode (struct arm_unw_aux_info
* aux
,
8137 unsigned int remaining
,
8138 unsigned int more_words
,
8139 bfd_vma data_offset
,
8140 Elf_Internal_Shdr
* data_sec
,
8141 struct arm_section
* data_arm_sec
)
8143 struct absaddr addr
;
8145 /* Decode the unwinding instructions. */
8148 unsigned int op
, op2
;
8157 printf (" 0x%02x ", op
);
8159 if ((op
& 0xc0) == 0x00)
8161 int offset
= ((op
& 0x3f) << 2) + 4;
8163 printf (" vsp = vsp + %d", offset
);
8165 else if ((op
& 0xc0) == 0x40)
8167 int offset
= ((op
& 0x3f) << 2) + 4;
8169 printf (" vsp = vsp - %d", offset
);
8171 else if ((op
& 0xf0) == 0x80)
8174 if (op
== 0x80 && op2
== 0)
8175 printf (_("Refuse to unwind"));
8178 unsigned int mask
= ((op
& 0x0f) << 8) | op2
;
8183 for (i
= 0; i
< 12; i
++)
8184 if (mask
& (1 << i
))
8190 printf ("r%d", 4 + i
);
8195 else if ((op
& 0xf0) == 0x90)
8197 if (op
== 0x9d || op
== 0x9f)
8198 printf (_(" [Reserved]"));
8200 printf (" vsp = r%d", op
& 0x0f);
8202 else if ((op
& 0xf0) == 0xa0)
8204 int end
= 4 + (op
& 0x07);
8209 for (i
= 4; i
<= end
; i
++)
8225 else if (op
== 0xb0)
8226 printf (_(" finish"));
8227 else if (op
== 0xb1)
8230 if (op2
== 0 || (op2
& 0xf0) != 0)
8231 printf (_("[Spare]"));
8234 unsigned int mask
= op2
& 0x0f;
8239 for (i
= 0; i
< 12; i
++)
8240 if (mask
& (1 << i
))
8251 else if (op
== 0xb2)
8253 unsigned char buf
[9];
8254 unsigned int i
, len
;
8255 unsigned long offset
;
8257 for (i
= 0; i
< sizeof (buf
); i
++)
8260 if ((buf
[i
] & 0x80) == 0)
8263 if (i
== sizeof (buf
))
8264 printf (_("corrupt change to vsp"));
8267 offset
= read_uleb128 (buf
, &len
, buf
+ i
+ 1);
8268 assert (len
== i
+ 1);
8269 offset
= offset
* 4 + 0x204;
8270 printf ("vsp = vsp + %ld", offset
);
8273 else if (op
== 0xb3 || op
== 0xc8 || op
== 0xc9)
8275 unsigned int first
, last
;
8282 printf ("pop {D%d", first
);
8284 printf ("-D%d", first
+ last
);
8287 else if ((op
& 0xf8) == 0xb8 || (op
& 0xf8) == 0xd0)
8289 unsigned int count
= op
& 0x07;
8293 printf ("-D%d", 8 + count
);
8296 else if (op
>= 0xc0 && op
<= 0xc5)
8298 unsigned int count
= op
& 0x07;
8300 printf (" pop {wR10");
8302 printf ("-wR%d", 10 + count
);
8305 else if (op
== 0xc6)
8307 unsigned int first
, last
;
8312 printf ("pop {wR%d", first
);
8314 printf ("-wR%d", first
+ last
);
8317 else if (op
== 0xc7)
8320 if (op2
== 0 || (op2
& 0xf0) != 0)
8321 printf (_("[Spare]"));
8324 unsigned int mask
= op2
& 0x0f;
8329 for (i
= 0; i
< 4; i
++)
8330 if (mask
& (1 << i
))
8336 printf ("wCGR%d", i
);
8342 printf (_(" [unsupported opcode]"));
8348 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info
* aux
,
8350 unsigned int remaining
,
8351 unsigned int more_words
,
8352 bfd_vma data_offset
,
8353 Elf_Internal_Shdr
* data_sec
,
8354 struct arm_section
* data_arm_sec
)
8356 struct absaddr addr
;
8358 /* Decode the unwinding instructions. */
8361 unsigned int op
, op2
;
8370 printf (" 0x%02x ", op
);
8372 if ((op
& 0xc0) == 0x00)
8374 int offset
= ((op
& 0x3f) << 3) + 8;
8375 printf (" sp = sp + %d", offset
);
8377 else if ((op
& 0xc0) == 0x80)
8380 if (op
== 0x80 && op2
== 0)
8381 printf (_("Refuse to unwind"));
8384 unsigned int mask
= ((op
& 0x1f) << 8) | op2
;
8386 printf ("pop compact {");
8390 decode_tic6x_unwind_regmask (mask
);
8394 else if ((op
& 0xf0) == 0xc0)
8402 unsigned int offset
;
8406 /* Scan entire instruction first so that GET_OP output is not
8407 interleaved with disassembly. */
8409 for (i
= 0; nregs
< (op
& 0xf); i
++)
8415 regpos
[nregs
].offset
= i
* 2;
8416 regpos
[nregs
].reg
= reg
;
8423 regpos
[nregs
].offset
= i
* 2 + 1;
8424 regpos
[nregs
].reg
= reg
;
8429 printf (_("pop frame {"));
8431 for (i
= i
* 2; i
> 0; i
--)
8433 if (regpos
[reg
].offset
== i
- 1)
8435 name
= tic6x_unwind_regnames
[regpos
[reg
].reg
];
8442 fputs (name
, stdout
);
8449 else if (op
== 0xd0)
8450 printf (" MOV FP, SP");
8451 else if (op
== 0xd1)
8452 printf (" __c6xabi_pop_rts");
8453 else if (op
== 0xd2)
8455 unsigned char buf
[9];
8456 unsigned int i
, len
;
8457 unsigned long offset
;
8459 for (i
= 0; i
< sizeof (buf
); i
++)
8462 if ((buf
[i
] & 0x80) == 0)
8465 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8466 if (i
== sizeof (buf
))
8468 printf ("<corrupt sp adjust>\n");
8469 warn (_("Corrupt stack pointer adjustment detected\n"));
8473 offset
= read_uleb128 (buf
, &len
, buf
+ i
+ 1);
8474 assert (len
== i
+ 1);
8475 offset
= offset
* 8 + 0x408;
8476 printf (_("sp = sp + %ld"), offset
);
8478 else if ((op
& 0xf0) == 0xe0)
8480 if ((op
& 0x0f) == 7)
8483 printf (" MV %s, B3", tic6x_unwind_regnames
[op
& 0x0f]);
8487 printf (_(" [unsupported opcode]"));
8494 arm_expand_prel31 (bfd_vma word
, bfd_vma where
)
8498 offset
= word
& 0x7fffffff;
8499 if (offset
& 0x40000000)
8500 offset
|= ~ (bfd_vma
) 0x7fffffff;
8502 if (elf_header
.e_machine
== EM_TI_C6000
)
8505 return offset
+ where
;
8509 decode_arm_unwind (struct arm_unw_aux_info
* aux
,
8511 unsigned int remaining
,
8512 bfd_vma data_offset
,
8513 Elf_Internal_Shdr
* data_sec
,
8514 struct arm_section
* data_arm_sec
)
8517 unsigned int more_words
= 0;
8518 struct absaddr addr
;
8519 bfd_vma sym_name
= (bfd_vma
) -1;
8523 /* Fetch the first word.
8524 Note - when decoding an object file the address extracted
8525 here will always be 0. So we also pass in the sym_name
8526 parameter so that we can find the symbol associated with
8527 the personality routine. */
8528 if (! get_unwind_section_word (aux
, data_arm_sec
, data_sec
, data_offset
,
8529 & word
, & addr
, & sym_name
))
8535 if ((word
& 0x80000000) == 0)
8537 /* Expand prel31 for personality routine. */
8539 const char *procname
;
8541 fn
= arm_expand_prel31 (word
, data_sec
->sh_addr
+ data_offset
);
8542 printf (_(" Personality routine: "));
8544 && addr
.section
== SHN_UNDEF
&& addr
.offset
== 0
8545 && sym_name
!= (bfd_vma
) -1 && sym_name
< aux
->strtab_size
)
8547 procname
= aux
->strtab
+ sym_name
;
8548 print_vma (fn
, PREFIX_HEX
);
8551 fputs (" <", stdout
);
8552 fputs (procname
, stdout
);
8553 fputc ('>', stdout
);
8557 procname
= arm_print_vma_and_name (aux
, fn
, addr
);
8558 fputc ('\n', stdout
);
8560 /* The GCC personality routines use the standard compact
8561 encoding, starting with one byte giving the number of
8563 if (procname
!= NULL
8564 && (const_strneq (procname
, "__gcc_personality_v0")
8565 || const_strneq (procname
, "__gxx_personality_v0")
8566 || const_strneq (procname
, "__gcj_personality_v0")
8567 || const_strneq (procname
, "__gnu_objc_personality_v0")))
8574 printf (_(" [Truncated data]\n"));
8577 more_words
= word
>> 24;
8587 /* ARM EHABI Section 6.3:
8589 An exception-handling table entry for the compact model looks like:
8593 1 0 index Data for personalityRoutine[index] */
8595 if (elf_header
.e_machine
== EM_ARM
8596 && (word
& 0x70000000))
8597 warn (_("Corrupt ARM compact model table entry: %x \n"), word
);
8599 per_index
= (word
>> 24) & 0x7f;
8600 printf (_(" Compact model index: %d\n"), per_index
);
8607 else if (per_index
< 3)
8609 more_words
= (word
>> 16) & 0xff;
8615 switch (elf_header
.e_machine
)
8620 decode_arm_unwind_bytecode (aux
, word
, remaining
, more_words
,
8621 data_offset
, data_sec
, data_arm_sec
);
8625 warn (_("Unknown ARM compact model index encountered\n"));
8626 printf (_(" [reserved]\n"));
8633 decode_tic6x_unwind_bytecode (aux
, word
, remaining
, more_words
,
8634 data_offset
, data_sec
, data_arm_sec
);
8636 else if (per_index
< 5)
8638 if (((word
>> 17) & 0x7f) == 0x7f)
8639 printf (_(" Restore stack from frame pointer\n"));
8641 printf (_(" Stack increment %d\n"), (word
>> 14) & 0x1fc);
8642 printf (_(" Registers restored: "));
8644 printf (" (compact) ");
8645 decode_tic6x_unwind_regmask ((word
>> 4) & 0x1fff);
8647 printf (_(" Return register: %s\n"),
8648 tic6x_unwind_regnames
[word
& 0xf]);
8651 printf (_(" [reserved (%d)]\n"), per_index
);
8655 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8656 elf_header
.e_machine
);
8659 /* Decode the descriptors. Not implemented. */
8663 dump_arm_unwind (struct arm_unw_aux_info
*aux
, Elf_Internal_Shdr
*exidx_sec
)
8665 struct arm_section exidx_arm_sec
, extab_arm_sec
;
8666 unsigned int i
, exidx_len
;
8667 unsigned long j
, nfuns
;
8669 memset (&exidx_arm_sec
, 0, sizeof (exidx_arm_sec
));
8670 memset (&extab_arm_sec
, 0, sizeof (extab_arm_sec
));
8671 exidx_len
= exidx_sec
->sh_size
/ 8;
8673 aux
->funtab
= xmalloc (aux
->nsyms
* sizeof (Elf_Internal_Sym
));
8674 for (nfuns
= 0, j
= 0; j
< aux
->nsyms
; j
++)
8675 if (aux
->symtab
[j
].st_value
&& ELF_ST_TYPE (aux
->symtab
[j
].st_info
) == STT_FUNC
)
8676 aux
->funtab
[nfuns
++] = aux
->symtab
[j
];
8678 qsort (aux
->funtab
, aux
->nfuns
, sizeof (Elf_Internal_Sym
), symcmp
);
8680 for (i
= 0; i
< exidx_len
; i
++)
8682 unsigned int exidx_fn
, exidx_entry
;
8683 struct absaddr fn_addr
, entry_addr
;
8686 fputc ('\n', stdout
);
8688 if (! get_unwind_section_word (aux
, & exidx_arm_sec
, exidx_sec
,
8689 8 * i
, & exidx_fn
, & fn_addr
, NULL
)
8690 || ! get_unwind_section_word (aux
, & exidx_arm_sec
, exidx_sec
,
8691 8 * i
+ 4, & exidx_entry
, & entry_addr
, NULL
))
8694 arm_free_section (& exidx_arm_sec
);
8695 arm_free_section (& extab_arm_sec
);
8699 /* ARM EHABI, Section 5:
8700 An index table entry consists of 2 words.
8701 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
8702 if (exidx_fn
& 0x80000000)
8703 warn (_("corrupt index table entry: %x\n"), exidx_fn
);
8705 fn
= arm_expand_prel31 (exidx_fn
, exidx_sec
->sh_addr
+ 8 * i
);
8707 arm_print_vma_and_name (aux
, fn
, fn_addr
);
8708 fputs (": ", stdout
);
8710 if (exidx_entry
== 1)
8712 print_vma (exidx_entry
, PREFIX_HEX
);
8713 fputs (" [cantunwind]\n", stdout
);
8715 else if (exidx_entry
& 0x80000000)
8717 print_vma (exidx_entry
, PREFIX_HEX
);
8718 fputc ('\n', stdout
);
8719 decode_arm_unwind (aux
, exidx_entry
, 4, 0, NULL
, NULL
);
8723 bfd_vma table
, table_offset
= 0;
8724 Elf_Internal_Shdr
*table_sec
;
8726 fputs ("@", stdout
);
8727 table
= arm_expand_prel31 (exidx_entry
, exidx_sec
->sh_addr
+ 8 * i
+ 4);
8728 print_vma (table
, PREFIX_HEX
);
8731 /* Locate the matching .ARM.extab. */
8732 if (entry_addr
.section
!= SHN_UNDEF
8733 && entry_addr
.section
< elf_header
.e_shnum
)
8735 table_sec
= section_headers
+ entry_addr
.section
;
8736 table_offset
= entry_addr
.offset
;
8738 if (table_offset
> table_sec
->sh_size
8739 || ((bfd_signed_vma
) table_offset
) < 0)
8741 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8742 (unsigned long) table_offset
,
8743 printable_section_name (table_sec
));
8749 table_sec
= find_section_by_address (table
);
8750 if (table_sec
!= NULL
)
8751 table_offset
= table
- table_sec
->sh_addr
;
8753 if (table_sec
== NULL
)
8755 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8756 (unsigned long) table
);
8759 decode_arm_unwind (aux
, 0, 0, table_offset
, table_sec
,
8767 arm_free_section (&exidx_arm_sec
);
8768 arm_free_section (&extab_arm_sec
);
8771 /* Used for both ARM and C6X unwinding tables. */
8774 arm_process_unwind (FILE *file
)
8776 struct arm_unw_aux_info aux
;
8777 Elf_Internal_Shdr
*unwsec
= NULL
;
8778 Elf_Internal_Shdr
*strsec
;
8779 Elf_Internal_Shdr
*sec
;
8781 unsigned int sec_type
;
8783 switch (elf_header
.e_machine
)
8786 sec_type
= SHT_ARM_EXIDX
;
8790 sec_type
= SHT_C6000_UNWIND
;
8794 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
8795 elf_header
.e_machine
);
8799 if (string_table
== NULL
)
8802 memset (& aux
, 0, sizeof (aux
));
8805 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
8807 if (sec
->sh_type
== SHT_SYMTAB
&& sec
->sh_link
< elf_header
.e_shnum
)
8809 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
, & aux
.nsyms
);
8811 strsec
= section_headers
+ sec
->sh_link
;
8813 /* PR binutils/17531 file: 011-12666-0.004. */
8814 if (aux
.strtab
!= NULL
)
8816 error (_("Multiple string tables found in file.\n"));
8819 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
8820 1, strsec
->sh_size
, _("string table"));
8821 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
8823 else if (sec
->sh_type
== sec_type
)
8828 printf (_("\nThere are no unwind sections in this file.\n"));
8830 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
8832 if (sec
->sh_type
== sec_type
)
8834 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8835 printable_section_name (sec
),
8836 (unsigned long) sec
->sh_offset
,
8837 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
)));
8839 dump_arm_unwind (&aux
, sec
);
8846 free ((char *) aux
.strtab
);
8850 process_unwind (FILE * file
)
8852 struct unwind_handler
8855 void (* handler
)(FILE *);
8858 { EM_ARM
, arm_process_unwind
},
8859 { EM_IA_64
, ia64_process_unwind
},
8860 { EM_PARISC
, hppa_process_unwind
},
8861 { EM_TI_C6000
, arm_process_unwind
},
8869 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
8870 if (elf_header
.e_machine
== handlers
[i
].machtype
)
8872 handlers
[i
].handler (file
);
8876 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8877 get_machine_name (elf_header
.e_machine
));
8881 dynamic_section_mips_val (Elf_Internal_Dyn
* entry
)
8883 switch (entry
->d_tag
)
8886 if (entry
->d_un
.d_val
== 0)
8890 static const char * opts
[] =
8892 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8893 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8894 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8895 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8901 for (cnt
= 0; cnt
< ARRAY_SIZE (opts
); ++cnt
)
8902 if (entry
->d_un
.d_val
& (1 << cnt
))
8904 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
8910 case DT_MIPS_IVERSION
:
8911 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
8912 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
8916 sprintf_vma (buf
, entry
->d_un
.d_ptr
);
8917 /* Note: coded this way so that there is a single string for translation. */
8918 printf (_("<corrupt: %s>"), buf
);
8922 case DT_MIPS_TIME_STAMP
:
8926 time_t atime
= entry
->d_un
.d_val
;
8928 tmp
= gmtime (&atime
);
8929 /* PR 17531: file: 6accc532. */
8931 snprintf (timebuf
, sizeof (timebuf
), _("<corrupt>"));
8933 snprintf (timebuf
, sizeof (timebuf
), "%04u-%02u-%02uT%02u:%02u:%02u",
8934 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
8935 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
8936 printf (_("Time Stamp: %s"), timebuf
);
8940 case DT_MIPS_RLD_VERSION
:
8941 case DT_MIPS_LOCAL_GOTNO
:
8942 case DT_MIPS_CONFLICTNO
:
8943 case DT_MIPS_LIBLISTNO
:
8944 case DT_MIPS_SYMTABNO
:
8945 case DT_MIPS_UNREFEXTNO
:
8946 case DT_MIPS_HIPAGENO
:
8947 case DT_MIPS_DELTA_CLASS_NO
:
8948 case DT_MIPS_DELTA_INSTANCE_NO
:
8949 case DT_MIPS_DELTA_RELOC_NO
:
8950 case DT_MIPS_DELTA_SYM_NO
:
8951 case DT_MIPS_DELTA_CLASSSYM_NO
:
8952 case DT_MIPS_COMPACT_SIZE
:
8953 print_vma (entry
->d_un
.d_val
, DEC
);
8957 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
8963 dynamic_section_parisc_val (Elf_Internal_Dyn
* entry
)
8965 switch (entry
->d_tag
)
8967 case DT_HP_DLD_FLAGS
:
8976 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
8977 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
8978 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
8979 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
8980 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
8981 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
8982 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
8983 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
8984 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
8985 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
8986 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" },
8987 { DT_HP_GST
, "HP_GST" },
8988 { DT_HP_SHLIB_FIXED
, "HP_SHLIB_FIXED" },
8989 { DT_HP_MERGE_SHLIB_SEG
, "HP_MERGE_SHLIB_SEG" },
8990 { DT_HP_NODELETE
, "HP_NODELETE" },
8991 { DT_HP_GROUP
, "HP_GROUP" },
8992 { DT_HP_PROTECT_LINKAGE_TABLE
, "HP_PROTECT_LINKAGE_TABLE" }
8996 bfd_vma val
= entry
->d_un
.d_val
;
8998 for (cnt
= 0; cnt
< ARRAY_SIZE (flags
); ++cnt
)
8999 if (val
& flags
[cnt
].bit
)
9003 fputs (flags
[cnt
].str
, stdout
);
9005 val
^= flags
[cnt
].bit
;
9008 if (val
!= 0 || first
)
9012 print_vma (val
, HEX
);
9018 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
9026 /* VMS vs Unix time offset and factor. */
9028 #define VMS_EPOCH_OFFSET 35067168000000000LL
9029 #define VMS_GRANULARITY_FACTOR 10000000
9031 /* Display a VMS time in a human readable format. */
9034 print_vms_time (bfd_int64_t vmstime
)
9039 unxtime
= (vmstime
- VMS_EPOCH_OFFSET
) / VMS_GRANULARITY_FACTOR
;
9040 tm
= gmtime (&unxtime
);
9041 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9042 tm
->tm_year
+ 1900, tm
->tm_mon
+ 1, tm
->tm_mday
,
9043 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
9048 dynamic_section_ia64_val (Elf_Internal_Dyn
* entry
)
9050 switch (entry
->d_tag
)
9052 case DT_IA_64_PLT_RESERVE
:
9053 /* First 3 slots reserved. */
9054 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
9056 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
9059 case DT_IA_64_VMS_LINKTIME
:
9061 print_vms_time (entry
->d_un
.d_val
);
9065 case DT_IA_64_VMS_LNKFLAGS
:
9066 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
9067 if (entry
->d_un
.d_val
& VMS_LF_CALL_DEBUG
)
9068 printf (" CALL_DEBUG");
9069 if (entry
->d_un
.d_val
& VMS_LF_NOP0BUFS
)
9070 printf (" NOP0BUFS");
9071 if (entry
->d_un
.d_val
& VMS_LF_P0IMAGE
)
9072 printf (" P0IMAGE");
9073 if (entry
->d_un
.d_val
& VMS_LF_MKTHREADS
)
9074 printf (" MKTHREADS");
9075 if (entry
->d_un
.d_val
& VMS_LF_UPCALLS
)
9076 printf (" UPCALLS");
9077 if (entry
->d_un
.d_val
& VMS_LF_IMGSTA
)
9079 if (entry
->d_un
.d_val
& VMS_LF_INITIALIZE
)
9080 printf (" INITIALIZE");
9081 if (entry
->d_un
.d_val
& VMS_LF_MAIN
)
9083 if (entry
->d_un
.d_val
& VMS_LF_EXE_INIT
)
9084 printf (" EXE_INIT");
9085 if (entry
->d_un
.d_val
& VMS_LF_TBK_IN_IMG
)
9086 printf (" TBK_IN_IMG");
9087 if (entry
->d_un
.d_val
& VMS_LF_DBG_IN_IMG
)
9088 printf (" DBG_IN_IMG");
9089 if (entry
->d_un
.d_val
& VMS_LF_TBK_IN_DSF
)
9090 printf (" TBK_IN_DSF");
9091 if (entry
->d_un
.d_val
& VMS_LF_DBG_IN_DSF
)
9092 printf (" DBG_IN_DSF");
9093 if (entry
->d_un
.d_val
& VMS_LF_SIGNATURES
)
9094 printf (" SIGNATURES");
9095 if (entry
->d_un
.d_val
& VMS_LF_REL_SEG_OFF
)
9096 printf (" REL_SEG_OFF");
9100 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
9107 get_32bit_dynamic_section (FILE * file
)
9109 Elf32_External_Dyn
* edyn
;
9110 Elf32_External_Dyn
* ext
;
9111 Elf_Internal_Dyn
* entry
;
9113 edyn
= (Elf32_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
, 1,
9114 dynamic_size
, _("dynamic section"));
9118 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9119 might not have the luxury of section headers. Look for the DT_NULL
9120 terminator to determine the number of entries. */
9121 for (ext
= edyn
, dynamic_nent
= 0;
9122 (char *) (ext
+ 1) <= (char *) edyn
+ dynamic_size
;
9126 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
9130 dynamic_section
= (Elf_Internal_Dyn
*) cmalloc (dynamic_nent
,
9132 if (dynamic_section
== NULL
)
9134 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9135 (unsigned long) dynamic_nent
);
9140 for (ext
= edyn
, entry
= dynamic_section
;
9141 entry
< dynamic_section
+ dynamic_nent
;
9144 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
9145 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
9154 get_64bit_dynamic_section (FILE * file
)
9156 Elf64_External_Dyn
* edyn
;
9157 Elf64_External_Dyn
* ext
;
9158 Elf_Internal_Dyn
* entry
;
9160 /* Read in the data. */
9161 edyn
= (Elf64_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
, 1,
9162 dynamic_size
, _("dynamic section"));
9166 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9167 might not have the luxury of section headers. Look for the DT_NULL
9168 terminator to determine the number of entries. */
9169 for (ext
= edyn
, dynamic_nent
= 0;
9170 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
9171 (char *) (ext
+ 1) <= (char *) edyn
+ dynamic_size
;
9175 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
9179 dynamic_section
= (Elf_Internal_Dyn
*) cmalloc (dynamic_nent
,
9181 if (dynamic_section
== NULL
)
9183 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9184 (unsigned long) dynamic_nent
);
9189 /* Convert from external to internal formats. */
9190 for (ext
= edyn
, entry
= dynamic_section
;
9191 entry
< dynamic_section
+ dynamic_nent
;
9194 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
9195 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
9204 print_dynamic_flags (bfd_vma flags
)
9212 flag
= flags
& - flags
;
9222 case DF_ORIGIN
: fputs ("ORIGIN", stdout
); break;
9223 case DF_SYMBOLIC
: fputs ("SYMBOLIC", stdout
); break;
9224 case DF_TEXTREL
: fputs ("TEXTREL", stdout
); break;
9225 case DF_BIND_NOW
: fputs ("BIND_NOW", stdout
); break;
9226 case DF_STATIC_TLS
: fputs ("STATIC_TLS", stdout
); break;
9227 default: fputs (_("unknown"), stdout
); break;
9233 /* Parse and display the contents of the dynamic section. */
9236 process_dynamic_section (FILE * file
)
9238 Elf_Internal_Dyn
* entry
;
9240 if (dynamic_size
== 0)
9243 printf (_("\nThere is no dynamic section in this file.\n"));
9250 if (! get_32bit_dynamic_section (file
))
9253 else if (! get_64bit_dynamic_section (file
))
9256 /* Find the appropriate symbol table. */
9257 if (dynamic_symbols
== NULL
)
9259 for (entry
= dynamic_section
;
9260 entry
< dynamic_section
+ dynamic_nent
;
9263 Elf_Internal_Shdr section
;
9265 if (entry
->d_tag
!= DT_SYMTAB
)
9268 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
9270 /* Since we do not know how big the symbol table is,
9271 we default to reading in the entire file (!) and
9272 processing that. This is overkill, I know, but it
9274 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
9276 if (archive_file_offset
!= 0)
9277 section
.sh_size
= archive_file_size
- section
.sh_offset
;
9280 if (fseek (file
, 0, SEEK_END
))
9281 error (_("Unable to seek to end of file!\n"));
9283 section
.sh_size
= ftell (file
) - section
.sh_offset
;
9287 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
9289 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
9290 section
.sh_name
= string_table_length
;
9292 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
, & num_dynamic_syms
);
9293 if (num_dynamic_syms
< 1)
9295 error (_("Unable to determine the number of symbols to load\n"));
9301 /* Similarly find a string table. */
9302 if (dynamic_strings
== NULL
)
9304 for (entry
= dynamic_section
;
9305 entry
< dynamic_section
+ dynamic_nent
;
9308 unsigned long offset
;
9311 if (entry
->d_tag
!= DT_STRTAB
)
9314 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
9316 /* Since we do not know how big the string table is,
9317 we default to reading in the entire file (!) and
9318 processing that. This is overkill, I know, but it
9321 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
9323 if (archive_file_offset
!= 0)
9324 str_tab_len
= archive_file_size
- offset
;
9327 if (fseek (file
, 0, SEEK_END
))
9328 error (_("Unable to seek to end of file\n"));
9329 str_tab_len
= ftell (file
) - offset
;
9332 if (str_tab_len
< 1)
9335 (_("Unable to determine the length of the dynamic string table\n"));
9339 dynamic_strings
= (char *) get_data (NULL
, file
, offset
, 1,
9341 _("dynamic string table"));
9342 dynamic_strings_length
= dynamic_strings
== NULL
? 0 : str_tab_len
;
9347 /* And find the syminfo section if available. */
9348 if (dynamic_syminfo
== NULL
)
9350 unsigned long syminsz
= 0;
9352 for (entry
= dynamic_section
;
9353 entry
< dynamic_section
+ dynamic_nent
;
9356 if (entry
->d_tag
== DT_SYMINENT
)
9358 /* Note: these braces are necessary to avoid a syntax
9359 error from the SunOS4 C compiler. */
9360 /* PR binutils/17531: A corrupt file can trigger this test.
9361 So do not use an assert, instead generate an error message. */
9362 if (sizeof (Elf_External_Syminfo
) != entry
->d_un
.d_val
)
9363 error (_("Bad value (%d) for SYMINENT entry\n"),
9364 (int) entry
->d_un
.d_val
);
9366 else if (entry
->d_tag
== DT_SYMINSZ
)
9367 syminsz
= entry
->d_un
.d_val
;
9368 else if (entry
->d_tag
== DT_SYMINFO
)
9369 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
9373 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
9375 Elf_External_Syminfo
* extsyminfo
;
9376 Elf_External_Syminfo
* extsym
;
9377 Elf_Internal_Syminfo
* syminfo
;
9379 /* There is a syminfo section. Read the data. */
9380 extsyminfo
= (Elf_External_Syminfo
*)
9381 get_data (NULL
, file
, dynamic_syminfo_offset
, 1, syminsz
,
9382 _("symbol information"));
9386 dynamic_syminfo
= (Elf_Internal_Syminfo
*) malloc (syminsz
);
9387 if (dynamic_syminfo
== NULL
)
9389 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9390 (unsigned long) syminsz
);
9394 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
9395 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
9396 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
9397 ++syminfo
, ++extsym
)
9399 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
9400 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
9407 if (do_dynamic
&& dynamic_addr
)
9408 printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9409 dynamic_addr
, (unsigned long) dynamic_nent
);
9411 printf (_(" Tag Type Name/Value\n"));
9413 for (entry
= dynamic_section
;
9414 entry
< dynamic_section
+ dynamic_nent
;
9422 print_vma (entry
->d_tag
, FULL_HEX
);
9423 dtype
= get_dynamic_type (entry
->d_tag
);
9424 printf (" (%s)%*s", dtype
,
9425 ((is_32bit_elf
? 27 : 19)
9426 - (int) strlen (dtype
)),
9430 switch (entry
->d_tag
)
9434 print_dynamic_flags (entry
->d_un
.d_val
);
9444 switch (entry
->d_tag
)
9447 printf (_("Auxiliary library"));
9451 printf (_("Filter library"));
9455 printf (_("Configuration file"));
9459 printf (_("Dependency audit library"));
9463 printf (_("Audit library"));
9467 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
9468 printf (": [%s]\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
9472 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
9481 printf (_("Flags:"));
9483 if (entry
->d_un
.d_val
== 0)
9484 printf (_(" None\n"));
9487 unsigned long int val
= entry
->d_un
.d_val
;
9489 if (val
& DTF_1_PARINIT
)
9491 printf (" PARINIT");
9492 val
^= DTF_1_PARINIT
;
9494 if (val
& DTF_1_CONFEXP
)
9496 printf (" CONFEXP");
9497 val
^= DTF_1_CONFEXP
;
9500 printf (" %lx", val
);
9509 printf (_("Flags:"));
9511 if (entry
->d_un
.d_val
== 0)
9512 printf (_(" None\n"));
9515 unsigned long int val
= entry
->d_un
.d_val
;
9517 if (val
& DF_P1_LAZYLOAD
)
9519 printf (" LAZYLOAD");
9520 val
^= DF_P1_LAZYLOAD
;
9522 if (val
& DF_P1_GROUPPERM
)
9524 printf (" GROUPPERM");
9525 val
^= DF_P1_GROUPPERM
;
9528 printf (" %lx", val
);
9537 printf (_("Flags:"));
9538 if (entry
->d_un
.d_val
== 0)
9539 printf (_(" None\n"));
9542 unsigned long int val
= entry
->d_un
.d_val
;
9549 if (val
& DF_1_GLOBAL
)
9554 if (val
& DF_1_GROUP
)
9559 if (val
& DF_1_NODELETE
)
9561 printf (" NODELETE");
9562 val
^= DF_1_NODELETE
;
9564 if (val
& DF_1_LOADFLTR
)
9566 printf (" LOADFLTR");
9567 val
^= DF_1_LOADFLTR
;
9569 if (val
& DF_1_INITFIRST
)
9571 printf (" INITFIRST");
9572 val
^= DF_1_INITFIRST
;
9574 if (val
& DF_1_NOOPEN
)
9579 if (val
& DF_1_ORIGIN
)
9584 if (val
& DF_1_DIRECT
)
9589 if (val
& DF_1_TRANS
)
9594 if (val
& DF_1_INTERPOSE
)
9596 printf (" INTERPOSE");
9597 val
^= DF_1_INTERPOSE
;
9599 if (val
& DF_1_NODEFLIB
)
9601 printf (" NODEFLIB");
9602 val
^= DF_1_NODEFLIB
;
9604 if (val
& DF_1_NODUMP
)
9609 if (val
& DF_1_CONFALT
)
9611 printf (" CONFALT");
9612 val
^= DF_1_CONFALT
;
9614 if (val
& DF_1_ENDFILTEE
)
9616 printf (" ENDFILTEE");
9617 val
^= DF_1_ENDFILTEE
;
9619 if (val
& DF_1_DISPRELDNE
)
9621 printf (" DISPRELDNE");
9622 val
^= DF_1_DISPRELDNE
;
9624 if (val
& DF_1_DISPRELPND
)
9626 printf (" DISPRELPND");
9627 val
^= DF_1_DISPRELPND
;
9629 if (val
& DF_1_NODIRECT
)
9631 printf (" NODIRECT");
9632 val
^= DF_1_NODIRECT
;
9634 if (val
& DF_1_IGNMULDEF
)
9636 printf (" IGNMULDEF");
9637 val
^= DF_1_IGNMULDEF
;
9639 if (val
& DF_1_NOKSYMS
)
9641 printf (" NOKSYMS");
9642 val
^= DF_1_NOKSYMS
;
9644 if (val
& DF_1_NOHDR
)
9649 if (val
& DF_1_EDITED
)
9654 if (val
& DF_1_NORELOC
)
9656 printf (" NORELOC");
9657 val
^= DF_1_NORELOC
;
9659 if (val
& DF_1_SYMINTPOSE
)
9661 printf (" SYMINTPOSE");
9662 val
^= DF_1_SYMINTPOSE
;
9664 if (val
& DF_1_GLOBAUDIT
)
9666 printf (" GLOBAUDIT");
9667 val
^= DF_1_GLOBAUDIT
;
9669 if (val
& DF_1_SINGLETON
)
9671 printf (" SINGLETON");
9672 val
^= DF_1_SINGLETON
;
9674 if (val
& DF_1_STUB
)
9685 printf (" %lx", val
);
9692 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
9694 puts (get_dynamic_type (entry
->d_un
.d_val
));
9714 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
9720 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
9721 name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
9727 switch (entry
->d_tag
)
9730 printf (_("Shared library: [%s]"), name
);
9732 if (streq (name
, program_interpreter
))
9733 printf (_(" program interpreter"));
9737 printf (_("Library soname: [%s]"), name
);
9741 printf (_("Library rpath: [%s]"), name
);
9745 printf (_("Library runpath: [%s]"), name
);
9749 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
9754 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
9767 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
9772 case DT_INIT_ARRAYSZ
:
9773 case DT_FINI_ARRAYSZ
:
9774 case DT_GNU_CONFLICTSZ
:
9775 case DT_GNU_LIBLISTSZ
:
9778 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
9779 printf (_(" (bytes)\n"));
9789 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
9802 if (entry
->d_tag
== DT_USED
9803 && VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
9805 char * name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
9809 printf (_("Not needed object: [%s]\n"), name
);
9814 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
9820 /* The value of this entry is ignored. */
9825 case DT_GNU_PRELINKED
:
9829 time_t atime
= entry
->d_un
.d_val
;
9831 tmp
= gmtime (&atime
);
9832 /* PR 17533 file: 041-1244816-0.004. */
9834 printf (_("<corrupt time val: %lx"),
9835 (unsigned long) atime
);
9837 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9838 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9839 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9845 dynamic_info_DT_GNU_HASH
= entry
->d_un
.d_val
;
9848 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
9854 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
9855 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
9860 switch (elf_header
.e_machine
)
9863 case EM_MIPS_RS3_LE
:
9864 dynamic_section_mips_val (entry
);
9867 dynamic_section_parisc_val (entry
);
9870 dynamic_section_ia64_val (entry
);
9873 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
9885 get_ver_flags (unsigned int flags
)
9887 static char buff
[32];
9894 if (flags
& VER_FLG_BASE
)
9895 strcat (buff
, "BASE ");
9897 if (flags
& VER_FLG_WEAK
)
9899 if (flags
& VER_FLG_BASE
)
9900 strcat (buff
, "| ");
9902 strcat (buff
, "WEAK ");
9905 if (flags
& VER_FLG_INFO
)
9907 if (flags
& (VER_FLG_BASE
|VER_FLG_WEAK
))
9908 strcat (buff
, "| ");
9910 strcat (buff
, "INFO ");
9913 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
| VER_FLG_INFO
))
9914 strcat (buff
, _("| <unknown>"));
9919 /* Display the contents of the version sections. */
9922 process_version_sections (FILE * file
)
9924 Elf_Internal_Shdr
* section
;
9931 for (i
= 0, section
= section_headers
;
9932 i
< elf_header
.e_shnum
;
9935 switch (section
->sh_type
)
9937 case SHT_GNU_verdef
:
9939 Elf_External_Verdef
* edefs
;
9946 printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9947 printable_section_name (section
),
9950 printf (_(" Addr: 0x"));
9951 printf_vma (section
->sh_addr
);
9952 printf (_(" Offset: %#08lx Link: %u (%s)"),
9953 (unsigned long) section
->sh_offset
, section
->sh_link
,
9954 printable_section_name_from_index (section
->sh_link
));
9956 edefs
= (Elf_External_Verdef
*)
9957 get_data (NULL
, file
, section
->sh_offset
, 1,section
->sh_size
,
9958 _("version definition section"));
9961 endbuf
= (char *) edefs
+ section
->sh_size
;
9963 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
9966 Elf_External_Verdef
* edef
;
9967 Elf_Internal_Verdef ent
;
9968 Elf_External_Verdaux
* eaux
;
9969 Elf_Internal_Verdaux aux
;
9973 /* Check for very large indices. */
9974 if (idx
> (size_t) (endbuf
- (char *) edefs
))
9977 vstart
= ((char *) edefs
) + idx
;
9978 if (vstart
+ sizeof (*edef
) > endbuf
)
9981 edef
= (Elf_External_Verdef
*) vstart
;
9983 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
9984 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
9985 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
9986 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
9987 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
9988 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
9989 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
9991 printf (_(" %#06x: Rev: %d Flags: %s"),
9992 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
9994 printf (_(" Index: %d Cnt: %d "),
9995 ent
.vd_ndx
, ent
.vd_cnt
);
9997 /* Check for overflow. */
9998 if (ent
.vd_aux
> (size_t) (endbuf
- vstart
))
10001 vstart
+= ent
.vd_aux
;
10003 eaux
= (Elf_External_Verdaux
*) vstart
;
10005 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
10006 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
10008 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
10009 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux
.vda_name
));
10011 printf (_("Name index: %ld\n"), aux
.vda_name
);
10013 isum
= idx
+ ent
.vd_aux
;
10015 for (j
= 1; j
< ent
.vd_cnt
; j
++)
10017 /* Check for overflow. */
10018 if (aux
.vda_next
> (size_t) (endbuf
- vstart
))
10021 isum
+= aux
.vda_next
;
10022 vstart
+= aux
.vda_next
;
10024 eaux
= (Elf_External_Verdaux
*) vstart
;
10025 if (vstart
+ sizeof (*eaux
) > endbuf
)
10028 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
10029 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
10031 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
10032 printf (_(" %#06x: Parent %d: %s\n"),
10033 isum
, j
, GET_DYNAMIC_NAME (aux
.vda_name
));
10035 printf (_(" %#06x: Parent %d, name index: %ld\n"),
10036 isum
, j
, aux
.vda_name
);
10039 if (j
< ent
.vd_cnt
)
10040 printf (_(" Version def aux past end of section\n"));
10042 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2. */
10043 if (idx
+ ent
.vd_next
<= idx
)
10046 idx
+= ent
.vd_next
;
10049 if (cnt
< section
->sh_info
)
10050 printf (_(" Version definition past end of section\n"));
10056 case SHT_GNU_verneed
:
10058 Elf_External_Verneed
* eneed
;
10065 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
10066 printable_section_name (section
), section
->sh_info
);
10068 printf (_(" Addr: 0x"));
10069 printf_vma (section
->sh_addr
);
10070 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10071 (unsigned long) section
->sh_offset
, section
->sh_link
,
10072 printable_section_name_from_index (section
->sh_link
));
10074 eneed
= (Elf_External_Verneed
*) get_data (NULL
, file
,
10075 section
->sh_offset
, 1,
10077 _("Version Needs section"));
10080 endbuf
= (char *) eneed
+ section
->sh_size
;
10082 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
10084 Elf_External_Verneed
* entry
;
10085 Elf_Internal_Verneed ent
;
10090 if (idx
> (size_t) (endbuf
- (char *) eneed
))
10093 vstart
= ((char *) eneed
) + idx
;
10094 if (vstart
+ sizeof (*entry
) > endbuf
)
10097 entry
= (Elf_External_Verneed
*) vstart
;
10099 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
10100 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
10101 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
10102 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
10103 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
10105 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
10107 if (VALID_DYNAMIC_NAME (ent
.vn_file
))
10108 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent
.vn_file
));
10110 printf (_(" File: %lx"), ent
.vn_file
);
10112 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
10114 /* Check for overflow. */
10115 if (ent
.vn_aux
> (size_t) (endbuf
- vstart
))
10117 vstart
+= ent
.vn_aux
;
10119 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
10121 Elf_External_Vernaux
* eaux
;
10122 Elf_Internal_Vernaux aux
;
10124 if (vstart
+ sizeof (*eaux
) > endbuf
)
10126 eaux
= (Elf_External_Vernaux
*) vstart
;
10128 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
10129 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
10130 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
10131 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
10132 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
10134 if (VALID_DYNAMIC_NAME (aux
.vna_name
))
10135 printf (_(" %#06x: Name: %s"),
10136 isum
, GET_DYNAMIC_NAME (aux
.vna_name
));
10138 printf (_(" %#06x: Name index: %lx"),
10139 isum
, aux
.vna_name
);
10141 printf (_(" Flags: %s Version: %d\n"),
10142 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
10144 /* Check for overflow. */
10145 if (aux
.vna_next
> (size_t) (endbuf
- vstart
)
10146 || (aux
.vna_next
== 0 && j
< ent
.vn_cnt
- 1))
10148 warn (_("Invalid vna_next field of %lx\n"),
10153 isum
+= aux
.vna_next
;
10154 vstart
+= aux
.vna_next
;
10157 if (j
< ent
.vn_cnt
)
10158 warn (_("Missing Version Needs auxillary information\n"));
10160 if (ent
.vn_next
== 0 && cnt
< section
->sh_info
- 1)
10162 warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
10163 cnt
= section
->sh_info
;
10166 idx
+= ent
.vn_next
;
10169 if (cnt
< section
->sh_info
)
10170 warn (_("Missing Version Needs information\n"));
10176 case SHT_GNU_versym
:
10178 Elf_Internal_Shdr
* link_section
;
10181 unsigned char * edata
;
10182 unsigned short * data
;
10184 Elf_Internal_Sym
* symbols
;
10185 Elf_Internal_Shdr
* string_sec
;
10186 unsigned long num_syms
;
10189 if (section
->sh_link
>= elf_header
.e_shnum
)
10192 link_section
= section_headers
+ section
->sh_link
;
10193 total
= section
->sh_size
/ sizeof (Elf_External_Versym
);
10195 if (link_section
->sh_link
>= elf_header
.e_shnum
)
10200 symbols
= GET_ELF_SYMBOLS (file
, link_section
, & num_syms
);
10201 if (symbols
== NULL
)
10204 string_sec
= section_headers
+ link_section
->sh_link
;
10206 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
, 1,
10207 string_sec
->sh_size
,
10208 _("version string table"));
10215 printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
10216 printable_section_name (section
), (unsigned long) total
);
10218 printf (_(" Addr: "));
10219 printf_vma (section
->sh_addr
);
10220 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10221 (unsigned long) section
->sh_offset
, section
->sh_link
,
10222 printable_section_name (link_section
));
10224 off
= offset_from_vma (file
,
10225 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
10226 total
* sizeof (short));
10227 edata
= (unsigned char *) get_data (NULL
, file
, off
, total
,
10229 _("version symbol data"));
10237 data
= (short unsigned int *) cmalloc (total
, sizeof (short));
10239 for (cnt
= total
; cnt
--;)
10240 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
10245 for (cnt
= 0; cnt
< total
; cnt
+= 4)
10249 char *invalid
= _("*invalid*");
10251 printf (" %03x:", cnt
);
10253 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
10254 switch (data
[cnt
+ j
])
10257 fputs (_(" 0 (*local*) "), stdout
);
10261 fputs (_(" 1 (*global*) "), stdout
);
10265 nn
= printf ("%4x%c", data
[cnt
+ j
] & VERSYM_VERSION
,
10266 data
[cnt
+ j
] & VERSYM_HIDDEN
? 'h' : ' ');
10268 /* If this index value is greater than the size of the symbols
10269 array, break to avoid an out-of-bounds read. */
10270 if ((unsigned long)(cnt
+ j
) >= num_syms
)
10272 warn (_("invalid index into symbol array\n"));
10277 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
10279 Elf_Internal_Verneed ivn
;
10280 unsigned long offset
;
10282 offset
= offset_from_vma
10283 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
10284 sizeof (Elf_External_Verneed
));
10288 Elf_Internal_Vernaux ivna
;
10289 Elf_External_Verneed evn
;
10290 Elf_External_Vernaux evna
;
10291 unsigned long a_off
;
10293 if (get_data (&evn
, file
, offset
, sizeof (evn
), 1,
10294 _("version need")) == NULL
)
10297 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
10298 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
10300 a_off
= offset
+ ivn
.vn_aux
;
10304 if (get_data (&evna
, file
, a_off
, sizeof (evna
),
10305 1, _("version need aux (2)")) == NULL
)
10308 ivna
.vna_other
= 0;
10312 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
10313 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
10316 a_off
+= ivna
.vna_next
;
10318 while (ivna
.vna_other
!= data
[cnt
+ j
]
10319 && ivna
.vna_next
!= 0);
10321 if (ivna
.vna_other
== data
[cnt
+ j
])
10323 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
10325 if (ivna
.vna_name
>= string_sec
->sh_size
)
10328 name
= strtab
+ ivna
.vna_name
;
10332 offset
+= ivn
.vn_next
;
10334 while (ivn
.vn_next
);
10337 if (data
[cnt
+ j
] != 0x8001
10338 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
10340 Elf_Internal_Verdef ivd
;
10341 Elf_External_Verdef evd
;
10342 unsigned long offset
;
10344 offset
= offset_from_vma
10345 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
10350 if (get_data (&evd
, file
, offset
, sizeof (evd
), 1,
10351 _("version def")) == NULL
)
10354 /* PR 17531: file: 046-1082287-0.004. */
10355 ivd
.vd_ndx
= (data
[cnt
+ j
] & VERSYM_VERSION
) + 1;
10360 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
10361 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
10364 offset
+= ivd
.vd_next
;
10366 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & VERSYM_VERSION
)
10367 && ivd
.vd_next
!= 0);
10369 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & VERSYM_VERSION
))
10371 Elf_External_Verdaux evda
;
10372 Elf_Internal_Verdaux ivda
;
10374 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
10376 if (get_data (&evda
, file
,
10377 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
10379 _("version def aux")) == NULL
)
10382 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
10384 if (ivda
.vda_name
>= string_sec
->sh_size
)
10386 else if (name
!= NULL
&& name
!= invalid
)
10387 name
= _("*both*");
10389 name
= strtab
+ ivda
.vda_name
;
10393 nn
+= printf ("(%s%-*s",
10395 12 - (int) strlen (name
),
10399 printf ("%*c", 18 - nn
, ' ');
10417 printf (_("\nNo version information found in this file.\n"));
10422 static const char *
10423 get_symbol_binding (unsigned int binding
)
10425 static char buff
[32];
10429 case STB_LOCAL
: return "LOCAL";
10430 case STB_GLOBAL
: return "GLOBAL";
10431 case STB_WEAK
: return "WEAK";
10433 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
10434 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"),
10436 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
10438 if (binding
== STB_GNU_UNIQUE
10439 && (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_GNU
10440 /* GNU is still using the default value 0. */
10441 || elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_NONE
))
10443 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), binding
);
10446 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), binding
);
10451 static const char *
10452 get_symbol_type (unsigned int type
)
10454 static char buff
[32];
10458 case STT_NOTYPE
: return "NOTYPE";
10459 case STT_OBJECT
: return "OBJECT";
10460 case STT_FUNC
: return "FUNC";
10461 case STT_SECTION
: return "SECTION";
10462 case STT_FILE
: return "FILE";
10463 case STT_COMMON
: return "COMMON";
10464 case STT_TLS
: return "TLS";
10465 case STT_RELC
: return "RELC";
10466 case STT_SRELC
: return "SRELC";
10468 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
10470 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
10471 return "THUMB_FUNC";
10473 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
10476 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
10477 return "PARISC_MILLI";
10479 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"), type
);
10481 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
10483 if (elf_header
.e_machine
== EM_PARISC
)
10485 if (type
== STT_HP_OPAQUE
)
10486 return "HP_OPAQUE";
10487 if (type
== STT_HP_STUB
)
10491 if (type
== STT_GNU_IFUNC
10492 && (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_GNU
10493 || elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_FREEBSD
10494 /* GNU is still using the default value 0. */
10495 || elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_NONE
))
10498 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), type
);
10501 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), type
);
10506 static const char *
10507 get_symbol_visibility (unsigned int visibility
)
10509 switch (visibility
)
10511 case STV_DEFAULT
: return "DEFAULT";
10512 case STV_INTERNAL
: return "INTERNAL";
10513 case STV_HIDDEN
: return "HIDDEN";
10514 case STV_PROTECTED
: return "PROTECTED";
10516 error (_("Unrecognized visibility value: %u"), visibility
);
10517 return _("<unknown>");
10521 static const char *
10522 get_solaris_symbol_visibility (unsigned int visibility
)
10524 switch (visibility
)
10526 case 4: return "EXPORTED";
10527 case 5: return "SINGLETON";
10528 case 6: return "ELIMINATE";
10529 default: return get_symbol_visibility (visibility
);
10533 static const char *
10534 get_mips_symbol_other (unsigned int other
)
10544 case STO_MICROMIPS
:
10545 return "MICROMIPS";
10546 case STO_MICROMIPS
| STO_MIPS_PIC
:
10547 return "MICROMIPS, MIPS PIC";
10555 static const char *
10556 get_ia64_symbol_other (unsigned int other
)
10558 if (is_ia64_vms ())
10560 static char res
[32];
10564 /* Function types is for images and .STB files only. */
10565 switch (elf_header
.e_type
)
10569 switch (VMS_ST_FUNC_TYPE (other
))
10571 case VMS_SFT_CODE_ADDR
:
10572 strcat (res
, " CA");
10574 case VMS_SFT_SYMV_IDX
:
10575 strcat (res
, " VEC");
10578 strcat (res
, " FD");
10580 case VMS_SFT_RESERVE
:
10581 strcat (res
, " RSV");
10584 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10585 VMS_ST_FUNC_TYPE (other
));
10586 strcat (res
, " <unknown>");
10593 switch (VMS_ST_LINKAGE (other
))
10595 case VMS_STL_IGNORE
:
10596 strcat (res
, " IGN");
10598 case VMS_STL_RESERVE
:
10599 strcat (res
, " RSV");
10602 strcat (res
, " STD");
10605 strcat (res
, " LNK");
10608 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10609 VMS_ST_LINKAGE (other
));
10610 strcat (res
, " <unknown>");
10622 static const char *
10623 get_ppc64_symbol_other (unsigned int other
)
10625 if (PPC64_LOCAL_ENTRY_OFFSET (other
) != 0)
10627 static char buf
[32];
10628 snprintf (buf
, sizeof buf
, _("<localentry>: %d"),
10629 PPC64_LOCAL_ENTRY_OFFSET (other
));
10635 static const char *
10636 get_symbol_other (unsigned int other
)
10638 const char * result
= NULL
;
10639 static char buff
[32];
10644 switch (elf_header
.e_machine
)
10647 result
= get_mips_symbol_other (other
);
10650 result
= get_ia64_symbol_other (other
);
10653 result
= get_ppc64_symbol_other (other
);
10663 snprintf (buff
, sizeof buff
, _("<other>: %x"), other
);
10667 static const char *
10668 get_symbol_index_type (unsigned int type
)
10670 static char buff
[32];
10674 case SHN_UNDEF
: return "UND";
10675 case SHN_ABS
: return "ABS";
10676 case SHN_COMMON
: return "COM";
10678 if (type
== SHN_IA_64_ANSI_COMMON
10679 && elf_header
.e_machine
== EM_IA_64
10680 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
10682 else if ((elf_header
.e_machine
== EM_X86_64
10683 || elf_header
.e_machine
== EM_L1OM
10684 || elf_header
.e_machine
== EM_K1OM
)
10685 && type
== SHN_X86_64_LCOMMON
)
10686 return "LARGE_COM";
10687 else if ((type
== SHN_MIPS_SCOMMON
10688 && elf_header
.e_machine
== EM_MIPS
)
10689 || (type
== SHN_TIC6X_SCOMMON
10690 && elf_header
.e_machine
== EM_TI_C6000
))
10692 else if (type
== SHN_MIPS_SUNDEFINED
10693 && elf_header
.e_machine
== EM_MIPS
)
10695 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
10696 sprintf (buff
, "PRC[0x%04x]", type
& 0xffff);
10697 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
10698 sprintf (buff
, "OS [0x%04x]", type
& 0xffff);
10699 else if (type
>= SHN_LORESERVE
)
10700 sprintf (buff
, "RSV[0x%04x]", type
& 0xffff);
10701 else if (type
>= elf_header
.e_shnum
)
10702 sprintf (buff
, _("bad section index[%3d]"), type
);
10704 sprintf (buff
, "%3d", type
);
10712 get_dynamic_data (FILE * file
, bfd_size_type number
, unsigned int ent_size
)
10714 unsigned char * e_data
;
10717 /* If the size_t type is smaller than the bfd_size_type, eg because
10718 you are building a 32-bit tool on a 64-bit host, then make sure
10719 that when (number) is cast to (size_t) no information is lost. */
10720 if (sizeof (size_t) < sizeof (bfd_size_type
)
10721 && (bfd_size_type
) ((size_t) number
) != number
)
10723 error (_("Size truncation prevents reading %" BFD_VMA_FMT
"u"
10724 " elements of size %u\n"),
10729 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10730 attempting to allocate memory when the read is bound to fail. */
10731 if (ent_size
* number
> current_file_size
)
10733 error (_("Invalid number of dynamic entries: %" BFD_VMA_FMT
"u\n"),
10738 e_data
= (unsigned char *) cmalloc ((size_t) number
, ent_size
);
10739 if (e_data
== NULL
)
10741 error (_("Out of memory reading %" BFD_VMA_FMT
"u dynamic entries\n"),
10746 if (fread (e_data
, ent_size
, (size_t) number
, file
) != number
)
10748 error (_("Unable to read in %" BFD_VMA_FMT
"u bytes of dynamic data\n"),
10749 number
* ent_size
);
10754 i_data
= (bfd_vma
*) cmalloc ((size_t) number
, sizeof (*i_data
));
10755 if (i_data
== NULL
)
10757 error (_("Out of memory allocating space for %" BFD_VMA_FMT
"u"
10758 " dynamic entries\n"),
10765 i_data
[number
] = byte_get (e_data
+ number
* ent_size
, ent_size
);
10773 print_dynamic_symbol (bfd_vma si
, unsigned long hn
)
10775 Elf_Internal_Sym
* psym
;
10778 n
= print_vma (si
, DEC_5
);
10780 fputs (&" "[n
], stdout
);
10781 printf (" %3lu: ", hn
);
10783 if (dynamic_symbols
== NULL
|| si
>= num_dynamic_syms
)
10785 printf (_("<No info available for dynamic symbol number %lu>\n"),
10786 (unsigned long) si
);
10790 psym
= dynamic_symbols
+ si
;
10791 print_vma (psym
->st_value
, LONG_HEX
);
10793 print_vma (psym
->st_size
, DEC_5
);
10795 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
10796 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
10798 if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_SOLARIS
)
10799 printf (" %-7s", get_solaris_symbol_visibility (psym
->st_other
));
10802 unsigned int vis
= ELF_ST_VISIBILITY (psym
->st_other
);
10804 printf (" %-7s", get_symbol_visibility (vis
));
10805 /* Check to see if any other bits in the st_other field are set.
10806 Note - displaying this information disrupts the layout of the
10807 table being generated, but for the moment this case is very
10809 if (psym
->st_other
^ vis
)
10810 printf (" [%s] ", get_symbol_other (psym
->st_other
^ vis
));
10813 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
10814 if (VALID_DYNAMIC_NAME (psym
->st_name
))
10815 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
10817 printf (_(" <corrupt: %14ld>"), psym
->st_name
);
10821 static const char *
10822 get_symbol_version_string (FILE * file
,
10823 bfd_boolean is_dynsym
,
10824 const char * strtab
,
10825 unsigned long int strtab_size
,
10827 Elf_Internal_Sym
* psym
,
10828 enum versioned_symbol_info
* sym_info
,
10829 unsigned short * vna_other
)
10831 unsigned char data
[2];
10832 unsigned short vers_data
;
10833 unsigned long offset
;
10836 || version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] == 0)
10839 offset
= offset_from_vma (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
10840 sizeof data
+ si
* sizeof (vers_data
));
10842 if (get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
10843 sizeof (data
), 1, _("version data")) == NULL
)
10846 vers_data
= byte_get (data
, 2);
10848 if ((vers_data
& VERSYM_HIDDEN
) == 0 && vers_data
<= 1)
10851 /* Usually we'd only see verdef for defined symbols, and verneed for
10852 undefined symbols. However, symbols defined by the linker in
10853 .dynbss for variables copied from a shared library in order to
10854 avoid text relocations are defined yet have verneed. We could
10855 use a heuristic to detect the special case, for example, check
10856 for verneed first on symbols defined in SHT_NOBITS sections, but
10857 it is simpler and more reliable to just look for both verdef and
10858 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
10860 if (psym
->st_shndx
!= SHN_UNDEF
10861 && vers_data
!= 0x8001
10862 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
10864 Elf_Internal_Verdef ivd
;
10865 Elf_Internal_Verdaux ivda
;
10866 Elf_External_Verdaux evda
;
10869 off
= offset_from_vma (file
,
10870 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
10871 sizeof (Elf_External_Verdef
));
10875 Elf_External_Verdef evd
;
10877 if (get_data (&evd
, file
, off
, sizeof (evd
), 1,
10878 _("version def")) == NULL
)
10886 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
10887 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
10888 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
10891 off
+= ivd
.vd_next
;
10893 while (ivd
.vd_ndx
!= (vers_data
& VERSYM_VERSION
) && ivd
.vd_next
!= 0);
10895 if (ivd
.vd_ndx
== (vers_data
& VERSYM_VERSION
))
10897 off
-= ivd
.vd_next
;
10900 if (get_data (&evda
, file
, off
, sizeof (evda
), 1,
10901 _("version def aux")) != NULL
)
10903 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
10905 if (psym
->st_name
!= ivda
.vda_name
)
10907 *sym_info
= ((vers_data
& VERSYM_HIDDEN
) != 0
10908 ? symbol_hidden
: symbol_public
);
10909 return (ivda
.vda_name
< strtab_size
10910 ? strtab
+ ivda
.vda_name
: _("<corrupt>"));
10916 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
10918 Elf_External_Verneed evn
;
10919 Elf_Internal_Verneed ivn
;
10920 Elf_Internal_Vernaux ivna
;
10922 offset
= offset_from_vma (file
,
10923 version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
10927 unsigned long vna_off
;
10929 if (get_data (&evn
, file
, offset
, sizeof (evn
), 1,
10930 _("version need")) == NULL
)
10933 ivna
.vna_other
= 0;
10938 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
10939 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
10941 vna_off
= offset
+ ivn
.vn_aux
;
10945 Elf_External_Vernaux evna
;
10947 if (get_data (&evna
, file
, vna_off
, sizeof (evna
), 1,
10948 _("version need aux (3)")) == NULL
)
10951 ivna
.vna_other
= 0;
10956 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
10957 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
10958 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
10961 vna_off
+= ivna
.vna_next
;
10963 while (ivna
.vna_other
!= vers_data
&& ivna
.vna_next
!= 0);
10965 if (ivna
.vna_other
== vers_data
)
10968 offset
+= ivn
.vn_next
;
10970 while (ivn
.vn_next
!= 0);
10972 if (ivna
.vna_other
== vers_data
)
10974 *sym_info
= symbol_undefined
;
10975 *vna_other
= ivna
.vna_other
;
10976 return (ivna
.vna_name
< strtab_size
10977 ? strtab
+ ivna
.vna_name
: _("<corrupt>"));
10983 /* Dump the symbol table. */
10985 process_symbol_table (FILE * file
)
10987 Elf_Internal_Shdr
* section
;
10988 bfd_size_type nbuckets
= 0;
10989 bfd_size_type nchains
= 0;
10990 bfd_vma
* buckets
= NULL
;
10991 bfd_vma
* chains
= NULL
;
10992 bfd_vma ngnubuckets
= 0;
10993 bfd_vma
* gnubuckets
= NULL
;
10994 bfd_vma
* gnuchains
= NULL
;
10995 bfd_vma gnusymidx
= 0;
10996 bfd_size_type ngnuchains
= 0;
10998 if (!do_syms
&& !do_dyn_syms
&& !do_histogram
)
11001 if (dynamic_info
[DT_HASH
]
11003 || (do_using_dynamic
11005 && dynamic_strings
!= NULL
)))
11007 unsigned char nb
[8];
11008 unsigned char nc
[8];
11009 unsigned int hash_ent_size
= 4;
11011 if ((elf_header
.e_machine
== EM_ALPHA
11012 || elf_header
.e_machine
== EM_S390
11013 || elf_header
.e_machine
== EM_S390_OLD
)
11014 && elf_header
.e_ident
[EI_CLASS
] == ELFCLASS64
)
11018 (archive_file_offset
11019 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
11020 sizeof nb
+ sizeof nc
)),
11023 error (_("Unable to seek to start of dynamic information\n"));
11027 if (fread (nb
, hash_ent_size
, 1, file
) != 1)
11029 error (_("Failed to read in number of buckets\n"));
11033 if (fread (nc
, hash_ent_size
, 1, file
) != 1)
11035 error (_("Failed to read in number of chains\n"));
11039 nbuckets
= byte_get (nb
, hash_ent_size
);
11040 nchains
= byte_get (nc
, hash_ent_size
);
11042 buckets
= get_dynamic_data (file
, nbuckets
, hash_ent_size
);
11043 chains
= get_dynamic_data (file
, nchains
, hash_ent_size
);
11046 if (buckets
== NULL
|| chains
== NULL
)
11048 if (do_using_dynamic
)
11059 if (dynamic_info_DT_GNU_HASH
11061 || (do_using_dynamic
11063 && dynamic_strings
!= NULL
)))
11065 unsigned char nb
[16];
11066 bfd_vma i
, maxchain
= 0xffffffff, bitmaskwords
;
11067 bfd_vma buckets_vma
;
11070 (archive_file_offset
11071 + offset_from_vma (file
, dynamic_info_DT_GNU_HASH
,
11075 error (_("Unable to seek to start of dynamic information\n"));
11079 if (fread (nb
, 16, 1, file
) != 1)
11081 error (_("Failed to read in number of buckets\n"));
11085 ngnubuckets
= byte_get (nb
, 4);
11086 gnusymidx
= byte_get (nb
+ 4, 4);
11087 bitmaskwords
= byte_get (nb
+ 8, 4);
11088 buckets_vma
= dynamic_info_DT_GNU_HASH
+ 16;
11090 buckets_vma
+= bitmaskwords
* 4;
11092 buckets_vma
+= bitmaskwords
* 8;
11095 (archive_file_offset
11096 + offset_from_vma (file
, buckets_vma
, 4)),
11099 error (_("Unable to seek to start of dynamic information\n"));
11103 gnubuckets
= get_dynamic_data (file
, ngnubuckets
, 4);
11105 if (gnubuckets
== NULL
)
11108 for (i
= 0; i
< ngnubuckets
; i
++)
11109 if (gnubuckets
[i
] != 0)
11111 if (gnubuckets
[i
] < gnusymidx
)
11114 if (maxchain
== 0xffffffff || gnubuckets
[i
] > maxchain
)
11115 maxchain
= gnubuckets
[i
];
11118 if (maxchain
== 0xffffffff)
11121 maxchain
-= gnusymidx
;
11124 (archive_file_offset
11125 + offset_from_vma (file
, buckets_vma
11126 + 4 * (ngnubuckets
+ maxchain
), 4)),
11129 error (_("Unable to seek to start of dynamic information\n"));
11135 if (fread (nb
, 4, 1, file
) != 1)
11137 error (_("Failed to determine last chain length\n"));
11141 if (maxchain
+ 1 == 0)
11146 while ((byte_get (nb
, 4) & 1) == 0);
11149 (archive_file_offset
11150 + offset_from_vma (file
, buckets_vma
+ 4 * ngnubuckets
, 4)),
11153 error (_("Unable to seek to start of dynamic information\n"));
11157 gnuchains
= get_dynamic_data (file
, maxchain
, 4);
11158 ngnuchains
= maxchain
;
11161 if (gnuchains
== NULL
)
11166 if (do_using_dynamic
)
11171 if ((dynamic_info
[DT_HASH
] || dynamic_info_DT_GNU_HASH
)
11173 && do_using_dynamic
11174 && dynamic_strings
!= NULL
11175 && dynamic_symbols
!= NULL
)
11179 if (dynamic_info
[DT_HASH
])
11183 printf (_("\nSymbol table for image:\n"));
11185 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11187 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11189 for (hn
= 0; hn
< nbuckets
; hn
++)
11194 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
11195 print_dynamic_symbol (si
, hn
);
11199 if (dynamic_info_DT_GNU_HASH
)
11201 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11203 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11205 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11207 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
11208 if (gnubuckets
[hn
] != 0)
11210 bfd_vma si
= gnubuckets
[hn
];
11211 bfd_vma off
= si
- gnusymidx
;
11215 print_dynamic_symbol (si
, hn
);
11218 while (off
< ngnuchains
&& (gnuchains
[off
++] & 1) == 0);
11222 else if ((do_dyn_syms
|| (do_syms
&& !do_using_dynamic
))
11223 && section_headers
!= NULL
)
11227 for (i
= 0, section
= section_headers
;
11228 i
< elf_header
.e_shnum
;
11232 char * strtab
= NULL
;
11233 unsigned long int strtab_size
= 0;
11234 Elf_Internal_Sym
* symtab
;
11235 Elf_Internal_Sym
* psym
;
11236 unsigned long num_syms
;
11238 if ((section
->sh_type
!= SHT_SYMTAB
11239 && section
->sh_type
!= SHT_DYNSYM
)
11241 && section
->sh_type
== SHT_SYMTAB
))
11244 if (section
->sh_entsize
== 0)
11246 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11247 printable_section_name (section
));
11251 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
11252 printable_section_name (section
),
11253 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
11256 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11258 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11260 symtab
= GET_ELF_SYMBOLS (file
, section
, & num_syms
);
11261 if (symtab
== NULL
)
11264 if (section
->sh_link
== elf_header
.e_shstrndx
)
11266 strtab
= string_table
;
11267 strtab_size
= string_table_length
;
11269 else if (section
->sh_link
< elf_header
.e_shnum
)
11271 Elf_Internal_Shdr
* string_sec
;
11273 string_sec
= section_headers
+ section
->sh_link
;
11275 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
11276 1, string_sec
->sh_size
,
11277 _("string table"));
11278 strtab_size
= strtab
!= NULL
? string_sec
->sh_size
: 0;
11281 for (si
= 0, psym
= symtab
; si
< num_syms
; si
++, psym
++)
11283 const char *version_string
;
11284 enum versioned_symbol_info sym_info
;
11285 unsigned short vna_other
;
11287 printf ("%6d: ", si
);
11288 print_vma (psym
->st_value
, LONG_HEX
);
11290 print_vma (psym
->st_size
, DEC_5
);
11291 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
11292 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
11293 if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_SOLARIS
)
11294 printf (" %-7s", get_solaris_symbol_visibility (psym
->st_other
));
11297 unsigned int vis
= ELF_ST_VISIBILITY (psym
->st_other
);
11299 printf (" %-7s", get_symbol_visibility (vis
));
11300 /* Check to see if any other bits in the st_other field are set.
11301 Note - displaying this information disrupts the layout of the
11302 table being generated, but for the moment this case is very rare. */
11303 if (psym
->st_other
^ vis
)
11304 printf (" [%s] ", get_symbol_other (psym
->st_other
^ vis
));
11306 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
11307 print_symbol (25, psym
->st_name
< strtab_size
11308 ? strtab
+ psym
->st_name
: _("<corrupt>"));
11311 = get_symbol_version_string (file
,
11312 section
->sh_type
== SHT_DYNSYM
,
11313 strtab
, strtab_size
, si
,
11314 psym
, &sym_info
, &vna_other
);
11315 if (version_string
)
11317 if (sym_info
== symbol_undefined
)
11318 printf ("@%s (%d)", version_string
, vna_other
);
11320 printf (sym_info
== symbol_hidden
? "@%s" : "@@%s",
11326 if (ELF_ST_BIND (psym
->st_info
) == STB_LOCAL
11327 && si
>= section
->sh_info
11328 /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */
11329 && elf_header
.e_machine
!= EM_MIPS
11330 /* Solaris binaries have been found to violate this requirement as
11331 well. Not sure if this is a bug or an ABI requirement. */
11332 && elf_header
.e_ident
[EI_OSABI
] != ELFOSABI_SOLARIS
)
11333 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11334 si
, printable_section_name (section
), section
->sh_info
);
11338 if (strtab
!= string_table
)
11344 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11346 if (do_histogram
&& buckets
!= NULL
)
11348 unsigned long * lengths
;
11349 unsigned long * counts
;
11352 unsigned long maxlength
= 0;
11353 unsigned long nzero_counts
= 0;
11354 unsigned long nsyms
= 0;
11355 unsigned long chained
;
11357 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
11358 (unsigned long) nbuckets
);
11360 lengths
= (unsigned long *) calloc (nbuckets
, sizeof (*lengths
));
11361 if (lengths
== NULL
)
11363 error (_("Out of memory allocating space for histogram buckets\n"));
11367 printf (_(" Length Number %% of total Coverage\n"));
11368 for (hn
= 0; hn
< nbuckets
; ++hn
)
11370 for (si
= buckets
[hn
], chained
= 0;
11371 si
> 0 && si
< nchains
&& si
< nbuckets
&& chained
<= nchains
;
11372 si
= chains
[si
], ++chained
)
11375 if (maxlength
< ++lengths
[hn
])
11379 /* PR binutils/17531: A corrupt binary could contain broken
11380 histogram data. Do not go into an infinite loop trying
11382 if (chained
> nchains
)
11384 error (_("histogram chain is corrupt\n"));
11389 counts
= (unsigned long *) calloc (maxlength
+ 1, sizeof (*counts
));
11390 if (counts
== NULL
)
11393 error (_("Out of memory allocating space for histogram counts\n"));
11397 for (hn
= 0; hn
< nbuckets
; ++hn
)
11398 ++counts
[lengths
[hn
]];
11403 printf (" 0 %-10lu (%5.1f%%)\n",
11404 counts
[0], (counts
[0] * 100.0) / nbuckets
);
11405 for (i
= 1; i
<= maxlength
; ++i
)
11407 nzero_counts
+= counts
[i
] * i
;
11408 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11409 i
, counts
[i
], (counts
[i
] * 100.0) / nbuckets
,
11410 (nzero_counts
* 100.0) / nsyms
);
11418 if (buckets
!= NULL
)
11424 if (do_histogram
&& gnubuckets
!= NULL
)
11426 unsigned long * lengths
;
11427 unsigned long * counts
;
11429 unsigned long maxlength
= 0;
11430 unsigned long nzero_counts
= 0;
11431 unsigned long nsyms
= 0;
11433 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11434 (unsigned long) ngnubuckets
);
11436 lengths
= (unsigned long *) calloc (ngnubuckets
, sizeof (*lengths
));
11437 if (lengths
== NULL
)
11439 error (_("Out of memory allocating space for gnu histogram buckets\n"));
11443 printf (_(" Length Number %% of total Coverage\n"));
11445 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
11446 if (gnubuckets
[hn
] != 0)
11448 bfd_vma off
, length
= 1;
11450 for (off
= gnubuckets
[hn
] - gnusymidx
;
11451 /* PR 17531 file: 010-77222-0.004. */
11452 off
< ngnuchains
&& (gnuchains
[off
] & 1) == 0;
11455 lengths
[hn
] = length
;
11456 if (length
> maxlength
)
11457 maxlength
= length
;
11461 counts
= (unsigned long *) calloc (maxlength
+ 1, sizeof (*counts
));
11462 if (counts
== NULL
)
11465 error (_("Out of memory allocating space for gnu histogram counts\n"));
11469 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
11470 ++counts
[lengths
[hn
]];
11472 if (ngnubuckets
> 0)
11475 printf (" 0 %-10lu (%5.1f%%)\n",
11476 counts
[0], (counts
[0] * 100.0) / ngnubuckets
);
11477 for (j
= 1; j
<= maxlength
; ++j
)
11479 nzero_counts
+= counts
[j
] * j
;
11480 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11481 j
, counts
[j
], (counts
[j
] * 100.0) / ngnubuckets
,
11482 (nzero_counts
* 100.0) / nsyms
);
11496 process_syminfo (FILE * file ATTRIBUTE_UNUSED
)
11500 if (dynamic_syminfo
== NULL
11502 /* No syminfo, this is ok. */
11505 /* There better should be a dynamic symbol section. */
11506 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
11510 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11511 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
11513 printf (_(" Num: Name BoundTo Flags\n"));
11514 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
11516 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
11518 printf ("%4d: ", i
);
11519 if (i
>= num_dynamic_syms
)
11520 printf (_("<corrupt index>"));
11521 else if (VALID_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
))
11522 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
));
11524 printf (_("<corrupt: %19ld>"), dynamic_symbols
[i
].st_name
);
11527 switch (dynamic_syminfo
[i
].si_boundto
)
11529 case SYMINFO_BT_SELF
:
11530 fputs ("SELF ", stdout
);
11532 case SYMINFO_BT_PARENT
:
11533 fputs ("PARENT ", stdout
);
11536 if (dynamic_syminfo
[i
].si_boundto
> 0
11537 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
11538 && VALID_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
11540 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
11544 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
11548 if (flags
& SYMINFO_FLG_DIRECT
)
11549 printf (" DIRECT");
11550 if (flags
& SYMINFO_FLG_PASSTHRU
)
11551 printf (" PASSTHRU");
11552 if (flags
& SYMINFO_FLG_COPY
)
11554 if (flags
& SYMINFO_FLG_LAZYLOAD
)
11555 printf (" LAZYLOAD");
11563 /* Check to see if the given reloc needs to be handled in a target specific
11564 manner. If so then process the reloc and return TRUE otherwise return
11568 target_specific_reloc_handling (Elf_Internal_Rela
* reloc
,
11569 unsigned char * start
,
11570 Elf_Internal_Sym
* symtab
)
11572 unsigned int reloc_type
= get_reloc_type (reloc
->r_info
);
11574 switch (elf_header
.e_machine
)
11577 case EM_MSP430_OLD
:
11579 static Elf_Internal_Sym
* saved_sym
= NULL
;
11581 switch (reloc_type
)
11583 case 10: /* R_MSP430_SYM_DIFF */
11584 if (uses_msp430x_relocs ())
11586 /* Fall through. */
11587 case 21: /* R_MSP430X_SYM_DIFF */
11588 saved_sym
= symtab
+ get_reloc_symindex (reloc
->r_info
);
11591 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11592 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11593 goto handle_sym_diff
;
11595 case 5: /* R_MSP430_16_BYTE */
11596 case 9: /* R_MSP430_8 */
11597 if (uses_msp430x_relocs ())
11599 goto handle_sym_diff
;
11601 case 2: /* R_MSP430_ABS16 */
11602 case 15: /* R_MSP430X_ABS16 */
11603 if (! uses_msp430x_relocs ())
11605 goto handle_sym_diff
;
11608 if (saved_sym
!= NULL
)
11612 value
= reloc
->r_addend
11613 + (symtab
[get_reloc_symindex (reloc
->r_info
)].st_value
11614 - saved_sym
->st_value
);
11616 byte_put (start
+ reloc
->r_offset
, value
, reloc_type
== 1 ? 4 : 2);
11624 if (saved_sym
!= NULL
)
11625 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
11632 case EM_CYGNUS_MN10300
:
11634 static Elf_Internal_Sym
* saved_sym
= NULL
;
11636 switch (reloc_type
)
11638 case 34: /* R_MN10300_ALIGN */
11640 case 33: /* R_MN10300_SYM_DIFF */
11641 saved_sym
= symtab
+ get_reloc_symindex (reloc
->r_info
);
11643 case 1: /* R_MN10300_32 */
11644 case 2: /* R_MN10300_16 */
11645 if (saved_sym
!= NULL
)
11649 value
= reloc
->r_addend
11650 + (symtab
[get_reloc_symindex (reloc
->r_info
)].st_value
11651 - saved_sym
->st_value
);
11653 byte_put (start
+ reloc
->r_offset
, value
, reloc_type
== 1 ? 4 : 2);
11660 if (saved_sym
!= NULL
)
11661 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
11669 static bfd_vma saved_sym1
= 0;
11670 static bfd_vma saved_sym2
= 0;
11671 static bfd_vma value
;
11673 switch (reloc_type
)
11675 case 0x80: /* R_RL78_SYM. */
11676 saved_sym1
= saved_sym2
;
11677 saved_sym2
= symtab
[get_reloc_symindex (reloc
->r_info
)].st_value
;
11678 saved_sym2
+= reloc
->r_addend
;
11681 case 0x83: /* R_RL78_OPsub. */
11682 value
= saved_sym1
- saved_sym2
;
11683 saved_sym2
= saved_sym1
= 0;
11687 case 0x41: /* R_RL78_ABS32. */
11688 byte_put (start
+ reloc
->r_offset
, value
, 4);
11692 case 0x43: /* R_RL78_ABS16. */
11693 byte_put (start
+ reloc
->r_offset
, value
, 2);
11707 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11708 DWARF debug sections. This is a target specific test. Note - we do not
11709 go through the whole including-target-headers-multiple-times route, (as
11710 we have already done with <elf/h8.h>) because this would become very
11711 messy and even then this function would have to contain target specific
11712 information (the names of the relocs instead of their numeric values).
11713 FIXME: This is not the correct way to solve this problem. The proper way
11714 is to have target specific reloc sizing and typing functions created by
11715 the reloc-macros.h header, in the same way that it already creates the
11716 reloc naming functions. */
11719 is_32bit_abs_reloc (unsigned int reloc_type
)
11721 /* Please keep this table alpha-sorted for ease of visual lookup. */
11722 switch (elf_header
.e_machine
)
11726 return reloc_type
== 1; /* R_386_32. */
11728 return reloc_type
== 1; /* R_68K_32. */
11730 return reloc_type
== 1; /* R_860_32. */
11732 return reloc_type
== 2; /* R_960_32. */
11734 return reloc_type
== 258; /* R_AARCH64_ABS32 */
11735 case EM_ADAPTEVA_EPIPHANY
:
11736 return reloc_type
== 3;
11738 return reloc_type
== 1; /* R_ALPHA_REFLONG. */
11740 return reloc_type
== 1; /* R_ARC_32. */
11741 case EM_ARC_COMPACT
:
11742 case EM_ARC_COMPACT2
:
11743 return reloc_type
== 4; /* R_ARC_32. */
11745 return reloc_type
== 2; /* R_ARM_ABS32 */
11748 return reloc_type
== 1;
11750 return reloc_type
== 0x12; /* R_byte4_data. */
11752 return reloc_type
== 3; /* R_CRIS_32. */
11754 return reloc_type
== 3; /* R_CR16_NUM32. */
11756 return reloc_type
== 15; /* R_CRX_NUM32. */
11757 case EM_CYGNUS_FRV
:
11758 return reloc_type
== 1;
11759 case EM_CYGNUS_D10V
:
11761 return reloc_type
== 6; /* R_D10V_32. */
11762 case EM_CYGNUS_D30V
:
11764 return reloc_type
== 12; /* R_D30V_32_NORMAL. */
11766 return reloc_type
== 3; /* R_DLX_RELOC_32. */
11767 case EM_CYGNUS_FR30
:
11769 return reloc_type
== 3; /* R_FR30_32. */
11771 return reloc_type
== 1; /* R_FT32_32. */
11775 return reloc_type
== 1; /* R_H8_DIR32. */
11777 return reloc_type
== 0x65 /* R_IA64_SECREL32LSB. */
11778 || reloc_type
== 0x25; /* R_IA64_DIR32LSB. */
11781 return reloc_type
== 2; /* R_IP2K_32. */
11783 return reloc_type
== 2; /* R_IQ2000_32. */
11784 case EM_LATTICEMICO32
:
11785 return reloc_type
== 3; /* R_LM32_32. */
11788 return reloc_type
== 3; /* R_M32C_32. */
11790 return reloc_type
== 34; /* R_M32R_32_RELA. */
11793 return reloc_type
== 6; /* R_M68HC11_32. */
11795 return reloc_type
== 1; /* R_MCORE_ADDR32. */
11796 case EM_CYGNUS_MEP
:
11797 return reloc_type
== 4; /* R_MEP_32. */
11799 return reloc_type
== 2; /* R_METAG_ADDR32. */
11800 case EM_MICROBLAZE
:
11801 return reloc_type
== 1; /* R_MICROBLAZE_32. */
11803 return reloc_type
== 2; /* R_MIPS_32. */
11805 return reloc_type
== 4; /* R_MMIX_32. */
11806 case EM_CYGNUS_MN10200
:
11808 return reloc_type
== 1; /* R_MN10200_32. */
11809 case EM_CYGNUS_MN10300
:
11811 return reloc_type
== 1; /* R_MN10300_32. */
11813 return reloc_type
== 1; /* R_MOXIE_32. */
11814 case EM_MSP430_OLD
:
11816 return reloc_type
== 1; /* R_MSP430_32 or R_MSP320_ABS32. */
11818 return reloc_type
== 2; /* R_MT_32. */
11820 return reloc_type
== 20; /* R_NDS32_RELA. */
11821 case EM_ALTERA_NIOS2
:
11822 return reloc_type
== 12; /* R_NIOS2_BFD_RELOC_32. */
11824 return reloc_type
== 1; /* R_NIOS_32. */
11826 return reloc_type
== 1; /* R_OR1K_32. */
11828 return (reloc_type
== 1 /* R_PARISC_DIR32. */
11829 || reloc_type
== 41); /* R_PARISC_SECREL32. */
11832 return reloc_type
== 1; /* R_PJ_DATA_DIR32. */
11834 return reloc_type
== 1; /* R_PPC64_ADDR32. */
11836 return reloc_type
== 1; /* R_PPC_ADDR32. */
11838 return reloc_type
== 1; /* R_RISCV_32. */
11840 return reloc_type
== 1; /* R_RL78_DIR32. */
11842 return reloc_type
== 1; /* R_RX_DIR32. */
11844 return reloc_type
== 1; /* R_I370_ADDR31. */
11847 return reloc_type
== 4; /* R_S390_32. */
11849 return reloc_type
== 8; /* R_SCORE_ABS32. */
11851 return reloc_type
== 1; /* R_SH_DIR32. */
11852 case EM_SPARC32PLUS
:
11855 return reloc_type
== 3 /* R_SPARC_32. */
11856 || reloc_type
== 23; /* R_SPARC_UA32. */
11858 return reloc_type
== 6; /* R_SPU_ADDR32 */
11860 return reloc_type
== 1; /* R_C6000_ABS32. */
11862 return reloc_type
== 2; /* R_TILEGX_32. */
11864 return reloc_type
== 1; /* R_TILEPRO_32. */
11865 case EM_CYGNUS_V850
:
11867 return reloc_type
== 6; /* R_V850_ABS32. */
11869 return reloc_type
== 0x33; /* R_V810_WORD. */
11871 return reloc_type
== 1; /* R_VAX_32. */
11873 return reloc_type
== 3; /* R_VISIUM_32. */
11877 return reloc_type
== 10; /* R_X86_64_32. */
11880 return reloc_type
== 3; /* R_XC16C_ABS_32. */
11882 return reloc_type
== 4; /* R_XGATE_32. */
11884 return reloc_type
== 1; /* R_XSTROMY16_32. */
11885 case EM_XTENSA_OLD
:
11887 return reloc_type
== 1; /* R_XTENSA_32. */
11890 static unsigned int prev_warn
= 0;
11892 /* Avoid repeating the same warning multiple times. */
11893 if (prev_warn
!= elf_header
.e_machine
)
11894 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11895 elf_header
.e_machine
);
11896 prev_warn
= elf_header
.e_machine
;
11902 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11903 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
11906 is_32bit_pcrel_reloc (unsigned int reloc_type
)
11908 switch (elf_header
.e_machine
)
11909 /* Please keep this table alpha-sorted for ease of visual lookup. */
11913 return reloc_type
== 2; /* R_386_PC32. */
11915 return reloc_type
== 4; /* R_68K_PC32. */
11917 return reloc_type
== 261; /* R_AARCH64_PREL32 */
11918 case EM_ADAPTEVA_EPIPHANY
:
11919 return reloc_type
== 6;
11921 return reloc_type
== 10; /* R_ALPHA_SREL32. */
11922 case EM_ARC_COMPACT
:
11923 case EM_ARC_COMPACT2
:
11924 return reloc_type
== 49; /* R_ARC_32_PCREL. */
11926 return reloc_type
== 3; /* R_ARM_REL32 */
11929 return reloc_type
== 36; /* R_AVR_32_PCREL. */
11930 case EM_MICROBLAZE
:
11931 return reloc_type
== 2; /* R_MICROBLAZE_32_PCREL. */
11933 return reloc_type
== 9; /* R_OR1K_32_PCREL. */
11935 return reloc_type
== 9; /* R_PARISC_PCREL32. */
11937 return reloc_type
== 26; /* R_PPC_REL32. */
11939 return reloc_type
== 26; /* R_PPC64_REL32. */
11942 return reloc_type
== 5; /* R_390_PC32. */
11944 return reloc_type
== 2; /* R_SH_REL32. */
11945 case EM_SPARC32PLUS
:
11948 return reloc_type
== 6; /* R_SPARC_DISP32. */
11950 return reloc_type
== 13; /* R_SPU_REL32. */
11952 return reloc_type
== 6; /* R_TILEGX_32_PCREL. */
11954 return reloc_type
== 4; /* R_TILEPRO_32_PCREL. */
11956 return reloc_type
== 6; /* R_VISIUM_32_PCREL */
11960 return reloc_type
== 2; /* R_X86_64_PC32. */
11961 case EM_XTENSA_OLD
:
11963 return reloc_type
== 14; /* R_XTENSA_32_PCREL. */
11965 /* Do not abort or issue an error message here. Not all targets use
11966 pc-relative 32-bit relocs in their DWARF debug information and we
11967 have already tested for target coverage in is_32bit_abs_reloc. A
11968 more helpful warning message will be generated by apply_relocations
11969 anyway, so just return. */
11974 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11975 a 64-bit absolute RELA relocation used in DWARF debug sections. */
11978 is_64bit_abs_reloc (unsigned int reloc_type
)
11980 switch (elf_header
.e_machine
)
11983 return reloc_type
== 257; /* R_AARCH64_ABS64. */
11985 return reloc_type
== 2; /* R_ALPHA_REFQUAD. */
11987 return reloc_type
== 0x27; /* R_IA64_DIR64LSB. */
11989 return reloc_type
== 80; /* R_PARISC_DIR64. */
11991 return reloc_type
== 38; /* R_PPC64_ADDR64. */
11993 return reloc_type
== 2; /* R_RISCV_64. */
11994 case EM_SPARC32PLUS
:
11997 return reloc_type
== 54; /* R_SPARC_UA64. */
12001 return reloc_type
== 1; /* R_X86_64_64. */
12004 return reloc_type
== 22; /* R_S390_64. */
12006 return reloc_type
== 1; /* R_TILEGX_64. */
12008 return reloc_type
== 18; /* R_MIPS_64. */
12014 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12015 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
12018 is_64bit_pcrel_reloc (unsigned int reloc_type
)
12020 switch (elf_header
.e_machine
)
12023 return reloc_type
== 260; /* R_AARCH64_PREL64. */
12025 return reloc_type
== 11; /* R_ALPHA_SREL64. */
12027 return reloc_type
== 0x4f; /* R_IA64_PCREL64LSB. */
12029 return reloc_type
== 72; /* R_PARISC_PCREL64. */
12031 return reloc_type
== 44; /* R_PPC64_REL64. */
12032 case EM_SPARC32PLUS
:
12035 return reloc_type
== 46; /* R_SPARC_DISP64. */
12039 return reloc_type
== 24; /* R_X86_64_PC64. */
12042 return reloc_type
== 23; /* R_S390_PC64. */
12044 return reloc_type
== 5; /* R_TILEGX_64_PCREL. */
12050 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12051 a 24-bit absolute RELA relocation used in DWARF debug sections. */
12054 is_24bit_abs_reloc (unsigned int reloc_type
)
12056 switch (elf_header
.e_machine
)
12058 case EM_CYGNUS_MN10200
:
12060 return reloc_type
== 4; /* R_MN10200_24. */
12062 return reloc_type
== 5; /* R_FT32_20. */
12068 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12069 a 16-bit absolute RELA relocation used in DWARF debug sections. */
12072 is_16bit_abs_reloc (unsigned int reloc_type
)
12074 /* Please keep this table alpha-sorted for ease of visual lookup. */
12075 switch (elf_header
.e_machine
)
12078 case EM_ARC_COMPACT
:
12079 case EM_ARC_COMPACT2
:
12080 return reloc_type
== 2; /* R_ARC_16. */
12081 case EM_ADAPTEVA_EPIPHANY
:
12082 return reloc_type
== 5;
12085 return reloc_type
== 4; /* R_AVR_16. */
12086 case EM_CYGNUS_D10V
:
12088 return reloc_type
== 3; /* R_D10V_16. */
12092 return reloc_type
== R_H8_DIR16
;
12095 return reloc_type
== 1; /* R_IP2K_16. */
12098 return reloc_type
== 1; /* R_M32C_16 */
12099 case EM_CYGNUS_MN10200
:
12101 return reloc_type
== 2; /* R_MN10200_16. */
12102 case EM_CYGNUS_MN10300
:
12104 return reloc_type
== 2; /* R_MN10300_16. */
12106 if (uses_msp430x_relocs ())
12107 return reloc_type
== 2; /* R_MSP430_ABS16. */
12108 /* Fall through. */
12109 case EM_MSP430_OLD
:
12110 return reloc_type
== 5; /* R_MSP430_16_BYTE. */
12112 return reloc_type
== 19; /* R_NDS32_RELA. */
12113 case EM_ALTERA_NIOS2
:
12114 return reloc_type
== 13; /* R_NIOS2_BFD_RELOC_16. */
12116 return reloc_type
== 9; /* R_NIOS_16. */
12118 return reloc_type
== 2; /* R_OR1K_16. */
12120 return reloc_type
== 2; /* R_C6000_ABS16. */
12122 return reloc_type
== 2; /* R_VISIUM_16. */
12125 return reloc_type
== 2; /* R_XC16C_ABS_16. */
12127 return reloc_type
== 3; /* R_XGATE_16. */
12133 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12134 relocation entries (possibly formerly used for SHT_GROUP sections). */
12137 is_none_reloc (unsigned int reloc_type
)
12139 switch (elf_header
.e_machine
)
12141 case EM_386
: /* R_386_NONE. */
12142 case EM_68K
: /* R_68K_NONE. */
12143 case EM_ADAPTEVA_EPIPHANY
:
12144 case EM_ALPHA
: /* R_ALPHA_NONE. */
12145 case EM_ALTERA_NIOS2
: /* R_NIOS2_NONE. */
12146 case EM_ARC
: /* R_ARC_NONE. */
12147 case EM_ARC_COMPACT2
: /* R_ARC_NONE. */
12148 case EM_ARC_COMPACT
: /* R_ARC_NONE. */
12149 case EM_ARM
: /* R_ARM_NONE. */
12150 case EM_C166
: /* R_XC16X_NONE. */
12151 case EM_CRIS
: /* R_CRIS_NONE. */
12152 case EM_FT32
: /* R_FT32_NONE. */
12153 case EM_IA_64
: /* R_IA64_NONE. */
12154 case EM_K1OM
: /* R_X86_64_NONE. */
12155 case EM_L1OM
: /* R_X86_64_NONE. */
12156 case EM_M32R
: /* R_M32R_NONE. */
12157 case EM_MIPS
: /* R_MIPS_NONE. */
12158 case EM_MN10300
: /* R_MN10300_NONE. */
12159 case EM_MOXIE
: /* R_MOXIE_NONE. */
12160 case EM_NIOS32
: /* R_NIOS_NONE. */
12161 case EM_OR1K
: /* R_OR1K_NONE. */
12162 case EM_PARISC
: /* R_PARISC_NONE. */
12163 case EM_PPC64
: /* R_PPC64_NONE. */
12164 case EM_PPC
: /* R_PPC_NONE. */
12165 case EM_RISCV
: /* R_RISCV_NONE. */
12166 case EM_S390
: /* R_390_NONE. */
12168 case EM_SH
: /* R_SH_NONE. */
12169 case EM_SPARC32PLUS
:
12170 case EM_SPARC
: /* R_SPARC_NONE. */
12172 case EM_TILEGX
: /* R_TILEGX_NONE. */
12173 case EM_TILEPRO
: /* R_TILEPRO_NONE. */
12174 case EM_TI_C6000
:/* R_C6000_NONE. */
12175 case EM_X86_64
: /* R_X86_64_NONE. */
12177 return reloc_type
== 0;
12180 return reloc_type
== 0 || reloc_type
== 256;
12183 return (reloc_type
== 0 /* R_AVR_NONE. */
12184 || reloc_type
== 30 /* R_AVR_DIFF8. */
12185 || reloc_type
== 31 /* R_AVR_DIFF16. */
12186 || reloc_type
== 32 /* R_AVR_DIFF32. */);
12188 return reloc_type
== 3; /* R_METAG_NONE. */
12190 return (reloc_type
== 0 /* R_XTENSA_NONE. */
12191 || reloc_type
== 204 /* R_NDS32_DIFF8. */
12192 || reloc_type
== 205 /* R_NDS32_DIFF16. */
12193 || reloc_type
== 206 /* R_NDS32_DIFF32. */
12194 || reloc_type
== 207 /* R_NDS32_ULEB128. */);
12195 case EM_XTENSA_OLD
:
12197 return (reloc_type
== 0 /* R_XTENSA_NONE. */
12198 || reloc_type
== 17 /* R_XTENSA_DIFF8. */
12199 || reloc_type
== 18 /* R_XTENSA_DIFF16. */
12200 || reloc_type
== 19 /* R_XTENSA_DIFF32. */);
12205 /* Returns TRUE if there is a relocation against
12206 section NAME at OFFSET bytes. */
12209 reloc_at (struct dwarf_section
* dsec
, dwarf_vma offset
)
12211 Elf_Internal_Rela
* relocs
;
12212 Elf_Internal_Rela
* rp
;
12214 if (dsec
== NULL
|| dsec
->reloc_info
== NULL
)
12217 relocs
= (Elf_Internal_Rela
*) dsec
->reloc_info
;
12219 for (rp
= relocs
; rp
< relocs
+ dsec
->num_relocs
; ++rp
)
12220 if (rp
->r_offset
== offset
)
12226 /* Apply relocations to a section.
12227 Note: So far support has been added only for those relocations
12228 which can be found in debug sections.
12229 If RELOCS_RETURN is non-NULL then returns in it a pointer to the
12230 loaded relocs. It is then the caller's responsibility to free them.
12231 FIXME: Add support for more relocations ? */
12234 apply_relocations (void * file
,
12235 const Elf_Internal_Shdr
* section
,
12236 unsigned char * start
,
12237 bfd_size_type size
,
12238 void ** relocs_return
,
12239 unsigned long * num_relocs_return
)
12241 Elf_Internal_Shdr
* relsec
;
12242 unsigned char * end
= start
+ size
;
12244 if (relocs_return
!= NULL
)
12246 * (Elf_Internal_Rela
**) relocs_return
= NULL
;
12247 * num_relocs_return
= 0;
12250 if (elf_header
.e_type
!= ET_REL
)
12253 /* Find the reloc section associated with the section. */
12254 for (relsec
= section_headers
;
12255 relsec
< section_headers
+ elf_header
.e_shnum
;
12258 bfd_boolean is_rela
;
12259 unsigned long num_relocs
;
12260 Elf_Internal_Rela
* relocs
;
12261 Elf_Internal_Rela
* rp
;
12262 Elf_Internal_Shdr
* symsec
;
12263 Elf_Internal_Sym
* symtab
;
12264 unsigned long num_syms
;
12265 Elf_Internal_Sym
* sym
;
12267 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
12268 || relsec
->sh_info
>= elf_header
.e_shnum
12269 || section_headers
+ relsec
->sh_info
!= section
12270 || relsec
->sh_size
== 0
12271 || relsec
->sh_link
>= elf_header
.e_shnum
)
12274 is_rela
= relsec
->sh_type
== SHT_RELA
;
12278 if (!slurp_rela_relocs ((FILE *) file
, relsec
->sh_offset
,
12279 relsec
->sh_size
, & relocs
, & num_relocs
))
12284 if (!slurp_rel_relocs ((FILE *) file
, relsec
->sh_offset
,
12285 relsec
->sh_size
, & relocs
, & num_relocs
))
12289 /* SH uses RELA but uses in place value instead of the addend field. */
12290 if (elf_header
.e_machine
== EM_SH
)
12293 symsec
= section_headers
+ relsec
->sh_link
;
12294 if (symsec
->sh_type
!= SHT_SYMTAB
12295 && symsec
->sh_type
!= SHT_DYNSYM
)
12297 symtab
= GET_ELF_SYMBOLS ((FILE *) file
, symsec
, & num_syms
);
12299 for (rp
= relocs
; rp
< relocs
+ num_relocs
; ++rp
)
12302 unsigned int reloc_type
;
12303 unsigned int reloc_size
;
12304 unsigned char * rloc
;
12305 unsigned long sym_index
;
12307 reloc_type
= get_reloc_type (rp
->r_info
);
12309 if (target_specific_reloc_handling (rp
, start
, symtab
))
12311 else if (is_none_reloc (reloc_type
))
12313 else if (is_32bit_abs_reloc (reloc_type
)
12314 || is_32bit_pcrel_reloc (reloc_type
))
12316 else if (is_64bit_abs_reloc (reloc_type
)
12317 || is_64bit_pcrel_reloc (reloc_type
))
12319 else if (is_24bit_abs_reloc (reloc_type
))
12321 else if (is_16bit_abs_reloc (reloc_type
))
12325 static unsigned int prev_reloc
= 0;
12326 if (reloc_type
!= prev_reloc
)
12327 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
12328 reloc_type
, printable_section_name (section
));
12329 prev_reloc
= reloc_type
;
12333 rloc
= start
+ rp
->r_offset
;
12334 if ((rloc
+ reloc_size
) > end
|| (rloc
< start
))
12336 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
12337 (unsigned long) rp
->r_offset
,
12338 printable_section_name (section
));
12342 sym_index
= (unsigned long) get_reloc_symindex (rp
->r_info
);
12343 if (sym_index
>= num_syms
)
12345 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
12346 sym_index
, printable_section_name (section
));
12349 sym
= symtab
+ sym_index
;
12351 /* If the reloc has a symbol associated with it,
12352 make sure that it is of an appropriate type.
12354 Relocations against symbols without type can happen.
12355 Gcc -feliminate-dwarf2-dups may generate symbols
12356 without type for debug info.
12358 Icc generates relocations against function symbols
12359 instead of local labels.
12361 Relocations against object symbols can happen, eg when
12362 referencing a global array. For an example of this see
12363 the _clz.o binary in libgcc.a. */
12365 && ELF_ST_TYPE (sym
->st_info
) != STT_COMMON
12366 && ELF_ST_TYPE (sym
->st_info
) > STT_SECTION
)
12368 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
12369 get_symbol_type (ELF_ST_TYPE (sym
->st_info
)),
12370 (long int)(rp
- relocs
),
12371 printable_section_name (relsec
));
12377 addend
+= rp
->r_addend
;
12378 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
12379 partial_inplace. */
12381 || (elf_header
.e_machine
== EM_XTENSA
12382 && reloc_type
== 1)
12383 || ((elf_header
.e_machine
== EM_PJ
12384 || elf_header
.e_machine
== EM_PJ_OLD
)
12385 && reloc_type
== 1)
12386 || ((elf_header
.e_machine
== EM_D30V
12387 || elf_header
.e_machine
== EM_CYGNUS_D30V
)
12388 && reloc_type
== 12))
12389 addend
+= byte_get (rloc
, reloc_size
);
12391 if (is_32bit_pcrel_reloc (reloc_type
)
12392 || is_64bit_pcrel_reloc (reloc_type
))
12394 /* On HPPA, all pc-relative relocations are biased by 8. */
12395 if (elf_header
.e_machine
== EM_PARISC
)
12397 byte_put (rloc
, (addend
+ sym
->st_value
) - rp
->r_offset
,
12401 byte_put (rloc
, addend
+ sym
->st_value
, reloc_size
);
12408 * (Elf_Internal_Rela
**) relocs_return
= relocs
;
12409 * num_relocs_return
= num_relocs
;
12418 #ifdef SUPPORT_DISASSEMBLY
12420 disassemble_section (Elf_Internal_Shdr
* section
, FILE * file
)
12422 printf (_("\nAssembly dump of section %s\n"), printable_section_name (section
));
12424 /* FIXME: XXX -- to be done --- XXX */
12430 /* Reads in the contents of SECTION from FILE, returning a pointer
12431 to a malloc'ed buffer or NULL if something went wrong. */
12434 get_section_contents (Elf_Internal_Shdr
* section
, FILE * file
)
12436 bfd_size_type num_bytes
;
12438 num_bytes
= section
->sh_size
;
12440 if (num_bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
12442 printf (_("\nSection '%s' has no data to dump.\n"),
12443 printable_section_name (section
));
12447 return (char *) get_data (NULL
, file
, section
->sh_offset
, 1, num_bytes
,
12448 _("section contents"));
12451 /* Uncompresses a section that was compressed using zlib, in place. */
12454 uncompress_section_contents (unsigned char **buffer
,
12455 dwarf_size_type uncompressed_size
,
12456 dwarf_size_type
*size
)
12458 dwarf_size_type compressed_size
= *size
;
12459 unsigned char * compressed_buffer
= *buffer
;
12460 unsigned char * uncompressed_buffer
;
12464 /* It is possible the section consists of several compressed
12465 buffers concatenated together, so we uncompress in a loop. */
12466 /* PR 18313: The state field in the z_stream structure is supposed
12467 to be invisible to the user (ie us), but some compilers will
12468 still complain about it being used without initialisation. So
12469 we first zero the entire z_stream structure and then set the fields
12471 memset (& strm
, 0, sizeof strm
);
12472 strm
.avail_in
= compressed_size
;
12473 strm
.next_in
= (Bytef
*) compressed_buffer
;
12474 strm
.avail_out
= uncompressed_size
;
12475 uncompressed_buffer
= (unsigned char *) xmalloc (uncompressed_size
);
12477 rc
= inflateInit (& strm
);
12478 while (strm
.avail_in
> 0)
12482 strm
.next_out
= ((Bytef
*) uncompressed_buffer
12483 + (uncompressed_size
- strm
.avail_out
));
12484 rc
= inflate (&strm
, Z_FINISH
);
12485 if (rc
!= Z_STREAM_END
)
12487 rc
= inflateReset (& strm
);
12489 rc
= inflateEnd (& strm
);
12491 || strm
.avail_out
!= 0)
12494 *buffer
= uncompressed_buffer
;
12495 *size
= uncompressed_size
;
12499 free (uncompressed_buffer
);
12500 /* Indicate decompression failure. */
12506 dump_section_as_strings (Elf_Internal_Shdr
* section
, FILE * file
)
12508 Elf_Internal_Shdr
* relsec
;
12509 bfd_size_type num_bytes
;
12510 unsigned char * data
;
12511 unsigned char * end
;
12512 unsigned char * real_start
;
12513 unsigned char * start
;
12514 bfd_boolean some_strings_shown
;
12516 real_start
= start
= (unsigned char *) get_section_contents (section
,
12520 num_bytes
= section
->sh_size
;
12522 printf (_("\nString dump of section '%s':\n"), printable_section_name (section
));
12524 if (decompress_dumps
)
12526 dwarf_size_type new_size
= num_bytes
;
12527 dwarf_size_type uncompressed_size
= 0;
12529 if ((section
->sh_flags
& SHF_COMPRESSED
) != 0)
12531 Elf_Internal_Chdr chdr
;
12532 unsigned int compression_header_size
12533 = get_compression_header (& chdr
, (unsigned char *) start
);
12535 if (chdr
.ch_type
!= ELFCOMPRESS_ZLIB
)
12537 warn (_("section '%s' has unsupported compress type: %d\n"),
12538 printable_section_name (section
), chdr
.ch_type
);
12541 else if (chdr
.ch_addralign
!= section
->sh_addralign
)
12543 warn (_("compressed section '%s' is corrupted\n"),
12544 printable_section_name (section
));
12547 uncompressed_size
= chdr
.ch_size
;
12548 start
+= compression_header_size
;
12549 new_size
-= compression_header_size
;
12551 else if (new_size
> 12 && streq ((char *) start
, "ZLIB"))
12553 /* Read the zlib header. In this case, it should be "ZLIB"
12554 followed by the uncompressed section size, 8 bytes in
12555 big-endian order. */
12556 uncompressed_size
= start
[4]; uncompressed_size
<<= 8;
12557 uncompressed_size
+= start
[5]; uncompressed_size
<<= 8;
12558 uncompressed_size
+= start
[6]; uncompressed_size
<<= 8;
12559 uncompressed_size
+= start
[7]; uncompressed_size
<<= 8;
12560 uncompressed_size
+= start
[8]; uncompressed_size
<<= 8;
12561 uncompressed_size
+= start
[9]; uncompressed_size
<<= 8;
12562 uncompressed_size
+= start
[10]; uncompressed_size
<<= 8;
12563 uncompressed_size
+= start
[11];
12568 if (uncompressed_size
12569 && uncompress_section_contents (& start
,
12570 uncompressed_size
, & new_size
))
12571 num_bytes
= new_size
;
12574 /* If the section being dumped has relocations against it the user might
12575 be expecting these relocations to have been applied. Check for this
12576 case and issue a warning message in order to avoid confusion.
12577 FIXME: Maybe we ought to have an option that dumps a section with
12578 relocs applied ? */
12579 for (relsec
= section_headers
;
12580 relsec
< section_headers
+ elf_header
.e_shnum
;
12583 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
12584 || relsec
->sh_info
>= elf_header
.e_shnum
12585 || section_headers
+ relsec
->sh_info
!= section
12586 || relsec
->sh_size
== 0
12587 || relsec
->sh_link
>= elf_header
.e_shnum
)
12590 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12595 end
= start
+ num_bytes
;
12596 some_strings_shown
= FALSE
;
12600 while (!ISPRINT (* data
))
12601 if (++ data
>= end
)
12606 size_t maxlen
= end
- data
;
12609 /* PR 11128: Use two separate invocations in order to work
12610 around bugs in the Solaris 8 implementation of printf. */
12611 printf (" [%6tx] ", data
- start
);
12613 printf (" [%6Ix] ", (size_t) (data
- start
));
12617 print_symbol ((int) maxlen
, (const char *) data
);
12619 data
+= strnlen ((const char *) data
, maxlen
);
12623 printf (_("<corrupt>\n"));
12626 some_strings_shown
= TRUE
;
12630 if (! some_strings_shown
)
12631 printf (_(" No strings found in this section."));
12639 dump_section_as_bytes (Elf_Internal_Shdr
* section
,
12641 bfd_boolean relocate
)
12643 Elf_Internal_Shdr
* relsec
;
12644 bfd_size_type bytes
;
12645 bfd_size_type section_size
;
12647 unsigned char * data
;
12648 unsigned char * real_start
;
12649 unsigned char * start
;
12651 real_start
= start
= (unsigned char *) get_section_contents (section
, file
);
12654 section_size
= section
->sh_size
;
12656 printf (_("\nHex dump of section '%s':\n"), printable_section_name (section
));
12658 if (decompress_dumps
)
12660 dwarf_size_type new_size
= section_size
;
12661 dwarf_size_type uncompressed_size
= 0;
12663 if ((section
->sh_flags
& SHF_COMPRESSED
) != 0)
12665 Elf_Internal_Chdr chdr
;
12666 unsigned int compression_header_size
12667 = get_compression_header (& chdr
, start
);
12669 if (chdr
.ch_type
!= ELFCOMPRESS_ZLIB
)
12671 warn (_("section '%s' has unsupported compress type: %d\n"),
12672 printable_section_name (section
), chdr
.ch_type
);
12675 else if (chdr
.ch_addralign
!= section
->sh_addralign
)
12677 warn (_("compressed section '%s' is corrupted\n"),
12678 printable_section_name (section
));
12681 uncompressed_size
= chdr
.ch_size
;
12682 start
+= compression_header_size
;
12683 new_size
-= compression_header_size
;
12685 else if (new_size
> 12 && streq ((char *) start
, "ZLIB"))
12687 /* Read the zlib header. In this case, it should be "ZLIB"
12688 followed by the uncompressed section size, 8 bytes in
12689 big-endian order. */
12690 uncompressed_size
= start
[4]; uncompressed_size
<<= 8;
12691 uncompressed_size
+= start
[5]; uncompressed_size
<<= 8;
12692 uncompressed_size
+= start
[6]; uncompressed_size
<<= 8;
12693 uncompressed_size
+= start
[7]; uncompressed_size
<<= 8;
12694 uncompressed_size
+= start
[8]; uncompressed_size
<<= 8;
12695 uncompressed_size
+= start
[9]; uncompressed_size
<<= 8;
12696 uncompressed_size
+= start
[10]; uncompressed_size
<<= 8;
12697 uncompressed_size
+= start
[11];
12702 if (uncompressed_size
12703 && uncompress_section_contents (& start
, uncompressed_size
,
12705 section_size
= new_size
;
12710 apply_relocations (file
, section
, start
, section_size
, NULL
, NULL
);
12714 /* If the section being dumped has relocations against it the user might
12715 be expecting these relocations to have been applied. Check for this
12716 case and issue a warning message in order to avoid confusion.
12717 FIXME: Maybe we ought to have an option that dumps a section with
12718 relocs applied ? */
12719 for (relsec
= section_headers
;
12720 relsec
< section_headers
+ elf_header
.e_shnum
;
12723 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
12724 || relsec
->sh_info
>= elf_header
.e_shnum
12725 || section_headers
+ relsec
->sh_info
!= section
12726 || relsec
->sh_size
== 0
12727 || relsec
->sh_link
>= elf_header
.e_shnum
)
12730 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12735 addr
= section
->sh_addr
;
12736 bytes
= section_size
;
12745 lbytes
= (bytes
> 16 ? 16 : bytes
);
12747 printf (" 0x%8.8lx ", (unsigned long) addr
);
12749 for (j
= 0; j
< 16; j
++)
12752 printf ("%2.2x", data
[j
]);
12760 for (j
= 0; j
< lbytes
; j
++)
12763 if (k
>= ' ' && k
< 0x7f)
12782 load_specific_debug_section (enum dwarf_section_display_enum debug
,
12783 const Elf_Internal_Shdr
* sec
, void * file
)
12785 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
12788 /* If it is already loaded, do nothing. */
12789 if (section
->start
!= NULL
)
12792 snprintf (buf
, sizeof (buf
), _("%s section data"), section
->name
);
12793 section
->address
= sec
->sh_addr
;
12794 section
->user_data
= NULL
;
12795 section
->start
= (unsigned char *) get_data (NULL
, (FILE *) file
,
12797 sec
->sh_size
, buf
);
12798 if (section
->start
== NULL
)
12802 unsigned char *start
= section
->start
;
12803 dwarf_size_type size
= sec
->sh_size
;
12804 dwarf_size_type uncompressed_size
= 0;
12806 if ((sec
->sh_flags
& SHF_COMPRESSED
) != 0)
12808 Elf_Internal_Chdr chdr
;
12809 unsigned int compression_header_size
;
12811 if (size
< (is_32bit_elf
12812 ? sizeof (Elf32_External_Chdr
)
12813 : sizeof (Elf64_External_Chdr
)))
12815 warn (_("compressed section %s is too small to contain a compression header"),
12820 compression_header_size
= get_compression_header (&chdr
, start
);
12822 if (chdr
.ch_type
!= ELFCOMPRESS_ZLIB
)
12824 warn (_("section '%s' has unsupported compress type: %d\n"),
12825 section
->name
, chdr
.ch_type
);
12828 else if (chdr
.ch_addralign
!= sec
->sh_addralign
)
12830 warn (_("compressed section '%s' is corrupted\n"),
12834 uncompressed_size
= chdr
.ch_size
;
12835 start
+= compression_header_size
;
12836 size
-= compression_header_size
;
12838 else if (size
> 12 && streq ((char *) start
, "ZLIB"))
12840 /* Read the zlib header. In this case, it should be "ZLIB"
12841 followed by the uncompressed section size, 8 bytes in
12842 big-endian order. */
12843 uncompressed_size
= start
[4]; uncompressed_size
<<= 8;
12844 uncompressed_size
+= start
[5]; uncompressed_size
<<= 8;
12845 uncompressed_size
+= start
[6]; uncompressed_size
<<= 8;
12846 uncompressed_size
+= start
[7]; uncompressed_size
<<= 8;
12847 uncompressed_size
+= start
[8]; uncompressed_size
<<= 8;
12848 uncompressed_size
+= start
[9]; uncompressed_size
<<= 8;
12849 uncompressed_size
+= start
[10]; uncompressed_size
<<= 8;
12850 uncompressed_size
+= start
[11];
12855 if (uncompressed_size
12856 && uncompress_section_contents (&start
, uncompressed_size
,
12859 /* Free the compressed buffer, update the section buffer
12860 and the section size if uncompress is successful. */
12861 free (section
->start
);
12862 section
->start
= start
;
12864 section
->size
= size
;
12867 if (section
->start
== NULL
)
12870 if (debug_displays
[debug
].relocate
)
12871 apply_relocations ((FILE *) file
, sec
, section
->start
, section
->size
,
12872 & section
->reloc_info
, & section
->num_relocs
);
12875 section
->reloc_info
= NULL
;
12876 section
->num_relocs
= 0;
12882 /* If this is not NULL, load_debug_section will only look for sections
12883 within the list of sections given here. */
12884 unsigned int *section_subset
= NULL
;
12887 load_debug_section (enum dwarf_section_display_enum debug
, void * file
)
12889 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
12890 Elf_Internal_Shdr
* sec
;
12892 /* Locate the debug section. */
12893 sec
= find_section_in_set (section
->uncompressed_name
, section_subset
);
12895 section
->name
= section
->uncompressed_name
;
12898 sec
= find_section_in_set (section
->compressed_name
, section_subset
);
12900 section
->name
= section
->compressed_name
;
12905 /* If we're loading from a subset of sections, and we've loaded
12906 a section matching this name before, it's likely that it's a
12908 if (section_subset
!= NULL
)
12909 free_debug_section (debug
);
12911 return load_specific_debug_section (debug
, sec
, (FILE *) file
);
12915 free_debug_section (enum dwarf_section_display_enum debug
)
12917 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
12919 if (section
->start
== NULL
)
12922 free ((char *) section
->start
);
12923 section
->start
= NULL
;
12924 section
->address
= 0;
12929 display_debug_section (int shndx
, Elf_Internal_Shdr
* section
, FILE * file
)
12931 char * name
= SECTION_NAME (section
);
12932 const char * print_name
= printable_section_name (section
);
12933 bfd_size_type length
;
12937 length
= section
->sh_size
;
12940 printf (_("\nSection '%s' has no debugging data.\n"), print_name
);
12943 if (section
->sh_type
== SHT_NOBITS
)
12945 /* There is no point in dumping the contents of a debugging section
12946 which has the NOBITS type - the bits in the file will be random.
12947 This can happen when a file containing a .eh_frame section is
12948 stripped with the --only-keep-debug command line option. */
12949 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12954 if (const_strneq (name
, ".gnu.linkonce.wi."))
12955 name
= ".debug_info";
12957 /* See if we know how to display the contents of this section. */
12958 for (i
= 0; i
< max
; i
++)
12959 if (streq (debug_displays
[i
].section
.uncompressed_name
, name
)
12960 || (i
== line
&& const_strneq (name
, ".debug_line."))
12961 || streq (debug_displays
[i
].section
.compressed_name
, name
))
12963 struct dwarf_section
* sec
= &debug_displays
[i
].section
;
12964 int secondary
= (section
!= find_section (name
));
12967 free_debug_section ((enum dwarf_section_display_enum
) i
);
12969 if (i
== line
&& const_strneq (name
, ".debug_line."))
12971 else if (streq (sec
->uncompressed_name
, name
))
12972 sec
->name
= sec
->uncompressed_name
;
12974 sec
->name
= sec
->compressed_name
;
12975 if (load_specific_debug_section ((enum dwarf_section_display_enum
) i
,
12978 /* If this debug section is part of a CU/TU set in a .dwp file,
12979 restrict load_debug_section to the sections in that set. */
12980 section_subset
= find_cu_tu_set (file
, shndx
);
12982 result
&= debug_displays
[i
].display (sec
, file
);
12984 section_subset
= NULL
;
12986 if (secondary
|| (i
!= info
&& i
!= abbrev
))
12987 free_debug_section ((enum dwarf_section_display_enum
) i
);
12995 printf (_("Unrecognized debug section: %s\n"), print_name
);
13002 /* Set DUMP_SECTS for all sections where dumps were requested
13003 based on section name. */
13006 initialise_dumps_byname (void)
13008 struct dump_list_entry
* cur
;
13010 for (cur
= dump_sects_byname
; cur
; cur
= cur
->next
)
13015 for (i
= 0, any
= 0; i
< elf_header
.e_shnum
; i
++)
13016 if (streq (SECTION_NAME (section_headers
+ i
), cur
->name
))
13018 request_dump_bynumber (i
, cur
->type
);
13023 warn (_("Section '%s' was not dumped because it does not exist!\n"),
13029 process_section_contents (FILE * file
)
13031 Elf_Internal_Shdr
* section
;
13037 initialise_dumps_byname ();
13039 for (i
= 0, section
= section_headers
;
13040 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
13043 #ifdef SUPPORT_DISASSEMBLY
13044 if (dump_sects
[i
] & DISASS_DUMP
)
13045 disassemble_section (section
, file
);
13047 if (dump_sects
[i
] & HEX_DUMP
)
13048 dump_section_as_bytes (section
, file
, FALSE
);
13050 if (dump_sects
[i
] & RELOC_DUMP
)
13051 dump_section_as_bytes (section
, file
, TRUE
);
13053 if (dump_sects
[i
] & STRING_DUMP
)
13054 dump_section_as_strings (section
, file
);
13056 if (dump_sects
[i
] & DEBUG_DUMP
)
13057 display_debug_section (i
, section
, file
);
13060 /* Check to see if the user requested a
13061 dump of a section that does not exist. */
13062 while (i
++ < num_dump_sects
)
13064 warn (_("Section %d was not dumped because it does not exist!\n"), i
);
13068 process_mips_fpe_exception (int mask
)
13073 if (mask
& OEX_FPU_INEX
)
13074 fputs ("INEX", stdout
), first
= 0;
13075 if (mask
& OEX_FPU_UFLO
)
13076 printf ("%sUFLO", first
? "" : "|"), first
= 0;
13077 if (mask
& OEX_FPU_OFLO
)
13078 printf ("%sOFLO", first
? "" : "|"), first
= 0;
13079 if (mask
& OEX_FPU_DIV0
)
13080 printf ("%sDIV0", first
? "" : "|"), first
= 0;
13081 if (mask
& OEX_FPU_INVAL
)
13082 printf ("%sINVAL", first
? "" : "|");
13085 fputs ("0", stdout
);
13088 /* Display's the value of TAG at location P. If TAG is
13089 greater than 0 it is assumed to be an unknown tag, and
13090 a message is printed to this effect. Otherwise it is
13091 assumed that a message has already been printed.
13093 If the bottom bit of TAG is set it assumed to have a
13094 string value, otherwise it is assumed to have an integer
13097 Returns an updated P pointing to the first unread byte
13098 beyond the end of TAG's value.
13100 Reads at or beyond END will not be made. */
13102 static unsigned char *
13103 display_tag_value (int tag
,
13105 const unsigned char * const end
)
13110 printf (" Tag_unknown_%d: ", tag
);
13114 warn (_("<corrupt tag>\n"));
13118 /* PR 17531 file: 027-19978-0.004. */
13119 size_t maxlen
= (end
- p
) - 1;
13124 print_symbol ((int) maxlen
, (const char *) p
);
13125 p
+= strnlen ((char *) p
, maxlen
) + 1;
13129 printf (_("<corrupt string tag>"));
13130 p
= (unsigned char *) end
;
13138 val
= read_uleb128 (p
, &len
, end
);
13140 printf ("%ld (0x%lx)\n", val
, val
);
13147 /* ARM EABI attributes section. */
13152 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
13154 const char ** table
;
13155 } arm_attr_public_tag
;
13157 static const char * arm_attr_tag_CPU_arch
[] =
13158 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
13159 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
13161 static const char * arm_attr_tag_ARM_ISA_use
[] = {"No", "Yes"};
13162 static const char * arm_attr_tag_THUMB_ISA_use
[] =
13163 {"No", "Thumb-1", "Thumb-2", "Yes"};
13164 static const char * arm_attr_tag_FP_arch
[] =
13165 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
13166 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
13167 static const char * arm_attr_tag_WMMX_arch
[] = {"No", "WMMXv1", "WMMXv2"};
13168 static const char * arm_attr_tag_Advanced_SIMD_arch
[] =
13169 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
13170 "NEON for ARMv8.1"};
13171 static const char * arm_attr_tag_PCS_config
[] =
13172 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
13173 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
13174 static const char * arm_attr_tag_ABI_PCS_R9_use
[] =
13175 {"V6", "SB", "TLS", "Unused"};
13176 static const char * arm_attr_tag_ABI_PCS_RW_data
[] =
13177 {"Absolute", "PC-relative", "SB-relative", "None"};
13178 static const char * arm_attr_tag_ABI_PCS_RO_data
[] =
13179 {"Absolute", "PC-relative", "None"};
13180 static const char * arm_attr_tag_ABI_PCS_GOT_use
[] =
13181 {"None", "direct", "GOT-indirect"};
13182 static const char * arm_attr_tag_ABI_PCS_wchar_t
[] =
13183 {"None", "??? 1", "2", "??? 3", "4"};
13184 static const char * arm_attr_tag_ABI_FP_rounding
[] = {"Unused", "Needed"};
13185 static const char * arm_attr_tag_ABI_FP_denormal
[] =
13186 {"Unused", "Needed", "Sign only"};
13187 static const char * arm_attr_tag_ABI_FP_exceptions
[] = {"Unused", "Needed"};
13188 static const char * arm_attr_tag_ABI_FP_user_exceptions
[] = {"Unused", "Needed"};
13189 static const char * arm_attr_tag_ABI_FP_number_model
[] =
13190 {"Unused", "Finite", "RTABI", "IEEE 754"};
13191 static const char * arm_attr_tag_ABI_enum_size
[] =
13192 {"Unused", "small", "int", "forced to int"};
13193 static const char * arm_attr_tag_ABI_HardFP_use
[] =
13194 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
13195 static const char * arm_attr_tag_ABI_VFP_args
[] =
13196 {"AAPCS", "VFP registers", "custom", "compatible"};
13197 static const char * arm_attr_tag_ABI_WMMX_args
[] =
13198 {"AAPCS", "WMMX registers", "custom"};
13199 static const char * arm_attr_tag_ABI_optimization_goals
[] =
13200 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13201 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
13202 static const char * arm_attr_tag_ABI_FP_optimization_goals
[] =
13203 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13204 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
13205 static const char * arm_attr_tag_CPU_unaligned_access
[] = {"None", "v6"};
13206 static const char * arm_attr_tag_FP_HP_extension
[] =
13207 {"Not Allowed", "Allowed"};
13208 static const char * arm_attr_tag_ABI_FP_16bit_format
[] =
13209 {"None", "IEEE 754", "Alternative Format"};
13210 static const char * arm_attr_tag_DSP_extension
[] =
13211 {"Follow architecture", "Allowed"};
13212 static const char * arm_attr_tag_MPextension_use
[] =
13213 {"Not Allowed", "Allowed"};
13214 static const char * arm_attr_tag_DIV_use
[] =
13215 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
13216 "Allowed in v7-A with integer division extension"};
13217 static const char * arm_attr_tag_T2EE_use
[] = {"Not Allowed", "Allowed"};
13218 static const char * arm_attr_tag_Virtualization_use
[] =
13219 {"Not Allowed", "TrustZone", "Virtualization Extensions",
13220 "TrustZone and Virtualization Extensions"};
13221 static const char * arm_attr_tag_MPextension_use_legacy
[] =
13222 {"Not Allowed", "Allowed"};
13224 #define LOOKUP(id, name) \
13225 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
13226 static arm_attr_public_tag arm_attr_public_tags
[] =
13228 {4, "CPU_raw_name", 1, NULL
},
13229 {5, "CPU_name", 1, NULL
},
13230 LOOKUP(6, CPU_arch
),
13231 {7, "CPU_arch_profile", 0, NULL
},
13232 LOOKUP(8, ARM_ISA_use
),
13233 LOOKUP(9, THUMB_ISA_use
),
13234 LOOKUP(10, FP_arch
),
13235 LOOKUP(11, WMMX_arch
),
13236 LOOKUP(12, Advanced_SIMD_arch
),
13237 LOOKUP(13, PCS_config
),
13238 LOOKUP(14, ABI_PCS_R9_use
),
13239 LOOKUP(15, ABI_PCS_RW_data
),
13240 LOOKUP(16, ABI_PCS_RO_data
),
13241 LOOKUP(17, ABI_PCS_GOT_use
),
13242 LOOKUP(18, ABI_PCS_wchar_t
),
13243 LOOKUP(19, ABI_FP_rounding
),
13244 LOOKUP(20, ABI_FP_denormal
),
13245 LOOKUP(21, ABI_FP_exceptions
),
13246 LOOKUP(22, ABI_FP_user_exceptions
),
13247 LOOKUP(23, ABI_FP_number_model
),
13248 {24, "ABI_align_needed", 0, NULL
},
13249 {25, "ABI_align_preserved", 0, NULL
},
13250 LOOKUP(26, ABI_enum_size
),
13251 LOOKUP(27, ABI_HardFP_use
),
13252 LOOKUP(28, ABI_VFP_args
),
13253 LOOKUP(29, ABI_WMMX_args
),
13254 LOOKUP(30, ABI_optimization_goals
),
13255 LOOKUP(31, ABI_FP_optimization_goals
),
13256 {32, "compatibility", 0, NULL
},
13257 LOOKUP(34, CPU_unaligned_access
),
13258 LOOKUP(36, FP_HP_extension
),
13259 LOOKUP(38, ABI_FP_16bit_format
),
13260 LOOKUP(42, MPextension_use
),
13261 LOOKUP(44, DIV_use
),
13262 LOOKUP(46, DSP_extension
),
13263 {64, "nodefaults", 0, NULL
},
13264 {65, "also_compatible_with", 0, NULL
},
13265 LOOKUP(66, T2EE_use
),
13266 {67, "conformance", 1, NULL
},
13267 LOOKUP(68, Virtualization_use
),
13268 LOOKUP(70, MPextension_use_legacy
)
13272 static unsigned char *
13273 display_arm_attribute (unsigned char * p
,
13274 const unsigned char * const end
)
13279 arm_attr_public_tag
* attr
;
13283 tag
= read_uleb128 (p
, &len
, end
);
13286 for (i
= 0; i
< ARRAY_SIZE (arm_attr_public_tags
); i
++)
13288 if (arm_attr_public_tags
[i
].tag
== tag
)
13290 attr
= &arm_attr_public_tags
[i
];
13297 printf (" Tag_%s: ", attr
->name
);
13298 switch (attr
->type
)
13303 case 7: /* Tag_CPU_arch_profile. */
13304 val
= read_uleb128 (p
, &len
, end
);
13308 case 0: printf (_("None\n")); break;
13309 case 'A': printf (_("Application\n")); break;
13310 case 'R': printf (_("Realtime\n")); break;
13311 case 'M': printf (_("Microcontroller\n")); break;
13312 case 'S': printf (_("Application or Realtime\n")); break;
13313 default: printf ("??? (%d)\n", val
); break;
13317 case 24: /* Tag_align_needed. */
13318 val
= read_uleb128 (p
, &len
, end
);
13322 case 0: printf (_("None\n")); break;
13323 case 1: printf (_("8-byte\n")); break;
13324 case 2: printf (_("4-byte\n")); break;
13325 case 3: printf ("??? 3\n"); break;
13328 printf (_("8-byte and up to %d-byte extended\n"),
13331 printf ("??? (%d)\n", val
);
13336 case 25: /* Tag_align_preserved. */
13337 val
= read_uleb128 (p
, &len
, end
);
13341 case 0: printf (_("None\n")); break;
13342 case 1: printf (_("8-byte, except leaf SP\n")); break;
13343 case 2: printf (_("8-byte\n")); break;
13344 case 3: printf ("??? 3\n"); break;
13347 printf (_("8-byte and up to %d-byte extended\n"),
13350 printf ("??? (%d)\n", val
);
13355 case 32: /* Tag_compatibility. */
13357 val
= read_uleb128 (p
, &len
, end
);
13359 printf (_("flag = %d, vendor = "), val
);
13362 size_t maxlen
= (end
- p
) - 1;
13364 print_symbol ((int) maxlen
, (const char *) p
);
13365 p
+= strnlen ((char *) p
, maxlen
) + 1;
13369 printf (_("<corrupt>"));
13370 p
= (unsigned char *) end
;
13376 case 64: /* Tag_nodefaults. */
13377 /* PR 17531: file: 001-505008-0.01. */
13380 printf (_("True\n"));
13383 case 65: /* Tag_also_compatible_with. */
13384 val
= read_uleb128 (p
, &len
, end
);
13386 if (val
== 6 /* Tag_CPU_arch. */)
13388 val
= read_uleb128 (p
, &len
, end
);
13390 if ((unsigned int) val
>= ARRAY_SIZE (arm_attr_tag_CPU_arch
))
13391 printf ("??? (%d)\n", val
);
13393 printf ("%s\n", arm_attr_tag_CPU_arch
[val
]);
13397 while (p
< end
&& *(p
++) != '\0' /* NUL terminator. */)
13402 printf (_("<unknown: %d>\n"), tag
);
13408 return display_tag_value (-1, p
, end
);
13410 return display_tag_value (0, p
, end
);
13413 assert (attr
->type
& 0x80);
13414 val
= read_uleb128 (p
, &len
, end
);
13416 type
= attr
->type
& 0x7f;
13418 printf ("??? (%d)\n", val
);
13420 printf ("%s\n", attr
->table
[val
]);
13425 return display_tag_value (tag
, p
, end
);
13428 static unsigned char *
13429 display_gnu_attribute (unsigned char * p
,
13430 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, int, const unsigned char * const),
13431 const unsigned char * const end
)
13437 tag
= read_uleb128 (p
, &len
, end
);
13440 /* Tag_compatibility is the only generic GNU attribute defined at
13444 val
= read_uleb128 (p
, &len
, end
);
13447 printf (_("flag = %d, vendor = "), val
);
13450 printf (_("<corrupt>\n"));
13451 warn (_("corrupt vendor attribute\n"));
13457 size_t maxlen
= (end
- p
) - 1;
13459 print_symbol ((int) maxlen
, (const char *) p
);
13460 p
+= strnlen ((char *) p
, maxlen
) + 1;
13464 printf (_("<corrupt>"));
13465 p
= (unsigned char *) end
;
13472 if ((tag
& 2) == 0 && display_proc_gnu_attribute
)
13473 return display_proc_gnu_attribute (p
, tag
, end
);
13475 return display_tag_value (tag
, p
, end
);
13478 static unsigned char *
13479 display_power_gnu_attribute (unsigned char * p
,
13481 const unsigned char * const end
)
13486 if (tag
== Tag_GNU_Power_ABI_FP
)
13488 val
= read_uleb128 (p
, &len
, end
);
13490 printf (" Tag_GNU_Power_ABI_FP: ");
13493 printf (_("<corrupt>\n"));
13498 printf ("(%#x), ", val
);
13503 printf (_("unspecified hard/soft float, "));
13506 printf (_("hard float, "));
13509 printf (_("soft float, "));
13512 printf (_("single-precision hard float, "));
13519 printf (_("unspecified long double\n"));
13522 printf (_("128-bit IBM long double\n"));
13525 printf (_("64-bit long double\n"));
13528 printf (_("128-bit IEEE long double\n"));
13534 if (tag
== Tag_GNU_Power_ABI_Vector
)
13536 val
= read_uleb128 (p
, &len
, end
);
13538 printf (" Tag_GNU_Power_ABI_Vector: ");
13541 printf (_("<corrupt>\n"));
13546 printf ("(%#x), ", val
);
13551 printf (_("unspecified\n"));
13554 printf (_("generic\n"));
13557 printf ("AltiVec\n");
13566 if (tag
== Tag_GNU_Power_ABI_Struct_Return
)
13568 val
= read_uleb128 (p
, &len
, end
);
13570 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
13573 printf (_("<corrupt>\n"));
13578 printf ("(%#x), ", val
);
13583 printf (_("unspecified\n"));
13586 printf ("r3/r4\n");
13589 printf (_("memory\n"));
13598 return display_tag_value (tag
& 1, p
, end
);
13601 static unsigned char *
13602 display_s390_gnu_attribute (unsigned char * p
,
13604 const unsigned char * const end
)
13609 if (tag
== Tag_GNU_S390_ABI_Vector
)
13611 val
= read_uleb128 (p
, &len
, end
);
13613 printf (" Tag_GNU_S390_ABI_Vector: ");
13618 printf (_("any\n"));
13621 printf (_("software\n"));
13624 printf (_("hardware\n"));
13627 printf ("??? (%d)\n", val
);
13633 return display_tag_value (tag
& 1, p
, end
);
13637 display_sparc_hwcaps (int mask
)
13643 if (mask
& ELF_SPARC_HWCAP_MUL32
)
13644 fputs ("mul32", stdout
), first
= 0;
13645 if (mask
& ELF_SPARC_HWCAP_DIV32
)
13646 printf ("%sdiv32", first
? "" : "|"), first
= 0;
13647 if (mask
& ELF_SPARC_HWCAP_FSMULD
)
13648 printf ("%sfsmuld", first
? "" : "|"), first
= 0;
13649 if (mask
& ELF_SPARC_HWCAP_V8PLUS
)
13650 printf ("%sv8plus", first
? "" : "|"), first
= 0;
13651 if (mask
& ELF_SPARC_HWCAP_POPC
)
13652 printf ("%spopc", first
? "" : "|"), first
= 0;
13653 if (mask
& ELF_SPARC_HWCAP_VIS
)
13654 printf ("%svis", first
? "" : "|"), first
= 0;
13655 if (mask
& ELF_SPARC_HWCAP_VIS2
)
13656 printf ("%svis2", first
? "" : "|"), first
= 0;
13657 if (mask
& ELF_SPARC_HWCAP_ASI_BLK_INIT
)
13658 printf ("%sASIBlkInit", first
? "" : "|"), first
= 0;
13659 if (mask
& ELF_SPARC_HWCAP_FMAF
)
13660 printf ("%sfmaf", first
? "" : "|"), first
= 0;
13661 if (mask
& ELF_SPARC_HWCAP_VIS3
)
13662 printf ("%svis3", first
? "" : "|"), first
= 0;
13663 if (mask
& ELF_SPARC_HWCAP_HPC
)
13664 printf ("%shpc", first
? "" : "|"), first
= 0;
13665 if (mask
& ELF_SPARC_HWCAP_RANDOM
)
13666 printf ("%srandom", first
? "" : "|"), first
= 0;
13667 if (mask
& ELF_SPARC_HWCAP_TRANS
)
13668 printf ("%strans", first
? "" : "|"), first
= 0;
13669 if (mask
& ELF_SPARC_HWCAP_FJFMAU
)
13670 printf ("%sfjfmau", first
? "" : "|"), first
= 0;
13671 if (mask
& ELF_SPARC_HWCAP_IMA
)
13672 printf ("%sima", first
? "" : "|"), first
= 0;
13673 if (mask
& ELF_SPARC_HWCAP_ASI_CACHE_SPARING
)
13674 printf ("%scspare", first
? "" : "|"), first
= 0;
13677 fputc ('0', stdout
);
13678 fputc ('\n', stdout
);
13682 display_sparc_hwcaps2 (int mask
)
13688 if (mask
& ELF_SPARC_HWCAP2_FJATHPLUS
)
13689 fputs ("fjathplus", stdout
), first
= 0;
13690 if (mask
& ELF_SPARC_HWCAP2_VIS3B
)
13691 printf ("%svis3b", first
? "" : "|"), first
= 0;
13692 if (mask
& ELF_SPARC_HWCAP2_ADP
)
13693 printf ("%sadp", first
? "" : "|"), first
= 0;
13694 if (mask
& ELF_SPARC_HWCAP2_SPARC5
)
13695 printf ("%ssparc5", first
? "" : "|"), first
= 0;
13696 if (mask
& ELF_SPARC_HWCAP2_MWAIT
)
13697 printf ("%smwait", first
? "" : "|"), first
= 0;
13698 if (mask
& ELF_SPARC_HWCAP2_XMPMUL
)
13699 printf ("%sxmpmul", first
? "" : "|"), first
= 0;
13700 if (mask
& ELF_SPARC_HWCAP2_XMONT
)
13701 printf ("%sxmont2", first
? "" : "|"), first
= 0;
13702 if (mask
& ELF_SPARC_HWCAP2_NSEC
)
13703 printf ("%snsec", first
? "" : "|"), first
= 0;
13704 if (mask
& ELF_SPARC_HWCAP2_FJATHHPC
)
13705 printf ("%sfjathhpc", first
? "" : "|"), first
= 0;
13706 if (mask
& ELF_SPARC_HWCAP2_FJDES
)
13707 printf ("%sfjdes", first
? "" : "|"), first
= 0;
13708 if (mask
& ELF_SPARC_HWCAP2_FJAES
)
13709 printf ("%sfjaes", first
? "" : "|"), first
= 0;
13712 fputc ('0', stdout
);
13713 fputc ('\n', stdout
);
13716 static unsigned char *
13717 display_sparc_gnu_attribute (unsigned char * p
,
13719 const unsigned char * const end
)
13724 if (tag
== Tag_GNU_Sparc_HWCAPS
)
13726 val
= read_uleb128 (p
, &len
, end
);
13728 printf (" Tag_GNU_Sparc_HWCAPS: ");
13729 display_sparc_hwcaps (val
);
13732 if (tag
== Tag_GNU_Sparc_HWCAPS2
)
13734 val
= read_uleb128 (p
, &len
, end
);
13736 printf (" Tag_GNU_Sparc_HWCAPS2: ");
13737 display_sparc_hwcaps2 (val
);
13741 return display_tag_value (tag
, p
, end
);
13745 print_mips_fp_abi_value (int val
)
13749 case Val_GNU_MIPS_ABI_FP_ANY
:
13750 printf (_("Hard or soft float\n"));
13752 case Val_GNU_MIPS_ABI_FP_DOUBLE
:
13753 printf (_("Hard float (double precision)\n"));
13755 case Val_GNU_MIPS_ABI_FP_SINGLE
:
13756 printf (_("Hard float (single precision)\n"));
13758 case Val_GNU_MIPS_ABI_FP_SOFT
:
13759 printf (_("Soft float\n"));
13761 case Val_GNU_MIPS_ABI_FP_OLD_64
:
13762 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13764 case Val_GNU_MIPS_ABI_FP_XX
:
13765 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13767 case Val_GNU_MIPS_ABI_FP_64
:
13768 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13770 case Val_GNU_MIPS_ABI_FP_64A
:
13771 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13773 case Val_GNU_MIPS_ABI_FP_NAN2008
:
13774 printf (_("NaN 2008 compatibility\n"));
13777 printf ("??? (%d)\n", val
);
13782 static unsigned char *
13783 display_mips_gnu_attribute (unsigned char * p
,
13785 const unsigned char * const end
)
13787 if (tag
== Tag_GNU_MIPS_ABI_FP
)
13792 val
= read_uleb128 (p
, &len
, end
);
13794 printf (" Tag_GNU_MIPS_ABI_FP: ");
13796 print_mips_fp_abi_value (val
);
13801 if (tag
== Tag_GNU_MIPS_ABI_MSA
)
13806 val
= read_uleb128 (p
, &len
, end
);
13808 printf (" Tag_GNU_MIPS_ABI_MSA: ");
13812 case Val_GNU_MIPS_ABI_MSA_ANY
:
13813 printf (_("Any MSA or not\n"));
13815 case Val_GNU_MIPS_ABI_MSA_128
:
13816 printf (_("128-bit MSA\n"));
13819 printf ("??? (%d)\n", val
);
13825 return display_tag_value (tag
& 1, p
, end
);
13828 static unsigned char *
13829 display_tic6x_attribute (unsigned char * p
,
13830 const unsigned char * const end
)
13836 tag
= read_uleb128 (p
, &len
, end
);
13842 val
= read_uleb128 (p
, &len
, end
);
13844 printf (" Tag_ISA: ");
13848 case C6XABI_Tag_ISA_none
:
13849 printf (_("None\n"));
13851 case C6XABI_Tag_ISA_C62X
:
13854 case C6XABI_Tag_ISA_C67X
:
13857 case C6XABI_Tag_ISA_C67XP
:
13858 printf ("C67x+\n");
13860 case C6XABI_Tag_ISA_C64X
:
13863 case C6XABI_Tag_ISA_C64XP
:
13864 printf ("C64x+\n");
13866 case C6XABI_Tag_ISA_C674X
:
13867 printf ("C674x\n");
13870 printf ("??? (%d)\n", val
);
13875 case Tag_ABI_wchar_t
:
13876 val
= read_uleb128 (p
, &len
, end
);
13878 printf (" Tag_ABI_wchar_t: ");
13882 printf (_("Not used\n"));
13885 printf (_("2 bytes\n"));
13888 printf (_("4 bytes\n"));
13891 printf ("??? (%d)\n", val
);
13896 case Tag_ABI_stack_align_needed
:
13897 val
= read_uleb128 (p
, &len
, end
);
13899 printf (" Tag_ABI_stack_align_needed: ");
13903 printf (_("8-byte\n"));
13906 printf (_("16-byte\n"));
13909 printf ("??? (%d)\n", val
);
13914 case Tag_ABI_stack_align_preserved
:
13915 val
= read_uleb128 (p
, &len
, end
);
13917 printf (" Tag_ABI_stack_align_preserved: ");
13921 printf (_("8-byte\n"));
13924 printf (_("16-byte\n"));
13927 printf ("??? (%d)\n", val
);
13933 val
= read_uleb128 (p
, &len
, end
);
13935 printf (" Tag_ABI_DSBT: ");
13939 printf (_("DSBT addressing not used\n"));
13942 printf (_("DSBT addressing used\n"));
13945 printf ("??? (%d)\n", val
);
13951 val
= read_uleb128 (p
, &len
, end
);
13953 printf (" Tag_ABI_PID: ");
13957 printf (_("Data addressing position-dependent\n"));
13960 printf (_("Data addressing position-independent, GOT near DP\n"));
13963 printf (_("Data addressing position-independent, GOT far from DP\n"));
13966 printf ("??? (%d)\n", val
);
13972 val
= read_uleb128 (p
, &len
, end
);
13974 printf (" Tag_ABI_PIC: ");
13978 printf (_("Code addressing position-dependent\n"));
13981 printf (_("Code addressing position-independent\n"));
13984 printf ("??? (%d)\n", val
);
13989 case Tag_ABI_array_object_alignment
:
13990 val
= read_uleb128 (p
, &len
, end
);
13992 printf (" Tag_ABI_array_object_alignment: ");
13996 printf (_("8-byte\n"));
13999 printf (_("4-byte\n"));
14002 printf (_("16-byte\n"));
14005 printf ("??? (%d)\n", val
);
14010 case Tag_ABI_array_object_align_expected
:
14011 val
= read_uleb128 (p
, &len
, end
);
14013 printf (" Tag_ABI_array_object_align_expected: ");
14017 printf (_("8-byte\n"));
14020 printf (_("4-byte\n"));
14023 printf (_("16-byte\n"));
14026 printf ("??? (%d)\n", val
);
14031 case Tag_ABI_compatibility
:
14033 val
= read_uleb128 (p
, &len
, end
);
14035 printf (" Tag_ABI_compatibility: ");
14036 printf (_("flag = %d, vendor = "), val
);
14039 size_t maxlen
= (end
- p
) - 1;
14041 print_symbol ((int) maxlen
, (const char *) p
);
14042 p
+= strnlen ((char *) p
, maxlen
) + 1;
14046 printf (_("<corrupt>"));
14047 p
= (unsigned char *) end
;
14053 case Tag_ABI_conformance
:
14055 printf (" Tag_ABI_conformance: \"");
14058 size_t maxlen
= (end
- p
) - 1;
14060 print_symbol ((int) maxlen
, (const char *) p
);
14061 p
+= strnlen ((char *) p
, maxlen
) + 1;
14065 printf (_("<corrupt>"));
14066 p
= (unsigned char *) end
;
14073 return display_tag_value (tag
, p
, end
);
14077 display_raw_attribute (unsigned char * p
, unsigned char * end
)
14079 unsigned long addr
= 0;
14080 size_t bytes
= end
- p
;
14087 int lbytes
= (bytes
> 16 ? 16 : bytes
);
14089 printf (" 0x%8.8lx ", addr
);
14091 for (j
= 0; j
< 16; j
++)
14094 printf ("%2.2x", p
[j
]);
14102 for (j
= 0; j
< lbytes
; j
++)
14105 if (k
>= ' ' && k
< 0x7f)
14121 static unsigned char *
14122 display_msp430x_attribute (unsigned char * p
,
14123 const unsigned char * const end
)
14129 tag
= read_uleb128 (p
, & len
, end
);
14134 case OFBA_MSPABI_Tag_ISA
:
14135 val
= read_uleb128 (p
, &len
, end
);
14137 printf (" Tag_ISA: ");
14140 case 0: printf (_("None\n")); break;
14141 case 1: printf (_("MSP430\n")); break;
14142 case 2: printf (_("MSP430X\n")); break;
14143 default: printf ("??? (%d)\n", val
); break;
14147 case OFBA_MSPABI_Tag_Code_Model
:
14148 val
= read_uleb128 (p
, &len
, end
);
14150 printf (" Tag_Code_Model: ");
14153 case 0: printf (_("None\n")); break;
14154 case 1: printf (_("Small\n")); break;
14155 case 2: printf (_("Large\n")); break;
14156 default: printf ("??? (%d)\n", val
); break;
14160 case OFBA_MSPABI_Tag_Data_Model
:
14161 val
= read_uleb128 (p
, &len
, end
);
14163 printf (" Tag_Data_Model: ");
14166 case 0: printf (_("None\n")); break;
14167 case 1: printf (_("Small\n")); break;
14168 case 2: printf (_("Large\n")); break;
14169 case 3: printf (_("Restricted Large\n")); break;
14170 default: printf ("??? (%d)\n", val
); break;
14175 printf (_(" <unknown tag %d>: "), tag
);
14182 size_t maxlen
= (end
- p
) - 1;
14184 print_symbol ((int) maxlen
, (const char *) p
);
14185 p
+= strnlen ((char *) p
, maxlen
) + 1;
14189 printf (_("<corrupt>"));
14190 p
= (unsigned char *) end
;
14196 val
= read_uleb128 (p
, &len
, end
);
14198 printf ("%d (0x%x)\n", val
, val
);
14208 process_attributes (FILE * file
,
14209 const char * public_name
,
14210 unsigned int proc_type
,
14211 unsigned char * (* display_pub_attribute
) (unsigned char *, const unsigned char * const),
14212 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, int, const unsigned char * const))
14214 Elf_Internal_Shdr
* sect
;
14217 /* Find the section header so that we get the size. */
14218 for (i
= 0, sect
= section_headers
;
14219 i
< elf_header
.e_shnum
;
14222 unsigned char * contents
;
14225 if (sect
->sh_type
!= proc_type
&& sect
->sh_type
!= SHT_GNU_ATTRIBUTES
)
14228 contents
= (unsigned char *) get_data (NULL
, file
, sect
->sh_offset
, 1,
14229 sect
->sh_size
, _("attributes"));
14230 if (contents
== NULL
)
14236 bfd_vma section_len
;
14238 section_len
= sect
->sh_size
- 1;
14241 while (section_len
> 0)
14244 unsigned int namelen
;
14245 bfd_boolean public_section
;
14246 bfd_boolean gnu_section
;
14248 if (section_len
<= 4)
14250 error (_("Tag section ends prematurely\n"));
14253 attr_len
= byte_get (p
, 4);
14256 if (attr_len
> section_len
)
14258 error (_("Bad attribute length (%u > %u)\n"),
14259 (unsigned) attr_len
, (unsigned) section_len
);
14260 attr_len
= section_len
;
14262 /* PR 17531: file: 001-101425-0.004 */
14263 else if (attr_len
< 5)
14265 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len
);
14269 section_len
-= attr_len
;
14272 namelen
= strnlen ((char *) p
, attr_len
) + 1;
14273 if (namelen
== 0 || namelen
>= attr_len
)
14275 error (_("Corrupt attribute section name\n"));
14279 printf (_("Attribute Section: "));
14280 print_symbol (INT_MAX
, (const char *) p
);
14283 if (public_name
&& streq ((char *) p
, public_name
))
14284 public_section
= TRUE
;
14286 public_section
= FALSE
;
14288 if (streq ((char *) p
, "gnu"))
14289 gnu_section
= TRUE
;
14291 gnu_section
= FALSE
;
14294 attr_len
-= namelen
;
14296 while (attr_len
> 0 && p
< contents
+ sect
->sh_size
)
14301 unsigned char * end
;
14303 /* PR binutils/17531: Safe handling of corrupt files. */
14306 error (_("Unused bytes at end of section\n"));
14312 size
= byte_get (p
, 4);
14313 if (size
> attr_len
)
14315 error (_("Bad subsection length (%u > %u)\n"),
14316 (unsigned) size
, (unsigned) attr_len
);
14319 /* PR binutils/17531: Safe handling of corrupt files. */
14322 error (_("Bad subsection length (%u < 6)\n"),
14329 end
= p
+ size
- 1;
14330 assert (end
<= contents
+ sect
->sh_size
);
14336 printf (_("File Attributes\n"));
14339 printf (_("Section Attributes:"));
14342 printf (_("Symbol Attributes:"));
14343 /* Fall through. */
14349 val
= read_uleb128 (p
, &j
, end
);
14353 printf (" %d", val
);
14358 printf (_("Unknown tag: %d\n"), tag
);
14359 public_section
= FALSE
;
14363 if (public_section
&& display_pub_attribute
!= NULL
)
14366 p
= display_pub_attribute (p
, end
);
14369 else if (gnu_section
&& display_proc_gnu_attribute
!= NULL
)
14372 p
= display_gnu_attribute (p
,
14373 display_proc_gnu_attribute
,
14379 printf (_(" Unknown attribute:\n"));
14380 display_raw_attribute (p
, end
);
14389 printf (_("Unknown format '%c' (%d)\n"), *p
, *p
);
14397 process_arm_specific (FILE * file
)
14399 return process_attributes (file
, "aeabi", SHT_ARM_ATTRIBUTES
,
14400 display_arm_attribute
, NULL
);
14404 process_power_specific (FILE * file
)
14406 return process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
14407 display_power_gnu_attribute
);
14411 process_s390_specific (FILE * file
)
14413 return process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
14414 display_s390_gnu_attribute
);
14418 process_sparc_specific (FILE * file
)
14420 return process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
14421 display_sparc_gnu_attribute
);
14425 process_tic6x_specific (FILE * file
)
14427 return process_attributes (file
, "c6xabi", SHT_C6000_ATTRIBUTES
,
14428 display_tic6x_attribute
, NULL
);
14432 process_msp430x_specific (FILE * file
)
14434 return process_attributes (file
, "mspabi", SHT_MSP430_ATTRIBUTES
,
14435 display_msp430x_attribute
, NULL
);
14438 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14439 Print the Address, Access and Initial fields of an entry at VMA ADDR
14440 and return the VMA of the next entry, or -1 if there was a problem.
14441 Does not read from DATA_END or beyond. */
14444 print_mips_got_entry (unsigned char * data
, bfd_vma pltgot
, bfd_vma addr
,
14445 unsigned char * data_end
)
14448 print_vma (addr
, LONG_HEX
);
14450 if (addr
< pltgot
+ 0xfff0)
14451 printf ("%6d(gp)", (int) (addr
- pltgot
- 0x7ff0));
14453 printf ("%10s", "");
14456 printf ("%*s", is_32bit_elf
? 8 : 16, _("<unknown>"));
14460 unsigned char * from
= data
+ addr
- pltgot
;
14462 if (from
+ (is_32bit_elf
? 4 : 8) > data_end
)
14464 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14465 printf ("%*s", is_32bit_elf
? 8 : 16, _("<corrupt>"));
14466 return (bfd_vma
) -1;
14470 entry
= byte_get (data
+ addr
- pltgot
, is_32bit_elf
? 4 : 8);
14471 print_vma (entry
, LONG_HEX
);
14474 return addr
+ (is_32bit_elf
? 4 : 8);
14477 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14478 PLTGOT. Print the Address and Initial fields of an entry at VMA
14479 ADDR and return the VMA of the next entry. */
14482 print_mips_pltgot_entry (unsigned char * data
, bfd_vma pltgot
, bfd_vma addr
)
14485 print_vma (addr
, LONG_HEX
);
14488 printf ("%*s", is_32bit_elf
? 8 : 16, _("<unknown>"));
14493 entry
= byte_get (data
+ addr
- pltgot
, is_32bit_elf
? 4 : 8);
14494 print_vma (entry
, LONG_HEX
);
14496 return addr
+ (is_32bit_elf
? 4 : 8);
14500 print_mips_ases (unsigned int mask
)
14502 if (mask
& AFL_ASE_DSP
)
14503 fputs ("\n\tDSP ASE", stdout
);
14504 if (mask
& AFL_ASE_DSPR2
)
14505 fputs ("\n\tDSP R2 ASE", stdout
);
14506 if (mask
& AFL_ASE_DSPR3
)
14507 fputs ("\n\tDSP R3 ASE", stdout
);
14508 if (mask
& AFL_ASE_EVA
)
14509 fputs ("\n\tEnhanced VA Scheme", stdout
);
14510 if (mask
& AFL_ASE_MCU
)
14511 fputs ("\n\tMCU (MicroController) ASE", stdout
);
14512 if (mask
& AFL_ASE_MDMX
)
14513 fputs ("\n\tMDMX ASE", stdout
);
14514 if (mask
& AFL_ASE_MIPS3D
)
14515 fputs ("\n\tMIPS-3D ASE", stdout
);
14516 if (mask
& AFL_ASE_MT
)
14517 fputs ("\n\tMT ASE", stdout
);
14518 if (mask
& AFL_ASE_SMARTMIPS
)
14519 fputs ("\n\tSmartMIPS ASE", stdout
);
14520 if (mask
& AFL_ASE_VIRT
)
14521 fputs ("\n\tVZ ASE", stdout
);
14522 if (mask
& AFL_ASE_MSA
)
14523 fputs ("\n\tMSA ASE", stdout
);
14524 if (mask
& AFL_ASE_MIPS16
)
14525 fputs ("\n\tMIPS16 ASE", stdout
);
14526 if (mask
& AFL_ASE_MICROMIPS
)
14527 fputs ("\n\tMICROMIPS ASE", stdout
);
14528 if (mask
& AFL_ASE_XPA
)
14529 fputs ("\n\tXPA ASE", stdout
);
14531 fprintf (stdout
, "\n\t%s", _("None"));
14532 else if ((mask
& ~AFL_ASE_MASK
) != 0)
14533 fprintf (stdout
, "\n\t%s (%x)", _("Unknown"), mask
& ~AFL_ASE_MASK
);
14537 print_mips_isa_ext (unsigned int isa_ext
)
14542 fputs (_("None"), stdout
);
14545 fputs ("RMI XLR", stdout
);
14547 case AFL_EXT_OCTEON3
:
14548 fputs ("Cavium Networks Octeon3", stdout
);
14550 case AFL_EXT_OCTEON2
:
14551 fputs ("Cavium Networks Octeon2", stdout
);
14553 case AFL_EXT_OCTEONP
:
14554 fputs ("Cavium Networks OcteonP", stdout
);
14556 case AFL_EXT_LOONGSON_3A
:
14557 fputs ("Loongson 3A", stdout
);
14559 case AFL_EXT_OCTEON
:
14560 fputs ("Cavium Networks Octeon", stdout
);
14563 fputs ("Toshiba R5900", stdout
);
14566 fputs ("MIPS R4650", stdout
);
14569 fputs ("LSI R4010", stdout
);
14572 fputs ("NEC VR4100", stdout
);
14575 fputs ("Toshiba R3900", stdout
);
14577 case AFL_EXT_10000
:
14578 fputs ("MIPS R10000", stdout
);
14581 fputs ("Broadcom SB-1", stdout
);
14584 fputs ("NEC VR4111/VR4181", stdout
);
14587 fputs ("NEC VR4120", stdout
);
14590 fputs ("NEC VR5400", stdout
);
14593 fputs ("NEC VR5500", stdout
);
14595 case AFL_EXT_LOONGSON_2E
:
14596 fputs ("ST Microelectronics Loongson 2E", stdout
);
14598 case AFL_EXT_LOONGSON_2F
:
14599 fputs ("ST Microelectronics Loongson 2F", stdout
);
14602 fprintf (stdout
, "%s (%d)", _("Unknown"), isa_ext
);
14607 get_mips_reg_size (int reg_size
)
14609 return (reg_size
== AFL_REG_NONE
) ? 0
14610 : (reg_size
== AFL_REG_32
) ? 32
14611 : (reg_size
== AFL_REG_64
) ? 64
14612 : (reg_size
== AFL_REG_128
) ? 128
14617 process_mips_specific (FILE * file
)
14619 Elf_Internal_Dyn
* entry
;
14620 Elf_Internal_Shdr
*sect
= NULL
;
14621 size_t liblist_offset
= 0;
14622 size_t liblistno
= 0;
14623 size_t conflictsno
= 0;
14624 size_t options_offset
= 0;
14625 size_t conflicts_offset
= 0;
14626 size_t pltrelsz
= 0;
14628 bfd_vma pltgot
= 0;
14629 bfd_vma mips_pltgot
= 0;
14630 bfd_vma jmprel
= 0;
14631 bfd_vma local_gotno
= 0;
14632 bfd_vma gotsym
= 0;
14633 bfd_vma symtabno
= 0;
14635 process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
14636 display_mips_gnu_attribute
);
14638 sect
= find_section (".MIPS.abiflags");
14642 Elf_External_ABIFlags_v0
*abiflags_ext
;
14643 Elf_Internal_ABIFlags_v0 abiflags_in
;
14645 if (sizeof (Elf_External_ABIFlags_v0
) != sect
->sh_size
)
14646 fputs ("\nCorrupt ABI Flags section.\n", stdout
);
14649 abiflags_ext
= get_data (NULL
, file
, sect
->sh_offset
, 1,
14650 sect
->sh_size
, _("MIPS ABI Flags section"));
14653 abiflags_in
.version
= BYTE_GET (abiflags_ext
->version
);
14654 abiflags_in
.isa_level
= BYTE_GET (abiflags_ext
->isa_level
);
14655 abiflags_in
.isa_rev
= BYTE_GET (abiflags_ext
->isa_rev
);
14656 abiflags_in
.gpr_size
= BYTE_GET (abiflags_ext
->gpr_size
);
14657 abiflags_in
.cpr1_size
= BYTE_GET (abiflags_ext
->cpr1_size
);
14658 abiflags_in
.cpr2_size
= BYTE_GET (abiflags_ext
->cpr2_size
);
14659 abiflags_in
.fp_abi
= BYTE_GET (abiflags_ext
->fp_abi
);
14660 abiflags_in
.isa_ext
= BYTE_GET (abiflags_ext
->isa_ext
);
14661 abiflags_in
.ases
= BYTE_GET (abiflags_ext
->ases
);
14662 abiflags_in
.flags1
= BYTE_GET (abiflags_ext
->flags1
);
14663 abiflags_in
.flags2
= BYTE_GET (abiflags_ext
->flags2
);
14665 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in
.version
);
14666 printf ("\nISA: MIPS%d", abiflags_in
.isa_level
);
14667 if (abiflags_in
.isa_rev
> 1)
14668 printf ("r%d", abiflags_in
.isa_rev
);
14669 printf ("\nGPR size: %d",
14670 get_mips_reg_size (abiflags_in
.gpr_size
));
14671 printf ("\nCPR1 size: %d",
14672 get_mips_reg_size (abiflags_in
.cpr1_size
));
14673 printf ("\nCPR2 size: %d",
14674 get_mips_reg_size (abiflags_in
.cpr2_size
));
14675 fputs ("\nFP ABI: ", stdout
);
14676 print_mips_fp_abi_value (abiflags_in
.fp_abi
);
14677 fputs ("ISA Extension: ", stdout
);
14678 print_mips_isa_ext (abiflags_in
.isa_ext
);
14679 fputs ("\nASEs:", stdout
);
14680 print_mips_ases (abiflags_in
.ases
);
14681 printf ("\nFLAGS 1: %8.8lx", abiflags_in
.flags1
);
14682 printf ("\nFLAGS 2: %8.8lx", abiflags_in
.flags2
);
14683 fputc ('\n', stdout
);
14684 free (abiflags_ext
);
14689 /* We have a lot of special sections. Thanks SGI! */
14690 if (dynamic_section
== NULL
)
14691 /* No information available. */
14694 for (entry
= dynamic_section
;
14695 /* PR 17531 file: 012-50589-0.004. */
14696 entry
< dynamic_section
+ dynamic_nent
&& entry
->d_tag
!= DT_NULL
;
14698 switch (entry
->d_tag
)
14700 case DT_MIPS_LIBLIST
:
14702 = offset_from_vma (file
, entry
->d_un
.d_val
,
14703 liblistno
* sizeof (Elf32_External_Lib
));
14705 case DT_MIPS_LIBLISTNO
:
14706 liblistno
= entry
->d_un
.d_val
;
14708 case DT_MIPS_OPTIONS
:
14709 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
14711 case DT_MIPS_CONFLICT
:
14713 = offset_from_vma (file
, entry
->d_un
.d_val
,
14714 conflictsno
* sizeof (Elf32_External_Conflict
));
14716 case DT_MIPS_CONFLICTNO
:
14717 conflictsno
= entry
->d_un
.d_val
;
14720 pltgot
= entry
->d_un
.d_ptr
;
14722 case DT_MIPS_LOCAL_GOTNO
:
14723 local_gotno
= entry
->d_un
.d_val
;
14725 case DT_MIPS_GOTSYM
:
14726 gotsym
= entry
->d_un
.d_val
;
14728 case DT_MIPS_SYMTABNO
:
14729 symtabno
= entry
->d_un
.d_val
;
14731 case DT_MIPS_PLTGOT
:
14732 mips_pltgot
= entry
->d_un
.d_ptr
;
14735 pltrel
= entry
->d_un
.d_val
;
14738 pltrelsz
= entry
->d_un
.d_val
;
14741 jmprel
= entry
->d_un
.d_ptr
;
14747 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
14749 Elf32_External_Lib
* elib
;
14752 elib
= (Elf32_External_Lib
*) get_data (NULL
, file
, liblist_offset
,
14754 sizeof (Elf32_External_Lib
),
14755 _("liblist section data"));
14758 printf (_("\nSection '.liblist' contains %lu entries:\n"),
14759 (unsigned long) liblistno
);
14760 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
14763 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
14770 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
14771 atime
= BYTE_GET (elib
[cnt
].l_time_stamp
);
14772 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
14773 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
14774 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
14776 tmp
= gmtime (&atime
);
14777 snprintf (timebuf
, sizeof (timebuf
),
14778 "%04u-%02u-%02uT%02u:%02u:%02u",
14779 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
14780 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
14782 printf ("%3lu: ", (unsigned long) cnt
);
14783 if (VALID_DYNAMIC_NAME (liblist
.l_name
))
14784 print_symbol (20, GET_DYNAMIC_NAME (liblist
.l_name
));
14786 printf (_("<corrupt: %9ld>"), liblist
.l_name
);
14787 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
14788 liblist
.l_version
);
14790 if (liblist
.l_flags
== 0)
14794 static const struct
14801 { " EXACT_MATCH", LL_EXACT_MATCH
},
14802 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
14803 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
14804 { " EXPORTS", LL_EXPORTS
},
14805 { " DELAY_LOAD", LL_DELAY_LOAD
},
14806 { " DELTA", LL_DELTA
}
14808 int flags
= liblist
.l_flags
;
14811 for (fcnt
= 0; fcnt
< ARRAY_SIZE (l_flags_vals
); ++fcnt
)
14812 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
14814 fputs (l_flags_vals
[fcnt
].name
, stdout
);
14815 flags
^= l_flags_vals
[fcnt
].bit
;
14818 printf (" %#x", (unsigned int) flags
);
14828 if (options_offset
!= 0)
14830 Elf_External_Options
* eopt
;
14831 Elf_Internal_Options
* iopt
;
14832 Elf_Internal_Options
* option
;
14835 sect
= section_headers
;
14837 /* Find the section header so that we get the size. */
14838 sect
= find_section_by_type (SHT_MIPS_OPTIONS
);
14839 /* PR 17533 file: 012-277276-0.004. */
14842 error (_("No MIPS_OPTIONS header found\n"));
14846 eopt
= (Elf_External_Options
*) get_data (NULL
, file
, options_offset
, 1,
14847 sect
->sh_size
, _("options"));
14850 iopt
= (Elf_Internal_Options
*)
14851 cmalloc ((sect
->sh_size
/ sizeof (eopt
)), sizeof (* iopt
));
14854 error (_("Out of memory allocating space for MIPS options\n"));
14861 while (offset
<= sect
->sh_size
- sizeof (* eopt
))
14863 Elf_External_Options
* eoption
;
14865 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
14867 option
->kind
= BYTE_GET (eoption
->kind
);
14868 option
->size
= BYTE_GET (eoption
->size
);
14869 option
->section
= BYTE_GET (eoption
->section
);
14870 option
->info
= BYTE_GET (eoption
->info
);
14872 /* PR 17531: file: ffa0fa3b. */
14873 if (option
->size
< sizeof (* eopt
)
14874 || offset
+ option
->size
> sect
->sh_size
)
14876 error (_("Invalid size (%u) for MIPS option\n"), option
->size
);
14879 offset
+= option
->size
;
14885 printf (_("\nSection '%s' contains %d entries:\n"),
14886 printable_section_name (sect
), cnt
);
14895 switch (option
->kind
)
14898 /* This shouldn't happen. */
14899 printf (" NULL %d %lx", option
->section
, option
->info
);
14902 printf (" REGINFO ");
14903 if (elf_header
.e_machine
== EM_MIPS
)
14906 Elf32_External_RegInfo
* ereg
;
14907 Elf32_RegInfo reginfo
;
14909 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
14910 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
14911 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
14912 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
14913 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
14914 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
14915 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
14917 printf ("GPR %08lx GP 0x%lx\n",
14918 reginfo
.ri_gprmask
,
14919 (unsigned long) reginfo
.ri_gp_value
);
14920 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14921 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
14922 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
14927 Elf64_External_RegInfo
* ereg
;
14928 Elf64_Internal_RegInfo reginfo
;
14930 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
14931 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
14932 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
14933 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
14934 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
14935 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
14936 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
14938 printf ("GPR %08lx GP 0x",
14939 reginfo
.ri_gprmask
);
14940 printf_vma (reginfo
.ri_gp_value
);
14943 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14944 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
14945 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
14949 case ODK_EXCEPTIONS
:
14950 fputs (" EXCEPTIONS fpe_min(", stdout
);
14951 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
14952 fputs (") fpe_max(", stdout
);
14953 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
14954 fputs (")", stdout
);
14956 if (option
->info
& OEX_PAGE0
)
14957 fputs (" PAGE0", stdout
);
14958 if (option
->info
& OEX_SMM
)
14959 fputs (" SMM", stdout
);
14960 if (option
->info
& OEX_FPDBUG
)
14961 fputs (" FPDBUG", stdout
);
14962 if (option
->info
& OEX_DISMISS
)
14963 fputs (" DISMISS", stdout
);
14966 fputs (" PAD ", stdout
);
14967 if (option
->info
& OPAD_PREFIX
)
14968 fputs (" PREFIX", stdout
);
14969 if (option
->info
& OPAD_POSTFIX
)
14970 fputs (" POSTFIX", stdout
);
14971 if (option
->info
& OPAD_SYMBOL
)
14972 fputs (" SYMBOL", stdout
);
14975 fputs (" HWPATCH ", stdout
);
14976 if (option
->info
& OHW_R4KEOP
)
14977 fputs (" R4KEOP", stdout
);
14978 if (option
->info
& OHW_R8KPFETCH
)
14979 fputs (" R8KPFETCH", stdout
);
14980 if (option
->info
& OHW_R5KEOP
)
14981 fputs (" R5KEOP", stdout
);
14982 if (option
->info
& OHW_R5KCVTL
)
14983 fputs (" R5KCVTL", stdout
);
14986 fputs (" FILL ", stdout
);
14987 /* XXX Print content of info word? */
14990 fputs (" TAGS ", stdout
);
14991 /* XXX Print content of info word? */
14994 fputs (" HWAND ", stdout
);
14995 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
14996 fputs (" R4KEOP_CHECKED", stdout
);
14997 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
14998 fputs (" R4KEOP_CLEAN", stdout
);
15001 fputs (" HWOR ", stdout
);
15002 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
15003 fputs (" R4KEOP_CHECKED", stdout
);
15004 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
15005 fputs (" R4KEOP_CLEAN", stdout
);
15008 printf (" GP_GROUP %#06lx self-contained %#06lx",
15009 option
->info
& OGP_GROUP
,
15010 (option
->info
& OGP_SELF
) >> 16);
15013 printf (" IDENT %#06lx self-contained %#06lx",
15014 option
->info
& OGP_GROUP
,
15015 (option
->info
& OGP_SELF
) >> 16);
15018 /* This shouldn't happen. */
15019 printf (" %3d ??? %d %lx",
15020 option
->kind
, option
->section
, option
->info
);
15024 len
= sizeof (* eopt
);
15025 while (len
< option
->size
)
15027 unsigned char datum
= * ((unsigned char *) eopt
+ offset
+ len
);
15029 if (ISPRINT (datum
))
15030 printf ("%c", datum
);
15032 printf ("\\%03o", datum
);
15035 fputs ("\n", stdout
);
15037 offset
+= option
->size
;
15045 if (conflicts_offset
!= 0 && conflictsno
!= 0)
15047 Elf32_Conflict
* iconf
;
15050 if (dynamic_symbols
== NULL
)
15052 error (_("conflict list found without a dynamic symbol table\n"));
15056 iconf
= (Elf32_Conflict
*) cmalloc (conflictsno
, sizeof (* iconf
));
15059 error (_("Out of memory allocating space for dynamic conflicts\n"));
15065 Elf32_External_Conflict
* econf32
;
15067 econf32
= (Elf32_External_Conflict
*)
15068 get_data (NULL
, file
, conflicts_offset
, conflictsno
,
15069 sizeof (* econf32
), _("conflict"));
15073 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
15074 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
15080 Elf64_External_Conflict
* econf64
;
15082 econf64
= (Elf64_External_Conflict
*)
15083 get_data (NULL
, file
, conflicts_offset
, conflictsno
,
15084 sizeof (* econf64
), _("conflict"));
15088 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
15089 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
15094 printf (_("\nSection '.conflict' contains %lu entries:\n"),
15095 (unsigned long) conflictsno
);
15096 puts (_(" Num: Index Value Name"));
15098 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
15100 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
15102 if (iconf
[cnt
] >= num_dynamic_syms
)
15103 printf (_("<corrupt symbol index>"));
15106 Elf_Internal_Sym
* psym
;
15108 psym
= & dynamic_symbols
[iconf
[cnt
]];
15109 print_vma (psym
->st_value
, FULL_HEX
);
15111 if (VALID_DYNAMIC_NAME (psym
->st_name
))
15112 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
15114 printf (_("<corrupt: %14ld>"), psym
->st_name
);
15122 if (pltgot
!= 0 && local_gotno
!= 0)
15124 bfd_vma ent
, local_end
, global_end
;
15126 unsigned char * data
;
15127 unsigned char * data_end
;
15131 addr_size
= (is_32bit_elf
? 4 : 8);
15132 local_end
= pltgot
+ local_gotno
* addr_size
;
15134 /* PR binutils/17533 file: 012-111227-0.004 */
15135 if (symtabno
< gotsym
)
15137 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
15138 (unsigned long) gotsym
, (unsigned long) symtabno
);
15142 global_end
= local_end
+ (symtabno
- gotsym
) * addr_size
;
15143 /* PR 17531: file: 54c91a34. */
15144 if (global_end
< local_end
)
15146 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno
);
15150 offset
= offset_from_vma (file
, pltgot
, global_end
- pltgot
);
15151 data
= (unsigned char *) get_data (NULL
, file
, offset
,
15152 global_end
- pltgot
, 1,
15153 _("Global Offset Table data"));
15156 data_end
= data
+ (global_end
- pltgot
);
15158 printf (_("\nPrimary GOT:\n"));
15159 printf (_(" Canonical gp value: "));
15160 print_vma (pltgot
+ 0x7ff0, LONG_HEX
);
15163 printf (_(" Reserved entries:\n"));
15164 printf (_(" %*s %10s %*s Purpose\n"),
15165 addr_size
* 2, _("Address"), _("Access"),
15166 addr_size
* 2, _("Initial"));
15167 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
15168 printf (_(" Lazy resolver\n"));
15169 if (ent
== (bfd_vma
) -1)
15170 goto got_print_fail
;
15172 && (byte_get (data
+ ent
- pltgot
, addr_size
)
15173 >> (addr_size
* 8 - 1)) != 0)
15175 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
15176 printf (_(" Module pointer (GNU extension)\n"));
15177 if (ent
== (bfd_vma
) -1)
15178 goto got_print_fail
;
15182 if (ent
< local_end
)
15184 printf (_(" Local entries:\n"));
15185 printf (" %*s %10s %*s\n",
15186 addr_size
* 2, _("Address"), _("Access"),
15187 addr_size
* 2, _("Initial"));
15188 while (ent
< local_end
)
15190 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
15192 if (ent
== (bfd_vma
) -1)
15193 goto got_print_fail
;
15198 if (gotsym
< symtabno
)
15202 printf (_(" Global entries:\n"));
15203 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
15204 addr_size
* 2, _("Address"),
15206 addr_size
* 2, _("Initial"),
15207 addr_size
* 2, _("Sym.Val."),
15209 /* Note for translators: "Ndx" = abbreviated form of "Index". */
15210 _("Ndx"), _("Name"));
15212 sym_width
= (is_32bit_elf
? 80 : 160) - 28 - addr_size
* 6 - 1;
15214 for (i
= gotsym
; i
< symtabno
; i
++)
15216 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
15219 if (dynamic_symbols
== NULL
)
15220 printf (_("<no dynamic symbols>"));
15221 else if (i
< num_dynamic_syms
)
15223 Elf_Internal_Sym
* psym
= dynamic_symbols
+ i
;
15225 print_vma (psym
->st_value
, LONG_HEX
);
15226 printf (" %-7s %3s ",
15227 get_symbol_type (ELF_ST_TYPE (psym
->st_info
)),
15228 get_symbol_index_type (psym
->st_shndx
));
15230 if (VALID_DYNAMIC_NAME (psym
->st_name
))
15231 print_symbol (sym_width
, GET_DYNAMIC_NAME (psym
->st_name
));
15233 printf (_("<corrupt: %14ld>"), psym
->st_name
);
15236 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
15237 (unsigned long) i
);
15240 if (ent
== (bfd_vma
) -1)
15251 if (mips_pltgot
!= 0 && jmprel
!= 0 && pltrel
!= 0 && pltrelsz
!= 0)
15254 size_t offset
, rel_offset
;
15255 unsigned long count
, i
;
15256 unsigned char * data
;
15257 int addr_size
, sym_width
;
15258 Elf_Internal_Rela
* rels
;
15260 rel_offset
= offset_from_vma (file
, jmprel
, pltrelsz
);
15261 if (pltrel
== DT_RELA
)
15263 if (!slurp_rela_relocs (file
, rel_offset
, pltrelsz
, &rels
, &count
))
15268 if (!slurp_rel_relocs (file
, rel_offset
, pltrelsz
, &rels
, &count
))
15273 addr_size
= (is_32bit_elf
? 4 : 8);
15274 end
= mips_pltgot
+ (2 + count
) * addr_size
;
15276 offset
= offset_from_vma (file
, mips_pltgot
, end
- mips_pltgot
);
15277 data
= (unsigned char *) get_data (NULL
, file
, offset
, end
- mips_pltgot
,
15278 1, _("Procedure Linkage Table data"));
15282 printf ("\nPLT GOT:\n\n");
15283 printf (_(" Reserved entries:\n"));
15284 printf (_(" %*s %*s Purpose\n"),
15285 addr_size
* 2, _("Address"), addr_size
* 2, _("Initial"));
15286 ent
= print_mips_pltgot_entry (data
, mips_pltgot
, ent
);
15287 printf (_(" PLT lazy resolver\n"));
15288 ent
= print_mips_pltgot_entry (data
, mips_pltgot
, ent
);
15289 printf (_(" Module pointer\n"));
15292 printf (_(" Entries:\n"));
15293 printf (" %*s %*s %*s %-7s %3s %s\n",
15294 addr_size
* 2, _("Address"),
15295 addr_size
* 2, _("Initial"),
15296 addr_size
* 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
15297 sym_width
= (is_32bit_elf
? 80 : 160) - 17 - addr_size
* 6 - 1;
15298 for (i
= 0; i
< count
; i
++)
15300 unsigned long idx
= get_reloc_symindex (rels
[i
].r_info
);
15302 ent
= print_mips_pltgot_entry (data
, mips_pltgot
, ent
);
15305 if (idx
>= num_dynamic_syms
)
15306 printf (_("<corrupt symbol index: %lu>"), idx
);
15309 Elf_Internal_Sym
* psym
= dynamic_symbols
+ idx
;
15311 print_vma (psym
->st_value
, LONG_HEX
);
15312 printf (" %-7s %3s ",
15313 get_symbol_type (ELF_ST_TYPE (psym
->st_info
)),
15314 get_symbol_index_type (psym
->st_shndx
));
15315 if (VALID_DYNAMIC_NAME (psym
->st_name
))
15316 print_symbol (sym_width
, GET_DYNAMIC_NAME (psym
->st_name
));
15318 printf (_("<corrupt: %14ld>"), psym
->st_name
);
15333 process_nds32_specific (FILE * file
)
15335 Elf_Internal_Shdr
*sect
= NULL
;
15337 sect
= find_section (".nds32_e_flags");
15340 unsigned int *flag
;
15342 printf ("\nNDS32 elf flags section:\n");
15343 flag
= get_data (NULL
, file
, sect
->sh_offset
, 1,
15344 sect
->sh_size
, _("NDS32 elf flags section"));
15346 switch ((*flag
) & 0x3)
15349 printf ("(VEC_SIZE):\tNo entry.\n");
15352 printf ("(VEC_SIZE):\t4 bytes\n");
15355 printf ("(VEC_SIZE):\t16 bytes\n");
15358 printf ("(VEC_SIZE):\treserved\n");
15367 process_gnu_liblist (FILE * file
)
15369 Elf_Internal_Shdr
* section
;
15370 Elf_Internal_Shdr
* string_sec
;
15371 Elf32_External_Lib
* elib
;
15373 size_t strtab_size
;
15380 for (i
= 0, section
= section_headers
;
15381 i
< elf_header
.e_shnum
;
15384 switch (section
->sh_type
)
15386 case SHT_GNU_LIBLIST
:
15387 if (section
->sh_link
>= elf_header
.e_shnum
)
15390 elib
= (Elf32_External_Lib
*)
15391 get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
15392 _("liblist section data"));
15396 string_sec
= section_headers
+ section
->sh_link
;
15398 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
, 1,
15399 string_sec
->sh_size
,
15400 _("liblist string table"));
15402 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
15408 strtab_size
= string_sec
->sh_size
;
15410 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
15411 printable_section_name (section
),
15412 (unsigned long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
15414 puts (_(" Library Time Stamp Checksum Version Flags"));
15416 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
15424 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
15425 atime
= BYTE_GET (elib
[cnt
].l_time_stamp
);
15426 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
15427 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
15428 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
15430 tmp
= gmtime (&atime
);
15431 snprintf (timebuf
, sizeof (timebuf
),
15432 "%04u-%02u-%02uT%02u:%02u:%02u",
15433 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
15434 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
15436 printf ("%3lu: ", (unsigned long) cnt
);
15438 printf ("%-20s", liblist
.l_name
< strtab_size
15439 ? strtab
+ liblist
.l_name
: _("<corrupt>"));
15441 printf ("%-20.20s", liblist
.l_name
< strtab_size
15442 ? strtab
+ liblist
.l_name
: _("<corrupt>"));
15443 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
15444 liblist
.l_version
, liblist
.l_flags
);
15455 static const char *
15456 get_note_type (unsigned e_type
)
15458 static char buff
[64];
15460 if (elf_header
.e_type
== ET_CORE
)
15464 return _("NT_AUXV (auxiliary vector)");
15466 return _("NT_PRSTATUS (prstatus structure)");
15468 return _("NT_FPREGSET (floating point registers)");
15470 return _("NT_PRPSINFO (prpsinfo structure)");
15471 case NT_TASKSTRUCT
:
15472 return _("NT_TASKSTRUCT (task structure)");
15474 return _("NT_PRXFPREG (user_xfpregs structure)");
15476 return _("NT_PPC_VMX (ppc Altivec registers)");
15478 return _("NT_PPC_VSX (ppc VSX registers)");
15480 return _("NT_386_TLS (x86 TLS information)");
15481 case NT_386_IOPERM
:
15482 return _("NT_386_IOPERM (x86 I/O permissions)");
15483 case NT_X86_XSTATE
:
15484 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
15485 case NT_S390_HIGH_GPRS
:
15486 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
15487 case NT_S390_TIMER
:
15488 return _("NT_S390_TIMER (s390 timer register)");
15489 case NT_S390_TODCMP
:
15490 return _("NT_S390_TODCMP (s390 TOD comparator register)");
15491 case NT_S390_TODPREG
:
15492 return _("NT_S390_TODPREG (s390 TOD programmable register)");
15494 return _("NT_S390_CTRS (s390 control registers)");
15495 case NT_S390_PREFIX
:
15496 return _("NT_S390_PREFIX (s390 prefix register)");
15497 case NT_S390_LAST_BREAK
:
15498 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15499 case NT_S390_SYSTEM_CALL
:
15500 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
15502 return _("NT_S390_TDB (s390 transaction diagnostic block)");
15503 case NT_S390_VXRS_LOW
:
15504 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15505 case NT_S390_VXRS_HIGH
:
15506 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
15508 return _("NT_ARM_VFP (arm VFP registers)");
15510 return _("NT_ARM_TLS (AArch TLS registers)");
15511 case NT_ARM_HW_BREAK
:
15512 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15513 case NT_ARM_HW_WATCH
:
15514 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
15516 return _("NT_PSTATUS (pstatus structure)");
15518 return _("NT_FPREGS (floating point registers)");
15520 return _("NT_PSINFO (psinfo structure)");
15522 return _("NT_LWPSTATUS (lwpstatus_t structure)");
15524 return _("NT_LWPSINFO (lwpsinfo_t structure)");
15525 case NT_WIN32PSTATUS
:
15526 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
15528 return _("NT_SIGINFO (siginfo_t data)");
15530 return _("NT_FILE (mapped files)");
15538 return _("NT_VERSION (version)");
15540 return _("NT_ARCH (architecture)");
15545 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
15550 print_core_note (Elf_Internal_Note
*pnote
)
15552 unsigned int addr_size
= is_32bit_elf
? 4 : 8;
15553 bfd_vma count
, page_size
;
15554 unsigned char *descdata
, *filenames
, *descend
;
15556 if (pnote
->type
!= NT_FILE
)
15562 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
15563 /* Still "successful". */
15568 if (pnote
->descsz
< 2 * addr_size
)
15570 printf (_(" Malformed note - too short for header\n"));
15574 descdata
= (unsigned char *) pnote
->descdata
;
15575 descend
= descdata
+ pnote
->descsz
;
15577 if (descdata
[pnote
->descsz
- 1] != '\0')
15579 printf (_(" Malformed note - does not end with \\0\n"));
15583 count
= byte_get (descdata
, addr_size
);
15584 descdata
+= addr_size
;
15586 page_size
= byte_get (descdata
, addr_size
);
15587 descdata
+= addr_size
;
15589 if (pnote
->descsz
< 2 * addr_size
+ count
* 3 * addr_size
)
15591 printf (_(" Malformed note - too short for supplied file count\n"));
15595 printf (_(" Page size: "));
15596 print_vma (page_size
, DEC
);
15599 printf (_(" %*s%*s%*s\n"),
15600 (int) (2 + 2 * addr_size
), _("Start"),
15601 (int) (4 + 2 * addr_size
), _("End"),
15602 (int) (4 + 2 * addr_size
), _("Page Offset"));
15603 filenames
= descdata
+ count
* 3 * addr_size
;
15604 while (count
-- > 0)
15606 bfd_vma start
, end
, file_ofs
;
15608 if (filenames
== descend
)
15610 printf (_(" Malformed note - filenames end too early\n"));
15614 start
= byte_get (descdata
, addr_size
);
15615 descdata
+= addr_size
;
15616 end
= byte_get (descdata
, addr_size
);
15617 descdata
+= addr_size
;
15618 file_ofs
= byte_get (descdata
, addr_size
);
15619 descdata
+= addr_size
;
15622 print_vma (start
, FULL_HEX
);
15624 print_vma (end
, FULL_HEX
);
15626 print_vma (file_ofs
, FULL_HEX
);
15627 printf ("\n %s\n", filenames
);
15629 filenames
+= 1 + strlen ((char *) filenames
);
15635 static const char *
15636 get_gnu_elf_note_type (unsigned e_type
)
15638 /* NB/ Keep this switch statement in sync with print_gnu_note (). */
15641 case NT_GNU_ABI_TAG
:
15642 return _("NT_GNU_ABI_TAG (ABI version tag)");
15644 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15645 case NT_GNU_BUILD_ID
:
15646 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
15647 case NT_GNU_GOLD_VERSION
:
15648 return _("NT_GNU_GOLD_VERSION (gold version)");
15651 static char buff
[64];
15653 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
15660 print_gnu_note (Elf_Internal_Note
*pnote
)
15662 /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type (). */
15663 switch (pnote
->type
)
15665 case NT_GNU_BUILD_ID
:
15669 printf (_(" Build ID: "));
15670 for (i
= 0; i
< pnote
->descsz
; ++i
)
15671 printf ("%02x", pnote
->descdata
[i
] & 0xff);
15676 case NT_GNU_ABI_TAG
:
15678 unsigned long os
, major
, minor
, subminor
;
15679 const char *osname
;
15681 /* PR 17531: file: 030-599401-0.004. */
15682 if (pnote
->descsz
< 16)
15684 printf (_(" <corrupt GNU_ABI_TAG>\n"));
15688 os
= byte_get ((unsigned char *) pnote
->descdata
, 4);
15689 major
= byte_get ((unsigned char *) pnote
->descdata
+ 4, 4);
15690 minor
= byte_get ((unsigned char *) pnote
->descdata
+ 8, 4);
15691 subminor
= byte_get ((unsigned char *) pnote
->descdata
+ 12, 4);
15695 case GNU_ABI_TAG_LINUX
:
15698 case GNU_ABI_TAG_HURD
:
15701 case GNU_ABI_TAG_SOLARIS
:
15702 osname
= "Solaris";
15704 case GNU_ABI_TAG_FREEBSD
:
15705 osname
= "FreeBSD";
15707 case GNU_ABI_TAG_NETBSD
:
15710 case GNU_ABI_TAG_SYLLABLE
:
15711 osname
= "Syllable";
15713 case GNU_ABI_TAG_NACL
:
15717 osname
= "Unknown";
15721 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname
,
15722 major
, minor
, subminor
);
15726 case NT_GNU_GOLD_VERSION
:
15730 printf (_(" Version: "));
15731 for (i
= 0; i
< pnote
->descsz
&& pnote
->descdata
[i
] != '\0'; ++i
)
15732 printf ("%c", pnote
->descdata
[i
]);
15739 unsigned long num_entries
, mask
;
15741 /* Hardware capabilities information. Word 0 is the number of entries.
15742 Word 1 is a bitmask of enabled entries. The rest of the descriptor
15743 is a series of entries, where each entry is a single byte followed
15744 by a nul terminated string. The byte gives the bit number to test
15745 if enabled in the bitmask. */
15746 printf (_(" Hardware Capabilities: "));
15747 if (pnote
->descsz
< 8)
15749 printf (_("<corrupt GNU_HWCAP>\n"));
15752 num_entries
= byte_get ((unsigned char *) pnote
->descdata
, 4);
15753 mask
= byte_get ((unsigned char *) pnote
->descdata
+ 4, 4);
15754 printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries
, mask
);
15755 /* FIXME: Add code to display the entries... */
15760 /* Handle unrecognised types. An error message should have already been
15761 created by get_gnu_elf_note_type(), so all that we need to do is to
15762 display the data. */
15766 printf (_(" Description data: "));
15767 for (i
= 0; i
< pnote
->descsz
; ++i
)
15768 printf ("%02x ", pnote
->descdata
[i
] & 0xff);
15777 static const char *
15778 get_v850_elf_note_type (enum v850_notes n_type
)
15780 static char buff
[64];
15784 case V850_NOTE_ALIGNMENT
: return _("Alignment of 8-byte objects");
15785 case V850_NOTE_DATA_SIZE
: return _("Sizeof double and long double");
15786 case V850_NOTE_FPU_INFO
: return _("Type of FPU support needed");
15787 case V850_NOTE_SIMD_INFO
: return _("Use of SIMD instructions");
15788 case V850_NOTE_CACHE_INFO
: return _("Use of cache");
15789 case V850_NOTE_MMU_INFO
: return _("Use of MMU");
15791 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), n_type
);
15797 print_v850_note (Elf_Internal_Note
* pnote
)
15801 if (pnote
->descsz
!= 4)
15803 val
= byte_get ((unsigned char *) pnote
->descdata
, pnote
->descsz
);
15807 printf (_("not set\n"));
15811 switch (pnote
->type
)
15813 case V850_NOTE_ALIGNMENT
:
15816 case EF_RH850_DATA_ALIGN4
: printf (_("4-byte\n")); return 1;
15817 case EF_RH850_DATA_ALIGN8
: printf (_("8-byte\n")); return 1;
15821 case V850_NOTE_DATA_SIZE
:
15824 case EF_RH850_DOUBLE32
: printf (_("4-bytes\n")); return 1;
15825 case EF_RH850_DOUBLE64
: printf (_("8-bytes\n")); return 1;
15829 case V850_NOTE_FPU_INFO
:
15832 case EF_RH850_FPU20
: printf (_("FPU-2.0\n")); return 1;
15833 case EF_RH850_FPU30
: printf (_("FPU-3.0\n")); return 1;
15837 case V850_NOTE_MMU_INFO
:
15838 case V850_NOTE_CACHE_INFO
:
15839 case V850_NOTE_SIMD_INFO
:
15840 if (val
== EF_RH850_SIMD
)
15842 printf (_("yes\n"));
15848 /* An 'unknown note type' message will already have been displayed. */
15852 printf (_("unknown value: %x\n"), val
);
15857 process_netbsd_elf_note (Elf_Internal_Note
* pnote
)
15859 unsigned int version
;
15861 switch (pnote
->type
)
15863 case NT_NETBSD_IDENT
:
15864 version
= byte_get ((unsigned char *) pnote
->descdata
, sizeof (version
));
15865 if ((version
/ 10000) % 100)
15866 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote
->descsz
,
15867 version
, version
/ 100000000, (version
/ 1000000) % 100,
15868 (version
/ 10000) % 100 > 26 ? "Z" : "",
15869 'A' + (version
/ 10000) % 26);
15871 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote
->descsz
,
15872 version
, version
/ 100000000, (version
/ 1000000) % 100,
15873 (version
/ 100) % 100);
15876 case NT_NETBSD_MARCH
:
15877 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote
->descsz
,
15885 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote
->descsz
,
15890 static const char *
15891 get_freebsd_elfcore_note_type (unsigned e_type
)
15895 case NT_FREEBSD_THRMISC
:
15896 return _("NT_THRMISC (thrmisc structure)");
15897 case NT_FREEBSD_PROCSTAT_PROC
:
15898 return _("NT_PROCSTAT_PROC (proc data)");
15899 case NT_FREEBSD_PROCSTAT_FILES
:
15900 return _("NT_PROCSTAT_FILES (files data)");
15901 case NT_FREEBSD_PROCSTAT_VMMAP
:
15902 return _("NT_PROCSTAT_VMMAP (vmmap data)");
15903 case NT_FREEBSD_PROCSTAT_GROUPS
:
15904 return _("NT_PROCSTAT_GROUPS (groups data)");
15905 case NT_FREEBSD_PROCSTAT_UMASK
:
15906 return _("NT_PROCSTAT_UMASK (umask data)");
15907 case NT_FREEBSD_PROCSTAT_RLIMIT
:
15908 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
15909 case NT_FREEBSD_PROCSTAT_OSREL
:
15910 return _("NT_PROCSTAT_OSREL (osreldate data)");
15911 case NT_FREEBSD_PROCSTAT_PSSTRINGS
:
15912 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
15913 case NT_FREEBSD_PROCSTAT_AUXV
:
15914 return _("NT_PROCSTAT_AUXV (auxv data)");
15916 return get_note_type (e_type
);
15919 static const char *
15920 get_netbsd_elfcore_note_type (unsigned e_type
)
15922 static char buff
[64];
15924 if (e_type
== NT_NETBSDCORE_PROCINFO
)
15926 /* NetBSD core "procinfo" structure. */
15927 return _("NetBSD procinfo structure");
15930 /* As of Jan 2002 there are no other machine-independent notes
15931 defined for NetBSD core files. If the note type is less
15932 than the start of the machine-dependent note types, we don't
15935 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
15937 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
15941 switch (elf_header
.e_machine
)
15943 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
15944 and PT_GETFPREGS == mach+2. */
15949 case EM_SPARC32PLUS
:
15953 case NT_NETBSDCORE_FIRSTMACH
+ 0:
15954 return _("PT_GETREGS (reg structure)");
15955 case NT_NETBSDCORE_FIRSTMACH
+ 2:
15956 return _("PT_GETFPREGS (fpreg structure)");
15962 /* On all other arch's, PT_GETREGS == mach+1 and
15963 PT_GETFPREGS == mach+3. */
15967 case NT_NETBSDCORE_FIRSTMACH
+ 1:
15968 return _("PT_GETREGS (reg structure)");
15969 case NT_NETBSDCORE_FIRSTMACH
+ 3:
15970 return _("PT_GETFPREGS (fpreg structure)");
15976 snprintf (buff
, sizeof (buff
), "PT_FIRSTMACH+%d",
15977 e_type
- NT_NETBSDCORE_FIRSTMACH
);
15981 static const char *
15982 get_stapsdt_note_type (unsigned e_type
)
15984 static char buff
[64];
15989 return _("NT_STAPSDT (SystemTap probe descriptors)");
15995 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
16000 print_stapsdt_note (Elf_Internal_Note
*pnote
)
16002 int addr_size
= is_32bit_elf
? 4 : 8;
16003 char *data
= pnote
->descdata
;
16004 char *data_end
= pnote
->descdata
+ pnote
->descsz
;
16005 bfd_vma pc
, base_addr
, semaphore
;
16006 char *provider
, *probe
, *arg_fmt
;
16008 pc
= byte_get ((unsigned char *) data
, addr_size
);
16010 base_addr
= byte_get ((unsigned char *) data
, addr_size
);
16012 semaphore
= byte_get ((unsigned char *) data
, addr_size
);
16016 data
+= strlen (data
) + 1;
16018 data
+= strlen (data
) + 1;
16020 data
+= strlen (data
) + 1;
16022 printf (_(" Provider: %s\n"), provider
);
16023 printf (_(" Name: %s\n"), probe
);
16024 printf (_(" Location: "));
16025 print_vma (pc
, FULL_HEX
);
16026 printf (_(", Base: "));
16027 print_vma (base_addr
, FULL_HEX
);
16028 printf (_(", Semaphore: "));
16029 print_vma (semaphore
, FULL_HEX
);
16031 printf (_(" Arguments: %s\n"), arg_fmt
);
16033 return data
== data_end
;
16036 static const char *
16037 get_ia64_vms_note_type (unsigned e_type
)
16039 static char buff
[64];
16044 return _("NT_VMS_MHD (module header)");
16046 return _("NT_VMS_LNM (language name)");
16048 return _("NT_VMS_SRC (source files)");
16050 return "NT_VMS_TITLE";
16052 return _("NT_VMS_EIDC (consistency check)");
16053 case NT_VMS_FPMODE
:
16054 return _("NT_VMS_FPMODE (FP mode)");
16055 case NT_VMS_LINKTIME
:
16056 return "NT_VMS_LINKTIME";
16057 case NT_VMS_IMGNAM
:
16058 return _("NT_VMS_IMGNAM (image name)");
16060 return _("NT_VMS_IMGID (image id)");
16061 case NT_VMS_LINKID
:
16062 return _("NT_VMS_LINKID (link id)");
16063 case NT_VMS_IMGBID
:
16064 return _("NT_VMS_IMGBID (build id)");
16065 case NT_VMS_GSTNAM
:
16066 return _("NT_VMS_GSTNAM (sym table name)");
16067 case NT_VMS_ORIG_DYN
:
16068 return "NT_VMS_ORIG_DYN";
16069 case NT_VMS_PATCHTIME
:
16070 return "NT_VMS_PATCHTIME";
16072 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
16078 print_ia64_vms_note (Elf_Internal_Note
* pnote
)
16080 switch (pnote
->type
)
16083 if (pnote
->descsz
> 36)
16085 size_t l
= strlen (pnote
->descdata
+ 34);
16086 printf (_(" Creation date : %.17s\n"), pnote
->descdata
);
16087 printf (_(" Last patch date: %.17s\n"), pnote
->descdata
+ 17);
16088 printf (_(" Module name : %s\n"), pnote
->descdata
+ 34);
16089 printf (_(" Module version : %s\n"), pnote
->descdata
+ 34 + l
+ 1);
16092 printf (_(" Invalid size\n"));
16095 printf (_(" Language: %s\n"), pnote
->descdata
);
16098 case NT_VMS_FPMODE
:
16099 printf (_(" Floating Point mode: "));
16100 printf ("0x%016" BFD_VMA_FMT
"x\n",
16101 (bfd_vma
) byte_get ((unsigned char *)pnote
->descdata
, 8));
16103 case NT_VMS_LINKTIME
:
16104 printf (_(" Link time: "));
16106 ((bfd_int64_t
) byte_get ((unsigned char *)pnote
->descdata
, 8));
16109 case NT_VMS_PATCHTIME
:
16110 printf (_(" Patch time: "));
16112 ((bfd_int64_t
) byte_get ((unsigned char *)pnote
->descdata
, 8));
16115 case NT_VMS_ORIG_DYN
:
16116 printf (_(" Major id: %u, minor id: %u\n"),
16117 (unsigned) byte_get ((unsigned char *)pnote
->descdata
, 4),
16118 (unsigned) byte_get ((unsigned char *)pnote
->descdata
+ 4, 4));
16119 printf (_(" Last modified : "));
16121 ((bfd_int64_t
) byte_get ((unsigned char *)pnote
->descdata
+ 8, 8));
16122 printf (_("\n Link flags : "));
16123 printf ("0x%016" BFD_VMA_FMT
"x\n",
16124 (bfd_vma
) byte_get ((unsigned char *)pnote
->descdata
+ 16, 8));
16125 printf (_(" Header flags: 0x%08x\n"),
16126 (unsigned) byte_get ((unsigned char *)pnote
->descdata
+ 24, 4));
16127 printf (_(" Image id : %s\n"), pnote
->descdata
+ 32);
16130 case NT_VMS_IMGNAM
:
16131 printf (_(" Image name: %s\n"), pnote
->descdata
);
16133 case NT_VMS_GSTNAM
:
16134 printf (_(" Global symbol table name: %s\n"), pnote
->descdata
);
16137 printf (_(" Image id: %s\n"), pnote
->descdata
);
16139 case NT_VMS_LINKID
:
16140 printf (_(" Linker id: %s\n"), pnote
->descdata
);
16148 /* Note that by the ELF standard, the name field is already null byte
16149 terminated, and namesz includes the terminating null byte.
16150 I.E. the value of namesz for the name "FSF" is 4.
16152 If the value of namesz is zero, there is no name present. */
16154 process_note (Elf_Internal_Note
* pnote
,
16155 FILE * file ATTRIBUTE_UNUSED
,
16156 Elf_Internal_Shdr
* section ATTRIBUTE_UNUSED
)
16158 const char * name
= pnote
->namesz
? pnote
->namedata
: "(NONE)";
16161 if (pnote
->namesz
== 0)
16162 /* If there is no note name, then use the default set of
16163 note type strings. */
16164 nt
= get_note_type (pnote
->type
);
16166 else if (const_strneq (pnote
->namedata
, "GNU"))
16167 /* GNU-specific object file notes. */
16168 nt
= get_gnu_elf_note_type (pnote
->type
);
16170 else if (const_strneq (pnote
->namedata
, "FreeBSD"))
16171 /* FreeBSD-specific core file notes. */
16172 nt
= get_freebsd_elfcore_note_type (pnote
->type
);
16174 else if (const_strneq (pnote
->namedata
, "NetBSD-CORE"))
16175 /* NetBSD-specific core file notes. */
16176 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
16178 else if (const_strneq (pnote
->namedata
, "NetBSD"))
16179 /* NetBSD-specific core file notes. */
16180 return process_netbsd_elf_note (pnote
);
16182 else if (strneq (pnote
->namedata
, "SPU/", 4))
16184 /* SPU-specific core file notes. */
16185 nt
= pnote
->namedata
+ 4;
16189 else if (const_strneq (pnote
->namedata
, "IPF/VMS"))
16190 /* VMS/ia64-specific file notes. */
16191 nt
= get_ia64_vms_note_type (pnote
->type
);
16193 else if (const_strneq (pnote
->namedata
, "stapsdt"))
16194 nt
= get_stapsdt_note_type (pnote
->type
);
16197 /* Don't recognize this note name; just use the default set of
16198 note type strings. */
16199 nt
= get_note_type (pnote
->type
);
16202 print_symbol (-20, name
);
16203 printf (" 0x%08lx\t%s\n", pnote
->descsz
, nt
);
16205 if (const_strneq (pnote
->namedata
, "IPF/VMS"))
16206 return print_ia64_vms_note (pnote
);
16207 else if (const_strneq (pnote
->namedata
, "GNU"))
16208 return print_gnu_note (pnote
);
16209 else if (const_strneq (pnote
->namedata
, "stapsdt"))
16210 return print_stapsdt_note (pnote
);
16211 else if (const_strneq (pnote
->namedata
, "CORE"))
16212 return print_core_note (pnote
);
16214 else if (pnote
->descsz
)
16218 printf (_(" description data: "));
16219 for (i
= 0; i
< pnote
->descsz
; i
++)
16220 printf ("%02x ", pnote
->descdata
[i
]);
16228 process_notes_at (FILE * file
,
16229 Elf_Internal_Shdr
* section
,
16233 Elf_External_Note
* pnotes
;
16234 Elf_External_Note
* external
;
16243 pnotes
= (Elf_External_Note
*) get_section_contents (section
, file
);
16245 apply_relocations (file
, section
, (unsigned char *) pnotes
, length
, NULL
, NULL
);
16248 pnotes
= (Elf_External_Note
*) get_data (NULL
, file
, offset
, 1, length
,
16250 if (pnotes
== NULL
)
16256 printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (section
));
16258 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
16259 (unsigned long) offset
, (unsigned long) length
);
16261 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
16263 end
= (char *) pnotes
+ length
;
16264 while ((char *) external
< end
)
16266 Elf_Internal_Note inote
;
16269 char * temp
= NULL
;
16270 size_t data_remaining
= end
- (char *) external
;
16272 if (!is_ia64_vms ())
16274 /* PR binutils/15191
16275 Make sure that there is enough data to read. */
16276 min_notesz
= offsetof (Elf_External_Note
, name
);
16277 if (data_remaining
< min_notesz
)
16279 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16280 (int) data_remaining
);
16283 inote
.type
= BYTE_GET (external
->type
);
16284 inote
.namesz
= BYTE_GET (external
->namesz
);
16285 inote
.namedata
= external
->name
;
16286 inote
.descsz
= BYTE_GET (external
->descsz
);
16287 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
16288 /* PR 17531: file: 3443835e. */
16289 if (inote
.descdata
< (char *) pnotes
|| inote
.descdata
> end
)
16291 warn (_("Corrupt note: name size is too big: %lx\n"), inote
.namesz
);
16292 inote
.descdata
= inote
.namedata
;
16296 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
16297 next
= inote
.descdata
+ align_power (inote
.descsz
, 2);
16301 Elf64_External_VMS_Note
*vms_external
;
16303 /* PR binutils/15191
16304 Make sure that there is enough data to read. */
16305 min_notesz
= offsetof (Elf64_External_VMS_Note
, name
);
16306 if (data_remaining
< min_notesz
)
16308 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16309 (int) data_remaining
);
16313 vms_external
= (Elf64_External_VMS_Note
*) external
;
16314 inote
.type
= BYTE_GET (vms_external
->type
);
16315 inote
.namesz
= BYTE_GET (vms_external
->namesz
);
16316 inote
.namedata
= vms_external
->name
;
16317 inote
.descsz
= BYTE_GET (vms_external
->descsz
);
16318 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 3);
16319 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
16320 next
= inote
.descdata
+ align_power (inote
.descsz
, 3);
16323 if (inote
.descdata
< (char *) external
+ min_notesz
16324 || next
< (char *) external
+ min_notesz
16325 /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
16326 || inote
.namedata
+ inote
.namesz
< inote
.namedata
16327 || inote
.descdata
+ inote
.descsz
< inote
.descdata
16328 || data_remaining
< (size_t)(next
- (char *) external
))
16330 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
16331 (unsigned long) ((char *) external
- (char *) pnotes
));
16332 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
16333 inote
.type
, inote
.namesz
, inote
.descsz
);
16337 external
= (Elf_External_Note
*) next
;
16339 /* Verify that name is null terminated. It appears that at least
16340 one version of Linux (RedHat 6.0) generates corefiles that don't
16341 comply with the ELF spec by failing to include the null byte in
16343 if (inote
.namedata
[inote
.namesz
- 1] != '\0')
16345 temp
= (char *) malloc (inote
.namesz
+ 1);
16348 error (_("Out of memory allocating space for inote name\n"));
16353 strncpy (temp
, inote
.namedata
, inote
.namesz
);
16354 temp
[inote
.namesz
] = 0;
16356 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
16357 inote
.namedata
= temp
;
16360 res
&= process_note (& inote
, file
, section
);
16375 process_corefile_note_segments (FILE * file
)
16377 Elf_Internal_Phdr
* segment
;
16381 if (! get_program_headers (file
))
16384 for (i
= 0, segment
= program_headers
;
16385 i
< elf_header
.e_phnum
;
16388 if (segment
->p_type
== PT_NOTE
)
16389 res
&= process_notes_at (file
, NULL
,
16390 (bfd_vma
) segment
->p_offset
,
16391 (bfd_vma
) segment
->p_filesz
);
16398 process_v850_notes (FILE * file
, bfd_vma offset
, bfd_vma length
)
16400 Elf_External_Note
* pnotes
;
16401 Elf_External_Note
* external
;
16408 pnotes
= (Elf_External_Note
*) get_data (NULL
, file
, offset
, 1, length
,
16410 if (pnotes
== NULL
)
16414 end
= (char*) pnotes
+ length
;
16416 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
16417 (unsigned long) offset
, (unsigned long) length
);
16419 while ((char *) external
+ sizeof (Elf_External_Note
) < end
)
16421 Elf_External_Note
* next
;
16422 Elf_Internal_Note inote
;
16424 inote
.type
= BYTE_GET (external
->type
);
16425 inote
.namesz
= BYTE_GET (external
->namesz
);
16426 inote
.namedata
= external
->name
;
16427 inote
.descsz
= BYTE_GET (external
->descsz
);
16428 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
16429 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
16431 if (inote
.descdata
< (char *) pnotes
|| inote
.descdata
>= end
)
16433 warn (_("Corrupt note: name size is too big: %lx\n"), inote
.namesz
);
16434 inote
.descdata
= inote
.namedata
;
16438 next
= (Elf_External_Note
*) (inote
.descdata
+ align_power (inote
.descsz
, 2));
16440 if ( ((char *) next
> end
)
16441 || ((char *) next
< (char *) pnotes
))
16443 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
16444 (unsigned long) ((char *) external
- (char *) pnotes
));
16445 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16446 inote
.type
, inote
.namesz
, inote
.descsz
);
16452 /* Prevent out-of-bounds indexing. */
16453 if ( inote
.namedata
+ inote
.namesz
> end
16454 || inote
.namedata
+ inote
.namesz
< inote
.namedata
)
16456 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
16457 (unsigned long) ((char *) external
- (char *) pnotes
));
16458 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16459 inote
.type
, inote
.namesz
, inote
.descsz
);
16463 printf (" %s: ", get_v850_elf_note_type (inote
.type
));
16465 if (! print_v850_note (& inote
))
16468 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
16469 inote
.namesz
, inote
.descsz
);
16479 process_note_sections (FILE * file
)
16481 Elf_Internal_Shdr
* section
;
16486 for (i
= 0, section
= section_headers
;
16487 i
< elf_header
.e_shnum
&& section
!= NULL
;
16490 if (section
->sh_type
== SHT_NOTE
)
16492 res
&= process_notes_at (file
, section
,
16493 (bfd_vma
) section
->sh_offset
,
16494 (bfd_vma
) section
->sh_size
);
16498 if (( elf_header
.e_machine
== EM_V800
16499 || elf_header
.e_machine
== EM_V850
16500 || elf_header
.e_machine
== EM_CYGNUS_V850
)
16501 && section
->sh_type
== SHT_RENESAS_INFO
)
16503 res
&= process_v850_notes (file
,
16504 (bfd_vma
) section
->sh_offset
,
16505 (bfd_vma
) section
->sh_size
);
16511 /* Try processing NOTE segments instead. */
16512 return process_corefile_note_segments (file
);
16518 process_notes (FILE * file
)
16520 /* If we have not been asked to display the notes then do nothing. */
16524 if (elf_header
.e_type
!= ET_CORE
)
16525 return process_note_sections (file
);
16527 /* No program headers means no NOTE segment. */
16528 if (elf_header
.e_phnum
> 0)
16529 return process_corefile_note_segments (file
);
16531 printf (_("No note segments present in the core file.\n"));
16536 process_arch_specific (FILE * file
)
16541 switch (elf_header
.e_machine
)
16544 return process_arm_specific (file
);
16546 case EM_MIPS_RS3_LE
:
16547 return process_mips_specific (file
);
16550 return process_nds32_specific (file
);
16554 return process_power_specific (file
);
16558 return process_s390_specific (file
);
16561 case EM_SPARC32PLUS
:
16563 return process_sparc_specific (file
);
16566 return process_tic6x_specific (file
);
16569 return process_msp430x_specific (file
);
16577 get_file_header (FILE * file
)
16579 /* Read in the identity array. */
16580 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
16583 /* Determine how to read the rest of the header. */
16584 switch (elf_header
.e_ident
[EI_DATA
])
16589 byte_get
= byte_get_little_endian
;
16590 byte_put
= byte_put_little_endian
;
16593 byte_get
= byte_get_big_endian
;
16594 byte_put
= byte_put_big_endian
;
16598 /* For now we only support 32 bit and 64 bit ELF files. */
16599 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
16601 /* Read in the rest of the header. */
16604 Elf32_External_Ehdr ehdr32
;
16606 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
16609 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
16610 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
16611 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
16612 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
16613 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
16614 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
16615 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
16616 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
16617 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
16618 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
16619 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
16620 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
16621 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
16625 Elf64_External_Ehdr ehdr64
;
16627 /* If we have been compiled with sizeof (bfd_vma) == 4, then
16628 we will not be able to cope with the 64bit data found in
16629 64 ELF files. Detect this now and abort before we start
16630 overwriting things. */
16631 if (sizeof (bfd_vma
) < 8)
16633 error (_("This instance of readelf has been built without support for a\n\
16634 64 bit data type and so it cannot read 64 bit ELF files.\n"));
16638 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
16641 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
16642 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
16643 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
16644 elf_header
.e_entry
= BYTE_GET (ehdr64
.e_entry
);
16645 elf_header
.e_phoff
= BYTE_GET (ehdr64
.e_phoff
);
16646 elf_header
.e_shoff
= BYTE_GET (ehdr64
.e_shoff
);
16647 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
16648 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
16649 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
16650 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
16651 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
16652 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
16653 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
16656 if (elf_header
.e_shoff
)
16658 /* There may be some extensions in the first section header. Don't
16659 bomb if we can't read it. */
16661 get_32bit_section_headers (file
, TRUE
);
16663 get_64bit_section_headers (file
, TRUE
);
16669 /* Process one ELF object file according to the command line options.
16670 This file may actually be stored in an archive. The file is
16671 positioned at the start of the ELF object. */
16674 process_object (char * file_name
, FILE * file
)
16678 if (! get_file_header (file
))
16680 error (_("%s: Failed to read file header\n"), file_name
);
16684 /* Initialise per file variables. */
16685 for (i
= ARRAY_SIZE (version_info
); i
--;)
16686 version_info
[i
] = 0;
16688 for (i
= ARRAY_SIZE (dynamic_info
); i
--;)
16689 dynamic_info
[i
] = 0;
16690 dynamic_info_DT_GNU_HASH
= 0;
16692 /* Process the file. */
16694 printf (_("\nFile: %s\n"), file_name
);
16696 /* Initialise the dump_sects array from the cmdline_dump_sects array.
16697 Note we do this even if cmdline_dump_sects is empty because we
16698 must make sure that the dump_sets array is zeroed out before each
16699 object file is processed. */
16700 if (num_dump_sects
> num_cmdline_dump_sects
)
16701 memset (dump_sects
, 0, num_dump_sects
* sizeof (* dump_sects
));
16703 if (num_cmdline_dump_sects
> 0)
16705 if (num_dump_sects
== 0)
16706 /* A sneaky way of allocating the dump_sects array. */
16707 request_dump_bynumber (num_cmdline_dump_sects
, 0);
16709 assert (num_dump_sects
>= num_cmdline_dump_sects
);
16710 memcpy (dump_sects
, cmdline_dump_sects
,
16711 num_cmdline_dump_sects
* sizeof (* dump_sects
));
16714 if (! process_file_header ())
16717 if (! process_section_headers (file
))
16719 /* Without loaded section headers we cannot process lots of
16721 do_unwind
= do_version
= do_dump
= do_arch
= 0;
16723 if (! do_using_dynamic
)
16724 do_syms
= do_dyn_syms
= do_reloc
= 0;
16727 if (! process_section_groups (file
))
16729 /* Without loaded section groups we cannot process unwind. */
16733 if (process_program_headers (file
))
16734 process_dynamic_section (file
);
16736 process_relocs (file
);
16738 process_unwind (file
);
16740 process_symbol_table (file
);
16742 process_syminfo (file
);
16744 process_version_sections (file
);
16746 process_section_contents (file
);
16748 process_notes (file
);
16750 process_gnu_liblist (file
);
16752 process_arch_specific (file
);
16754 if (program_headers
)
16756 free (program_headers
);
16757 program_headers
= NULL
;
16760 if (section_headers
)
16762 free (section_headers
);
16763 section_headers
= NULL
;
16768 free (string_table
);
16769 string_table
= NULL
;
16770 string_table_length
= 0;
16773 if (dynamic_strings
)
16775 free (dynamic_strings
);
16776 dynamic_strings
= NULL
;
16777 dynamic_strings_length
= 0;
16780 if (dynamic_symbols
)
16782 free (dynamic_symbols
);
16783 dynamic_symbols
= NULL
;
16784 num_dynamic_syms
= 0;
16787 if (dynamic_syminfo
)
16789 free (dynamic_syminfo
);
16790 dynamic_syminfo
= NULL
;
16793 if (dynamic_section
)
16795 free (dynamic_section
);
16796 dynamic_section
= NULL
;
16799 if (section_headers_groups
)
16801 free (section_headers_groups
);
16802 section_headers_groups
= NULL
;
16805 if (section_groups
)
16807 struct group_list
* g
;
16808 struct group_list
* next
;
16810 for (i
= 0; i
< group_count
; i
++)
16812 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
16819 free (section_groups
);
16820 section_groups
= NULL
;
16823 free_debug_memory ();
16828 /* Process an ELF archive.
16829 On entry the file is positioned just after the ARMAG string. */
16832 process_archive (char * file_name
, FILE * file
, bfd_boolean is_thin_archive
)
16834 struct archive_info arch
;
16835 struct archive_info nested_arch
;
16841 /* The ARCH structure is used to hold information about this archive. */
16842 arch
.file_name
= NULL
;
16844 arch
.index_array
= NULL
;
16845 arch
.sym_table
= NULL
;
16846 arch
.longnames
= NULL
;
16848 /* The NESTED_ARCH structure is used as a single-item cache of information
16849 about a nested archive (when members of a thin archive reside within
16850 another regular archive file). */
16851 nested_arch
.file_name
= NULL
;
16852 nested_arch
.file
= NULL
;
16853 nested_arch
.index_array
= NULL
;
16854 nested_arch
.sym_table
= NULL
;
16855 nested_arch
.longnames
= NULL
;
16857 if (setup_archive (&arch
, file_name
, file
, is_thin_archive
, do_archive_index
) != 0)
16863 if (do_archive_index
)
16865 if (arch
.sym_table
== NULL
)
16866 error (_("%s: unable to dump the index as none was found\n"), file_name
);
16869 unsigned long i
, l
;
16870 unsigned long current_pos
;
16872 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
16873 file_name
, (unsigned long) arch
.index_num
, arch
.sym_size
);
16874 current_pos
= ftell (file
);
16876 for (i
= l
= 0; i
< arch
.index_num
; i
++)
16878 if ((i
== 0) || ((i
> 0) && (arch
.index_array
[i
] != arch
.index_array
[i
- 1])))
16880 char * member_name
;
16882 member_name
= get_archive_member_name_at (&arch
, arch
.index_array
[i
], &nested_arch
);
16884 if (member_name
!= NULL
)
16886 char * qualified_name
= make_qualified_name (&arch
, &nested_arch
, member_name
);
16888 if (qualified_name
!= NULL
)
16890 printf (_("Contents of binary %s at offset "), qualified_name
);
16891 (void) print_vma (arch
.index_array
[i
], PREFIX_HEX
);
16893 free (qualified_name
);
16898 if (l
>= arch
.sym_size
)
16900 error (_("%s: end of the symbol table reached before the end of the index\n"),
16904 /* PR 17531: file: 0b6630b2. */
16905 printf ("\t%.*s\n", (int) (arch
.sym_size
- l
), arch
.sym_table
+ l
);
16906 l
+= strnlen (arch
.sym_table
+ l
, arch
.sym_size
- l
) + 1;
16909 if (arch
.uses_64bit_indicies
)
16914 if (l
< arch
.sym_size
)
16915 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
16916 file_name
, arch
.sym_size
- l
);
16918 if (fseek (file
, current_pos
, SEEK_SET
) != 0)
16920 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name
);
16926 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
16927 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
16928 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
16929 && !do_section_groups
&& !do_dyn_syms
)
16931 ret
= 0; /* Archive index only. */
16942 char * qualified_name
;
16944 /* Read the next archive header. */
16945 if (fseek (file
, arch
.next_arhdr_offset
, SEEK_SET
) != 0)
16947 error (_("%s: failed to seek to next archive header\n"), file_name
);
16950 got
= fread (&arch
.arhdr
, 1, sizeof arch
.arhdr
, file
);
16951 if (got
!= sizeof arch
.arhdr
)
16955 error (_("%s: failed to read archive header\n"), file_name
);
16959 if (memcmp (arch
.arhdr
.ar_fmag
, ARFMAG
, 2) != 0)
16961 error (_("%s: did not find a valid archive header\n"), arch
.file_name
);
16966 arch
.next_arhdr_offset
+= sizeof arch
.arhdr
;
16968 archive_file_size
= strtoul (arch
.arhdr
.ar_size
, NULL
, 10);
16969 if (archive_file_size
& 01)
16970 ++archive_file_size
;
16972 name
= get_archive_member_name (&arch
, &nested_arch
);
16975 error (_("%s: bad archive file name\n"), file_name
);
16979 namelen
= strlen (name
);
16981 qualified_name
= make_qualified_name (&arch
, &nested_arch
, name
);
16982 if (qualified_name
== NULL
)
16984 error (_("%s: bad archive file name\n"), file_name
);
16989 if (is_thin_archive
&& arch
.nested_member_origin
== 0)
16991 /* This is a proxy for an external member of a thin archive. */
16992 FILE * member_file
;
16993 char * member_file_name
= adjust_relative_path (file_name
, name
, namelen
);
16994 if (member_file_name
== NULL
)
17000 member_file
= fopen (member_file_name
, "rb");
17001 if (member_file
== NULL
)
17003 error (_("Input file '%s' is not readable.\n"), member_file_name
);
17004 free (member_file_name
);
17009 archive_file_offset
= arch
.nested_member_origin
;
17011 ret
|= process_object (qualified_name
, member_file
);
17013 fclose (member_file
);
17014 free (member_file_name
);
17016 else if (is_thin_archive
)
17018 /* PR 15140: Allow for corrupt thin archives. */
17019 if (nested_arch
.file
== NULL
)
17021 error (_("%s: contains corrupt thin archive: %s\n"),
17027 /* This is a proxy for a member of a nested archive. */
17028 archive_file_offset
= arch
.nested_member_origin
+ sizeof arch
.arhdr
;
17030 /* The nested archive file will have been opened and setup by
17031 get_archive_member_name. */
17032 if (fseek (nested_arch
.file
, archive_file_offset
, SEEK_SET
) != 0)
17034 error (_("%s: failed to seek to archive member.\n"), nested_arch
.file_name
);
17039 ret
|= process_object (qualified_name
, nested_arch
.file
);
17043 archive_file_offset
= arch
.next_arhdr_offset
;
17044 arch
.next_arhdr_offset
+= archive_file_size
;
17046 ret
|= process_object (qualified_name
, file
);
17049 if (dump_sects
!= NULL
)
17053 num_dump_sects
= 0;
17056 free (qualified_name
);
17060 if (nested_arch
.file
!= NULL
)
17061 fclose (nested_arch
.file
);
17062 release_archive (&nested_arch
);
17063 release_archive (&arch
);
17069 process_file (char * file_name
)
17072 struct stat statbuf
;
17073 char armag
[SARMAG
];
17076 if (stat (file_name
, &statbuf
) < 0)
17078 if (errno
== ENOENT
)
17079 error (_("'%s': No such file\n"), file_name
);
17081 error (_("Could not locate '%s'. System error message: %s\n"),
17082 file_name
, strerror (errno
));
17086 if (! S_ISREG (statbuf
.st_mode
))
17088 error (_("'%s' is not an ordinary file\n"), file_name
);
17092 file
= fopen (file_name
, "rb");
17095 error (_("Input file '%s' is not readable.\n"), file_name
);
17099 if (fread (armag
, SARMAG
, 1, file
) != 1)
17101 error (_("%s: Failed to read file's magic number\n"), file_name
);
17106 current_file_size
= (bfd_size_type
) statbuf
.st_size
;
17108 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
17109 ret
= process_archive (file_name
, file
, FALSE
);
17110 else if (memcmp (armag
, ARMAGT
, SARMAG
) == 0)
17111 ret
= process_archive (file_name
, file
, TRUE
);
17114 if (do_archive_index
)
17115 error (_("File %s is not an archive so its index cannot be displayed.\n"),
17119 archive_file_size
= archive_file_offset
= 0;
17120 ret
= process_object (file_name
, file
);
17125 current_file_size
= 0;
17129 #ifdef SUPPORT_DISASSEMBLY
17130 /* Needed by the i386 disassembler. For extra credit, someone could
17131 fix this so that we insert symbolic addresses here, esp for GOT/PLT
17135 print_address (unsigned int addr
, FILE * outfile
)
17137 fprintf (outfile
,"0x%8.8x", addr
);
17140 /* Needed by the i386 disassembler. */
17142 db_task_printsym (unsigned int addr
)
17144 print_address (addr
, stderr
);
17149 main (int argc
, char ** argv
)
17153 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
17154 setlocale (LC_MESSAGES
, "");
17156 #if defined (HAVE_SETLOCALE)
17157 setlocale (LC_CTYPE
, "");
17159 bindtextdomain (PACKAGE
, LOCALEDIR
);
17160 textdomain (PACKAGE
);
17162 expandargv (&argc
, &argv
);
17164 parse_args (argc
, argv
);
17166 if (num_dump_sects
> 0)
17168 /* Make a copy of the dump_sects array. */
17169 cmdline_dump_sects
= (dump_type
*)
17170 malloc (num_dump_sects
* sizeof (* dump_sects
));
17171 if (cmdline_dump_sects
== NULL
)
17172 error (_("Out of memory allocating dump request table.\n"));
17175 memcpy (cmdline_dump_sects
, dump_sects
,
17176 num_dump_sects
* sizeof (* dump_sects
));
17177 num_cmdline_dump_sects
= num_dump_sects
;
17181 if (optind
< (argc
- 1))
17183 else if (optind
>= argc
)
17185 warn (_("Nothing to do.\n"));
17190 while (optind
< argc
)
17191 err
|= process_file (argv
[optind
++]);
17193 if (dump_sects
!= NULL
)
17195 if (cmdline_dump_sects
!= NULL
)
17196 free (cmdline_dump_sects
);