1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998-2016 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
24 /* The difference between readelf and objdump:
26 Both programs are capable of displaying the contents of ELF format files,
27 so why does the binutils project have two file dumpers ?
29 The reason is that objdump sees an ELF file through a BFD filter of the
30 world; if BFD has a bug where, say, it disagrees about a machine constant
31 in e_flags, then the odds are good that it will remain internally
32 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
33 GAS sees it the BFD way. There was need for a tool to go find out what
34 the file actually says.
36 This is why the readelf program does not link against the BFD library - it
37 exists as an independent program to help verify the correct working of BFD.
39 There is also the case that readelf can provide more information about an
40 ELF file than is provided by objdump. In particular it can display DWARF
41 debugging information which (at the moment) objdump cannot. */
52 /* Define BFD64 here, even if our default architecture is 32 bit ELF
53 as this will allow us to read in and parse 64bit and 32bit ELF files.
54 Only do this if we believe that the compiler can support a 64 bit
55 data type. For now we only rely on GCC being able to do this. */
64 #include "elf/common.h"
65 #include "elf/external.h"
66 #include "elf/internal.h"
69 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
70 we can obtain the H8 reloc numbers. We need these for the
71 get_reloc_size() function. We include h8.h again after defining
72 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
77 /* Undo the effects of #including reloc-macros.h. */
79 #undef START_RELOC_NUMBERS
83 #undef END_RELOC_NUMBERS
84 #undef _RELOC_MACROS_H
86 /* The following headers use the elf/reloc-macros.h file to
87 automatically generate relocation recognition functions
88 such as elf_mips_reloc_type() */
90 #define RELOC_MACROS_GEN_FUNC
92 #include "elf/aarch64.h"
93 #include "elf/alpha.h"
101 #include "elf/d10v.h"
102 #include "elf/d30v.h"
104 #include "elf/epiphany.h"
105 #include "elf/fr30.h"
107 #include "elf/ft32.h"
109 #include "elf/hppa.h"
110 #include "elf/i386.h"
111 #include "elf/i370.h"
112 #include "elf/i860.h"
113 #include "elf/i960.h"
114 #include "elf/ia64.h"
115 #include "elf/ip2k.h"
116 #include "elf/lm32.h"
117 #include "elf/iq2000.h"
118 #include "elf/m32c.h"
119 #include "elf/m32r.h"
120 #include "elf/m68k.h"
121 #include "elf/m68hc11.h"
122 #include "elf/mcore.h"
124 #include "elf/metag.h"
125 #include "elf/microblaze.h"
126 #include "elf/mips.h"
127 #include "elf/mmix.h"
128 #include "elf/mn10200.h"
129 #include "elf/mn10300.h"
130 #include "elf/moxie.h"
132 #include "elf/msp430.h"
133 #include "elf/nds32.h"
134 #include "elf/nios2.h"
135 #include "elf/or1k.h"
138 #include "elf/ppc64.h"
139 #include "elf/rl78.h"
141 #include "elf/s390.h"
142 #include "elf/score.h"
144 #include "elf/sparc.h"
146 #include "elf/tic6x.h"
147 #include "elf/tilegx.h"
148 #include "elf/tilepro.h"
149 #include "elf/v850.h"
151 #include "elf/visium.h"
152 #include "elf/x86-64.h"
153 #include "elf/xc16x.h"
154 #include "elf/xgate.h"
155 #include "elf/xstormy16.h"
156 #include "elf/xtensa.h"
159 #include "libiberty.h"
160 #include "safe-ctype.h"
161 #include "filenames.h"
164 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
167 typedef struct elf_section_list
169 Elf_Internal_Shdr
* hdr
;
170 struct elf_section_list
* next
;
173 char * program_name
= "readelf";
174 static unsigned long archive_file_offset
;
175 static unsigned long archive_file_size
;
176 static bfd_size_type current_file_size
;
177 static unsigned long dynamic_addr
;
178 static bfd_size_type dynamic_size
;
179 static size_t dynamic_nent
;
180 static char * dynamic_strings
;
181 static unsigned long dynamic_strings_length
;
182 static char * string_table
;
183 static unsigned long string_table_length
;
184 static unsigned long num_dynamic_syms
;
185 static Elf_Internal_Sym
* dynamic_symbols
;
186 static Elf_Internal_Syminfo
* dynamic_syminfo
;
187 static unsigned long dynamic_syminfo_offset
;
188 static unsigned int dynamic_syminfo_nent
;
189 static char program_interpreter
[PATH_MAX
];
190 static bfd_vma dynamic_info
[DT_ENCODING
];
191 static bfd_vma dynamic_info_DT_GNU_HASH
;
192 static bfd_vma version_info
[16];
193 static Elf_Internal_Ehdr elf_header
;
194 static Elf_Internal_Shdr
* section_headers
;
195 static Elf_Internal_Phdr
* program_headers
;
196 static Elf_Internal_Dyn
* dynamic_section
;
197 static elf_section_list
* symtab_shndx_list
;
198 static int show_name
;
199 static int do_dynamic
;
201 static int do_dyn_syms
;
203 static int do_sections
;
204 static int do_section_groups
;
205 static int do_section_details
;
206 static int do_segments
;
207 static int do_unwind
;
208 static int do_using_dynamic
;
209 static int do_header
;
211 static int do_version
;
212 static int do_histogram
;
213 static int do_debugging
;
216 static int do_archive_index
;
217 static int is_32bit_elf
;
218 static int decompress_dumps
;
222 struct group_list
* next
;
223 unsigned int section_index
;
228 struct group_list
* root
;
229 unsigned int group_index
;
232 static size_t group_count
;
233 static struct group
* section_groups
;
234 static struct group
** section_headers_groups
;
237 /* Flag bits indicating particular types of dump. */
238 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
239 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
240 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
241 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
242 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
244 typedef unsigned char dump_type
;
246 /* A linked list of the section names for which dumps were requested. */
247 struct dump_list_entry
251 struct dump_list_entry
* next
;
253 static struct dump_list_entry
* dump_sects_byname
;
255 /* A dynamic array of flags indicating for which sections a dump
256 has been requested via command line switches. */
257 static dump_type
* cmdline_dump_sects
= NULL
;
258 static unsigned int num_cmdline_dump_sects
= 0;
260 /* A dynamic array of flags indicating for which sections a dump of
261 some kind has been requested. It is reset on a per-object file
262 basis and then initialised from the cmdline_dump_sects array,
263 the results of interpreting the -w switch, and the
264 dump_sects_byname list. */
265 static dump_type
* dump_sects
= NULL
;
266 static unsigned int num_dump_sects
= 0;
269 /* How to print a vma value. */
270 typedef enum print_mode
282 /* Versioned symbol info. */
283 enum versioned_symbol_info
290 static const char *get_symbol_version_string
291 (FILE *file
, int is_dynsym
, const char *strtab
,
292 unsigned long int strtab_size
, unsigned int si
,
293 Elf_Internal_Sym
*psym
, enum versioned_symbol_info
*sym_info
,
294 unsigned short *vna_other
);
298 #define SECTION_NAME(X) \
299 ((X) == NULL ? _("<none>") \
300 : string_table == NULL ? _("<no-name>") \
301 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
302 : string_table + (X)->sh_name))
304 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
306 #define GET_ELF_SYMBOLS(file, section, sym_count) \
307 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
308 : get_64bit_elf_symbols (file, section, sym_count))
310 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
311 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
312 already been called and verified that the string exists. */
313 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
315 #define REMOVE_ARCH_BITS(ADDR) \
318 if (elf_header.e_machine == EM_ARM) \
323 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
324 the offset of the current archive member, if we are examining an archive.
325 Put the retrieved data into VAR, if it is not NULL. Otherwise allocate a buffer
326 using malloc and fill that. In either case return the pointer to the start of
327 the retrieved data or NULL if something went wrong. If something does go wrong
328 and REASON is not NULL then emit an error message using REASON as part of the
332 get_data (void * var
, FILE * file
, unsigned long offset
, bfd_size_type size
,
333 bfd_size_type nmemb
, const char * reason
)
336 bfd_size_type amt
= size
* nmemb
;
338 if (size
== 0 || nmemb
== 0)
341 /* If the size_t type is smaller than the bfd_size_type, eg because
342 you are building a 32-bit tool on a 64-bit host, then make sure
343 that when the sizes are cast to (size_t) no information is lost. */
344 if (sizeof (size_t) < sizeof (bfd_size_type
)
345 && ( (bfd_size_type
) ((size_t) size
) != size
346 || (bfd_size_type
) ((size_t) nmemb
) != nmemb
))
349 error (_("Size truncation prevents reading 0x%" BFD_VMA_FMT
"x"
350 " elements of size 0x%" BFD_VMA_FMT
"x for %s\n"),
351 nmemb
, size
, reason
);
355 /* Check for size overflow. */
359 error (_("Size overflow prevents reading 0x%" BFD_VMA_FMT
"x"
360 " elements of size 0x%" BFD_VMA_FMT
"x for %s\n"),
361 nmemb
, size
, reason
);
365 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
366 attempting to allocate memory when the read is bound to fail. */
367 if (amt
> current_file_size
368 || offset
+ archive_file_offset
+ amt
> current_file_size
)
371 error (_("Reading 0x%" BFD_VMA_FMT
"x"
372 " bytes extends past end of file for %s\n"),
377 if (fseek (file
, archive_file_offset
+ offset
, SEEK_SET
))
380 error (_("Unable to seek to 0x%lx for %s\n"),
381 archive_file_offset
+ offset
, reason
);
388 /* Check for overflow. */
389 if (nmemb
< (~(bfd_size_type
) 0 - 1) / size
)
390 /* + 1 so that we can '\0' terminate invalid string table sections. */
391 mvar
= malloc ((size_t) amt
+ 1);
396 error (_("Out of memory allocating 0x%" BFD_VMA_FMT
"x"
402 ((char *) mvar
)[amt
] = '\0';
405 if (fread (mvar
, (size_t) size
, (size_t) nmemb
, file
) != nmemb
)
408 error (_("Unable to read in 0x%" BFD_VMA_FMT
"x bytes of %s\n"),
418 /* Print a VMA value. */
421 print_vma (bfd_vma vma
, print_mode mode
)
434 return nc
+ printf ("%8.8" BFD_VMA_FMT
"x", vma
);
441 return printf ("%5" BFD_VMA_FMT
"d", vma
);
449 return nc
+ printf ("%" BFD_VMA_FMT
"x", vma
);
452 return printf ("%" BFD_VMA_FMT
"d", vma
);
455 return printf ("%" BFD_VMA_FMT
"u", vma
);
460 /* Display a symbol on stdout. Handles the display of control characters and
461 multibye characters (assuming the host environment supports them).
463 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
465 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
466 padding as necessary.
468 Returns the number of emitted characters. */
471 print_symbol (int width
, const char *symbol
)
473 bfd_boolean extra_padding
= FALSE
;
475 #ifdef HAVE_MBSTATE_T
482 /* Keep the width positive. This also helps. */
484 extra_padding
= TRUE
;
489 /* Set the remaining width to a very large value.
490 This simplifies the code below. */
491 width_remaining
= INT_MAX
;
493 width_remaining
= width
;
495 #ifdef HAVE_MBSTATE_T
496 /* Initialise the multibyte conversion state. */
497 memset (& state
, 0, sizeof (state
));
500 while (width_remaining
)
503 const char c
= *symbol
++;
508 /* Do not print control characters directly as they can affect terminal
509 settings. Such characters usually appear in the names generated
510 by the assembler for local labels. */
513 if (width_remaining
< 2)
516 printf ("^%c", c
+ 0x40);
517 width_remaining
-= 2;
520 else if (ISPRINT (c
))
528 #ifdef HAVE_MBSTATE_T
531 /* Let printf do the hard work of displaying multibyte characters. */
532 printf ("%.1s", symbol
- 1);
536 #ifdef HAVE_MBSTATE_T
537 /* Try to find out how many bytes made up the character that was
538 just printed. Advance the symbol pointer past the bytes that
540 n
= mbrtowc (& w
, symbol
- 1, MB_CUR_MAX
, & state
);
544 if (n
!= (size_t) -1 && n
!= (size_t) -2 && n
> 0)
549 if (extra_padding
&& num_printed
< width
)
551 /* Fill in the remaining spaces. */
552 printf ("%-*s", width
- num_printed
, " ");
559 /* Returns a pointer to a static buffer containing a printable version of
560 the given section's name. Like print_symbol, except that it does not try
561 to print multibyte characters, it just interprets them as hex values. */
564 printable_section_name (const Elf_Internal_Shdr
* sec
)
566 #define MAX_PRINT_SEC_NAME_LEN 128
567 static char sec_name_buf
[MAX_PRINT_SEC_NAME_LEN
+ 1];
568 const char * name
= SECTION_NAME (sec
);
569 char * buf
= sec_name_buf
;
571 unsigned int remaining
= MAX_PRINT_SEC_NAME_LEN
;
573 while ((c
= * name
++) != 0)
584 else if (ISPRINT (c
))
591 static char hex
[17] = "0123456789ABCDEF";
596 * buf
++ = hex
[(c
& 0xf0) >> 4];
597 * buf
++ = hex
[c
& 0x0f];
611 printable_section_name_from_index (unsigned long ndx
)
613 if (ndx
>= elf_header
.e_shnum
)
614 return _("<corrupt>");
616 return printable_section_name (section_headers
+ ndx
);
619 /* Return a pointer to section NAME, or NULL if no such section exists. */
621 static Elf_Internal_Shdr
*
622 find_section (const char * name
)
626 for (i
= 0; i
< elf_header
.e_shnum
; i
++)
627 if (streq (SECTION_NAME (section_headers
+ i
), name
))
628 return section_headers
+ i
;
633 /* Return a pointer to a section containing ADDR, or NULL if no such
636 static Elf_Internal_Shdr
*
637 find_section_by_address (bfd_vma addr
)
641 for (i
= 0; i
< elf_header
.e_shnum
; i
++)
643 Elf_Internal_Shdr
*sec
= section_headers
+ i
;
644 if (addr
>= sec
->sh_addr
&& addr
< sec
->sh_addr
+ sec
->sh_size
)
651 static Elf_Internal_Shdr
*
652 find_section_by_type (unsigned int type
)
656 for (i
= 0; i
< elf_header
.e_shnum
; i
++)
658 Elf_Internal_Shdr
*sec
= section_headers
+ i
;
659 if (sec
->sh_type
== type
)
666 /* Return a pointer to section NAME, or NULL if no such section exists,
667 restricted to the list of sections given in SET. */
669 static Elf_Internal_Shdr
*
670 find_section_in_set (const char * name
, unsigned int * set
)
676 while ((i
= *set
++) > 0)
677 if (streq (SECTION_NAME (section_headers
+ i
), name
))
678 return section_headers
+ i
;
681 return find_section (name
);
684 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
687 static inline unsigned long
688 read_uleb128 (unsigned char *data
,
689 unsigned int *length_return
,
690 const unsigned char * const end
)
692 return read_leb128 (data
, length_return
, FALSE
, end
);
695 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
696 This OS has so many departures from the ELF standard that we test it at
702 return elf_header
.e_machine
== EM_IA_64
703 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_OPENVMS
;
706 /* Guess the relocation size commonly used by the specific machines. */
709 guess_is_rela (unsigned int e_machine
)
713 /* Targets that use REL relocations. */
728 /* Targets that use RELA relocations. */
732 case EM_ADAPTEVA_EPIPHANY
:
734 case EM_ALTERA_NIOS2
:
737 case EM_ARC_COMPACT2
:
757 case EM_LATTICEMICO32
:
766 case EM_CYGNUS_MN10200
:
768 case EM_CYGNUS_MN10300
:
802 case EM_MICROBLAZE_OLD
:
823 warn (_("Don't know about relocations on this machine architecture\n"));
829 slurp_rela_relocs (FILE * file
,
830 unsigned long rel_offset
,
831 unsigned long rel_size
,
832 Elf_Internal_Rela
** relasp
,
833 unsigned long * nrelasp
)
835 Elf_Internal_Rela
* relas
;
841 Elf32_External_Rela
* erelas
;
843 erelas
= (Elf32_External_Rela
*) get_data (NULL
, file
, rel_offset
, 1,
844 rel_size
, _("32-bit relocation data"));
848 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
850 relas
= (Elf_Internal_Rela
*) cmalloc (nrelas
,
851 sizeof (Elf_Internal_Rela
));
856 error (_("out of memory parsing relocs\n"));
860 for (i
= 0; i
< nrelas
; i
++)
862 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
863 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
864 relas
[i
].r_addend
= BYTE_GET_SIGNED (erelas
[i
].r_addend
);
871 Elf64_External_Rela
* erelas
;
873 erelas
= (Elf64_External_Rela
*) get_data (NULL
, file
, rel_offset
, 1,
874 rel_size
, _("64-bit relocation data"));
878 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
880 relas
= (Elf_Internal_Rela
*) cmalloc (nrelas
,
881 sizeof (Elf_Internal_Rela
));
886 error (_("out of memory parsing relocs\n"));
890 for (i
= 0; i
< nrelas
; i
++)
892 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
893 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
894 relas
[i
].r_addend
= BYTE_GET_SIGNED (erelas
[i
].r_addend
);
896 /* The #ifdef BFD64 below is to prevent a compile time
897 warning. We know that if we do not have a 64 bit data
898 type that we will never execute this code anyway. */
900 if (elf_header
.e_machine
== EM_MIPS
901 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
903 /* In little-endian objects, r_info isn't really a
904 64-bit little-endian value: it has a 32-bit
905 little-endian symbol index followed by four
906 individual byte fields. Reorder INFO
908 bfd_vma inf
= relas
[i
].r_info
;
909 inf
= (((inf
& 0xffffffff) << 32)
910 | ((inf
>> 56) & 0xff)
911 | ((inf
>> 40) & 0xff00)
912 | ((inf
>> 24) & 0xff0000)
913 | ((inf
>> 8) & 0xff000000));
914 relas
[i
].r_info
= inf
;
927 slurp_rel_relocs (FILE * file
,
928 unsigned long rel_offset
,
929 unsigned long rel_size
,
930 Elf_Internal_Rela
** relsp
,
931 unsigned long * nrelsp
)
933 Elf_Internal_Rela
* rels
;
939 Elf32_External_Rel
* erels
;
941 erels
= (Elf32_External_Rel
*) get_data (NULL
, file
, rel_offset
, 1,
942 rel_size
, _("32-bit relocation data"));
946 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
948 rels
= (Elf_Internal_Rela
*) cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
953 error (_("out of memory parsing relocs\n"));
957 for (i
= 0; i
< nrels
; i
++)
959 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
960 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
961 rels
[i
].r_addend
= 0;
968 Elf64_External_Rel
* erels
;
970 erels
= (Elf64_External_Rel
*) get_data (NULL
, file
, rel_offset
, 1,
971 rel_size
, _("64-bit relocation data"));
975 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
977 rels
= (Elf_Internal_Rela
*) cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
982 error (_("out of memory parsing relocs\n"));
986 for (i
= 0; i
< nrels
; i
++)
988 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
989 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
990 rels
[i
].r_addend
= 0;
992 /* The #ifdef BFD64 below is to prevent a compile time
993 warning. We know that if we do not have a 64 bit data
994 type that we will never execute this code anyway. */
996 if (elf_header
.e_machine
== EM_MIPS
997 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
999 /* In little-endian objects, r_info isn't really a
1000 64-bit little-endian value: it has a 32-bit
1001 little-endian symbol index followed by four
1002 individual byte fields. Reorder INFO
1004 bfd_vma inf
= rels
[i
].r_info
;
1005 inf
= (((inf
& 0xffffffff) << 32)
1006 | ((inf
>> 56) & 0xff)
1007 | ((inf
>> 40) & 0xff00)
1008 | ((inf
>> 24) & 0xff0000)
1009 | ((inf
>> 8) & 0xff000000));
1010 rels
[i
].r_info
= inf
;
1022 /* Returns the reloc type extracted from the reloc info field. */
1025 get_reloc_type (bfd_vma reloc_info
)
1028 return ELF32_R_TYPE (reloc_info
);
1030 switch (elf_header
.e_machine
)
1033 /* Note: We assume that reloc_info has already been adjusted for us. */
1034 return ELF64_MIPS_R_TYPE (reloc_info
);
1037 return ELF64_R_TYPE_ID (reloc_info
);
1040 return ELF64_R_TYPE (reloc_info
);
1044 /* Return the symbol index extracted from the reloc info field. */
1047 get_reloc_symindex (bfd_vma reloc_info
)
1049 return is_32bit_elf
? ELF32_R_SYM (reloc_info
) : ELF64_R_SYM (reloc_info
);
1052 static inline bfd_boolean
1053 uses_msp430x_relocs (void)
1056 elf_header
.e_machine
== EM_MSP430
/* Paranoia. */
1057 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1058 && (((elf_header
.e_flags
& EF_MSP430_MACH
) == E_MSP430_MACH_MSP430X
)
1059 /* TI compiler uses ELFOSABI_NONE. */
1060 || (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_NONE
));
1063 /* Display the contents of the relocation data found at the specified
1067 dump_relocations (FILE * file
,
1068 unsigned long rel_offset
,
1069 unsigned long rel_size
,
1070 Elf_Internal_Sym
* symtab
,
1071 unsigned long nsyms
,
1073 unsigned long strtablen
,
1078 Elf_Internal_Rela
* rels
;
1080 if (is_rela
== UNKNOWN
)
1081 is_rela
= guess_is_rela (elf_header
.e_machine
);
1085 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
1090 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
1099 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1101 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1106 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1108 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1116 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
1118 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1123 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1125 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1129 for (i
= 0; i
< rel_size
; i
++)
1134 bfd_vma symtab_index
;
1137 offset
= rels
[i
].r_offset
;
1138 inf
= rels
[i
].r_info
;
1140 type
= get_reloc_type (inf
);
1141 symtab_index
= get_reloc_symindex (inf
);
1145 printf ("%8.8lx %8.8lx ",
1146 (unsigned long) offset
& 0xffffffff,
1147 (unsigned long) inf
& 0xffffffff);
1151 #if BFD_HOST_64BIT_LONG
1153 ? "%16.16lx %16.16lx "
1154 : "%12.12lx %12.12lx ",
1156 #elif BFD_HOST_64BIT_LONG_LONG
1159 ? "%16.16llx %16.16llx "
1160 : "%12.12llx %12.12llx ",
1164 ? "%16.16I64x %16.16I64x "
1165 : "%12.12I64x %12.12I64x ",
1170 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1171 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1172 _bfd_int64_high (offset
),
1173 _bfd_int64_low (offset
),
1174 _bfd_int64_high (inf
),
1175 _bfd_int64_low (inf
));
1179 switch (elf_header
.e_machine
)
1186 rtype
= elf_aarch64_reloc_type (type
);
1190 case EM_CYGNUS_M32R
:
1191 rtype
= elf_m32r_reloc_type (type
);
1196 rtype
= elf_i386_reloc_type (type
);
1201 rtype
= elf_m68hc11_reloc_type (type
);
1205 rtype
= elf_m68k_reloc_type (type
);
1209 rtype
= elf_i960_reloc_type (type
);
1214 rtype
= elf_avr_reloc_type (type
);
1217 case EM_OLD_SPARCV9
:
1218 case EM_SPARC32PLUS
:
1221 rtype
= elf_sparc_reloc_type (type
);
1225 rtype
= elf_spu_reloc_type (type
);
1229 rtype
= v800_reloc_type (type
);
1232 case EM_CYGNUS_V850
:
1233 rtype
= v850_reloc_type (type
);
1237 case EM_CYGNUS_D10V
:
1238 rtype
= elf_d10v_reloc_type (type
);
1242 case EM_CYGNUS_D30V
:
1243 rtype
= elf_d30v_reloc_type (type
);
1247 rtype
= elf_dlx_reloc_type (type
);
1251 rtype
= elf_sh_reloc_type (type
);
1255 case EM_CYGNUS_MN10300
:
1256 rtype
= elf_mn10300_reloc_type (type
);
1260 case EM_CYGNUS_MN10200
:
1261 rtype
= elf_mn10200_reloc_type (type
);
1265 case EM_CYGNUS_FR30
:
1266 rtype
= elf_fr30_reloc_type (type
);
1270 rtype
= elf_frv_reloc_type (type
);
1274 rtype
= elf_ft32_reloc_type (type
);
1278 rtype
= elf_mcore_reloc_type (type
);
1282 rtype
= elf_mmix_reloc_type (type
);
1286 rtype
= elf_moxie_reloc_type (type
);
1290 if (uses_msp430x_relocs ())
1292 rtype
= elf_msp430x_reloc_type (type
);
1297 rtype
= elf_msp430_reloc_type (type
);
1301 rtype
= elf_nds32_reloc_type (type
);
1305 rtype
= elf_ppc_reloc_type (type
);
1309 rtype
= elf_ppc64_reloc_type (type
);
1313 case EM_MIPS_RS3_LE
:
1314 rtype
= elf_mips_reloc_type (type
);
1318 rtype
= elf_alpha_reloc_type (type
);
1322 rtype
= elf_arm_reloc_type (type
);
1326 case EM_ARC_COMPACT
:
1327 case EM_ARC_COMPACT2
:
1328 rtype
= elf_arc_reloc_type (type
);
1332 rtype
= elf_hppa_reloc_type (type
);
1338 rtype
= elf_h8_reloc_type (type
);
1342 rtype
= elf_or1k_reloc_type (type
);
1347 rtype
= elf_pj_reloc_type (type
);
1350 rtype
= elf_ia64_reloc_type (type
);
1354 rtype
= elf_cris_reloc_type (type
);
1358 rtype
= elf_i860_reloc_type (type
);
1364 rtype
= elf_x86_64_reloc_type (type
);
1368 rtype
= i370_reloc_type (type
);
1373 rtype
= elf_s390_reloc_type (type
);
1377 rtype
= elf_score_reloc_type (type
);
1381 rtype
= elf_xstormy16_reloc_type (type
);
1385 rtype
= elf_crx_reloc_type (type
);
1389 rtype
= elf_vax_reloc_type (type
);
1393 rtype
= elf_visium_reloc_type (type
);
1396 case EM_ADAPTEVA_EPIPHANY
:
1397 rtype
= elf_epiphany_reloc_type (type
);
1402 rtype
= elf_ip2k_reloc_type (type
);
1406 rtype
= elf_iq2000_reloc_type (type
);
1411 rtype
= elf_xtensa_reloc_type (type
);
1414 case EM_LATTICEMICO32
:
1415 rtype
= elf_lm32_reloc_type (type
);
1420 rtype
= elf_m32c_reloc_type (type
);
1424 rtype
= elf_mt_reloc_type (type
);
1428 rtype
= elf_bfin_reloc_type (type
);
1432 rtype
= elf_mep_reloc_type (type
);
1436 rtype
= elf_cr16_reloc_type (type
);
1440 case EM_MICROBLAZE_OLD
:
1441 rtype
= elf_microblaze_reloc_type (type
);
1445 rtype
= elf_rl78_reloc_type (type
);
1449 rtype
= elf_rx_reloc_type (type
);
1453 rtype
= elf_metag_reloc_type (type
);
1458 rtype
= elf_xc16x_reloc_type (type
);
1462 rtype
= elf_tic6x_reloc_type (type
);
1466 rtype
= elf_tilegx_reloc_type (type
);
1470 rtype
= elf_tilepro_reloc_type (type
);
1474 rtype
= elf_xgate_reloc_type (type
);
1477 case EM_ALTERA_NIOS2
:
1478 rtype
= elf_nios2_reloc_type (type
);
1483 printf (_("unrecognized: %-7lx"), (unsigned long) type
& 0xffffffff);
1485 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1487 if (elf_header
.e_machine
== EM_ALPHA
1489 && streq (rtype
, "R_ALPHA_LITUSE")
1492 switch (rels
[i
].r_addend
)
1494 case LITUSE_ALPHA_ADDR
: rtype
= "ADDR"; break;
1495 case LITUSE_ALPHA_BASE
: rtype
= "BASE"; break;
1496 case LITUSE_ALPHA_BYTOFF
: rtype
= "BYTOFF"; break;
1497 case LITUSE_ALPHA_JSR
: rtype
= "JSR"; break;
1498 case LITUSE_ALPHA_TLSGD
: rtype
= "TLSGD"; break;
1499 case LITUSE_ALPHA_TLSLDM
: rtype
= "TLSLDM"; break;
1500 case LITUSE_ALPHA_JSRDIRECT
: rtype
= "JSRDIRECT"; break;
1501 default: rtype
= NULL
;
1504 printf (" (%s)", rtype
);
1508 printf (_("<unknown addend: %lx>"),
1509 (unsigned long) rels
[i
].r_addend
);
1512 else if (symtab_index
)
1514 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1515 printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index
);
1518 Elf_Internal_Sym
* psym
;
1519 const char * version_string
;
1520 enum versioned_symbol_info sym_info
;
1521 unsigned short vna_other
;
1523 psym
= symtab
+ symtab_index
;
1526 = get_symbol_version_string (file
, is_dynsym
,
1535 if (ELF_ST_TYPE (psym
->st_info
) == STT_GNU_IFUNC
)
1539 unsigned int width
= is_32bit_elf
? 8 : 14;
1541 /* Relocations against GNU_IFUNC symbols do not use the value
1542 of the symbol as the address to relocate against. Instead
1543 they invoke the function named by the symbol and use its
1544 result as the address for relocation.
1546 To indicate this to the user, do not display the value of
1547 the symbol in the "Symbols's Value" field. Instead show
1548 its name followed by () as a hint that the symbol is
1552 || psym
->st_name
== 0
1553 || psym
->st_name
>= strtablen
)
1556 name
= strtab
+ psym
->st_name
;
1558 len
= print_symbol (width
, name
);
1560 printf (sym_info
== symbol_public
? "@@%s" : "@%s",
1562 printf ("()%-*s", len
<= width
? (width
+ 1) - len
: 1, " ");
1566 print_vma (psym
->st_value
, LONG_HEX
);
1568 printf (is_32bit_elf
? " " : " ");
1571 if (psym
->st_name
== 0)
1573 const char * sec_name
= "<null>";
1576 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1578 if (psym
->st_shndx
< elf_header
.e_shnum
)
1579 sec_name
= SECTION_NAME (section_headers
+ psym
->st_shndx
);
1580 else if (psym
->st_shndx
== SHN_ABS
)
1582 else if (psym
->st_shndx
== SHN_COMMON
)
1583 sec_name
= "COMMON";
1584 else if ((elf_header
.e_machine
== EM_MIPS
1585 && psym
->st_shndx
== SHN_MIPS_SCOMMON
)
1586 || (elf_header
.e_machine
== EM_TI_C6000
1587 && psym
->st_shndx
== SHN_TIC6X_SCOMMON
))
1588 sec_name
= "SCOMMON";
1589 else if (elf_header
.e_machine
== EM_MIPS
1590 && psym
->st_shndx
== SHN_MIPS_SUNDEFINED
)
1591 sec_name
= "SUNDEF";
1592 else if ((elf_header
.e_machine
== EM_X86_64
1593 || elf_header
.e_machine
== EM_L1OM
1594 || elf_header
.e_machine
== EM_K1OM
)
1595 && psym
->st_shndx
== SHN_X86_64_LCOMMON
)
1596 sec_name
= "LARGE_COMMON";
1597 else if (elf_header
.e_machine
== EM_IA_64
1598 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1599 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1600 sec_name
= "ANSI_COM";
1601 else if (is_ia64_vms ()
1602 && psym
->st_shndx
== SHN_IA_64_VMS_SYMVEC
)
1603 sec_name
= "VMS_SYMVEC";
1606 sprintf (name_buf
, "<section 0x%x>",
1607 (unsigned int) psym
->st_shndx
);
1608 sec_name
= name_buf
;
1611 print_symbol (22, sec_name
);
1613 else if (strtab
== NULL
)
1614 printf (_("<string table index: %3ld>"), psym
->st_name
);
1615 else if (psym
->st_name
>= strtablen
)
1616 printf (_("<corrupt string table index: %3ld>"), psym
->st_name
);
1619 print_symbol (22, strtab
+ psym
->st_name
);
1621 printf (sym_info
== symbol_public
? "@@%s" : "@%s",
1627 bfd_vma off
= rels
[i
].r_addend
;
1629 if ((bfd_signed_vma
) off
< 0)
1630 printf (" - %" BFD_VMA_FMT
"x", - off
);
1632 printf (" + %" BFD_VMA_FMT
"x", off
);
1638 bfd_vma off
= rels
[i
].r_addend
;
1640 printf ("%*c", is_32bit_elf
? 12 : 20, ' ');
1641 if ((bfd_signed_vma
) off
< 0)
1642 printf ("-%" BFD_VMA_FMT
"x", - off
);
1644 printf ("%" BFD_VMA_FMT
"x", off
);
1647 if (elf_header
.e_machine
== EM_SPARCV9
1649 && streq (rtype
, "R_SPARC_OLO10"))
1650 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf
));
1655 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1657 bfd_vma type2
= ELF64_MIPS_R_TYPE2 (inf
);
1658 bfd_vma type3
= ELF64_MIPS_R_TYPE3 (inf
);
1659 const char * rtype2
= elf_mips_reloc_type (type2
);
1660 const char * rtype3
= elf_mips_reloc_type (type3
);
1662 printf (" Type2: ");
1665 printf (_("unrecognized: %-7lx"),
1666 (unsigned long) type2
& 0xffffffff);
1668 printf ("%-17.17s", rtype2
);
1670 printf ("\n Type3: ");
1673 printf (_("unrecognized: %-7lx"),
1674 (unsigned long) type3
& 0xffffffff);
1676 printf ("%-17.17s", rtype3
);
1687 get_mips_dynamic_type (unsigned long type
)
1691 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1692 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1693 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1694 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1695 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1696 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1697 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1698 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1699 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1700 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1701 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1702 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1703 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1704 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1705 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1706 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1707 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1708 case DT_MIPS_RLD_MAP_REL
: return "MIPS_RLD_MAP_REL";
1709 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1710 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1711 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1712 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1713 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1714 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1715 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1716 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1717 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1718 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1719 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1720 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1721 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1722 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1723 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1724 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1725 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1726 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1727 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1728 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1729 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1730 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1731 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1732 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1733 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1734 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1735 case DT_MIPS_PLTGOT
: return "MIPS_PLTGOT";
1736 case DT_MIPS_RWPLT
: return "MIPS_RWPLT";
1743 get_sparc64_dynamic_type (unsigned long type
)
1747 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1754 get_ppc_dynamic_type (unsigned long type
)
1758 case DT_PPC_GOT
: return "PPC_GOT";
1759 case DT_PPC_OPT
: return "PPC_OPT";
1766 get_ppc64_dynamic_type (unsigned long type
)
1770 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1771 case DT_PPC64_OPD
: return "PPC64_OPD";
1772 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1773 case DT_PPC64_OPT
: return "PPC64_OPT";
1780 get_parisc_dynamic_type (unsigned long type
)
1784 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1785 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1786 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1787 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1788 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1789 case DT_HP_PREINIT
: return "HP_PREINIT";
1790 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1791 case DT_HP_NEEDED
: return "HP_NEEDED";
1792 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1793 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1794 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1795 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1796 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1797 case DT_HP_EPLTREL
: return "HP_GST_EPLTREL";
1798 case DT_HP_EPLTRELSZ
: return "HP_GST_EPLTRELSZ";
1799 case DT_HP_FILTERED
: return "HP_FILTERED";
1800 case DT_HP_FILTER_TLS
: return "HP_FILTER_TLS";
1801 case DT_HP_COMPAT_FILTERED
: return "HP_COMPAT_FILTERED";
1802 case DT_HP_LAZYLOAD
: return "HP_LAZYLOAD";
1803 case DT_HP_BIND_NOW_COUNT
: return "HP_BIND_NOW_COUNT";
1804 case DT_PLT
: return "PLT";
1805 case DT_PLT_SIZE
: return "PLT_SIZE";
1806 case DT_DLT
: return "DLT";
1807 case DT_DLT_SIZE
: return "DLT_SIZE";
1814 get_ia64_dynamic_type (unsigned long type
)
1818 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1819 case DT_IA_64_VMS_SUBTYPE
: return "VMS_SUBTYPE";
1820 case DT_IA_64_VMS_IMGIOCNT
: return "VMS_IMGIOCNT";
1821 case DT_IA_64_VMS_LNKFLAGS
: return "VMS_LNKFLAGS";
1822 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ
: return "VMS_VIR_MEM_BLK_SIZ";
1823 case DT_IA_64_VMS_IDENT
: return "VMS_IDENT";
1824 case DT_IA_64_VMS_NEEDED_IDENT
: return "VMS_NEEDED_IDENT";
1825 case DT_IA_64_VMS_IMG_RELA_CNT
: return "VMS_IMG_RELA_CNT";
1826 case DT_IA_64_VMS_SEG_RELA_CNT
: return "VMS_SEG_RELA_CNT";
1827 case DT_IA_64_VMS_FIXUP_RELA_CNT
: return "VMS_FIXUP_RELA_CNT";
1828 case DT_IA_64_VMS_FIXUP_NEEDED
: return "VMS_FIXUP_NEEDED";
1829 case DT_IA_64_VMS_SYMVEC_CNT
: return "VMS_SYMVEC_CNT";
1830 case DT_IA_64_VMS_XLATED
: return "VMS_XLATED";
1831 case DT_IA_64_VMS_STACKSIZE
: return "VMS_STACKSIZE";
1832 case DT_IA_64_VMS_UNWINDSZ
: return "VMS_UNWINDSZ";
1833 case DT_IA_64_VMS_UNWIND_CODSEG
: return "VMS_UNWIND_CODSEG";
1834 case DT_IA_64_VMS_UNWIND_INFOSEG
: return "VMS_UNWIND_INFOSEG";
1835 case DT_IA_64_VMS_LINKTIME
: return "VMS_LINKTIME";
1836 case DT_IA_64_VMS_SEG_NO
: return "VMS_SEG_NO";
1837 case DT_IA_64_VMS_SYMVEC_OFFSET
: return "VMS_SYMVEC_OFFSET";
1838 case DT_IA_64_VMS_SYMVEC_SEG
: return "VMS_SYMVEC_SEG";
1839 case DT_IA_64_VMS_UNWIND_OFFSET
: return "VMS_UNWIND_OFFSET";
1840 case DT_IA_64_VMS_UNWIND_SEG
: return "VMS_UNWIND_SEG";
1841 case DT_IA_64_VMS_STRTAB_OFFSET
: return "VMS_STRTAB_OFFSET";
1842 case DT_IA_64_VMS_SYSVER_OFFSET
: return "VMS_SYSVER_OFFSET";
1843 case DT_IA_64_VMS_IMG_RELA_OFF
: return "VMS_IMG_RELA_OFF";
1844 case DT_IA_64_VMS_SEG_RELA_OFF
: return "VMS_SEG_RELA_OFF";
1845 case DT_IA_64_VMS_FIXUP_RELA_OFF
: return "VMS_FIXUP_RELA_OFF";
1846 case DT_IA_64_VMS_PLTGOT_OFFSET
: return "VMS_PLTGOT_OFFSET";
1847 case DT_IA_64_VMS_PLTGOT_SEG
: return "VMS_PLTGOT_SEG";
1848 case DT_IA_64_VMS_FPMODE
: return "VMS_FPMODE";
1855 get_solaris_section_type (unsigned long type
)
1859 case 0x6fffffee: return "SUNW_ancillary";
1860 case 0x6fffffef: return "SUNW_capchain";
1861 case 0x6ffffff0: return "SUNW_capinfo";
1862 case 0x6ffffff1: return "SUNW_symsort";
1863 case 0x6ffffff2: return "SUNW_tlssort";
1864 case 0x6ffffff3: return "SUNW_LDYNSYM";
1865 case 0x6ffffff4: return "SUNW_dof";
1866 case 0x6ffffff5: return "SUNW_cap";
1867 case 0x6ffffff6: return "SUNW_SIGNATURE";
1868 case 0x6ffffff7: return "SUNW_ANNOTATE";
1869 case 0x6ffffff8: return "SUNW_DEBUGSTR";
1870 case 0x6ffffff9: return "SUNW_DEBUG";
1871 case 0x6ffffffa: return "SUNW_move";
1872 case 0x6ffffffb: return "SUNW_COMDAT";
1873 case 0x6ffffffc: return "SUNW_syminfo";
1874 case 0x6ffffffd: return "SUNW_verdef";
1875 case 0x6ffffffe: return "SUNW_verneed";
1876 case 0x6fffffff: return "SUNW_versym";
1877 case 0x70000000: return "SPARC_GOTDATA";
1878 default: return NULL
;
1883 get_alpha_dynamic_type (unsigned long type
)
1887 case DT_ALPHA_PLTRO
: return "ALPHA_PLTRO";
1894 get_score_dynamic_type (unsigned long type
)
1898 case DT_SCORE_BASE_ADDRESS
: return "SCORE_BASE_ADDRESS";
1899 case DT_SCORE_LOCAL_GOTNO
: return "SCORE_LOCAL_GOTNO";
1900 case DT_SCORE_SYMTABNO
: return "SCORE_SYMTABNO";
1901 case DT_SCORE_GOTSYM
: return "SCORE_GOTSYM";
1902 case DT_SCORE_UNREFEXTNO
: return "SCORE_UNREFEXTNO";
1903 case DT_SCORE_HIPAGENO
: return "SCORE_HIPAGENO";
1910 get_tic6x_dynamic_type (unsigned long type
)
1914 case DT_C6000_GSYM_OFFSET
: return "C6000_GSYM_OFFSET";
1915 case DT_C6000_GSTR_OFFSET
: return "C6000_GSTR_OFFSET";
1916 case DT_C6000_DSBT_BASE
: return "C6000_DSBT_BASE";
1917 case DT_C6000_DSBT_SIZE
: return "C6000_DSBT_SIZE";
1918 case DT_C6000_PREEMPTMAP
: return "C6000_PREEMPTMAP";
1919 case DT_C6000_DSBT_INDEX
: return "C6000_DSBT_INDEX";
1926 get_nios2_dynamic_type (unsigned long type
)
1930 case DT_NIOS2_GP
: return "NIOS2_GP";
1937 get_solaris_dynamic_type (unsigned long type
)
1941 case 0x6000000d: return "SUNW_AUXILIARY";
1942 case 0x6000000e: return "SUNW_RTLDINF";
1943 case 0x6000000f: return "SUNW_FILTER";
1944 case 0x60000010: return "SUNW_CAP";
1945 case 0x60000011: return "SUNW_SYMTAB";
1946 case 0x60000012: return "SUNW_SYMSZ";
1947 case 0x60000013: return "SUNW_SORTENT";
1948 case 0x60000014: return "SUNW_SYMSORT";
1949 case 0x60000015: return "SUNW_SYMSORTSZ";
1950 case 0x60000016: return "SUNW_TLSSORT";
1951 case 0x60000017: return "SUNW_TLSSORTSZ";
1952 case 0x60000018: return "SUNW_CAPINFO";
1953 case 0x60000019: return "SUNW_STRPAD";
1954 case 0x6000001a: return "SUNW_CAPCHAIN";
1955 case 0x6000001b: return "SUNW_LDMACH";
1956 case 0x6000001d: return "SUNW_CAPCHAINENT";
1957 case 0x6000001f: return "SUNW_CAPCHAINSZ";
1958 case 0x60000021: return "SUNW_PARENT";
1959 case 0x60000023: return "SUNW_ASLR";
1960 case 0x60000025: return "SUNW_RELAX";
1961 case 0x60000029: return "SUNW_NXHEAP";
1962 case 0x6000002b: return "SUNW_NXSTACK";
1964 case 0x70000001: return "SPARC_REGISTER";
1965 case 0x7ffffffd: return "AUXILIARY";
1966 case 0x7ffffffe: return "USED";
1967 case 0x7fffffff: return "FILTER";
1969 default: return NULL
;
1974 get_dynamic_type (unsigned long type
)
1976 static char buff
[64];
1980 case DT_NULL
: return "NULL";
1981 case DT_NEEDED
: return "NEEDED";
1982 case DT_PLTRELSZ
: return "PLTRELSZ";
1983 case DT_PLTGOT
: return "PLTGOT";
1984 case DT_HASH
: return "HASH";
1985 case DT_STRTAB
: return "STRTAB";
1986 case DT_SYMTAB
: return "SYMTAB";
1987 case DT_RELA
: return "RELA";
1988 case DT_RELASZ
: return "RELASZ";
1989 case DT_RELAENT
: return "RELAENT";
1990 case DT_STRSZ
: return "STRSZ";
1991 case DT_SYMENT
: return "SYMENT";
1992 case DT_INIT
: return "INIT";
1993 case DT_FINI
: return "FINI";
1994 case DT_SONAME
: return "SONAME";
1995 case DT_RPATH
: return "RPATH";
1996 case DT_SYMBOLIC
: return "SYMBOLIC";
1997 case DT_REL
: return "REL";
1998 case DT_RELSZ
: return "RELSZ";
1999 case DT_RELENT
: return "RELENT";
2000 case DT_PLTREL
: return "PLTREL";
2001 case DT_DEBUG
: return "DEBUG";
2002 case DT_TEXTREL
: return "TEXTREL";
2003 case DT_JMPREL
: return "JMPREL";
2004 case DT_BIND_NOW
: return "BIND_NOW";
2005 case DT_INIT_ARRAY
: return "INIT_ARRAY";
2006 case DT_FINI_ARRAY
: return "FINI_ARRAY";
2007 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
2008 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
2009 case DT_RUNPATH
: return "RUNPATH";
2010 case DT_FLAGS
: return "FLAGS";
2012 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2013 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
2015 case DT_CHECKSUM
: return "CHECKSUM";
2016 case DT_PLTPADSZ
: return "PLTPADSZ";
2017 case DT_MOVEENT
: return "MOVEENT";
2018 case DT_MOVESZ
: return "MOVESZ";
2019 case DT_FEATURE
: return "FEATURE";
2020 case DT_POSFLAG_1
: return "POSFLAG_1";
2021 case DT_SYMINSZ
: return "SYMINSZ";
2022 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
2024 case DT_ADDRRNGLO
: return "ADDRRNGLO";
2025 case DT_CONFIG
: return "CONFIG";
2026 case DT_DEPAUDIT
: return "DEPAUDIT";
2027 case DT_AUDIT
: return "AUDIT";
2028 case DT_PLTPAD
: return "PLTPAD";
2029 case DT_MOVETAB
: return "MOVETAB";
2030 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
2032 case DT_VERSYM
: return "VERSYM";
2034 case DT_TLSDESC_GOT
: return "TLSDESC_GOT";
2035 case DT_TLSDESC_PLT
: return "TLSDESC_PLT";
2036 case DT_RELACOUNT
: return "RELACOUNT";
2037 case DT_RELCOUNT
: return "RELCOUNT";
2038 case DT_FLAGS_1
: return "FLAGS_1";
2039 case DT_VERDEF
: return "VERDEF";
2040 case DT_VERDEFNUM
: return "VERDEFNUM";
2041 case DT_VERNEED
: return "VERNEED";
2042 case DT_VERNEEDNUM
: return "VERNEEDNUM";
2044 case DT_AUXILIARY
: return "AUXILIARY";
2045 case DT_USED
: return "USED";
2046 case DT_FILTER
: return "FILTER";
2048 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
2049 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
2050 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
2051 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
2052 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
2053 case DT_GNU_HASH
: return "GNU_HASH";
2056 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
2058 const char * result
;
2060 switch (elf_header
.e_machine
)
2063 case EM_MIPS_RS3_LE
:
2064 result
= get_mips_dynamic_type (type
);
2067 result
= get_sparc64_dynamic_type (type
);
2070 result
= get_ppc_dynamic_type (type
);
2073 result
= get_ppc64_dynamic_type (type
);
2076 result
= get_ia64_dynamic_type (type
);
2079 result
= get_alpha_dynamic_type (type
);
2082 result
= get_score_dynamic_type (type
);
2085 result
= get_tic6x_dynamic_type (type
);
2087 case EM_ALTERA_NIOS2
:
2088 result
= get_nios2_dynamic_type (type
);
2091 if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_SOLARIS
)
2092 result
= get_solaris_dynamic_type (type
);
2101 snprintf (buff
, sizeof (buff
), _("Processor Specific: %lx"), type
);
2103 else if (((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
2104 || (elf_header
.e_machine
== EM_PARISC
2105 && (type
>= OLD_DT_LOOS
) && (type
<= OLD_DT_HIOS
)))
2107 const char * result
;
2109 switch (elf_header
.e_machine
)
2112 result
= get_parisc_dynamic_type (type
);
2115 result
= get_ia64_dynamic_type (type
);
2118 if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_SOLARIS
)
2119 result
= get_solaris_dynamic_type (type
);
2128 snprintf (buff
, sizeof (buff
), _("Operating System specific: %lx"),
2132 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), type
);
2139 get_file_type (unsigned e_type
)
2141 static char buff
[32];
2145 case ET_NONE
: return _("NONE (None)");
2146 case ET_REL
: return _("REL (Relocatable file)");
2147 case ET_EXEC
: return _("EXEC (Executable file)");
2148 case ET_DYN
: return _("DYN (Shared object file)");
2149 case ET_CORE
: return _("CORE (Core file)");
2152 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
2153 snprintf (buff
, sizeof (buff
), _("Processor Specific: (%x)"), e_type
);
2154 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
2155 snprintf (buff
, sizeof (buff
), _("OS Specific: (%x)"), e_type
);
2157 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_type
);
2163 get_machine_name (unsigned e_machine
)
2165 static char buff
[64]; /* XXX */
2169 case EM_NONE
: return _("None");
2170 case EM_AARCH64
: return "AArch64";
2171 case EM_M32
: return "WE32100";
2172 case EM_SPARC
: return "Sparc";
2173 case EM_SPU
: return "SPU";
2174 case EM_386
: return "Intel 80386";
2175 case EM_68K
: return "MC68000";
2176 case EM_88K
: return "MC88000";
2177 case EM_IAMCU
: return "Intel MCU";
2178 case EM_860
: return "Intel 80860";
2179 case EM_MIPS
: return "MIPS R3000";
2180 case EM_S370
: return "IBM System/370";
2181 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
2182 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
2183 case EM_PARISC
: return "HPPA";
2184 case EM_PPC_OLD
: return "Power PC (old)";
2185 case EM_SPARC32PLUS
: return "Sparc v8+" ;
2186 case EM_960
: return "Intel 90860";
2187 case EM_PPC
: return "PowerPC";
2188 case EM_PPC64
: return "PowerPC64";
2189 case EM_FR20
: return "Fujitsu FR20";
2190 case EM_FT32
: return "FTDI FT32";
2191 case EM_RH32
: return "TRW RH32";
2192 case EM_MCORE
: return "MCORE";
2193 case EM_ARM
: return "ARM";
2194 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
2195 case EM_SH
: return "Renesas / SuperH SH";
2196 case EM_SPARCV9
: return "Sparc v9";
2197 case EM_TRICORE
: return "Siemens Tricore";
2198 case EM_ARC
: return "ARC";
2199 case EM_ARC_COMPACT
: return "ARCompact";
2200 case EM_ARC_COMPACT2
: return "ARCv2";
2201 case EM_H8_300
: return "Renesas H8/300";
2202 case EM_H8_300H
: return "Renesas H8/300H";
2203 case EM_H8S
: return "Renesas H8S";
2204 case EM_H8_500
: return "Renesas H8/500";
2205 case EM_IA_64
: return "Intel IA-64";
2206 case EM_MIPS_X
: return "Stanford MIPS-X";
2207 case EM_COLDFIRE
: return "Motorola Coldfire";
2208 case EM_ALPHA
: return "Alpha";
2209 case EM_CYGNUS_D10V
:
2210 case EM_D10V
: return "d10v";
2211 case EM_CYGNUS_D30V
:
2212 case EM_D30V
: return "d30v";
2213 case EM_CYGNUS_M32R
:
2214 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
2215 case EM_CYGNUS_V850
:
2216 case EM_V800
: return "Renesas V850 (using RH850 ABI)";
2217 case EM_V850
: return "Renesas V850";
2218 case EM_CYGNUS_MN10300
:
2219 case EM_MN10300
: return "mn10300";
2220 case EM_CYGNUS_MN10200
:
2221 case EM_MN10200
: return "mn10200";
2222 case EM_MOXIE
: return "Moxie";
2223 case EM_CYGNUS_FR30
:
2224 case EM_FR30
: return "Fujitsu FR30";
2225 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
2227 case EM_PJ
: return "picoJava";
2228 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
2229 case EM_PCP
: return "Siemens PCP";
2230 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
2231 case EM_NDR1
: return "Denso NDR1 microprocesspr";
2232 case EM_STARCORE
: return "Motorola Star*Core processor";
2233 case EM_ME16
: return "Toyota ME16 processor";
2234 case EM_ST100
: return "STMicroelectronics ST100 processor";
2235 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
2236 case EM_PDSP
: return "Sony DSP processor";
2237 case EM_PDP10
: return "Digital Equipment Corp. PDP-10";
2238 case EM_PDP11
: return "Digital Equipment Corp. PDP-11";
2239 case EM_FX66
: return "Siemens FX66 microcontroller";
2240 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2241 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
2242 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
2243 case EM_68HC12
: return "Motorola MC68HC12 Microcontroller";
2244 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
2245 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
2246 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
2247 case EM_SVX
: return "Silicon Graphics SVx";
2248 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
2249 case EM_VAX
: return "Digital VAX";
2250 case EM_VISIUM
: return "CDS VISIUMcore processor";
2252 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
2253 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
2254 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
2255 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
2256 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
2257 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
2258 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
2259 case EM_PRISM
: return "Vitesse Prism";
2260 case EM_X86_64
: return "Advanced Micro Devices X86-64";
2261 case EM_L1OM
: return "Intel L1OM";
2262 case EM_K1OM
: return "Intel K1OM";
2264 case EM_S390
: return "IBM S/390";
2265 case EM_SCORE
: return "SUNPLUS S+Core";
2266 case EM_XSTORMY16
: return "Sanyo XStormy16 CPU core";
2267 case EM_OR1K
: return "OpenRISC 1000";
2268 case EM_CRX
: return "National Semiconductor CRX microprocessor";
2269 case EM_ADAPTEVA_EPIPHANY
: return "Adapteva EPIPHANY";
2270 case EM_DLX
: return "OpenDLX";
2272 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
2273 case EM_IQ2000
: return "Vitesse IQ2000";
2275 case EM_XTENSA
: return "Tensilica Xtensa Processor";
2276 case EM_VIDEOCORE
: return "Alphamosaic VideoCore processor";
2277 case EM_TMM_GPP
: return "Thompson Multimedia General Purpose Processor";
2278 case EM_NS32K
: return "National Semiconductor 32000 series";
2279 case EM_TPC
: return "Tenor Network TPC processor";
2280 case EM_ST200
: return "STMicroelectronics ST200 microcontroller";
2281 case EM_MAX
: return "MAX Processor";
2282 case EM_CR
: return "National Semiconductor CompactRISC";
2283 case EM_F2MC16
: return "Fujitsu F2MC16";
2284 case EM_MSP430
: return "Texas Instruments msp430 microcontroller";
2285 case EM_LATTICEMICO32
: return "Lattice Mico32";
2287 case EM_M32C
: return "Renesas M32c";
2288 case EM_MT
: return "Morpho Techologies MT processor";
2289 case EM_BLACKFIN
: return "Analog Devices Blackfin";
2290 case EM_SE_C33
: return "S1C33 Family of Seiko Epson processors";
2291 case EM_SEP
: return "Sharp embedded microprocessor";
2292 case EM_ARCA
: return "Arca RISC microprocessor";
2293 case EM_UNICORE
: return "Unicore";
2294 case EM_EXCESS
: return "eXcess 16/32/64-bit configurable embedded CPU";
2295 case EM_DXP
: return "Icera Semiconductor Inc. Deep Execution Processor";
2296 case EM_NIOS32
: return "Altera Nios";
2297 case EM_ALTERA_NIOS2
: return "Altera Nios II";
2299 case EM_XC16X
: return "Infineon Technologies xc16x";
2300 case EM_M16C
: return "Renesas M16C series microprocessors";
2301 case EM_DSPIC30F
: return "Microchip Technology dsPIC30F Digital Signal Controller";
2302 case EM_CE
: return "Freescale Communication Engine RISC core";
2303 case EM_TSK3000
: return "Altium TSK3000 core";
2304 case EM_RS08
: return "Freescale RS08 embedded processor";
2305 case EM_ECOG2
: return "Cyan Technology eCOG2 microprocessor";
2306 case EM_DSP24
: return "New Japan Radio (NJR) 24-bit DSP Processor";
2307 case EM_VIDEOCORE3
: return "Broadcom VideoCore III processor";
2308 case EM_SE_C17
: return "Seiko Epson C17 family";
2309 case EM_TI_C6000
: return "Texas Instruments TMS320C6000 DSP family";
2310 case EM_TI_C2000
: return "Texas Instruments TMS320C2000 DSP family";
2311 case EM_TI_C5500
: return "Texas Instruments TMS320C55x DSP family";
2312 case EM_MMDSP_PLUS
: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2313 case EM_CYPRESS_M8C
: return "Cypress M8C microprocessor";
2314 case EM_R32C
: return "Renesas R32C series microprocessors";
2315 case EM_TRIMEDIA
: return "NXP Semiconductors TriMedia architecture family";
2316 case EM_QDSP6
: return "QUALCOMM DSP6 Processor";
2317 case EM_8051
: return "Intel 8051 and variants";
2318 case EM_STXP7X
: return "STMicroelectronics STxP7x family";
2319 case EM_NDS32
: return "Andes Technology compact code size embedded RISC processor family";
2320 case EM_ECOG1X
: return "Cyan Technology eCOG1X family";
2321 case EM_MAXQ30
: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2322 case EM_XIMO16
: return "New Japan Radio (NJR) 16-bit DSP Processor";
2323 case EM_MANIK
: return "M2000 Reconfigurable RISC Microprocessor";
2324 case EM_CRAYNV2
: return "Cray Inc. NV2 vector architecture";
2325 case EM_CYGNUS_MEP
: return "Toshiba MeP Media Engine";
2328 case EM_MICROBLAZE_OLD
: return "Xilinx MicroBlaze";
2329 case EM_RL78
: return "Renesas RL78";
2330 case EM_RX
: return "Renesas RX";
2331 case EM_METAG
: return "Imagination Technologies Meta processor architecture";
2332 case EM_MCST_ELBRUS
: return "MCST Elbrus general purpose hardware architecture";
2333 case EM_ECOG16
: return "Cyan Technology eCOG16 family";
2334 case EM_ETPU
: return "Freescale Extended Time Processing Unit";
2335 case EM_SLE9X
: return "Infineon Technologies SLE9X core";
2336 case EM_AVR32
: return "Atmel Corporation 32-bit microprocessor family";
2337 case EM_STM8
: return "STMicroeletronics STM8 8-bit microcontroller";
2338 case EM_TILE64
: return "Tilera TILE64 multicore architecture family";
2339 case EM_TILEPRO
: return "Tilera TILEPro multicore architecture family";
2340 case EM_TILEGX
: return "Tilera TILE-Gx multicore architecture family";
2341 case EM_CUDA
: return "NVIDIA CUDA architecture";
2342 case EM_XGATE
: return "Motorola XGATE embedded processor";
2344 snprintf (buff
, sizeof (buff
), _("<unknown>: 0x%x"), e_machine
);
2350 decode_ARC_machine_flags (unsigned e_flags
, unsigned e_machine
, char buf
[])
2352 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2353 other compilers don't a specific architecture type in the e_flags, and
2354 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2355 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2358 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2359 but also sets a specific architecture type in the e_flags field.
2361 However, when decoding the flags we don't worry if we see an
2362 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2363 ARCEM architecture type. */
2365 switch (e_flags
& EF_ARC_MACH_MSK
)
2367 /* We only expect these to occur for EM_ARC_COMPACT2. */
2368 case EF_ARC_CPU_ARCV2EM
:
2369 strcat (buf
, ", ARC EM");
2371 case EF_ARC_CPU_ARCV2HS
:
2372 strcat (buf
, ", ARC HS");
2375 /* We only expect these to occur for EM_ARC_COMPACT. */
2376 case E_ARC_MACH_ARC600
:
2377 strcat (buf
, ", ARC600");
2379 case E_ARC_MACH_ARC601
:
2380 strcat (buf
, ", ARC601");
2382 case E_ARC_MACH_ARC700
:
2383 strcat (buf
, ", ARC700");
2386 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2387 new ELF with new architecture being read by an old version of
2388 readelf, or (c) An ELF built with non-GNU compiler that does not
2389 set the architecture in the e_flags. */
2391 if (e_machine
== EM_ARC_COMPACT
)
2392 strcat (buf
, ", Unknown ARCompact");
2394 strcat (buf
, ", Unknown ARC");
2398 switch (e_flags
& EF_ARC_OSABI_MSK
)
2400 case E_ARC_OSABI_ORIG
:
2401 strcat (buf
, ", (ABI:legacy)");
2403 case E_ARC_OSABI_V2
:
2404 strcat (buf
, ", (ABI:v2)");
2406 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2407 case E_ARC_OSABI_V3
:
2408 strcat (buf
, ", v3 no-legacy-syscalls ABI");
2411 strcat (buf
, ", unrecognised ARC OSABI flag");
2417 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
2422 eabi
= EF_ARM_EABI_VERSION (e_flags
);
2423 e_flags
&= ~ EF_ARM_EABIMASK
;
2425 /* Handle "generic" ARM flags. */
2426 if (e_flags
& EF_ARM_RELEXEC
)
2428 strcat (buf
, ", relocatable executable");
2429 e_flags
&= ~ EF_ARM_RELEXEC
;
2432 /* Now handle EABI specific flags. */
2436 strcat (buf
, ", <unrecognized EABI>");
2441 case EF_ARM_EABI_VER1
:
2442 strcat (buf
, ", Version1 EABI");
2447 /* Process flags one bit at a time. */
2448 flag
= e_flags
& - e_flags
;
2453 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
2454 strcat (buf
, ", sorted symbol tables");
2464 case EF_ARM_EABI_VER2
:
2465 strcat (buf
, ", Version2 EABI");
2470 /* Process flags one bit at a time. */
2471 flag
= e_flags
& - e_flags
;
2476 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
2477 strcat (buf
, ", sorted symbol tables");
2480 case EF_ARM_DYNSYMSUSESEGIDX
:
2481 strcat (buf
, ", dynamic symbols use segment index");
2484 case EF_ARM_MAPSYMSFIRST
:
2485 strcat (buf
, ", mapping symbols precede others");
2495 case EF_ARM_EABI_VER3
:
2496 strcat (buf
, ", Version3 EABI");
2499 case EF_ARM_EABI_VER4
:
2500 strcat (buf
, ", Version4 EABI");
2505 /* Process flags one bit at a time. */
2506 flag
= e_flags
& - e_flags
;
2512 strcat (buf
, ", BE8");
2516 strcat (buf
, ", LE8");
2527 case EF_ARM_EABI_VER5
:
2528 strcat (buf
, ", Version5 EABI");
2533 /* Process flags one bit at a time. */
2534 flag
= e_flags
& - e_flags
;
2540 strcat (buf
, ", BE8");
2544 strcat (buf
, ", LE8");
2547 case EF_ARM_ABI_FLOAT_SOFT
: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2548 strcat (buf
, ", soft-float ABI");
2551 case EF_ARM_ABI_FLOAT_HARD
: /* Conflicts with EF_ARM_VFP_FLOAT. */
2552 strcat (buf
, ", hard-float ABI");
2562 case EF_ARM_EABI_UNKNOWN
:
2563 strcat (buf
, ", GNU EABI");
2568 /* Process flags one bit at a time. */
2569 flag
= e_flags
& - e_flags
;
2574 case EF_ARM_INTERWORK
:
2575 strcat (buf
, ", interworking enabled");
2578 case EF_ARM_APCS_26
:
2579 strcat (buf
, ", uses APCS/26");
2582 case EF_ARM_APCS_FLOAT
:
2583 strcat (buf
, ", uses APCS/float");
2587 strcat (buf
, ", position independent");
2591 strcat (buf
, ", 8 bit structure alignment");
2594 case EF_ARM_NEW_ABI
:
2595 strcat (buf
, ", uses new ABI");
2598 case EF_ARM_OLD_ABI
:
2599 strcat (buf
, ", uses old ABI");
2602 case EF_ARM_SOFT_FLOAT
:
2603 strcat (buf
, ", software FP");
2606 case EF_ARM_VFP_FLOAT
:
2607 strcat (buf
, ", VFP");
2610 case EF_ARM_MAVERICK_FLOAT
:
2611 strcat (buf
, ", Maverick FP");
2622 strcat (buf
,_(", <unknown>"));
2626 decode_AVR_machine_flags (unsigned e_flags
, char buf
[], size_t size
)
2628 --size
; /* Leave space for null terminator. */
2630 switch (e_flags
& EF_AVR_MACH
)
2632 case E_AVR_MACH_AVR1
:
2633 strncat (buf
, ", avr:1", size
);
2635 case E_AVR_MACH_AVR2
:
2636 strncat (buf
, ", avr:2", size
);
2638 case E_AVR_MACH_AVR25
:
2639 strncat (buf
, ", avr:25", size
);
2641 case E_AVR_MACH_AVR3
:
2642 strncat (buf
, ", avr:3", size
);
2644 case E_AVR_MACH_AVR31
:
2645 strncat (buf
, ", avr:31", size
);
2647 case E_AVR_MACH_AVR35
:
2648 strncat (buf
, ", avr:35", size
);
2650 case E_AVR_MACH_AVR4
:
2651 strncat (buf
, ", avr:4", size
);
2653 case E_AVR_MACH_AVR5
:
2654 strncat (buf
, ", avr:5", size
);
2656 case E_AVR_MACH_AVR51
:
2657 strncat (buf
, ", avr:51", size
);
2659 case E_AVR_MACH_AVR6
:
2660 strncat (buf
, ", avr:6", size
);
2662 case E_AVR_MACH_AVRTINY
:
2663 strncat (buf
, ", avr:100", size
);
2665 case E_AVR_MACH_XMEGA1
:
2666 strncat (buf
, ", avr:101", size
);
2668 case E_AVR_MACH_XMEGA2
:
2669 strncat (buf
, ", avr:102", size
);
2671 case E_AVR_MACH_XMEGA3
:
2672 strncat (buf
, ", avr:103", size
);
2674 case E_AVR_MACH_XMEGA4
:
2675 strncat (buf
, ", avr:104", size
);
2677 case E_AVR_MACH_XMEGA5
:
2678 strncat (buf
, ", avr:105", size
);
2680 case E_AVR_MACH_XMEGA6
:
2681 strncat (buf
, ", avr:106", size
);
2683 case E_AVR_MACH_XMEGA7
:
2684 strncat (buf
, ", avr:107", size
);
2687 strncat (buf
, ", avr:<unknown>", size
);
2691 size
-= strlen (buf
);
2692 if (e_flags
& EF_AVR_LINKRELAX_PREPARED
)
2693 strncat (buf
, ", link-relax", size
);
2697 decode_NDS32_machine_flags (unsigned e_flags
, char buf
[], size_t size
)
2706 static const char *ABI_STRINGS
[] =
2708 "ABI v0", /* use r5 as return register; only used in N1213HC */
2709 "ABI v1", /* use r0 as return register */
2710 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2711 "ABI v2fp", /* for FPU */
2715 static const char *VER_STRINGS
[] =
2717 "Andes ELF V1.3 or older",
2721 static const char *ARCH_STRINGS
[] =
2730 abi
= EF_NDS_ABI
& e_flags
;
2731 arch
= EF_NDS_ARCH
& e_flags
;
2732 config
= EF_NDS_INST
& e_flags
;
2733 version
= EF_NDS32_ELF_VERSION
& e_flags
;
2735 memset (buf
, 0, size
);
2742 case E_NDS_ABI_V2FP
:
2743 case E_NDS_ABI_AABI
:
2744 case E_NDS_ABI_V2FP_PLUS
:
2745 /* In case there are holes in the array. */
2746 r
+= snprintf (buf
+ r
, size
- r
, ", %s", ABI_STRINGS
[abi
>> EF_NDS_ABI_SHIFT
]);
2750 r
+= snprintf (buf
+ r
, size
- r
, ", <unrecognized ABI>");
2756 case E_NDS32_ELF_VER_1_2
:
2757 case E_NDS32_ELF_VER_1_3
:
2758 case E_NDS32_ELF_VER_1_4
:
2759 r
+= snprintf (buf
+ r
, size
- r
, ", %s", VER_STRINGS
[version
>> EF_NDS32_ELF_VERSION_SHIFT
]);
2763 r
+= snprintf (buf
+ r
, size
- r
, ", <unrecognized ELF version number>");
2767 if (E_NDS_ABI_V0
== abi
)
2769 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2770 r
+= snprintf (buf
+ r
, size
- r
, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2771 if (arch
== E_NDS_ARCH_STAR_V1_0
)
2772 r
+= snprintf (buf
+ r
, size
-r
, ", 16b"); /* has 16-bit instructions */
2778 case E_NDS_ARCH_STAR_V1_0
:
2779 case E_NDS_ARCH_STAR_V2_0
:
2780 case E_NDS_ARCH_STAR_V3_0
:
2781 case E_NDS_ARCH_STAR_V3_M
:
2782 r
+= snprintf (buf
+ r
, size
- r
, ", %s", ARCH_STRINGS
[arch
>> EF_NDS_ARCH_SHIFT
]);
2786 r
+= snprintf (buf
+ r
, size
- r
, ", <unrecognized architecture>");
2787 /* ARCH version determines how the e_flags are interpreted.
2788 If it is unknown, we cannot proceed. */
2792 /* Newer ABI; Now handle architecture specific flags. */
2793 if (arch
== E_NDS_ARCH_STAR_V1_0
)
2795 if (config
& E_NDS32_HAS_MFUSR_PC_INST
)
2796 r
+= snprintf (buf
+ r
, size
-r
, ", MFUSR_PC");
2798 if (!(config
& E_NDS32_HAS_NO_MAC_INST
))
2799 r
+= snprintf (buf
+ r
, size
-r
, ", MAC");
2801 if (config
& E_NDS32_HAS_DIV_INST
)
2802 r
+= snprintf (buf
+ r
, size
-r
, ", DIV");
2804 if (config
& E_NDS32_HAS_16BIT_INST
)
2805 r
+= snprintf (buf
+ r
, size
-r
, ", 16b");
2809 if (config
& E_NDS32_HAS_MFUSR_PC_INST
)
2811 if (version
<= E_NDS32_ELF_VER_1_3
)
2812 r
+= snprintf (buf
+ r
, size
-r
, ", [B8]");
2814 r
+= snprintf (buf
+ r
, size
-r
, ", EX9");
2817 if (config
& E_NDS32_HAS_MAC_DX_INST
)
2818 r
+= snprintf (buf
+ r
, size
-r
, ", MAC_DX");
2820 if (config
& E_NDS32_HAS_DIV_DX_INST
)
2821 r
+= snprintf (buf
+ r
, size
-r
, ", DIV_DX");
2823 if (config
& E_NDS32_HAS_16BIT_INST
)
2825 if (version
<= E_NDS32_ELF_VER_1_3
)
2826 r
+= snprintf (buf
+ r
, size
-r
, ", 16b");
2828 r
+= snprintf (buf
+ r
, size
-r
, ", IFC");
2832 if (config
& E_NDS32_HAS_EXT_INST
)
2833 r
+= snprintf (buf
+ r
, size
-r
, ", PERF1");
2835 if (config
& E_NDS32_HAS_EXT2_INST
)
2836 r
+= snprintf (buf
+ r
, size
-r
, ", PERF2");
2838 if (config
& E_NDS32_HAS_FPU_INST
)
2841 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_SP");
2844 if (config
& E_NDS32_HAS_FPU_DP_INST
)
2847 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_DP");
2850 if (config
& E_NDS32_HAS_FPU_MAC_INST
)
2853 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_MAC");
2858 switch ((config
& E_NDS32_FPU_REG_CONF
) >> E_NDS32_FPU_REG_CONF_SHIFT
)
2860 case E_NDS32_FPU_REG_8SP_4DP
:
2861 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_REG:8/4");
2863 case E_NDS32_FPU_REG_16SP_8DP
:
2864 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_REG:16/8");
2866 case E_NDS32_FPU_REG_32SP_16DP
:
2867 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_REG:32/16");
2869 case E_NDS32_FPU_REG_32SP_32DP
:
2870 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_REG:32/32");
2875 if (config
& E_NDS32_HAS_AUDIO_INST
)
2876 r
+= snprintf (buf
+ r
, size
-r
, ", AUDIO");
2878 if (config
& E_NDS32_HAS_STRING_INST
)
2879 r
+= snprintf (buf
+ r
, size
-r
, ", STR");
2881 if (config
& E_NDS32_HAS_REDUCED_REGS
)
2882 r
+= snprintf (buf
+ r
, size
-r
, ", 16REG");
2884 if (config
& E_NDS32_HAS_VIDEO_INST
)
2886 if (version
<= E_NDS32_ELF_VER_1_3
)
2887 r
+= snprintf (buf
+ r
, size
-r
, ", VIDEO");
2889 r
+= snprintf (buf
+ r
, size
-r
, ", SATURATION");
2892 if (config
& E_NDS32_HAS_ENCRIPT_INST
)
2893 r
+= snprintf (buf
+ r
, size
-r
, ", ENCRP");
2895 if (config
& E_NDS32_HAS_L2C_INST
)
2896 r
+= snprintf (buf
+ r
, size
-r
, ", L2C");
2900 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
2902 static char buf
[1024];
2913 case EM_ARC_COMPACT2
:
2914 case EM_ARC_COMPACT
:
2915 decode_ARC_machine_flags (e_flags
, e_machine
, buf
);
2919 decode_ARM_machine_flags (e_flags
, buf
);
2923 decode_AVR_machine_flags (e_flags
, buf
, sizeof buf
);
2927 if (e_flags
& EF_BFIN_PIC
)
2928 strcat (buf
, ", PIC");
2930 if (e_flags
& EF_BFIN_FDPIC
)
2931 strcat (buf
, ", FDPIC");
2933 if (e_flags
& EF_BFIN_CODE_IN_L1
)
2934 strcat (buf
, ", code in L1");
2936 if (e_flags
& EF_BFIN_DATA_IN_L1
)
2937 strcat (buf
, ", data in L1");
2942 switch (e_flags
& EF_FRV_CPU_MASK
)
2944 case EF_FRV_CPU_GENERIC
:
2948 strcat (buf
, ", fr???");
2951 case EF_FRV_CPU_FR300
:
2952 strcat (buf
, ", fr300");
2955 case EF_FRV_CPU_FR400
:
2956 strcat (buf
, ", fr400");
2958 case EF_FRV_CPU_FR405
:
2959 strcat (buf
, ", fr405");
2962 case EF_FRV_CPU_FR450
:
2963 strcat (buf
, ", fr450");
2966 case EF_FRV_CPU_FR500
:
2967 strcat (buf
, ", fr500");
2969 case EF_FRV_CPU_FR550
:
2970 strcat (buf
, ", fr550");
2973 case EF_FRV_CPU_SIMPLE
:
2974 strcat (buf
, ", simple");
2976 case EF_FRV_CPU_TOMCAT
:
2977 strcat (buf
, ", tomcat");
2983 if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_M68000
)
2984 strcat (buf
, ", m68000");
2985 else if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_CPU32
)
2986 strcat (buf
, ", cpu32");
2987 else if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_FIDO
)
2988 strcat (buf
, ", fido_a");
2991 char const * isa
= _("unknown");
2992 char const * mac
= _("unknown mac");
2993 char const * additional
= NULL
;
2995 switch (e_flags
& EF_M68K_CF_ISA_MASK
)
2997 case EF_M68K_CF_ISA_A_NODIV
:
2999 additional
= ", nodiv";
3001 case EF_M68K_CF_ISA_A
:
3004 case EF_M68K_CF_ISA_A_PLUS
:
3007 case EF_M68K_CF_ISA_B_NOUSP
:
3009 additional
= ", nousp";
3011 case EF_M68K_CF_ISA_B
:
3014 case EF_M68K_CF_ISA_C
:
3017 case EF_M68K_CF_ISA_C_NODIV
:
3019 additional
= ", nodiv";
3022 strcat (buf
, ", cf, isa ");
3025 strcat (buf
, additional
);
3026 if (e_flags
& EF_M68K_CF_FLOAT
)
3027 strcat (buf
, ", float");
3028 switch (e_flags
& EF_M68K_CF_MAC_MASK
)
3033 case EF_M68K_CF_MAC
:
3036 case EF_M68K_CF_EMAC
:
3039 case EF_M68K_CF_EMAC_B
:
3052 switch (e_flags
& EF_MEP_CPU_MASK
)
3054 case EF_MEP_CPU_MEP
: strcat (buf
, ", generic MeP"); break;
3055 case EF_MEP_CPU_C2
: strcat (buf
, ", MeP C2"); break;
3056 case EF_MEP_CPU_C3
: strcat (buf
, ", MeP C3"); break;
3057 case EF_MEP_CPU_C4
: strcat (buf
, ", MeP C4"); break;
3058 case EF_MEP_CPU_C5
: strcat (buf
, ", MeP C5"); break;
3059 case EF_MEP_CPU_H1
: strcat (buf
, ", MeP H1"); break;
3060 default: strcat (buf
, _(", <unknown MeP cpu type>")); break;
3063 switch (e_flags
& EF_MEP_COP_MASK
)
3065 case EF_MEP_COP_NONE
: break;
3066 case EF_MEP_COP_AVC
: strcat (buf
, ", AVC coprocessor"); break;
3067 case EF_MEP_COP_AVC2
: strcat (buf
, ", AVC2 coprocessor"); break;
3068 case EF_MEP_COP_FMAX
: strcat (buf
, ", FMAX coprocessor"); break;
3069 case EF_MEP_COP_IVC2
: strcat (buf
, ", IVC2 coprocessor"); break;
3070 default: strcat (buf
, _("<unknown MeP copro type>")); break;
3073 if (e_flags
& EF_MEP_LIBRARY
)
3074 strcat (buf
, ", Built for Library");
3076 if (e_flags
& EF_MEP_INDEX_MASK
)
3077 sprintf (buf
+ strlen (buf
), ", Configuration Index: %#x",
3078 e_flags
& EF_MEP_INDEX_MASK
);
3080 if (e_flags
& ~ EF_MEP_ALL_FLAGS
)
3081 sprintf (buf
+ strlen (buf
), _(", unknown flags bits: %#x"),
3082 e_flags
& ~ EF_MEP_ALL_FLAGS
);
3086 if (e_flags
& EF_PPC_EMB
)
3087 strcat (buf
, ", emb");
3089 if (e_flags
& EF_PPC_RELOCATABLE
)
3090 strcat (buf
, _(", relocatable"));
3092 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
3093 strcat (buf
, _(", relocatable-lib"));
3097 if (e_flags
& EF_PPC64_ABI
)
3099 char abi
[] = ", abiv0";
3101 abi
[6] += e_flags
& EF_PPC64_ABI
;
3107 if ((e_flags
& EF_RH850_ABI
) == EF_RH850_ABI
)
3108 strcat (buf
, ", RH850 ABI");
3110 if (e_flags
& EF_V800_850E3
)
3111 strcat (buf
, ", V3 architecture");
3113 if ((e_flags
& (EF_RH850_FPU_DOUBLE
| EF_RH850_FPU_SINGLE
)) == 0)
3114 strcat (buf
, ", FPU not used");
3116 if ((e_flags
& (EF_RH850_REGMODE22
| EF_RH850_REGMODE32
)) == 0)
3117 strcat (buf
, ", regmode: COMMON");
3119 if ((e_flags
& (EF_RH850_GP_FIX
| EF_RH850_GP_NOFIX
)) == 0)
3120 strcat (buf
, ", r4 not used");
3122 if ((e_flags
& (EF_RH850_EP_FIX
| EF_RH850_EP_NOFIX
)) == 0)
3123 strcat (buf
, ", r30 not used");
3125 if ((e_flags
& (EF_RH850_TP_FIX
| EF_RH850_TP_NOFIX
)) == 0)
3126 strcat (buf
, ", r5 not used");
3128 if ((e_flags
& (EF_RH850_REG2_RESERVE
| EF_RH850_REG2_NORESERVE
)) == 0)
3129 strcat (buf
, ", r2 not used");
3131 for (e_flags
&= 0xFFFF; e_flags
; e_flags
&= ~ (e_flags
& - e_flags
))
3133 switch (e_flags
& - e_flags
)
3135 case EF_RH850_FPU_DOUBLE
: strcat (buf
, ", double precision FPU"); break;
3136 case EF_RH850_FPU_SINGLE
: strcat (buf
, ", single precision FPU"); break;
3137 case EF_RH850_REGMODE22
: strcat (buf
, ", regmode:22"); break;
3138 case EF_RH850_REGMODE32
: strcat (buf
, ", regmode:23"); break;
3139 case EF_RH850_GP_FIX
: strcat (buf
, ", r4 fixed"); break;
3140 case EF_RH850_GP_NOFIX
: strcat (buf
, ", r4 free"); break;
3141 case EF_RH850_EP_FIX
: strcat (buf
, ", r30 fixed"); break;
3142 case EF_RH850_EP_NOFIX
: strcat (buf
, ", r30 free"); break;
3143 case EF_RH850_TP_FIX
: strcat (buf
, ", r5 fixed"); break;
3144 case EF_RH850_TP_NOFIX
: strcat (buf
, ", r5 free"); break;
3145 case EF_RH850_REG2_RESERVE
: strcat (buf
, ", r2 fixed"); break;
3146 case EF_RH850_REG2_NORESERVE
: strcat (buf
, ", r2 free"); break;
3153 case EM_CYGNUS_V850
:
3154 switch (e_flags
& EF_V850_ARCH
)
3156 case E_V850E3V5_ARCH
:
3157 strcat (buf
, ", v850e3v5");
3159 case E_V850E2V3_ARCH
:
3160 strcat (buf
, ", v850e2v3");
3163 strcat (buf
, ", v850e2");
3166 strcat (buf
, ", v850e1");
3169 strcat (buf
, ", v850e");
3172 strcat (buf
, ", v850");
3175 strcat (buf
, _(", unknown v850 architecture variant"));
3181 case EM_CYGNUS_M32R
:
3182 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
3183 strcat (buf
, ", m32r");
3187 case EM_MIPS_RS3_LE
:
3188 if (e_flags
& EF_MIPS_NOREORDER
)
3189 strcat (buf
, ", noreorder");
3191 if (e_flags
& EF_MIPS_PIC
)
3192 strcat (buf
, ", pic");
3194 if (e_flags
& EF_MIPS_CPIC
)
3195 strcat (buf
, ", cpic");
3197 if (e_flags
& EF_MIPS_UCODE
)
3198 strcat (buf
, ", ugen_reserved");
3200 if (e_flags
& EF_MIPS_ABI2
)
3201 strcat (buf
, ", abi2");
3203 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
3204 strcat (buf
, ", odk first");
3206 if (e_flags
& EF_MIPS_32BITMODE
)
3207 strcat (buf
, ", 32bitmode");
3209 if (e_flags
& EF_MIPS_NAN2008
)
3210 strcat (buf
, ", nan2008");
3212 if (e_flags
& EF_MIPS_FP64
)
3213 strcat (buf
, ", fp64");
3215 switch ((e_flags
& EF_MIPS_MACH
))
3217 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
3218 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
3219 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
3220 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
3221 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
3222 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
3223 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
3224 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
3225 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
3226 case E_MIPS_MACH_9000
: strcat (buf
, ", 9000"); break;
3227 case E_MIPS_MACH_LS2E
: strcat (buf
, ", loongson-2e"); break;
3228 case E_MIPS_MACH_LS2F
: strcat (buf
, ", loongson-2f"); break;
3229 case E_MIPS_MACH_LS3A
: strcat (buf
, ", loongson-3a"); break;
3230 case E_MIPS_MACH_OCTEON
: strcat (buf
, ", octeon"); break;
3231 case E_MIPS_MACH_OCTEON2
: strcat (buf
, ", octeon2"); break;
3232 case E_MIPS_MACH_OCTEON3
: strcat (buf
, ", octeon3"); break;
3233 case E_MIPS_MACH_XLR
: strcat (buf
, ", xlr"); break;
3235 /* We simply ignore the field in this case to avoid confusion:
3236 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3239 default: strcat (buf
, _(", unknown CPU")); break;
3242 switch ((e_flags
& EF_MIPS_ABI
))
3244 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
3245 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
3246 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
3247 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
3249 /* We simply ignore the field in this case to avoid confusion:
3250 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3251 This means it is likely to be an o32 file, but not for
3254 default: strcat (buf
, _(", unknown ABI")); break;
3257 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
3258 strcat (buf
, ", mdmx");
3260 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
3261 strcat (buf
, ", mips16");
3263 if (e_flags
& EF_MIPS_ARCH_ASE_MICROMIPS
)
3264 strcat (buf
, ", micromips");
3266 switch ((e_flags
& EF_MIPS_ARCH
))
3268 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
3269 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
3270 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
3271 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
3272 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
3273 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
3274 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
3275 case E_MIPS_ARCH_32R6
: strcat (buf
, ", mips32r6"); break;
3276 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
3277 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
3278 case E_MIPS_ARCH_64R6
: strcat (buf
, ", mips64r6"); break;
3279 default: strcat (buf
, _(", unknown ISA")); break;
3284 decode_NDS32_machine_flags (e_flags
, buf
, sizeof buf
);
3288 switch ((e_flags
& EF_SH_MACH_MASK
))
3290 case EF_SH1
: strcat (buf
, ", sh1"); break;
3291 case EF_SH2
: strcat (buf
, ", sh2"); break;
3292 case EF_SH3
: strcat (buf
, ", sh3"); break;
3293 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
3294 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
3295 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
3296 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
3297 case EF_SH4
: strcat (buf
, ", sh4"); break;
3298 case EF_SH5
: strcat (buf
, ", sh5"); break;
3299 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
3300 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
3301 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
3302 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
3303 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
3304 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
3305 case EF_SH3_NOMMU
: strcat (buf
, ", sh3-nommu"); break;
3306 case EF_SH4_NOMMU_NOFPU
: strcat (buf
, ", sh4-nommu-nofpu"); break;
3307 case EF_SH2A_SH4_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3308 case EF_SH2A_SH3_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh3-nommu"); break;
3309 case EF_SH2A_SH4
: strcat (buf
, ", sh2a-or-sh4"); break;
3310 case EF_SH2A_SH3E
: strcat (buf
, ", sh2a-or-sh3e"); break;
3311 default: strcat (buf
, _(", unknown ISA")); break;
3314 if (e_flags
& EF_SH_PIC
)
3315 strcat (buf
, ", pic");
3317 if (e_flags
& EF_SH_FDPIC
)
3318 strcat (buf
, ", fdpic");
3322 if (e_flags
& EF_OR1K_NODELAY
)
3323 strcat (buf
, ", no delay");
3327 if (e_flags
& EF_SPARC_32PLUS
)
3328 strcat (buf
, ", v8+");
3330 if (e_flags
& EF_SPARC_SUN_US1
)
3331 strcat (buf
, ", ultrasparcI");
3333 if (e_flags
& EF_SPARC_SUN_US3
)
3334 strcat (buf
, ", ultrasparcIII");
3336 if (e_flags
& EF_SPARC_HAL_R1
)
3337 strcat (buf
, ", halr1");
3339 if (e_flags
& EF_SPARC_LEDATA
)
3340 strcat (buf
, ", ledata");
3342 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
3343 strcat (buf
, ", tso");
3345 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
3346 strcat (buf
, ", pso");
3348 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
3349 strcat (buf
, ", rmo");
3353 switch (e_flags
& EF_PARISC_ARCH
)
3355 case EFA_PARISC_1_0
:
3356 strcpy (buf
, ", PA-RISC 1.0");
3358 case EFA_PARISC_1_1
:
3359 strcpy (buf
, ", PA-RISC 1.1");
3361 case EFA_PARISC_2_0
:
3362 strcpy (buf
, ", PA-RISC 2.0");
3367 if (e_flags
& EF_PARISC_TRAPNIL
)
3368 strcat (buf
, ", trapnil");
3369 if (e_flags
& EF_PARISC_EXT
)
3370 strcat (buf
, ", ext");
3371 if (e_flags
& EF_PARISC_LSB
)
3372 strcat (buf
, ", lsb");
3373 if (e_flags
& EF_PARISC_WIDE
)
3374 strcat (buf
, ", wide");
3375 if (e_flags
& EF_PARISC_NO_KABP
)
3376 strcat (buf
, ", no kabp");
3377 if (e_flags
& EF_PARISC_LAZYSWAP
)
3378 strcat (buf
, ", lazyswap");
3383 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
3384 strcat (buf
, ", new calling convention");
3386 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
3387 strcat (buf
, ", gnu calling convention");
3391 if ((e_flags
& EF_IA_64_ABI64
))
3392 strcat (buf
, ", 64-bit");
3394 strcat (buf
, ", 32-bit");
3395 if ((e_flags
& EF_IA_64_REDUCEDFP
))
3396 strcat (buf
, ", reduced fp model");
3397 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
3398 strcat (buf
, ", no function descriptors, constant gp");
3399 else if ((e_flags
& EF_IA_64_CONS_GP
))
3400 strcat (buf
, ", constant gp");
3401 if ((e_flags
& EF_IA_64_ABSOLUTE
))
3402 strcat (buf
, ", absolute");
3403 if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_OPENVMS
)
3405 if ((e_flags
& EF_IA_64_VMS_LINKAGES
))
3406 strcat (buf
, ", vms_linkages");
3407 switch ((e_flags
& EF_IA_64_VMS_COMCOD
))
3409 case EF_IA_64_VMS_COMCOD_SUCCESS
:
3411 case EF_IA_64_VMS_COMCOD_WARNING
:
3412 strcat (buf
, ", warning");
3414 case EF_IA_64_VMS_COMCOD_ERROR
:
3415 strcat (buf
, ", error");
3417 case EF_IA_64_VMS_COMCOD_ABORT
:
3418 strcat (buf
, ", abort");
3421 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3422 e_flags
& EF_IA_64_VMS_COMCOD
);
3423 strcat (buf
, ", <unknown>");
3429 if ((e_flags
& EF_VAX_NONPIC
))
3430 strcat (buf
, ", non-PIC");
3431 if ((e_flags
& EF_VAX_DFLOAT
))
3432 strcat (buf
, ", D-Float");
3433 if ((e_flags
& EF_VAX_GFLOAT
))
3434 strcat (buf
, ", G-Float");
3438 if (e_flags
& EF_VISIUM_ARCH_MCM
)
3439 strcat (buf
, ", mcm");
3440 else if (e_flags
& EF_VISIUM_ARCH_MCM24
)
3441 strcat (buf
, ", mcm24");
3442 if (e_flags
& EF_VISIUM_ARCH_GR6
)
3443 strcat (buf
, ", gr6");
3447 switch (e_flags
& E_FLAG_RL78_CPU_MASK
)
3449 case E_FLAG_RL78_ANY_CPU
: break;
3450 case E_FLAG_RL78_G10
: strcat (buf
, ", G10"); break;
3451 case E_FLAG_RL78_G13
: strcat (buf
, ", G13"); break;
3452 case E_FLAG_RL78_G14
: strcat (buf
, ", G14"); break;
3454 if (e_flags
& E_FLAG_RL78_64BIT_DOUBLES
)
3455 strcat (buf
, ", 64-bit doubles");
3459 if (e_flags
& E_FLAG_RX_64BIT_DOUBLES
)
3460 strcat (buf
, ", 64-bit doubles");
3461 if (e_flags
& E_FLAG_RX_DSP
)
3462 strcat (buf
, ", dsp");
3463 if (e_flags
& E_FLAG_RX_PID
)
3464 strcat (buf
, ", pid");
3465 if (e_flags
& E_FLAG_RX_ABI
)
3466 strcat (buf
, ", RX ABI");
3467 if (e_flags
& E_FLAG_RX_SINSNS_SET
)
3468 strcat (buf
, e_flags
& E_FLAG_RX_SINSNS_YES
3469 ? ", uses String instructions" : ", bans String instructions");
3470 if (e_flags
& E_FLAG_RX_V2
)
3471 strcat (buf
, ", V2");
3475 if (e_flags
& EF_S390_HIGH_GPRS
)
3476 strcat (buf
, ", highgprs");
3480 if ((e_flags
& EF_C6000_REL
))
3481 strcat (buf
, ", relocatable module");
3485 strcat (buf
, _(": architecture variant: "));
3486 switch (e_flags
& EF_MSP430_MACH
)
3488 case E_MSP430_MACH_MSP430x11
: strcat (buf
, "MSP430x11"); break;
3489 case E_MSP430_MACH_MSP430x11x1
: strcat (buf
, "MSP430x11x1 "); break;
3490 case E_MSP430_MACH_MSP430x12
: strcat (buf
, "MSP430x12"); break;
3491 case E_MSP430_MACH_MSP430x13
: strcat (buf
, "MSP430x13"); break;
3492 case E_MSP430_MACH_MSP430x14
: strcat (buf
, "MSP430x14"); break;
3493 case E_MSP430_MACH_MSP430x15
: strcat (buf
, "MSP430x15"); break;
3494 case E_MSP430_MACH_MSP430x16
: strcat (buf
, "MSP430x16"); break;
3495 case E_MSP430_MACH_MSP430x31
: strcat (buf
, "MSP430x31"); break;
3496 case E_MSP430_MACH_MSP430x32
: strcat (buf
, "MSP430x32"); break;
3497 case E_MSP430_MACH_MSP430x33
: strcat (buf
, "MSP430x33"); break;
3498 case E_MSP430_MACH_MSP430x41
: strcat (buf
, "MSP430x41"); break;
3499 case E_MSP430_MACH_MSP430x42
: strcat (buf
, "MSP430x42"); break;
3500 case E_MSP430_MACH_MSP430x43
: strcat (buf
, "MSP430x43"); break;
3501 case E_MSP430_MACH_MSP430x44
: strcat (buf
, "MSP430x44"); break;
3502 case E_MSP430_MACH_MSP430X
: strcat (buf
, "MSP430X"); break;
3504 strcat (buf
, _(": unknown")); break;
3507 if (e_flags
& ~ EF_MSP430_MACH
)
3508 strcat (buf
, _(": unknown extra flag bits also present"));
3516 get_osabi_name (unsigned int osabi
)
3518 static char buff
[32];
3522 case ELFOSABI_NONE
: return "UNIX - System V";
3523 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
3524 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
3525 case ELFOSABI_GNU
: return "UNIX - GNU";
3526 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
3527 case ELFOSABI_AIX
: return "UNIX - AIX";
3528 case ELFOSABI_IRIX
: return "UNIX - IRIX";
3529 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
3530 case ELFOSABI_TRU64
: return "UNIX - TRU64";
3531 case ELFOSABI_MODESTO
: return "Novell - Modesto";
3532 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
3533 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
3534 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
3535 case ELFOSABI_AROS
: return "AROS";
3536 case ELFOSABI_FENIXOS
: return "FenixOS";
3539 switch (elf_header
.e_machine
)
3544 case ELFOSABI_ARM
: return "ARM";
3555 case ELFOSABI_STANDALONE
: return _("Standalone App");
3564 case ELFOSABI_C6000_ELFABI
: return _("Bare-metal C6000");
3565 case ELFOSABI_C6000_LINUX
: return "Linux C6000";
3574 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), osabi
);
3580 get_aarch64_segment_type (unsigned long type
)
3584 case PT_AARCH64_ARCHEXT
:
3585 return "AARCH64_ARCHEXT";
3594 get_arm_segment_type (unsigned long type
)
3608 get_mips_segment_type (unsigned long type
)
3612 case PT_MIPS_REGINFO
:
3614 case PT_MIPS_RTPROC
:
3616 case PT_MIPS_OPTIONS
:
3618 case PT_MIPS_ABIFLAGS
:
3628 get_parisc_segment_type (unsigned long type
)
3632 case PT_HP_TLS
: return "HP_TLS";
3633 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
3634 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
3635 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
3636 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
3637 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
3638 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
3639 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
3640 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
3641 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
3642 case PT_HP_PARALLEL
: return "HP_PARALLEL";
3643 case PT_HP_FASTBIND
: return "HP_FASTBIND";
3644 case PT_HP_OPT_ANNOT
: return "HP_OPT_ANNOT";
3645 case PT_HP_HSL_ANNOT
: return "HP_HSL_ANNOT";
3646 case PT_HP_STACK
: return "HP_STACK";
3647 case PT_HP_CORE_UTSNAME
: return "HP_CORE_UTSNAME";
3648 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
3649 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
3650 case PT_PARISC_WEAKORDER
: return "PARISC_WEAKORDER";
3659 get_ia64_segment_type (unsigned long type
)
3663 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
3664 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
3665 case PT_HP_TLS
: return "HP_TLS";
3666 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
3667 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
3668 case PT_IA_64_HP_STACK
: return "HP_STACK";
3677 get_tic6x_segment_type (unsigned long type
)
3681 case PT_C6000_PHATTR
: return "C6000_PHATTR";
3690 get_solaris_segment_type (unsigned long type
)
3694 case 0x6464e550: return "PT_SUNW_UNWIND";
3695 case 0x6474e550: return "PT_SUNW_EH_FRAME";
3696 case 0x6ffffff7: return "PT_LOSUNW";
3697 case 0x6ffffffa: return "PT_SUNWBSS";
3698 case 0x6ffffffb: return "PT_SUNWSTACK";
3699 case 0x6ffffffc: return "PT_SUNWDTRACE";
3700 case 0x6ffffffd: return "PT_SUNWCAP";
3701 case 0x6fffffff: return "PT_HISUNW";
3702 default: return NULL
;
3707 get_segment_type (unsigned long p_type
)
3709 static char buff
[32];
3713 case PT_NULL
: return "NULL";
3714 case PT_LOAD
: return "LOAD";
3715 case PT_DYNAMIC
: return "DYNAMIC";
3716 case PT_INTERP
: return "INTERP";
3717 case PT_NOTE
: return "NOTE";
3718 case PT_SHLIB
: return "SHLIB";
3719 case PT_PHDR
: return "PHDR";
3720 case PT_TLS
: return "TLS";
3722 case PT_GNU_EH_FRAME
:
3723 return "GNU_EH_FRAME";
3724 case PT_GNU_STACK
: return "GNU_STACK";
3725 case PT_GNU_RELRO
: return "GNU_RELRO";
3728 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
3730 const char * result
;
3732 switch (elf_header
.e_machine
)
3735 result
= get_aarch64_segment_type (p_type
);
3738 result
= get_arm_segment_type (p_type
);
3741 case EM_MIPS_RS3_LE
:
3742 result
= get_mips_segment_type (p_type
);
3745 result
= get_parisc_segment_type (p_type
);
3748 result
= get_ia64_segment_type (p_type
);
3751 result
= get_tic6x_segment_type (p_type
);
3761 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
3763 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
3765 const char * result
;
3767 switch (elf_header
.e_machine
)
3770 result
= get_parisc_segment_type (p_type
);
3773 result
= get_ia64_segment_type (p_type
);
3776 if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_SOLARIS
)
3777 result
= get_solaris_segment_type (p_type
);
3786 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
3789 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), p_type
);
3796 get_mips_section_type_name (unsigned int sh_type
)
3800 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
3801 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
3802 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
3803 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
3804 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
3805 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
3806 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
3807 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
3808 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
3809 case SHT_MIPS_RELD
: return "MIPS_RELD";
3810 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
3811 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
3812 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
3813 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
3814 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
3815 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
3816 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
3817 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
3818 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
3819 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
3820 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
3821 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
3822 case SHT_MIPS_LINE
: return "MIPS_LINE";
3823 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
3824 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
3825 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
3826 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
3827 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
3828 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
3829 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
3830 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
3831 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
3832 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
3833 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
3834 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
3835 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
3836 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
3837 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
3838 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
3839 case SHT_MIPS_ABIFLAGS
: return "MIPS_ABIFLAGS";
3847 get_parisc_section_type_name (unsigned int sh_type
)
3851 case SHT_PARISC_EXT
: return "PARISC_EXT";
3852 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
3853 case SHT_PARISC_DOC
: return "PARISC_DOC";
3854 case SHT_PARISC_ANNOT
: return "PARISC_ANNOT";
3855 case SHT_PARISC_SYMEXTN
: return "PARISC_SYMEXTN";
3856 case SHT_PARISC_STUBS
: return "PARISC_STUBS";
3857 case SHT_PARISC_DLKM
: return "PARISC_DLKM";
3865 get_ia64_section_type_name (unsigned int sh_type
)
3867 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
3868 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
3869 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
3873 case SHT_IA_64_EXT
: return "IA_64_EXT";
3874 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
3875 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
3876 case SHT_IA_64_VMS_TRACE
: return "VMS_TRACE";
3877 case SHT_IA_64_VMS_TIE_SIGNATURES
: return "VMS_TIE_SIGNATURES";
3878 case SHT_IA_64_VMS_DEBUG
: return "VMS_DEBUG";
3879 case SHT_IA_64_VMS_DEBUG_STR
: return "VMS_DEBUG_STR";
3880 case SHT_IA_64_VMS_LINKAGES
: return "VMS_LINKAGES";
3881 case SHT_IA_64_VMS_SYMBOL_VECTOR
: return "VMS_SYMBOL_VECTOR";
3882 case SHT_IA_64_VMS_FIXUP
: return "VMS_FIXUP";
3890 get_x86_64_section_type_name (unsigned int sh_type
)
3894 case SHT_X86_64_UNWIND
: return "X86_64_UNWIND";
3902 get_aarch64_section_type_name (unsigned int sh_type
)
3906 case SHT_AARCH64_ATTRIBUTES
:
3907 return "AARCH64_ATTRIBUTES";
3915 get_arm_section_type_name (unsigned int sh_type
)
3919 case SHT_ARM_EXIDX
: return "ARM_EXIDX";
3920 case SHT_ARM_PREEMPTMAP
: return "ARM_PREEMPTMAP";
3921 case SHT_ARM_ATTRIBUTES
: return "ARM_ATTRIBUTES";
3922 case SHT_ARM_DEBUGOVERLAY
: return "ARM_DEBUGOVERLAY";
3923 case SHT_ARM_OVERLAYSECTION
: return "ARM_OVERLAYSECTION";
3931 get_tic6x_section_type_name (unsigned int sh_type
)
3935 case SHT_C6000_UNWIND
:
3936 return "C6000_UNWIND";
3937 case SHT_C6000_PREEMPTMAP
:
3938 return "C6000_PREEMPTMAP";
3939 case SHT_C6000_ATTRIBUTES
:
3940 return "C6000_ATTRIBUTES";
3945 case SHT_TI_HANDLER
:
3946 return "TI_HANDLER";
3947 case SHT_TI_INITINFO
:
3948 return "TI_INITINFO";
3949 case SHT_TI_PHATTRS
:
3950 return "TI_PHATTRS";
3958 get_msp430x_section_type_name (unsigned int sh_type
)
3962 case SHT_MSP430_SEC_FLAGS
: return "MSP430_SEC_FLAGS";
3963 case SHT_MSP430_SYM_ALIASES
: return "MSP430_SYM_ALIASES";
3964 case SHT_MSP430_ATTRIBUTES
: return "MSP430_ATTRIBUTES";
3965 default: return NULL
;
3970 get_v850_section_type_name (unsigned int sh_type
)
3974 case SHT_V850_SCOMMON
: return "V850 Small Common";
3975 case SHT_V850_TCOMMON
: return "V850 Tiny Common";
3976 case SHT_V850_ZCOMMON
: return "V850 Zero Common";
3977 case SHT_RENESAS_IOP
: return "RENESAS IOP";
3978 case SHT_RENESAS_INFO
: return "RENESAS INFO";
3979 default: return NULL
;
3984 get_section_type_name (unsigned int sh_type
)
3986 static char buff
[32];
3987 const char * result
;
3991 case SHT_NULL
: return "NULL";
3992 case SHT_PROGBITS
: return "PROGBITS";
3993 case SHT_SYMTAB
: return "SYMTAB";
3994 case SHT_STRTAB
: return "STRTAB";
3995 case SHT_RELA
: return "RELA";
3996 case SHT_HASH
: return "HASH";
3997 case SHT_DYNAMIC
: return "DYNAMIC";
3998 case SHT_NOTE
: return "NOTE";
3999 case SHT_NOBITS
: return "NOBITS";
4000 case SHT_REL
: return "REL";
4001 case SHT_SHLIB
: return "SHLIB";
4002 case SHT_DYNSYM
: return "DYNSYM";
4003 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
4004 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
4005 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
4006 case SHT_GNU_HASH
: return "GNU_HASH";
4007 case SHT_GROUP
: return "GROUP";
4008 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
4009 case SHT_GNU_verdef
: return "VERDEF";
4010 case SHT_GNU_verneed
: return "VERNEED";
4011 case SHT_GNU_versym
: return "VERSYM";
4012 case 0x6ffffff0: return "VERSYM";
4013 case 0x6ffffffc: return "VERDEF";
4014 case 0x7ffffffd: return "AUXILIARY";
4015 case 0x7fffffff: return "FILTER";
4016 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
4019 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
4021 switch (elf_header
.e_machine
)
4024 case EM_MIPS_RS3_LE
:
4025 result
= get_mips_section_type_name (sh_type
);
4028 result
= get_parisc_section_type_name (sh_type
);
4031 result
= get_ia64_section_type_name (sh_type
);
4036 result
= get_x86_64_section_type_name (sh_type
);
4039 result
= get_aarch64_section_type_name (sh_type
);
4042 result
= get_arm_section_type_name (sh_type
);
4045 result
= get_tic6x_section_type_name (sh_type
);
4048 result
= get_msp430x_section_type_name (sh_type
);
4052 case EM_CYGNUS_V850
:
4053 result
= get_v850_section_type_name (sh_type
);
4063 sprintf (buff
, "LOPROC+%#x", sh_type
- SHT_LOPROC
);
4065 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
4067 switch (elf_header
.e_machine
)
4070 result
= get_ia64_section_type_name (sh_type
);
4073 if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_SOLARIS
)
4074 result
= get_solaris_section_type (sh_type
);
4083 sprintf (buff
, "LOOS+%#x", sh_type
- SHT_LOOS
);
4085 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
4087 switch (elf_header
.e_machine
)
4091 case EM_CYGNUS_V850
:
4092 result
= get_v850_section_type_name (sh_type
);
4102 sprintf (buff
, "LOUSER+%#x", sh_type
- SHT_LOUSER
);
4105 /* This message is probably going to be displayed in a 15
4106 character wide field, so put the hex value first. */
4107 snprintf (buff
, sizeof (buff
), _("%08x: <unknown>"), sh_type
);
4113 #define OPTION_DEBUG_DUMP 512
4114 #define OPTION_DYN_SYMS 513
4115 #define OPTION_DWARF_DEPTH 514
4116 #define OPTION_DWARF_START 515
4117 #define OPTION_DWARF_CHECK 516
4119 static struct option options
[] =
4121 {"all", no_argument
, 0, 'a'},
4122 {"file-header", no_argument
, 0, 'h'},
4123 {"program-headers", no_argument
, 0, 'l'},
4124 {"headers", no_argument
, 0, 'e'},
4125 {"histogram", no_argument
, 0, 'I'},
4126 {"segments", no_argument
, 0, 'l'},
4127 {"sections", no_argument
, 0, 'S'},
4128 {"section-headers", no_argument
, 0, 'S'},
4129 {"section-groups", no_argument
, 0, 'g'},
4130 {"section-details", no_argument
, 0, 't'},
4131 {"full-section-name",no_argument
, 0, 'N'},
4132 {"symbols", no_argument
, 0, 's'},
4133 {"syms", no_argument
, 0, 's'},
4134 {"dyn-syms", no_argument
, 0, OPTION_DYN_SYMS
},
4135 {"relocs", no_argument
, 0, 'r'},
4136 {"notes", no_argument
, 0, 'n'},
4137 {"dynamic", no_argument
, 0, 'd'},
4138 {"arch-specific", no_argument
, 0, 'A'},
4139 {"version-info", no_argument
, 0, 'V'},
4140 {"use-dynamic", no_argument
, 0, 'D'},
4141 {"unwind", no_argument
, 0, 'u'},
4142 {"archive-index", no_argument
, 0, 'c'},
4143 {"hex-dump", required_argument
, 0, 'x'},
4144 {"relocated-dump", required_argument
, 0, 'R'},
4145 {"string-dump", required_argument
, 0, 'p'},
4146 {"decompress", no_argument
, 0, 'z'},
4147 #ifdef SUPPORT_DISASSEMBLY
4148 {"instruction-dump", required_argument
, 0, 'i'},
4150 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
4152 {"dwarf-depth", required_argument
, 0, OPTION_DWARF_DEPTH
},
4153 {"dwarf-start", required_argument
, 0, OPTION_DWARF_START
},
4154 {"dwarf-check", no_argument
, 0, OPTION_DWARF_CHECK
},
4156 {"version", no_argument
, 0, 'v'},
4157 {"wide", no_argument
, 0, 'W'},
4158 {"help", no_argument
, 0, 'H'},
4159 {0, no_argument
, 0, 0}
4163 usage (FILE * stream
)
4165 fprintf (stream
, _("Usage: readelf <option(s)> elf-file(s)\n"));
4166 fprintf (stream
, _(" Display information about the contents of ELF format files\n"));
4167 fprintf (stream
, _(" Options are:\n\
4168 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4169 -h --file-header Display the ELF file header\n\
4170 -l --program-headers Display the program headers\n\
4171 --segments An alias for --program-headers\n\
4172 -S --section-headers Display the sections' header\n\
4173 --sections An alias for --section-headers\n\
4174 -g --section-groups Display the section groups\n\
4175 -t --section-details Display the section details\n\
4176 -e --headers Equivalent to: -h -l -S\n\
4177 -s --syms Display the symbol table\n\
4178 --symbols An alias for --syms\n\
4179 --dyn-syms Display the dynamic symbol table\n\
4180 -n --notes Display the core notes (if present)\n\
4181 -r --relocs Display the relocations (if present)\n\
4182 -u --unwind Display the unwind info (if present)\n\
4183 -d --dynamic Display the dynamic section (if present)\n\
4184 -V --version-info Display the version sections (if present)\n\
4185 -A --arch-specific Display architecture specific information (if any)\n\
4186 -c --archive-index Display the symbol/file index in an archive\n\
4187 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
4188 -x --hex-dump=<number|name>\n\
4189 Dump the contents of section <number|name> as bytes\n\
4190 -p --string-dump=<number|name>\n\
4191 Dump the contents of section <number|name> as strings\n\
4192 -R --relocated-dump=<number|name>\n\
4193 Dump the contents of section <number|name> as relocated bytes\n\
4194 -z --decompress Decompress section before dumping it\n\
4195 -w[lLiaprmfFsoRt] or\n\
4196 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4197 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4198 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4200 Display the contents of DWARF2 debug sections\n"));
4201 fprintf (stream
, _("\
4202 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4203 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4205 #ifdef SUPPORT_DISASSEMBLY
4206 fprintf (stream
, _("\
4207 -i --instruction-dump=<number|name>\n\
4208 Disassemble the contents of section <number|name>\n"));
4210 fprintf (stream
, _("\
4211 -I --histogram Display histogram of bucket list lengths\n\
4212 -W --wide Allow output width to exceed 80 characters\n\
4213 @<file> Read options from <file>\n\
4214 -H --help Display this information\n\
4215 -v --version Display the version number of readelf\n"));
4217 if (REPORT_BUGS_TO
[0] && stream
== stdout
)
4218 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
4220 exit (stream
== stdout
? 0 : 1);
4223 /* Record the fact that the user wants the contents of section number
4224 SECTION to be displayed using the method(s) encoded as flags bits
4225 in TYPE. Note, TYPE can be zero if we are creating the array for
4229 request_dump_bynumber (unsigned int section
, dump_type type
)
4231 if (section
>= num_dump_sects
)
4233 dump_type
* new_dump_sects
;
4235 new_dump_sects
= (dump_type
*) calloc (section
+ 1,
4236 sizeof (* dump_sects
));
4238 if (new_dump_sects
== NULL
)
4239 error (_("Out of memory allocating dump request table.\n"));
4244 /* Copy current flag settings. */
4245 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
* sizeof (* dump_sects
));
4250 dump_sects
= new_dump_sects
;
4251 num_dump_sects
= section
+ 1;
4256 dump_sects
[section
] |= type
;
4261 /* Request a dump by section name. */
4264 request_dump_byname (const char * section
, dump_type type
)
4266 struct dump_list_entry
* new_request
;
4268 new_request
= (struct dump_list_entry
*)
4269 malloc (sizeof (struct dump_list_entry
));
4271 error (_("Out of memory allocating dump request table.\n"));
4273 new_request
->name
= strdup (section
);
4274 if (!new_request
->name
)
4275 error (_("Out of memory allocating dump request table.\n"));
4277 new_request
->type
= type
;
4279 new_request
->next
= dump_sects_byname
;
4280 dump_sects_byname
= new_request
;
4284 request_dump (dump_type type
)
4290 section
= strtoul (optarg
, & cp
, 0);
4292 if (! *cp
&& section
>= 0)
4293 request_dump_bynumber (section
, type
);
4295 request_dump_byname (optarg
, type
);
4300 parse_args (int argc
, char ** argv
)
4307 while ((c
= getopt_long
4308 (argc
, argv
, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options
, NULL
)) != EOF
)
4326 do_section_groups
++;
4334 do_section_groups
++;
4339 do_section_details
++;
4383 request_dump (HEX_DUMP
);
4386 request_dump (STRING_DUMP
);
4389 request_dump (RELOC_DUMP
);
4399 dwarf_select_sections_all ();
4404 dwarf_select_sections_by_letters (optarg
);
4407 case OPTION_DEBUG_DUMP
:
4414 dwarf_select_sections_by_names (optarg
);
4417 case OPTION_DWARF_DEPTH
:
4421 dwarf_cutoff_level
= strtoul (optarg
, & cp
, 0);
4424 case OPTION_DWARF_START
:
4428 dwarf_start_die
= strtoul (optarg
, & cp
, 0);
4431 case OPTION_DWARF_CHECK
:
4434 case OPTION_DYN_SYMS
:
4437 #ifdef SUPPORT_DISASSEMBLY
4439 request_dump (DISASS_DUMP
);
4443 print_version (program_name
);
4452 /* xgettext:c-format */
4453 error (_("Invalid option '-%c'\n"), c
);
4460 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
4461 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
4462 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
4463 && !do_section_groups
&& !do_archive_index
4469 get_elf_class (unsigned int elf_class
)
4471 static char buff
[32];
4475 case ELFCLASSNONE
: return _("none");
4476 case ELFCLASS32
: return "ELF32";
4477 case ELFCLASS64
: return "ELF64";
4479 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), elf_class
);
4485 get_data_encoding (unsigned int encoding
)
4487 static char buff
[32];
4491 case ELFDATANONE
: return _("none");
4492 case ELFDATA2LSB
: return _("2's complement, little endian");
4493 case ELFDATA2MSB
: return _("2's complement, big endian");
4495 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), encoding
);
4500 /* Decode the data held in 'elf_header'. */
4503 process_file_header (void)
4505 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
4506 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
4507 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
4508 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
4511 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4515 init_dwarf_regnames (elf_header
.e_machine
);
4521 printf (_("ELF Header:\n"));
4522 printf (_(" Magic: "));
4523 for (i
= 0; i
< EI_NIDENT
; i
++)
4524 printf ("%2.2x ", elf_header
.e_ident
[i
]);
4526 printf (_(" Class: %s\n"),
4527 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
4528 printf (_(" Data: %s\n"),
4529 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
4530 printf (_(" Version: %d %s\n"),
4531 elf_header
.e_ident
[EI_VERSION
],
4532 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
4534 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
4535 ? _("<unknown: %lx>")
4537 printf (_(" OS/ABI: %s\n"),
4538 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
4539 printf (_(" ABI Version: %d\n"),
4540 elf_header
.e_ident
[EI_ABIVERSION
]);
4541 printf (_(" Type: %s\n"),
4542 get_file_type (elf_header
.e_type
));
4543 printf (_(" Machine: %s\n"),
4544 get_machine_name (elf_header
.e_machine
));
4545 printf (_(" Version: 0x%lx\n"),
4546 (unsigned long) elf_header
.e_version
);
4548 printf (_(" Entry point address: "));
4549 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
4550 printf (_("\n Start of program headers: "));
4551 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
4552 printf (_(" (bytes into file)\n Start of section headers: "));
4553 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
4554 printf (_(" (bytes into file)\n"));
4556 printf (_(" Flags: 0x%lx%s\n"),
4557 (unsigned long) elf_header
.e_flags
,
4558 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
4559 printf (_(" Size of this header: %ld (bytes)\n"),
4560 (long) elf_header
.e_ehsize
);
4561 printf (_(" Size of program headers: %ld (bytes)\n"),
4562 (long) elf_header
.e_phentsize
);
4563 printf (_(" Number of program headers: %ld"),
4564 (long) elf_header
.e_phnum
);
4565 if (section_headers
!= NULL
4566 && elf_header
.e_phnum
== PN_XNUM
4567 && section_headers
[0].sh_info
!= 0)
4568 printf (" (%ld)", (long) section_headers
[0].sh_info
);
4569 putc ('\n', stdout
);
4570 printf (_(" Size of section headers: %ld (bytes)\n"),
4571 (long) elf_header
.e_shentsize
);
4572 printf (_(" Number of section headers: %ld"),
4573 (long) elf_header
.e_shnum
);
4574 if (section_headers
!= NULL
&& elf_header
.e_shnum
== SHN_UNDEF
)
4575 printf (" (%ld)", (long) section_headers
[0].sh_size
);
4576 putc ('\n', stdout
);
4577 printf (_(" Section header string table index: %ld"),
4578 (long) elf_header
.e_shstrndx
);
4579 if (section_headers
!= NULL
4580 && elf_header
.e_shstrndx
== (SHN_XINDEX
& 0xffff))
4581 printf (" (%u)", section_headers
[0].sh_link
);
4582 else if (elf_header
.e_shstrndx
!= SHN_UNDEF
4583 && elf_header
.e_shstrndx
>= elf_header
.e_shnum
)
4584 printf (_(" <corrupt: out of range>"));
4585 putc ('\n', stdout
);
4588 if (section_headers
!= NULL
)
4590 if (elf_header
.e_phnum
== PN_XNUM
4591 && section_headers
[0].sh_info
!= 0)
4592 elf_header
.e_phnum
= section_headers
[0].sh_info
;
4593 if (elf_header
.e_shnum
== SHN_UNDEF
)
4594 elf_header
.e_shnum
= section_headers
[0].sh_size
;
4595 if (elf_header
.e_shstrndx
== (SHN_XINDEX
& 0xffff))
4596 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
4597 else if (elf_header
.e_shstrndx
>= elf_header
.e_shnum
)
4598 elf_header
.e_shstrndx
= SHN_UNDEF
;
4599 free (section_headers
);
4600 section_headers
= NULL
;
4607 get_32bit_program_headers (FILE * file
, Elf_Internal_Phdr
* pheaders
)
4609 Elf32_External_Phdr
* phdrs
;
4610 Elf32_External_Phdr
* external
;
4611 Elf_Internal_Phdr
* internal
;
4613 unsigned int size
= elf_header
.e_phentsize
;
4614 unsigned int num
= elf_header
.e_phnum
;
4616 /* PR binutils/17531: Cope with unexpected section header sizes. */
4617 if (size
== 0 || num
== 0)
4619 if (size
< sizeof * phdrs
)
4621 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4624 if (size
> sizeof * phdrs
)
4625 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4627 phdrs
= (Elf32_External_Phdr
*) get_data (NULL
, file
, elf_header
.e_phoff
,
4628 size
, num
, _("program headers"));
4632 for (i
= 0, internal
= pheaders
, external
= phdrs
;
4633 i
< elf_header
.e_phnum
;
4634 i
++, internal
++, external
++)
4636 internal
->p_type
= BYTE_GET (external
->p_type
);
4637 internal
->p_offset
= BYTE_GET (external
->p_offset
);
4638 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
4639 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
4640 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
4641 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
4642 internal
->p_flags
= BYTE_GET (external
->p_flags
);
4643 internal
->p_align
= BYTE_GET (external
->p_align
);
4651 get_64bit_program_headers (FILE * file
, Elf_Internal_Phdr
* pheaders
)
4653 Elf64_External_Phdr
* phdrs
;
4654 Elf64_External_Phdr
* external
;
4655 Elf_Internal_Phdr
* internal
;
4657 unsigned int size
= elf_header
.e_phentsize
;
4658 unsigned int num
= elf_header
.e_phnum
;
4660 /* PR binutils/17531: Cope with unexpected section header sizes. */
4661 if (size
== 0 || num
== 0)
4663 if (size
< sizeof * phdrs
)
4665 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4668 if (size
> sizeof * phdrs
)
4669 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4671 phdrs
= (Elf64_External_Phdr
*) get_data (NULL
, file
, elf_header
.e_phoff
,
4672 size
, num
, _("program headers"));
4676 for (i
= 0, internal
= pheaders
, external
= phdrs
;
4677 i
< elf_header
.e_phnum
;
4678 i
++, internal
++, external
++)
4680 internal
->p_type
= BYTE_GET (external
->p_type
);
4681 internal
->p_flags
= BYTE_GET (external
->p_flags
);
4682 internal
->p_offset
= BYTE_GET (external
->p_offset
);
4683 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
4684 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
4685 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
4686 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
4687 internal
->p_align
= BYTE_GET (external
->p_align
);
4694 /* Returns 1 if the program headers were read into `program_headers'. */
4697 get_program_headers (FILE * file
)
4699 Elf_Internal_Phdr
* phdrs
;
4701 /* Check cache of prior read. */
4702 if (program_headers
!= NULL
)
4705 phdrs
= (Elf_Internal_Phdr
*) cmalloc (elf_header
.e_phnum
,
4706 sizeof (Elf_Internal_Phdr
));
4710 error (_("Out of memory reading %u program headers\n"),
4711 elf_header
.e_phnum
);
4716 ? get_32bit_program_headers (file
, phdrs
)
4717 : get_64bit_program_headers (file
, phdrs
))
4719 program_headers
= phdrs
;
4727 /* Returns 1 if the program headers were loaded. */
4730 process_program_headers (FILE * file
)
4732 Elf_Internal_Phdr
* segment
;
4735 if (elf_header
.e_phnum
== 0)
4737 /* PR binutils/12467. */
4738 if (elf_header
.e_phoff
!= 0)
4739 warn (_("possibly corrupt ELF header - it has a non-zero program"
4740 " header offset, but no program headers\n"));
4741 else if (do_segments
)
4742 printf (_("\nThere are no program headers in this file.\n"));
4746 if (do_segments
&& !do_header
)
4748 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
4749 printf (_("Entry point "));
4750 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
4751 printf (_("\nThere are %d program headers, starting at offset "),
4752 elf_header
.e_phnum
);
4753 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
4757 if (! get_program_headers (file
))
4762 if (elf_header
.e_phnum
> 1)
4763 printf (_("\nProgram Headers:\n"));
4765 printf (_("\nProgram Headers:\n"));
4769 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4772 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4776 (_(" Type Offset VirtAddr PhysAddr\n"));
4778 (_(" FileSiz MemSiz Flags Align\n"));
4785 for (i
= 0, segment
= program_headers
;
4786 i
< elf_header
.e_phnum
;
4791 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
4795 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
4796 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
4797 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
4798 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
4799 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
4801 (segment
->p_flags
& PF_R
? 'R' : ' '),
4802 (segment
->p_flags
& PF_W
? 'W' : ' '),
4803 (segment
->p_flags
& PF_X
? 'E' : ' '));
4804 printf ("%#lx", (unsigned long) segment
->p_align
);
4808 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
4809 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
4812 print_vma (segment
->p_offset
, FULL_HEX
);
4816 print_vma (segment
->p_vaddr
, FULL_HEX
);
4818 print_vma (segment
->p_paddr
, FULL_HEX
);
4821 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
4822 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
4825 print_vma (segment
->p_filesz
, FULL_HEX
);
4829 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
4830 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
4833 print_vma (segment
->p_memsz
, FULL_HEX
);
4837 (segment
->p_flags
& PF_R
? 'R' : ' '),
4838 (segment
->p_flags
& PF_W
? 'W' : ' '),
4839 (segment
->p_flags
& PF_X
? 'E' : ' '));
4841 if ((unsigned long) segment
->p_align
== segment
->p_align
)
4842 printf ("%#lx", (unsigned long) segment
->p_align
);
4845 print_vma (segment
->p_align
, PREFIX_HEX
);
4850 print_vma (segment
->p_offset
, FULL_HEX
);
4852 print_vma (segment
->p_vaddr
, FULL_HEX
);
4854 print_vma (segment
->p_paddr
, FULL_HEX
);
4856 print_vma (segment
->p_filesz
, FULL_HEX
);
4858 print_vma (segment
->p_memsz
, FULL_HEX
);
4860 (segment
->p_flags
& PF_R
? 'R' : ' '),
4861 (segment
->p_flags
& PF_W
? 'W' : ' '),
4862 (segment
->p_flags
& PF_X
? 'E' : ' '));
4863 print_vma (segment
->p_align
, HEX
);
4868 putc ('\n', stdout
);
4870 switch (segment
->p_type
)
4874 error (_("more than one dynamic segment\n"));
4876 /* By default, assume that the .dynamic section is the first
4877 section in the DYNAMIC segment. */
4878 dynamic_addr
= segment
->p_offset
;
4879 dynamic_size
= segment
->p_filesz
;
4880 /* PR binutils/17512: Avoid corrupt dynamic section info in the segment. */
4881 if (dynamic_addr
+ dynamic_size
>= current_file_size
)
4883 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4884 dynamic_addr
= dynamic_size
= 0;
4887 /* Try to locate the .dynamic section. If there is
4888 a section header table, we can easily locate it. */
4889 if (section_headers
!= NULL
)
4891 Elf_Internal_Shdr
* sec
;
4893 sec
= find_section (".dynamic");
4894 if (sec
== NULL
|| sec
->sh_size
== 0)
4896 /* A corresponding .dynamic section is expected, but on
4897 IA-64/OpenVMS it is OK for it to be missing. */
4898 if (!is_ia64_vms ())
4899 error (_("no .dynamic section in the dynamic segment\n"));
4903 if (sec
->sh_type
== SHT_NOBITS
)
4909 dynamic_addr
= sec
->sh_offset
;
4910 dynamic_size
= sec
->sh_size
;
4912 if (dynamic_addr
< segment
->p_offset
4913 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
4914 warn (_("the .dynamic section is not contained"
4915 " within the dynamic segment\n"));
4916 else if (dynamic_addr
> segment
->p_offset
)
4917 warn (_("the .dynamic section is not the first section"
4918 " in the dynamic segment.\n"));
4923 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
4925 error (_("Unable to find program interpreter name\n"));
4929 int ret
= snprintf (fmt
, sizeof (fmt
), "%%%ds", PATH_MAX
- 1);
4931 if (ret
>= (int) sizeof (fmt
) || ret
< 0)
4932 error (_("Internal error: failed to create format string to display program interpreter\n"));
4934 program_interpreter
[0] = 0;
4935 if (fscanf (file
, fmt
, program_interpreter
) <= 0)
4936 error (_("Unable to read program interpreter name\n"));
4939 printf (_(" [Requesting program interpreter: %s]\n"),
4940 program_interpreter
);
4946 if (do_segments
&& section_headers
!= NULL
&& string_table
!= NULL
)
4948 printf (_("\n Section to Segment mapping:\n"));
4949 printf (_(" Segment Sections...\n"));
4951 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
4954 Elf_Internal_Shdr
* section
;
4956 segment
= program_headers
+ i
;
4957 section
= section_headers
+ 1;
4959 printf (" %2.2d ", i
);
4961 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
4963 if (!ELF_TBSS_SPECIAL (section
, segment
)
4964 && ELF_SECTION_IN_SEGMENT_STRICT (section
, segment
))
4965 printf ("%s ", printable_section_name (section
));
4976 /* Find the file offset corresponding to VMA by using the program headers. */
4979 offset_from_vma (FILE * file
, bfd_vma vma
, bfd_size_type size
)
4981 Elf_Internal_Phdr
* seg
;
4983 if (! get_program_headers (file
))
4985 warn (_("Cannot interpret virtual addresses without program headers.\n"));
4989 for (seg
= program_headers
;
4990 seg
< program_headers
+ elf_header
.e_phnum
;
4993 if (seg
->p_type
!= PT_LOAD
)
4996 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
4997 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
4998 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
5001 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5002 (unsigned long) vma
);
5007 /* Allocate memory and load the sections headers into the global pointer
5008 SECTION_HEADERS. If PROBE is true, this is just a probe and we do not
5009 generate any error messages if the load fails. */
5012 get_32bit_section_headers (FILE * file
, bfd_boolean probe
)
5014 Elf32_External_Shdr
* shdrs
;
5015 Elf_Internal_Shdr
* internal
;
5017 unsigned int size
= elf_header
.e_shentsize
;
5018 unsigned int num
= probe
? 1 : elf_header
.e_shnum
;
5020 /* PR binutils/17531: Cope with unexpected section header sizes. */
5021 if (size
== 0 || num
== 0)
5023 if (size
< sizeof * shdrs
)
5026 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5029 if (!probe
&& size
> sizeof * shdrs
)
5030 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5032 shdrs
= (Elf32_External_Shdr
*) get_data (NULL
, file
, elf_header
.e_shoff
,
5034 probe
? NULL
: _("section headers"));
5038 if (section_headers
!= NULL
)
5039 free (section_headers
);
5040 section_headers
= (Elf_Internal_Shdr
*) cmalloc (num
,
5041 sizeof (Elf_Internal_Shdr
));
5042 if (section_headers
== NULL
)
5045 error (_("Out of memory reading %u section headers\n"), num
);
5049 for (i
= 0, internal
= section_headers
;
5053 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
5054 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
5055 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
5056 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
5057 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
5058 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
5059 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
5060 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
5061 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
5062 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
5063 if (!probe
&& internal
->sh_link
> num
)
5064 warn (_("Section %u has an out of range sh_link value of %u\n"), i
, internal
->sh_link
);
5065 if (!probe
&& internal
->sh_flags
& SHF_INFO_LINK
&& internal
->sh_info
> num
)
5066 warn (_("Section %u has an out of range sh_info value of %u\n"), i
, internal
->sh_info
);
5074 get_64bit_section_headers (FILE * file
, bfd_boolean probe
)
5076 Elf64_External_Shdr
* shdrs
;
5077 Elf_Internal_Shdr
* internal
;
5079 unsigned int size
= elf_header
.e_shentsize
;
5080 unsigned int num
= probe
? 1 : elf_header
.e_shnum
;
5082 /* PR binutils/17531: Cope with unexpected section header sizes. */
5083 if (size
== 0 || num
== 0)
5085 if (size
< sizeof * shdrs
)
5088 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5091 if (! probe
&& size
> sizeof * shdrs
)
5092 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5094 shdrs
= (Elf64_External_Shdr
*) get_data (NULL
, file
, elf_header
.e_shoff
,
5096 probe
? NULL
: _("section headers"));
5100 if (section_headers
!= NULL
)
5101 free (section_headers
);
5102 section_headers
= (Elf_Internal_Shdr
*) cmalloc (num
,
5103 sizeof (Elf_Internal_Shdr
));
5104 if (section_headers
== NULL
)
5107 error (_("Out of memory reading %u section headers\n"), num
);
5111 for (i
= 0, internal
= section_headers
;
5115 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
5116 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
5117 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
5118 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
5119 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
5120 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
5121 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
5122 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
5123 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
5124 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
5125 if (!probe
&& internal
->sh_link
> num
)
5126 warn (_("Section %u has an out of range sh_link value of %u\n"), i
, internal
->sh_link
);
5127 if (!probe
&& internal
->sh_flags
& SHF_INFO_LINK
&& internal
->sh_info
> num
)
5128 warn (_("Section %u has an out of range sh_info value of %u\n"), i
, internal
->sh_info
);
5135 static Elf_Internal_Sym
*
5136 get_32bit_elf_symbols (FILE * file
,
5137 Elf_Internal_Shdr
* section
,
5138 unsigned long * num_syms_return
)
5140 unsigned long number
= 0;
5141 Elf32_External_Sym
* esyms
= NULL
;
5142 Elf_External_Sym_Shndx
* shndx
= NULL
;
5143 Elf_Internal_Sym
* isyms
= NULL
;
5144 Elf_Internal_Sym
* psym
;
5147 if (section
->sh_size
== 0)
5149 if (num_syms_return
!= NULL
)
5150 * num_syms_return
= 0;
5154 /* Run some sanity checks first. */
5155 if (section
->sh_entsize
== 0 || section
->sh_entsize
> section
->sh_size
)
5157 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5158 printable_section_name (section
), (unsigned long) section
->sh_entsize
);
5162 if (section
->sh_size
> current_file_size
)
5164 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5165 printable_section_name (section
), (unsigned long) section
->sh_size
);
5169 number
= section
->sh_size
/ section
->sh_entsize
;
5171 if (number
* sizeof (Elf32_External_Sym
) > section
->sh_size
+ 1)
5173 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5174 (unsigned long) section
->sh_size
,
5175 printable_section_name (section
),
5176 (unsigned long) section
->sh_entsize
);
5180 esyms
= (Elf32_External_Sym
*) get_data (NULL
, file
, section
->sh_offset
, 1,
5181 section
->sh_size
, _("symbols"));
5186 elf_section_list
* entry
;
5189 for (entry
= symtab_shndx_list
; entry
!= NULL
; entry
= entry
->next
)
5190 if (entry
->hdr
->sh_link
== (unsigned long) (section
- section_headers
))
5192 shndx
= (Elf_External_Sym_Shndx
*) get_data (NULL
, file
,
5193 entry
->hdr
->sh_offset
,
5194 1, entry
->hdr
->sh_size
,
5195 _("symbol table section indicies"));
5198 /* PR17531: file: heap-buffer-overflow */
5199 else if (entry
->hdr
->sh_size
/ sizeof (Elf_External_Sym_Shndx
) < number
)
5201 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5202 printable_section_name (entry
->hdr
),
5203 (unsigned long) entry
->hdr
->sh_size
,
5204 (unsigned long) section
->sh_size
);
5210 isyms
= (Elf_Internal_Sym
*) cmalloc (number
, sizeof (Elf_Internal_Sym
));
5214 error (_("Out of memory reading %lu symbols\n"),
5215 (unsigned long) number
);
5219 for (j
= 0, psym
= isyms
; j
< number
; j
++, psym
++)
5221 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
5222 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
5223 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
5224 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
5225 if (psym
->st_shndx
== (SHN_XINDEX
& 0xffff) && shndx
!= NULL
)
5227 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
5228 else if (psym
->st_shndx
>= (SHN_LORESERVE
& 0xffff))
5229 psym
->st_shndx
+= SHN_LORESERVE
- (SHN_LORESERVE
& 0xffff);
5230 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
5231 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
5240 if (num_syms_return
!= NULL
)
5241 * num_syms_return
= isyms
== NULL
? 0 : number
;
5246 static Elf_Internal_Sym
*
5247 get_64bit_elf_symbols (FILE * file
,
5248 Elf_Internal_Shdr
* section
,
5249 unsigned long * num_syms_return
)
5251 unsigned long number
= 0;
5252 Elf64_External_Sym
* esyms
= NULL
;
5253 Elf_External_Sym_Shndx
* shndx
= NULL
;
5254 Elf_Internal_Sym
* isyms
= NULL
;
5255 Elf_Internal_Sym
* psym
;
5258 if (section
->sh_size
== 0)
5260 if (num_syms_return
!= NULL
)
5261 * num_syms_return
= 0;
5265 /* Run some sanity checks first. */
5266 if (section
->sh_entsize
== 0 || section
->sh_entsize
> section
->sh_size
)
5268 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5269 printable_section_name (section
),
5270 (unsigned long) section
->sh_entsize
);
5274 if (section
->sh_size
> current_file_size
)
5276 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5277 printable_section_name (section
),
5278 (unsigned long) section
->sh_size
);
5282 number
= section
->sh_size
/ section
->sh_entsize
;
5284 if (number
* sizeof (Elf64_External_Sym
) > section
->sh_size
+ 1)
5286 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5287 (unsigned long) section
->sh_size
,
5288 printable_section_name (section
),
5289 (unsigned long) section
->sh_entsize
);
5293 esyms
= (Elf64_External_Sym
*) get_data (NULL
, file
, section
->sh_offset
, 1,
5294 section
->sh_size
, _("symbols"));
5299 elf_section_list
* entry
;
5302 for (entry
= symtab_shndx_list
; entry
!= NULL
; entry
= entry
->next
)
5303 if (entry
->hdr
->sh_link
== (unsigned long) (section
- section_headers
))
5305 shndx
= (Elf_External_Sym_Shndx
*) get_data (NULL
, file
,
5306 entry
->hdr
->sh_offset
,
5307 1, entry
->hdr
->sh_size
,
5308 _("symbol table section indicies"));
5311 /* PR17531: file: heap-buffer-overflow */
5312 else if (entry
->hdr
->sh_size
/ sizeof (Elf_External_Sym_Shndx
) < number
)
5314 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5315 printable_section_name (entry
->hdr
),
5316 (unsigned long) entry
->hdr
->sh_size
,
5317 (unsigned long) section
->sh_size
);
5323 isyms
= (Elf_Internal_Sym
*) cmalloc (number
, sizeof (Elf_Internal_Sym
));
5327 error (_("Out of memory reading %lu symbols\n"),
5328 (unsigned long) number
);
5332 for (j
= 0, psym
= isyms
; j
< number
; j
++, psym
++)
5334 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
5335 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
5336 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
5337 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
5339 if (psym
->st_shndx
== (SHN_XINDEX
& 0xffff) && shndx
!= NULL
)
5341 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
5342 else if (psym
->st_shndx
>= (SHN_LORESERVE
& 0xffff))
5343 psym
->st_shndx
+= SHN_LORESERVE
- (SHN_LORESERVE
& 0xffff);
5345 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
5346 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
5355 if (num_syms_return
!= NULL
)
5356 * num_syms_return
= isyms
== NULL
? 0 : number
;
5362 get_elf_section_flags (bfd_vma sh_flags
)
5364 static char buff
[1024];
5366 int field_size
= is_32bit_elf
? 8 : 16;
5368 int size
= sizeof (buff
) - (field_size
+ 4 + 1);
5369 bfd_vma os_flags
= 0;
5370 bfd_vma proc_flags
= 0;
5371 bfd_vma unknown_flags
= 0;
5379 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5380 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5381 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5382 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5383 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5384 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5385 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5386 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5387 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5388 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5389 /* IA-64 specific. */
5390 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5391 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5392 /* IA-64 OpenVMS specific. */
5393 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5394 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5395 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5396 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5397 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5398 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5400 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5401 /* SPARC specific. */
5402 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5403 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5405 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5406 /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5407 /* 23 */ { STRING_COMMA_LEN ("COMDEF") }
5410 if (do_section_details
)
5412 sprintf (buff
, "[%*.*lx]: ",
5413 field_size
, field_size
, (unsigned long) sh_flags
);
5414 p
+= field_size
+ 4;
5421 flag
= sh_flags
& - sh_flags
;
5424 if (do_section_details
)
5428 case SHF_WRITE
: sindex
= 0; break;
5429 case SHF_ALLOC
: sindex
= 1; break;
5430 case SHF_EXECINSTR
: sindex
= 2; break;
5431 case SHF_MERGE
: sindex
= 3; break;
5432 case SHF_STRINGS
: sindex
= 4; break;
5433 case SHF_INFO_LINK
: sindex
= 5; break;
5434 case SHF_LINK_ORDER
: sindex
= 6; break;
5435 case SHF_OS_NONCONFORMING
: sindex
= 7; break;
5436 case SHF_GROUP
: sindex
= 8; break;
5437 case SHF_TLS
: sindex
= 9; break;
5438 case SHF_EXCLUDE
: sindex
= 18; break;
5439 case SHF_COMPRESSED
: sindex
= 20; break;
5443 switch (elf_header
.e_machine
)
5446 if (flag
== SHF_IA_64_SHORT
)
5448 else if (flag
== SHF_IA_64_NORECOV
)
5451 else if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_OPENVMS
)
5454 case SHF_IA_64_VMS_GLOBAL
: sindex
= 12; break;
5455 case SHF_IA_64_VMS_OVERLAID
: sindex
= 13; break;
5456 case SHF_IA_64_VMS_SHARED
: sindex
= 14; break;
5457 case SHF_IA_64_VMS_VECTOR
: sindex
= 15; break;
5458 case SHF_IA_64_VMS_ALLOC_64BIT
: sindex
= 16; break;
5459 case SHF_IA_64_VMS_PROTECTED
: sindex
= 17; break;
5470 case EM_OLD_SPARCV9
:
5471 case EM_SPARC32PLUS
:
5474 if (flag
== SHF_ORDERED
)
5481 case SHF_ENTRYSECT
: sindex
= 21; break;
5482 case SHF_ARM_PURECODE
: sindex
= 22; break;
5483 case SHF_COMDEF
: sindex
= 23; break;
5495 if (p
!= buff
+ field_size
+ 4)
5497 if (size
< (10 + 2))
5499 warn (_("Internal error: not enough buffer room for section flag info"));
5500 return _("<unknown>");
5507 size
-= flags
[sindex
].len
;
5508 p
= stpcpy (p
, flags
[sindex
].str
);
5510 else if (flag
& SHF_MASKOS
)
5512 else if (flag
& SHF_MASKPROC
)
5515 unknown_flags
|= flag
;
5521 case SHF_WRITE
: *p
= 'W'; break;
5522 case SHF_ALLOC
: *p
= 'A'; break;
5523 case SHF_EXECINSTR
: *p
= 'X'; break;
5524 case SHF_MERGE
: *p
= 'M'; break;
5525 case SHF_STRINGS
: *p
= 'S'; break;
5526 case SHF_INFO_LINK
: *p
= 'I'; break;
5527 case SHF_LINK_ORDER
: *p
= 'L'; break;
5528 case SHF_OS_NONCONFORMING
: *p
= 'O'; break;
5529 case SHF_GROUP
: *p
= 'G'; break;
5530 case SHF_TLS
: *p
= 'T'; break;
5531 case SHF_EXCLUDE
: *p
= 'E'; break;
5532 case SHF_COMPRESSED
: *p
= 'C'; break;
5535 if ((elf_header
.e_machine
== EM_X86_64
5536 || elf_header
.e_machine
== EM_L1OM
5537 || elf_header
.e_machine
== EM_K1OM
)
5538 && flag
== SHF_X86_64_LARGE
)
5540 else if (elf_header
.e_machine
== EM_ARM
5541 && flag
== SHF_ARM_PURECODE
)
5543 else if (flag
& SHF_MASKOS
)
5546 sh_flags
&= ~ SHF_MASKOS
;
5548 else if (flag
& SHF_MASKPROC
)
5551 sh_flags
&= ~ SHF_MASKPROC
;
5561 if (do_section_details
)
5565 size
-= 5 + field_size
;
5566 if (p
!= buff
+ field_size
+ 4)
5570 warn (_("Internal error: not enough buffer room for section flag info"));
5571 return _("<unknown>");
5577 sprintf (p
, "OS (%*.*lx)", field_size
, field_size
,
5578 (unsigned long) os_flags
);
5579 p
+= 5 + field_size
;
5583 size
-= 7 + field_size
;
5584 if (p
!= buff
+ field_size
+ 4)
5588 warn (_("Internal error: not enough buffer room for section flag info"));
5589 return _("<unknown>");
5595 sprintf (p
, "PROC (%*.*lx)", field_size
, field_size
,
5596 (unsigned long) proc_flags
);
5597 p
+= 7 + field_size
;
5601 size
-= 10 + field_size
;
5602 if (p
!= buff
+ field_size
+ 4)
5606 warn (_("Internal error: not enough buffer room for section flag info"));
5607 return _("<unknown>");
5613 sprintf (p
, _("UNKNOWN (%*.*lx)"), field_size
, field_size
,
5614 (unsigned long) unknown_flags
);
5615 p
+= 10 + field_size
;
5624 get_compression_header (Elf_Internal_Chdr
*chdr
, unsigned char *buf
)
5628 Elf32_External_Chdr
*echdr
= (Elf32_External_Chdr
*) buf
;
5630 chdr
->ch_type
= BYTE_GET (echdr
->ch_type
);
5631 chdr
->ch_size
= BYTE_GET (echdr
->ch_size
);
5632 chdr
->ch_addralign
= BYTE_GET (echdr
->ch_addralign
);
5633 return sizeof (*echdr
);
5637 Elf64_External_Chdr
*echdr
= (Elf64_External_Chdr
*) buf
;
5639 chdr
->ch_type
= BYTE_GET (echdr
->ch_type
);
5640 chdr
->ch_size
= BYTE_GET (echdr
->ch_size
);
5641 chdr
->ch_addralign
= BYTE_GET (echdr
->ch_addralign
);
5642 return sizeof (*echdr
);
5647 process_section_headers (FILE * file
)
5649 Elf_Internal_Shdr
* section
;
5652 section_headers
= NULL
;
5654 if (elf_header
.e_shnum
== 0)
5656 /* PR binutils/12467. */
5657 if (elf_header
.e_shoff
!= 0)
5658 warn (_("possibly corrupt ELF file header - it has a non-zero"
5659 " section header offset, but no section headers\n"));
5660 else if (do_sections
)
5661 printf (_("\nThere are no sections in this file.\n"));
5666 if (do_sections
&& !do_header
)
5667 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5668 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
5672 if (! get_32bit_section_headers (file
, FALSE
))
5675 else if (! get_64bit_section_headers (file
, FALSE
))
5678 /* Read in the string table, so that we have names to display. */
5679 if (elf_header
.e_shstrndx
!= SHN_UNDEF
5680 && elf_header
.e_shstrndx
< elf_header
.e_shnum
)
5682 section
= section_headers
+ elf_header
.e_shstrndx
;
5684 if (section
->sh_size
!= 0)
5686 string_table
= (char *) get_data (NULL
, file
, section
->sh_offset
,
5687 1, section
->sh_size
,
5690 string_table_length
= string_table
!= NULL
? section
->sh_size
: 0;
5694 /* Scan the sections for the dynamic symbol table
5695 and dynamic string table and debug sections. */
5696 dynamic_symbols
= NULL
;
5697 dynamic_strings
= NULL
;
5698 dynamic_syminfo
= NULL
;
5699 symtab_shndx_list
= NULL
;
5701 eh_addr_size
= is_32bit_elf
? 4 : 8;
5702 switch (elf_header
.e_machine
)
5705 case EM_MIPS_RS3_LE
:
5706 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5707 FDE addresses. However, the ABI also has a semi-official ILP32
5708 variant for which the normal FDE address size rules apply.
5710 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5711 section, where XX is the size of longs in bits. Unfortunately,
5712 earlier compilers provided no way of distinguishing ILP32 objects
5713 from LP64 objects, so if there's any doubt, we should assume that
5714 the official LP64 form is being used. */
5715 if ((elf_header
.e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
5716 && find_section (".gcc_compiled_long32") == NULL
)
5722 switch (elf_header
.e_flags
& EF_H8_MACH
)
5724 case E_H8_MACH_H8300
:
5725 case E_H8_MACH_H8300HN
:
5726 case E_H8_MACH_H8300SN
:
5727 case E_H8_MACH_H8300SXN
:
5730 case E_H8_MACH_H8300H
:
5731 case E_H8_MACH_H8300S
:
5732 case E_H8_MACH_H8300SX
:
5740 switch (elf_header
.e_flags
& EF_M32C_CPU_MASK
)
5742 case EF_M32C_CPU_M16C
:
5749 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
5752 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
5753 if (section->sh_entsize != expected_entsize) \
5756 sprintf_vma (buf, section->sh_entsize); \
5757 /* Note: coded this way so that there is a single string for \
5759 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5760 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5761 (unsigned) expected_entsize); \
5762 section->sh_entsize = expected_entsize; \
5767 #define CHECK_ENTSIZE(section, i, type) \
5768 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
5769 sizeof (Elf64_External_##type))
5771 for (i
= 0, section
= section_headers
;
5772 i
< elf_header
.e_shnum
;
5775 char * name
= SECTION_NAME (section
);
5777 if (section
->sh_type
== SHT_DYNSYM
)
5779 if (dynamic_symbols
!= NULL
)
5781 error (_("File contains multiple dynamic symbol tables\n"));
5785 CHECK_ENTSIZE (section
, i
, Sym
);
5786 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
, & num_dynamic_syms
);
5788 else if (section
->sh_type
== SHT_STRTAB
5789 && streq (name
, ".dynstr"))
5791 if (dynamic_strings
!= NULL
)
5793 error (_("File contains multiple dynamic string tables\n"));
5797 dynamic_strings
= (char *) get_data (NULL
, file
, section
->sh_offset
,
5798 1, section
->sh_size
,
5799 _("dynamic strings"));
5800 dynamic_strings_length
= dynamic_strings
== NULL
? 0 : section
->sh_size
;
5802 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
5804 elf_section_list
* entry
= xmalloc (sizeof * entry
);
5805 entry
->hdr
= section
;
5806 entry
->next
= symtab_shndx_list
;
5807 symtab_shndx_list
= entry
;
5809 else if (section
->sh_type
== SHT_SYMTAB
)
5810 CHECK_ENTSIZE (section
, i
, Sym
);
5811 else if (section
->sh_type
== SHT_GROUP
)
5812 CHECK_ENTSIZE_VALUES (section
, i
, GRP_ENTRY_SIZE
, GRP_ENTRY_SIZE
);
5813 else if (section
->sh_type
== SHT_REL
)
5814 CHECK_ENTSIZE (section
, i
, Rel
);
5815 else if (section
->sh_type
== SHT_RELA
)
5816 CHECK_ENTSIZE (section
, i
, Rela
);
5817 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
5818 || do_debug_lines
|| do_debug_pubnames
|| do_debug_pubtypes
5819 || do_debug_aranges
|| do_debug_frames
|| do_debug_macinfo
5820 || do_debug_str
|| do_debug_loc
|| do_debug_ranges
5821 || do_debug_addr
|| do_debug_cu_index
)
5822 && (const_strneq (name
, ".debug_")
5823 || const_strneq (name
, ".zdebug_")))
5826 name
+= sizeof (".zdebug_") - 1;
5828 name
+= sizeof (".debug_") - 1;
5831 || (do_debug_info
&& const_strneq (name
, "info"))
5832 || (do_debug_info
&& const_strneq (name
, "types"))
5833 || (do_debug_abbrevs
&& const_strneq (name
, "abbrev"))
5834 || (do_debug_lines
&& strcmp (name
, "line") == 0)
5835 || (do_debug_lines
&& const_strneq (name
, "line."))
5836 || (do_debug_pubnames
&& const_strneq (name
, "pubnames"))
5837 || (do_debug_pubtypes
&& const_strneq (name
, "pubtypes"))
5838 || (do_debug_pubnames
&& const_strneq (name
, "gnu_pubnames"))
5839 || (do_debug_pubtypes
&& const_strneq (name
, "gnu_pubtypes"))
5840 || (do_debug_aranges
&& const_strneq (name
, "aranges"))
5841 || (do_debug_ranges
&& const_strneq (name
, "ranges"))
5842 || (do_debug_frames
&& const_strneq (name
, "frame"))
5843 || (do_debug_macinfo
&& const_strneq (name
, "macinfo"))
5844 || (do_debug_macinfo
&& const_strneq (name
, "macro"))
5845 || (do_debug_str
&& const_strneq (name
, "str"))
5846 || (do_debug_loc
&& const_strneq (name
, "loc"))
5847 || (do_debug_addr
&& const_strneq (name
, "addr"))
5848 || (do_debug_cu_index
&& const_strneq (name
, "cu_index"))
5849 || (do_debug_cu_index
&& const_strneq (name
, "tu_index"))
5851 request_dump_bynumber (i
, DEBUG_DUMP
);
5853 /* Linkonce section to be combined with .debug_info at link time. */
5854 else if ((do_debugging
|| do_debug_info
)
5855 && const_strneq (name
, ".gnu.linkonce.wi."))
5856 request_dump_bynumber (i
, DEBUG_DUMP
);
5857 else if (do_debug_frames
&& streq (name
, ".eh_frame"))
5858 request_dump_bynumber (i
, DEBUG_DUMP
);
5859 else if (do_gdb_index
&& streq (name
, ".gdb_index"))
5860 request_dump_bynumber (i
, DEBUG_DUMP
);
5861 /* Trace sections for Itanium VMS. */
5862 else if ((do_debugging
|| do_trace_info
|| do_trace_abbrevs
5863 || do_trace_aranges
)
5864 && const_strneq (name
, ".trace_"))
5866 name
+= sizeof (".trace_") - 1;
5869 || (do_trace_info
&& streq (name
, "info"))
5870 || (do_trace_abbrevs
&& streq (name
, "abbrev"))
5871 || (do_trace_aranges
&& streq (name
, "aranges"))
5873 request_dump_bynumber (i
, DEBUG_DUMP
);
5880 if (elf_header
.e_shnum
> 1)
5881 printf (_("\nSection Headers:\n"));
5883 printf (_("\nSection Header:\n"));
5887 if (do_section_details
)
5889 printf (_(" [Nr] Name\n"));
5890 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
5894 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
5898 if (do_section_details
)
5900 printf (_(" [Nr] Name\n"));
5901 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
5905 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
5909 if (do_section_details
)
5911 printf (_(" [Nr] Name\n"));
5912 printf (_(" Type Address Offset Link\n"));
5913 printf (_(" Size EntSize Info Align\n"));
5917 printf (_(" [Nr] Name Type Address Offset\n"));
5918 printf (_(" Size EntSize Flags Link Info Align\n"));
5922 if (do_section_details
)
5923 printf (_(" Flags\n"));
5925 for (i
= 0, section
= section_headers
;
5926 i
< elf_header
.e_shnum
;
5929 /* Run some sanity checks on the section header. */
5931 /* Check the sh_link field. */
5932 switch (section
->sh_type
)
5934 case SHT_SYMTAB_SHNDX
:
5938 case SHT_GNU_versym
:
5941 if (section
->sh_link
< 1
5942 || section
->sh_link
> elf_header
.e_shnum
5943 || (section_headers
[section
->sh_link
].sh_type
!= SHT_SYMTAB
5944 && section_headers
[section
->sh_link
].sh_type
!= SHT_DYNSYM
))
5945 warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
5946 i
, section
->sh_link
);
5952 case SHT_GNU_verneed
:
5953 case SHT_GNU_verdef
:
5954 case SHT_GNU_LIBLIST
:
5955 if (section
->sh_link
< 1
5956 || section
->sh_link
> elf_header
.e_shnum
5957 || section_headers
[section
->sh_link
].sh_type
!= SHT_STRTAB
)
5958 warn (_("[%2u]: Link field (%u) should index a string section.\n"),
5959 i
, section
->sh_link
);
5962 case SHT_INIT_ARRAY
:
5963 case SHT_FINI_ARRAY
:
5964 case SHT_PREINIT_ARRAY
:
5965 if (section
->sh_type
< SHT_LOOS
&& section
->sh_link
!= 0)
5966 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
5967 i
, section
->sh_link
);
5971 /* FIXME: Add support for target specific section types. */
5972 #if 0 /* Currently we do not check other section types as there are too
5973 many special cases. Stab sections for example have a type
5974 of SHT_PROGBITS but an sh_link field that links to the .stabstr
5976 if (section
->sh_type
< SHT_LOOS
&& section
->sh_link
!= 0)
5977 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
5978 i
, section
->sh_link
);
5983 /* Check the sh_info field. */
5984 switch (section
->sh_type
)
5988 if (section
->sh_info
< 1
5989 || section
->sh_info
> elf_header
.e_shnum
5990 || (section_headers
[section
->sh_info
].sh_type
!= SHT_PROGBITS
5991 && section_headers
[section
->sh_info
].sh_type
!= SHT_NOBITS
5992 && section_headers
[section
->sh_info
].sh_type
!= SHT_NOTE
5993 && section_headers
[section
->sh_info
].sh_type
!= SHT_INIT_ARRAY
5994 /* FIXME: Are other section types valid ? */
5995 && section_headers
[section
->sh_info
].sh_type
< SHT_LOOS
))
5997 if (section
->sh_info
== 0
5998 && (streq (SECTION_NAME (section
), ".rel.dyn")
5999 || streq (SECTION_NAME (section
), ".rela.dyn")))
6000 /* The .rel.dyn and .rela.dyn sections have an sh_info field
6001 of zero. No idea why. I would have expected the index
6002 of the .plt section. */
6005 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6006 i
, section
->sh_info
);
6012 case SHT_SYMTAB_SHNDX
:
6013 case SHT_INIT_ARRAY
:
6014 case SHT_FINI_ARRAY
:
6015 case SHT_PREINIT_ARRAY
:
6016 if (section
->sh_info
!= 0)
6017 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6018 i
, section
->sh_info
);
6024 /* A symbol index - we assume that it is valid. */
6028 /* FIXME: Add support for target specific section types. */
6029 if (section
->sh_type
== SHT_NOBITS
)
6030 /* NOBITS section headers with non-zero sh_info fields can be
6031 created when a binary is stripped of everything but its debug
6032 information. The stripped sections have their headers preserved but their types set to SHT_NOBITS. so do not check this type of section. */
6034 else if (section
->sh_flags
& SHF_INFO_LINK
)
6036 if (section
->sh_info
< 1 || section
->sh_info
> elf_header
.e_shnum
)
6037 warn (_("[%2u]: Expected link to another section in info field"), i
);
6039 else if (section
->sh_type
< SHT_LOOS
&& section
->sh_info
!= 0)
6040 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6041 i
, section
->sh_info
);
6045 printf (" [%2u] ", i
);
6046 if (do_section_details
)
6047 printf ("%s\n ", printable_section_name (section
));
6049 print_symbol (-17, SECTION_NAME (section
));
6051 printf (do_wide
? " %-15s " : " %-15.15s ",
6052 get_section_type_name (section
->sh_type
));
6056 const char * link_too_big
= NULL
;
6058 print_vma (section
->sh_addr
, LONG_HEX
);
6060 printf ( " %6.6lx %6.6lx %2.2lx",
6061 (unsigned long) section
->sh_offset
,
6062 (unsigned long) section
->sh_size
,
6063 (unsigned long) section
->sh_entsize
);
6065 if (do_section_details
)
6066 fputs (" ", stdout
);
6068 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
6070 if (section
->sh_link
>= elf_header
.e_shnum
)
6073 /* The sh_link value is out of range. Normally this indicates
6074 an error but it can have special values in Solaris binaries. */
6075 switch (elf_header
.e_machine
)
6082 case EM_OLD_SPARCV9
:
6083 case EM_SPARC32PLUS
:
6086 if (section
->sh_link
== (SHN_BEFORE
& 0xffff))
6087 link_too_big
= "BEFORE";
6088 else if (section
->sh_link
== (SHN_AFTER
& 0xffff))
6089 link_too_big
= "AFTER";
6096 if (do_section_details
)
6098 if (link_too_big
!= NULL
&& * link_too_big
)
6099 printf ("<%s> ", link_too_big
);
6101 printf ("%2u ", section
->sh_link
);
6102 printf ("%3u %2lu\n", section
->sh_info
,
6103 (unsigned long) section
->sh_addralign
);
6106 printf ("%2u %3u %2lu\n",
6109 (unsigned long) section
->sh_addralign
);
6111 if (link_too_big
&& ! * link_too_big
)
6112 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6113 i
, section
->sh_link
);
6117 print_vma (section
->sh_addr
, LONG_HEX
);
6119 if ((long) section
->sh_offset
== section
->sh_offset
)
6120 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
6124 print_vma (section
->sh_offset
, LONG_HEX
);
6127 if ((unsigned long) section
->sh_size
== section
->sh_size
)
6128 printf (" %6.6lx", (unsigned long) section
->sh_size
);
6132 print_vma (section
->sh_size
, LONG_HEX
);
6135 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
6136 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
6140 print_vma (section
->sh_entsize
, LONG_HEX
);
6143 if (do_section_details
)
6144 fputs (" ", stdout
);
6146 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
6148 printf ("%2u %3u ", section
->sh_link
, section
->sh_info
);
6150 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
6151 printf ("%2lu\n", (unsigned long) section
->sh_addralign
);
6154 print_vma (section
->sh_addralign
, DEC
);
6158 else if (do_section_details
)
6160 printf (" %-15.15s ",
6161 get_section_type_name (section
->sh_type
));
6162 print_vma (section
->sh_addr
, LONG_HEX
);
6163 if ((long) section
->sh_offset
== section
->sh_offset
)
6164 printf (" %16.16lx", (unsigned long) section
->sh_offset
);
6168 print_vma (section
->sh_offset
, LONG_HEX
);
6170 printf (" %u\n ", section
->sh_link
);
6171 print_vma (section
->sh_size
, LONG_HEX
);
6173 print_vma (section
->sh_entsize
, LONG_HEX
);
6175 printf (" %-16u %lu\n",
6177 (unsigned long) section
->sh_addralign
);
6182 print_vma (section
->sh_addr
, LONG_HEX
);
6183 if ((long) section
->sh_offset
== section
->sh_offset
)
6184 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
6188 print_vma (section
->sh_offset
, LONG_HEX
);
6191 print_vma (section
->sh_size
, LONG_HEX
);
6193 print_vma (section
->sh_entsize
, LONG_HEX
);
6195 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
6197 printf (" %2u %3u %lu\n",
6200 (unsigned long) section
->sh_addralign
);
6203 if (do_section_details
)
6205 printf (" %s\n", get_elf_section_flags (section
->sh_flags
));
6206 if ((section
->sh_flags
& SHF_COMPRESSED
) != 0)
6208 /* Minimum section size is 12 bytes for 32-bit compression
6209 header + 12 bytes for compressed data header. */
6210 unsigned char buf
[24];
6212 assert (sizeof (buf
) >= sizeof (Elf64_External_Chdr
));
6213 if (get_data (&buf
, (FILE *) file
, section
->sh_offset
, 1,
6214 sizeof (buf
), _("compression header")))
6216 Elf_Internal_Chdr chdr
;
6218 (void) get_compression_header (&chdr
, buf
);
6220 if (chdr
.ch_type
== ELFCOMPRESS_ZLIB
)
6223 printf (_(" [<unknown>: 0x%x], "),
6225 print_vma (chdr
.ch_size
, LONG_HEX
);
6226 printf (", %lu\n", (unsigned long) chdr
.ch_addralign
);
6232 if (!do_section_details
)
6234 /* The ordering of the letters shown here matches the ordering of the
6235 corresponding SHF_xxx values, and hence the order in which these
6236 letters will be displayed to the user. */
6237 printf (_("Key to Flags:\n\
6238 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6239 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6240 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
6241 if (elf_header
.e_machine
== EM_X86_64
6242 || elf_header
.e_machine
== EM_L1OM
6243 || elf_header
.e_machine
== EM_K1OM
)
6244 printf (_("l (large), "));
6245 else if (elf_header
.e_machine
== EM_ARM
)
6246 printf (_("y (purecode), "));
6247 printf ("p (processor specific)\n");
6254 get_group_flags (unsigned int flags
)
6256 static char buff
[32];
6266 snprintf (buff
, sizeof (buff
), _("[<unknown>: 0x%x] "), flags
);
6273 process_section_groups (FILE * file
)
6275 Elf_Internal_Shdr
* section
;
6277 struct group
* group
;
6278 Elf_Internal_Shdr
* symtab_sec
;
6279 Elf_Internal_Shdr
* strtab_sec
;
6280 Elf_Internal_Sym
* symtab
;
6281 unsigned long num_syms
;
6285 /* Don't process section groups unless needed. */
6286 if (!do_unwind
&& !do_section_groups
)
6289 if (elf_header
.e_shnum
== 0)
6291 if (do_section_groups
)
6292 printf (_("\nThere are no sections to group in this file.\n"));
6297 if (section_headers
== NULL
)
6299 error (_("Section headers are not available!\n"));
6300 /* PR 13622: This can happen with a corrupt ELF header. */
6304 section_headers_groups
= (struct group
**) calloc (elf_header
.e_shnum
,
6305 sizeof (struct group
*));
6307 if (section_headers_groups
== NULL
)
6309 error (_("Out of memory reading %u section group headers\n"),
6310 elf_header
.e_shnum
);
6314 /* Scan the sections for the group section. */
6316 for (i
= 0, section
= section_headers
;
6317 i
< elf_header
.e_shnum
;
6319 if (section
->sh_type
== SHT_GROUP
)
6322 if (group_count
== 0)
6324 if (do_section_groups
)
6325 printf (_("\nThere are no section groups in this file.\n"));
6330 section_groups
= (struct group
*) calloc (group_count
, sizeof (struct group
));
6332 if (section_groups
== NULL
)
6334 error (_("Out of memory reading %lu groups\n"),
6335 (unsigned long) group_count
);
6345 for (i
= 0, section
= section_headers
, group
= section_groups
;
6346 i
< elf_header
.e_shnum
;
6349 if (section
->sh_type
== SHT_GROUP
)
6351 const char * name
= printable_section_name (section
);
6352 const char * group_name
;
6353 unsigned char * start
;
6354 unsigned char * indices
;
6355 unsigned int entry
, j
, size
;
6356 Elf_Internal_Shdr
* sec
;
6357 Elf_Internal_Sym
* sym
;
6359 /* Get the symbol table. */
6360 if (section
->sh_link
>= elf_header
.e_shnum
6361 || ((sec
= section_headers
+ section
->sh_link
)->sh_type
6364 error (_("Bad sh_link in group section `%s'\n"), name
);
6368 if (symtab_sec
!= sec
)
6373 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
, & num_syms
);
6378 error (_("Corrupt header in group section `%s'\n"), name
);
6382 if (section
->sh_info
>= num_syms
)
6384 error (_("Bad sh_info in group section `%s'\n"), name
);
6388 sym
= symtab
+ section
->sh_info
;
6390 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
6392 if (sym
->st_shndx
== 0
6393 || sym
->st_shndx
>= elf_header
.e_shnum
)
6395 error (_("Bad sh_info in group section `%s'\n"), name
);
6399 group_name
= SECTION_NAME (section_headers
+ sym
->st_shndx
);
6408 /* Get the string table. */
6409 if (symtab_sec
->sh_link
>= elf_header
.e_shnum
)
6418 != (sec
= section_headers
+ symtab_sec
->sh_link
))
6424 strtab
= (char *) get_data (NULL
, file
, strtab_sec
->sh_offset
,
6425 1, strtab_sec
->sh_size
,
6427 strtab_size
= strtab
!= NULL
? strtab_sec
->sh_size
: 0;
6429 group_name
= sym
->st_name
< strtab_size
6430 ? strtab
+ sym
->st_name
: _("<corrupt>");
6433 /* PR 17531: file: loop. */
6434 if (section
->sh_entsize
> section
->sh_size
)
6436 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6437 printable_section_name (section
),
6438 (unsigned long) section
->sh_entsize
,
6439 (unsigned long) section
->sh_size
);
6443 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
,
6444 1, section
->sh_size
,
6450 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
6451 entry
= byte_get (indices
, 4);
6454 if (do_section_groups
)
6456 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6457 get_group_flags (entry
), i
, name
, group_name
, size
);
6459 printf (_(" [Index] Name\n"));
6462 group
->group_index
= i
;
6464 for (j
= 0; j
< size
; j
++)
6466 struct group_list
* g
;
6468 entry
= byte_get (indices
, 4);
6471 if (entry
>= elf_header
.e_shnum
)
6473 static unsigned num_group_errors
= 0;
6475 if (num_group_errors
++ < 10)
6477 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6478 entry
, i
, elf_header
.e_shnum
- 1);
6479 if (num_group_errors
== 10)
6480 warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6485 if (section_headers_groups
[entry
] != NULL
)
6489 static unsigned num_errs
= 0;
6491 if (num_errs
++ < 10)
6493 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6495 section_headers_groups
[entry
]->group_index
);
6497 warn (_("Further error messages about already contained group sections suppressed\n"));
6503 /* Intel C/C++ compiler may put section 0 in a
6504 section group. We just warn it the first time
6505 and ignore it afterwards. */
6506 static int warned
= 0;
6509 error (_("section 0 in group section [%5u]\n"),
6510 section_headers_groups
[entry
]->group_index
);
6516 section_headers_groups
[entry
] = group
;
6518 if (do_section_groups
)
6520 sec
= section_headers
+ entry
;
6521 printf (" [%5u] %s\n", entry
, printable_section_name (sec
));
6524 g
= (struct group_list
*) xmalloc (sizeof (struct group_list
));
6525 g
->section_index
= entry
;
6526 g
->next
= group
->root
;
6544 /* Data used to display dynamic fixups. */
6546 struct ia64_vms_dynfixup
6548 bfd_vma needed_ident
; /* Library ident number. */
6549 bfd_vma needed
; /* Index in the dstrtab of the library name. */
6550 bfd_vma fixup_needed
; /* Index of the library. */
6551 bfd_vma fixup_rela_cnt
; /* Number of fixups. */
6552 bfd_vma fixup_rela_off
; /* Fixups offset in the dynamic segment. */
6555 /* Data used to display dynamic relocations. */
6557 struct ia64_vms_dynimgrela
6559 bfd_vma img_rela_cnt
; /* Number of relocations. */
6560 bfd_vma img_rela_off
; /* Reloc offset in the dynamic segment. */
6563 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6567 dump_ia64_vms_dynamic_fixups (FILE *file
, struct ia64_vms_dynfixup
*fixup
,
6568 const char *strtab
, unsigned int strtab_sz
)
6570 Elf64_External_VMS_IMAGE_FIXUP
*imfs
;
6572 const char *lib_name
;
6574 imfs
= get_data (NULL
, file
, dynamic_addr
+ fixup
->fixup_rela_off
,
6575 1, fixup
->fixup_rela_cnt
* sizeof (*imfs
),
6576 _("dynamic section image fixups"));
6580 if (fixup
->needed
< strtab_sz
)
6581 lib_name
= strtab
+ fixup
->needed
;
6584 warn ("corrupt library name index of 0x%lx found in dynamic entry",
6585 (unsigned long) fixup
->needed
);
6588 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6589 (int) fixup
->fixup_needed
, lib_name
, (long) fixup
->needed_ident
);
6591 (_("Seg Offset Type SymVec DataType\n"));
6593 for (i
= 0; i
< (long) fixup
->fixup_rela_cnt
; i
++)
6598 printf ("%3u ", (unsigned) BYTE_GET (imfs
[i
].fixup_seg
));
6599 printf_vma ((bfd_vma
) BYTE_GET (imfs
[i
].fixup_offset
));
6600 type
= BYTE_GET (imfs
[i
].type
);
6601 rtype
= elf_ia64_reloc_type (type
);
6603 printf (" 0x%08x ", type
);
6605 printf (" %-32s ", rtype
);
6606 printf ("%6u ", (unsigned) BYTE_GET (imfs
[i
].symvec_index
));
6607 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs
[i
].data_type
));
6613 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6616 dump_ia64_vms_dynamic_relocs (FILE *file
, struct ia64_vms_dynimgrela
*imgrela
)
6618 Elf64_External_VMS_IMAGE_RELA
*imrs
;
6621 imrs
= get_data (NULL
, file
, dynamic_addr
+ imgrela
->img_rela_off
,
6622 1, imgrela
->img_rela_cnt
* sizeof (*imrs
),
6623 _("dynamic section image relocations"));
6627 printf (_("\nImage relocs\n"));
6629 (_("Seg Offset Type Addend Seg Sym Off\n"));
6631 for (i
= 0; i
< (long) imgrela
->img_rela_cnt
; i
++)
6636 printf ("%3u ", (unsigned) BYTE_GET (imrs
[i
].rela_seg
));
6637 printf ("%08" BFD_VMA_FMT
"x ",
6638 (bfd_vma
) BYTE_GET (imrs
[i
].rela_offset
));
6639 type
= BYTE_GET (imrs
[i
].type
);
6640 rtype
= elf_ia64_reloc_type (type
);
6642 printf ("0x%08x ", type
);
6644 printf ("%-31s ", rtype
);
6645 print_vma (BYTE_GET (imrs
[i
].addend
), FULL_HEX
);
6646 printf ("%3u ", (unsigned) BYTE_GET (imrs
[i
].sym_seg
));
6647 printf ("%08" BFD_VMA_FMT
"x\n",
6648 (bfd_vma
) BYTE_GET (imrs
[i
].sym_offset
));
6654 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
6657 process_ia64_vms_dynamic_relocs (FILE *file
)
6659 struct ia64_vms_dynfixup fixup
;
6660 struct ia64_vms_dynimgrela imgrela
;
6661 Elf_Internal_Dyn
*entry
;
6663 bfd_vma strtab_off
= 0;
6664 bfd_vma strtab_sz
= 0;
6665 char *strtab
= NULL
;
6667 memset (&fixup
, 0, sizeof (fixup
));
6668 memset (&imgrela
, 0, sizeof (imgrela
));
6670 /* Note: the order of the entries is specified by the OpenVMS specs. */
6671 for (entry
= dynamic_section
;
6672 entry
< dynamic_section
+ dynamic_nent
;
6675 switch (entry
->d_tag
)
6677 case DT_IA_64_VMS_STRTAB_OFFSET
:
6678 strtab_off
= entry
->d_un
.d_val
;
6681 strtab_sz
= entry
->d_un
.d_val
;
6683 strtab
= get_data (NULL
, file
, dynamic_addr
+ strtab_off
,
6684 1, strtab_sz
, _("dynamic string section"));
6687 case DT_IA_64_VMS_NEEDED_IDENT
:
6688 fixup
.needed_ident
= entry
->d_un
.d_val
;
6691 fixup
.needed
= entry
->d_un
.d_val
;
6693 case DT_IA_64_VMS_FIXUP_NEEDED
:
6694 fixup
.fixup_needed
= entry
->d_un
.d_val
;
6696 case DT_IA_64_VMS_FIXUP_RELA_CNT
:
6697 fixup
.fixup_rela_cnt
= entry
->d_un
.d_val
;
6699 case DT_IA_64_VMS_FIXUP_RELA_OFF
:
6700 fixup
.fixup_rela_off
= entry
->d_un
.d_val
;
6702 dump_ia64_vms_dynamic_fixups (file
, &fixup
, strtab
, strtab_sz
);
6705 case DT_IA_64_VMS_IMG_RELA_CNT
:
6706 imgrela
.img_rela_cnt
= entry
->d_un
.d_val
;
6708 case DT_IA_64_VMS_IMG_RELA_OFF
:
6709 imgrela
.img_rela_off
= entry
->d_un
.d_val
;
6711 dump_ia64_vms_dynamic_relocs (file
, &imgrela
);
6731 } dynamic_relocations
[] =
6733 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
6734 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
6735 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
6738 /* Process the reloc section. */
6741 process_relocs (FILE * file
)
6743 unsigned long rel_size
;
6744 unsigned long rel_offset
;
6750 if (do_using_dynamic
)
6754 int has_dynamic_reloc
;
6757 has_dynamic_reloc
= 0;
6759 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
6761 is_rela
= dynamic_relocations
[i
].rela
;
6762 name
= dynamic_relocations
[i
].name
;
6763 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
6764 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
6766 has_dynamic_reloc
|= rel_size
;
6768 if (is_rela
== UNKNOWN
)
6770 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
6771 switch (dynamic_info
[DT_PLTREL
])
6785 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6786 name
, rel_offset
, rel_size
);
6788 dump_relocations (file
,
6789 offset_from_vma (file
, rel_offset
, rel_size
),
6791 dynamic_symbols
, num_dynamic_syms
,
6792 dynamic_strings
, dynamic_strings_length
,
6798 has_dynamic_reloc
|= process_ia64_vms_dynamic_relocs (file
);
6800 if (! has_dynamic_reloc
)
6801 printf (_("\nThere are no dynamic relocations in this file.\n"));
6805 Elf_Internal_Shdr
* section
;
6809 for (i
= 0, section
= section_headers
;
6810 i
< elf_header
.e_shnum
;
6813 if ( section
->sh_type
!= SHT_RELA
6814 && section
->sh_type
!= SHT_REL
)
6817 rel_offset
= section
->sh_offset
;
6818 rel_size
= section
->sh_size
;
6822 Elf_Internal_Shdr
* strsec
;
6825 printf (_("\nRelocation section "));
6827 if (string_table
== NULL
)
6828 printf ("%d", section
->sh_name
);
6830 printf ("'%s'", printable_section_name (section
));
6832 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6833 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
6835 is_rela
= section
->sh_type
== SHT_RELA
;
6837 if (section
->sh_link
!= 0
6838 && section
->sh_link
< elf_header
.e_shnum
)
6840 Elf_Internal_Shdr
* symsec
;
6841 Elf_Internal_Sym
* symtab
;
6842 unsigned long nsyms
;
6843 unsigned long strtablen
= 0;
6844 char * strtab
= NULL
;
6846 symsec
= section_headers
+ section
->sh_link
;
6847 if (symsec
->sh_type
!= SHT_SYMTAB
6848 && symsec
->sh_type
!= SHT_DYNSYM
)
6851 symtab
= GET_ELF_SYMBOLS (file
, symsec
, & nsyms
);
6856 if (symsec
->sh_link
!= 0
6857 && symsec
->sh_link
< elf_header
.e_shnum
)
6859 strsec
= section_headers
+ symsec
->sh_link
;
6861 strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
6864 strtablen
= strtab
== NULL
? 0 : strsec
->sh_size
;
6867 dump_relocations (file
, rel_offset
, rel_size
,
6868 symtab
, nsyms
, strtab
, strtablen
,
6870 symsec
->sh_type
== SHT_DYNSYM
);
6876 dump_relocations (file
, rel_offset
, rel_size
,
6877 NULL
, 0, NULL
, 0, is_rela
, 0);
6884 printf (_("\nThere are no relocations in this file.\n"));
6890 /* An absolute address consists of a section and an offset. If the
6891 section is NULL, the offset itself is the address, otherwise, the
6892 address equals to LOAD_ADDRESS(section) + offset. */
6896 unsigned short section
;
6900 #define ABSADDR(a) \
6902 ? section_headers [(a).section].sh_addr + (a).offset \
6905 /* Find the nearest symbol at or below ADDR. Returns the symbol
6906 name, if found, and the offset from the symbol to ADDR. */
6909 find_symbol_for_address (Elf_Internal_Sym
* symtab
,
6910 unsigned long nsyms
,
6911 const char * strtab
,
6912 unsigned long strtab_size
,
6913 struct absaddr addr
,
6914 const char ** symname
,
6917 bfd_vma dist
= 0x100000;
6918 Elf_Internal_Sym
* sym
;
6919 Elf_Internal_Sym
* beg
;
6920 Elf_Internal_Sym
* end
;
6921 Elf_Internal_Sym
* best
= NULL
;
6923 REMOVE_ARCH_BITS (addr
.offset
);
6925 end
= symtab
+ nsyms
;
6931 sym
= beg
+ (end
- beg
) / 2;
6933 value
= sym
->st_value
;
6934 REMOVE_ARCH_BITS (value
);
6936 if (sym
->st_name
!= 0
6937 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
6938 && addr
.offset
>= value
6939 && addr
.offset
- value
< dist
)
6942 dist
= addr
.offset
- value
;
6947 if (addr
.offset
< value
)
6955 *symname
= (best
->st_name
>= strtab_size
6956 ? _("<corrupt>") : strtab
+ best
->st_name
);
6962 *offset
= addr
.offset
;
6966 symcmp (const void *p
, const void *q
)
6968 Elf_Internal_Sym
*sp
= (Elf_Internal_Sym
*) p
;
6969 Elf_Internal_Sym
*sq
= (Elf_Internal_Sym
*) q
;
6971 return sp
->st_value
> sq
->st_value
? 1 : (sp
->st_value
< sq
->st_value
? -1 : 0);
6974 /* Process the unwind section. */
6976 #include "unwind-ia64.h"
6978 struct ia64_unw_table_entry
6980 struct absaddr start
;
6982 struct absaddr info
;
6985 struct ia64_unw_aux_info
6987 struct ia64_unw_table_entry
*table
; /* Unwind table. */
6988 unsigned long table_len
; /* Length of unwind table. */
6989 unsigned char * info
; /* Unwind info. */
6990 unsigned long info_size
; /* Size of unwind info. */
6991 bfd_vma info_addr
; /* Starting address of unwind info. */
6992 bfd_vma seg_base
; /* Starting address of segment. */
6993 Elf_Internal_Sym
* symtab
; /* The symbol table. */
6994 unsigned long nsyms
; /* Number of symbols. */
6995 Elf_Internal_Sym
* funtab
; /* Sorted table of STT_FUNC symbols. */
6996 unsigned long nfuns
; /* Number of entries in funtab. */
6997 char * strtab
; /* The string table. */
6998 unsigned long strtab_size
; /* Size of string table. */
7002 dump_ia64_unwind (struct ia64_unw_aux_info
* aux
)
7004 struct ia64_unw_table_entry
* tp
;
7005 unsigned long j
, nfuns
;
7008 aux
->funtab
= xmalloc (aux
->nsyms
* sizeof (Elf_Internal_Sym
));
7009 for (nfuns
= 0, j
= 0; j
< aux
->nsyms
; j
++)
7010 if (aux
->symtab
[j
].st_value
&& ELF_ST_TYPE (aux
->symtab
[j
].st_info
) == STT_FUNC
)
7011 aux
->funtab
[nfuns
++] = aux
->symtab
[j
];
7013 qsort (aux
->funtab
, aux
->nfuns
, sizeof (Elf_Internal_Sym
), symcmp
);
7015 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
7019 const unsigned char * dp
;
7020 const unsigned char * head
;
7021 const unsigned char * end
;
7022 const char * procname
;
7024 find_symbol_for_address (aux
->funtab
, aux
->nfuns
, aux
->strtab
,
7025 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
7027 fputs ("\n<", stdout
);
7031 fputs (procname
, stdout
);
7034 printf ("+%lx", (unsigned long) offset
);
7037 fputs (">: [", stdout
);
7038 print_vma (tp
->start
.offset
, PREFIX_HEX
);
7039 fputc ('-', stdout
);
7040 print_vma (tp
->end
.offset
, PREFIX_HEX
);
7041 printf ("], info at +0x%lx\n",
7042 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
7044 /* PR 17531: file: 86232b32. */
7045 if (aux
->info
== NULL
)
7048 /* PR 17531: file: 0997b4d1. */
7049 if ((ABSADDR (tp
->info
) - aux
->info_addr
) >= aux
->info_size
)
7051 warn (_("Invalid offset %lx in table entry %ld\n"),
7052 (long) tp
->info
.offset
, (long) (tp
- aux
->table
));
7056 head
= aux
->info
+ (ABSADDR (tp
->info
) - aux
->info_addr
);
7057 stamp
= byte_get ((unsigned char *) head
, sizeof (stamp
));
7059 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7060 (unsigned) UNW_VER (stamp
),
7061 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
7062 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
7063 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
7064 (unsigned long) (eh_addr_size
* UNW_LENGTH (stamp
)));
7066 if (UNW_VER (stamp
) != 1)
7068 printf (_("\tUnknown version.\n"));
7073 end
= head
+ 8 + eh_addr_size
* UNW_LENGTH (stamp
);
7074 /* PR 17531: file: 16ceda89. */
7075 if (end
> aux
->info
+ aux
->info_size
)
7076 end
= aux
->info
+ aux
->info_size
;
7077 for (dp
= head
+ 8; dp
< end
;)
7078 dp
= unw_decode (dp
, in_body
, & in_body
, end
);
7085 slurp_ia64_unwind_table (FILE * file
,
7086 struct ia64_unw_aux_info
* aux
,
7087 Elf_Internal_Shdr
* sec
)
7089 unsigned long size
, nrelas
, i
;
7090 Elf_Internal_Phdr
* seg
;
7091 struct ia64_unw_table_entry
* tep
;
7092 Elf_Internal_Shdr
* relsec
;
7093 Elf_Internal_Rela
* rela
;
7094 Elf_Internal_Rela
* rp
;
7095 unsigned char * table
;
7097 Elf_Internal_Sym
* sym
;
7098 const char * relname
;
7102 /* First, find the starting address of the segment that includes
7105 if (elf_header
.e_phnum
)
7107 if (! get_program_headers (file
))
7110 for (seg
= program_headers
;
7111 seg
< program_headers
+ elf_header
.e_phnum
;
7114 if (seg
->p_type
!= PT_LOAD
)
7117 if (sec
->sh_addr
>= seg
->p_vaddr
7118 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
7120 aux
->seg_base
= seg
->p_vaddr
;
7126 /* Second, build the unwind table from the contents of the unwind section: */
7127 size
= sec
->sh_size
;
7128 table
= (unsigned char *) get_data (NULL
, file
, sec
->sh_offset
, 1, size
,
7133 aux
->table_len
= size
/ (3 * eh_addr_size
);
7134 aux
->table
= (struct ia64_unw_table_entry
*)
7135 xcmalloc (aux
->table_len
, sizeof (aux
->table
[0]));
7138 for (tp
= table
; tp
<= table
+ size
- (3 * eh_addr_size
); ++tep
)
7140 tep
->start
.section
= SHN_UNDEF
;
7141 tep
->end
.section
= SHN_UNDEF
;
7142 tep
->info
.section
= SHN_UNDEF
;
7143 tep
->start
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
7144 tep
->end
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
7145 tep
->info
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
7146 tep
->start
.offset
+= aux
->seg_base
;
7147 tep
->end
.offset
+= aux
->seg_base
;
7148 tep
->info
.offset
+= aux
->seg_base
;
7152 /* Third, apply any relocations to the unwind table: */
7153 for (relsec
= section_headers
;
7154 relsec
< section_headers
+ elf_header
.e_shnum
;
7157 if (relsec
->sh_type
!= SHT_RELA
7158 || relsec
->sh_info
>= elf_header
.e_shnum
7159 || section_headers
+ relsec
->sh_info
!= sec
)
7162 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
7171 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
7173 relname
= elf_ia64_reloc_type (get_reloc_type (rp
->r_info
));
7174 sym
= aux
->symtab
+ get_reloc_symindex (rp
->r_info
);
7176 /* PR 17531: file: 9fa67536. */
7177 if (relname
== NULL
)
7179 warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp
->r_info
));
7183 if (! const_strneq (relname
, "R_IA64_SEGREL"))
7185 warn (_("Skipping unexpected relocation type: %s\n"), relname
);
7189 i
= rp
->r_offset
/ (3 * eh_addr_size
);
7191 /* PR 17531: file: 5bc8d9bf. */
7192 if (i
>= aux
->table_len
)
7194 warn (_("Skipping reloc with overlarge offset: %lx\n"), i
);
7198 switch (rp
->r_offset
/ eh_addr_size
% 3)
7201 aux
->table
[i
].start
.section
= sym
->st_shndx
;
7202 aux
->table
[i
].start
.offset
= rp
->r_addend
+ sym
->st_value
;
7205 aux
->table
[i
].end
.section
= sym
->st_shndx
;
7206 aux
->table
[i
].end
.offset
= rp
->r_addend
+ sym
->st_value
;
7209 aux
->table
[i
].info
.section
= sym
->st_shndx
;
7210 aux
->table
[i
].info
.offset
= rp
->r_addend
+ sym
->st_value
;
7224 ia64_process_unwind (FILE * file
)
7226 Elf_Internal_Shdr
* sec
;
7227 Elf_Internal_Shdr
* unwsec
= NULL
;
7228 Elf_Internal_Shdr
* strsec
;
7229 unsigned long i
, unwcount
= 0, unwstart
= 0;
7230 struct ia64_unw_aux_info aux
;
7232 memset (& aux
, 0, sizeof (aux
));
7234 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
7236 if (sec
->sh_type
== SHT_SYMTAB
7237 && sec
->sh_link
< elf_header
.e_shnum
)
7239 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
, & aux
.nsyms
);
7241 strsec
= section_headers
+ sec
->sh_link
;
7242 if (aux
.strtab
!= NULL
)
7244 error (_("Multiple auxillary string tables encountered\n"));
7247 aux
.strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
7250 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
7252 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
7257 printf (_("\nThere are no unwind sections in this file.\n"));
7259 while (unwcount
-- > 0)
7264 for (i
= unwstart
, sec
= section_headers
+ unwstart
, unwsec
= NULL
;
7265 i
< elf_header
.e_shnum
; ++i
, ++sec
)
7266 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
7271 /* We have already counted the number of SHT_IA64_UNWIND
7272 sections so the loop above should never fail. */
7273 assert (unwsec
!= NULL
);
7276 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
7278 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
7280 /* We need to find which section group it is in. */
7281 struct group_list
* g
;
7283 if (section_headers_groups
== NULL
7284 || section_headers_groups
[i
] == NULL
)
7285 i
= elf_header
.e_shnum
;
7288 g
= section_headers_groups
[i
]->root
;
7290 for (; g
!= NULL
; g
= g
->next
)
7292 sec
= section_headers
+ g
->section_index
;
7294 if (streq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
))
7299 i
= elf_header
.e_shnum
;
7302 else if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
, len
))
7304 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
7305 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
7306 suffix
= SECTION_NAME (unwsec
) + len
;
7307 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
7309 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info_once
, len2
)
7310 && streq (SECTION_NAME (sec
) + len2
, suffix
))
7315 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7316 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
7317 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
7318 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
7320 if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
, len
))
7321 suffix
= SECTION_NAME (unwsec
) + len
;
7322 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
7324 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
, len2
)
7325 && streq (SECTION_NAME (sec
) + len2
, suffix
))
7329 if (i
== elf_header
.e_shnum
)
7331 printf (_("\nCould not find unwind info section for "));
7333 if (string_table
== NULL
)
7334 printf ("%d", unwsec
->sh_name
);
7336 printf ("'%s'", printable_section_name (unwsec
));
7340 aux
.info_addr
= sec
->sh_addr
;
7341 aux
.info
= (unsigned char *) get_data (NULL
, file
, sec
->sh_offset
, 1,
7344 aux
.info_size
= aux
.info
== NULL
? 0 : sec
->sh_size
;
7346 printf (_("\nUnwind section "));
7348 if (string_table
== NULL
)
7349 printf ("%d", unwsec
->sh_name
);
7351 printf ("'%s'", printable_section_name (unwsec
));
7353 printf (_(" at offset 0x%lx contains %lu entries:\n"),
7354 (unsigned long) unwsec
->sh_offset
,
7355 (unsigned long) (unwsec
->sh_size
/ (3 * eh_addr_size
)));
7357 if (slurp_ia64_unwind_table (file
, & aux
, unwsec
)
7358 && aux
.table_len
> 0)
7359 dump_ia64_unwind (& aux
);
7362 free ((char *) aux
.table
);
7364 free ((char *) aux
.info
);
7373 free ((char *) aux
.strtab
);
7376 struct hppa_unw_table_entry
7378 struct absaddr start
;
7380 unsigned int Cannot_unwind
:1; /* 0 */
7381 unsigned int Millicode
:1; /* 1 */
7382 unsigned int Millicode_save_sr0
:1; /* 2 */
7383 unsigned int Region_description
:2; /* 3..4 */
7384 unsigned int reserved1
:1; /* 5 */
7385 unsigned int Entry_SR
:1; /* 6 */
7386 unsigned int Entry_FR
:4; /* number saved */ /* 7..10 */
7387 unsigned int Entry_GR
:5; /* number saved */ /* 11..15 */
7388 unsigned int Args_stored
:1; /* 16 */
7389 unsigned int Variable_Frame
:1; /* 17 */
7390 unsigned int Separate_Package_Body
:1; /* 18 */
7391 unsigned int Frame_Extension_Millicode
:1; /* 19 */
7392 unsigned int Stack_Overflow_Check
:1; /* 20 */
7393 unsigned int Two_Instruction_SP_Increment
:1;/* 21 */
7394 unsigned int Ada_Region
:1; /* 22 */
7395 unsigned int cxx_info
:1; /* 23 */
7396 unsigned int cxx_try_catch
:1; /* 24 */
7397 unsigned int sched_entry_seq
:1; /* 25 */
7398 unsigned int reserved2
:1; /* 26 */
7399 unsigned int Save_SP
:1; /* 27 */
7400 unsigned int Save_RP
:1; /* 28 */
7401 unsigned int Save_MRP_in_frame
:1; /* 29 */
7402 unsigned int extn_ptr_defined
:1; /* 30 */
7403 unsigned int Cleanup_defined
:1; /* 31 */
7405 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
7406 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
7407 unsigned int Large_frame
:1; /* 2 */
7408 unsigned int Pseudo_SP_Set
:1; /* 3 */
7409 unsigned int reserved4
:1; /* 4 */
7410 unsigned int Total_frame_size
:27; /* 5..31 */
7413 struct hppa_unw_aux_info
7415 struct hppa_unw_table_entry
* table
; /* Unwind table. */
7416 unsigned long table_len
; /* Length of unwind table. */
7417 bfd_vma seg_base
; /* Starting address of segment. */
7418 Elf_Internal_Sym
* symtab
; /* The symbol table. */
7419 unsigned long nsyms
; /* Number of symbols. */
7420 Elf_Internal_Sym
* funtab
; /* Sorted table of STT_FUNC symbols. */
7421 unsigned long nfuns
; /* Number of entries in funtab. */
7422 char * strtab
; /* The string table. */
7423 unsigned long strtab_size
; /* Size of string table. */
7427 dump_hppa_unwind (struct hppa_unw_aux_info
* aux
)
7429 struct hppa_unw_table_entry
* tp
;
7430 unsigned long j
, nfuns
;
7432 aux
->funtab
= xmalloc (aux
->nsyms
* sizeof (Elf_Internal_Sym
));
7433 for (nfuns
= 0, j
= 0; j
< aux
->nsyms
; j
++)
7434 if (aux
->symtab
[j
].st_value
&& ELF_ST_TYPE (aux
->symtab
[j
].st_info
) == STT_FUNC
)
7435 aux
->funtab
[nfuns
++] = aux
->symtab
[j
];
7437 qsort (aux
->funtab
, aux
->nfuns
, sizeof (Elf_Internal_Sym
), symcmp
);
7439 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
7442 const char * procname
;
7444 find_symbol_for_address (aux
->funtab
, aux
->nfuns
, aux
->strtab
,
7445 aux
->strtab_size
, tp
->start
, &procname
,
7448 fputs ("\n<", stdout
);
7452 fputs (procname
, stdout
);
7455 printf ("+%lx", (unsigned long) offset
);
7458 fputs (">: [", stdout
);
7459 print_vma (tp
->start
.offset
, PREFIX_HEX
);
7460 fputc ('-', stdout
);
7461 print_vma (tp
->end
.offset
, PREFIX_HEX
);
7464 #define PF(_m) if (tp->_m) printf (#_m " ");
7465 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7468 PF(Millicode_save_sr0
);
7469 /* PV(Region_description); */
7475 PF(Separate_Package_Body
);
7476 PF(Frame_Extension_Millicode
);
7477 PF(Stack_Overflow_Check
);
7478 PF(Two_Instruction_SP_Increment
);
7482 PF(sched_entry_seq
);
7485 PF(Save_MRP_in_frame
);
7486 PF(extn_ptr_defined
);
7487 PF(Cleanup_defined
);
7488 PF(MPE_XL_interrupt_marker
);
7489 PF(HP_UX_interrupt_marker
);
7492 PV(Total_frame_size
);
7503 slurp_hppa_unwind_table (FILE * file
,
7504 struct hppa_unw_aux_info
* aux
,
7505 Elf_Internal_Shdr
* sec
)
7507 unsigned long size
, unw_ent_size
, nentries
, nrelas
, i
;
7508 Elf_Internal_Phdr
* seg
;
7509 struct hppa_unw_table_entry
* tep
;
7510 Elf_Internal_Shdr
* relsec
;
7511 Elf_Internal_Rela
* rela
;
7512 Elf_Internal_Rela
* rp
;
7513 unsigned char * table
;
7515 Elf_Internal_Sym
* sym
;
7516 const char * relname
;
7518 /* First, find the starting address of the segment that includes
7521 if (elf_header
.e_phnum
)
7523 if (! get_program_headers (file
))
7526 for (seg
= program_headers
;
7527 seg
< program_headers
+ elf_header
.e_phnum
;
7530 if (seg
->p_type
!= PT_LOAD
)
7533 if (sec
->sh_addr
>= seg
->p_vaddr
7534 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
7536 aux
->seg_base
= seg
->p_vaddr
;
7542 /* Second, build the unwind table from the contents of the unwind
7544 size
= sec
->sh_size
;
7545 table
= (unsigned char *) get_data (NULL
, file
, sec
->sh_offset
, 1, size
,
7551 nentries
= size
/ unw_ent_size
;
7552 size
= unw_ent_size
* nentries
;
7554 tep
= aux
->table
= (struct hppa_unw_table_entry
*)
7555 xcmalloc (nentries
, sizeof (aux
->table
[0]));
7557 for (tp
= table
; tp
< table
+ size
; tp
+= unw_ent_size
, ++tep
)
7559 unsigned int tmp1
, tmp2
;
7561 tep
->start
.section
= SHN_UNDEF
;
7562 tep
->end
.section
= SHN_UNDEF
;
7564 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
7565 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
7566 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
7567 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
7569 tep
->start
.offset
+= aux
->seg_base
;
7570 tep
->end
.offset
+= aux
->seg_base
;
7572 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
7573 tep
->Millicode
= (tmp1
>> 30) & 0x1;
7574 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
7575 tep
->Region_description
= (tmp1
>> 27) & 0x3;
7576 tep
->reserved1
= (tmp1
>> 26) & 0x1;
7577 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
7578 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
7579 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
7580 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
7581 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
7582 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
7583 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
7584 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
7585 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
7586 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
7587 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
7588 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
7589 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
7590 tep
->reserved2
= (tmp1
>> 5) & 0x1;
7591 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
7592 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
7593 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
7594 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
7595 tep
->Cleanup_defined
= tmp1
& 0x1;
7597 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
7598 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
7599 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
7600 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
7601 tep
->reserved4
= (tmp2
>> 27) & 0x1;
7602 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
7606 /* Third, apply any relocations to the unwind table. */
7607 for (relsec
= section_headers
;
7608 relsec
< section_headers
+ elf_header
.e_shnum
;
7611 if (relsec
->sh_type
!= SHT_RELA
7612 || relsec
->sh_info
>= elf_header
.e_shnum
7613 || section_headers
+ relsec
->sh_info
!= sec
)
7616 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
7620 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
7622 relname
= elf_hppa_reloc_type (get_reloc_type (rp
->r_info
));
7623 sym
= aux
->symtab
+ get_reloc_symindex (rp
->r_info
);
7625 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
7626 if (! const_strneq (relname
, "R_PARISC_SEGREL"))
7628 warn (_("Skipping unexpected relocation type %s\n"), relname
);
7632 i
= rp
->r_offset
/ unw_ent_size
;
7634 switch ((rp
->r_offset
% unw_ent_size
) / eh_addr_size
)
7637 aux
->table
[i
].start
.section
= sym
->st_shndx
;
7638 aux
->table
[i
].start
.offset
= sym
->st_value
+ rp
->r_addend
;
7641 aux
->table
[i
].end
.section
= sym
->st_shndx
;
7642 aux
->table
[i
].end
.offset
= sym
->st_value
+ rp
->r_addend
;
7652 aux
->table_len
= nentries
;
7658 hppa_process_unwind (FILE * file
)
7660 struct hppa_unw_aux_info aux
;
7661 Elf_Internal_Shdr
* unwsec
= NULL
;
7662 Elf_Internal_Shdr
* strsec
;
7663 Elf_Internal_Shdr
* sec
;
7666 if (string_table
== NULL
)
7669 memset (& aux
, 0, sizeof (aux
));
7671 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
7673 if (sec
->sh_type
== SHT_SYMTAB
7674 && sec
->sh_link
< elf_header
.e_shnum
)
7676 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
, & aux
.nsyms
);
7678 strsec
= section_headers
+ sec
->sh_link
;
7679 if (aux
.strtab
!= NULL
)
7681 error (_("Multiple auxillary string tables encountered\n"));
7684 aux
.strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
7687 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
7689 else if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
7694 printf (_("\nThere are no unwind sections in this file.\n"));
7696 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
7698 if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
7700 printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7701 printable_section_name (sec
),
7702 (unsigned long) sec
->sh_offset
,
7703 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
+ 8)));
7705 slurp_hppa_unwind_table (file
, &aux
, sec
);
7706 if (aux
.table_len
> 0)
7707 dump_hppa_unwind (&aux
);
7710 free ((char *) aux
.table
);
7718 free ((char *) aux
.strtab
);
7723 unsigned char * data
; /* The unwind data. */
7724 Elf_Internal_Shdr
* sec
; /* The cached unwind section header. */
7725 Elf_Internal_Rela
* rela
; /* The cached relocations for this section. */
7726 unsigned long nrelas
; /* The number of relocations. */
7727 unsigned int rel_type
; /* REL or RELA ? */
7728 Elf_Internal_Rela
* next_rela
; /* Cyclic pointer to the next reloc to process. */
7731 struct arm_unw_aux_info
7733 FILE * file
; /* The file containing the unwind sections. */
7734 Elf_Internal_Sym
* symtab
; /* The file's symbol table. */
7735 unsigned long nsyms
; /* Number of symbols. */
7736 Elf_Internal_Sym
* funtab
; /* Sorted table of STT_FUNC symbols. */
7737 unsigned long nfuns
; /* Number of these symbols. */
7738 char * strtab
; /* The file's string table. */
7739 unsigned long strtab_size
; /* Size of string table. */
7743 arm_print_vma_and_name (struct arm_unw_aux_info
*aux
,
7744 bfd_vma fn
, struct absaddr addr
)
7746 const char *procname
;
7749 if (addr
.section
== SHN_UNDEF
)
7752 find_symbol_for_address (aux
->funtab
, aux
->nfuns
, aux
->strtab
,
7753 aux
->strtab_size
, addr
, &procname
,
7756 print_vma (fn
, PREFIX_HEX
);
7760 fputs (" <", stdout
);
7761 fputs (procname
, stdout
);
7764 printf ("+0x%lx", (unsigned long) sym_offset
);
7765 fputc ('>', stdout
);
7772 arm_free_section (struct arm_section
*arm_sec
)
7774 if (arm_sec
->data
!= NULL
)
7775 free (arm_sec
->data
);
7777 if (arm_sec
->rela
!= NULL
)
7778 free (arm_sec
->rela
);
7781 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7782 cached section and install SEC instead.
7783 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7784 and return its valued in * WORDP, relocating if necessary.
7785 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7786 relocation's offset in ADDR.
7787 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7788 into the string table of the symbol associated with the reloc. If no
7789 reloc was applied store -1 there.
7790 5) Return TRUE upon success, FALSE otherwise. */
7793 get_unwind_section_word (struct arm_unw_aux_info
* aux
,
7794 struct arm_section
* arm_sec
,
7795 Elf_Internal_Shdr
* sec
,
7796 bfd_vma word_offset
,
7797 unsigned int * wordp
,
7798 struct absaddr
* addr
,
7801 Elf_Internal_Rela
*rp
;
7802 Elf_Internal_Sym
*sym
;
7803 const char * relname
;
7805 bfd_boolean wrapped
;
7807 if (sec
== NULL
|| arm_sec
== NULL
)
7810 addr
->section
= SHN_UNDEF
;
7813 if (sym_name
!= NULL
)
7814 *sym_name
= (bfd_vma
) -1;
7816 /* If necessary, update the section cache. */
7817 if (sec
!= arm_sec
->sec
)
7819 Elf_Internal_Shdr
*relsec
;
7821 arm_free_section (arm_sec
);
7824 arm_sec
->data
= get_data (NULL
, aux
->file
, sec
->sh_offset
, 1,
7825 sec
->sh_size
, _("unwind data"));
7826 arm_sec
->rela
= NULL
;
7827 arm_sec
->nrelas
= 0;
7829 for (relsec
= section_headers
;
7830 relsec
< section_headers
+ elf_header
.e_shnum
;
7833 if (relsec
->sh_info
>= elf_header
.e_shnum
7834 || section_headers
+ relsec
->sh_info
!= sec
7835 /* PR 15745: Check the section type as well. */
7836 || (relsec
->sh_type
!= SHT_REL
7837 && relsec
->sh_type
!= SHT_RELA
))
7840 arm_sec
->rel_type
= relsec
->sh_type
;
7841 if (relsec
->sh_type
== SHT_REL
)
7843 if (!slurp_rel_relocs (aux
->file
, relsec
->sh_offset
,
7845 & arm_sec
->rela
, & arm_sec
->nrelas
))
7848 else /* relsec->sh_type == SHT_RELA */
7850 if (!slurp_rela_relocs (aux
->file
, relsec
->sh_offset
,
7852 & arm_sec
->rela
, & arm_sec
->nrelas
))
7858 arm_sec
->next_rela
= arm_sec
->rela
;
7861 /* If there is no unwind data we can do nothing. */
7862 if (arm_sec
->data
== NULL
)
7865 /* If the offset is invalid then fail. */
7866 if (word_offset
> (sec
->sh_size
- 4)
7868 || (sec
->sh_size
< 5 && word_offset
>= sec
->sh_size
)
7869 || ((bfd_signed_vma
) word_offset
) < 0)
7872 /* Get the word at the required offset. */
7873 word
= byte_get (arm_sec
->data
+ word_offset
, 4);
7875 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
7876 if (arm_sec
->rela
== NULL
)
7882 /* Look through the relocs to find the one that applies to the provided offset. */
7884 for (rp
= arm_sec
->next_rela
; rp
!= arm_sec
->rela
+ arm_sec
->nrelas
; rp
++)
7886 bfd_vma prelval
, offset
;
7888 if (rp
->r_offset
> word_offset
&& !wrapped
)
7893 if (rp
->r_offset
> word_offset
)
7896 if (rp
->r_offset
& 3)
7898 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7899 (unsigned long) rp
->r_offset
);
7903 if (rp
->r_offset
< word_offset
)
7906 /* PR 17531: file: 027-161405-0.004 */
7907 if (aux
->symtab
== NULL
)
7910 if (arm_sec
->rel_type
== SHT_REL
)
7912 offset
= word
& 0x7fffffff;
7913 if (offset
& 0x40000000)
7914 offset
|= ~ (bfd_vma
) 0x7fffffff;
7916 else if (arm_sec
->rel_type
== SHT_RELA
)
7917 offset
= rp
->r_addend
;
7920 error (_("Unknown section relocation type %d encountered\n"),
7925 /* PR 17531 file: 027-1241568-0.004. */
7926 if (ELF32_R_SYM (rp
->r_info
) >= aux
->nsyms
)
7928 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7929 (unsigned long) ELF32_R_SYM (rp
->r_info
), aux
->nsyms
);
7933 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
7934 offset
+= sym
->st_value
;
7935 prelval
= offset
- (arm_sec
->sec
->sh_addr
+ rp
->r_offset
);
7937 /* Check that we are processing the expected reloc type. */
7938 if (elf_header
.e_machine
== EM_ARM
)
7940 relname
= elf_arm_reloc_type (ELF32_R_TYPE (rp
->r_info
));
7941 if (relname
== NULL
)
7943 warn (_("Skipping unknown ARM relocation type: %d\n"),
7944 (int) ELF32_R_TYPE (rp
->r_info
));
7948 if (streq (relname
, "R_ARM_NONE"))
7951 if (! streq (relname
, "R_ARM_PREL31"))
7953 warn (_("Skipping unexpected ARM relocation type %s\n"), relname
);
7957 else if (elf_header
.e_machine
== EM_TI_C6000
)
7959 relname
= elf_tic6x_reloc_type (ELF32_R_TYPE (rp
->r_info
));
7960 if (relname
== NULL
)
7962 warn (_("Skipping unknown C6000 relocation type: %d\n"),
7963 (int) ELF32_R_TYPE (rp
->r_info
));
7967 if (streq (relname
, "R_C6000_NONE"))
7970 if (! streq (relname
, "R_C6000_PREL31"))
7972 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname
);
7980 /* This function currently only supports ARM and TI unwinders. */
7981 warn (_("Only TI and ARM unwinders are currently supported\n"));
7985 word
= (word
& ~ (bfd_vma
) 0x7fffffff) | (prelval
& 0x7fffffff);
7986 addr
->section
= sym
->st_shndx
;
7987 addr
->offset
= offset
;
7990 * sym_name
= sym
->st_name
;
7995 arm_sec
->next_rela
= rp
;
8000 static const char *tic6x_unwind_regnames
[16] =
8002 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8003 "A14", "A13", "A12", "A11", "A10",
8004 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8008 decode_tic6x_unwind_regmask (unsigned int mask
)
8012 for (i
= 12; mask
; mask
>>= 1, i
--)
8016 fputs (tic6x_unwind_regnames
[i
], stdout
);
8018 fputs (", ", stdout
);
8024 if (remaining == 0 && more_words) \
8027 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
8028 data_offset, & word, & addr, NULL)) \
8034 #define GET_OP(OP) \
8039 (OP) = word >> 24; \
8044 printf (_("[Truncated opcode]\n")); \
8047 printf ("0x%02x ", OP)
8050 decode_arm_unwind_bytecode (struct arm_unw_aux_info
* aux
,
8052 unsigned int remaining
,
8053 unsigned int more_words
,
8054 bfd_vma data_offset
,
8055 Elf_Internal_Shdr
* data_sec
,
8056 struct arm_section
* data_arm_sec
)
8058 struct absaddr addr
;
8060 /* Decode the unwinding instructions. */
8063 unsigned int op
, op2
;
8072 printf (" 0x%02x ", op
);
8074 if ((op
& 0xc0) == 0x00)
8076 int offset
= ((op
& 0x3f) << 2) + 4;
8078 printf (" vsp = vsp + %d", offset
);
8080 else if ((op
& 0xc0) == 0x40)
8082 int offset
= ((op
& 0x3f) << 2) + 4;
8084 printf (" vsp = vsp - %d", offset
);
8086 else if ((op
& 0xf0) == 0x80)
8089 if (op
== 0x80 && op2
== 0)
8090 printf (_("Refuse to unwind"));
8093 unsigned int mask
= ((op
& 0x0f) << 8) | op2
;
8098 for (i
= 0; i
< 12; i
++)
8099 if (mask
& (1 << i
))
8105 printf ("r%d", 4 + i
);
8110 else if ((op
& 0xf0) == 0x90)
8112 if (op
== 0x9d || op
== 0x9f)
8113 printf (_(" [Reserved]"));
8115 printf (" vsp = r%d", op
& 0x0f);
8117 else if ((op
& 0xf0) == 0xa0)
8119 int end
= 4 + (op
& 0x07);
8124 for (i
= 4; i
<= end
; i
++)
8140 else if (op
== 0xb0)
8141 printf (_(" finish"));
8142 else if (op
== 0xb1)
8145 if (op2
== 0 || (op2
& 0xf0) != 0)
8146 printf (_("[Spare]"));
8149 unsigned int mask
= op2
& 0x0f;
8154 for (i
= 0; i
< 12; i
++)
8155 if (mask
& (1 << i
))
8166 else if (op
== 0xb2)
8168 unsigned char buf
[9];
8169 unsigned int i
, len
;
8170 unsigned long offset
;
8172 for (i
= 0; i
< sizeof (buf
); i
++)
8175 if ((buf
[i
] & 0x80) == 0)
8178 if (i
== sizeof (buf
))
8179 printf (_("corrupt change to vsp"));
8182 offset
= read_uleb128 (buf
, &len
, buf
+ i
+ 1);
8183 assert (len
== i
+ 1);
8184 offset
= offset
* 4 + 0x204;
8185 printf ("vsp = vsp + %ld", offset
);
8188 else if (op
== 0xb3 || op
== 0xc8 || op
== 0xc9)
8190 unsigned int first
, last
;
8197 printf ("pop {D%d", first
);
8199 printf ("-D%d", first
+ last
);
8202 else if ((op
& 0xf8) == 0xb8 || (op
& 0xf8) == 0xd0)
8204 unsigned int count
= op
& 0x07;
8208 printf ("-D%d", 8 + count
);
8211 else if (op
>= 0xc0 && op
<= 0xc5)
8213 unsigned int count
= op
& 0x07;
8215 printf (" pop {wR10");
8217 printf ("-wR%d", 10 + count
);
8220 else if (op
== 0xc6)
8222 unsigned int first
, last
;
8227 printf ("pop {wR%d", first
);
8229 printf ("-wR%d", first
+ last
);
8232 else if (op
== 0xc7)
8235 if (op2
== 0 || (op2
& 0xf0) != 0)
8236 printf (_("[Spare]"));
8239 unsigned int mask
= op2
& 0x0f;
8244 for (i
= 0; i
< 4; i
++)
8245 if (mask
& (1 << i
))
8251 printf ("wCGR%d", i
);
8257 printf (_(" [unsupported opcode]"));
8263 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info
* aux
,
8265 unsigned int remaining
,
8266 unsigned int more_words
,
8267 bfd_vma data_offset
,
8268 Elf_Internal_Shdr
* data_sec
,
8269 struct arm_section
* data_arm_sec
)
8271 struct absaddr addr
;
8273 /* Decode the unwinding instructions. */
8276 unsigned int op
, op2
;
8285 printf (" 0x%02x ", op
);
8287 if ((op
& 0xc0) == 0x00)
8289 int offset
= ((op
& 0x3f) << 3) + 8;
8290 printf (" sp = sp + %d", offset
);
8292 else if ((op
& 0xc0) == 0x80)
8295 if (op
== 0x80 && op2
== 0)
8296 printf (_("Refuse to unwind"));
8299 unsigned int mask
= ((op
& 0x1f) << 8) | op2
;
8301 printf ("pop compact {");
8305 decode_tic6x_unwind_regmask (mask
);
8309 else if ((op
& 0xf0) == 0xc0)
8317 unsigned int offset
;
8321 /* Scan entire instruction first so that GET_OP output is not
8322 interleaved with disassembly. */
8324 for (i
= 0; nregs
< (op
& 0xf); i
++)
8330 regpos
[nregs
].offset
= i
* 2;
8331 regpos
[nregs
].reg
= reg
;
8338 regpos
[nregs
].offset
= i
* 2 + 1;
8339 regpos
[nregs
].reg
= reg
;
8344 printf (_("pop frame {"));
8346 for (i
= i
* 2; i
> 0; i
--)
8348 if (regpos
[reg
].offset
== i
- 1)
8350 name
= tic6x_unwind_regnames
[regpos
[reg
].reg
];
8357 fputs (name
, stdout
);
8364 else if (op
== 0xd0)
8365 printf (" MOV FP, SP");
8366 else if (op
== 0xd1)
8367 printf (" __c6xabi_pop_rts");
8368 else if (op
== 0xd2)
8370 unsigned char buf
[9];
8371 unsigned int i
, len
;
8372 unsigned long offset
;
8374 for (i
= 0; i
< sizeof (buf
); i
++)
8377 if ((buf
[i
] & 0x80) == 0)
8380 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8381 if (i
== sizeof (buf
))
8383 printf ("<corrupt sp adjust>\n");
8384 warn (_("Corrupt stack pointer adjustment detected\n"));
8388 offset
= read_uleb128 (buf
, &len
, buf
+ i
+ 1);
8389 assert (len
== i
+ 1);
8390 offset
= offset
* 8 + 0x408;
8391 printf (_("sp = sp + %ld"), offset
);
8393 else if ((op
& 0xf0) == 0xe0)
8395 if ((op
& 0x0f) == 7)
8398 printf (" MV %s, B3", tic6x_unwind_regnames
[op
& 0x0f]);
8402 printf (_(" [unsupported opcode]"));
8409 arm_expand_prel31 (bfd_vma word
, bfd_vma where
)
8413 offset
= word
& 0x7fffffff;
8414 if (offset
& 0x40000000)
8415 offset
|= ~ (bfd_vma
) 0x7fffffff;
8417 if (elf_header
.e_machine
== EM_TI_C6000
)
8420 return offset
+ where
;
8424 decode_arm_unwind (struct arm_unw_aux_info
* aux
,
8426 unsigned int remaining
,
8427 bfd_vma data_offset
,
8428 Elf_Internal_Shdr
* data_sec
,
8429 struct arm_section
* data_arm_sec
)
8432 unsigned int more_words
= 0;
8433 struct absaddr addr
;
8434 bfd_vma sym_name
= (bfd_vma
) -1;
8438 /* Fetch the first word.
8439 Note - when decoding an object file the address extracted
8440 here will always be 0. So we also pass in the sym_name
8441 parameter so that we can find the symbol associated with
8442 the personality routine. */
8443 if (! get_unwind_section_word (aux
, data_arm_sec
, data_sec
, data_offset
,
8444 & word
, & addr
, & sym_name
))
8450 if ((word
& 0x80000000) == 0)
8452 /* Expand prel31 for personality routine. */
8454 const char *procname
;
8456 fn
= arm_expand_prel31 (word
, data_sec
->sh_addr
+ data_offset
);
8457 printf (_(" Personality routine: "));
8459 && addr
.section
== SHN_UNDEF
&& addr
.offset
== 0
8460 && sym_name
!= (bfd_vma
) -1 && sym_name
< aux
->strtab_size
)
8462 procname
= aux
->strtab
+ sym_name
;
8463 print_vma (fn
, PREFIX_HEX
);
8466 fputs (" <", stdout
);
8467 fputs (procname
, stdout
);
8468 fputc ('>', stdout
);
8472 procname
= arm_print_vma_and_name (aux
, fn
, addr
);
8473 fputc ('\n', stdout
);
8475 /* The GCC personality routines use the standard compact
8476 encoding, starting with one byte giving the number of
8478 if (procname
!= NULL
8479 && (const_strneq (procname
, "__gcc_personality_v0")
8480 || const_strneq (procname
, "__gxx_personality_v0")
8481 || const_strneq (procname
, "__gcj_personality_v0")
8482 || const_strneq (procname
, "__gnu_objc_personality_v0")))
8489 printf (_(" [Truncated data]\n"));
8492 more_words
= word
>> 24;
8502 /* ARM EHABI Section 6.3:
8504 An exception-handling table entry for the compact model looks like:
8508 1 0 index Data for personalityRoutine[index] */
8510 if (elf_header
.e_machine
== EM_ARM
8511 && (word
& 0x70000000))
8512 warn (_("Corrupt ARM compact model table entry: %x \n"), word
);
8514 per_index
= (word
>> 24) & 0x7f;
8515 printf (_(" Compact model index: %d\n"), per_index
);
8522 else if (per_index
< 3)
8524 more_words
= (word
>> 16) & 0xff;
8530 switch (elf_header
.e_machine
)
8535 decode_arm_unwind_bytecode (aux
, word
, remaining
, more_words
,
8536 data_offset
, data_sec
, data_arm_sec
);
8540 warn (_("Unknown ARM compact model index encountered\n"));
8541 printf (_(" [reserved]\n"));
8548 decode_tic6x_unwind_bytecode (aux
, word
, remaining
, more_words
,
8549 data_offset
, data_sec
, data_arm_sec
);
8551 else if (per_index
< 5)
8553 if (((word
>> 17) & 0x7f) == 0x7f)
8554 printf (_(" Restore stack from frame pointer\n"));
8556 printf (_(" Stack increment %d\n"), (word
>> 14) & 0x1fc);
8557 printf (_(" Registers restored: "));
8559 printf (" (compact) ");
8560 decode_tic6x_unwind_regmask ((word
>> 4) & 0x1fff);
8562 printf (_(" Return register: %s\n"),
8563 tic6x_unwind_regnames
[word
& 0xf]);
8566 printf (_(" [reserved (%d)]\n"), per_index
);
8570 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8571 elf_header
.e_machine
);
8574 /* Decode the descriptors. Not implemented. */
8578 dump_arm_unwind (struct arm_unw_aux_info
*aux
, Elf_Internal_Shdr
*exidx_sec
)
8580 struct arm_section exidx_arm_sec
, extab_arm_sec
;
8581 unsigned int i
, exidx_len
;
8582 unsigned long j
, nfuns
;
8584 memset (&exidx_arm_sec
, 0, sizeof (exidx_arm_sec
));
8585 memset (&extab_arm_sec
, 0, sizeof (extab_arm_sec
));
8586 exidx_len
= exidx_sec
->sh_size
/ 8;
8588 aux
->funtab
= xmalloc (aux
->nsyms
* sizeof (Elf_Internal_Sym
));
8589 for (nfuns
= 0, j
= 0; j
< aux
->nsyms
; j
++)
8590 if (aux
->symtab
[j
].st_value
&& ELF_ST_TYPE (aux
->symtab
[j
].st_info
) == STT_FUNC
)
8591 aux
->funtab
[nfuns
++] = aux
->symtab
[j
];
8593 qsort (aux
->funtab
, aux
->nfuns
, sizeof (Elf_Internal_Sym
), symcmp
);
8595 for (i
= 0; i
< exidx_len
; i
++)
8597 unsigned int exidx_fn
, exidx_entry
;
8598 struct absaddr fn_addr
, entry_addr
;
8601 fputc ('\n', stdout
);
8603 if (! get_unwind_section_word (aux
, & exidx_arm_sec
, exidx_sec
,
8604 8 * i
, & exidx_fn
, & fn_addr
, NULL
)
8605 || ! get_unwind_section_word (aux
, & exidx_arm_sec
, exidx_sec
,
8606 8 * i
+ 4, & exidx_entry
, & entry_addr
, NULL
))
8609 arm_free_section (& exidx_arm_sec
);
8610 arm_free_section (& extab_arm_sec
);
8614 /* ARM EHABI, Section 5:
8615 An index table entry consists of 2 words.
8616 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
8617 if (exidx_fn
& 0x80000000)
8618 warn (_("corrupt index table entry: %x\n"), exidx_fn
);
8620 fn
= arm_expand_prel31 (exidx_fn
, exidx_sec
->sh_addr
+ 8 * i
);
8622 arm_print_vma_and_name (aux
, fn
, fn_addr
);
8623 fputs (": ", stdout
);
8625 if (exidx_entry
== 1)
8627 print_vma (exidx_entry
, PREFIX_HEX
);
8628 fputs (" [cantunwind]\n", stdout
);
8630 else if (exidx_entry
& 0x80000000)
8632 print_vma (exidx_entry
, PREFIX_HEX
);
8633 fputc ('\n', stdout
);
8634 decode_arm_unwind (aux
, exidx_entry
, 4, 0, NULL
, NULL
);
8638 bfd_vma table
, table_offset
= 0;
8639 Elf_Internal_Shdr
*table_sec
;
8641 fputs ("@", stdout
);
8642 table
= arm_expand_prel31 (exidx_entry
, exidx_sec
->sh_addr
+ 8 * i
+ 4);
8643 print_vma (table
, PREFIX_HEX
);
8646 /* Locate the matching .ARM.extab. */
8647 if (entry_addr
.section
!= SHN_UNDEF
8648 && entry_addr
.section
< elf_header
.e_shnum
)
8650 table_sec
= section_headers
+ entry_addr
.section
;
8651 table_offset
= entry_addr
.offset
;
8653 if (table_offset
> table_sec
->sh_size
8654 || ((bfd_signed_vma
) table_offset
) < 0)
8656 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8657 (unsigned long) table_offset
,
8658 printable_section_name (table_sec
));
8664 table_sec
= find_section_by_address (table
);
8665 if (table_sec
!= NULL
)
8666 table_offset
= table
- table_sec
->sh_addr
;
8668 if (table_sec
== NULL
)
8670 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8671 (unsigned long) table
);
8674 decode_arm_unwind (aux
, 0, 0, table_offset
, table_sec
,
8682 arm_free_section (&exidx_arm_sec
);
8683 arm_free_section (&extab_arm_sec
);
8686 /* Used for both ARM and C6X unwinding tables. */
8689 arm_process_unwind (FILE *file
)
8691 struct arm_unw_aux_info aux
;
8692 Elf_Internal_Shdr
*unwsec
= NULL
;
8693 Elf_Internal_Shdr
*strsec
;
8694 Elf_Internal_Shdr
*sec
;
8696 unsigned int sec_type
;
8698 switch (elf_header
.e_machine
)
8701 sec_type
= SHT_ARM_EXIDX
;
8705 sec_type
= SHT_C6000_UNWIND
;
8709 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
8710 elf_header
.e_machine
);
8714 if (string_table
== NULL
)
8717 memset (& aux
, 0, sizeof (aux
));
8720 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
8722 if (sec
->sh_type
== SHT_SYMTAB
&& sec
->sh_link
< elf_header
.e_shnum
)
8724 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
, & aux
.nsyms
);
8726 strsec
= section_headers
+ sec
->sh_link
;
8728 /* PR binutils/17531 file: 011-12666-0.004. */
8729 if (aux
.strtab
!= NULL
)
8731 error (_("Multiple string tables found in file.\n"));
8734 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
8735 1, strsec
->sh_size
, _("string table"));
8736 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
8738 else if (sec
->sh_type
== sec_type
)
8743 printf (_("\nThere are no unwind sections in this file.\n"));
8745 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
8747 if (sec
->sh_type
== sec_type
)
8749 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8750 printable_section_name (sec
),
8751 (unsigned long) sec
->sh_offset
,
8752 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
)));
8754 dump_arm_unwind (&aux
, sec
);
8761 free ((char *) aux
.strtab
);
8765 process_unwind (FILE * file
)
8767 struct unwind_handler
8770 void (* handler
)(FILE *);
8773 { EM_ARM
, arm_process_unwind
},
8774 { EM_IA_64
, ia64_process_unwind
},
8775 { EM_PARISC
, hppa_process_unwind
},
8776 { EM_TI_C6000
, arm_process_unwind
},
8784 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
8785 if (elf_header
.e_machine
== handlers
[i
].machtype
)
8787 handlers
[i
].handler (file
);
8791 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8792 get_machine_name (elf_header
.e_machine
));
8796 dynamic_section_mips_val (Elf_Internal_Dyn
* entry
)
8798 switch (entry
->d_tag
)
8801 if (entry
->d_un
.d_val
== 0)
8805 static const char * opts
[] =
8807 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8808 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8809 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8810 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8816 for (cnt
= 0; cnt
< ARRAY_SIZE (opts
); ++cnt
)
8817 if (entry
->d_un
.d_val
& (1 << cnt
))
8819 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
8825 case DT_MIPS_IVERSION
:
8826 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
8827 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
8831 sprintf_vma (buf
, entry
->d_un
.d_ptr
);
8832 /* Note: coded this way so that there is a single string for translation. */
8833 printf (_("<corrupt: %s>"), buf
);
8837 case DT_MIPS_TIME_STAMP
:
8841 time_t atime
= entry
->d_un
.d_val
;
8843 tmp
= gmtime (&atime
);
8844 /* PR 17531: file: 6accc532. */
8846 snprintf (timebuf
, sizeof (timebuf
), _("<corrupt>"));
8848 snprintf (timebuf
, sizeof (timebuf
), "%04u-%02u-%02uT%02u:%02u:%02u",
8849 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
8850 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
8851 printf (_("Time Stamp: %s"), timebuf
);
8855 case DT_MIPS_RLD_VERSION
:
8856 case DT_MIPS_LOCAL_GOTNO
:
8857 case DT_MIPS_CONFLICTNO
:
8858 case DT_MIPS_LIBLISTNO
:
8859 case DT_MIPS_SYMTABNO
:
8860 case DT_MIPS_UNREFEXTNO
:
8861 case DT_MIPS_HIPAGENO
:
8862 case DT_MIPS_DELTA_CLASS_NO
:
8863 case DT_MIPS_DELTA_INSTANCE_NO
:
8864 case DT_MIPS_DELTA_RELOC_NO
:
8865 case DT_MIPS_DELTA_SYM_NO
:
8866 case DT_MIPS_DELTA_CLASSSYM_NO
:
8867 case DT_MIPS_COMPACT_SIZE
:
8868 print_vma (entry
->d_un
.d_val
, DEC
);
8872 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
8878 dynamic_section_parisc_val (Elf_Internal_Dyn
* entry
)
8880 switch (entry
->d_tag
)
8882 case DT_HP_DLD_FLAGS
:
8891 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
8892 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
8893 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
8894 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
8895 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
8896 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
8897 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
8898 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
8899 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
8900 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
8901 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" },
8902 { DT_HP_GST
, "HP_GST" },
8903 { DT_HP_SHLIB_FIXED
, "HP_SHLIB_FIXED" },
8904 { DT_HP_MERGE_SHLIB_SEG
, "HP_MERGE_SHLIB_SEG" },
8905 { DT_HP_NODELETE
, "HP_NODELETE" },
8906 { DT_HP_GROUP
, "HP_GROUP" },
8907 { DT_HP_PROTECT_LINKAGE_TABLE
, "HP_PROTECT_LINKAGE_TABLE" }
8911 bfd_vma val
= entry
->d_un
.d_val
;
8913 for (cnt
= 0; cnt
< ARRAY_SIZE (flags
); ++cnt
)
8914 if (val
& flags
[cnt
].bit
)
8918 fputs (flags
[cnt
].str
, stdout
);
8920 val
^= flags
[cnt
].bit
;
8923 if (val
!= 0 || first
)
8927 print_vma (val
, HEX
);
8933 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
8941 /* VMS vs Unix time offset and factor. */
8943 #define VMS_EPOCH_OFFSET 35067168000000000LL
8944 #define VMS_GRANULARITY_FACTOR 10000000
8946 /* Display a VMS time in a human readable format. */
8949 print_vms_time (bfd_int64_t vmstime
)
8954 unxtime
= (vmstime
- VMS_EPOCH_OFFSET
) / VMS_GRANULARITY_FACTOR
;
8955 tm
= gmtime (&unxtime
);
8956 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8957 tm
->tm_year
+ 1900, tm
->tm_mon
+ 1, tm
->tm_mday
,
8958 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
8963 dynamic_section_ia64_val (Elf_Internal_Dyn
* entry
)
8965 switch (entry
->d_tag
)
8967 case DT_IA_64_PLT_RESERVE
:
8968 /* First 3 slots reserved. */
8969 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
8971 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
8974 case DT_IA_64_VMS_LINKTIME
:
8976 print_vms_time (entry
->d_un
.d_val
);
8980 case DT_IA_64_VMS_LNKFLAGS
:
8981 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
8982 if (entry
->d_un
.d_val
& VMS_LF_CALL_DEBUG
)
8983 printf (" CALL_DEBUG");
8984 if (entry
->d_un
.d_val
& VMS_LF_NOP0BUFS
)
8985 printf (" NOP0BUFS");
8986 if (entry
->d_un
.d_val
& VMS_LF_P0IMAGE
)
8987 printf (" P0IMAGE");
8988 if (entry
->d_un
.d_val
& VMS_LF_MKTHREADS
)
8989 printf (" MKTHREADS");
8990 if (entry
->d_un
.d_val
& VMS_LF_UPCALLS
)
8991 printf (" UPCALLS");
8992 if (entry
->d_un
.d_val
& VMS_LF_IMGSTA
)
8994 if (entry
->d_un
.d_val
& VMS_LF_INITIALIZE
)
8995 printf (" INITIALIZE");
8996 if (entry
->d_un
.d_val
& VMS_LF_MAIN
)
8998 if (entry
->d_un
.d_val
& VMS_LF_EXE_INIT
)
8999 printf (" EXE_INIT");
9000 if (entry
->d_un
.d_val
& VMS_LF_TBK_IN_IMG
)
9001 printf (" TBK_IN_IMG");
9002 if (entry
->d_un
.d_val
& VMS_LF_DBG_IN_IMG
)
9003 printf (" DBG_IN_IMG");
9004 if (entry
->d_un
.d_val
& VMS_LF_TBK_IN_DSF
)
9005 printf (" TBK_IN_DSF");
9006 if (entry
->d_un
.d_val
& VMS_LF_DBG_IN_DSF
)
9007 printf (" DBG_IN_DSF");
9008 if (entry
->d_un
.d_val
& VMS_LF_SIGNATURES
)
9009 printf (" SIGNATURES");
9010 if (entry
->d_un
.d_val
& VMS_LF_REL_SEG_OFF
)
9011 printf (" REL_SEG_OFF");
9015 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
9022 get_32bit_dynamic_section (FILE * file
)
9024 Elf32_External_Dyn
* edyn
;
9025 Elf32_External_Dyn
* ext
;
9026 Elf_Internal_Dyn
* entry
;
9028 edyn
= (Elf32_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
, 1,
9029 dynamic_size
, _("dynamic section"));
9033 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9034 might not have the luxury of section headers. Look for the DT_NULL
9035 terminator to determine the number of entries. */
9036 for (ext
= edyn
, dynamic_nent
= 0;
9037 (char *) (ext
+ 1) <= (char *) edyn
+ dynamic_size
;
9041 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
9045 dynamic_section
= (Elf_Internal_Dyn
*) cmalloc (dynamic_nent
,
9047 if (dynamic_section
== NULL
)
9049 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9050 (unsigned long) dynamic_nent
);
9055 for (ext
= edyn
, entry
= dynamic_section
;
9056 entry
< dynamic_section
+ dynamic_nent
;
9059 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
9060 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
9069 get_64bit_dynamic_section (FILE * file
)
9071 Elf64_External_Dyn
* edyn
;
9072 Elf64_External_Dyn
* ext
;
9073 Elf_Internal_Dyn
* entry
;
9075 /* Read in the data. */
9076 edyn
= (Elf64_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
, 1,
9077 dynamic_size
, _("dynamic section"));
9081 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9082 might not have the luxury of section headers. Look for the DT_NULL
9083 terminator to determine the number of entries. */
9084 for (ext
= edyn
, dynamic_nent
= 0;
9085 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
9086 (char *) (ext
+ 1) <= (char *) edyn
+ dynamic_size
;
9090 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
9094 dynamic_section
= (Elf_Internal_Dyn
*) cmalloc (dynamic_nent
,
9096 if (dynamic_section
== NULL
)
9098 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9099 (unsigned long) dynamic_nent
);
9104 /* Convert from external to internal formats. */
9105 for (ext
= edyn
, entry
= dynamic_section
;
9106 entry
< dynamic_section
+ dynamic_nent
;
9109 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
9110 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
9119 print_dynamic_flags (bfd_vma flags
)
9127 flag
= flags
& - flags
;
9137 case DF_ORIGIN
: fputs ("ORIGIN", stdout
); break;
9138 case DF_SYMBOLIC
: fputs ("SYMBOLIC", stdout
); break;
9139 case DF_TEXTREL
: fputs ("TEXTREL", stdout
); break;
9140 case DF_BIND_NOW
: fputs ("BIND_NOW", stdout
); break;
9141 case DF_STATIC_TLS
: fputs ("STATIC_TLS", stdout
); break;
9142 default: fputs (_("unknown"), stdout
); break;
9148 /* Parse and display the contents of the dynamic section. */
9151 process_dynamic_section (FILE * file
)
9153 Elf_Internal_Dyn
* entry
;
9155 if (dynamic_size
== 0)
9158 printf (_("\nThere is no dynamic section in this file.\n"));
9165 if (! get_32bit_dynamic_section (file
))
9168 else if (! get_64bit_dynamic_section (file
))
9171 /* Find the appropriate symbol table. */
9172 if (dynamic_symbols
== NULL
)
9174 for (entry
= dynamic_section
;
9175 entry
< dynamic_section
+ dynamic_nent
;
9178 Elf_Internal_Shdr section
;
9180 if (entry
->d_tag
!= DT_SYMTAB
)
9183 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
9185 /* Since we do not know how big the symbol table is,
9186 we default to reading in the entire file (!) and
9187 processing that. This is overkill, I know, but it
9189 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
9191 if (archive_file_offset
!= 0)
9192 section
.sh_size
= archive_file_size
- section
.sh_offset
;
9195 if (fseek (file
, 0, SEEK_END
))
9196 error (_("Unable to seek to end of file!\n"));
9198 section
.sh_size
= ftell (file
) - section
.sh_offset
;
9202 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
9204 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
9205 section
.sh_name
= string_table_length
;
9207 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
, & num_dynamic_syms
);
9208 if (num_dynamic_syms
< 1)
9210 error (_("Unable to determine the number of symbols to load\n"));
9216 /* Similarly find a string table. */
9217 if (dynamic_strings
== NULL
)
9219 for (entry
= dynamic_section
;
9220 entry
< dynamic_section
+ dynamic_nent
;
9223 unsigned long offset
;
9226 if (entry
->d_tag
!= DT_STRTAB
)
9229 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
9231 /* Since we do not know how big the string table is,
9232 we default to reading in the entire file (!) and
9233 processing that. This is overkill, I know, but it
9236 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
9238 if (archive_file_offset
!= 0)
9239 str_tab_len
= archive_file_size
- offset
;
9242 if (fseek (file
, 0, SEEK_END
))
9243 error (_("Unable to seek to end of file\n"));
9244 str_tab_len
= ftell (file
) - offset
;
9247 if (str_tab_len
< 1)
9250 (_("Unable to determine the length of the dynamic string table\n"));
9254 dynamic_strings
= (char *) get_data (NULL
, file
, offset
, 1,
9256 _("dynamic string table"));
9257 dynamic_strings_length
= dynamic_strings
== NULL
? 0 : str_tab_len
;
9262 /* And find the syminfo section if available. */
9263 if (dynamic_syminfo
== NULL
)
9265 unsigned long syminsz
= 0;
9267 for (entry
= dynamic_section
;
9268 entry
< dynamic_section
+ dynamic_nent
;
9271 if (entry
->d_tag
== DT_SYMINENT
)
9273 /* Note: these braces are necessary to avoid a syntax
9274 error from the SunOS4 C compiler. */
9275 /* PR binutils/17531: A corrupt file can trigger this test.
9276 So do not use an assert, instead generate an error message. */
9277 if (sizeof (Elf_External_Syminfo
) != entry
->d_un
.d_val
)
9278 error (_("Bad value (%d) for SYMINENT entry\n"),
9279 (int) entry
->d_un
.d_val
);
9281 else if (entry
->d_tag
== DT_SYMINSZ
)
9282 syminsz
= entry
->d_un
.d_val
;
9283 else if (entry
->d_tag
== DT_SYMINFO
)
9284 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
9288 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
9290 Elf_External_Syminfo
* extsyminfo
;
9291 Elf_External_Syminfo
* extsym
;
9292 Elf_Internal_Syminfo
* syminfo
;
9294 /* There is a syminfo section. Read the data. */
9295 extsyminfo
= (Elf_External_Syminfo
*)
9296 get_data (NULL
, file
, dynamic_syminfo_offset
, 1, syminsz
,
9297 _("symbol information"));
9301 dynamic_syminfo
= (Elf_Internal_Syminfo
*) malloc (syminsz
);
9302 if (dynamic_syminfo
== NULL
)
9304 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9305 (unsigned long) syminsz
);
9309 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
9310 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
9311 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
9312 ++syminfo
, ++extsym
)
9314 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
9315 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
9322 if (do_dynamic
&& dynamic_addr
)
9323 printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9324 dynamic_addr
, (unsigned long) dynamic_nent
);
9326 printf (_(" Tag Type Name/Value\n"));
9328 for (entry
= dynamic_section
;
9329 entry
< dynamic_section
+ dynamic_nent
;
9337 print_vma (entry
->d_tag
, FULL_HEX
);
9338 dtype
= get_dynamic_type (entry
->d_tag
);
9339 printf (" (%s)%*s", dtype
,
9340 ((is_32bit_elf
? 27 : 19)
9341 - (int) strlen (dtype
)),
9345 switch (entry
->d_tag
)
9349 print_dynamic_flags (entry
->d_un
.d_val
);
9359 switch (entry
->d_tag
)
9362 printf (_("Auxiliary library"));
9366 printf (_("Filter library"));
9370 printf (_("Configuration file"));
9374 printf (_("Dependency audit library"));
9378 printf (_("Audit library"));
9382 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
9383 printf (": [%s]\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
9387 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
9396 printf (_("Flags:"));
9398 if (entry
->d_un
.d_val
== 0)
9399 printf (_(" None\n"));
9402 unsigned long int val
= entry
->d_un
.d_val
;
9404 if (val
& DTF_1_PARINIT
)
9406 printf (" PARINIT");
9407 val
^= DTF_1_PARINIT
;
9409 if (val
& DTF_1_CONFEXP
)
9411 printf (" CONFEXP");
9412 val
^= DTF_1_CONFEXP
;
9415 printf (" %lx", val
);
9424 printf (_("Flags:"));
9426 if (entry
->d_un
.d_val
== 0)
9427 printf (_(" None\n"));
9430 unsigned long int val
= entry
->d_un
.d_val
;
9432 if (val
& DF_P1_LAZYLOAD
)
9434 printf (" LAZYLOAD");
9435 val
^= DF_P1_LAZYLOAD
;
9437 if (val
& DF_P1_GROUPPERM
)
9439 printf (" GROUPPERM");
9440 val
^= DF_P1_GROUPPERM
;
9443 printf (" %lx", val
);
9452 printf (_("Flags:"));
9453 if (entry
->d_un
.d_val
== 0)
9454 printf (_(" None\n"));
9457 unsigned long int val
= entry
->d_un
.d_val
;
9464 if (val
& DF_1_GLOBAL
)
9469 if (val
& DF_1_GROUP
)
9474 if (val
& DF_1_NODELETE
)
9476 printf (" NODELETE");
9477 val
^= DF_1_NODELETE
;
9479 if (val
& DF_1_LOADFLTR
)
9481 printf (" LOADFLTR");
9482 val
^= DF_1_LOADFLTR
;
9484 if (val
& DF_1_INITFIRST
)
9486 printf (" INITFIRST");
9487 val
^= DF_1_INITFIRST
;
9489 if (val
& DF_1_NOOPEN
)
9494 if (val
& DF_1_ORIGIN
)
9499 if (val
& DF_1_DIRECT
)
9504 if (val
& DF_1_TRANS
)
9509 if (val
& DF_1_INTERPOSE
)
9511 printf (" INTERPOSE");
9512 val
^= DF_1_INTERPOSE
;
9514 if (val
& DF_1_NODEFLIB
)
9516 printf (" NODEFLIB");
9517 val
^= DF_1_NODEFLIB
;
9519 if (val
& DF_1_NODUMP
)
9524 if (val
& DF_1_CONFALT
)
9526 printf (" CONFALT");
9527 val
^= DF_1_CONFALT
;
9529 if (val
& DF_1_ENDFILTEE
)
9531 printf (" ENDFILTEE");
9532 val
^= DF_1_ENDFILTEE
;
9534 if (val
& DF_1_DISPRELDNE
)
9536 printf (" DISPRELDNE");
9537 val
^= DF_1_DISPRELDNE
;
9539 if (val
& DF_1_DISPRELPND
)
9541 printf (" DISPRELPND");
9542 val
^= DF_1_DISPRELPND
;
9544 if (val
& DF_1_NODIRECT
)
9546 printf (" NODIRECT");
9547 val
^= DF_1_NODIRECT
;
9549 if (val
& DF_1_IGNMULDEF
)
9551 printf (" IGNMULDEF");
9552 val
^= DF_1_IGNMULDEF
;
9554 if (val
& DF_1_NOKSYMS
)
9556 printf (" NOKSYMS");
9557 val
^= DF_1_NOKSYMS
;
9559 if (val
& DF_1_NOHDR
)
9564 if (val
& DF_1_EDITED
)
9569 if (val
& DF_1_NORELOC
)
9571 printf (" NORELOC");
9572 val
^= DF_1_NORELOC
;
9574 if (val
& DF_1_SYMINTPOSE
)
9576 printf (" SYMINTPOSE");
9577 val
^= DF_1_SYMINTPOSE
;
9579 if (val
& DF_1_GLOBAUDIT
)
9581 printf (" GLOBAUDIT");
9582 val
^= DF_1_GLOBAUDIT
;
9584 if (val
& DF_1_SINGLETON
)
9586 printf (" SINGLETON");
9587 val
^= DF_1_SINGLETON
;
9589 if (val
& DF_1_STUB
)
9600 printf (" %lx", val
);
9607 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
9609 puts (get_dynamic_type (entry
->d_un
.d_val
));
9629 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
9635 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
9636 name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
9642 switch (entry
->d_tag
)
9645 printf (_("Shared library: [%s]"), name
);
9647 if (streq (name
, program_interpreter
))
9648 printf (_(" program interpreter"));
9652 printf (_("Library soname: [%s]"), name
);
9656 printf (_("Library rpath: [%s]"), name
);
9660 printf (_("Library runpath: [%s]"), name
);
9664 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
9669 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
9682 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
9687 case DT_INIT_ARRAYSZ
:
9688 case DT_FINI_ARRAYSZ
:
9689 case DT_GNU_CONFLICTSZ
:
9690 case DT_GNU_LIBLISTSZ
:
9693 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
9694 printf (_(" (bytes)\n"));
9704 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
9717 if (entry
->d_tag
== DT_USED
9718 && VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
9720 char * name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
9724 printf (_("Not needed object: [%s]\n"), name
);
9729 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
9735 /* The value of this entry is ignored. */
9740 case DT_GNU_PRELINKED
:
9744 time_t atime
= entry
->d_un
.d_val
;
9746 tmp
= gmtime (&atime
);
9747 /* PR 17533 file: 041-1244816-0.004. */
9749 printf (_("<corrupt time val: %lx"),
9750 (unsigned long) atime
);
9752 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9753 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9754 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9760 dynamic_info_DT_GNU_HASH
= entry
->d_un
.d_val
;
9763 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
9769 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
9770 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
9775 switch (elf_header
.e_machine
)
9778 case EM_MIPS_RS3_LE
:
9779 dynamic_section_mips_val (entry
);
9782 dynamic_section_parisc_val (entry
);
9785 dynamic_section_ia64_val (entry
);
9788 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
9800 get_ver_flags (unsigned int flags
)
9802 static char buff
[32];
9809 if (flags
& VER_FLG_BASE
)
9810 strcat (buff
, "BASE ");
9812 if (flags
& VER_FLG_WEAK
)
9814 if (flags
& VER_FLG_BASE
)
9815 strcat (buff
, "| ");
9817 strcat (buff
, "WEAK ");
9820 if (flags
& VER_FLG_INFO
)
9822 if (flags
& (VER_FLG_BASE
|VER_FLG_WEAK
))
9823 strcat (buff
, "| ");
9825 strcat (buff
, "INFO ");
9828 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
| VER_FLG_INFO
))
9829 strcat (buff
, _("| <unknown>"));
9834 /* Display the contents of the version sections. */
9837 process_version_sections (FILE * file
)
9839 Elf_Internal_Shdr
* section
;
9846 for (i
= 0, section
= section_headers
;
9847 i
< elf_header
.e_shnum
;
9850 switch (section
->sh_type
)
9852 case SHT_GNU_verdef
:
9854 Elf_External_Verdef
* edefs
;
9861 printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9862 printable_section_name (section
),
9865 printf (_(" Addr: 0x"));
9866 printf_vma (section
->sh_addr
);
9867 printf (_(" Offset: %#08lx Link: %u (%s)"),
9868 (unsigned long) section
->sh_offset
, section
->sh_link
,
9869 printable_section_name_from_index (section
->sh_link
));
9871 edefs
= (Elf_External_Verdef
*)
9872 get_data (NULL
, file
, section
->sh_offset
, 1,section
->sh_size
,
9873 _("version definition section"));
9876 endbuf
= (char *) edefs
+ section
->sh_size
;
9878 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
9881 Elf_External_Verdef
* edef
;
9882 Elf_Internal_Verdef ent
;
9883 Elf_External_Verdaux
* eaux
;
9884 Elf_Internal_Verdaux aux
;
9888 /* Check for very large indicies. */
9889 if (idx
> (size_t) (endbuf
- (char *) edefs
))
9892 vstart
= ((char *) edefs
) + idx
;
9893 if (vstart
+ sizeof (*edef
) > endbuf
)
9896 edef
= (Elf_External_Verdef
*) vstart
;
9898 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
9899 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
9900 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
9901 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
9902 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
9903 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
9904 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
9906 printf (_(" %#06x: Rev: %d Flags: %s"),
9907 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
9909 printf (_(" Index: %d Cnt: %d "),
9910 ent
.vd_ndx
, ent
.vd_cnt
);
9912 /* Check for overflow. */
9913 if (ent
.vd_aux
> (size_t) (endbuf
- vstart
))
9916 vstart
+= ent
.vd_aux
;
9918 eaux
= (Elf_External_Verdaux
*) vstart
;
9920 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
9921 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
9923 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
9924 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux
.vda_name
));
9926 printf (_("Name index: %ld\n"), aux
.vda_name
);
9928 isum
= idx
+ ent
.vd_aux
;
9930 for (j
= 1; j
< ent
.vd_cnt
; j
++)
9932 /* Check for overflow. */
9933 if (aux
.vda_next
> (size_t) (endbuf
- vstart
))
9936 isum
+= aux
.vda_next
;
9937 vstart
+= aux
.vda_next
;
9939 eaux
= (Elf_External_Verdaux
*) vstart
;
9940 if (vstart
+ sizeof (*eaux
) > endbuf
)
9943 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
9944 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
9946 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
9947 printf (_(" %#06x: Parent %d: %s\n"),
9948 isum
, j
, GET_DYNAMIC_NAME (aux
.vda_name
));
9950 printf (_(" %#06x: Parent %d, name index: %ld\n"),
9951 isum
, j
, aux
.vda_name
);
9955 printf (_(" Version def aux past end of section\n"));
9957 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2. */
9958 if (idx
+ ent
.vd_next
<= idx
)
9964 if (cnt
< section
->sh_info
)
9965 printf (_(" Version definition past end of section\n"));
9971 case SHT_GNU_verneed
:
9973 Elf_External_Verneed
* eneed
;
9980 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
9981 printable_section_name (section
), section
->sh_info
);
9983 printf (_(" Addr: 0x"));
9984 printf_vma (section
->sh_addr
);
9985 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
9986 (unsigned long) section
->sh_offset
, section
->sh_link
,
9987 printable_section_name_from_index (section
->sh_link
));
9989 eneed
= (Elf_External_Verneed
*) get_data (NULL
, file
,
9990 section
->sh_offset
, 1,
9992 _("Version Needs section"));
9995 endbuf
= (char *) eneed
+ section
->sh_size
;
9997 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
9999 Elf_External_Verneed
* entry
;
10000 Elf_Internal_Verneed ent
;
10005 if (idx
> (size_t) (endbuf
- (char *) eneed
))
10008 vstart
= ((char *) eneed
) + idx
;
10009 if (vstart
+ sizeof (*entry
) > endbuf
)
10012 entry
= (Elf_External_Verneed
*) vstart
;
10014 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
10015 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
10016 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
10017 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
10018 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
10020 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
10022 if (VALID_DYNAMIC_NAME (ent
.vn_file
))
10023 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent
.vn_file
));
10025 printf (_(" File: %lx"), ent
.vn_file
);
10027 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
10029 /* Check for overflow. */
10030 if (ent
.vn_aux
> (size_t) (endbuf
- vstart
))
10032 vstart
+= ent
.vn_aux
;
10034 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
10036 Elf_External_Vernaux
* eaux
;
10037 Elf_Internal_Vernaux aux
;
10039 if (vstart
+ sizeof (*eaux
) > endbuf
)
10041 eaux
= (Elf_External_Vernaux
*) vstart
;
10043 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
10044 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
10045 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
10046 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
10047 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
10049 if (VALID_DYNAMIC_NAME (aux
.vna_name
))
10050 printf (_(" %#06x: Name: %s"),
10051 isum
, GET_DYNAMIC_NAME (aux
.vna_name
));
10053 printf (_(" %#06x: Name index: %lx"),
10054 isum
, aux
.vna_name
);
10056 printf (_(" Flags: %s Version: %d\n"),
10057 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
10059 /* Check for overflow. */
10060 if (aux
.vna_next
> (size_t) (endbuf
- vstart
)
10061 || (aux
.vna_next
== 0 && j
< ent
.vn_cnt
- 1))
10063 warn (_("Invalid vna_next field of %lx\n"),
10068 isum
+= aux
.vna_next
;
10069 vstart
+= aux
.vna_next
;
10072 if (j
< ent
.vn_cnt
)
10073 warn (_("Missing Version Needs auxillary information\n"));
10075 if (ent
.vn_next
== 0 && cnt
< section
->sh_info
- 1)
10077 warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
10078 cnt
= section
->sh_info
;
10081 idx
+= ent
.vn_next
;
10084 if (cnt
< section
->sh_info
)
10085 warn (_("Missing Version Needs information\n"));
10091 case SHT_GNU_versym
:
10093 Elf_Internal_Shdr
* link_section
;
10096 unsigned char * edata
;
10097 unsigned short * data
;
10099 Elf_Internal_Sym
* symbols
;
10100 Elf_Internal_Shdr
* string_sec
;
10101 unsigned long num_syms
;
10104 if (section
->sh_link
>= elf_header
.e_shnum
)
10107 link_section
= section_headers
+ section
->sh_link
;
10108 total
= section
->sh_size
/ sizeof (Elf_External_Versym
);
10110 if (link_section
->sh_link
>= elf_header
.e_shnum
)
10115 symbols
= GET_ELF_SYMBOLS (file
, link_section
, & num_syms
);
10116 if (symbols
== NULL
)
10119 string_sec
= section_headers
+ link_section
->sh_link
;
10121 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
, 1,
10122 string_sec
->sh_size
,
10123 _("version string table"));
10130 printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
10131 printable_section_name (section
), (unsigned long) total
);
10133 printf (_(" Addr: "));
10134 printf_vma (section
->sh_addr
);
10135 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10136 (unsigned long) section
->sh_offset
, section
->sh_link
,
10137 printable_section_name (link_section
));
10139 off
= offset_from_vma (file
,
10140 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
10141 total
* sizeof (short));
10142 edata
= (unsigned char *) get_data (NULL
, file
, off
, total
,
10144 _("version symbol data"));
10152 data
= (short unsigned int *) cmalloc (total
, sizeof (short));
10154 for (cnt
= total
; cnt
--;)
10155 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
10160 for (cnt
= 0; cnt
< total
; cnt
+= 4)
10164 char *invalid
= _("*invalid*");
10166 printf (" %03x:", cnt
);
10168 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
10169 switch (data
[cnt
+ j
])
10172 fputs (_(" 0 (*local*) "), stdout
);
10176 fputs (_(" 1 (*global*) "), stdout
);
10180 nn
= printf ("%4x%c", data
[cnt
+ j
] & VERSYM_VERSION
,
10181 data
[cnt
+ j
] & VERSYM_HIDDEN
? 'h' : ' ');
10183 /* If this index value is greater than the size of the symbols
10184 array, break to avoid an out-of-bounds read. */
10185 if ((unsigned long)(cnt
+ j
) >= num_syms
)
10187 warn (_("invalid index into symbol array\n"));
10192 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
10194 Elf_Internal_Verneed ivn
;
10195 unsigned long offset
;
10197 offset
= offset_from_vma
10198 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
10199 sizeof (Elf_External_Verneed
));
10203 Elf_Internal_Vernaux ivna
;
10204 Elf_External_Verneed evn
;
10205 Elf_External_Vernaux evna
;
10206 unsigned long a_off
;
10208 if (get_data (&evn
, file
, offset
, sizeof (evn
), 1,
10209 _("version need")) == NULL
)
10212 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
10213 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
10215 a_off
= offset
+ ivn
.vn_aux
;
10219 if (get_data (&evna
, file
, a_off
, sizeof (evna
),
10220 1, _("version need aux (2)")) == NULL
)
10223 ivna
.vna_other
= 0;
10227 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
10228 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
10231 a_off
+= ivna
.vna_next
;
10233 while (ivna
.vna_other
!= data
[cnt
+ j
]
10234 && ivna
.vna_next
!= 0);
10236 if (ivna
.vna_other
== data
[cnt
+ j
])
10238 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
10240 if (ivna
.vna_name
>= string_sec
->sh_size
)
10243 name
= strtab
+ ivna
.vna_name
;
10247 offset
+= ivn
.vn_next
;
10249 while (ivn
.vn_next
);
10252 if (data
[cnt
+ j
] != 0x8001
10253 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
10255 Elf_Internal_Verdef ivd
;
10256 Elf_External_Verdef evd
;
10257 unsigned long offset
;
10259 offset
= offset_from_vma
10260 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
10265 if (get_data (&evd
, file
, offset
, sizeof (evd
), 1,
10266 _("version def")) == NULL
)
10269 /* PR 17531: file: 046-1082287-0.004. */
10270 ivd
.vd_ndx
= (data
[cnt
+ j
] & VERSYM_VERSION
) + 1;
10275 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
10276 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
10279 offset
+= ivd
.vd_next
;
10281 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & VERSYM_VERSION
)
10282 && ivd
.vd_next
!= 0);
10284 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & VERSYM_VERSION
))
10286 Elf_External_Verdaux evda
;
10287 Elf_Internal_Verdaux ivda
;
10289 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
10291 if (get_data (&evda
, file
,
10292 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
10294 _("version def aux")) == NULL
)
10297 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
10299 if (ivda
.vda_name
>= string_sec
->sh_size
)
10301 else if (name
!= NULL
&& name
!= invalid
)
10302 name
= _("*both*");
10304 name
= strtab
+ ivda
.vda_name
;
10308 nn
+= printf ("(%s%-*s",
10310 12 - (int) strlen (name
),
10314 printf ("%*c", 18 - nn
, ' ');
10332 printf (_("\nNo version information found in this file.\n"));
10337 static const char *
10338 get_symbol_binding (unsigned int binding
)
10340 static char buff
[32];
10344 case STB_LOCAL
: return "LOCAL";
10345 case STB_GLOBAL
: return "GLOBAL";
10346 case STB_WEAK
: return "WEAK";
10348 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
10349 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"),
10351 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
10353 if (binding
== STB_GNU_UNIQUE
10354 && (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_GNU
10355 /* GNU is still using the default value 0. */
10356 || elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_NONE
))
10358 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), binding
);
10361 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), binding
);
10366 static const char *
10367 get_symbol_type (unsigned int type
)
10369 static char buff
[32];
10373 case STT_NOTYPE
: return "NOTYPE";
10374 case STT_OBJECT
: return "OBJECT";
10375 case STT_FUNC
: return "FUNC";
10376 case STT_SECTION
: return "SECTION";
10377 case STT_FILE
: return "FILE";
10378 case STT_COMMON
: return "COMMON";
10379 case STT_TLS
: return "TLS";
10380 case STT_RELC
: return "RELC";
10381 case STT_SRELC
: return "SRELC";
10383 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
10385 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
10386 return "THUMB_FUNC";
10388 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
10391 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
10392 return "PARISC_MILLI";
10394 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"), type
);
10396 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
10398 if (elf_header
.e_machine
== EM_PARISC
)
10400 if (type
== STT_HP_OPAQUE
)
10401 return "HP_OPAQUE";
10402 if (type
== STT_HP_STUB
)
10406 if (type
== STT_GNU_IFUNC
10407 && (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_GNU
10408 || elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_FREEBSD
10409 /* GNU is still using the default value 0. */
10410 || elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_NONE
))
10413 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), type
);
10416 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), type
);
10421 static const char *
10422 get_symbol_visibility (unsigned int visibility
)
10424 switch (visibility
)
10426 case STV_DEFAULT
: return "DEFAULT";
10427 case STV_INTERNAL
: return "INTERNAL";
10428 case STV_HIDDEN
: return "HIDDEN";
10429 case STV_PROTECTED
: return "PROTECTED";
10431 error (_("Unrecognized visibility value: %u"), visibility
);
10432 return _("<unknown>");
10436 static const char *
10437 get_solaris_symbol_visibility (unsigned int visibility
)
10439 switch (visibility
)
10441 case 4: return "EXPORTED";
10442 case 5: return "SINGLETON";
10443 case 6: return "ELIMINATE";
10444 default: return get_symbol_visibility (visibility
);
10448 static const char *
10449 get_mips_symbol_other (unsigned int other
)
10459 case STO_MICROMIPS
:
10460 return "MICROMIPS";
10461 case STO_MICROMIPS
| STO_MIPS_PIC
:
10462 return "MICROMIPS, MIPS PIC";
10470 static const char *
10471 get_ia64_symbol_other (unsigned int other
)
10473 if (is_ia64_vms ())
10475 static char res
[32];
10479 /* Function types is for images and .STB files only. */
10480 switch (elf_header
.e_type
)
10484 switch (VMS_ST_FUNC_TYPE (other
))
10486 case VMS_SFT_CODE_ADDR
:
10487 strcat (res
, " CA");
10489 case VMS_SFT_SYMV_IDX
:
10490 strcat (res
, " VEC");
10493 strcat (res
, " FD");
10495 case VMS_SFT_RESERVE
:
10496 strcat (res
, " RSV");
10499 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10500 VMS_ST_FUNC_TYPE (other
));
10501 strcat (res
, " <unknown>");
10508 switch (VMS_ST_LINKAGE (other
))
10510 case VMS_STL_IGNORE
:
10511 strcat (res
, " IGN");
10513 case VMS_STL_RESERVE
:
10514 strcat (res
, " RSV");
10517 strcat (res
, " STD");
10520 strcat (res
, " LNK");
10523 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10524 VMS_ST_LINKAGE (other
));
10525 strcat (res
, " <unknown>");
10537 static const char *
10538 get_ppc64_symbol_other (unsigned int other
)
10540 if (PPC64_LOCAL_ENTRY_OFFSET (other
) != 0)
10542 static char buf
[32];
10543 snprintf (buf
, sizeof buf
, _("<localentry>: %d"),
10544 PPC64_LOCAL_ENTRY_OFFSET (other
));
10550 static const char *
10551 get_symbol_other (unsigned int other
)
10553 const char * result
= NULL
;
10554 static char buff
[32];
10559 switch (elf_header
.e_machine
)
10562 result
= get_mips_symbol_other (other
);
10565 result
= get_ia64_symbol_other (other
);
10568 result
= get_ppc64_symbol_other (other
);
10578 snprintf (buff
, sizeof buff
, _("<other>: %x"), other
);
10582 static const char *
10583 get_symbol_index_type (unsigned int type
)
10585 static char buff
[32];
10589 case SHN_UNDEF
: return "UND";
10590 case SHN_ABS
: return "ABS";
10591 case SHN_COMMON
: return "COM";
10593 if (type
== SHN_IA_64_ANSI_COMMON
10594 && elf_header
.e_machine
== EM_IA_64
10595 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
10597 else if ((elf_header
.e_machine
== EM_X86_64
10598 || elf_header
.e_machine
== EM_L1OM
10599 || elf_header
.e_machine
== EM_K1OM
)
10600 && type
== SHN_X86_64_LCOMMON
)
10601 return "LARGE_COM";
10602 else if ((type
== SHN_MIPS_SCOMMON
10603 && elf_header
.e_machine
== EM_MIPS
)
10604 || (type
== SHN_TIC6X_SCOMMON
10605 && elf_header
.e_machine
== EM_TI_C6000
))
10607 else if (type
== SHN_MIPS_SUNDEFINED
10608 && elf_header
.e_machine
== EM_MIPS
)
10610 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
10611 sprintf (buff
, "PRC[0x%04x]", type
& 0xffff);
10612 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
10613 sprintf (buff
, "OS [0x%04x]", type
& 0xffff);
10614 else if (type
>= SHN_LORESERVE
)
10615 sprintf (buff
, "RSV[0x%04x]", type
& 0xffff);
10616 else if (type
>= elf_header
.e_shnum
)
10617 sprintf (buff
, _("bad section index[%3d]"), type
);
10619 sprintf (buff
, "%3d", type
);
10627 get_dynamic_data (FILE * file
, bfd_size_type number
, unsigned int ent_size
)
10629 unsigned char * e_data
;
10632 /* If the size_t type is smaller than the bfd_size_type, eg because
10633 you are building a 32-bit tool on a 64-bit host, then make sure
10634 that when (number) is cast to (size_t) no information is lost. */
10635 if (sizeof (size_t) < sizeof (bfd_size_type
)
10636 && (bfd_size_type
) ((size_t) number
) != number
)
10638 error (_("Size truncation prevents reading %" BFD_VMA_FMT
"u"
10639 " elements of size %u\n"),
10644 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10645 attempting to allocate memory when the read is bound to fail. */
10646 if (ent_size
* number
> current_file_size
)
10648 error (_("Invalid number of dynamic entries: %" BFD_VMA_FMT
"u\n"),
10653 e_data
= (unsigned char *) cmalloc ((size_t) number
, ent_size
);
10654 if (e_data
== NULL
)
10656 error (_("Out of memory reading %" BFD_VMA_FMT
"u dynamic entries\n"),
10661 if (fread (e_data
, ent_size
, (size_t) number
, file
) != number
)
10663 error (_("Unable to read in %" BFD_VMA_FMT
"u bytes of dynamic data\n"),
10664 number
* ent_size
);
10669 i_data
= (bfd_vma
*) cmalloc ((size_t) number
, sizeof (*i_data
));
10670 if (i_data
== NULL
)
10672 error (_("Out of memory allocating space for %" BFD_VMA_FMT
"u"
10673 " dynamic entries\n"),
10680 i_data
[number
] = byte_get (e_data
+ number
* ent_size
, ent_size
);
10688 print_dynamic_symbol (bfd_vma si
, unsigned long hn
)
10690 Elf_Internal_Sym
* psym
;
10693 n
= print_vma (si
, DEC_5
);
10695 fputs (&" "[n
], stdout
);
10696 printf (" %3lu: ", hn
);
10698 if (dynamic_symbols
== NULL
|| si
>= num_dynamic_syms
)
10700 printf (_("<No info available for dynamic symbol number %lu>\n"),
10701 (unsigned long) si
);
10705 psym
= dynamic_symbols
+ si
;
10706 print_vma (psym
->st_value
, LONG_HEX
);
10708 print_vma (psym
->st_size
, DEC_5
);
10710 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
10711 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
10713 if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_SOLARIS
)
10714 printf (" %-7s", get_solaris_symbol_visibility (psym
->st_other
));
10717 unsigned int vis
= ELF_ST_VISIBILITY (psym
->st_other
);
10719 printf (" %-7s", get_symbol_visibility (vis
));
10720 /* Check to see if any other bits in the st_other field are set.
10721 Note - displaying this information disrupts the layout of the
10722 table being generated, but for the moment this case is very
10724 if (psym
->st_other
^ vis
)
10725 printf (" [%s] ", get_symbol_other (psym
->st_other
^ vis
));
10728 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
10729 if (VALID_DYNAMIC_NAME (psym
->st_name
))
10730 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
10732 printf (_(" <corrupt: %14ld>"), psym
->st_name
);
10736 static const char *
10737 get_symbol_version_string (FILE *file
, int is_dynsym
,
10738 const char *strtab
,
10739 unsigned long int strtab_size
,
10740 unsigned int si
, Elf_Internal_Sym
*psym
,
10741 enum versioned_symbol_info
*sym_info
,
10742 unsigned short *vna_other
)
10744 unsigned char data
[2];
10745 unsigned short vers_data
;
10746 unsigned long offset
;
10749 || version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] == 0)
10752 offset
= offset_from_vma (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
10753 sizeof data
+ si
* sizeof (vers_data
));
10755 if (get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
10756 sizeof (data
), 1, _("version data")) == NULL
)
10759 vers_data
= byte_get (data
, 2);
10761 if ((vers_data
& VERSYM_HIDDEN
) == 0 && vers_data
<= 1)
10764 /* Usually we'd only see verdef for defined symbols, and verneed for
10765 undefined symbols. However, symbols defined by the linker in
10766 .dynbss for variables copied from a shared library in order to
10767 avoid text relocations are defined yet have verneed. We could
10768 use a heuristic to detect the special case, for example, check
10769 for verneed first on symbols defined in SHT_NOBITS sections, but
10770 it is simpler and more reliable to just look for both verdef and
10771 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
10773 if (psym
->st_shndx
!= SHN_UNDEF
10774 && vers_data
!= 0x8001
10775 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
10777 Elf_Internal_Verdef ivd
;
10778 Elf_Internal_Verdaux ivda
;
10779 Elf_External_Verdaux evda
;
10782 off
= offset_from_vma (file
,
10783 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
10784 sizeof (Elf_External_Verdef
));
10788 Elf_External_Verdef evd
;
10790 if (get_data (&evd
, file
, off
, sizeof (evd
), 1,
10791 _("version def")) == NULL
)
10799 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
10800 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
10801 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
10804 off
+= ivd
.vd_next
;
10806 while (ivd
.vd_ndx
!= (vers_data
& VERSYM_VERSION
) && ivd
.vd_next
!= 0);
10808 if (ivd
.vd_ndx
== (vers_data
& VERSYM_VERSION
))
10810 off
-= ivd
.vd_next
;
10813 if (get_data (&evda
, file
, off
, sizeof (evda
), 1,
10814 _("version def aux")) != NULL
)
10816 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
10818 if (psym
->st_name
!= ivda
.vda_name
)
10820 *sym_info
= ((vers_data
& VERSYM_HIDDEN
) != 0
10821 ? symbol_hidden
: symbol_public
);
10822 return (ivda
.vda_name
< strtab_size
10823 ? strtab
+ ivda
.vda_name
: _("<corrupt>"));
10829 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
10831 Elf_External_Verneed evn
;
10832 Elf_Internal_Verneed ivn
;
10833 Elf_Internal_Vernaux ivna
;
10835 offset
= offset_from_vma (file
,
10836 version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
10840 unsigned long vna_off
;
10842 if (get_data (&evn
, file
, offset
, sizeof (evn
), 1,
10843 _("version need")) == NULL
)
10846 ivna
.vna_other
= 0;
10851 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
10852 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
10854 vna_off
= offset
+ ivn
.vn_aux
;
10858 Elf_External_Vernaux evna
;
10860 if (get_data (&evna
, file
, vna_off
, sizeof (evna
), 1,
10861 _("version need aux (3)")) == NULL
)
10864 ivna
.vna_other
= 0;
10869 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
10870 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
10871 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
10874 vna_off
+= ivna
.vna_next
;
10876 while (ivna
.vna_other
!= vers_data
&& ivna
.vna_next
!= 0);
10878 if (ivna
.vna_other
== vers_data
)
10881 offset
+= ivn
.vn_next
;
10883 while (ivn
.vn_next
!= 0);
10885 if (ivna
.vna_other
== vers_data
)
10887 *sym_info
= symbol_undefined
;
10888 *vna_other
= ivna
.vna_other
;
10889 return (ivna
.vna_name
< strtab_size
10890 ? strtab
+ ivna
.vna_name
: _("<corrupt>"));
10896 /* Dump the symbol table. */
10898 process_symbol_table (FILE * file
)
10900 Elf_Internal_Shdr
* section
;
10901 bfd_size_type nbuckets
= 0;
10902 bfd_size_type nchains
= 0;
10903 bfd_vma
* buckets
= NULL
;
10904 bfd_vma
* chains
= NULL
;
10905 bfd_vma ngnubuckets
= 0;
10906 bfd_vma
* gnubuckets
= NULL
;
10907 bfd_vma
* gnuchains
= NULL
;
10908 bfd_vma gnusymidx
= 0;
10909 bfd_size_type ngnuchains
= 0;
10911 if (!do_syms
&& !do_dyn_syms
&& !do_histogram
)
10914 if (dynamic_info
[DT_HASH
]
10916 || (do_using_dynamic
10918 && dynamic_strings
!= NULL
)))
10920 unsigned char nb
[8];
10921 unsigned char nc
[8];
10922 unsigned int hash_ent_size
= 4;
10924 if ((elf_header
.e_machine
== EM_ALPHA
10925 || elf_header
.e_machine
== EM_S390
10926 || elf_header
.e_machine
== EM_S390_OLD
)
10927 && elf_header
.e_ident
[EI_CLASS
] == ELFCLASS64
)
10931 (archive_file_offset
10932 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
10933 sizeof nb
+ sizeof nc
)),
10936 error (_("Unable to seek to start of dynamic information\n"));
10940 if (fread (nb
, hash_ent_size
, 1, file
) != 1)
10942 error (_("Failed to read in number of buckets\n"));
10946 if (fread (nc
, hash_ent_size
, 1, file
) != 1)
10948 error (_("Failed to read in number of chains\n"));
10952 nbuckets
= byte_get (nb
, hash_ent_size
);
10953 nchains
= byte_get (nc
, hash_ent_size
);
10955 buckets
= get_dynamic_data (file
, nbuckets
, hash_ent_size
);
10956 chains
= get_dynamic_data (file
, nchains
, hash_ent_size
);
10959 if (buckets
== NULL
|| chains
== NULL
)
10961 if (do_using_dynamic
)
10972 if (dynamic_info_DT_GNU_HASH
10974 || (do_using_dynamic
10976 && dynamic_strings
!= NULL
)))
10978 unsigned char nb
[16];
10979 bfd_vma i
, maxchain
= 0xffffffff, bitmaskwords
;
10980 bfd_vma buckets_vma
;
10983 (archive_file_offset
10984 + offset_from_vma (file
, dynamic_info_DT_GNU_HASH
,
10988 error (_("Unable to seek to start of dynamic information\n"));
10992 if (fread (nb
, 16, 1, file
) != 1)
10994 error (_("Failed to read in number of buckets\n"));
10998 ngnubuckets
= byte_get (nb
, 4);
10999 gnusymidx
= byte_get (nb
+ 4, 4);
11000 bitmaskwords
= byte_get (nb
+ 8, 4);
11001 buckets_vma
= dynamic_info_DT_GNU_HASH
+ 16;
11003 buckets_vma
+= bitmaskwords
* 4;
11005 buckets_vma
+= bitmaskwords
* 8;
11008 (archive_file_offset
11009 + offset_from_vma (file
, buckets_vma
, 4)),
11012 error (_("Unable to seek to start of dynamic information\n"));
11016 gnubuckets
= get_dynamic_data (file
, ngnubuckets
, 4);
11018 if (gnubuckets
== NULL
)
11021 for (i
= 0; i
< ngnubuckets
; i
++)
11022 if (gnubuckets
[i
] != 0)
11024 if (gnubuckets
[i
] < gnusymidx
)
11027 if (maxchain
== 0xffffffff || gnubuckets
[i
] > maxchain
)
11028 maxchain
= gnubuckets
[i
];
11031 if (maxchain
== 0xffffffff)
11034 maxchain
-= gnusymidx
;
11037 (archive_file_offset
11038 + offset_from_vma (file
, buckets_vma
11039 + 4 * (ngnubuckets
+ maxchain
), 4)),
11042 error (_("Unable to seek to start of dynamic information\n"));
11048 if (fread (nb
, 4, 1, file
) != 1)
11050 error (_("Failed to determine last chain length\n"));
11054 if (maxchain
+ 1 == 0)
11059 while ((byte_get (nb
, 4) & 1) == 0);
11062 (archive_file_offset
11063 + offset_from_vma (file
, buckets_vma
+ 4 * ngnubuckets
, 4)),
11066 error (_("Unable to seek to start of dynamic information\n"));
11070 gnuchains
= get_dynamic_data (file
, maxchain
, 4);
11071 ngnuchains
= maxchain
;
11074 if (gnuchains
== NULL
)
11079 if (do_using_dynamic
)
11084 if ((dynamic_info
[DT_HASH
] || dynamic_info_DT_GNU_HASH
)
11086 && do_using_dynamic
11087 && dynamic_strings
!= NULL
11088 && dynamic_symbols
!= NULL
)
11092 if (dynamic_info
[DT_HASH
])
11096 printf (_("\nSymbol table for image:\n"));
11098 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11100 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11102 for (hn
= 0; hn
< nbuckets
; hn
++)
11107 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
11108 print_dynamic_symbol (si
, hn
);
11112 if (dynamic_info_DT_GNU_HASH
)
11114 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11116 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11118 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11120 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
11121 if (gnubuckets
[hn
] != 0)
11123 bfd_vma si
= gnubuckets
[hn
];
11124 bfd_vma off
= si
- gnusymidx
;
11128 print_dynamic_symbol (si
, hn
);
11131 while (off
< ngnuchains
&& (gnuchains
[off
++] & 1) == 0);
11135 else if ((do_dyn_syms
|| (do_syms
&& !do_using_dynamic
))
11136 && section_headers
!= NULL
)
11140 for (i
= 0, section
= section_headers
;
11141 i
< elf_header
.e_shnum
;
11145 char * strtab
= NULL
;
11146 unsigned long int strtab_size
= 0;
11147 Elf_Internal_Sym
* symtab
;
11148 Elf_Internal_Sym
* psym
;
11149 unsigned long num_syms
;
11151 if ((section
->sh_type
!= SHT_SYMTAB
11152 && section
->sh_type
!= SHT_DYNSYM
)
11154 && section
->sh_type
== SHT_SYMTAB
))
11157 if (section
->sh_entsize
== 0)
11159 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11160 printable_section_name (section
));
11164 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
11165 printable_section_name (section
),
11166 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
11169 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11171 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11173 symtab
= GET_ELF_SYMBOLS (file
, section
, & num_syms
);
11174 if (symtab
== NULL
)
11177 if (section
->sh_link
== elf_header
.e_shstrndx
)
11179 strtab
= string_table
;
11180 strtab_size
= string_table_length
;
11182 else if (section
->sh_link
< elf_header
.e_shnum
)
11184 Elf_Internal_Shdr
* string_sec
;
11186 string_sec
= section_headers
+ section
->sh_link
;
11188 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
11189 1, string_sec
->sh_size
,
11190 _("string table"));
11191 strtab_size
= strtab
!= NULL
? string_sec
->sh_size
: 0;
11194 for (si
= 0, psym
= symtab
; si
< num_syms
; si
++, psym
++)
11196 const char *version_string
;
11197 enum versioned_symbol_info sym_info
;
11198 unsigned short vna_other
;
11200 printf ("%6d: ", si
);
11201 print_vma (psym
->st_value
, LONG_HEX
);
11203 print_vma (psym
->st_size
, DEC_5
);
11204 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
11205 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
11206 if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_SOLARIS
)
11207 printf (" %-7s", get_solaris_symbol_visibility (psym
->st_other
));
11210 unsigned int vis
= ELF_ST_VISIBILITY (psym
->st_other
);
11212 printf (" %-7s", get_symbol_visibility (vis
));
11213 /* Check to see if any other bits in the st_other field are set.
11214 Note - displaying this information disrupts the layout of the
11215 table being generated, but for the moment this case is very rare. */
11216 if (psym
->st_other
^ vis
)
11217 printf (" [%s] ", get_symbol_other (psym
->st_other
^ vis
));
11219 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
11220 print_symbol (25, psym
->st_name
< strtab_size
11221 ? strtab
+ psym
->st_name
: _("<corrupt>"));
11224 = get_symbol_version_string (file
,
11225 section
->sh_type
== SHT_DYNSYM
,
11226 strtab
, strtab_size
, si
,
11227 psym
, &sym_info
, &vna_other
);
11228 if (version_string
)
11230 if (sym_info
== symbol_undefined
)
11231 printf ("@%s (%d)", version_string
, vna_other
);
11233 printf (sym_info
== symbol_hidden
? "@%s" : "@@%s",
11239 if (ELF_ST_BIND (psym
->st_info
) == STB_LOCAL
11240 && si
>= section
->sh_info
11241 /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */
11242 && elf_header
.e_machine
!= EM_MIPS
11243 /* Solaris binaries have been found to violate this requirement as
11244 well. Not sure if this is a bug or an ABI requirement. */
11245 && elf_header
.e_ident
[EI_OSABI
] != ELFOSABI_SOLARIS
)
11246 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11247 si
, printable_section_name (section
), section
->sh_info
);
11251 if (strtab
!= string_table
)
11257 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11259 if (do_histogram
&& buckets
!= NULL
)
11261 unsigned long * lengths
;
11262 unsigned long * counts
;
11265 unsigned long maxlength
= 0;
11266 unsigned long nzero_counts
= 0;
11267 unsigned long nsyms
= 0;
11268 unsigned long chained
;
11270 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
11271 (unsigned long) nbuckets
);
11273 lengths
= (unsigned long *) calloc (nbuckets
, sizeof (*lengths
));
11274 if (lengths
== NULL
)
11276 error (_("Out of memory allocating space for histogram buckets\n"));
11280 printf (_(" Length Number %% of total Coverage\n"));
11281 for (hn
= 0; hn
< nbuckets
; ++hn
)
11283 for (si
= buckets
[hn
], chained
= 0;
11284 si
> 0 && si
< nchains
&& si
< nbuckets
&& chained
<= nchains
;
11285 si
= chains
[si
], ++chained
)
11288 if (maxlength
< ++lengths
[hn
])
11292 /* PR binutils/17531: A corrupt binary could contain broken
11293 histogram data. Do not go into an infinite loop trying
11295 if (chained
> nchains
)
11297 error (_("histogram chain is corrupt\n"));
11302 counts
= (unsigned long *) calloc (maxlength
+ 1, sizeof (*counts
));
11303 if (counts
== NULL
)
11306 error (_("Out of memory allocating space for histogram counts\n"));
11310 for (hn
= 0; hn
< nbuckets
; ++hn
)
11311 ++counts
[lengths
[hn
]];
11316 printf (" 0 %-10lu (%5.1f%%)\n",
11317 counts
[0], (counts
[0] * 100.0) / nbuckets
);
11318 for (i
= 1; i
<= maxlength
; ++i
)
11320 nzero_counts
+= counts
[i
] * i
;
11321 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11322 i
, counts
[i
], (counts
[i
] * 100.0) / nbuckets
,
11323 (nzero_counts
* 100.0) / nsyms
);
11331 if (buckets
!= NULL
)
11337 if (do_histogram
&& gnubuckets
!= NULL
)
11339 unsigned long * lengths
;
11340 unsigned long * counts
;
11342 unsigned long maxlength
= 0;
11343 unsigned long nzero_counts
= 0;
11344 unsigned long nsyms
= 0;
11346 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11347 (unsigned long) ngnubuckets
);
11349 lengths
= (unsigned long *) calloc (ngnubuckets
, sizeof (*lengths
));
11350 if (lengths
== NULL
)
11352 error (_("Out of memory allocating space for gnu histogram buckets\n"));
11356 printf (_(" Length Number %% of total Coverage\n"));
11358 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
11359 if (gnubuckets
[hn
] != 0)
11361 bfd_vma off
, length
= 1;
11363 for (off
= gnubuckets
[hn
] - gnusymidx
;
11364 /* PR 17531 file: 010-77222-0.004. */
11365 off
< ngnuchains
&& (gnuchains
[off
] & 1) == 0;
11368 lengths
[hn
] = length
;
11369 if (length
> maxlength
)
11370 maxlength
= length
;
11374 counts
= (unsigned long *) calloc (maxlength
+ 1, sizeof (*counts
));
11375 if (counts
== NULL
)
11378 error (_("Out of memory allocating space for gnu histogram counts\n"));
11382 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
11383 ++counts
[lengths
[hn
]];
11385 if (ngnubuckets
> 0)
11388 printf (" 0 %-10lu (%5.1f%%)\n",
11389 counts
[0], (counts
[0] * 100.0) / ngnubuckets
);
11390 for (j
= 1; j
<= maxlength
; ++j
)
11392 nzero_counts
+= counts
[j
] * j
;
11393 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11394 j
, counts
[j
], (counts
[j
] * 100.0) / ngnubuckets
,
11395 (nzero_counts
* 100.0) / nsyms
);
11409 process_syminfo (FILE * file ATTRIBUTE_UNUSED
)
11413 if (dynamic_syminfo
== NULL
11415 /* No syminfo, this is ok. */
11418 /* There better should be a dynamic symbol section. */
11419 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
11423 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11424 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
11426 printf (_(" Num: Name BoundTo Flags\n"));
11427 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
11429 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
11431 printf ("%4d: ", i
);
11432 if (i
>= num_dynamic_syms
)
11433 printf (_("<corrupt index>"));
11434 else if (VALID_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
))
11435 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
));
11437 printf (_("<corrupt: %19ld>"), dynamic_symbols
[i
].st_name
);
11440 switch (dynamic_syminfo
[i
].si_boundto
)
11442 case SYMINFO_BT_SELF
:
11443 fputs ("SELF ", stdout
);
11445 case SYMINFO_BT_PARENT
:
11446 fputs ("PARENT ", stdout
);
11449 if (dynamic_syminfo
[i
].si_boundto
> 0
11450 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
11451 && VALID_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
11453 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
11457 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
11461 if (flags
& SYMINFO_FLG_DIRECT
)
11462 printf (" DIRECT");
11463 if (flags
& SYMINFO_FLG_PASSTHRU
)
11464 printf (" PASSTHRU");
11465 if (flags
& SYMINFO_FLG_COPY
)
11467 if (flags
& SYMINFO_FLG_LAZYLOAD
)
11468 printf (" LAZYLOAD");
11476 /* Check to see if the given reloc needs to be handled in a target specific
11477 manner. If so then process the reloc and return TRUE otherwise return
11481 target_specific_reloc_handling (Elf_Internal_Rela
* reloc
,
11482 unsigned char * start
,
11483 Elf_Internal_Sym
* symtab
)
11485 unsigned int reloc_type
= get_reloc_type (reloc
->r_info
);
11487 switch (elf_header
.e_machine
)
11490 case EM_MSP430_OLD
:
11492 static Elf_Internal_Sym
* saved_sym
= NULL
;
11494 switch (reloc_type
)
11496 case 10: /* R_MSP430_SYM_DIFF */
11497 if (uses_msp430x_relocs ())
11499 /* Fall through. */
11500 case 21: /* R_MSP430X_SYM_DIFF */
11501 saved_sym
= symtab
+ get_reloc_symindex (reloc
->r_info
);
11504 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11505 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11506 goto handle_sym_diff
;
11508 case 5: /* R_MSP430_16_BYTE */
11509 case 9: /* R_MSP430_8 */
11510 if (uses_msp430x_relocs ())
11512 goto handle_sym_diff
;
11514 case 2: /* R_MSP430_ABS16 */
11515 case 15: /* R_MSP430X_ABS16 */
11516 if (! uses_msp430x_relocs ())
11518 goto handle_sym_diff
;
11521 if (saved_sym
!= NULL
)
11525 value
= reloc
->r_addend
11526 + (symtab
[get_reloc_symindex (reloc
->r_info
)].st_value
11527 - saved_sym
->st_value
);
11529 byte_put (start
+ reloc
->r_offset
, value
, reloc_type
== 1 ? 4 : 2);
11537 if (saved_sym
!= NULL
)
11538 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
11545 case EM_CYGNUS_MN10300
:
11547 static Elf_Internal_Sym
* saved_sym
= NULL
;
11549 switch (reloc_type
)
11551 case 34: /* R_MN10300_ALIGN */
11553 case 33: /* R_MN10300_SYM_DIFF */
11554 saved_sym
= symtab
+ get_reloc_symindex (reloc
->r_info
);
11556 case 1: /* R_MN10300_32 */
11557 case 2: /* R_MN10300_16 */
11558 if (saved_sym
!= NULL
)
11562 value
= reloc
->r_addend
11563 + (symtab
[get_reloc_symindex (reloc
->r_info
)].st_value
11564 - saved_sym
->st_value
);
11566 byte_put (start
+ reloc
->r_offset
, value
, reloc_type
== 1 ? 4 : 2);
11573 if (saved_sym
!= NULL
)
11574 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
11582 static bfd_vma saved_sym1
= 0;
11583 static bfd_vma saved_sym2
= 0;
11584 static bfd_vma value
;
11586 switch (reloc_type
)
11588 case 0x80: /* R_RL78_SYM. */
11589 saved_sym1
= saved_sym2
;
11590 saved_sym2
= symtab
[get_reloc_symindex (reloc
->r_info
)].st_value
;
11591 saved_sym2
+= reloc
->r_addend
;
11594 case 0x83: /* R_RL78_OPsub. */
11595 value
= saved_sym1
- saved_sym2
;
11596 saved_sym2
= saved_sym1
= 0;
11600 case 0x41: /* R_RL78_ABS32. */
11601 byte_put (start
+ reloc
->r_offset
, value
, 4);
11605 case 0x43: /* R_RL78_ABS16. */
11606 byte_put (start
+ reloc
->r_offset
, value
, 2);
11620 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11621 DWARF debug sections. This is a target specific test. Note - we do not
11622 go through the whole including-target-headers-multiple-times route, (as
11623 we have already done with <elf/h8.h>) because this would become very
11624 messy and even then this function would have to contain target specific
11625 information (the names of the relocs instead of their numeric values).
11626 FIXME: This is not the correct way to solve this problem. The proper way
11627 is to have target specific reloc sizing and typing functions created by
11628 the reloc-macros.h header, in the same way that it already creates the
11629 reloc naming functions. */
11632 is_32bit_abs_reloc (unsigned int reloc_type
)
11634 /* Please keep this table alpha-sorted for ease of visual lookup. */
11635 switch (elf_header
.e_machine
)
11639 return reloc_type
== 1; /* R_386_32. */
11641 return reloc_type
== 1; /* R_68K_32. */
11643 return reloc_type
== 1; /* R_860_32. */
11645 return reloc_type
== 2; /* R_960_32. */
11647 return reloc_type
== 258; /* R_AARCH64_ABS32 */
11648 case EM_ADAPTEVA_EPIPHANY
:
11649 return reloc_type
== 3;
11651 return reloc_type
== 1; /* R_ALPHA_REFLONG. */
11653 return reloc_type
== 1; /* R_ARC_32. */
11654 case EM_ARC_COMPACT
:
11655 case EM_ARC_COMPACT2
:
11656 return reloc_type
== 4; /* R_ARC_32. */
11658 return reloc_type
== 2; /* R_ARM_ABS32 */
11661 return reloc_type
== 1;
11663 return reloc_type
== 0x12; /* R_byte4_data. */
11665 return reloc_type
== 3; /* R_CRIS_32. */
11667 return reloc_type
== 3; /* R_CR16_NUM32. */
11669 return reloc_type
== 15; /* R_CRX_NUM32. */
11670 case EM_CYGNUS_FRV
:
11671 return reloc_type
== 1;
11672 case EM_CYGNUS_D10V
:
11674 return reloc_type
== 6; /* R_D10V_32. */
11675 case EM_CYGNUS_D30V
:
11677 return reloc_type
== 12; /* R_D30V_32_NORMAL. */
11679 return reloc_type
== 3; /* R_DLX_RELOC_32. */
11680 case EM_CYGNUS_FR30
:
11682 return reloc_type
== 3; /* R_FR30_32. */
11684 return reloc_type
== 1; /* R_FT32_32. */
11688 return reloc_type
== 1; /* R_H8_DIR32. */
11690 return reloc_type
== 0x65 /* R_IA64_SECREL32LSB. */
11691 || reloc_type
== 0x25; /* R_IA64_DIR32LSB. */
11694 return reloc_type
== 2; /* R_IP2K_32. */
11696 return reloc_type
== 2; /* R_IQ2000_32. */
11697 case EM_LATTICEMICO32
:
11698 return reloc_type
== 3; /* R_LM32_32. */
11701 return reloc_type
== 3; /* R_M32C_32. */
11703 return reloc_type
== 34; /* R_M32R_32_RELA. */
11706 return reloc_type
== 6; /* R_M68HC11_32. */
11708 return reloc_type
== 1; /* R_MCORE_ADDR32. */
11709 case EM_CYGNUS_MEP
:
11710 return reloc_type
== 4; /* R_MEP_32. */
11712 return reloc_type
== 2; /* R_METAG_ADDR32. */
11713 case EM_MICROBLAZE
:
11714 return reloc_type
== 1; /* R_MICROBLAZE_32. */
11716 return reloc_type
== 2; /* R_MIPS_32. */
11718 return reloc_type
== 4; /* R_MMIX_32. */
11719 case EM_CYGNUS_MN10200
:
11721 return reloc_type
== 1; /* R_MN10200_32. */
11722 case EM_CYGNUS_MN10300
:
11724 return reloc_type
== 1; /* R_MN10300_32. */
11726 return reloc_type
== 1; /* R_MOXIE_32. */
11727 case EM_MSP430_OLD
:
11729 return reloc_type
== 1; /* R_MSP430_32 or R_MSP320_ABS32. */
11731 return reloc_type
== 2; /* R_MT_32. */
11733 return reloc_type
== 20; /* R_NDS32_RELA. */
11734 case EM_ALTERA_NIOS2
:
11735 return reloc_type
== 12; /* R_NIOS2_BFD_RELOC_32. */
11737 return reloc_type
== 1; /* R_NIOS_32. */
11739 return reloc_type
== 1; /* R_OR1K_32. */
11741 return (reloc_type
== 1 /* R_PARISC_DIR32. */
11742 || reloc_type
== 41); /* R_PARISC_SECREL32. */
11745 return reloc_type
== 1; /* R_PJ_DATA_DIR32. */
11747 return reloc_type
== 1; /* R_PPC64_ADDR32. */
11749 return reloc_type
== 1; /* R_PPC_ADDR32. */
11751 return reloc_type
== 1; /* R_RL78_DIR32. */
11753 return reloc_type
== 1; /* R_RX_DIR32. */
11755 return reloc_type
== 1; /* R_I370_ADDR31. */
11758 return reloc_type
== 4; /* R_S390_32. */
11760 return reloc_type
== 8; /* R_SCORE_ABS32. */
11762 return reloc_type
== 1; /* R_SH_DIR32. */
11763 case EM_SPARC32PLUS
:
11766 return reloc_type
== 3 /* R_SPARC_32. */
11767 || reloc_type
== 23; /* R_SPARC_UA32. */
11769 return reloc_type
== 6; /* R_SPU_ADDR32 */
11771 return reloc_type
== 1; /* R_C6000_ABS32. */
11773 return reloc_type
== 2; /* R_TILEGX_32. */
11775 return reloc_type
== 1; /* R_TILEPRO_32. */
11776 case EM_CYGNUS_V850
:
11778 return reloc_type
== 6; /* R_V850_ABS32. */
11780 return reloc_type
== 0x33; /* R_V810_WORD. */
11782 return reloc_type
== 1; /* R_VAX_32. */
11784 return reloc_type
== 3; /* R_VISIUM_32. */
11788 return reloc_type
== 10; /* R_X86_64_32. */
11791 return reloc_type
== 3; /* R_XC16C_ABS_32. */
11793 return reloc_type
== 4; /* R_XGATE_32. */
11795 return reloc_type
== 1; /* R_XSTROMY16_32. */
11796 case EM_XTENSA_OLD
:
11798 return reloc_type
== 1; /* R_XTENSA_32. */
11801 static unsigned int prev_warn
= 0;
11803 /* Avoid repeating the same warning multiple times. */
11804 if (prev_warn
!= elf_header
.e_machine
)
11805 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11806 elf_header
.e_machine
);
11807 prev_warn
= elf_header
.e_machine
;
11813 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11814 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
11817 is_32bit_pcrel_reloc (unsigned int reloc_type
)
11819 switch (elf_header
.e_machine
)
11820 /* Please keep this table alpha-sorted for ease of visual lookup. */
11824 return reloc_type
== 2; /* R_386_PC32. */
11826 return reloc_type
== 4; /* R_68K_PC32. */
11828 return reloc_type
== 261; /* R_AARCH64_PREL32 */
11829 case EM_ADAPTEVA_EPIPHANY
:
11830 return reloc_type
== 6;
11832 return reloc_type
== 10; /* R_ALPHA_SREL32. */
11833 case EM_ARC_COMPACT
:
11834 case EM_ARC_COMPACT2
:
11835 return reloc_type
== 49; /* R_ARC_32_PCREL. */
11837 return reloc_type
== 3; /* R_ARM_REL32 */
11840 return reloc_type
== 36; /* R_AVR_32_PCREL. */
11841 case EM_MICROBLAZE
:
11842 return reloc_type
== 2; /* R_MICROBLAZE_32_PCREL. */
11844 return reloc_type
== 9; /* R_OR1K_32_PCREL. */
11846 return reloc_type
== 9; /* R_PARISC_PCREL32. */
11848 return reloc_type
== 26; /* R_PPC_REL32. */
11850 return reloc_type
== 26; /* R_PPC64_REL32. */
11853 return reloc_type
== 5; /* R_390_PC32. */
11855 return reloc_type
== 2; /* R_SH_REL32. */
11856 case EM_SPARC32PLUS
:
11859 return reloc_type
== 6; /* R_SPARC_DISP32. */
11861 return reloc_type
== 13; /* R_SPU_REL32. */
11863 return reloc_type
== 6; /* R_TILEGX_32_PCREL. */
11865 return reloc_type
== 4; /* R_TILEPRO_32_PCREL. */
11867 return reloc_type
== 6; /* R_VISIUM_32_PCREL */
11871 return reloc_type
== 2; /* R_X86_64_PC32. */
11872 case EM_XTENSA_OLD
:
11874 return reloc_type
== 14; /* R_XTENSA_32_PCREL. */
11876 /* Do not abort or issue an error message here. Not all targets use
11877 pc-relative 32-bit relocs in their DWARF debug information and we
11878 have already tested for target coverage in is_32bit_abs_reloc. A
11879 more helpful warning message will be generated by apply_relocations
11880 anyway, so just return. */
11885 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11886 a 64-bit absolute RELA relocation used in DWARF debug sections. */
11889 is_64bit_abs_reloc (unsigned int reloc_type
)
11891 switch (elf_header
.e_machine
)
11894 return reloc_type
== 257; /* R_AARCH64_ABS64. */
11896 return reloc_type
== 2; /* R_ALPHA_REFQUAD. */
11898 return reloc_type
== 0x27; /* R_IA64_DIR64LSB. */
11900 return reloc_type
== 80; /* R_PARISC_DIR64. */
11902 return reloc_type
== 38; /* R_PPC64_ADDR64. */
11903 case EM_SPARC32PLUS
:
11906 return reloc_type
== 54; /* R_SPARC_UA64. */
11910 return reloc_type
== 1; /* R_X86_64_64. */
11913 return reloc_type
== 22; /* R_S390_64. */
11915 return reloc_type
== 1; /* R_TILEGX_64. */
11917 return reloc_type
== 18; /* R_MIPS_64. */
11923 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11924 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
11927 is_64bit_pcrel_reloc (unsigned int reloc_type
)
11929 switch (elf_header
.e_machine
)
11932 return reloc_type
== 260; /* R_AARCH64_PREL64. */
11934 return reloc_type
== 11; /* R_ALPHA_SREL64. */
11936 return reloc_type
== 0x4f; /* R_IA64_PCREL64LSB. */
11938 return reloc_type
== 72; /* R_PARISC_PCREL64. */
11940 return reloc_type
== 44; /* R_PPC64_REL64. */
11941 case EM_SPARC32PLUS
:
11944 return reloc_type
== 46; /* R_SPARC_DISP64. */
11948 return reloc_type
== 24; /* R_X86_64_PC64. */
11951 return reloc_type
== 23; /* R_S390_PC64. */
11953 return reloc_type
== 5; /* R_TILEGX_64_PCREL. */
11959 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11960 a 24-bit absolute RELA relocation used in DWARF debug sections. */
11963 is_24bit_abs_reloc (unsigned int reloc_type
)
11965 switch (elf_header
.e_machine
)
11967 case EM_CYGNUS_MN10200
:
11969 return reloc_type
== 4; /* R_MN10200_24. */
11971 return reloc_type
== 5; /* R_FT32_20. */
11977 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11978 a 16-bit absolute RELA relocation used in DWARF debug sections. */
11981 is_16bit_abs_reloc (unsigned int reloc_type
)
11983 /* Please keep this table alpha-sorted for ease of visual lookup. */
11984 switch (elf_header
.e_machine
)
11987 case EM_ARC_COMPACT
:
11988 case EM_ARC_COMPACT2
:
11989 return reloc_type
== 2; /* R_ARC_16. */
11990 case EM_ADAPTEVA_EPIPHANY
:
11991 return reloc_type
== 5;
11994 return reloc_type
== 4; /* R_AVR_16. */
11995 case EM_CYGNUS_D10V
:
11997 return reloc_type
== 3; /* R_D10V_16. */
12001 return reloc_type
== R_H8_DIR16
;
12004 return reloc_type
== 1; /* R_IP2K_16. */
12007 return reloc_type
== 1; /* R_M32C_16 */
12008 case EM_CYGNUS_MN10200
:
12010 return reloc_type
== 2; /* R_MN10200_16. */
12011 case EM_CYGNUS_MN10300
:
12013 return reloc_type
== 2; /* R_MN10300_16. */
12015 if (uses_msp430x_relocs ())
12016 return reloc_type
== 2; /* R_MSP430_ABS16. */
12017 /* Fall through. */
12018 case EM_MSP430_OLD
:
12019 return reloc_type
== 5; /* R_MSP430_16_BYTE. */
12021 return reloc_type
== 19; /* R_NDS32_RELA. */
12022 case EM_ALTERA_NIOS2
:
12023 return reloc_type
== 13; /* R_NIOS2_BFD_RELOC_16. */
12025 return reloc_type
== 9; /* R_NIOS_16. */
12027 return reloc_type
== 2; /* R_OR1K_16. */
12029 return reloc_type
== 2; /* R_C6000_ABS16. */
12031 return reloc_type
== 2; /* R_VISIUM_16. */
12034 return reloc_type
== 2; /* R_XC16C_ABS_16. */
12036 return reloc_type
== 3; /* R_XGATE_16. */
12042 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12043 relocation entries (possibly formerly used for SHT_GROUP sections). */
12046 is_none_reloc (unsigned int reloc_type
)
12048 switch (elf_header
.e_machine
)
12050 case EM_386
: /* R_386_NONE. */
12051 case EM_68K
: /* R_68K_NONE. */
12052 case EM_ADAPTEVA_EPIPHANY
:
12053 case EM_ALPHA
: /* R_ALPHA_NONE. */
12054 case EM_ALTERA_NIOS2
: /* R_NIOS2_NONE. */
12055 case EM_ARC
: /* R_ARC_NONE. */
12056 case EM_ARC_COMPACT2
: /* R_ARC_NONE. */
12057 case EM_ARC_COMPACT
: /* R_ARC_NONE. */
12058 case EM_ARM
: /* R_ARM_NONE. */
12059 case EM_C166
: /* R_XC16X_NONE. */
12060 case EM_CRIS
: /* R_CRIS_NONE. */
12061 case EM_FT32
: /* R_FT32_NONE. */
12062 case EM_IA_64
: /* R_IA64_NONE. */
12063 case EM_K1OM
: /* R_X86_64_NONE. */
12064 case EM_L1OM
: /* R_X86_64_NONE. */
12065 case EM_M32R
: /* R_M32R_NONE. */
12066 case EM_MIPS
: /* R_MIPS_NONE. */
12067 case EM_MN10300
: /* R_MN10300_NONE. */
12068 case EM_MOXIE
: /* R_MOXIE_NONE. */
12069 case EM_NIOS32
: /* R_NIOS_NONE. */
12070 case EM_OR1K
: /* R_OR1K_NONE. */
12071 case EM_PARISC
: /* R_PARISC_NONE. */
12072 case EM_PPC64
: /* R_PPC64_NONE. */
12073 case EM_PPC
: /* R_PPC_NONE. */
12074 case EM_S390
: /* R_390_NONE. */
12076 case EM_SH
: /* R_SH_NONE. */
12077 case EM_SPARC32PLUS
:
12078 case EM_SPARC
: /* R_SPARC_NONE. */
12080 case EM_TILEGX
: /* R_TILEGX_NONE. */
12081 case EM_TILEPRO
: /* R_TILEPRO_NONE. */
12082 case EM_TI_C6000
:/* R_C6000_NONE. */
12083 case EM_X86_64
: /* R_X86_64_NONE. */
12085 return reloc_type
== 0;
12088 return reloc_type
== 0 || reloc_type
== 256;
12091 return (reloc_type
== 0 /* R_AVR_NONE. */
12092 || reloc_type
== 30 /* R_AVR_DIFF8. */
12093 || reloc_type
== 31 /* R_AVR_DIFF16. */
12094 || reloc_type
== 32 /* R_AVR_DIFF32. */);
12096 return reloc_type
== 3; /* R_METAG_NONE. */
12098 return (reloc_type
== 0 /* R_XTENSA_NONE. */
12099 || reloc_type
== 204 /* R_NDS32_DIFF8. */
12100 || reloc_type
== 205 /* R_NDS32_DIFF16. */
12101 || reloc_type
== 206 /* R_NDS32_DIFF32. */
12102 || reloc_type
== 207 /* R_NDS32_ULEB128. */);
12103 case EM_XTENSA_OLD
:
12105 return (reloc_type
== 0 /* R_XTENSA_NONE. */
12106 || reloc_type
== 17 /* R_XTENSA_DIFF8. */
12107 || reloc_type
== 18 /* R_XTENSA_DIFF16. */
12108 || reloc_type
== 19 /* R_XTENSA_DIFF32. */);
12113 /* Returns TRUE if there is a relocation against
12114 section NAME at OFFSET bytes. */
12117 reloc_at (struct dwarf_section
* dsec
, dwarf_vma offset
)
12119 Elf_Internal_Rela
* relocs
;
12120 Elf_Internal_Rela
* rp
;
12122 if (dsec
== NULL
|| dsec
->reloc_info
== NULL
)
12125 relocs
= (Elf_Internal_Rela
*) dsec
->reloc_info
;
12127 for (rp
= relocs
; rp
< relocs
+ dsec
->num_relocs
; ++rp
)
12128 if (rp
->r_offset
== offset
)
12134 /* Apply relocations to a section.
12135 Note: So far support has been added only for those relocations
12136 which can be found in debug sections.
12137 If RELOCS_RETURN is non-NULL then returns in it a pointer to the
12138 loaded relocs. It is then the caller's responsibility to free them.
12139 FIXME: Add support for more relocations ? */
12142 apply_relocations (void * file
,
12143 const Elf_Internal_Shdr
* section
,
12144 unsigned char * start
,
12145 bfd_size_type size
,
12146 void ** relocs_return
,
12147 unsigned long * num_relocs_return
)
12149 Elf_Internal_Shdr
* relsec
;
12150 unsigned char * end
= start
+ size
;
12152 if (relocs_return
!= NULL
)
12154 * (Elf_Internal_Rela
**) relocs_return
= NULL
;
12155 * num_relocs_return
= 0;
12158 if (elf_header
.e_type
!= ET_REL
)
12161 /* Find the reloc section associated with the section. */
12162 for (relsec
= section_headers
;
12163 relsec
< section_headers
+ elf_header
.e_shnum
;
12166 bfd_boolean is_rela
;
12167 unsigned long num_relocs
;
12168 Elf_Internal_Rela
* relocs
;
12169 Elf_Internal_Rela
* rp
;
12170 Elf_Internal_Shdr
* symsec
;
12171 Elf_Internal_Sym
* symtab
;
12172 unsigned long num_syms
;
12173 Elf_Internal_Sym
* sym
;
12175 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
12176 || relsec
->sh_info
>= elf_header
.e_shnum
12177 || section_headers
+ relsec
->sh_info
!= section
12178 || relsec
->sh_size
== 0
12179 || relsec
->sh_link
>= elf_header
.e_shnum
)
12182 is_rela
= relsec
->sh_type
== SHT_RELA
;
12186 if (!slurp_rela_relocs ((FILE *) file
, relsec
->sh_offset
,
12187 relsec
->sh_size
, & relocs
, & num_relocs
))
12192 if (!slurp_rel_relocs ((FILE *) file
, relsec
->sh_offset
,
12193 relsec
->sh_size
, & relocs
, & num_relocs
))
12197 /* SH uses RELA but uses in place value instead of the addend field. */
12198 if (elf_header
.e_machine
== EM_SH
)
12201 symsec
= section_headers
+ relsec
->sh_link
;
12202 symtab
= GET_ELF_SYMBOLS ((FILE *) file
, symsec
, & num_syms
);
12204 for (rp
= relocs
; rp
< relocs
+ num_relocs
; ++rp
)
12207 unsigned int reloc_type
;
12208 unsigned int reloc_size
;
12209 unsigned char * rloc
;
12210 unsigned long sym_index
;
12212 reloc_type
= get_reloc_type (rp
->r_info
);
12214 if (target_specific_reloc_handling (rp
, start
, symtab
))
12216 else if (is_none_reloc (reloc_type
))
12218 else if (is_32bit_abs_reloc (reloc_type
)
12219 || is_32bit_pcrel_reloc (reloc_type
))
12221 else if (is_64bit_abs_reloc (reloc_type
)
12222 || is_64bit_pcrel_reloc (reloc_type
))
12224 else if (is_24bit_abs_reloc (reloc_type
))
12226 else if (is_16bit_abs_reloc (reloc_type
))
12230 static unsigned int prev_reloc
= 0;
12231 if (reloc_type
!= prev_reloc
)
12232 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
12233 reloc_type
, printable_section_name (section
));
12234 prev_reloc
= reloc_type
;
12238 rloc
= start
+ rp
->r_offset
;
12239 if ((rloc
+ reloc_size
) > end
|| (rloc
< start
))
12241 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
12242 (unsigned long) rp
->r_offset
,
12243 printable_section_name (section
));
12247 sym_index
= (unsigned long) get_reloc_symindex (rp
->r_info
);
12248 if (sym_index
>= num_syms
)
12250 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
12251 sym_index
, printable_section_name (section
));
12254 sym
= symtab
+ sym_index
;
12256 /* If the reloc has a symbol associated with it,
12257 make sure that it is of an appropriate type.
12259 Relocations against symbols without type can happen.
12260 Gcc -feliminate-dwarf2-dups may generate symbols
12261 without type for debug info.
12263 Icc generates relocations against function symbols
12264 instead of local labels.
12266 Relocations against object symbols can happen, eg when
12267 referencing a global array. For an example of this see
12268 the _clz.o binary in libgcc.a. */
12270 && ELF_ST_TYPE (sym
->st_info
) != STT_COMMON
12271 && ELF_ST_TYPE (sym
->st_info
) > STT_SECTION
)
12273 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
12274 get_symbol_type (ELF_ST_TYPE (sym
->st_info
)),
12275 (long int)(rp
- relocs
),
12276 printable_section_name (relsec
));
12282 addend
+= rp
->r_addend
;
12283 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
12284 partial_inplace. */
12286 || (elf_header
.e_machine
== EM_XTENSA
12287 && reloc_type
== 1)
12288 || ((elf_header
.e_machine
== EM_PJ
12289 || elf_header
.e_machine
== EM_PJ_OLD
)
12290 && reloc_type
== 1)
12291 || ((elf_header
.e_machine
== EM_D30V
12292 || elf_header
.e_machine
== EM_CYGNUS_D30V
)
12293 && reloc_type
== 12))
12294 addend
+= byte_get (rloc
, reloc_size
);
12296 if (is_32bit_pcrel_reloc (reloc_type
)
12297 || is_64bit_pcrel_reloc (reloc_type
))
12299 /* On HPPA, all pc-relative relocations are biased by 8. */
12300 if (elf_header
.e_machine
== EM_PARISC
)
12302 byte_put (rloc
, (addend
+ sym
->st_value
) - rp
->r_offset
,
12306 byte_put (rloc
, addend
+ sym
->st_value
, reloc_size
);
12313 * (Elf_Internal_Rela
**) relocs_return
= relocs
;
12314 * num_relocs_return
= num_relocs
;
12323 #ifdef SUPPORT_DISASSEMBLY
12325 disassemble_section (Elf_Internal_Shdr
* section
, FILE * file
)
12327 printf (_("\nAssembly dump of section %s\n"), printable_section_name (section
));
12329 /* FIXME: XXX -- to be done --- XXX */
12335 /* Reads in the contents of SECTION from FILE, returning a pointer
12336 to a malloc'ed buffer or NULL if something went wrong. */
12339 get_section_contents (Elf_Internal_Shdr
* section
, FILE * file
)
12341 bfd_size_type num_bytes
;
12343 num_bytes
= section
->sh_size
;
12345 if (num_bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
12347 printf (_("\nSection '%s' has no data to dump.\n"),
12348 printable_section_name (section
));
12352 return (char *) get_data (NULL
, file
, section
->sh_offset
, 1, num_bytes
,
12353 _("section contents"));
12356 /* Uncompresses a section that was compressed using zlib, in place. */
12359 uncompress_section_contents (unsigned char **buffer
,
12360 dwarf_size_type uncompressed_size
,
12361 dwarf_size_type
*size
)
12363 dwarf_size_type compressed_size
= *size
;
12364 unsigned char * compressed_buffer
= *buffer
;
12365 unsigned char * uncompressed_buffer
;
12369 /* It is possible the section consists of several compressed
12370 buffers concatenated together, so we uncompress in a loop. */
12371 /* PR 18313: The state field in the z_stream structure is supposed
12372 to be invisible to the user (ie us), but some compilers will
12373 still complain about it being used without initialisation. So
12374 we first zero the entire z_stream structure and then set the fields
12376 memset (& strm
, 0, sizeof strm
);
12377 strm
.avail_in
= compressed_size
;
12378 strm
.next_in
= (Bytef
*) compressed_buffer
;
12379 strm
.avail_out
= uncompressed_size
;
12380 uncompressed_buffer
= (unsigned char *) xmalloc (uncompressed_size
);
12382 rc
= inflateInit (& strm
);
12383 while (strm
.avail_in
> 0)
12387 strm
.next_out
= ((Bytef
*) uncompressed_buffer
12388 + (uncompressed_size
- strm
.avail_out
));
12389 rc
= inflate (&strm
, Z_FINISH
);
12390 if (rc
!= Z_STREAM_END
)
12392 rc
= inflateReset (& strm
);
12394 rc
= inflateEnd (& strm
);
12396 || strm
.avail_out
!= 0)
12399 *buffer
= uncompressed_buffer
;
12400 *size
= uncompressed_size
;
12404 free (uncompressed_buffer
);
12405 /* Indicate decompression failure. */
12411 dump_section_as_strings (Elf_Internal_Shdr
* section
, FILE * file
)
12413 Elf_Internal_Shdr
* relsec
;
12414 bfd_size_type num_bytes
;
12415 unsigned char * data
;
12416 unsigned char * end
;
12417 unsigned char * real_start
;
12418 unsigned char * start
;
12419 bfd_boolean some_strings_shown
;
12421 real_start
= start
= (unsigned char *) get_section_contents (section
,
12425 num_bytes
= section
->sh_size
;
12427 printf (_("\nString dump of section '%s':\n"), printable_section_name (section
));
12429 if (decompress_dumps
)
12431 dwarf_size_type new_size
= num_bytes
;
12432 dwarf_size_type uncompressed_size
= 0;
12434 if ((section
->sh_flags
& SHF_COMPRESSED
) != 0)
12436 Elf_Internal_Chdr chdr
;
12437 unsigned int compression_header_size
12438 = get_compression_header (& chdr
, (unsigned char *) start
);
12440 if (chdr
.ch_type
!= ELFCOMPRESS_ZLIB
)
12442 warn (_("section '%s' has unsupported compress type: %d\n"),
12443 printable_section_name (section
), chdr
.ch_type
);
12446 else if (chdr
.ch_addralign
!= section
->sh_addralign
)
12448 warn (_("compressed section '%s' is corrupted\n"),
12449 printable_section_name (section
));
12452 uncompressed_size
= chdr
.ch_size
;
12453 start
+= compression_header_size
;
12454 new_size
-= compression_header_size
;
12456 else if (new_size
> 12 && streq ((char *) start
, "ZLIB"))
12458 /* Read the zlib header. In this case, it should be "ZLIB"
12459 followed by the uncompressed section size, 8 bytes in
12460 big-endian order. */
12461 uncompressed_size
= start
[4]; uncompressed_size
<<= 8;
12462 uncompressed_size
+= start
[5]; uncompressed_size
<<= 8;
12463 uncompressed_size
+= start
[6]; uncompressed_size
<<= 8;
12464 uncompressed_size
+= start
[7]; uncompressed_size
<<= 8;
12465 uncompressed_size
+= start
[8]; uncompressed_size
<<= 8;
12466 uncompressed_size
+= start
[9]; uncompressed_size
<<= 8;
12467 uncompressed_size
+= start
[10]; uncompressed_size
<<= 8;
12468 uncompressed_size
+= start
[11];
12473 if (uncompressed_size
12474 && uncompress_section_contents (& start
,
12475 uncompressed_size
, & new_size
))
12476 num_bytes
= new_size
;
12479 /* If the section being dumped has relocations against it the user might
12480 be expecting these relocations to have been applied. Check for this
12481 case and issue a warning message in order to avoid confusion.
12482 FIXME: Maybe we ought to have an option that dumps a section with
12483 relocs applied ? */
12484 for (relsec
= section_headers
;
12485 relsec
< section_headers
+ elf_header
.e_shnum
;
12488 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
12489 || relsec
->sh_info
>= elf_header
.e_shnum
12490 || section_headers
+ relsec
->sh_info
!= section
12491 || relsec
->sh_size
== 0
12492 || relsec
->sh_link
>= elf_header
.e_shnum
)
12495 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12500 end
= start
+ num_bytes
;
12501 some_strings_shown
= FALSE
;
12505 while (!ISPRINT (* data
))
12506 if (++ data
>= end
)
12511 size_t maxlen
= end
- data
;
12514 /* PR 11128: Use two separate invocations in order to work
12515 around bugs in the Solaris 8 implementation of printf. */
12516 printf (" [%6tx] ", data
- start
);
12518 printf (" [%6Ix] ", (size_t) (data
- start
));
12522 print_symbol ((int) maxlen
, (const char *) data
);
12524 data
+= strnlen ((const char *) data
, maxlen
);
12528 printf (_("<corrupt>\n"));
12531 some_strings_shown
= TRUE
;
12535 if (! some_strings_shown
)
12536 printf (_(" No strings found in this section."));
12544 dump_section_as_bytes (Elf_Internal_Shdr
* section
,
12546 bfd_boolean relocate
)
12548 Elf_Internal_Shdr
* relsec
;
12549 bfd_size_type bytes
;
12550 bfd_size_type section_size
;
12552 unsigned char * data
;
12553 unsigned char * real_start
;
12554 unsigned char * start
;
12556 real_start
= start
= (unsigned char *) get_section_contents (section
, file
);
12559 section_size
= section
->sh_size
;
12561 printf (_("\nHex dump of section '%s':\n"), printable_section_name (section
));
12563 if (decompress_dumps
)
12565 dwarf_size_type new_size
= section_size
;
12566 dwarf_size_type uncompressed_size
= 0;
12568 if ((section
->sh_flags
& SHF_COMPRESSED
) != 0)
12570 Elf_Internal_Chdr chdr
;
12571 unsigned int compression_header_size
12572 = get_compression_header (& chdr
, start
);
12574 if (chdr
.ch_type
!= ELFCOMPRESS_ZLIB
)
12576 warn (_("section '%s' has unsupported compress type: %d\n"),
12577 printable_section_name (section
), chdr
.ch_type
);
12580 else if (chdr
.ch_addralign
!= section
->sh_addralign
)
12582 warn (_("compressed section '%s' is corrupted\n"),
12583 printable_section_name (section
));
12586 uncompressed_size
= chdr
.ch_size
;
12587 start
+= compression_header_size
;
12588 new_size
-= compression_header_size
;
12590 else if (new_size
> 12 && streq ((char *) start
, "ZLIB"))
12592 /* Read the zlib header. In this case, it should be "ZLIB"
12593 followed by the uncompressed section size, 8 bytes in
12594 big-endian order. */
12595 uncompressed_size
= start
[4]; uncompressed_size
<<= 8;
12596 uncompressed_size
+= start
[5]; uncompressed_size
<<= 8;
12597 uncompressed_size
+= start
[6]; uncompressed_size
<<= 8;
12598 uncompressed_size
+= start
[7]; uncompressed_size
<<= 8;
12599 uncompressed_size
+= start
[8]; uncompressed_size
<<= 8;
12600 uncompressed_size
+= start
[9]; uncompressed_size
<<= 8;
12601 uncompressed_size
+= start
[10]; uncompressed_size
<<= 8;
12602 uncompressed_size
+= start
[11];
12607 if (uncompressed_size
12608 && uncompress_section_contents (& start
, uncompressed_size
,
12610 section_size
= new_size
;
12615 apply_relocations (file
, section
, start
, section_size
, NULL
, NULL
);
12619 /* If the section being dumped has relocations against it the user might
12620 be expecting these relocations to have been applied. Check for this
12621 case and issue a warning message in order to avoid confusion.
12622 FIXME: Maybe we ought to have an option that dumps a section with
12623 relocs applied ? */
12624 for (relsec
= section_headers
;
12625 relsec
< section_headers
+ elf_header
.e_shnum
;
12628 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
12629 || relsec
->sh_info
>= elf_header
.e_shnum
12630 || section_headers
+ relsec
->sh_info
!= section
12631 || relsec
->sh_size
== 0
12632 || relsec
->sh_link
>= elf_header
.e_shnum
)
12635 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12640 addr
= section
->sh_addr
;
12641 bytes
= section_size
;
12650 lbytes
= (bytes
> 16 ? 16 : bytes
);
12652 printf (" 0x%8.8lx ", (unsigned long) addr
);
12654 for (j
= 0; j
< 16; j
++)
12657 printf ("%2.2x", data
[j
]);
12665 for (j
= 0; j
< lbytes
; j
++)
12668 if (k
>= ' ' && k
< 0x7f)
12687 load_specific_debug_section (enum dwarf_section_display_enum debug
,
12688 const Elf_Internal_Shdr
* sec
, void * file
)
12690 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
12693 /* If it is already loaded, do nothing. */
12694 if (section
->start
!= NULL
)
12697 snprintf (buf
, sizeof (buf
), _("%s section data"), section
->name
);
12698 section
->address
= sec
->sh_addr
;
12699 section
->user_data
= NULL
;
12700 section
->start
= (unsigned char *) get_data (NULL
, (FILE *) file
,
12702 sec
->sh_size
, buf
);
12703 if (section
->start
== NULL
)
12707 unsigned char *start
= section
->start
;
12708 dwarf_size_type size
= sec
->sh_size
;
12709 dwarf_size_type uncompressed_size
= 0;
12711 if ((sec
->sh_flags
& SHF_COMPRESSED
) != 0)
12713 Elf_Internal_Chdr chdr
;
12714 unsigned int compression_header_size
;
12716 if (size
< (is_32bit_elf
12717 ? sizeof (Elf32_External_Chdr
)
12718 : sizeof (Elf64_External_Chdr
)))
12720 warn (_("compressed section %s is too small to contain a compression header"),
12725 compression_header_size
= get_compression_header (&chdr
, start
);
12727 if (chdr
.ch_type
!= ELFCOMPRESS_ZLIB
)
12729 warn (_("section '%s' has unsupported compress type: %d\n"),
12730 section
->name
, chdr
.ch_type
);
12733 else if (chdr
.ch_addralign
!= sec
->sh_addralign
)
12735 warn (_("compressed section '%s' is corrupted\n"),
12739 uncompressed_size
= chdr
.ch_size
;
12740 start
+= compression_header_size
;
12741 size
-= compression_header_size
;
12743 else if (size
> 12 && streq ((char *) start
, "ZLIB"))
12745 /* Read the zlib header. In this case, it should be "ZLIB"
12746 followed by the uncompressed section size, 8 bytes in
12747 big-endian order. */
12748 uncompressed_size
= start
[4]; uncompressed_size
<<= 8;
12749 uncompressed_size
+= start
[5]; uncompressed_size
<<= 8;
12750 uncompressed_size
+= start
[6]; uncompressed_size
<<= 8;
12751 uncompressed_size
+= start
[7]; uncompressed_size
<<= 8;
12752 uncompressed_size
+= start
[8]; uncompressed_size
<<= 8;
12753 uncompressed_size
+= start
[9]; uncompressed_size
<<= 8;
12754 uncompressed_size
+= start
[10]; uncompressed_size
<<= 8;
12755 uncompressed_size
+= start
[11];
12760 if (uncompressed_size
12761 && uncompress_section_contents (&start
, uncompressed_size
,
12764 /* Free the compressed buffer, update the section buffer
12765 and the section size if uncompress is successful. */
12766 free (section
->start
);
12767 section
->start
= start
;
12769 section
->size
= size
;
12772 if (section
->start
== NULL
)
12775 if (debug_displays
[debug
].relocate
)
12776 apply_relocations ((FILE *) file
, sec
, section
->start
, section
->size
,
12777 & section
->reloc_info
, & section
->num_relocs
);
12780 section
->reloc_info
= NULL
;
12781 section
->num_relocs
= 0;
12787 /* If this is not NULL, load_debug_section will only look for sections
12788 within the list of sections given here. */
12789 unsigned int *section_subset
= NULL
;
12792 load_debug_section (enum dwarf_section_display_enum debug
, void * file
)
12794 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
12795 Elf_Internal_Shdr
* sec
;
12797 /* Locate the debug section. */
12798 sec
= find_section_in_set (section
->uncompressed_name
, section_subset
);
12800 section
->name
= section
->uncompressed_name
;
12803 sec
= find_section_in_set (section
->compressed_name
, section_subset
);
12805 section
->name
= section
->compressed_name
;
12810 /* If we're loading from a subset of sections, and we've loaded
12811 a section matching this name before, it's likely that it's a
12813 if (section_subset
!= NULL
)
12814 free_debug_section (debug
);
12816 return load_specific_debug_section (debug
, sec
, (FILE *) file
);
12820 free_debug_section (enum dwarf_section_display_enum debug
)
12822 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
12824 if (section
->start
== NULL
)
12827 free ((char *) section
->start
);
12828 section
->start
= NULL
;
12829 section
->address
= 0;
12834 display_debug_section (int shndx
, Elf_Internal_Shdr
* section
, FILE * file
)
12836 char * name
= SECTION_NAME (section
);
12837 const char * print_name
= printable_section_name (section
);
12838 bfd_size_type length
;
12842 length
= section
->sh_size
;
12845 printf (_("\nSection '%s' has no debugging data.\n"), print_name
);
12848 if (section
->sh_type
== SHT_NOBITS
)
12850 /* There is no point in dumping the contents of a debugging section
12851 which has the NOBITS type - the bits in the file will be random.
12852 This can happen when a file containing a .eh_frame section is
12853 stripped with the --only-keep-debug command line option. */
12854 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12859 if (const_strneq (name
, ".gnu.linkonce.wi."))
12860 name
= ".debug_info";
12862 /* See if we know how to display the contents of this section. */
12863 for (i
= 0; i
< max
; i
++)
12864 if (streq (debug_displays
[i
].section
.uncompressed_name
, name
)
12865 || (i
== line
&& const_strneq (name
, ".debug_line."))
12866 || streq (debug_displays
[i
].section
.compressed_name
, name
))
12868 struct dwarf_section
* sec
= &debug_displays
[i
].section
;
12869 int secondary
= (section
!= find_section (name
));
12872 free_debug_section ((enum dwarf_section_display_enum
) i
);
12874 if (i
== line
&& const_strneq (name
, ".debug_line."))
12876 else if (streq (sec
->uncompressed_name
, name
))
12877 sec
->name
= sec
->uncompressed_name
;
12879 sec
->name
= sec
->compressed_name
;
12880 if (load_specific_debug_section ((enum dwarf_section_display_enum
) i
,
12883 /* If this debug section is part of a CU/TU set in a .dwp file,
12884 restrict load_debug_section to the sections in that set. */
12885 section_subset
= find_cu_tu_set (file
, shndx
);
12887 result
&= debug_displays
[i
].display (sec
, file
);
12889 section_subset
= NULL
;
12891 if (secondary
|| (i
!= info
&& i
!= abbrev
))
12892 free_debug_section ((enum dwarf_section_display_enum
) i
);
12900 printf (_("Unrecognized debug section: %s\n"), print_name
);
12907 /* Set DUMP_SECTS for all sections where dumps were requested
12908 based on section name. */
12911 initialise_dumps_byname (void)
12913 struct dump_list_entry
* cur
;
12915 for (cur
= dump_sects_byname
; cur
; cur
= cur
->next
)
12920 for (i
= 0, any
= 0; i
< elf_header
.e_shnum
; i
++)
12921 if (streq (SECTION_NAME (section_headers
+ i
), cur
->name
))
12923 request_dump_bynumber (i
, cur
->type
);
12928 warn (_("Section '%s' was not dumped because it does not exist!\n"),
12934 process_section_contents (FILE * file
)
12936 Elf_Internal_Shdr
* section
;
12942 initialise_dumps_byname ();
12944 for (i
= 0, section
= section_headers
;
12945 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
12948 #ifdef SUPPORT_DISASSEMBLY
12949 if (dump_sects
[i
] & DISASS_DUMP
)
12950 disassemble_section (section
, file
);
12952 if (dump_sects
[i
] & HEX_DUMP
)
12953 dump_section_as_bytes (section
, file
, FALSE
);
12955 if (dump_sects
[i
] & RELOC_DUMP
)
12956 dump_section_as_bytes (section
, file
, TRUE
);
12958 if (dump_sects
[i
] & STRING_DUMP
)
12959 dump_section_as_strings (section
, file
);
12961 if (dump_sects
[i
] & DEBUG_DUMP
)
12962 display_debug_section (i
, section
, file
);
12965 /* Check to see if the user requested a
12966 dump of a section that does not exist. */
12967 while (i
++ < num_dump_sects
)
12969 warn (_("Section %d was not dumped because it does not exist!\n"), i
);
12973 process_mips_fpe_exception (int mask
)
12978 if (mask
& OEX_FPU_INEX
)
12979 fputs ("INEX", stdout
), first
= 0;
12980 if (mask
& OEX_FPU_UFLO
)
12981 printf ("%sUFLO", first
? "" : "|"), first
= 0;
12982 if (mask
& OEX_FPU_OFLO
)
12983 printf ("%sOFLO", first
? "" : "|"), first
= 0;
12984 if (mask
& OEX_FPU_DIV0
)
12985 printf ("%sDIV0", first
? "" : "|"), first
= 0;
12986 if (mask
& OEX_FPU_INVAL
)
12987 printf ("%sINVAL", first
? "" : "|");
12990 fputs ("0", stdout
);
12993 /* Display's the value of TAG at location P. If TAG is
12994 greater than 0 it is assumed to be an unknown tag, and
12995 a message is printed to this effect. Otherwise it is
12996 assumed that a message has already been printed.
12998 If the bottom bit of TAG is set it assumed to have a
12999 string value, otherwise it is assumed to have an integer
13002 Returns an updated P pointing to the first unread byte
13003 beyond the end of TAG's value.
13005 Reads at or beyond END will not be made. */
13007 static unsigned char *
13008 display_tag_value (int tag
,
13010 const unsigned char * const end
)
13015 printf (" Tag_unknown_%d: ", tag
);
13019 warn (_("<corrupt tag>\n"));
13023 /* PR 17531 file: 027-19978-0.004. */
13024 size_t maxlen
= (end
- p
) - 1;
13029 print_symbol ((int) maxlen
, (const char *) p
);
13030 p
+= strnlen ((char *) p
, maxlen
) + 1;
13034 printf (_("<corrupt string tag>"));
13035 p
= (unsigned char *) end
;
13043 val
= read_uleb128 (p
, &len
, end
);
13045 printf ("%ld (0x%lx)\n", val
, val
);
13052 /* ARM EABI attributes section. */
13057 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
13059 const char ** table
;
13060 } arm_attr_public_tag
;
13062 static const char * arm_attr_tag_CPU_arch
[] =
13063 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
13064 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
13066 static const char * arm_attr_tag_ARM_ISA_use
[] = {"No", "Yes"};
13067 static const char * arm_attr_tag_THUMB_ISA_use
[] =
13068 {"No", "Thumb-1", "Thumb-2", "Yes"};
13069 static const char * arm_attr_tag_FP_arch
[] =
13070 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
13071 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
13072 static const char * arm_attr_tag_WMMX_arch
[] = {"No", "WMMXv1", "WMMXv2"};
13073 static const char * arm_attr_tag_Advanced_SIMD_arch
[] =
13074 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
13075 "NEON for ARMv8.1"};
13076 static const char * arm_attr_tag_PCS_config
[] =
13077 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
13078 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
13079 static const char * arm_attr_tag_ABI_PCS_R9_use
[] =
13080 {"V6", "SB", "TLS", "Unused"};
13081 static const char * arm_attr_tag_ABI_PCS_RW_data
[] =
13082 {"Absolute", "PC-relative", "SB-relative", "None"};
13083 static const char * arm_attr_tag_ABI_PCS_RO_data
[] =
13084 {"Absolute", "PC-relative", "None"};
13085 static const char * arm_attr_tag_ABI_PCS_GOT_use
[] =
13086 {"None", "direct", "GOT-indirect"};
13087 static const char * arm_attr_tag_ABI_PCS_wchar_t
[] =
13088 {"None", "??? 1", "2", "??? 3", "4"};
13089 static const char * arm_attr_tag_ABI_FP_rounding
[] = {"Unused", "Needed"};
13090 static const char * arm_attr_tag_ABI_FP_denormal
[] =
13091 {"Unused", "Needed", "Sign only"};
13092 static const char * arm_attr_tag_ABI_FP_exceptions
[] = {"Unused", "Needed"};
13093 static const char * arm_attr_tag_ABI_FP_user_exceptions
[] = {"Unused", "Needed"};
13094 static const char * arm_attr_tag_ABI_FP_number_model
[] =
13095 {"Unused", "Finite", "RTABI", "IEEE 754"};
13096 static const char * arm_attr_tag_ABI_enum_size
[] =
13097 {"Unused", "small", "int", "forced to int"};
13098 static const char * arm_attr_tag_ABI_HardFP_use
[] =
13099 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
13100 static const char * arm_attr_tag_ABI_VFP_args
[] =
13101 {"AAPCS", "VFP registers", "custom", "compatible"};
13102 static const char * arm_attr_tag_ABI_WMMX_args
[] =
13103 {"AAPCS", "WMMX registers", "custom"};
13104 static const char * arm_attr_tag_ABI_optimization_goals
[] =
13105 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13106 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
13107 static const char * arm_attr_tag_ABI_FP_optimization_goals
[] =
13108 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13109 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
13110 static const char * arm_attr_tag_CPU_unaligned_access
[] = {"None", "v6"};
13111 static const char * arm_attr_tag_FP_HP_extension
[] =
13112 {"Not Allowed", "Allowed"};
13113 static const char * arm_attr_tag_ABI_FP_16bit_format
[] =
13114 {"None", "IEEE 754", "Alternative Format"};
13115 static const char * arm_attr_tag_DSP_extension
[] =
13116 {"Follow architecture", "Allowed"};
13117 static const char * arm_attr_tag_MPextension_use
[] =
13118 {"Not Allowed", "Allowed"};
13119 static const char * arm_attr_tag_DIV_use
[] =
13120 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
13121 "Allowed in v7-A with integer division extension"};
13122 static const char * arm_attr_tag_T2EE_use
[] = {"Not Allowed", "Allowed"};
13123 static const char * arm_attr_tag_Virtualization_use
[] =
13124 {"Not Allowed", "TrustZone", "Virtualization Extensions",
13125 "TrustZone and Virtualization Extensions"};
13126 static const char * arm_attr_tag_MPextension_use_legacy
[] =
13127 {"Not Allowed", "Allowed"};
13129 #define LOOKUP(id, name) \
13130 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
13131 static arm_attr_public_tag arm_attr_public_tags
[] =
13133 {4, "CPU_raw_name", 1, NULL
},
13134 {5, "CPU_name", 1, NULL
},
13135 LOOKUP(6, CPU_arch
),
13136 {7, "CPU_arch_profile", 0, NULL
},
13137 LOOKUP(8, ARM_ISA_use
),
13138 LOOKUP(9, THUMB_ISA_use
),
13139 LOOKUP(10, FP_arch
),
13140 LOOKUP(11, WMMX_arch
),
13141 LOOKUP(12, Advanced_SIMD_arch
),
13142 LOOKUP(13, PCS_config
),
13143 LOOKUP(14, ABI_PCS_R9_use
),
13144 LOOKUP(15, ABI_PCS_RW_data
),
13145 LOOKUP(16, ABI_PCS_RO_data
),
13146 LOOKUP(17, ABI_PCS_GOT_use
),
13147 LOOKUP(18, ABI_PCS_wchar_t
),
13148 LOOKUP(19, ABI_FP_rounding
),
13149 LOOKUP(20, ABI_FP_denormal
),
13150 LOOKUP(21, ABI_FP_exceptions
),
13151 LOOKUP(22, ABI_FP_user_exceptions
),
13152 LOOKUP(23, ABI_FP_number_model
),
13153 {24, "ABI_align_needed", 0, NULL
},
13154 {25, "ABI_align_preserved", 0, NULL
},
13155 LOOKUP(26, ABI_enum_size
),
13156 LOOKUP(27, ABI_HardFP_use
),
13157 LOOKUP(28, ABI_VFP_args
),
13158 LOOKUP(29, ABI_WMMX_args
),
13159 LOOKUP(30, ABI_optimization_goals
),
13160 LOOKUP(31, ABI_FP_optimization_goals
),
13161 {32, "compatibility", 0, NULL
},
13162 LOOKUP(34, CPU_unaligned_access
),
13163 LOOKUP(36, FP_HP_extension
),
13164 LOOKUP(38, ABI_FP_16bit_format
),
13165 LOOKUP(42, MPextension_use
),
13166 LOOKUP(44, DIV_use
),
13167 LOOKUP(46, DSP_extension
),
13168 {64, "nodefaults", 0, NULL
},
13169 {65, "also_compatible_with", 0, NULL
},
13170 LOOKUP(66, T2EE_use
),
13171 {67, "conformance", 1, NULL
},
13172 LOOKUP(68, Virtualization_use
),
13173 LOOKUP(70, MPextension_use_legacy
)
13177 static unsigned char *
13178 display_arm_attribute (unsigned char * p
,
13179 const unsigned char * const end
)
13184 arm_attr_public_tag
* attr
;
13188 tag
= read_uleb128 (p
, &len
, end
);
13191 for (i
= 0; i
< ARRAY_SIZE (arm_attr_public_tags
); i
++)
13193 if (arm_attr_public_tags
[i
].tag
== tag
)
13195 attr
= &arm_attr_public_tags
[i
];
13202 printf (" Tag_%s: ", attr
->name
);
13203 switch (attr
->type
)
13208 case 7: /* Tag_CPU_arch_profile. */
13209 val
= read_uleb128 (p
, &len
, end
);
13213 case 0: printf (_("None\n")); break;
13214 case 'A': printf (_("Application\n")); break;
13215 case 'R': printf (_("Realtime\n")); break;
13216 case 'M': printf (_("Microcontroller\n")); break;
13217 case 'S': printf (_("Application or Realtime\n")); break;
13218 default: printf ("??? (%d)\n", val
); break;
13222 case 24: /* Tag_align_needed. */
13223 val
= read_uleb128 (p
, &len
, end
);
13227 case 0: printf (_("None\n")); break;
13228 case 1: printf (_("8-byte\n")); break;
13229 case 2: printf (_("4-byte\n")); break;
13230 case 3: printf ("??? 3\n"); break;
13233 printf (_("8-byte and up to %d-byte extended\n"),
13236 printf ("??? (%d)\n", val
);
13241 case 25: /* Tag_align_preserved. */
13242 val
= read_uleb128 (p
, &len
, end
);
13246 case 0: printf (_("None\n")); break;
13247 case 1: printf (_("8-byte, except leaf SP\n")); break;
13248 case 2: printf (_("8-byte\n")); break;
13249 case 3: printf ("??? 3\n"); break;
13252 printf (_("8-byte and up to %d-byte extended\n"),
13255 printf ("??? (%d)\n", val
);
13260 case 32: /* Tag_compatibility. */
13262 val
= read_uleb128 (p
, &len
, end
);
13264 printf (_("flag = %d, vendor = "), val
);
13267 size_t maxlen
= (end
- p
) - 1;
13269 print_symbol ((int) maxlen
, (const char *) p
);
13270 p
+= strnlen ((char *) p
, maxlen
) + 1;
13274 printf (_("<corrupt>"));
13275 p
= (unsigned char *) end
;
13281 case 64: /* Tag_nodefaults. */
13282 /* PR 17531: file: 001-505008-0.01. */
13285 printf (_("True\n"));
13288 case 65: /* Tag_also_compatible_with. */
13289 val
= read_uleb128 (p
, &len
, end
);
13291 if (val
== 6 /* Tag_CPU_arch. */)
13293 val
= read_uleb128 (p
, &len
, end
);
13295 if ((unsigned int) val
>= ARRAY_SIZE (arm_attr_tag_CPU_arch
))
13296 printf ("??? (%d)\n", val
);
13298 printf ("%s\n", arm_attr_tag_CPU_arch
[val
]);
13302 while (p
< end
&& *(p
++) != '\0' /* NUL terminator. */)
13307 printf (_("<unknown: %d>\n"), tag
);
13313 return display_tag_value (-1, p
, end
);
13315 return display_tag_value (0, p
, end
);
13318 assert (attr
->type
& 0x80);
13319 val
= read_uleb128 (p
, &len
, end
);
13321 type
= attr
->type
& 0x7f;
13323 printf ("??? (%d)\n", val
);
13325 printf ("%s\n", attr
->table
[val
]);
13330 return display_tag_value (tag
, p
, end
);
13333 static unsigned char *
13334 display_gnu_attribute (unsigned char * p
,
13335 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, int, const unsigned char * const),
13336 const unsigned char * const end
)
13342 tag
= read_uleb128 (p
, &len
, end
);
13345 /* Tag_compatibility is the only generic GNU attribute defined at
13349 val
= read_uleb128 (p
, &len
, end
);
13352 printf (_("flag = %d, vendor = "), val
);
13355 printf (_("<corrupt>\n"));
13356 warn (_("corrupt vendor attribute\n"));
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
;
13377 if ((tag
& 2) == 0 && display_proc_gnu_attribute
)
13378 return display_proc_gnu_attribute (p
, tag
, end
);
13380 return display_tag_value (tag
, p
, end
);
13383 static unsigned char *
13384 display_power_gnu_attribute (unsigned char * p
,
13386 const unsigned char * const end
)
13391 if (tag
== Tag_GNU_Power_ABI_FP
)
13393 val
= read_uleb128 (p
, &len
, end
);
13395 printf (" Tag_GNU_Power_ABI_FP: ");
13398 printf (_("<corrupt>\n"));
13403 printf ("(%#x), ", val
);
13408 printf (_("unspecified hard/soft float, "));
13411 printf (_("hard float, "));
13414 printf (_("soft float, "));
13417 printf (_("single-precision hard float, "));
13424 printf (_("unspecified long double\n"));
13427 printf (_("128-bit IBM long double\n"));
13430 printf (_("64-bit long double\n"));
13433 printf (_("128-bit IEEE long double\n"));
13439 if (tag
== Tag_GNU_Power_ABI_Vector
)
13441 val
= read_uleb128 (p
, &len
, end
);
13443 printf (" Tag_GNU_Power_ABI_Vector: ");
13446 printf (_("<corrupt>\n"));
13451 printf ("(%#x), ", val
);
13456 printf (_("unspecified\n"));
13459 printf (_("generic\n"));
13462 printf ("AltiVec\n");
13471 if (tag
== Tag_GNU_Power_ABI_Struct_Return
)
13473 val
= read_uleb128 (p
, &len
, end
);
13475 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
13478 printf (_("<corrupt>\n"));
13483 printf ("(%#x), ", val
);
13488 printf (_("unspecified\n"));
13491 printf ("r3/r4\n");
13494 printf (_("memory\n"));
13503 return display_tag_value (tag
& 1, p
, end
);
13506 static unsigned char *
13507 display_s390_gnu_attribute (unsigned char * p
,
13509 const unsigned char * const end
)
13514 if (tag
== Tag_GNU_S390_ABI_Vector
)
13516 val
= read_uleb128 (p
, &len
, end
);
13518 printf (" Tag_GNU_S390_ABI_Vector: ");
13523 printf (_("any\n"));
13526 printf (_("software\n"));
13529 printf (_("hardware\n"));
13532 printf ("??? (%d)\n", val
);
13538 return display_tag_value (tag
& 1, p
, end
);
13542 display_sparc_hwcaps (int mask
)
13548 if (mask
& ELF_SPARC_HWCAP_MUL32
)
13549 fputs ("mul32", stdout
), first
= 0;
13550 if (mask
& ELF_SPARC_HWCAP_DIV32
)
13551 printf ("%sdiv32", first
? "" : "|"), first
= 0;
13552 if (mask
& ELF_SPARC_HWCAP_FSMULD
)
13553 printf ("%sfsmuld", first
? "" : "|"), first
= 0;
13554 if (mask
& ELF_SPARC_HWCAP_V8PLUS
)
13555 printf ("%sv8plus", first
? "" : "|"), first
= 0;
13556 if (mask
& ELF_SPARC_HWCAP_POPC
)
13557 printf ("%spopc", first
? "" : "|"), first
= 0;
13558 if (mask
& ELF_SPARC_HWCAP_VIS
)
13559 printf ("%svis", first
? "" : "|"), first
= 0;
13560 if (mask
& ELF_SPARC_HWCAP_VIS2
)
13561 printf ("%svis2", first
? "" : "|"), first
= 0;
13562 if (mask
& ELF_SPARC_HWCAP_ASI_BLK_INIT
)
13563 printf ("%sASIBlkInit", first
? "" : "|"), first
= 0;
13564 if (mask
& ELF_SPARC_HWCAP_FMAF
)
13565 printf ("%sfmaf", first
? "" : "|"), first
= 0;
13566 if (mask
& ELF_SPARC_HWCAP_VIS3
)
13567 printf ("%svis3", first
? "" : "|"), first
= 0;
13568 if (mask
& ELF_SPARC_HWCAP_HPC
)
13569 printf ("%shpc", first
? "" : "|"), first
= 0;
13570 if (mask
& ELF_SPARC_HWCAP_RANDOM
)
13571 printf ("%srandom", first
? "" : "|"), first
= 0;
13572 if (mask
& ELF_SPARC_HWCAP_TRANS
)
13573 printf ("%strans", first
? "" : "|"), first
= 0;
13574 if (mask
& ELF_SPARC_HWCAP_FJFMAU
)
13575 printf ("%sfjfmau", first
? "" : "|"), first
= 0;
13576 if (mask
& ELF_SPARC_HWCAP_IMA
)
13577 printf ("%sima", first
? "" : "|"), first
= 0;
13578 if (mask
& ELF_SPARC_HWCAP_ASI_CACHE_SPARING
)
13579 printf ("%scspare", first
? "" : "|"), first
= 0;
13582 fputc ('0', stdout
);
13583 fputc ('\n', stdout
);
13587 display_sparc_hwcaps2 (int mask
)
13593 if (mask
& ELF_SPARC_HWCAP2_FJATHPLUS
)
13594 fputs ("fjathplus", stdout
), first
= 0;
13595 if (mask
& ELF_SPARC_HWCAP2_VIS3B
)
13596 printf ("%svis3b", first
? "" : "|"), first
= 0;
13597 if (mask
& ELF_SPARC_HWCAP2_ADP
)
13598 printf ("%sadp", first
? "" : "|"), first
= 0;
13599 if (mask
& ELF_SPARC_HWCAP2_SPARC5
)
13600 printf ("%ssparc5", first
? "" : "|"), first
= 0;
13601 if (mask
& ELF_SPARC_HWCAP2_MWAIT
)
13602 printf ("%smwait", first
? "" : "|"), first
= 0;
13603 if (mask
& ELF_SPARC_HWCAP2_XMPMUL
)
13604 printf ("%sxmpmul", first
? "" : "|"), first
= 0;
13605 if (mask
& ELF_SPARC_HWCAP2_XMONT
)
13606 printf ("%sxmont2", first
? "" : "|"), first
= 0;
13607 if (mask
& ELF_SPARC_HWCAP2_NSEC
)
13608 printf ("%snsec", first
? "" : "|"), first
= 0;
13609 if (mask
& ELF_SPARC_HWCAP2_FJATHHPC
)
13610 printf ("%sfjathhpc", first
? "" : "|"), first
= 0;
13611 if (mask
& ELF_SPARC_HWCAP2_FJDES
)
13612 printf ("%sfjdes", first
? "" : "|"), first
= 0;
13613 if (mask
& ELF_SPARC_HWCAP2_FJAES
)
13614 printf ("%sfjaes", first
? "" : "|"), first
= 0;
13617 fputc ('0', stdout
);
13618 fputc ('\n', stdout
);
13621 static unsigned char *
13622 display_sparc_gnu_attribute (unsigned char * p
,
13624 const unsigned char * const end
)
13629 if (tag
== Tag_GNU_Sparc_HWCAPS
)
13631 val
= read_uleb128 (p
, &len
, end
);
13633 printf (" Tag_GNU_Sparc_HWCAPS: ");
13634 display_sparc_hwcaps (val
);
13637 if (tag
== Tag_GNU_Sparc_HWCAPS2
)
13639 val
= read_uleb128 (p
, &len
, end
);
13641 printf (" Tag_GNU_Sparc_HWCAPS2: ");
13642 display_sparc_hwcaps2 (val
);
13646 return display_tag_value (tag
, p
, end
);
13650 print_mips_fp_abi_value (int val
)
13654 case Val_GNU_MIPS_ABI_FP_ANY
:
13655 printf (_("Hard or soft float\n"));
13657 case Val_GNU_MIPS_ABI_FP_DOUBLE
:
13658 printf (_("Hard float (double precision)\n"));
13660 case Val_GNU_MIPS_ABI_FP_SINGLE
:
13661 printf (_("Hard float (single precision)\n"));
13663 case Val_GNU_MIPS_ABI_FP_SOFT
:
13664 printf (_("Soft float\n"));
13666 case Val_GNU_MIPS_ABI_FP_OLD_64
:
13667 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13669 case Val_GNU_MIPS_ABI_FP_XX
:
13670 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13672 case Val_GNU_MIPS_ABI_FP_64
:
13673 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13675 case Val_GNU_MIPS_ABI_FP_64A
:
13676 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13678 case Val_GNU_MIPS_ABI_FP_NAN2008
:
13679 printf (_("NaN 2008 compatibility\n"));
13682 printf ("??? (%d)\n", val
);
13687 static unsigned char *
13688 display_mips_gnu_attribute (unsigned char * p
,
13690 const unsigned char * const end
)
13692 if (tag
== Tag_GNU_MIPS_ABI_FP
)
13697 val
= read_uleb128 (p
, &len
, end
);
13699 printf (" Tag_GNU_MIPS_ABI_FP: ");
13701 print_mips_fp_abi_value (val
);
13706 if (tag
== Tag_GNU_MIPS_ABI_MSA
)
13711 val
= read_uleb128 (p
, &len
, end
);
13713 printf (" Tag_GNU_MIPS_ABI_MSA: ");
13717 case Val_GNU_MIPS_ABI_MSA_ANY
:
13718 printf (_("Any MSA or not\n"));
13720 case Val_GNU_MIPS_ABI_MSA_128
:
13721 printf (_("128-bit MSA\n"));
13724 printf ("??? (%d)\n", val
);
13730 return display_tag_value (tag
& 1, p
, end
);
13733 static unsigned char *
13734 display_tic6x_attribute (unsigned char * p
,
13735 const unsigned char * const end
)
13741 tag
= read_uleb128 (p
, &len
, end
);
13747 val
= read_uleb128 (p
, &len
, end
);
13749 printf (" Tag_ISA: ");
13753 case C6XABI_Tag_ISA_none
:
13754 printf (_("None\n"));
13756 case C6XABI_Tag_ISA_C62X
:
13759 case C6XABI_Tag_ISA_C67X
:
13762 case C6XABI_Tag_ISA_C67XP
:
13763 printf ("C67x+\n");
13765 case C6XABI_Tag_ISA_C64X
:
13768 case C6XABI_Tag_ISA_C64XP
:
13769 printf ("C64x+\n");
13771 case C6XABI_Tag_ISA_C674X
:
13772 printf ("C674x\n");
13775 printf ("??? (%d)\n", val
);
13780 case Tag_ABI_wchar_t
:
13781 val
= read_uleb128 (p
, &len
, end
);
13783 printf (" Tag_ABI_wchar_t: ");
13787 printf (_("Not used\n"));
13790 printf (_("2 bytes\n"));
13793 printf (_("4 bytes\n"));
13796 printf ("??? (%d)\n", val
);
13801 case Tag_ABI_stack_align_needed
:
13802 val
= read_uleb128 (p
, &len
, end
);
13804 printf (" Tag_ABI_stack_align_needed: ");
13808 printf (_("8-byte\n"));
13811 printf (_("16-byte\n"));
13814 printf ("??? (%d)\n", val
);
13819 case Tag_ABI_stack_align_preserved
:
13820 val
= read_uleb128 (p
, &len
, end
);
13822 printf (" Tag_ABI_stack_align_preserved: ");
13826 printf (_("8-byte\n"));
13829 printf (_("16-byte\n"));
13832 printf ("??? (%d)\n", val
);
13838 val
= read_uleb128 (p
, &len
, end
);
13840 printf (" Tag_ABI_DSBT: ");
13844 printf (_("DSBT addressing not used\n"));
13847 printf (_("DSBT addressing used\n"));
13850 printf ("??? (%d)\n", val
);
13856 val
= read_uleb128 (p
, &len
, end
);
13858 printf (" Tag_ABI_PID: ");
13862 printf (_("Data addressing position-dependent\n"));
13865 printf (_("Data addressing position-independent, GOT near DP\n"));
13868 printf (_("Data addressing position-independent, GOT far from DP\n"));
13871 printf ("??? (%d)\n", val
);
13877 val
= read_uleb128 (p
, &len
, end
);
13879 printf (" Tag_ABI_PIC: ");
13883 printf (_("Code addressing position-dependent\n"));
13886 printf (_("Code addressing position-independent\n"));
13889 printf ("??? (%d)\n", val
);
13894 case Tag_ABI_array_object_alignment
:
13895 val
= read_uleb128 (p
, &len
, end
);
13897 printf (" Tag_ABI_array_object_alignment: ");
13901 printf (_("8-byte\n"));
13904 printf (_("4-byte\n"));
13907 printf (_("16-byte\n"));
13910 printf ("??? (%d)\n", val
);
13915 case Tag_ABI_array_object_align_expected
:
13916 val
= read_uleb128 (p
, &len
, end
);
13918 printf (" Tag_ABI_array_object_align_expected: ");
13922 printf (_("8-byte\n"));
13925 printf (_("4-byte\n"));
13928 printf (_("16-byte\n"));
13931 printf ("??? (%d)\n", val
);
13936 case Tag_ABI_compatibility
:
13938 val
= read_uleb128 (p
, &len
, end
);
13940 printf (" Tag_ABI_compatibility: ");
13941 printf (_("flag = %d, vendor = "), val
);
13944 size_t maxlen
= (end
- p
) - 1;
13946 print_symbol ((int) maxlen
, (const char *) p
);
13947 p
+= strnlen ((char *) p
, maxlen
) + 1;
13951 printf (_("<corrupt>"));
13952 p
= (unsigned char *) end
;
13958 case Tag_ABI_conformance
:
13960 printf (" Tag_ABI_conformance: \"");
13963 size_t maxlen
= (end
- p
) - 1;
13965 print_symbol ((int) maxlen
, (const char *) p
);
13966 p
+= strnlen ((char *) p
, maxlen
) + 1;
13970 printf (_("<corrupt>"));
13971 p
= (unsigned char *) end
;
13978 return display_tag_value (tag
, p
, end
);
13982 display_raw_attribute (unsigned char * p
, unsigned char * end
)
13984 unsigned long addr
= 0;
13985 size_t bytes
= end
- p
;
13992 int lbytes
= (bytes
> 16 ? 16 : bytes
);
13994 printf (" 0x%8.8lx ", addr
);
13996 for (j
= 0; j
< 16; j
++)
13999 printf ("%2.2x", p
[j
]);
14007 for (j
= 0; j
< lbytes
; j
++)
14010 if (k
>= ' ' && k
< 0x7f)
14026 static unsigned char *
14027 display_msp430x_attribute (unsigned char * p
,
14028 const unsigned char * const end
)
14034 tag
= read_uleb128 (p
, & len
, end
);
14039 case OFBA_MSPABI_Tag_ISA
:
14040 val
= read_uleb128 (p
, &len
, end
);
14042 printf (" Tag_ISA: ");
14045 case 0: printf (_("None\n")); break;
14046 case 1: printf (_("MSP430\n")); break;
14047 case 2: printf (_("MSP430X\n")); break;
14048 default: printf ("??? (%d)\n", val
); break;
14052 case OFBA_MSPABI_Tag_Code_Model
:
14053 val
= read_uleb128 (p
, &len
, end
);
14055 printf (" Tag_Code_Model: ");
14058 case 0: printf (_("None\n")); break;
14059 case 1: printf (_("Small\n")); break;
14060 case 2: printf (_("Large\n")); break;
14061 default: printf ("??? (%d)\n", val
); break;
14065 case OFBA_MSPABI_Tag_Data_Model
:
14066 val
= read_uleb128 (p
, &len
, end
);
14068 printf (" Tag_Data_Model: ");
14071 case 0: printf (_("None\n")); break;
14072 case 1: printf (_("Small\n")); break;
14073 case 2: printf (_("Large\n")); break;
14074 case 3: printf (_("Restricted Large\n")); break;
14075 default: printf ("??? (%d)\n", val
); break;
14080 printf (_(" <unknown tag %d>: "), tag
);
14087 size_t maxlen
= (end
- p
) - 1;
14089 print_symbol ((int) maxlen
, (const char *) p
);
14090 p
+= strnlen ((char *) p
, maxlen
) + 1;
14094 printf (_("<corrupt>"));
14095 p
= (unsigned char *) end
;
14101 val
= read_uleb128 (p
, &len
, end
);
14103 printf ("%d (0x%x)\n", val
, val
);
14113 process_attributes (FILE * file
,
14114 const char * public_name
,
14115 unsigned int proc_type
,
14116 unsigned char * (* display_pub_attribute
) (unsigned char *, const unsigned char * const),
14117 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, int, const unsigned char * const))
14119 Elf_Internal_Shdr
* sect
;
14122 /* Find the section header so that we get the size. */
14123 for (i
= 0, sect
= section_headers
;
14124 i
< elf_header
.e_shnum
;
14127 unsigned char * contents
;
14130 if (sect
->sh_type
!= proc_type
&& sect
->sh_type
!= SHT_GNU_ATTRIBUTES
)
14133 contents
= (unsigned char *) get_data (NULL
, file
, sect
->sh_offset
, 1,
14134 sect
->sh_size
, _("attributes"));
14135 if (contents
== NULL
)
14141 bfd_vma section_len
;
14143 section_len
= sect
->sh_size
- 1;
14146 while (section_len
> 0)
14149 unsigned int namelen
;
14150 bfd_boolean public_section
;
14151 bfd_boolean gnu_section
;
14153 if (section_len
<= 4)
14155 error (_("Tag section ends prematurely\n"));
14158 attr_len
= byte_get (p
, 4);
14161 if (attr_len
> section_len
)
14163 error (_("Bad attribute length (%u > %u)\n"),
14164 (unsigned) attr_len
, (unsigned) section_len
);
14165 attr_len
= section_len
;
14167 /* PR 17531: file: 001-101425-0.004 */
14168 else if (attr_len
< 5)
14170 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len
);
14174 section_len
-= attr_len
;
14177 namelen
= strnlen ((char *) p
, attr_len
) + 1;
14178 if (namelen
== 0 || namelen
>= attr_len
)
14180 error (_("Corrupt attribute section name\n"));
14184 printf (_("Attribute Section: "));
14185 print_symbol (INT_MAX
, (const char *) p
);
14188 if (public_name
&& streq ((char *) p
, public_name
))
14189 public_section
= TRUE
;
14191 public_section
= FALSE
;
14193 if (streq ((char *) p
, "gnu"))
14194 gnu_section
= TRUE
;
14196 gnu_section
= FALSE
;
14199 attr_len
-= namelen
;
14201 while (attr_len
> 0 && p
< contents
+ sect
->sh_size
)
14206 unsigned char * end
;
14208 /* PR binutils/17531: Safe handling of corrupt files. */
14211 error (_("Unused bytes at end of section\n"));
14217 size
= byte_get (p
, 4);
14218 if (size
> attr_len
)
14220 error (_("Bad subsection length (%u > %u)\n"),
14221 (unsigned) size
, (unsigned) attr_len
);
14224 /* PR binutils/17531: Safe handling of corrupt files. */
14227 error (_("Bad subsection length (%u < 6)\n"),
14234 end
= p
+ size
- 1;
14235 assert (end
<= contents
+ sect
->sh_size
);
14241 printf (_("File Attributes\n"));
14244 printf (_("Section Attributes:"));
14247 printf (_("Symbol Attributes:"));
14248 /* Fall through. */
14254 val
= read_uleb128 (p
, &j
, end
);
14258 printf (" %d", val
);
14263 printf (_("Unknown tag: %d\n"), tag
);
14264 public_section
= FALSE
;
14268 if (public_section
&& display_pub_attribute
!= NULL
)
14271 p
= display_pub_attribute (p
, end
);
14274 else if (gnu_section
&& display_proc_gnu_attribute
!= NULL
)
14277 p
= display_gnu_attribute (p
,
14278 display_proc_gnu_attribute
,
14284 printf (_(" Unknown attribute:\n"));
14285 display_raw_attribute (p
, end
);
14294 printf (_("Unknown format '%c' (%d)\n"), *p
, *p
);
14302 process_arm_specific (FILE * file
)
14304 return process_attributes (file
, "aeabi", SHT_ARM_ATTRIBUTES
,
14305 display_arm_attribute
, NULL
);
14309 process_power_specific (FILE * file
)
14311 return process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
14312 display_power_gnu_attribute
);
14316 process_s390_specific (FILE * file
)
14318 return process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
14319 display_s390_gnu_attribute
);
14323 process_sparc_specific (FILE * file
)
14325 return process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
14326 display_sparc_gnu_attribute
);
14330 process_tic6x_specific (FILE * file
)
14332 return process_attributes (file
, "c6xabi", SHT_C6000_ATTRIBUTES
,
14333 display_tic6x_attribute
, NULL
);
14337 process_msp430x_specific (FILE * file
)
14339 return process_attributes (file
, "mspabi", SHT_MSP430_ATTRIBUTES
,
14340 display_msp430x_attribute
, NULL
);
14343 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14344 Print the Address, Access and Initial fields of an entry at VMA ADDR
14345 and return the VMA of the next entry, or -1 if there was a problem.
14346 Does not read from DATA_END or beyond. */
14349 print_mips_got_entry (unsigned char * data
, bfd_vma pltgot
, bfd_vma addr
,
14350 unsigned char * data_end
)
14353 print_vma (addr
, LONG_HEX
);
14355 if (addr
< pltgot
+ 0xfff0)
14356 printf ("%6d(gp)", (int) (addr
- pltgot
- 0x7ff0));
14358 printf ("%10s", "");
14361 printf ("%*s", is_32bit_elf
? 8 : 16, _("<unknown>"));
14365 unsigned char * from
= data
+ addr
- pltgot
;
14367 if (from
+ (is_32bit_elf
? 4 : 8) > data_end
)
14369 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14370 printf ("%*s", is_32bit_elf
? 8 : 16, _("<corrupt>"));
14371 return (bfd_vma
) -1;
14375 entry
= byte_get (data
+ addr
- pltgot
, is_32bit_elf
? 4 : 8);
14376 print_vma (entry
, LONG_HEX
);
14379 return addr
+ (is_32bit_elf
? 4 : 8);
14382 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14383 PLTGOT. Print the Address and Initial fields of an entry at VMA
14384 ADDR and return the VMA of the next entry. */
14387 print_mips_pltgot_entry (unsigned char * data
, bfd_vma pltgot
, bfd_vma addr
)
14390 print_vma (addr
, LONG_HEX
);
14393 printf ("%*s", is_32bit_elf
? 8 : 16, _("<unknown>"));
14398 entry
= byte_get (data
+ addr
- pltgot
, is_32bit_elf
? 4 : 8);
14399 print_vma (entry
, LONG_HEX
);
14401 return addr
+ (is_32bit_elf
? 4 : 8);
14405 print_mips_ases (unsigned int mask
)
14407 if (mask
& AFL_ASE_DSP
)
14408 fputs ("\n\tDSP ASE", stdout
);
14409 if (mask
& AFL_ASE_DSPR2
)
14410 fputs ("\n\tDSP R2 ASE", stdout
);
14411 if (mask
& AFL_ASE_DSPR3
)
14412 fputs ("\n\tDSP R3 ASE", stdout
);
14413 if (mask
& AFL_ASE_EVA
)
14414 fputs ("\n\tEnhanced VA Scheme", stdout
);
14415 if (mask
& AFL_ASE_MCU
)
14416 fputs ("\n\tMCU (MicroController) ASE", stdout
);
14417 if (mask
& AFL_ASE_MDMX
)
14418 fputs ("\n\tMDMX ASE", stdout
);
14419 if (mask
& AFL_ASE_MIPS3D
)
14420 fputs ("\n\tMIPS-3D ASE", stdout
);
14421 if (mask
& AFL_ASE_MT
)
14422 fputs ("\n\tMT ASE", stdout
);
14423 if (mask
& AFL_ASE_SMARTMIPS
)
14424 fputs ("\n\tSmartMIPS ASE", stdout
);
14425 if (mask
& AFL_ASE_VIRT
)
14426 fputs ("\n\tVZ ASE", stdout
);
14427 if (mask
& AFL_ASE_MSA
)
14428 fputs ("\n\tMSA ASE", stdout
);
14429 if (mask
& AFL_ASE_MIPS16
)
14430 fputs ("\n\tMIPS16 ASE", stdout
);
14431 if (mask
& AFL_ASE_MICROMIPS
)
14432 fputs ("\n\tMICROMIPS ASE", stdout
);
14433 if (mask
& AFL_ASE_XPA
)
14434 fputs ("\n\tXPA ASE", stdout
);
14436 fprintf (stdout
, "\n\t%s", _("None"));
14437 else if ((mask
& ~AFL_ASE_MASK
) != 0)
14438 fprintf (stdout
, "\n\t%s (%x)", _("Unknown"), mask
& ~AFL_ASE_MASK
);
14442 print_mips_isa_ext (unsigned int isa_ext
)
14447 fputs (_("None"), stdout
);
14450 fputs ("RMI XLR", stdout
);
14452 case AFL_EXT_OCTEON3
:
14453 fputs ("Cavium Networks Octeon3", stdout
);
14455 case AFL_EXT_OCTEON2
:
14456 fputs ("Cavium Networks Octeon2", stdout
);
14458 case AFL_EXT_OCTEONP
:
14459 fputs ("Cavium Networks OcteonP", stdout
);
14461 case AFL_EXT_LOONGSON_3A
:
14462 fputs ("Loongson 3A", stdout
);
14464 case AFL_EXT_OCTEON
:
14465 fputs ("Cavium Networks Octeon", stdout
);
14468 fputs ("Toshiba R5900", stdout
);
14471 fputs ("MIPS R4650", stdout
);
14474 fputs ("LSI R4010", stdout
);
14477 fputs ("NEC VR4100", stdout
);
14480 fputs ("Toshiba R3900", stdout
);
14482 case AFL_EXT_10000
:
14483 fputs ("MIPS R10000", stdout
);
14486 fputs ("Broadcom SB-1", stdout
);
14489 fputs ("NEC VR4111/VR4181", stdout
);
14492 fputs ("NEC VR4120", stdout
);
14495 fputs ("NEC VR5400", stdout
);
14498 fputs ("NEC VR5500", stdout
);
14500 case AFL_EXT_LOONGSON_2E
:
14501 fputs ("ST Microelectronics Loongson 2E", stdout
);
14503 case AFL_EXT_LOONGSON_2F
:
14504 fputs ("ST Microelectronics Loongson 2F", stdout
);
14507 fprintf (stdout
, "%s (%d)", _("Unknown"), isa_ext
);
14512 get_mips_reg_size (int reg_size
)
14514 return (reg_size
== AFL_REG_NONE
) ? 0
14515 : (reg_size
== AFL_REG_32
) ? 32
14516 : (reg_size
== AFL_REG_64
) ? 64
14517 : (reg_size
== AFL_REG_128
) ? 128
14522 process_mips_specific (FILE * file
)
14524 Elf_Internal_Dyn
* entry
;
14525 Elf_Internal_Shdr
*sect
= NULL
;
14526 size_t liblist_offset
= 0;
14527 size_t liblistno
= 0;
14528 size_t conflictsno
= 0;
14529 size_t options_offset
= 0;
14530 size_t conflicts_offset
= 0;
14531 size_t pltrelsz
= 0;
14533 bfd_vma pltgot
= 0;
14534 bfd_vma mips_pltgot
= 0;
14535 bfd_vma jmprel
= 0;
14536 bfd_vma local_gotno
= 0;
14537 bfd_vma gotsym
= 0;
14538 bfd_vma symtabno
= 0;
14540 process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
14541 display_mips_gnu_attribute
);
14543 sect
= find_section (".MIPS.abiflags");
14547 Elf_External_ABIFlags_v0
*abiflags_ext
;
14548 Elf_Internal_ABIFlags_v0 abiflags_in
;
14550 if (sizeof (Elf_External_ABIFlags_v0
) != sect
->sh_size
)
14551 fputs ("\nCorrupt ABI Flags section.\n", stdout
);
14554 abiflags_ext
= get_data (NULL
, file
, sect
->sh_offset
, 1,
14555 sect
->sh_size
, _("MIPS ABI Flags section"));
14558 abiflags_in
.version
= BYTE_GET (abiflags_ext
->version
);
14559 abiflags_in
.isa_level
= BYTE_GET (abiflags_ext
->isa_level
);
14560 abiflags_in
.isa_rev
= BYTE_GET (abiflags_ext
->isa_rev
);
14561 abiflags_in
.gpr_size
= BYTE_GET (abiflags_ext
->gpr_size
);
14562 abiflags_in
.cpr1_size
= BYTE_GET (abiflags_ext
->cpr1_size
);
14563 abiflags_in
.cpr2_size
= BYTE_GET (abiflags_ext
->cpr2_size
);
14564 abiflags_in
.fp_abi
= BYTE_GET (abiflags_ext
->fp_abi
);
14565 abiflags_in
.isa_ext
= BYTE_GET (abiflags_ext
->isa_ext
);
14566 abiflags_in
.ases
= BYTE_GET (abiflags_ext
->ases
);
14567 abiflags_in
.flags1
= BYTE_GET (abiflags_ext
->flags1
);
14568 abiflags_in
.flags2
= BYTE_GET (abiflags_ext
->flags2
);
14570 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in
.version
);
14571 printf ("\nISA: MIPS%d", abiflags_in
.isa_level
);
14572 if (abiflags_in
.isa_rev
> 1)
14573 printf ("r%d", abiflags_in
.isa_rev
);
14574 printf ("\nGPR size: %d",
14575 get_mips_reg_size (abiflags_in
.gpr_size
));
14576 printf ("\nCPR1 size: %d",
14577 get_mips_reg_size (abiflags_in
.cpr1_size
));
14578 printf ("\nCPR2 size: %d",
14579 get_mips_reg_size (abiflags_in
.cpr2_size
));
14580 fputs ("\nFP ABI: ", stdout
);
14581 print_mips_fp_abi_value (abiflags_in
.fp_abi
);
14582 fputs ("ISA Extension: ", stdout
);
14583 print_mips_isa_ext (abiflags_in
.isa_ext
);
14584 fputs ("\nASEs:", stdout
);
14585 print_mips_ases (abiflags_in
.ases
);
14586 printf ("\nFLAGS 1: %8.8lx", abiflags_in
.flags1
);
14587 printf ("\nFLAGS 2: %8.8lx", abiflags_in
.flags2
);
14588 fputc ('\n', stdout
);
14589 free (abiflags_ext
);
14594 /* We have a lot of special sections. Thanks SGI! */
14595 if (dynamic_section
== NULL
)
14596 /* No information available. */
14599 for (entry
= dynamic_section
;
14600 /* PR 17531 file: 012-50589-0.004. */
14601 entry
< dynamic_section
+ dynamic_nent
&& entry
->d_tag
!= DT_NULL
;
14603 switch (entry
->d_tag
)
14605 case DT_MIPS_LIBLIST
:
14607 = offset_from_vma (file
, entry
->d_un
.d_val
,
14608 liblistno
* sizeof (Elf32_External_Lib
));
14610 case DT_MIPS_LIBLISTNO
:
14611 liblistno
= entry
->d_un
.d_val
;
14613 case DT_MIPS_OPTIONS
:
14614 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
14616 case DT_MIPS_CONFLICT
:
14618 = offset_from_vma (file
, entry
->d_un
.d_val
,
14619 conflictsno
* sizeof (Elf32_External_Conflict
));
14621 case DT_MIPS_CONFLICTNO
:
14622 conflictsno
= entry
->d_un
.d_val
;
14625 pltgot
= entry
->d_un
.d_ptr
;
14627 case DT_MIPS_LOCAL_GOTNO
:
14628 local_gotno
= entry
->d_un
.d_val
;
14630 case DT_MIPS_GOTSYM
:
14631 gotsym
= entry
->d_un
.d_val
;
14633 case DT_MIPS_SYMTABNO
:
14634 symtabno
= entry
->d_un
.d_val
;
14636 case DT_MIPS_PLTGOT
:
14637 mips_pltgot
= entry
->d_un
.d_ptr
;
14640 pltrel
= entry
->d_un
.d_val
;
14643 pltrelsz
= entry
->d_un
.d_val
;
14646 jmprel
= entry
->d_un
.d_ptr
;
14652 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
14654 Elf32_External_Lib
* elib
;
14657 elib
= (Elf32_External_Lib
*) get_data (NULL
, file
, liblist_offset
,
14659 sizeof (Elf32_External_Lib
),
14660 _("liblist section data"));
14663 printf (_("\nSection '.liblist' contains %lu entries:\n"),
14664 (unsigned long) liblistno
);
14665 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
14668 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
14675 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
14676 atime
= BYTE_GET (elib
[cnt
].l_time_stamp
);
14677 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
14678 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
14679 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
14681 tmp
= gmtime (&atime
);
14682 snprintf (timebuf
, sizeof (timebuf
),
14683 "%04u-%02u-%02uT%02u:%02u:%02u",
14684 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
14685 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
14687 printf ("%3lu: ", (unsigned long) cnt
);
14688 if (VALID_DYNAMIC_NAME (liblist
.l_name
))
14689 print_symbol (20, GET_DYNAMIC_NAME (liblist
.l_name
));
14691 printf (_("<corrupt: %9ld>"), liblist
.l_name
);
14692 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
14693 liblist
.l_version
);
14695 if (liblist
.l_flags
== 0)
14699 static const struct
14706 { " EXACT_MATCH", LL_EXACT_MATCH
},
14707 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
14708 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
14709 { " EXPORTS", LL_EXPORTS
},
14710 { " DELAY_LOAD", LL_DELAY_LOAD
},
14711 { " DELTA", LL_DELTA
}
14713 int flags
= liblist
.l_flags
;
14716 for (fcnt
= 0; fcnt
< ARRAY_SIZE (l_flags_vals
); ++fcnt
)
14717 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
14719 fputs (l_flags_vals
[fcnt
].name
, stdout
);
14720 flags
^= l_flags_vals
[fcnt
].bit
;
14723 printf (" %#x", (unsigned int) flags
);
14733 if (options_offset
!= 0)
14735 Elf_External_Options
* eopt
;
14736 Elf_Internal_Options
* iopt
;
14737 Elf_Internal_Options
* option
;
14740 sect
= section_headers
;
14742 /* Find the section header so that we get the size. */
14743 sect
= find_section_by_type (SHT_MIPS_OPTIONS
);
14744 /* PR 17533 file: 012-277276-0.004. */
14747 error (_("No MIPS_OPTIONS header found\n"));
14751 eopt
= (Elf_External_Options
*) get_data (NULL
, file
, options_offset
, 1,
14752 sect
->sh_size
, _("options"));
14755 iopt
= (Elf_Internal_Options
*)
14756 cmalloc ((sect
->sh_size
/ sizeof (eopt
)), sizeof (* iopt
));
14759 error (_("Out of memory allocating space for MIPS options\n"));
14766 while (offset
<= sect
->sh_size
- sizeof (* eopt
))
14768 Elf_External_Options
* eoption
;
14770 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
14772 option
->kind
= BYTE_GET (eoption
->kind
);
14773 option
->size
= BYTE_GET (eoption
->size
);
14774 option
->section
= BYTE_GET (eoption
->section
);
14775 option
->info
= BYTE_GET (eoption
->info
);
14777 /* PR 17531: file: ffa0fa3b. */
14778 if (option
->size
< sizeof (* eopt
)
14779 || offset
+ option
->size
> sect
->sh_size
)
14781 error (_("Invalid size (%u) for MIPS option\n"), option
->size
);
14784 offset
+= option
->size
;
14790 printf (_("\nSection '%s' contains %d entries:\n"),
14791 printable_section_name (sect
), cnt
);
14800 switch (option
->kind
)
14803 /* This shouldn't happen. */
14804 printf (" NULL %d %lx", option
->section
, option
->info
);
14807 printf (" REGINFO ");
14808 if (elf_header
.e_machine
== EM_MIPS
)
14811 Elf32_External_RegInfo
* ereg
;
14812 Elf32_RegInfo reginfo
;
14814 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
14815 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
14816 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
14817 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
14818 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
14819 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
14820 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
14822 printf ("GPR %08lx GP 0x%lx\n",
14823 reginfo
.ri_gprmask
,
14824 (unsigned long) reginfo
.ri_gp_value
);
14825 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14826 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
14827 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
14832 Elf64_External_RegInfo
* ereg
;
14833 Elf64_Internal_RegInfo reginfo
;
14835 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
14836 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
14837 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
14838 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
14839 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
14840 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
14841 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
14843 printf ("GPR %08lx GP 0x",
14844 reginfo
.ri_gprmask
);
14845 printf_vma (reginfo
.ri_gp_value
);
14848 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14849 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
14850 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
14854 case ODK_EXCEPTIONS
:
14855 fputs (" EXCEPTIONS fpe_min(", stdout
);
14856 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
14857 fputs (") fpe_max(", stdout
);
14858 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
14859 fputs (")", stdout
);
14861 if (option
->info
& OEX_PAGE0
)
14862 fputs (" PAGE0", stdout
);
14863 if (option
->info
& OEX_SMM
)
14864 fputs (" SMM", stdout
);
14865 if (option
->info
& OEX_FPDBUG
)
14866 fputs (" FPDBUG", stdout
);
14867 if (option
->info
& OEX_DISMISS
)
14868 fputs (" DISMISS", stdout
);
14871 fputs (" PAD ", stdout
);
14872 if (option
->info
& OPAD_PREFIX
)
14873 fputs (" PREFIX", stdout
);
14874 if (option
->info
& OPAD_POSTFIX
)
14875 fputs (" POSTFIX", stdout
);
14876 if (option
->info
& OPAD_SYMBOL
)
14877 fputs (" SYMBOL", stdout
);
14880 fputs (" HWPATCH ", stdout
);
14881 if (option
->info
& OHW_R4KEOP
)
14882 fputs (" R4KEOP", stdout
);
14883 if (option
->info
& OHW_R8KPFETCH
)
14884 fputs (" R8KPFETCH", stdout
);
14885 if (option
->info
& OHW_R5KEOP
)
14886 fputs (" R5KEOP", stdout
);
14887 if (option
->info
& OHW_R5KCVTL
)
14888 fputs (" R5KCVTL", stdout
);
14891 fputs (" FILL ", stdout
);
14892 /* XXX Print content of info word? */
14895 fputs (" TAGS ", stdout
);
14896 /* XXX Print content of info word? */
14899 fputs (" HWAND ", stdout
);
14900 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
14901 fputs (" R4KEOP_CHECKED", stdout
);
14902 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
14903 fputs (" R4KEOP_CLEAN", stdout
);
14906 fputs (" HWOR ", stdout
);
14907 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
14908 fputs (" R4KEOP_CHECKED", stdout
);
14909 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
14910 fputs (" R4KEOP_CLEAN", stdout
);
14913 printf (" GP_GROUP %#06lx self-contained %#06lx",
14914 option
->info
& OGP_GROUP
,
14915 (option
->info
& OGP_SELF
) >> 16);
14918 printf (" IDENT %#06lx self-contained %#06lx",
14919 option
->info
& OGP_GROUP
,
14920 (option
->info
& OGP_SELF
) >> 16);
14923 /* This shouldn't happen. */
14924 printf (" %3d ??? %d %lx",
14925 option
->kind
, option
->section
, option
->info
);
14929 len
= sizeof (* eopt
);
14930 while (len
< option
->size
)
14932 unsigned char datum
= * ((unsigned char *) eopt
+ offset
+ len
);
14934 if (ISPRINT (datum
))
14935 printf ("%c", datum
);
14937 printf ("\\%03o", datum
);
14940 fputs ("\n", stdout
);
14942 offset
+= option
->size
;
14950 if (conflicts_offset
!= 0 && conflictsno
!= 0)
14952 Elf32_Conflict
* iconf
;
14955 if (dynamic_symbols
== NULL
)
14957 error (_("conflict list found without a dynamic symbol table\n"));
14961 iconf
= (Elf32_Conflict
*) cmalloc (conflictsno
, sizeof (* iconf
));
14964 error (_("Out of memory allocating space for dynamic conflicts\n"));
14970 Elf32_External_Conflict
* econf32
;
14972 econf32
= (Elf32_External_Conflict
*)
14973 get_data (NULL
, file
, conflicts_offset
, conflictsno
,
14974 sizeof (* econf32
), _("conflict"));
14978 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
14979 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
14985 Elf64_External_Conflict
* econf64
;
14987 econf64
= (Elf64_External_Conflict
*)
14988 get_data (NULL
, file
, conflicts_offset
, conflictsno
,
14989 sizeof (* econf64
), _("conflict"));
14993 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
14994 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
14999 printf (_("\nSection '.conflict' contains %lu entries:\n"),
15000 (unsigned long) conflictsno
);
15001 puts (_(" Num: Index Value Name"));
15003 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
15005 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
15007 if (iconf
[cnt
] >= num_dynamic_syms
)
15008 printf (_("<corrupt symbol index>"));
15011 Elf_Internal_Sym
* psym
;
15013 psym
= & dynamic_symbols
[iconf
[cnt
]];
15014 print_vma (psym
->st_value
, FULL_HEX
);
15016 if (VALID_DYNAMIC_NAME (psym
->st_name
))
15017 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
15019 printf (_("<corrupt: %14ld>"), psym
->st_name
);
15027 if (pltgot
!= 0 && local_gotno
!= 0)
15029 bfd_vma ent
, local_end
, global_end
;
15031 unsigned char * data
;
15032 unsigned char * data_end
;
15036 addr_size
= (is_32bit_elf
? 4 : 8);
15037 local_end
= pltgot
+ local_gotno
* addr_size
;
15039 /* PR binutils/17533 file: 012-111227-0.004 */
15040 if (symtabno
< gotsym
)
15042 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
15043 (unsigned long) gotsym
, (unsigned long) symtabno
);
15047 global_end
= local_end
+ (symtabno
- gotsym
) * addr_size
;
15048 /* PR 17531: file: 54c91a34. */
15049 if (global_end
< local_end
)
15051 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno
);
15055 offset
= offset_from_vma (file
, pltgot
, global_end
- pltgot
);
15056 data
= (unsigned char *) get_data (NULL
, file
, offset
,
15057 global_end
- pltgot
, 1,
15058 _("Global Offset Table data"));
15061 data_end
= data
+ (global_end
- pltgot
);
15063 printf (_("\nPrimary GOT:\n"));
15064 printf (_(" Canonical gp value: "));
15065 print_vma (pltgot
+ 0x7ff0, LONG_HEX
);
15068 printf (_(" Reserved entries:\n"));
15069 printf (_(" %*s %10s %*s Purpose\n"),
15070 addr_size
* 2, _("Address"), _("Access"),
15071 addr_size
* 2, _("Initial"));
15072 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
15073 printf (_(" Lazy resolver\n"));
15074 if (ent
== (bfd_vma
) -1)
15075 goto got_print_fail
;
15077 && (byte_get (data
+ ent
- pltgot
, addr_size
)
15078 >> (addr_size
* 8 - 1)) != 0)
15080 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
15081 printf (_(" Module pointer (GNU extension)\n"));
15082 if (ent
== (bfd_vma
) -1)
15083 goto got_print_fail
;
15087 if (ent
< local_end
)
15089 printf (_(" Local entries:\n"));
15090 printf (" %*s %10s %*s\n",
15091 addr_size
* 2, _("Address"), _("Access"),
15092 addr_size
* 2, _("Initial"));
15093 while (ent
< local_end
)
15095 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
15097 if (ent
== (bfd_vma
) -1)
15098 goto got_print_fail
;
15103 if (gotsym
< symtabno
)
15107 printf (_(" Global entries:\n"));
15108 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
15109 addr_size
* 2, _("Address"),
15111 addr_size
* 2, _("Initial"),
15112 addr_size
* 2, _("Sym.Val."),
15114 /* Note for translators: "Ndx" = abbreviated form of "Index". */
15115 _("Ndx"), _("Name"));
15117 sym_width
= (is_32bit_elf
? 80 : 160) - 28 - addr_size
* 6 - 1;
15119 for (i
= gotsym
; i
< symtabno
; i
++)
15121 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
15124 if (dynamic_symbols
== NULL
)
15125 printf (_("<no dynamic symbols>"));
15126 else if (i
< num_dynamic_syms
)
15128 Elf_Internal_Sym
* psym
= dynamic_symbols
+ i
;
15130 print_vma (psym
->st_value
, LONG_HEX
);
15131 printf (" %-7s %3s ",
15132 get_symbol_type (ELF_ST_TYPE (psym
->st_info
)),
15133 get_symbol_index_type (psym
->st_shndx
));
15135 if (VALID_DYNAMIC_NAME (psym
->st_name
))
15136 print_symbol (sym_width
, GET_DYNAMIC_NAME (psym
->st_name
));
15138 printf (_("<corrupt: %14ld>"), psym
->st_name
);
15141 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
15142 (unsigned long) i
);
15145 if (ent
== (bfd_vma
) -1)
15156 if (mips_pltgot
!= 0 && jmprel
!= 0 && pltrel
!= 0 && pltrelsz
!= 0)
15159 size_t offset
, rel_offset
;
15160 unsigned long count
, i
;
15161 unsigned char * data
;
15162 int addr_size
, sym_width
;
15163 Elf_Internal_Rela
* rels
;
15165 rel_offset
= offset_from_vma (file
, jmprel
, pltrelsz
);
15166 if (pltrel
== DT_RELA
)
15168 if (!slurp_rela_relocs (file
, rel_offset
, pltrelsz
, &rels
, &count
))
15173 if (!slurp_rel_relocs (file
, rel_offset
, pltrelsz
, &rels
, &count
))
15178 addr_size
= (is_32bit_elf
? 4 : 8);
15179 end
= mips_pltgot
+ (2 + count
) * addr_size
;
15181 offset
= offset_from_vma (file
, mips_pltgot
, end
- mips_pltgot
);
15182 data
= (unsigned char *) get_data (NULL
, file
, offset
, end
- mips_pltgot
,
15183 1, _("Procedure Linkage Table data"));
15187 printf ("\nPLT GOT:\n\n");
15188 printf (_(" Reserved entries:\n"));
15189 printf (_(" %*s %*s Purpose\n"),
15190 addr_size
* 2, _("Address"), addr_size
* 2, _("Initial"));
15191 ent
= print_mips_pltgot_entry (data
, mips_pltgot
, ent
);
15192 printf (_(" PLT lazy resolver\n"));
15193 ent
= print_mips_pltgot_entry (data
, mips_pltgot
, ent
);
15194 printf (_(" Module pointer\n"));
15197 printf (_(" Entries:\n"));
15198 printf (" %*s %*s %*s %-7s %3s %s\n",
15199 addr_size
* 2, _("Address"),
15200 addr_size
* 2, _("Initial"),
15201 addr_size
* 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
15202 sym_width
= (is_32bit_elf
? 80 : 160) - 17 - addr_size
* 6 - 1;
15203 for (i
= 0; i
< count
; i
++)
15205 unsigned long idx
= get_reloc_symindex (rels
[i
].r_info
);
15207 ent
= print_mips_pltgot_entry (data
, mips_pltgot
, ent
);
15210 if (idx
>= num_dynamic_syms
)
15211 printf (_("<corrupt symbol index: %lu>"), idx
);
15214 Elf_Internal_Sym
* psym
= dynamic_symbols
+ idx
;
15216 print_vma (psym
->st_value
, LONG_HEX
);
15217 printf (" %-7s %3s ",
15218 get_symbol_type (ELF_ST_TYPE (psym
->st_info
)),
15219 get_symbol_index_type (psym
->st_shndx
));
15220 if (VALID_DYNAMIC_NAME (psym
->st_name
))
15221 print_symbol (sym_width
, GET_DYNAMIC_NAME (psym
->st_name
));
15223 printf (_("<corrupt: %14ld>"), psym
->st_name
);
15238 process_nds32_specific (FILE * file
)
15240 Elf_Internal_Shdr
*sect
= NULL
;
15242 sect
= find_section (".nds32_e_flags");
15245 unsigned int *flag
;
15247 printf ("\nNDS32 elf flags section:\n");
15248 flag
= get_data (NULL
, file
, sect
->sh_offset
, 1,
15249 sect
->sh_size
, _("NDS32 elf flags section"));
15251 switch ((*flag
) & 0x3)
15254 printf ("(VEC_SIZE):\tNo entry.\n");
15257 printf ("(VEC_SIZE):\t4 bytes\n");
15260 printf ("(VEC_SIZE):\t16 bytes\n");
15263 printf ("(VEC_SIZE):\treserved\n");
15272 process_gnu_liblist (FILE * file
)
15274 Elf_Internal_Shdr
* section
;
15275 Elf_Internal_Shdr
* string_sec
;
15276 Elf32_External_Lib
* elib
;
15278 size_t strtab_size
;
15285 for (i
= 0, section
= section_headers
;
15286 i
< elf_header
.e_shnum
;
15289 switch (section
->sh_type
)
15291 case SHT_GNU_LIBLIST
:
15292 if (section
->sh_link
>= elf_header
.e_shnum
)
15295 elib
= (Elf32_External_Lib
*)
15296 get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
15297 _("liblist section data"));
15301 string_sec
= section_headers
+ section
->sh_link
;
15303 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
, 1,
15304 string_sec
->sh_size
,
15305 _("liblist string table"));
15307 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
15313 strtab_size
= string_sec
->sh_size
;
15315 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
15316 printable_section_name (section
),
15317 (unsigned long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
15319 puts (_(" Library Time Stamp Checksum Version Flags"));
15321 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
15329 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
15330 atime
= BYTE_GET (elib
[cnt
].l_time_stamp
);
15331 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
15332 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
15333 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
15335 tmp
= gmtime (&atime
);
15336 snprintf (timebuf
, sizeof (timebuf
),
15337 "%04u-%02u-%02uT%02u:%02u:%02u",
15338 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
15339 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
15341 printf ("%3lu: ", (unsigned long) cnt
);
15343 printf ("%-20s", liblist
.l_name
< strtab_size
15344 ? strtab
+ liblist
.l_name
: _("<corrupt>"));
15346 printf ("%-20.20s", liblist
.l_name
< strtab_size
15347 ? strtab
+ liblist
.l_name
: _("<corrupt>"));
15348 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
15349 liblist
.l_version
, liblist
.l_flags
);
15360 static const char *
15361 get_note_type (unsigned e_type
)
15363 static char buff
[64];
15365 if (elf_header
.e_type
== ET_CORE
)
15369 return _("NT_AUXV (auxiliary vector)");
15371 return _("NT_PRSTATUS (prstatus structure)");
15373 return _("NT_FPREGSET (floating point registers)");
15375 return _("NT_PRPSINFO (prpsinfo structure)");
15376 case NT_TASKSTRUCT
:
15377 return _("NT_TASKSTRUCT (task structure)");
15379 return _("NT_PRXFPREG (user_xfpregs structure)");
15381 return _("NT_PPC_VMX (ppc Altivec registers)");
15383 return _("NT_PPC_VSX (ppc VSX registers)");
15385 return _("NT_386_TLS (x86 TLS information)");
15386 case NT_386_IOPERM
:
15387 return _("NT_386_IOPERM (x86 I/O permissions)");
15388 case NT_X86_XSTATE
:
15389 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
15390 case NT_S390_HIGH_GPRS
:
15391 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
15392 case NT_S390_TIMER
:
15393 return _("NT_S390_TIMER (s390 timer register)");
15394 case NT_S390_TODCMP
:
15395 return _("NT_S390_TODCMP (s390 TOD comparator register)");
15396 case NT_S390_TODPREG
:
15397 return _("NT_S390_TODPREG (s390 TOD programmable register)");
15399 return _("NT_S390_CTRS (s390 control registers)");
15400 case NT_S390_PREFIX
:
15401 return _("NT_S390_PREFIX (s390 prefix register)");
15402 case NT_S390_LAST_BREAK
:
15403 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15404 case NT_S390_SYSTEM_CALL
:
15405 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
15407 return _("NT_S390_TDB (s390 transaction diagnostic block)");
15408 case NT_S390_VXRS_LOW
:
15409 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15410 case NT_S390_VXRS_HIGH
:
15411 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
15413 return _("NT_ARM_VFP (arm VFP registers)");
15415 return _("NT_ARM_TLS (AArch TLS registers)");
15416 case NT_ARM_HW_BREAK
:
15417 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15418 case NT_ARM_HW_WATCH
:
15419 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
15421 return _("NT_PSTATUS (pstatus structure)");
15423 return _("NT_FPREGS (floating point registers)");
15425 return _("NT_PSINFO (psinfo structure)");
15427 return _("NT_LWPSTATUS (lwpstatus_t structure)");
15429 return _("NT_LWPSINFO (lwpsinfo_t structure)");
15430 case NT_WIN32PSTATUS
:
15431 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
15433 return _("NT_SIGINFO (siginfo_t data)");
15435 return _("NT_FILE (mapped files)");
15443 return _("NT_VERSION (version)");
15445 return _("NT_ARCH (architecture)");
15450 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
15455 print_core_note (Elf_Internal_Note
*pnote
)
15457 unsigned int addr_size
= is_32bit_elf
? 4 : 8;
15458 bfd_vma count
, page_size
;
15459 unsigned char *descdata
, *filenames
, *descend
;
15461 if (pnote
->type
!= NT_FILE
)
15467 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
15468 /* Still "successful". */
15473 if (pnote
->descsz
< 2 * addr_size
)
15475 printf (_(" Malformed note - too short for header\n"));
15479 descdata
= (unsigned char *) pnote
->descdata
;
15480 descend
= descdata
+ pnote
->descsz
;
15482 if (descdata
[pnote
->descsz
- 1] != '\0')
15484 printf (_(" Malformed note - does not end with \\0\n"));
15488 count
= byte_get (descdata
, addr_size
);
15489 descdata
+= addr_size
;
15491 page_size
= byte_get (descdata
, addr_size
);
15492 descdata
+= addr_size
;
15494 if (pnote
->descsz
< 2 * addr_size
+ count
* 3 * addr_size
)
15496 printf (_(" Malformed note - too short for supplied file count\n"));
15500 printf (_(" Page size: "));
15501 print_vma (page_size
, DEC
);
15504 printf (_(" %*s%*s%*s\n"),
15505 (int) (2 + 2 * addr_size
), _("Start"),
15506 (int) (4 + 2 * addr_size
), _("End"),
15507 (int) (4 + 2 * addr_size
), _("Page Offset"));
15508 filenames
= descdata
+ count
* 3 * addr_size
;
15509 while (count
-- > 0)
15511 bfd_vma start
, end
, file_ofs
;
15513 if (filenames
== descend
)
15515 printf (_(" Malformed note - filenames end too early\n"));
15519 start
= byte_get (descdata
, addr_size
);
15520 descdata
+= addr_size
;
15521 end
= byte_get (descdata
, addr_size
);
15522 descdata
+= addr_size
;
15523 file_ofs
= byte_get (descdata
, addr_size
);
15524 descdata
+= addr_size
;
15527 print_vma (start
, FULL_HEX
);
15529 print_vma (end
, FULL_HEX
);
15531 print_vma (file_ofs
, FULL_HEX
);
15532 printf ("\n %s\n", filenames
);
15534 filenames
+= 1 + strlen ((char *) filenames
);
15540 static const char *
15541 get_gnu_elf_note_type (unsigned e_type
)
15543 static char buff
[64];
15547 case NT_GNU_ABI_TAG
:
15548 return _("NT_GNU_ABI_TAG (ABI version tag)");
15550 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15551 case NT_GNU_BUILD_ID
:
15552 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
15553 case NT_GNU_GOLD_VERSION
:
15554 return _("NT_GNU_GOLD_VERSION (gold version)");
15559 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
15564 print_gnu_note (Elf_Internal_Note
*pnote
)
15566 switch (pnote
->type
)
15568 case NT_GNU_BUILD_ID
:
15572 printf (_(" Build ID: "));
15573 for (i
= 0; i
< pnote
->descsz
; ++i
)
15574 printf ("%02x", pnote
->descdata
[i
] & 0xff);
15579 case NT_GNU_ABI_TAG
:
15581 unsigned long os
, major
, minor
, subminor
;
15582 const char *osname
;
15584 /* PR 17531: file: 030-599401-0.004. */
15585 if (pnote
->descsz
< 16)
15587 printf (_(" <corrupt GNU_ABI_TAG>\n"));
15591 os
= byte_get ((unsigned char *) pnote
->descdata
, 4);
15592 major
= byte_get ((unsigned char *) pnote
->descdata
+ 4, 4);
15593 minor
= byte_get ((unsigned char *) pnote
->descdata
+ 8, 4);
15594 subminor
= byte_get ((unsigned char *) pnote
->descdata
+ 12, 4);
15598 case GNU_ABI_TAG_LINUX
:
15601 case GNU_ABI_TAG_HURD
:
15604 case GNU_ABI_TAG_SOLARIS
:
15605 osname
= "Solaris";
15607 case GNU_ABI_TAG_FREEBSD
:
15608 osname
= "FreeBSD";
15610 case GNU_ABI_TAG_NETBSD
:
15613 case GNU_ABI_TAG_SYLLABLE
:
15614 osname
= "Syllable";
15616 case GNU_ABI_TAG_NACL
:
15620 osname
= "Unknown";
15624 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname
,
15625 major
, minor
, subminor
);
15629 case NT_GNU_GOLD_VERSION
:
15633 printf (_(" Version: "));
15634 for (i
= 0; i
< pnote
->descsz
&& pnote
->descdata
[i
] != '\0'; ++i
)
15635 printf ("%c", pnote
->descdata
[i
]);
15644 static const char *
15645 get_v850_elf_note_type (enum v850_notes n_type
)
15647 static char buff
[64];
15651 case V850_NOTE_ALIGNMENT
: return _("Alignment of 8-byte objects");
15652 case V850_NOTE_DATA_SIZE
: return _("Sizeof double and long double");
15653 case V850_NOTE_FPU_INFO
: return _("Type of FPU support needed");
15654 case V850_NOTE_SIMD_INFO
: return _("Use of SIMD instructions");
15655 case V850_NOTE_CACHE_INFO
: return _("Use of cache");
15656 case V850_NOTE_MMU_INFO
: return _("Use of MMU");
15658 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), n_type
);
15664 print_v850_note (Elf_Internal_Note
* pnote
)
15668 if (pnote
->descsz
!= 4)
15670 val
= byte_get ((unsigned char *) pnote
->descdata
, pnote
->descsz
);
15674 printf (_("not set\n"));
15678 switch (pnote
->type
)
15680 case V850_NOTE_ALIGNMENT
:
15683 case EF_RH850_DATA_ALIGN4
: printf (_("4-byte\n")); return 1;
15684 case EF_RH850_DATA_ALIGN8
: printf (_("8-byte\n")); return 1;
15688 case V850_NOTE_DATA_SIZE
:
15691 case EF_RH850_DOUBLE32
: printf (_("4-bytes\n")); return 1;
15692 case EF_RH850_DOUBLE64
: printf (_("8-bytes\n")); return 1;
15696 case V850_NOTE_FPU_INFO
:
15699 case EF_RH850_FPU20
: printf (_("FPU-2.0\n")); return 1;
15700 case EF_RH850_FPU30
: printf (_("FPU-3.0\n")); return 1;
15704 case V850_NOTE_MMU_INFO
:
15705 case V850_NOTE_CACHE_INFO
:
15706 case V850_NOTE_SIMD_INFO
:
15707 if (val
== EF_RH850_SIMD
)
15709 printf (_("yes\n"));
15715 /* An 'unknown note type' message will already have been displayed. */
15719 printf (_("unknown value: %x\n"), val
);
15724 process_netbsd_elf_note (Elf_Internal_Note
* pnote
)
15726 unsigned int version
;
15728 switch (pnote
->type
)
15730 case NT_NETBSD_IDENT
:
15731 version
= byte_get ((unsigned char *) pnote
->descdata
, sizeof (version
));
15732 if ((version
/ 10000) % 100)
15733 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote
->descsz
,
15734 version
, version
/ 100000000, (version
/ 1000000) % 100,
15735 (version
/ 10000) % 100 > 26 ? "Z" : "",
15736 'A' + (version
/ 10000) % 26);
15738 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote
->descsz
,
15739 version
, version
/ 100000000, (version
/ 1000000) % 100,
15740 (version
/ 100) % 100);
15743 case NT_NETBSD_MARCH
:
15744 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote
->descsz
,
15752 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote
->descsz
,
15757 static const char *
15758 get_freebsd_elfcore_note_type (unsigned e_type
)
15762 case NT_FREEBSD_THRMISC
:
15763 return _("NT_THRMISC (thrmisc structure)");
15764 case NT_FREEBSD_PROCSTAT_PROC
:
15765 return _("NT_PROCSTAT_PROC (proc data)");
15766 case NT_FREEBSD_PROCSTAT_FILES
:
15767 return _("NT_PROCSTAT_FILES (files data)");
15768 case NT_FREEBSD_PROCSTAT_VMMAP
:
15769 return _("NT_PROCSTAT_VMMAP (vmmap data)");
15770 case NT_FREEBSD_PROCSTAT_GROUPS
:
15771 return _("NT_PROCSTAT_GROUPS (groups data)");
15772 case NT_FREEBSD_PROCSTAT_UMASK
:
15773 return _("NT_PROCSTAT_UMASK (umask data)");
15774 case NT_FREEBSD_PROCSTAT_RLIMIT
:
15775 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
15776 case NT_FREEBSD_PROCSTAT_OSREL
:
15777 return _("NT_PROCSTAT_OSREL (osreldate data)");
15778 case NT_FREEBSD_PROCSTAT_PSSTRINGS
:
15779 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
15780 case NT_FREEBSD_PROCSTAT_AUXV
:
15781 return _("NT_PROCSTAT_AUXV (auxv data)");
15783 return get_note_type (e_type
);
15786 static const char *
15787 get_netbsd_elfcore_note_type (unsigned e_type
)
15789 static char buff
[64];
15791 if (e_type
== NT_NETBSDCORE_PROCINFO
)
15793 /* NetBSD core "procinfo" structure. */
15794 return _("NetBSD procinfo structure");
15797 /* As of Jan 2002 there are no other machine-independent notes
15798 defined for NetBSD core files. If the note type is less
15799 than the start of the machine-dependent note types, we don't
15802 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
15804 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
15808 switch (elf_header
.e_machine
)
15810 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
15811 and PT_GETFPREGS == mach+2. */
15816 case EM_SPARC32PLUS
:
15820 case NT_NETBSDCORE_FIRSTMACH
+ 0:
15821 return _("PT_GETREGS (reg structure)");
15822 case NT_NETBSDCORE_FIRSTMACH
+ 2:
15823 return _("PT_GETFPREGS (fpreg structure)");
15829 /* On all other arch's, PT_GETREGS == mach+1 and
15830 PT_GETFPREGS == mach+3. */
15834 case NT_NETBSDCORE_FIRSTMACH
+ 1:
15835 return _("PT_GETREGS (reg structure)");
15836 case NT_NETBSDCORE_FIRSTMACH
+ 3:
15837 return _("PT_GETFPREGS (fpreg structure)");
15843 snprintf (buff
, sizeof (buff
), "PT_FIRSTMACH+%d",
15844 e_type
- NT_NETBSDCORE_FIRSTMACH
);
15848 static const char *
15849 get_stapsdt_note_type (unsigned e_type
)
15851 static char buff
[64];
15856 return _("NT_STAPSDT (SystemTap probe descriptors)");
15862 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
15867 print_stapsdt_note (Elf_Internal_Note
*pnote
)
15869 int addr_size
= is_32bit_elf
? 4 : 8;
15870 char *data
= pnote
->descdata
;
15871 char *data_end
= pnote
->descdata
+ pnote
->descsz
;
15872 bfd_vma pc
, base_addr
, semaphore
;
15873 char *provider
, *probe
, *arg_fmt
;
15875 pc
= byte_get ((unsigned char *) data
, addr_size
);
15877 base_addr
= byte_get ((unsigned char *) data
, addr_size
);
15879 semaphore
= byte_get ((unsigned char *) data
, addr_size
);
15883 data
+= strlen (data
) + 1;
15885 data
+= strlen (data
) + 1;
15887 data
+= strlen (data
) + 1;
15889 printf (_(" Provider: %s\n"), provider
);
15890 printf (_(" Name: %s\n"), probe
);
15891 printf (_(" Location: "));
15892 print_vma (pc
, FULL_HEX
);
15893 printf (_(", Base: "));
15894 print_vma (base_addr
, FULL_HEX
);
15895 printf (_(", Semaphore: "));
15896 print_vma (semaphore
, FULL_HEX
);
15898 printf (_(" Arguments: %s\n"), arg_fmt
);
15900 return data
== data_end
;
15903 static const char *
15904 get_ia64_vms_note_type (unsigned e_type
)
15906 static char buff
[64];
15911 return _("NT_VMS_MHD (module header)");
15913 return _("NT_VMS_LNM (language name)");
15915 return _("NT_VMS_SRC (source files)");
15917 return "NT_VMS_TITLE";
15919 return _("NT_VMS_EIDC (consistency check)");
15920 case NT_VMS_FPMODE
:
15921 return _("NT_VMS_FPMODE (FP mode)");
15922 case NT_VMS_LINKTIME
:
15923 return "NT_VMS_LINKTIME";
15924 case NT_VMS_IMGNAM
:
15925 return _("NT_VMS_IMGNAM (image name)");
15927 return _("NT_VMS_IMGID (image id)");
15928 case NT_VMS_LINKID
:
15929 return _("NT_VMS_LINKID (link id)");
15930 case NT_VMS_IMGBID
:
15931 return _("NT_VMS_IMGBID (build id)");
15932 case NT_VMS_GSTNAM
:
15933 return _("NT_VMS_GSTNAM (sym table name)");
15934 case NT_VMS_ORIG_DYN
:
15935 return "NT_VMS_ORIG_DYN";
15936 case NT_VMS_PATCHTIME
:
15937 return "NT_VMS_PATCHTIME";
15939 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
15945 print_ia64_vms_note (Elf_Internal_Note
* pnote
)
15947 switch (pnote
->type
)
15950 if (pnote
->descsz
> 36)
15952 size_t l
= strlen (pnote
->descdata
+ 34);
15953 printf (_(" Creation date : %.17s\n"), pnote
->descdata
);
15954 printf (_(" Last patch date: %.17s\n"), pnote
->descdata
+ 17);
15955 printf (_(" Module name : %s\n"), pnote
->descdata
+ 34);
15956 printf (_(" Module version : %s\n"), pnote
->descdata
+ 34 + l
+ 1);
15959 printf (_(" Invalid size\n"));
15962 printf (_(" Language: %s\n"), pnote
->descdata
);
15965 case NT_VMS_FPMODE
:
15966 printf (_(" Floating Point mode: "));
15967 printf ("0x%016" BFD_VMA_FMT
"x\n",
15968 (bfd_vma
) byte_get ((unsigned char *)pnote
->descdata
, 8));
15970 case NT_VMS_LINKTIME
:
15971 printf (_(" Link time: "));
15973 ((bfd_int64_t
) byte_get ((unsigned char *)pnote
->descdata
, 8));
15976 case NT_VMS_PATCHTIME
:
15977 printf (_(" Patch time: "));
15979 ((bfd_int64_t
) byte_get ((unsigned char *)pnote
->descdata
, 8));
15982 case NT_VMS_ORIG_DYN
:
15983 printf (_(" Major id: %u, minor id: %u\n"),
15984 (unsigned) byte_get ((unsigned char *)pnote
->descdata
, 4),
15985 (unsigned) byte_get ((unsigned char *)pnote
->descdata
+ 4, 4));
15986 printf (_(" Last modified : "));
15988 ((bfd_int64_t
) byte_get ((unsigned char *)pnote
->descdata
+ 8, 8));
15989 printf (_("\n Link flags : "));
15990 printf ("0x%016" BFD_VMA_FMT
"x\n",
15991 (bfd_vma
) byte_get ((unsigned char *)pnote
->descdata
+ 16, 8));
15992 printf (_(" Header flags: 0x%08x\n"),
15993 (unsigned) byte_get ((unsigned char *)pnote
->descdata
+ 24, 4));
15994 printf (_(" Image id : %s\n"), pnote
->descdata
+ 32);
15997 case NT_VMS_IMGNAM
:
15998 printf (_(" Image name: %s\n"), pnote
->descdata
);
16000 case NT_VMS_GSTNAM
:
16001 printf (_(" Global symbol table name: %s\n"), pnote
->descdata
);
16004 printf (_(" Image id: %s\n"), pnote
->descdata
);
16006 case NT_VMS_LINKID
:
16007 printf (_(" Linker id: %s\n"), pnote
->descdata
);
16015 /* Note that by the ELF standard, the name field is already null byte
16016 terminated, and namesz includes the terminating null byte.
16017 I.E. the value of namesz for the name "FSF" is 4.
16019 If the value of namesz is zero, there is no name present. */
16021 process_note (Elf_Internal_Note
* pnote
)
16023 const char * name
= pnote
->namesz
? pnote
->namedata
: "(NONE)";
16026 if (pnote
->namesz
== 0)
16027 /* If there is no note name, then use the default set of
16028 note type strings. */
16029 nt
= get_note_type (pnote
->type
);
16031 else if (const_strneq (pnote
->namedata
, "GNU"))
16032 /* GNU-specific object file notes. */
16033 nt
= get_gnu_elf_note_type (pnote
->type
);
16035 else if (const_strneq (pnote
->namedata
, "FreeBSD"))
16036 /* FreeBSD-specific core file notes. */
16037 nt
= get_freebsd_elfcore_note_type (pnote
->type
);
16039 else if (const_strneq (pnote
->namedata
, "NetBSD-CORE"))
16040 /* NetBSD-specific core file notes. */
16041 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
16043 else if (const_strneq (pnote
->namedata
, "NetBSD"))
16044 /* NetBSD-specific core file notes. */
16045 return process_netbsd_elf_note (pnote
);
16047 else if (strneq (pnote
->namedata
, "SPU/", 4))
16049 /* SPU-specific core file notes. */
16050 nt
= pnote
->namedata
+ 4;
16054 else if (const_strneq (pnote
->namedata
, "IPF/VMS"))
16055 /* VMS/ia64-specific file notes. */
16056 nt
= get_ia64_vms_note_type (pnote
->type
);
16058 else if (const_strneq (pnote
->namedata
, "stapsdt"))
16059 nt
= get_stapsdt_note_type (pnote
->type
);
16062 /* Don't recognize this note name; just use the default set of
16063 note type strings. */
16064 nt
= get_note_type (pnote
->type
);
16066 printf (" %-20s 0x%08lx\t%s\n", name
, pnote
->descsz
, nt
);
16068 if (const_strneq (pnote
->namedata
, "IPF/VMS"))
16069 return print_ia64_vms_note (pnote
);
16070 else if (const_strneq (pnote
->namedata
, "GNU"))
16071 return print_gnu_note (pnote
);
16072 else if (const_strneq (pnote
->namedata
, "stapsdt"))
16073 return print_stapsdt_note (pnote
);
16074 else if (const_strneq (pnote
->namedata
, "CORE"))
16075 return print_core_note (pnote
);
16082 process_corefile_note_segment (FILE * file
, bfd_vma offset
, bfd_vma length
)
16084 Elf_External_Note
* pnotes
;
16085 Elf_External_Note
* external
;
16092 pnotes
= (Elf_External_Note
*) get_data (NULL
, file
, offset
, 1, length
,
16094 if (pnotes
== NULL
)
16099 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
16100 (unsigned long) offset
, (unsigned long) length
);
16101 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
16103 end
= (char *) pnotes
+ length
;
16104 while ((char *) external
< end
)
16106 Elf_Internal_Note inote
;
16109 char * temp
= NULL
;
16110 size_t data_remaining
= end
- (char *) external
;
16112 if (!is_ia64_vms ())
16114 /* PR binutils/15191
16115 Make sure that there is enough data to read. */
16116 min_notesz
= offsetof (Elf_External_Note
, name
);
16117 if (data_remaining
< min_notesz
)
16119 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16120 (int) data_remaining
);
16123 inote
.type
= BYTE_GET (external
->type
);
16124 inote
.namesz
= BYTE_GET (external
->namesz
);
16125 inote
.namedata
= external
->name
;
16126 inote
.descsz
= BYTE_GET (external
->descsz
);
16127 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
16128 /* PR 17531: file: 3443835e. */
16129 if (inote
.descdata
< (char *) pnotes
|| inote
.descdata
> end
)
16131 warn (_("Corrupt note: name size is too big: %lx\n"), inote
.namesz
);
16132 inote
.descdata
= inote
.namedata
;
16136 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
16137 next
= inote
.descdata
+ align_power (inote
.descsz
, 2);
16141 Elf64_External_VMS_Note
*vms_external
;
16143 /* PR binutils/15191
16144 Make sure that there is enough data to read. */
16145 min_notesz
= offsetof (Elf64_External_VMS_Note
, name
);
16146 if (data_remaining
< min_notesz
)
16148 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16149 (int) data_remaining
);
16153 vms_external
= (Elf64_External_VMS_Note
*) external
;
16154 inote
.type
= BYTE_GET (vms_external
->type
);
16155 inote
.namesz
= BYTE_GET (vms_external
->namesz
);
16156 inote
.namedata
= vms_external
->name
;
16157 inote
.descsz
= BYTE_GET (vms_external
->descsz
);
16158 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 3);
16159 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
16160 next
= inote
.descdata
+ align_power (inote
.descsz
, 3);
16163 if (inote
.descdata
< (char *) external
+ min_notesz
16164 || next
< (char *) external
+ min_notesz
16165 /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
16166 || inote
.namedata
+ inote
.namesz
< inote
.namedata
16167 || inote
.descdata
+ inote
.descsz
< inote
.descdata
16168 || data_remaining
< (size_t)(next
- (char *) external
))
16170 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
16171 (unsigned long) ((char *) external
- (char *) pnotes
));
16172 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
16173 inote
.type
, inote
.namesz
, inote
.descsz
);
16177 external
= (Elf_External_Note
*) next
;
16179 /* Verify that name is null terminated. It appears that at least
16180 one version of Linux (RedHat 6.0) generates corefiles that don't
16181 comply with the ELF spec by failing to include the null byte in
16183 if (inote
.namedata
[inote
.namesz
- 1] != '\0')
16185 temp
= (char *) malloc (inote
.namesz
+ 1);
16188 error (_("Out of memory allocating space for inote name\n"));
16193 strncpy (temp
, inote
.namedata
, inote
.namesz
);
16194 temp
[inote
.namesz
] = 0;
16196 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
16197 inote
.namedata
= temp
;
16200 res
&= process_note (& inote
);
16215 process_corefile_note_segments (FILE * file
)
16217 Elf_Internal_Phdr
* segment
;
16221 if (! get_program_headers (file
))
16224 for (i
= 0, segment
= program_headers
;
16225 i
< elf_header
.e_phnum
;
16228 if (segment
->p_type
== PT_NOTE
)
16229 res
&= process_corefile_note_segment (file
,
16230 (bfd_vma
) segment
->p_offset
,
16231 (bfd_vma
) segment
->p_filesz
);
16238 process_v850_notes (FILE * file
, bfd_vma offset
, bfd_vma length
)
16240 Elf_External_Note
* pnotes
;
16241 Elf_External_Note
* external
;
16248 pnotes
= (Elf_External_Note
*) get_data (NULL
, file
, offset
, 1, length
,
16250 if (pnotes
== NULL
)
16254 end
= (char*) pnotes
+ length
;
16256 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
16257 (unsigned long) offset
, (unsigned long) length
);
16259 while ((char *) external
+ sizeof (Elf_External_Note
) < end
)
16261 Elf_External_Note
* next
;
16262 Elf_Internal_Note inote
;
16264 inote
.type
= BYTE_GET (external
->type
);
16265 inote
.namesz
= BYTE_GET (external
->namesz
);
16266 inote
.namedata
= external
->name
;
16267 inote
.descsz
= BYTE_GET (external
->descsz
);
16268 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
16269 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
16271 if (inote
.descdata
< (char *) pnotes
|| inote
.descdata
>= end
)
16273 warn (_("Corrupt note: name size is too big: %lx\n"), inote
.namesz
);
16274 inote
.descdata
= inote
.namedata
;
16278 next
= (Elf_External_Note
*) (inote
.descdata
+ align_power (inote
.descsz
, 2));
16280 if ( ((char *) next
> end
)
16281 || ((char *) next
< (char *) pnotes
))
16283 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
16284 (unsigned long) ((char *) external
- (char *) pnotes
));
16285 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16286 inote
.type
, inote
.namesz
, inote
.descsz
);
16292 /* Prevent out-of-bounds indexing. */
16293 if ( inote
.namedata
+ inote
.namesz
> end
16294 || inote
.namedata
+ inote
.namesz
< inote
.namedata
)
16296 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
16297 (unsigned long) ((char *) external
- (char *) pnotes
));
16298 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16299 inote
.type
, inote
.namesz
, inote
.descsz
);
16303 printf (" %s: ", get_v850_elf_note_type (inote
.type
));
16305 if (! print_v850_note (& inote
))
16308 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
16309 inote
.namesz
, inote
.descsz
);
16319 process_note_sections (FILE * file
)
16321 Elf_Internal_Shdr
* section
;
16326 for (i
= 0, section
= section_headers
;
16327 i
< elf_header
.e_shnum
&& section
!= NULL
;
16330 if (section
->sh_type
== SHT_NOTE
)
16332 res
&= process_corefile_note_segment (file
,
16333 (bfd_vma
) section
->sh_offset
,
16334 (bfd_vma
) section
->sh_size
);
16338 if (( elf_header
.e_machine
== EM_V800
16339 || elf_header
.e_machine
== EM_V850
16340 || elf_header
.e_machine
== EM_CYGNUS_V850
)
16341 && section
->sh_type
== SHT_RENESAS_INFO
)
16343 res
&= process_v850_notes (file
,
16344 (bfd_vma
) section
->sh_offset
,
16345 (bfd_vma
) section
->sh_size
);
16351 /* Try processing NOTE segments instead. */
16352 return process_corefile_note_segments (file
);
16358 process_notes (FILE * file
)
16360 /* If we have not been asked to display the notes then do nothing. */
16364 if (elf_header
.e_type
!= ET_CORE
)
16365 return process_note_sections (file
);
16367 /* No program headers means no NOTE segment. */
16368 if (elf_header
.e_phnum
> 0)
16369 return process_corefile_note_segments (file
);
16371 printf (_("No note segments present in the core file.\n"));
16376 process_arch_specific (FILE * file
)
16381 switch (elf_header
.e_machine
)
16384 return process_arm_specific (file
);
16386 case EM_MIPS_RS3_LE
:
16387 return process_mips_specific (file
);
16390 return process_nds32_specific (file
);
16394 return process_power_specific (file
);
16398 return process_s390_specific (file
);
16401 case EM_SPARC32PLUS
:
16403 return process_sparc_specific (file
);
16406 return process_tic6x_specific (file
);
16409 return process_msp430x_specific (file
);
16417 get_file_header (FILE * file
)
16419 /* Read in the identity array. */
16420 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
16423 /* Determine how to read the rest of the header. */
16424 switch (elf_header
.e_ident
[EI_DATA
])
16429 byte_get
= byte_get_little_endian
;
16430 byte_put
= byte_put_little_endian
;
16433 byte_get
= byte_get_big_endian
;
16434 byte_put
= byte_put_big_endian
;
16438 /* For now we only support 32 bit and 64 bit ELF files. */
16439 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
16441 /* Read in the rest of the header. */
16444 Elf32_External_Ehdr ehdr32
;
16446 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
16449 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
16450 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
16451 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
16452 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
16453 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
16454 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
16455 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
16456 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
16457 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
16458 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
16459 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
16460 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
16461 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
16465 Elf64_External_Ehdr ehdr64
;
16467 /* If we have been compiled with sizeof (bfd_vma) == 4, then
16468 we will not be able to cope with the 64bit data found in
16469 64 ELF files. Detect this now and abort before we start
16470 overwriting things. */
16471 if (sizeof (bfd_vma
) < 8)
16473 error (_("This instance of readelf has been built without support for a\n\
16474 64 bit data type and so it cannot read 64 bit ELF files.\n"));
16478 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
16481 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
16482 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
16483 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
16484 elf_header
.e_entry
= BYTE_GET (ehdr64
.e_entry
);
16485 elf_header
.e_phoff
= BYTE_GET (ehdr64
.e_phoff
);
16486 elf_header
.e_shoff
= BYTE_GET (ehdr64
.e_shoff
);
16487 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
16488 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
16489 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
16490 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
16491 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
16492 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
16493 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
16496 if (elf_header
.e_shoff
)
16498 /* There may be some extensions in the first section header. Don't
16499 bomb if we can't read it. */
16501 get_32bit_section_headers (file
, TRUE
);
16503 get_64bit_section_headers (file
, TRUE
);
16509 /* Process one ELF object file according to the command line options.
16510 This file may actually be stored in an archive. The file is
16511 positioned at the start of the ELF object. */
16514 process_object (char * file_name
, FILE * file
)
16518 if (! get_file_header (file
))
16520 error (_("%s: Failed to read file header\n"), file_name
);
16524 /* Initialise per file variables. */
16525 for (i
= ARRAY_SIZE (version_info
); i
--;)
16526 version_info
[i
] = 0;
16528 for (i
= ARRAY_SIZE (dynamic_info
); i
--;)
16529 dynamic_info
[i
] = 0;
16530 dynamic_info_DT_GNU_HASH
= 0;
16532 /* Process the file. */
16534 printf (_("\nFile: %s\n"), file_name
);
16536 /* Initialise the dump_sects array from the cmdline_dump_sects array.
16537 Note we do this even if cmdline_dump_sects is empty because we
16538 must make sure that the dump_sets array is zeroed out before each
16539 object file is processed. */
16540 if (num_dump_sects
> num_cmdline_dump_sects
)
16541 memset (dump_sects
, 0, num_dump_sects
* sizeof (* dump_sects
));
16543 if (num_cmdline_dump_sects
> 0)
16545 if (num_dump_sects
== 0)
16546 /* A sneaky way of allocating the dump_sects array. */
16547 request_dump_bynumber (num_cmdline_dump_sects
, 0);
16549 assert (num_dump_sects
>= num_cmdline_dump_sects
);
16550 memcpy (dump_sects
, cmdline_dump_sects
,
16551 num_cmdline_dump_sects
* sizeof (* dump_sects
));
16554 if (! process_file_header ())
16557 if (! process_section_headers (file
))
16559 /* Without loaded section headers we cannot process lots of
16561 do_unwind
= do_version
= do_dump
= do_arch
= 0;
16563 if (! do_using_dynamic
)
16564 do_syms
= do_dyn_syms
= do_reloc
= 0;
16567 if (! process_section_groups (file
))
16569 /* Without loaded section groups we cannot process unwind. */
16573 if (process_program_headers (file
))
16574 process_dynamic_section (file
);
16576 process_relocs (file
);
16578 process_unwind (file
);
16580 process_symbol_table (file
);
16582 process_syminfo (file
);
16584 process_version_sections (file
);
16586 process_section_contents (file
);
16588 process_notes (file
);
16590 process_gnu_liblist (file
);
16592 process_arch_specific (file
);
16594 if (program_headers
)
16596 free (program_headers
);
16597 program_headers
= NULL
;
16600 if (section_headers
)
16602 free (section_headers
);
16603 section_headers
= NULL
;
16608 free (string_table
);
16609 string_table
= NULL
;
16610 string_table_length
= 0;
16613 if (dynamic_strings
)
16615 free (dynamic_strings
);
16616 dynamic_strings
= NULL
;
16617 dynamic_strings_length
= 0;
16620 if (dynamic_symbols
)
16622 free (dynamic_symbols
);
16623 dynamic_symbols
= NULL
;
16624 num_dynamic_syms
= 0;
16627 if (dynamic_syminfo
)
16629 free (dynamic_syminfo
);
16630 dynamic_syminfo
= NULL
;
16633 if (dynamic_section
)
16635 free (dynamic_section
);
16636 dynamic_section
= NULL
;
16639 if (section_headers_groups
)
16641 free (section_headers_groups
);
16642 section_headers_groups
= NULL
;
16645 if (section_groups
)
16647 struct group_list
* g
;
16648 struct group_list
* next
;
16650 for (i
= 0; i
< group_count
; i
++)
16652 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
16659 free (section_groups
);
16660 section_groups
= NULL
;
16663 free_debug_memory ();
16668 /* Process an ELF archive.
16669 On entry the file is positioned just after the ARMAG string. */
16672 process_archive (char * file_name
, FILE * file
, bfd_boolean is_thin_archive
)
16674 struct archive_info arch
;
16675 struct archive_info nested_arch
;
16681 /* The ARCH structure is used to hold information about this archive. */
16682 arch
.file_name
= NULL
;
16684 arch
.index_array
= NULL
;
16685 arch
.sym_table
= NULL
;
16686 arch
.longnames
= NULL
;
16688 /* The NESTED_ARCH structure is used as a single-item cache of information
16689 about a nested archive (when members of a thin archive reside within
16690 another regular archive file). */
16691 nested_arch
.file_name
= NULL
;
16692 nested_arch
.file
= NULL
;
16693 nested_arch
.index_array
= NULL
;
16694 nested_arch
.sym_table
= NULL
;
16695 nested_arch
.longnames
= NULL
;
16697 if (setup_archive (&arch
, file_name
, file
, is_thin_archive
, do_archive_index
) != 0)
16703 if (do_archive_index
)
16705 if (arch
.sym_table
== NULL
)
16706 error (_("%s: unable to dump the index as none was found\n"), file_name
);
16709 unsigned long i
, l
;
16710 unsigned long current_pos
;
16712 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
16713 file_name
, (unsigned long) arch
.index_num
, arch
.sym_size
);
16714 current_pos
= ftell (file
);
16716 for (i
= l
= 0; i
< arch
.index_num
; i
++)
16718 if ((i
== 0) || ((i
> 0) && (arch
.index_array
[i
] != arch
.index_array
[i
- 1])))
16720 char * member_name
;
16722 member_name
= get_archive_member_name_at (&arch
, arch
.index_array
[i
], &nested_arch
);
16724 if (member_name
!= NULL
)
16726 char * qualified_name
= make_qualified_name (&arch
, &nested_arch
, member_name
);
16728 if (qualified_name
!= NULL
)
16730 printf (_("Contents of binary %s at offset "), qualified_name
);
16731 (void) print_vma (arch
.index_array
[i
], PREFIX_HEX
);
16733 free (qualified_name
);
16738 if (l
>= arch
.sym_size
)
16740 error (_("%s: end of the symbol table reached before the end of the index\n"),
16744 /* PR 17531: file: 0b6630b2. */
16745 printf ("\t%.*s\n", (int) (arch
.sym_size
- l
), arch
.sym_table
+ l
);
16746 l
+= strnlen (arch
.sym_table
+ l
, arch
.sym_size
- l
) + 1;
16749 if (arch
.uses_64bit_indicies
)
16754 if (l
< arch
.sym_size
)
16755 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
16756 file_name
, arch
.sym_size
- l
);
16758 if (fseek (file
, current_pos
, SEEK_SET
) != 0)
16760 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name
);
16766 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
16767 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
16768 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
16769 && !do_section_groups
&& !do_dyn_syms
)
16771 ret
= 0; /* Archive index only. */
16782 char * qualified_name
;
16784 /* Read the next archive header. */
16785 if (fseek (file
, arch
.next_arhdr_offset
, SEEK_SET
) != 0)
16787 error (_("%s: failed to seek to next archive header\n"), file_name
);
16790 got
= fread (&arch
.arhdr
, 1, sizeof arch
.arhdr
, file
);
16791 if (got
!= sizeof arch
.arhdr
)
16795 error (_("%s: failed to read archive header\n"), file_name
);
16799 if (memcmp (arch
.arhdr
.ar_fmag
, ARFMAG
, 2) != 0)
16801 error (_("%s: did not find a valid archive header\n"), arch
.file_name
);
16806 arch
.next_arhdr_offset
+= sizeof arch
.arhdr
;
16808 archive_file_size
= strtoul (arch
.arhdr
.ar_size
, NULL
, 10);
16809 if (archive_file_size
& 01)
16810 ++archive_file_size
;
16812 name
= get_archive_member_name (&arch
, &nested_arch
);
16815 error (_("%s: bad archive file name\n"), file_name
);
16819 namelen
= strlen (name
);
16821 qualified_name
= make_qualified_name (&arch
, &nested_arch
, name
);
16822 if (qualified_name
== NULL
)
16824 error (_("%s: bad archive file name\n"), file_name
);
16829 if (is_thin_archive
&& arch
.nested_member_origin
== 0)
16831 /* This is a proxy for an external member of a thin archive. */
16832 FILE * member_file
;
16833 char * member_file_name
= adjust_relative_path (file_name
, name
, namelen
);
16834 if (member_file_name
== NULL
)
16840 member_file
= fopen (member_file_name
, "rb");
16841 if (member_file
== NULL
)
16843 error (_("Input file '%s' is not readable.\n"), member_file_name
);
16844 free (member_file_name
);
16849 archive_file_offset
= arch
.nested_member_origin
;
16851 ret
|= process_object (qualified_name
, member_file
);
16853 fclose (member_file
);
16854 free (member_file_name
);
16856 else if (is_thin_archive
)
16858 /* PR 15140: Allow for corrupt thin archives. */
16859 if (nested_arch
.file
== NULL
)
16861 error (_("%s: contains corrupt thin archive: %s\n"),
16867 /* This is a proxy for a member of a nested archive. */
16868 archive_file_offset
= arch
.nested_member_origin
+ sizeof arch
.arhdr
;
16870 /* The nested archive file will have been opened and setup by
16871 get_archive_member_name. */
16872 if (fseek (nested_arch
.file
, archive_file_offset
, SEEK_SET
) != 0)
16874 error (_("%s: failed to seek to archive member.\n"), nested_arch
.file_name
);
16879 ret
|= process_object (qualified_name
, nested_arch
.file
);
16883 archive_file_offset
= arch
.next_arhdr_offset
;
16884 arch
.next_arhdr_offset
+= archive_file_size
;
16886 ret
|= process_object (qualified_name
, file
);
16889 if (dump_sects
!= NULL
)
16893 num_dump_sects
= 0;
16896 free (qualified_name
);
16900 if (nested_arch
.file
!= NULL
)
16901 fclose (nested_arch
.file
);
16902 release_archive (&nested_arch
);
16903 release_archive (&arch
);
16909 process_file (char * file_name
)
16912 struct stat statbuf
;
16913 char armag
[SARMAG
];
16916 if (stat (file_name
, &statbuf
) < 0)
16918 if (errno
== ENOENT
)
16919 error (_("'%s': No such file\n"), file_name
);
16921 error (_("Could not locate '%s'. System error message: %s\n"),
16922 file_name
, strerror (errno
));
16926 if (! S_ISREG (statbuf
.st_mode
))
16928 error (_("'%s' is not an ordinary file\n"), file_name
);
16932 file
= fopen (file_name
, "rb");
16935 error (_("Input file '%s' is not readable.\n"), file_name
);
16939 if (fread (armag
, SARMAG
, 1, file
) != 1)
16941 error (_("%s: Failed to read file's magic number\n"), file_name
);
16946 current_file_size
= (bfd_size_type
) statbuf
.st_size
;
16948 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
16949 ret
= process_archive (file_name
, file
, FALSE
);
16950 else if (memcmp (armag
, ARMAGT
, SARMAG
) == 0)
16951 ret
= process_archive (file_name
, file
, TRUE
);
16954 if (do_archive_index
)
16955 error (_("File %s is not an archive so its index cannot be displayed.\n"),
16959 archive_file_size
= archive_file_offset
= 0;
16960 ret
= process_object (file_name
, file
);
16965 current_file_size
= 0;
16969 #ifdef SUPPORT_DISASSEMBLY
16970 /* Needed by the i386 disassembler. For extra credit, someone could
16971 fix this so that we insert symbolic addresses here, esp for GOT/PLT
16975 print_address (unsigned int addr
, FILE * outfile
)
16977 fprintf (outfile
,"0x%8.8x", addr
);
16980 /* Needed by the i386 disassembler. */
16982 db_task_printsym (unsigned int addr
)
16984 print_address (addr
, stderr
);
16989 main (int argc
, char ** argv
)
16993 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
16994 setlocale (LC_MESSAGES
, "");
16996 #if defined (HAVE_SETLOCALE)
16997 setlocale (LC_CTYPE
, "");
16999 bindtextdomain (PACKAGE
, LOCALEDIR
);
17000 textdomain (PACKAGE
);
17002 expandargv (&argc
, &argv
);
17004 parse_args (argc
, argv
);
17006 if (num_dump_sects
> 0)
17008 /* Make a copy of the dump_sects array. */
17009 cmdline_dump_sects
= (dump_type
*)
17010 malloc (num_dump_sects
* sizeof (* dump_sects
));
17011 if (cmdline_dump_sects
== NULL
)
17012 error (_("Out of memory allocating dump request table.\n"));
17015 memcpy (cmdline_dump_sects
, dump_sects
,
17016 num_dump_sects
* sizeof (* dump_sects
));
17017 num_cmdline_dump_sects
= num_dump_sects
;
17021 if (optind
< (argc
- 1))
17023 else if (optind
>= argc
)
17025 warn (_("Nothing to do.\n"));
17030 while (optind
< argc
)
17031 err
|= process_file (argv
[optind
++]);
17033 if (dump_sects
!= NULL
)
17035 if (cmdline_dump_sects
!= NULL
)
17036 free (cmdline_dump_sects
);