1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998-2022 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. */
49 #if defined HAVE_MSGPACK
54 /* Define BFD64 here, even if our default architecture is 32 bit ELF
55 as this will allow us to read in and parse 64bit and 32bit ELF files.
56 Only do this if we believe that the compiler can support a 64 bit
57 data type. For now we only rely on GCC being able to do this. */
64 #include "demanguse.h"
69 #include "elf/common.h"
70 #include "elf/external.h"
71 #include "elf/internal.h"
74 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
75 we can obtain the H8 reloc numbers. We need these for the
76 get_reloc_size() function. We include h8.h again after defining
77 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
82 /* Undo the effects of #including reloc-macros.h. */
84 #undef START_RELOC_NUMBERS
88 #undef END_RELOC_NUMBERS
89 #undef _RELOC_MACROS_H
91 /* The following headers use the elf/reloc-macros.h file to
92 automatically generate relocation recognition functions
93 such as elf_mips_reloc_type() */
95 #define RELOC_MACROS_GEN_FUNC
97 #include "elf/aarch64.h"
98 #include "elf/alpha.h"
99 #include "elf/amdgpu.h"
103 #include "elf/bfin.h"
104 #include "elf/cr16.h"
105 #include "elf/cris.h"
107 #include "elf/csky.h"
108 #include "elf/d10v.h"
109 #include "elf/d30v.h"
112 #include "elf/epiphany.h"
113 #include "elf/fr30.h"
115 #include "elf/ft32.h"
117 #include "elf/hppa.h"
118 #include "elf/i386.h"
119 #include "elf/i370.h"
120 #include "elf/i860.h"
121 #include "elf/i960.h"
122 #include "elf/ia64.h"
123 #include "elf/ip2k.h"
124 #include "elf/lm32.h"
125 #include "elf/iq2000.h"
126 #include "elf/m32c.h"
127 #include "elf/m32r.h"
128 #include "elf/m68k.h"
129 #include "elf/m68hc11.h"
130 #include "elf/s12z.h"
131 #include "elf/mcore.h"
133 #include "elf/metag.h"
134 #include "elf/microblaze.h"
135 #include "elf/mips.h"
136 #include "elf/mmix.h"
137 #include "elf/mn10200.h"
138 #include "elf/mn10300.h"
139 #include "elf/moxie.h"
141 #include "elf/msp430.h"
142 #include "elf/nds32.h"
144 #include "elf/nios2.h"
145 #include "elf/or1k.h"
148 #include "elf/ppc64.h"
150 #include "elf/riscv.h"
151 #include "elf/rl78.h"
153 #include "elf/s390.h"
154 #include "elf/score.h"
156 #include "elf/sparc.h"
158 #include "elf/tic6x.h"
159 #include "elf/tilegx.h"
160 #include "elf/tilepro.h"
161 #include "elf/v850.h"
163 #include "elf/visium.h"
164 #include "elf/wasm32.h"
165 #include "elf/x86-64.h"
166 #include "elf/xc16x.h"
167 #include "elf/xgate.h"
168 #include "elf/xstormy16.h"
169 #include "elf/xtensa.h"
171 #include "elf/loongarch.h"
174 #include "libiberty.h"
175 #include "safe-ctype.h"
176 #include "filenames.h"
179 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
182 typedef struct elf_section_list
184 Elf_Internal_Shdr
* hdr
;
185 struct elf_section_list
* next
;
188 /* Flag bits indicating particular types of dump. */
189 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
190 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
191 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
192 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
193 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
194 #define CTF_DUMP (1 << 5) /* The --ctf command line switch. */
196 typedef unsigned char dump_type
;
198 /* A linked list of the section names for which dumps were requested. */
199 struct dump_list_entry
203 struct dump_list_entry
* next
;
206 /* A dynamic array of flags indicating for which sections a dump
207 has been requested via command line switches. */
210 dump_type
* dump_sects
;
211 unsigned int num_dump_sects
;
214 static struct dump_data cmdline
;
216 static struct dump_list_entry
* dump_sects_byname
;
218 char * program_name
= "readelf";
220 static bool show_name
= false;
221 static bool do_dynamic
= false;
222 static bool do_syms
= false;
223 static bool do_dyn_syms
= false;
224 static bool do_lto_syms
= false;
225 static bool do_reloc
= false;
226 static bool do_sections
= false;
227 static bool do_section_groups
= false;
228 static bool do_section_details
= false;
229 static bool do_segments
= false;
230 static bool do_unwind
= false;
231 static bool do_using_dynamic
= false;
232 static bool do_header
= false;
233 static bool do_dump
= false;
234 static bool do_version
= false;
235 static bool do_histogram
= false;
236 static bool do_debugging
= false;
237 static bool do_ctf
= false;
238 static bool do_arch
= false;
239 static bool do_notes
= false;
240 static bool do_archive_index
= false;
241 static bool check_all
= false;
242 static bool is_32bit_elf
= false;
243 static bool decompress_dumps
= false;
244 static bool do_not_show_symbol_truncation
= false;
245 static bool do_demangle
= false; /* Pretty print C++ symbol names. */
246 static bool process_links
= false;
247 static bool dump_any_debugging
= false;
248 static int demangle_flags
= DMGL_ANSI
| DMGL_PARAMS
;
249 static int sym_base
= 0;
251 static char *dump_ctf_parent_name
;
252 static char *dump_ctf_symtab_name
;
253 static char *dump_ctf_strtab_name
;
257 struct group_list
* next
;
258 unsigned int section_index
;
263 struct group_list
* root
;
264 unsigned int group_index
;
267 typedef struct filedata
269 const char * file_name
;
272 bfd_size_type file_size
;
273 Elf_Internal_Ehdr file_header
;
274 unsigned long archive_file_offset
;
275 unsigned long archive_file_size
;
276 /* Everything below this point is cleared out by free_filedata. */
277 Elf_Internal_Shdr
* section_headers
;
278 Elf_Internal_Phdr
* program_headers
;
280 unsigned long string_table_length
;
281 unsigned long dynamic_addr
;
282 bfd_size_type dynamic_size
;
284 Elf_Internal_Dyn
* dynamic_section
;
285 Elf_Internal_Shdr
* dynamic_strtab_section
;
286 char * dynamic_strings
;
287 unsigned long dynamic_strings_length
;
288 Elf_Internal_Shdr
* dynamic_symtab_section
;
289 unsigned long num_dynamic_syms
;
290 Elf_Internal_Sym
* dynamic_symbols
;
291 bfd_vma version_info
[16];
292 unsigned int dynamic_syminfo_nent
;
293 Elf_Internal_Syminfo
* dynamic_syminfo
;
294 unsigned long dynamic_syminfo_offset
;
295 bfd_size_type nbuckets
;
296 bfd_size_type nchains
;
299 bfd_size_type ngnubuckets
;
300 bfd_size_type ngnuchains
;
301 bfd_vma
* gnubuckets
;
305 char * program_interpreter
;
306 bfd_vma dynamic_info
[DT_ENCODING
];
307 bfd_vma dynamic_info_DT_GNU_HASH
;
308 bfd_vma dynamic_info_DT_MIPS_XHASH
;
309 elf_section_list
* symtab_shndx_list
;
311 struct group
* section_groups
;
312 struct group
** section_headers_groups
;
313 /* A dynamic array of flags indicating for which sections a dump of
314 some kind has been requested. It is reset on a per-object file
315 basis and then initialised from the cmdline_dump_sects array,
316 the results of interpreting the -w switch, and the
317 dump_sects_byname list. */
318 struct dump_data dump
;
321 /* How to print a vma value. */
322 typedef enum print_mode
339 typedef enum unicode_display_type
347 } unicode_display_type
;
349 static unicode_display_type unicode_display
= unicode_default
;
359 /* Versioned symbol info. */
360 enum versioned_symbol_info
367 static const char * get_symbol_version_string
368 (Filedata
*, bool, const char *, unsigned long, unsigned,
369 Elf_Internal_Sym
*, enum versioned_symbol_info
*, unsigned short *);
373 static inline const char *
374 section_name (const Filedata
*filedata
, const Elf_Internal_Shdr
*hdr
)
376 return filedata
->string_table
+ hdr
->sh_name
;
380 section_name_valid (const Filedata
*filedata
, const Elf_Internal_Shdr
*hdr
)
383 && filedata
->string_table
!= NULL
384 && hdr
->sh_name
< filedata
->string_table_length
);
387 static inline const char *
388 section_name_print (const Filedata
*filedata
, const Elf_Internal_Shdr
*hdr
)
392 if (filedata
->string_table
== NULL
)
393 return _("<no-strings>");
394 if (hdr
->sh_name
>= filedata
->string_table_length
)
395 return _("<corrupt>");
396 return section_name (filedata
, hdr
);
399 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
402 valid_symbol_name (const char *strtab
, size_t strtab_size
, uint64_t offset
)
404 return strtab
!= NULL
&& offset
< strtab_size
;
408 valid_dynamic_name (const Filedata
*filedata
, uint64_t offset
)
410 return valid_symbol_name (filedata
->dynamic_strings
,
411 filedata
->dynamic_strings_length
, offset
);
414 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
415 already been called and verified that the string exists. */
416 static inline const char *
417 get_dynamic_name (const Filedata
*filedata
, size_t offset
)
419 return filedata
->dynamic_strings
+ offset
;
422 #define REMOVE_ARCH_BITS(ADDR) \
425 if (filedata->file_header.e_machine == EM_ARM) \
430 /* Get the correct GNU hash section name. */
431 #define GNU_HASH_SECTION_NAME(filedata) \
432 filedata->dynamic_info_DT_MIPS_XHASH ? ".MIPS.xhash" : ".gnu.hash"
434 /* Print a BFD_VMA to an internal buffer, for use in error messages.
435 BFD_FMA_FMT can't be used in translated strings. */
438 bfd_vmatoa (char *fmtch
, bfd_vma value
)
440 /* bfd_vmatoa is used more then once in a printf call for output.
441 Cycle through an array of buffers. */
442 static int buf_pos
= 0;
443 static struct bfd_vmatoa_buf
450 ret
= buf
[buf_pos
++].place
;
451 buf_pos
%= ARRAY_SIZE (buf
);
453 sprintf (fmt
, "%%%s%s", BFD_VMA_FMT
, fmtch
);
454 snprintf (ret
, sizeof (buf
[0].place
), fmt
, value
);
458 /* Retrieve NMEMB structures, each SIZE bytes long from FILEDATA starting at
459 OFFSET + the offset of the current archive member, if we are examining an
460 archive. Put the retrieved data into VAR, if it is not NULL. Otherwise
461 allocate a buffer using malloc and fill that. In either case return the
462 pointer to the start of the retrieved data or NULL if something went wrong.
463 If something does go wrong and REASON is not NULL then emit an error
464 message using REASON as part of the context. */
467 get_data (void * var
,
469 unsigned long offset
,
475 bfd_size_type amt
= size
* nmemb
;
477 if (size
== 0 || nmemb
== 0)
480 /* If the size_t type is smaller than the bfd_size_type, eg because
481 you are building a 32-bit tool on a 64-bit host, then make sure
482 that when the sizes are cast to (size_t) no information is lost. */
483 if ((size_t) size
!= size
484 || (size_t) nmemb
!= nmemb
485 || (size_t) amt
!= amt
)
488 error (_("Size truncation prevents reading %s"
489 " elements of size %s for %s\n"),
490 bfd_vmatoa ("u", nmemb
), bfd_vmatoa ("u", size
), reason
);
494 /* Check for size overflow. */
495 if (amt
/ size
!= nmemb
|| (size_t) amt
+ 1 == 0)
498 error (_("Size overflow prevents reading %s"
499 " elements of size %s for %s\n"),
500 bfd_vmatoa ("u", nmemb
), bfd_vmatoa ("u", size
), reason
);
504 /* Be kind to memory checkers (eg valgrind, address sanitizer) by not
505 attempting to allocate memory when the read is bound to fail. */
506 if (filedata
->archive_file_offset
> filedata
->file_size
507 || offset
> filedata
->file_size
- filedata
->archive_file_offset
508 || amt
> filedata
->file_size
- filedata
->archive_file_offset
- offset
)
511 error (_("Reading %s bytes extends past end of file for %s\n"),
512 bfd_vmatoa ("u", amt
), reason
);
516 if (fseek (filedata
->handle
, filedata
->archive_file_offset
+ offset
,
520 error (_("Unable to seek to 0x%lx for %s\n"),
521 filedata
->archive_file_offset
+ offset
, reason
);
528 /* + 1 so that we can '\0' terminate invalid string table sections. */
529 mvar
= malloc ((size_t) amt
+ 1);
534 error (_("Out of memory allocating %s bytes for %s\n"),
535 bfd_vmatoa ("u", amt
), reason
);
539 ((char *) mvar
)[amt
] = '\0';
542 if (fread (mvar
, (size_t) size
, (size_t) nmemb
, filedata
->handle
) != nmemb
)
545 error (_("Unable to read in %s bytes of %s\n"),
546 bfd_vmatoa ("u", amt
), reason
);
555 /* Print a VMA value in the MODE specified.
556 Returns the number of characters displayed. */
559 print_vma (bfd_vma vma
, print_mode mode
)
571 return nc
+ printf ("%8.8" BFD_VMA_FMT
"x", vma
);
578 return printf ("%5" BFD_VMA_FMT
"d", vma
);
584 return nc
+ printf ("%" BFD_VMA_FMT
"x", vma
);
590 return nc
+ printf ("%05" BFD_VMA_FMT
"x", vma
);
593 return printf ("%" BFD_VMA_FMT
"d", vma
);
596 return printf ("%" BFD_VMA_FMT
"u", vma
);
599 return printf ("%5" BFD_VMA_FMT
"u", vma
);
602 return printf ("%" BFD_VMA_FMT
"o", vma
);
605 return printf ("%5" BFD_VMA_FMT
"o", vma
);
608 /* FIXME: Report unrecognised mode ? */
614 /* Display a symbol on stdout. Handles the display of control characters and
615 multibye characters (assuming the host environment supports them).
617 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
619 If truncation will happen and do_not_show_symbol_truncation is FALSE then display
620 abs(WIDTH) - 5 characters followed by "[...]".
622 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
623 padding as necessary.
625 Returns the number of emitted characters. */
628 print_symbol (signed int width
, const char * symbol
)
630 bool extra_padding
= false;
631 bool do_dots
= false;
632 signed int num_printed
= 0;
633 #ifdef HAVE_MBSTATE_T
636 unsigned int width_remaining
;
637 const void * alloced_symbol
= NULL
;
641 /* Keep the width positive. This helps the code below. */
643 extra_padding
= true;
649 /* Set the remaining width to a very large value.
650 This simplifies the code below. */
651 width_remaining
= INT_MAX
;
654 width_remaining
= width
;
655 if (! do_not_show_symbol_truncation
656 && (int) strlen (symbol
) > width
)
658 width_remaining
-= 5;
659 if ((int) width_remaining
< 0)
665 #ifdef HAVE_MBSTATE_T
666 /* Initialise the multibyte conversion state. */
667 memset (& state
, 0, sizeof (state
));
670 if (do_demangle
&& *symbol
)
672 const char * res
= cplus_demangle (symbol
, demangle_flags
);
675 alloced_symbol
= symbol
= res
;
678 while (width_remaining
)
681 const char c
= *symbol
++;
692 else if (ISCNTRL (c
))
694 /* Do not print control characters directly as they can affect terminal
695 settings. Such characters usually appear in the names generated
696 by the assembler for local labels. */
698 if (width_remaining
< 2)
701 printf ("^%c", c
+ 0x40);
702 width_remaining
-= 2;
707 if (width_remaining
< 5)
710 width_remaining
-= 5;
713 else if (unicode_display
!= unicode_locale
714 && unicode_display
!= unicode_default
)
716 /* Display unicode characters as something else. */
717 unsigned char bytes
[4];
730 bytes
[1] = *symbol
++;
732 if ((bytes
[1] & 0xc0) != 0x80)
735 /* Do not consume this character. It may only
736 be the first byte in the sequence that was
741 else if ((bytes
[0] & 0x20) == 0)
748 bytes
[2] = *symbol
++;
750 if ((bytes
[2] & 0xc0) != 0x80)
756 else if ((bytes
[0] & 0x10) == 0)
763 bytes
[3] = *symbol
++;
767 if ((bytes
[3] & 0xc0) != 0x80)
779 if (unicode_display
== unicode_invalid
)
782 if (unicode_display
== unicode_hex
|| ! is_utf8
)
786 if (width_remaining
< (nbytes
* 2) + 2)
789 putchar (is_utf8
? '<' : '{');
791 for (i
= 0; i
< nbytes
; i
++)
792 printf ("%02x", bytes
[i
]);
793 putchar (is_utf8
? '>' : '}');
797 if (unicode_display
== unicode_highlight
&& isatty (1))
798 printf ("\x1B[31;47m"); /* Red. */
803 if (width_remaining
< 6)
805 printf ("\\u%02x%02x",
806 (bytes
[0] & 0x1c) >> 2,
807 ((bytes
[0] & 0x03) << 6) | (bytes
[1] & 0x3f));
810 if (width_remaining
< 6)
812 printf ("\\u%02x%02x",
813 ((bytes
[0] & 0x0f) << 4) | ((bytes
[1] & 0x3c) >> 2),
814 ((bytes
[1] & 0x03) << 6) | (bytes
[2] & 0x3f));
817 if (width_remaining
< 8)
819 printf ("\\u%02x%02x%02x",
820 ((bytes
[0] & 0x07) << 6) | ((bytes
[1] & 0x3c) >> 2),
821 ((bytes
[1] & 0x03) << 6) | ((bytes
[2] & 0x3c) >> 2),
822 ((bytes
[2] & 0x03) << 6) | (bytes
[3] & 0x3f));
830 if (unicode_display
== unicode_highlight
&& isatty (1))
831 printf ("\033[0m"); /* Default colour. */
834 if (bytes
[nbytes
- 1] == 0)
839 #ifdef HAVE_MBSTATE_T
842 /* Let printf do the hard work of displaying multibyte characters. */
843 printf ("%.1s", symbol
- 1);
847 #ifdef HAVE_MBSTATE_T
848 /* Try to find out how many bytes made up the character that was
849 just printed. Advance the symbol pointer past the bytes that
851 n
= mbrtowc (& w
, symbol
- 1, MB_CUR_MAX
, & state
);
855 if (n
!= (size_t) -1 && n
!= (size_t) -2 && n
> 0)
861 num_printed
+= printf ("[...]");
863 if (extra_padding
&& num_printed
< width
)
865 /* Fill in the remaining spaces. */
866 printf ("%-*s", width
- num_printed
, " ");
870 free ((void *) alloced_symbol
);
874 /* Returns a pointer to a static buffer containing a printable version of
875 the given section's name. Like print_symbol, except that it does not try
876 to print multibyte characters, it just interprets them as hex values. */
879 printable_section_name (Filedata
* filedata
, const Elf_Internal_Shdr
* sec
)
881 #define MAX_PRINT_SEC_NAME_LEN 256
882 static char sec_name_buf
[MAX_PRINT_SEC_NAME_LEN
+ 1];
883 const char * name
= section_name_print (filedata
, sec
);
884 char * buf
= sec_name_buf
;
886 unsigned int remaining
= MAX_PRINT_SEC_NAME_LEN
;
888 while ((c
= * name
++) != 0)
899 else if (ISPRINT (c
))
906 static char hex
[17] = "0123456789ABCDEF";
911 * buf
++ = hex
[(c
& 0xf0) >> 4];
912 * buf
++ = hex
[c
& 0x0f];
926 printable_section_name_from_index (Filedata
* filedata
, unsigned long ndx
)
928 if (ndx
>= filedata
->file_header
.e_shnum
)
929 return _("<corrupt>");
931 return printable_section_name (filedata
, filedata
->section_headers
+ ndx
);
934 /* Return a pointer to section NAME, or NULL if no such section exists. */
936 static Elf_Internal_Shdr
*
937 find_section (Filedata
* filedata
, const char * name
)
941 if (filedata
->section_headers
== NULL
)
944 for (i
= 0; i
< filedata
->file_header
.e_shnum
; i
++)
945 if (section_name_valid (filedata
, filedata
->section_headers
+ i
)
946 && streq (section_name (filedata
, filedata
->section_headers
+ i
),
948 return filedata
->section_headers
+ i
;
953 /* Return a pointer to a section containing ADDR, or NULL if no such
956 static Elf_Internal_Shdr
*
957 find_section_by_address (Filedata
* filedata
, bfd_vma addr
)
961 if (filedata
->section_headers
== NULL
)
964 for (i
= 0; i
< filedata
->file_header
.e_shnum
; i
++)
966 Elf_Internal_Shdr
*sec
= filedata
->section_headers
+ i
;
968 if (addr
>= sec
->sh_addr
&& addr
< sec
->sh_addr
+ sec
->sh_size
)
975 static Elf_Internal_Shdr
*
976 find_section_by_type (Filedata
* filedata
, unsigned int type
)
980 if (filedata
->section_headers
== NULL
)
983 for (i
= 0; i
< filedata
->file_header
.e_shnum
; i
++)
985 Elf_Internal_Shdr
*sec
= filedata
->section_headers
+ i
;
987 if (sec
->sh_type
== type
)
994 /* Return a pointer to section NAME, or NULL if no such section exists,
995 restricted to the list of sections given in SET. */
997 static Elf_Internal_Shdr
*
998 find_section_in_set (Filedata
* filedata
, const char * name
, unsigned int * set
)
1002 if (filedata
->section_headers
== NULL
)
1007 while ((i
= *set
++) > 0)
1009 /* See PR 21156 for a reproducer. */
1010 if (i
>= filedata
->file_header
.e_shnum
)
1011 continue; /* FIXME: Should we issue an error message ? */
1013 if (section_name_valid (filedata
, filedata
->section_headers
+ i
)
1014 && streq (section_name (filedata
, filedata
->section_headers
+ i
),
1016 return filedata
->section_headers
+ i
;
1020 return find_section (filedata
, name
);
1023 /* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI.
1024 This OS has so many departures from the ELF standard that we test it at
1028 is_ia64_vms (Filedata
* filedata
)
1030 return filedata
->file_header
.e_machine
== EM_IA_64
1031 && filedata
->file_header
.e_ident
[EI_OSABI
] == ELFOSABI_OPENVMS
;
1034 /* Guess the relocation size commonly used by the specific machines. */
1037 guess_is_rela (unsigned int e_machine
)
1041 /* Targets that use REL relocations. */
1047 case EM_CYGNUS_D10V
:
1050 case EM_MIPS_RS3_LE
:
1051 case EM_CYGNUS_M32R
:
1058 /* Targets that use RELA relocations. */
1062 case EM_ADAPTEVA_EPIPHANY
:
1064 case EM_ALTERA_NIOS2
:
1066 case EM_ARC_COMPACT
:
1067 case EM_ARC_COMPACT2
:
1076 case EM_CYGNUS_D30V
:
1079 case EM_CYGNUS_FR30
:
1088 case EM_LATTICEMICO32
:
1097 case EM_CYGNUS_MN10200
:
1099 case EM_CYGNUS_MN10300
:
1117 case EM_SPARC32PLUS
:
1125 case EM_CYGNUS_V850
:
1135 case EM_MICROBLAZE_OLD
:
1136 case EM_WEBASSEMBLY
:
1157 warn (_("Don't know about relocations on this machine architecture\n"));
1162 /* Load RELA type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
1163 Returns TRUE upon success, FALSE otherwise. If successful then a
1164 pointer to a malloc'ed buffer containing the relocs is placed in *RELASP,
1165 and the number of relocs loaded is placed in *NRELASP. It is the caller's
1166 responsibility to free the allocated buffer. */
1169 slurp_rela_relocs (Filedata
* filedata
,
1170 unsigned long rel_offset
,
1171 unsigned long rel_size
,
1172 Elf_Internal_Rela
** relasp
,
1173 unsigned long * nrelasp
)
1175 Elf_Internal_Rela
* relas
;
1181 Elf32_External_Rela
* erelas
;
1183 erelas
= (Elf32_External_Rela
*) get_data (NULL
, filedata
, rel_offset
, 1,
1184 rel_size
, _("32-bit relocation data"));
1188 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
1190 relas
= (Elf_Internal_Rela
*) cmalloc (nrelas
,
1191 sizeof (Elf_Internal_Rela
));
1196 error (_("out of memory parsing relocs\n"));
1200 for (i
= 0; i
< nrelas
; i
++)
1202 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
1203 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
1204 relas
[i
].r_addend
= BYTE_GET_SIGNED (erelas
[i
].r_addend
);
1211 Elf64_External_Rela
* erelas
;
1213 erelas
= (Elf64_External_Rela
*) get_data (NULL
, filedata
, rel_offset
, 1,
1214 rel_size
, _("64-bit relocation data"));
1218 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
1220 relas
= (Elf_Internal_Rela
*) cmalloc (nrelas
,
1221 sizeof (Elf_Internal_Rela
));
1226 error (_("out of memory parsing relocs\n"));
1230 for (i
= 0; i
< nrelas
; i
++)
1232 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
1233 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
1234 relas
[i
].r_addend
= BYTE_GET_SIGNED (erelas
[i
].r_addend
);
1236 /* The #ifdef BFD64 below is to prevent a compile time
1237 warning. We know that if we do not have a 64 bit data
1238 type that we will never execute this code anyway. */
1240 if (filedata
->file_header
.e_machine
== EM_MIPS
1241 && filedata
->file_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
1243 /* In little-endian objects, r_info isn't really a
1244 64-bit little-endian value: it has a 32-bit
1245 little-endian symbol index followed by four
1246 individual byte fields. Reorder INFO
1248 bfd_vma inf
= relas
[i
].r_info
;
1249 inf
= (((inf
& 0xffffffff) << 32)
1250 | ((inf
>> 56) & 0xff)
1251 | ((inf
>> 40) & 0xff00)
1252 | ((inf
>> 24) & 0xff0000)
1253 | ((inf
>> 8) & 0xff000000));
1254 relas
[i
].r_info
= inf
;
1267 /* Load REL type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
1268 Returns TRUE upon success, FALSE otherwise. If successful then a
1269 pointer to a malloc'ed buffer containing the relocs is placed in *RELSP,
1270 and the number of relocs loaded is placed in *NRELSP. It is the caller's
1271 responsibility to free the allocated buffer. */
1274 slurp_rel_relocs (Filedata
* filedata
,
1275 unsigned long rel_offset
,
1276 unsigned long rel_size
,
1277 Elf_Internal_Rela
** relsp
,
1278 unsigned long * nrelsp
)
1280 Elf_Internal_Rela
* rels
;
1286 Elf32_External_Rel
* erels
;
1288 erels
= (Elf32_External_Rel
*) get_data (NULL
, filedata
, rel_offset
, 1,
1289 rel_size
, _("32-bit relocation data"));
1293 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
1295 rels
= (Elf_Internal_Rela
*) cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
1300 error (_("out of memory parsing relocs\n"));
1304 for (i
= 0; i
< nrels
; i
++)
1306 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
1307 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
1308 rels
[i
].r_addend
= 0;
1315 Elf64_External_Rel
* erels
;
1317 erels
= (Elf64_External_Rel
*) get_data (NULL
, filedata
, rel_offset
, 1,
1318 rel_size
, _("64-bit relocation data"));
1322 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
1324 rels
= (Elf_Internal_Rela
*) cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
1329 error (_("out of memory parsing relocs\n"));
1333 for (i
= 0; i
< nrels
; i
++)
1335 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
1336 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
1337 rels
[i
].r_addend
= 0;
1339 /* The #ifdef BFD64 below is to prevent a compile time
1340 warning. We know that if we do not have a 64 bit data
1341 type that we will never execute this code anyway. */
1343 if (filedata
->file_header
.e_machine
== EM_MIPS
1344 && filedata
->file_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
1346 /* In little-endian objects, r_info isn't really a
1347 64-bit little-endian value: it has a 32-bit
1348 little-endian symbol index followed by four
1349 individual byte fields. Reorder INFO
1351 bfd_vma inf
= rels
[i
].r_info
;
1352 inf
= (((inf
& 0xffffffff) << 32)
1353 | ((inf
>> 56) & 0xff)
1354 | ((inf
>> 40) & 0xff00)
1355 | ((inf
>> 24) & 0xff0000)
1356 | ((inf
>> 8) & 0xff000000));
1357 rels
[i
].r_info
= inf
;
1371 slurp_relr_relocs (Filedata
* filedata
,
1372 unsigned long relr_offset
,
1373 unsigned long relr_size
,
1375 unsigned long * nrelrsp
)
1378 size_t size
= 0, nentries
, i
;
1379 bfd_vma base
= 0, addr
, entry
;
1381 relrs
= get_data (NULL
, filedata
, relr_offset
, 1, relr_size
,
1382 _("RELR relocation data"));
1387 nentries
= relr_size
/ sizeof (Elf32_External_Relr
);
1389 nentries
= relr_size
/ sizeof (Elf64_External_Relr
);
1390 for (i
= 0; i
< nentries
; i
++)
1393 entry
= BYTE_GET (((Elf32_External_Relr
*)relrs
)[i
].r_data
);
1395 entry
= BYTE_GET (((Elf64_External_Relr
*)relrs
)[i
].r_data
);
1396 if ((entry
& 1) == 0)
1399 while ((entry
>>= 1) != 0)
1400 if ((entry
& 1) == 1)
1404 *relrsp
= (bfd_vma
*) xmalloc (size
* sizeof (bfd_vma
));
1405 if (*relrsp
== NULL
)
1408 error (_("out of memory parsing relocs\n"));
1413 for (i
= 0; i
< nentries
; i
++)
1415 const bfd_vma entry_bytes
= is_32bit_elf
? 4 : 8;
1418 entry
= BYTE_GET (((Elf32_External_Relr
*)relrs
)[i
].r_data
);
1420 entry
= BYTE_GET (((Elf64_External_Relr
*)relrs
)[i
].r_data
);
1421 if ((entry
& 1) == 0)
1423 (*relrsp
)[size
++] = entry
;
1424 base
= entry
+ entry_bytes
;
1428 for (addr
= base
; (entry
>>= 1) != 0; addr
+= entry_bytes
)
1429 if ((entry
& 1) != 0)
1430 (*relrsp
)[size
++] = addr
;
1431 base
+= entry_bytes
* (entry_bytes
* CHAR_BIT
- 1);
1440 /* Returns the reloc type extracted from the reloc info field. */
1443 get_reloc_type (Filedata
* filedata
, bfd_vma reloc_info
)
1446 return ELF32_R_TYPE (reloc_info
);
1448 switch (filedata
->file_header
.e_machine
)
1451 /* Note: We assume that reloc_info has already been adjusted for us. */
1452 return ELF64_MIPS_R_TYPE (reloc_info
);
1455 return ELF64_R_TYPE_ID (reloc_info
);
1458 return ELF64_R_TYPE (reloc_info
);
1462 /* Return the symbol index extracted from the reloc info field. */
1465 get_reloc_symindex (bfd_vma reloc_info
)
1467 return is_32bit_elf
? ELF32_R_SYM (reloc_info
) : ELF64_R_SYM (reloc_info
);
1471 uses_msp430x_relocs (Filedata
* filedata
)
1474 filedata
->file_header
.e_machine
== EM_MSP430
/* Paranoia. */
1475 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1476 && (((filedata
->file_header
.e_flags
& EF_MSP430_MACH
) == E_MSP430_MACH_MSP430X
)
1477 /* TI compiler uses ELFOSABI_NONE. */
1478 || (filedata
->file_header
.e_ident
[EI_OSABI
] == ELFOSABI_NONE
));
1481 /* Display the contents of the relocation data found at the specified
1485 dump_relocations (Filedata
* filedata
,
1486 unsigned long rel_offset
,
1487 unsigned long rel_size
,
1488 Elf_Internal_Sym
* symtab
,
1489 unsigned long nsyms
,
1491 unsigned long strtablen
,
1492 relocation_type rel_type
,
1496 Elf_Internal_Rela
* rels
;
1499 if (rel_type
== reltype_unknown
)
1500 rel_type
= guess_is_rela (filedata
->file_header
.e_machine
) ? reltype_rela
: reltype_rel
;
1502 if (rel_type
== reltype_rela
)
1504 if (!slurp_rela_relocs (filedata
, rel_offset
, rel_size
, &rels
, &rel_size
))
1507 else if (rel_type
== reltype_rel
)
1509 if (!slurp_rel_relocs (filedata
, rel_offset
, rel_size
, &rels
, &rel_size
))
1512 else if (rel_type
== reltype_relr
)
1516 = is_32bit_elf
? "%08" BFD_VMA_FMT
"x\n" : "%016" BFD_VMA_FMT
"x\n";
1518 if (!slurp_relr_relocs (filedata
, rel_offset
, rel_size
, &relrs
,
1522 printf (ngettext (" %lu offset\n", " %lu offsets\n", rel_size
), rel_size
);
1523 for (i
= 0; i
< rel_size
; i
++)
1524 printf (format
, relrs
[i
]);
1531 if (rel_type
== reltype_rela
)
1534 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1536 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1541 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1543 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1548 if (rel_type
== reltype_rela
)
1551 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
1553 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1558 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1560 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1564 for (i
= 0; i
< rel_size
; i
++)
1569 bfd_vma symtab_index
;
1572 offset
= rels
[i
].r_offset
;
1573 inf
= rels
[i
].r_info
;
1575 type
= get_reloc_type (filedata
, inf
);
1576 symtab_index
= get_reloc_symindex (inf
);
1580 printf ("%8.8lx %8.8lx ",
1581 (unsigned long) offset
& 0xffffffff,
1582 (unsigned long) inf
& 0xffffffff);
1587 ? "%16.16" BFD_VMA_FMT
"x %16.16" BFD_VMA_FMT
"x "
1588 : "%12.12" BFD_VMA_FMT
"x %12.12" BFD_VMA_FMT
"x ",
1592 switch (filedata
->file_header
.e_machine
)
1599 rtype
= elf_aarch64_reloc_type (type
);
1603 case EM_CYGNUS_M32R
:
1604 rtype
= elf_m32r_reloc_type (type
);
1609 rtype
= elf_i386_reloc_type (type
);
1614 rtype
= elf_m68hc11_reloc_type (type
);
1618 rtype
= elf_s12z_reloc_type (type
);
1622 rtype
= elf_m68k_reloc_type (type
);
1626 rtype
= elf_i960_reloc_type (type
);
1631 rtype
= elf_avr_reloc_type (type
);
1634 case EM_OLD_SPARCV9
:
1635 case EM_SPARC32PLUS
:
1638 rtype
= elf_sparc_reloc_type (type
);
1642 rtype
= elf_spu_reloc_type (type
);
1646 rtype
= v800_reloc_type (type
);
1649 case EM_CYGNUS_V850
:
1650 rtype
= v850_reloc_type (type
);
1654 case EM_CYGNUS_D10V
:
1655 rtype
= elf_d10v_reloc_type (type
);
1659 case EM_CYGNUS_D30V
:
1660 rtype
= elf_d30v_reloc_type (type
);
1664 rtype
= elf_dlx_reloc_type (type
);
1668 rtype
= elf_sh_reloc_type (type
);
1672 case EM_CYGNUS_MN10300
:
1673 rtype
= elf_mn10300_reloc_type (type
);
1677 case EM_CYGNUS_MN10200
:
1678 rtype
= elf_mn10200_reloc_type (type
);
1682 case EM_CYGNUS_FR30
:
1683 rtype
= elf_fr30_reloc_type (type
);
1687 rtype
= elf_frv_reloc_type (type
);
1691 rtype
= elf_csky_reloc_type (type
);
1695 rtype
= elf_ft32_reloc_type (type
);
1699 rtype
= elf_mcore_reloc_type (type
);
1703 rtype
= elf_mmix_reloc_type (type
);
1707 rtype
= elf_moxie_reloc_type (type
);
1711 if (uses_msp430x_relocs (filedata
))
1713 rtype
= elf_msp430x_reloc_type (type
);
1718 rtype
= elf_msp430_reloc_type (type
);
1722 rtype
= elf_nds32_reloc_type (type
);
1726 rtype
= elf_ppc_reloc_type (type
);
1730 rtype
= elf_ppc64_reloc_type (type
);
1734 case EM_MIPS_RS3_LE
:
1735 rtype
= elf_mips_reloc_type (type
);
1739 rtype
= elf_riscv_reloc_type (type
);
1743 rtype
= elf_alpha_reloc_type (type
);
1747 rtype
= elf_arm_reloc_type (type
);
1751 case EM_ARC_COMPACT
:
1752 case EM_ARC_COMPACT2
:
1753 rtype
= elf_arc_reloc_type (type
);
1757 rtype
= elf_hppa_reloc_type (type
);
1763 rtype
= elf_h8_reloc_type (type
);
1767 rtype
= elf_or1k_reloc_type (type
);
1772 rtype
= elf_pj_reloc_type (type
);
1775 rtype
= elf_ia64_reloc_type (type
);
1779 rtype
= elf_cris_reloc_type (type
);
1783 rtype
= elf_i860_reloc_type (type
);
1789 rtype
= elf_x86_64_reloc_type (type
);
1793 rtype
= i370_reloc_type (type
);
1798 rtype
= elf_s390_reloc_type (type
);
1802 rtype
= elf_score_reloc_type (type
);
1806 rtype
= elf_xstormy16_reloc_type (type
);
1810 rtype
= elf_crx_reloc_type (type
);
1814 rtype
= elf_vax_reloc_type (type
);
1818 rtype
= elf_visium_reloc_type (type
);
1822 rtype
= elf_bpf_reloc_type (type
);
1825 case EM_ADAPTEVA_EPIPHANY
:
1826 rtype
= elf_epiphany_reloc_type (type
);
1831 rtype
= elf_ip2k_reloc_type (type
);
1835 rtype
= elf_iq2000_reloc_type (type
);
1840 rtype
= elf_xtensa_reloc_type (type
);
1843 case EM_LATTICEMICO32
:
1844 rtype
= elf_lm32_reloc_type (type
);
1849 rtype
= elf_m32c_reloc_type (type
);
1853 rtype
= elf_mt_reloc_type (type
);
1857 rtype
= elf_bfin_reloc_type (type
);
1861 rtype
= elf_mep_reloc_type (type
);
1865 rtype
= elf_cr16_reloc_type (type
);
1869 case EM_MICROBLAZE_OLD
:
1870 rtype
= elf_microblaze_reloc_type (type
);
1874 rtype
= elf_rl78_reloc_type (type
);
1878 rtype
= elf_rx_reloc_type (type
);
1882 rtype
= elf_metag_reloc_type (type
);
1887 rtype
= elf_xc16x_reloc_type (type
);
1891 rtype
= elf_tic6x_reloc_type (type
);
1895 rtype
= elf_tilegx_reloc_type (type
);
1899 rtype
= elf_tilepro_reloc_type (type
);
1902 case EM_WEBASSEMBLY
:
1903 rtype
= elf_wasm32_reloc_type (type
);
1907 rtype
= elf_xgate_reloc_type (type
);
1910 case EM_ALTERA_NIOS2
:
1911 rtype
= elf_nios2_reloc_type (type
);
1915 rtype
= elf_pru_reloc_type (type
);
1919 if (EF_NFP_MACH (filedata
->file_header
.e_flags
) == E_NFP_MACH_3200
)
1920 rtype
= elf_nfp3200_reloc_type (type
);
1922 rtype
= elf_nfp_reloc_type (type
);
1926 rtype
= elf_z80_reloc_type (type
);
1930 rtype
= elf_loongarch_reloc_type (type
);
1934 rtype
= elf_amdgpu_reloc_type (type
);
1939 printf (_("unrecognized: %-7lx"), (unsigned long) type
& 0xffffffff);
1941 printf (do_wide
? "%-22s" : "%-17.17s", rtype
);
1943 if (filedata
->file_header
.e_machine
== EM_ALPHA
1945 && streq (rtype
, "R_ALPHA_LITUSE")
1946 && rel_type
== reltype_rela
)
1948 switch (rels
[i
].r_addend
)
1950 case LITUSE_ALPHA_ADDR
: rtype
= "ADDR"; break;
1951 case LITUSE_ALPHA_BASE
: rtype
= "BASE"; break;
1952 case LITUSE_ALPHA_BYTOFF
: rtype
= "BYTOFF"; break;
1953 case LITUSE_ALPHA_JSR
: rtype
= "JSR"; break;
1954 case LITUSE_ALPHA_TLSGD
: rtype
= "TLSGD"; break;
1955 case LITUSE_ALPHA_TLSLDM
: rtype
= "TLSLDM"; break;
1956 case LITUSE_ALPHA_JSRDIRECT
: rtype
= "JSRDIRECT"; break;
1957 default: rtype
= NULL
;
1961 printf (" (%s)", rtype
);
1965 printf (_("<unknown addend: %lx>"),
1966 (unsigned long) rels
[i
].r_addend
);
1970 else if (symtab_index
)
1972 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1974 error (_(" bad symbol index: %08lx in reloc\n"),
1975 (unsigned long) symtab_index
);
1980 Elf_Internal_Sym
* psym
;
1981 const char * version_string
;
1982 enum versioned_symbol_info sym_info
;
1983 unsigned short vna_other
;
1985 psym
= symtab
+ symtab_index
;
1988 = get_symbol_version_string (filedata
, is_dynsym
,
1997 if (ELF_ST_TYPE (psym
->st_info
) == STT_GNU_IFUNC
)
2001 unsigned int width
= is_32bit_elf
? 8 : 14;
2003 /* Relocations against GNU_IFUNC symbols do not use the value
2004 of the symbol as the address to relocate against. Instead
2005 they invoke the function named by the symbol and use its
2006 result as the address for relocation.
2008 To indicate this to the user, do not display the value of
2009 the symbol in the "Symbols's Value" field. Instead show
2010 its name followed by () as a hint that the symbol is
2014 || psym
->st_name
== 0
2015 || psym
->st_name
>= strtablen
)
2018 name
= strtab
+ psym
->st_name
;
2020 len
= print_symbol (width
, name
);
2022 printf (sym_info
== symbol_public
? "@@%s" : "@%s",
2024 printf ("()%-*s", len
<= width
? (width
+ 1) - len
: 1, " ");
2028 print_vma (psym
->st_value
, LONG_HEX
);
2030 printf (is_32bit_elf
? " " : " ");
2033 if (psym
->st_name
== 0)
2035 const char * sec_name
= "<null>";
2038 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
2040 if (psym
->st_shndx
< filedata
->file_header
.e_shnum
2041 && filedata
->section_headers
!= NULL
)
2042 sec_name
= section_name_print (filedata
,
2043 filedata
->section_headers
2045 else if (psym
->st_shndx
== SHN_ABS
)
2047 else if (psym
->st_shndx
== SHN_COMMON
)
2048 sec_name
= "COMMON";
2049 else if ((filedata
->file_header
.e_machine
== EM_MIPS
2050 && psym
->st_shndx
== SHN_MIPS_SCOMMON
)
2051 || (filedata
->file_header
.e_machine
== EM_TI_C6000
2052 && psym
->st_shndx
== SHN_TIC6X_SCOMMON
))
2053 sec_name
= "SCOMMON";
2054 else if (filedata
->file_header
.e_machine
== EM_MIPS
2055 && psym
->st_shndx
== SHN_MIPS_SUNDEFINED
)
2056 sec_name
= "SUNDEF";
2057 else if ((filedata
->file_header
.e_machine
== EM_X86_64
2058 || filedata
->file_header
.e_machine
== EM_L1OM
2059 || filedata
->file_header
.e_machine
== EM_K1OM
)
2060 && psym
->st_shndx
== SHN_X86_64_LCOMMON
)
2061 sec_name
= "LARGE_COMMON";
2062 else if (filedata
->file_header
.e_machine
== EM_IA_64
2063 && filedata
->file_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
2064 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
2065 sec_name
= "ANSI_COM";
2066 else if (is_ia64_vms (filedata
)
2067 && psym
->st_shndx
== SHN_IA_64_VMS_SYMVEC
)
2068 sec_name
= "VMS_SYMVEC";
2071 sprintf (name_buf
, "<section 0x%x>",
2072 (unsigned int) psym
->st_shndx
);
2073 sec_name
= name_buf
;
2076 print_symbol (22, sec_name
);
2078 else if (strtab
== NULL
)
2079 printf (_("<string table index: %3ld>"), psym
->st_name
);
2080 else if (psym
->st_name
>= strtablen
)
2082 error (_("<corrupt string table index: %3ld>\n"),
2088 print_symbol (22, strtab
+ psym
->st_name
);
2090 printf (sym_info
== symbol_public
? "@@%s" : "@%s",
2094 if (rel_type
== reltype_rela
)
2096 bfd_vma off
= rels
[i
].r_addend
;
2098 if ((bfd_signed_vma
) off
< 0)
2099 printf (" - %" BFD_VMA_FMT
"x", - off
);
2101 printf (" + %" BFD_VMA_FMT
"x", off
);
2105 else if (rel_type
== reltype_rela
)
2107 bfd_vma off
= rels
[i
].r_addend
;
2109 printf ("%*c", is_32bit_elf
? 12 : 20, ' ');
2110 if ((bfd_signed_vma
) off
< 0)
2111 printf ("-%" BFD_VMA_FMT
"x", - off
);
2113 printf ("%" BFD_VMA_FMT
"x", off
);
2116 if (filedata
->file_header
.e_machine
== EM_SPARCV9
2118 && streq (rtype
, "R_SPARC_OLO10"))
2119 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf
));
2124 if (! is_32bit_elf
&& filedata
->file_header
.e_machine
== EM_MIPS
)
2126 bfd_vma type2
= ELF64_MIPS_R_TYPE2 (inf
);
2127 bfd_vma type3
= ELF64_MIPS_R_TYPE3 (inf
);
2128 const char * rtype2
= elf_mips_reloc_type (type2
);
2129 const char * rtype3
= elf_mips_reloc_type (type3
);
2131 printf (" Type2: ");
2134 printf (_("unrecognized: %-7lx"),
2135 (unsigned long) type2
& 0xffffffff);
2137 printf ("%-17.17s", rtype2
);
2139 printf ("\n Type3: ");
2142 printf (_("unrecognized: %-7lx"),
2143 (unsigned long) type3
& 0xffffffff);
2145 printf ("%-17.17s", rtype3
);
2158 get_aarch64_dynamic_type (unsigned long type
)
2162 case DT_AARCH64_BTI_PLT
: return "AARCH64_BTI_PLT";
2163 case DT_AARCH64_PAC_PLT
: return "AARCH64_PAC_PLT";
2164 case DT_AARCH64_VARIANT_PCS
: return "AARCH64_VARIANT_PCS";
2171 get_mips_dynamic_type (unsigned long type
)
2175 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
2176 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
2177 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
2178 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
2179 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
2180 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
2181 case DT_MIPS_MSYM
: return "MIPS_MSYM";
2182 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2183 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2184 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
2185 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
2186 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
2187 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
2188 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
2189 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
2190 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
2191 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
2192 case DT_MIPS_RLD_MAP_REL
: return "MIPS_RLD_MAP_REL";
2193 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
2194 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
2195 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
2196 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
2197 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
2198 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
2199 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
2200 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
2201 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
2202 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
2203 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
2204 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
2205 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2206 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
2207 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
2208 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
2209 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
2210 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2211 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
2212 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
2213 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
2214 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
2215 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
2216 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
2217 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
2218 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
2219 case DT_MIPS_PLTGOT
: return "MIPS_PLTGOT";
2220 case DT_MIPS_RWPLT
: return "MIPS_RWPLT";
2221 case DT_MIPS_XHASH
: return "MIPS_XHASH";
2228 get_sparc64_dynamic_type (unsigned long type
)
2232 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
2239 get_ppc_dynamic_type (unsigned long type
)
2243 case DT_PPC_GOT
: return "PPC_GOT";
2244 case DT_PPC_OPT
: return "PPC_OPT";
2251 get_ppc64_dynamic_type (unsigned long type
)
2255 case DT_PPC64_GLINK
: return "PPC64_GLINK";
2256 case DT_PPC64_OPD
: return "PPC64_OPD";
2257 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
2258 case DT_PPC64_OPT
: return "PPC64_OPT";
2265 get_parisc_dynamic_type (unsigned long type
)
2269 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
2270 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
2271 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
2272 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
2273 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
2274 case DT_HP_PREINIT
: return "HP_PREINIT";
2275 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
2276 case DT_HP_NEEDED
: return "HP_NEEDED";
2277 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
2278 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
2279 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
2280 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
2281 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
2282 case DT_HP_EPLTREL
: return "HP_GST_EPLTREL";
2283 case DT_HP_EPLTRELSZ
: return "HP_GST_EPLTRELSZ";
2284 case DT_HP_FILTERED
: return "HP_FILTERED";
2285 case DT_HP_FILTER_TLS
: return "HP_FILTER_TLS";
2286 case DT_HP_COMPAT_FILTERED
: return "HP_COMPAT_FILTERED";
2287 case DT_HP_LAZYLOAD
: return "HP_LAZYLOAD";
2288 case DT_HP_BIND_NOW_COUNT
: return "HP_BIND_NOW_COUNT";
2289 case DT_PLT
: return "PLT";
2290 case DT_PLT_SIZE
: return "PLT_SIZE";
2291 case DT_DLT
: return "DLT";
2292 case DT_DLT_SIZE
: return "DLT_SIZE";
2299 get_ia64_dynamic_type (unsigned long type
)
2303 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
2304 case DT_IA_64_VMS_SUBTYPE
: return "VMS_SUBTYPE";
2305 case DT_IA_64_VMS_IMGIOCNT
: return "VMS_IMGIOCNT";
2306 case DT_IA_64_VMS_LNKFLAGS
: return "VMS_LNKFLAGS";
2307 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ
: return "VMS_VIR_MEM_BLK_SIZ";
2308 case DT_IA_64_VMS_IDENT
: return "VMS_IDENT";
2309 case DT_IA_64_VMS_NEEDED_IDENT
: return "VMS_NEEDED_IDENT";
2310 case DT_IA_64_VMS_IMG_RELA_CNT
: return "VMS_IMG_RELA_CNT";
2311 case DT_IA_64_VMS_SEG_RELA_CNT
: return "VMS_SEG_RELA_CNT";
2312 case DT_IA_64_VMS_FIXUP_RELA_CNT
: return "VMS_FIXUP_RELA_CNT";
2313 case DT_IA_64_VMS_FIXUP_NEEDED
: return "VMS_FIXUP_NEEDED";
2314 case DT_IA_64_VMS_SYMVEC_CNT
: return "VMS_SYMVEC_CNT";
2315 case DT_IA_64_VMS_XLATED
: return "VMS_XLATED";
2316 case DT_IA_64_VMS_STACKSIZE
: return "VMS_STACKSIZE";
2317 case DT_IA_64_VMS_UNWINDSZ
: return "VMS_UNWINDSZ";
2318 case DT_IA_64_VMS_UNWIND_CODSEG
: return "VMS_UNWIND_CODSEG";
2319 case DT_IA_64_VMS_UNWIND_INFOSEG
: return "VMS_UNWIND_INFOSEG";
2320 case DT_IA_64_VMS_LINKTIME
: return "VMS_LINKTIME";
2321 case DT_IA_64_VMS_SEG_NO
: return "VMS_SEG_NO";
2322 case DT_IA_64_VMS_SYMVEC_OFFSET
: return "VMS_SYMVEC_OFFSET";
2323 case DT_IA_64_VMS_SYMVEC_SEG
: return "VMS_SYMVEC_SEG";
2324 case DT_IA_64_VMS_UNWIND_OFFSET
: return "VMS_UNWIND_OFFSET";
2325 case DT_IA_64_VMS_UNWIND_SEG
: return "VMS_UNWIND_SEG";
2326 case DT_IA_64_VMS_STRTAB_OFFSET
: return "VMS_STRTAB_OFFSET";
2327 case DT_IA_64_VMS_SYSVER_OFFSET
: return "VMS_SYSVER_OFFSET";
2328 case DT_IA_64_VMS_IMG_RELA_OFF
: return "VMS_IMG_RELA_OFF";
2329 case DT_IA_64_VMS_SEG_RELA_OFF
: return "VMS_SEG_RELA_OFF";
2330 case DT_IA_64_VMS_FIXUP_RELA_OFF
: return "VMS_FIXUP_RELA_OFF";
2331 case DT_IA_64_VMS_PLTGOT_OFFSET
: return "VMS_PLTGOT_OFFSET";
2332 case DT_IA_64_VMS_PLTGOT_SEG
: return "VMS_PLTGOT_SEG";
2333 case DT_IA_64_VMS_FPMODE
: return "VMS_FPMODE";
2340 get_solaris_section_type (unsigned long type
)
2344 case 0x6fffffee: return "SUNW_ancillary";
2345 case 0x6fffffef: return "SUNW_capchain";
2346 case 0x6ffffff0: return "SUNW_capinfo";
2347 case 0x6ffffff1: return "SUNW_symsort";
2348 case 0x6ffffff2: return "SUNW_tlssort";
2349 case 0x6ffffff3: return "SUNW_LDYNSYM";
2350 case 0x6ffffff4: return "SUNW_dof";
2351 case 0x6ffffff5: return "SUNW_cap";
2352 case 0x6ffffff6: return "SUNW_SIGNATURE";
2353 case 0x6ffffff7: return "SUNW_ANNOTATE";
2354 case 0x6ffffff8: return "SUNW_DEBUGSTR";
2355 case 0x6ffffff9: return "SUNW_DEBUG";
2356 case 0x6ffffffa: return "SUNW_move";
2357 case 0x6ffffffb: return "SUNW_COMDAT";
2358 case 0x6ffffffc: return "SUNW_syminfo";
2359 case 0x6ffffffd: return "SUNW_verdef";
2360 case 0x6ffffffe: return "SUNW_verneed";
2361 case 0x6fffffff: return "SUNW_versym";
2362 case 0x70000000: return "SPARC_GOTDATA";
2363 default: return NULL
;
2368 get_alpha_dynamic_type (unsigned long type
)
2372 case DT_ALPHA_PLTRO
: return "ALPHA_PLTRO";
2373 default: return NULL
;
2378 get_score_dynamic_type (unsigned long type
)
2382 case DT_SCORE_BASE_ADDRESS
: return "SCORE_BASE_ADDRESS";
2383 case DT_SCORE_LOCAL_GOTNO
: return "SCORE_LOCAL_GOTNO";
2384 case DT_SCORE_SYMTABNO
: return "SCORE_SYMTABNO";
2385 case DT_SCORE_GOTSYM
: return "SCORE_GOTSYM";
2386 case DT_SCORE_UNREFEXTNO
: return "SCORE_UNREFEXTNO";
2387 case DT_SCORE_HIPAGENO
: return "SCORE_HIPAGENO";
2388 default: return NULL
;
2393 get_tic6x_dynamic_type (unsigned long type
)
2397 case DT_C6000_GSYM_OFFSET
: return "C6000_GSYM_OFFSET";
2398 case DT_C6000_GSTR_OFFSET
: return "C6000_GSTR_OFFSET";
2399 case DT_C6000_DSBT_BASE
: return "C6000_DSBT_BASE";
2400 case DT_C6000_DSBT_SIZE
: return "C6000_DSBT_SIZE";
2401 case DT_C6000_PREEMPTMAP
: return "C6000_PREEMPTMAP";
2402 case DT_C6000_DSBT_INDEX
: return "C6000_DSBT_INDEX";
2403 default: return NULL
;
2408 get_nios2_dynamic_type (unsigned long type
)
2412 case DT_NIOS2_GP
: return "NIOS2_GP";
2413 default: return NULL
;
2418 get_solaris_dynamic_type (unsigned long type
)
2422 case 0x6000000d: return "SUNW_AUXILIARY";
2423 case 0x6000000e: return "SUNW_RTLDINF";
2424 case 0x6000000f: return "SUNW_FILTER";
2425 case 0x60000010: return "SUNW_CAP";
2426 case 0x60000011: return "SUNW_SYMTAB";
2427 case 0x60000012: return "SUNW_SYMSZ";
2428 case 0x60000013: return "SUNW_SORTENT";
2429 case 0x60000014: return "SUNW_SYMSORT";
2430 case 0x60000015: return "SUNW_SYMSORTSZ";
2431 case 0x60000016: return "SUNW_TLSSORT";
2432 case 0x60000017: return "SUNW_TLSSORTSZ";
2433 case 0x60000018: return "SUNW_CAPINFO";
2434 case 0x60000019: return "SUNW_STRPAD";
2435 case 0x6000001a: return "SUNW_CAPCHAIN";
2436 case 0x6000001b: return "SUNW_LDMACH";
2437 case 0x6000001d: return "SUNW_CAPCHAINENT";
2438 case 0x6000001f: return "SUNW_CAPCHAINSZ";
2439 case 0x60000021: return "SUNW_PARENT";
2440 case 0x60000023: return "SUNW_ASLR";
2441 case 0x60000025: return "SUNW_RELAX";
2442 case 0x60000029: return "SUNW_NXHEAP";
2443 case 0x6000002b: return "SUNW_NXSTACK";
2445 case 0x70000001: return "SPARC_REGISTER";
2446 case 0x7ffffffd: return "AUXILIARY";
2447 case 0x7ffffffe: return "USED";
2448 case 0x7fffffff: return "FILTER";
2450 default: return NULL
;
2455 get_riscv_dynamic_type (unsigned long type
)
2459 case DT_RISCV_VARIANT_CC
: return "RISCV_VARIANT_CC";
2466 get_dynamic_type (Filedata
* filedata
, unsigned long type
)
2468 static char buff
[64];
2472 case DT_NULL
: return "NULL";
2473 case DT_NEEDED
: return "NEEDED";
2474 case DT_PLTRELSZ
: return "PLTRELSZ";
2475 case DT_PLTGOT
: return "PLTGOT";
2476 case DT_HASH
: return "HASH";
2477 case DT_STRTAB
: return "STRTAB";
2478 case DT_SYMTAB
: return "SYMTAB";
2479 case DT_RELA
: return "RELA";
2480 case DT_RELASZ
: return "RELASZ";
2481 case DT_RELAENT
: return "RELAENT";
2482 case DT_STRSZ
: return "STRSZ";
2483 case DT_SYMENT
: return "SYMENT";
2484 case DT_INIT
: return "INIT";
2485 case DT_FINI
: return "FINI";
2486 case DT_SONAME
: return "SONAME";
2487 case DT_RPATH
: return "RPATH";
2488 case DT_SYMBOLIC
: return "SYMBOLIC";
2489 case DT_REL
: return "REL";
2490 case DT_RELSZ
: return "RELSZ";
2491 case DT_RELENT
: return "RELENT";
2492 case DT_RELR
: return "RELR";
2493 case DT_RELRSZ
: return "RELRSZ";
2494 case DT_RELRENT
: return "RELRENT";
2495 case DT_PLTREL
: return "PLTREL";
2496 case DT_DEBUG
: return "DEBUG";
2497 case DT_TEXTREL
: return "TEXTREL";
2498 case DT_JMPREL
: return "JMPREL";
2499 case DT_BIND_NOW
: return "BIND_NOW";
2500 case DT_INIT_ARRAY
: return "INIT_ARRAY";
2501 case DT_FINI_ARRAY
: return "FINI_ARRAY";
2502 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
2503 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
2504 case DT_RUNPATH
: return "RUNPATH";
2505 case DT_FLAGS
: return "FLAGS";
2507 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2508 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
2509 case DT_SYMTAB_SHNDX
: return "SYMTAB_SHNDX";
2511 case DT_CHECKSUM
: return "CHECKSUM";
2512 case DT_PLTPADSZ
: return "PLTPADSZ";
2513 case DT_MOVEENT
: return "MOVEENT";
2514 case DT_MOVESZ
: return "MOVESZ";
2515 case DT_FEATURE
: return "FEATURE";
2516 case DT_POSFLAG_1
: return "POSFLAG_1";
2517 case DT_SYMINSZ
: return "SYMINSZ";
2518 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
2520 case DT_ADDRRNGLO
: return "ADDRRNGLO";
2521 case DT_CONFIG
: return "CONFIG";
2522 case DT_DEPAUDIT
: return "DEPAUDIT";
2523 case DT_AUDIT
: return "AUDIT";
2524 case DT_PLTPAD
: return "PLTPAD";
2525 case DT_MOVETAB
: return "MOVETAB";
2526 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
2528 case DT_VERSYM
: return "VERSYM";
2530 case DT_TLSDESC_GOT
: return "TLSDESC_GOT";
2531 case DT_TLSDESC_PLT
: return "TLSDESC_PLT";
2532 case DT_RELACOUNT
: return "RELACOUNT";
2533 case DT_RELCOUNT
: return "RELCOUNT";
2534 case DT_FLAGS_1
: return "FLAGS_1";
2535 case DT_VERDEF
: return "VERDEF";
2536 case DT_VERDEFNUM
: return "VERDEFNUM";
2537 case DT_VERNEED
: return "VERNEED";
2538 case DT_VERNEEDNUM
: return "VERNEEDNUM";
2540 case DT_AUXILIARY
: return "AUXILIARY";
2541 case DT_USED
: return "USED";
2542 case DT_FILTER
: return "FILTER";
2544 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
2545 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
2546 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
2547 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
2548 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
2549 case DT_GNU_HASH
: return "GNU_HASH";
2550 case DT_GNU_FLAGS_1
: return "GNU_FLAGS_1";
2553 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
2555 const char * result
;
2557 switch (filedata
->file_header
.e_machine
)
2560 result
= get_aarch64_dynamic_type (type
);
2563 case EM_MIPS_RS3_LE
:
2564 result
= get_mips_dynamic_type (type
);
2567 result
= get_sparc64_dynamic_type (type
);
2570 result
= get_ppc_dynamic_type (type
);
2573 result
= get_ppc64_dynamic_type (type
);
2576 result
= get_ia64_dynamic_type (type
);
2579 result
= get_alpha_dynamic_type (type
);
2582 result
= get_score_dynamic_type (type
);
2585 result
= get_tic6x_dynamic_type (type
);
2587 case EM_ALTERA_NIOS2
:
2588 result
= get_nios2_dynamic_type (type
);
2591 result
= get_riscv_dynamic_type (type
);
2594 if (filedata
->file_header
.e_ident
[EI_OSABI
] == ELFOSABI_SOLARIS
)
2595 result
= get_solaris_dynamic_type (type
);
2604 snprintf (buff
, sizeof (buff
), _("Processor Specific: %lx"), type
);
2606 else if (((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
2607 || (filedata
->file_header
.e_machine
== EM_PARISC
2608 && (type
>= OLD_DT_LOOS
) && (type
<= OLD_DT_HIOS
)))
2610 const char * result
;
2612 switch (filedata
->file_header
.e_machine
)
2615 result
= get_parisc_dynamic_type (type
);
2618 result
= get_ia64_dynamic_type (type
);
2621 if (filedata
->file_header
.e_ident
[EI_OSABI
] == ELFOSABI_SOLARIS
)
2622 result
= get_solaris_dynamic_type (type
);
2631 snprintf (buff
, sizeof (buff
), _("Operating System specific: %lx"),
2635 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), type
);
2641 static bool get_program_headers (Filedata
*);
2642 static bool get_dynamic_section (Filedata
*);
2645 locate_dynamic_section (Filedata
*filedata
)
2647 unsigned long dynamic_addr
= 0;
2648 bfd_size_type dynamic_size
= 0;
2650 if (filedata
->file_header
.e_phnum
!= 0
2651 && get_program_headers (filedata
))
2653 Elf_Internal_Phdr
*segment
;
2656 for (i
= 0, segment
= filedata
->program_headers
;
2657 i
< filedata
->file_header
.e_phnum
;
2660 if (segment
->p_type
== PT_DYNAMIC
)
2662 dynamic_addr
= segment
->p_offset
;
2663 dynamic_size
= segment
->p_filesz
;
2665 if (filedata
->section_headers
!= NULL
)
2667 Elf_Internal_Shdr
*sec
;
2669 sec
= find_section (filedata
, ".dynamic");
2672 if (sec
->sh_size
== 0
2673 || sec
->sh_type
== SHT_NOBITS
)
2680 dynamic_addr
= sec
->sh_offset
;
2681 dynamic_size
= sec
->sh_size
;
2686 if (dynamic_addr
> filedata
->file_size
2687 || (dynamic_size
> filedata
->file_size
- dynamic_addr
))
2696 filedata
->dynamic_addr
= dynamic_addr
;
2697 filedata
->dynamic_size
= dynamic_size
? dynamic_size
: 1;
2701 is_pie (Filedata
*filedata
)
2703 Elf_Internal_Dyn
*entry
;
2705 if (filedata
->dynamic_size
== 0)
2706 locate_dynamic_section (filedata
);
2707 if (filedata
->dynamic_size
<= 1)
2710 if (!get_dynamic_section (filedata
))
2713 for (entry
= filedata
->dynamic_section
;
2714 entry
< filedata
->dynamic_section
+ filedata
->dynamic_nent
;
2717 if (entry
->d_tag
== DT_FLAGS_1
)
2719 if ((entry
->d_un
.d_val
& DF_1_PIE
) != 0)
2728 get_file_type (Filedata
*filedata
)
2730 unsigned e_type
= filedata
->file_header
.e_type
;
2731 static char buff
[64];
2735 case ET_NONE
: return _("NONE (None)");
2736 case ET_REL
: return _("REL (Relocatable file)");
2737 case ET_EXEC
: return _("EXEC (Executable file)");
2739 if (is_pie (filedata
))
2740 return _("DYN (Position-Independent Executable file)");
2742 return _("DYN (Shared object file)");
2743 case ET_CORE
: return _("CORE (Core file)");
2746 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
2747 snprintf (buff
, sizeof (buff
), _("Processor Specific: (%x)"), e_type
);
2748 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
2749 snprintf (buff
, sizeof (buff
), _("OS Specific: (%x)"), e_type
);
2751 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_type
);
2757 get_machine_name (unsigned e_machine
)
2759 static char buff
[64]; /* XXX */
2763 /* Please keep this switch table sorted by increasing EM_ value. */
2765 case EM_NONE
: return _("None");
2766 case EM_M32
: return "WE32100";
2767 case EM_SPARC
: return "Sparc";
2768 case EM_386
: return "Intel 80386";
2769 case EM_68K
: return "MC68000";
2770 case EM_88K
: return "MC88000";
2771 case EM_IAMCU
: return "Intel MCU";
2772 case EM_860
: return "Intel 80860";
2773 case EM_MIPS
: return "MIPS R3000";
2774 case EM_S370
: return "IBM System/370";
2776 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
2777 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
2778 case EM_PARISC
: return "HPPA";
2779 case EM_VPP550
: return "Fujitsu VPP500";
2780 case EM_SPARC32PLUS
: return "Sparc v8+" ;
2781 case EM_960
: return "Intel 80960";
2782 case EM_PPC
: return "PowerPC";
2784 case EM_PPC64
: return "PowerPC64";
2786 case EM_S390
: return "IBM S/390";
2787 case EM_SPU
: return "SPU";
2789 case EM_V800
: return "Renesas V850 (using RH850 ABI)";
2790 case EM_FR20
: return "Fujitsu FR20";
2791 case EM_RH32
: return "TRW RH32";
2792 case EM_MCORE
: return "MCORE";
2794 case EM_ARM
: return "ARM";
2795 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
2796 case EM_SH
: return "Renesas / SuperH SH";
2797 case EM_SPARCV9
: return "Sparc v9";
2798 case EM_TRICORE
: return "Siemens Tricore";
2799 case EM_ARC
: return "ARC";
2800 case EM_H8_300
: return "Renesas H8/300";
2801 case EM_H8_300H
: return "Renesas H8/300H";
2802 case EM_H8S
: return "Renesas H8S";
2803 case EM_H8_500
: return "Renesas H8/500";
2805 case EM_IA_64
: return "Intel IA-64";
2806 case EM_MIPS_X
: return "Stanford MIPS-X";
2807 case EM_COLDFIRE
: return "Motorola Coldfire";
2808 case EM_68HC12
: return "Motorola MC68HC12 Microcontroller";
2809 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
2810 case EM_PCP
: return "Siemens PCP";
2811 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
2812 case EM_NDR1
: return "Denso NDR1 microprocesspr";
2813 case EM_STARCORE
: return "Motorola Star*Core processor";
2814 case EM_ME16
: return "Toyota ME16 processor";
2816 case EM_ST100
: return "STMicroelectronics ST100 processor";
2817 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
2818 case EM_X86_64
: return "Advanced Micro Devices X86-64";
2819 case EM_PDSP
: return "Sony DSP processor";
2820 case EM_PDP10
: return "Digital Equipment Corp. PDP-10";
2821 case EM_PDP11
: return "Digital Equipment Corp. PDP-11";
2822 case EM_FX66
: return "Siemens FX66 microcontroller";
2823 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2824 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
2825 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
2827 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
2828 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
2829 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
2830 case EM_SVX
: return "Silicon Graphics SVx";
2831 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
2832 case EM_VAX
: return "Digital VAX";
2833 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
2834 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
2835 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
2836 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
2838 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
2839 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
2840 case EM_PRISM
: return "Vitesse Prism";
2842 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
2843 case EM_CYGNUS_FR30
:
2844 case EM_FR30
: return "Fujitsu FR30";
2845 case EM_CYGNUS_D10V
:
2846 case EM_D10V
: return "d10v";
2847 case EM_CYGNUS_D30V
:
2848 case EM_D30V
: return "d30v";
2849 case EM_CYGNUS_V850
:
2850 case EM_V850
: return "Renesas V850";
2851 case EM_CYGNUS_M32R
:
2852 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
2853 case EM_CYGNUS_MN10300
:
2854 case EM_MN10300
: return "mn10300";
2856 case EM_CYGNUS_MN10200
:
2857 case EM_MN10200
: return "mn10200";
2858 case EM_PJ
: return "picoJava";
2859 case EM_OR1K
: return "OpenRISC 1000";
2860 case EM_ARC_COMPACT
: return "ARCompact";
2862 case EM_XTENSA
: return "Tensilica Xtensa Processor";
2863 case EM_VIDEOCORE
: return "Alphamosaic VideoCore processor";
2864 case EM_TMM_GPP
: return "Thompson Multimedia General Purpose Processor";
2865 case EM_NS32K
: return "National Semiconductor 32000 series";
2866 case EM_TPC
: return "Tenor Network TPC processor";
2867 case EM_SNP1K
: return "Trebia SNP 1000 processor";
2869 case EM_ST200
: return "STMicroelectronics ST200 microcontroller";
2871 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
2872 case EM_MAX
: return "MAX Processor";
2873 case EM_CR
: return "National Semiconductor CompactRISC";
2874 case EM_F2MC16
: return "Fujitsu F2MC16";
2875 case EM_MSP430
: return "Texas Instruments msp430 microcontroller";
2876 case EM_BLACKFIN
: return "Analog Devices Blackfin";
2877 case EM_SE_C33
: return "S1C33 Family of Seiko Epson processors";
2878 case EM_SEP
: return "Sharp embedded microprocessor";
2879 case EM_ARCA
: return "Arca RISC microprocessor";
2881 case EM_UNICORE
: return "Unicore";
2882 case EM_EXCESS
: return "eXcess 16/32/64-bit configurable embedded CPU";
2883 case EM_DXP
: return "Icera Semiconductor Inc. Deep Execution Processor";
2884 case EM_ALTERA_NIOS2
: return "Altera Nios II";
2885 case EM_CRX
: return "National Semiconductor CRX microprocessor";
2886 case EM_XGATE
: return "Motorola XGATE embedded processor";
2888 case EM_XC16X
: return "Infineon Technologies xc16x";
2889 case EM_M16C
: return "Renesas M16C series microprocessors";
2890 case EM_DSPIC30F
: return "Microchip Technology dsPIC30F Digital Signal Controller";
2891 case EM_CE
: return "Freescale Communication Engine RISC core";
2893 case EM_M32C
: return "Renesas M32c";
2895 case EM_TSK3000
: return "Altium TSK3000 core";
2896 case EM_RS08
: return "Freescale RS08 embedded processor";
2897 case EM_ECOG2
: return "Cyan Technology eCOG2 microprocessor";
2898 case EM_SCORE
: return "SUNPLUS S+Core";
2899 case EM_DSP24
: return "New Japan Radio (NJR) 24-bit DSP Processor";
2900 case EM_VIDEOCORE3
: return "Broadcom VideoCore III processor";
2901 case EM_LATTICEMICO32
: return "Lattice Mico32";
2902 case EM_SE_C17
: return "Seiko Epson C17 family";
2904 case EM_TI_C6000
: return "Texas Instruments TMS320C6000 DSP family";
2905 case EM_TI_C2000
: return "Texas Instruments TMS320C2000 DSP family";
2906 case EM_TI_C5500
: return "Texas Instruments TMS320C55x DSP family";
2907 case EM_TI_PRU
: return "TI PRU I/O processor";
2909 case EM_MMDSP_PLUS
: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2910 case EM_CYPRESS_M8C
: return "Cypress M8C microprocessor";
2911 case EM_R32C
: return "Renesas R32C series microprocessors";
2912 case EM_TRIMEDIA
: return "NXP Semiconductors TriMedia architecture family";
2913 case EM_QDSP6
: return "QUALCOMM DSP6 Processor";
2914 case EM_8051
: return "Intel 8051 and variants";
2915 case EM_STXP7X
: return "STMicroelectronics STxP7x family";
2916 case EM_NDS32
: return "Andes Technology compact code size embedded RISC processor family";
2917 case EM_ECOG1X
: return "Cyan Technology eCOG1X family";
2918 case EM_MAXQ30
: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2920 case EM_XIMO16
: return "New Japan Radio (NJR) 16-bit DSP Processor";
2921 case EM_MANIK
: return "M2000 Reconfigurable RISC Microprocessor";
2922 case EM_CRAYNV2
: return "Cray Inc. NV2 vector architecture";
2923 case EM_RX
: return "Renesas RX";
2924 case EM_METAG
: return "Imagination Technologies Meta processor architecture";
2925 case EM_MCST_ELBRUS
: return "MCST Elbrus general purpose hardware architecture";
2926 case EM_ECOG16
: return "Cyan Technology eCOG16 family";
2929 case EM_MICROBLAZE_OLD
: return "Xilinx MicroBlaze";
2930 case EM_ETPU
: return "Freescale Extended Time Processing Unit";
2931 case EM_SLE9X
: return "Infineon Technologies SLE9X core";
2933 case EM_L1OM
: return "Intel L1OM";
2934 case EM_K1OM
: return "Intel K1OM";
2935 case EM_INTEL182
: return "Intel (reserved)";
2936 case EM_AARCH64
: return "AArch64";
2937 case EM_ARM184
: return "ARM (reserved)";
2938 case EM_AVR32
: return "Atmel Corporation 32-bit microprocessor";
2939 case EM_STM8
: return "STMicroeletronics STM8 8-bit microcontroller";
2940 case EM_TILE64
: return "Tilera TILE64 multicore architecture family";
2941 case EM_TILEPRO
: return "Tilera TILEPro multicore architecture family";
2943 case EM_CUDA
: return "NVIDIA CUDA architecture";
2944 case EM_TILEGX
: return "Tilera TILE-Gx multicore architecture family";
2945 case EM_CLOUDSHIELD
: return "CloudShield architecture family";
2946 case EM_COREA_1ST
: return "KIPO-KAIST Core-A 1st generation processor family";
2947 case EM_COREA_2ND
: return "KIPO-KAIST Core-A 2nd generation processor family";
2948 case EM_ARC_COMPACT2
: return "ARCv2";
2949 case EM_OPEN8
: return "Open8 8-bit RISC soft processor core";
2950 case EM_RL78
: return "Renesas RL78";
2951 case EM_VIDEOCORE5
: return "Broadcom VideoCore V processor";
2952 case EM_78K0R
: return "Renesas 78K0R";
2954 case EM_56800EX
: return "Freescale 56800EX Digital Signal Controller (DSC)";
2955 case EM_BA1
: return "Beyond BA1 CPU architecture";
2956 case EM_BA2
: return "Beyond BA2 CPU architecture";
2957 case EM_XCORE
: return "XMOS xCORE processor family";
2958 case EM_MCHP_PIC
: return "Microchip 8-bit PIC(r) family";
2959 case EM_INTELGT
: return "Intel Graphics Technology";
2961 case EM_KM32
: return "KM211 KM32 32-bit processor";
2962 case EM_KMX32
: return "KM211 KMX32 32-bit processor";
2963 case EM_KMX16
: return "KM211 KMX16 16-bit processor";
2964 case EM_KMX8
: return "KM211 KMX8 8-bit processor";
2965 case EM_KVARC
: return "KM211 KVARC processor";
2966 case EM_CDP
: return "Paneve CDP architecture family";
2967 case EM_COGE
: return "Cognitive Smart Memory Processor";
2968 case EM_COOL
: return "Bluechip Systems CoolEngine";
2969 case EM_NORC
: return "Nanoradio Optimized RISC";
2970 case EM_CSR_KALIMBA
: return "CSR Kalimba architecture family";
2972 case EM_Z80
: return "Zilog Z80";
2973 case EM_VISIUM
: return "CDS VISIUMcore processor";
2974 case EM_FT32
: return "FTDI Chip FT32";
2975 case EM_MOXIE
: return "Moxie";
2976 case EM_AMDGPU
: return "AMD GPU";
2977 /* 230 (all reserved) */
2979 case EM_RISCV
: return "RISC-V";
2980 case EM_LANAI
: return "Lanai 32-bit processor";
2981 case EM_CEVA
: return "CEVA Processor Architecture Family";
2982 case EM_CEVA_X2
: return "CEVA X2 Processor Family";
2983 case EM_BPF
: return "Linux BPF";
2984 case EM_GRAPHCORE_IPU
: return "Graphcore Intelligent Processing Unit";
2985 case EM_IMG1
: return "Imagination Technologies";
2987 case EM_NFP
: return "Netronome Flow Processor";
2988 case EM_VE
: return "NEC Vector Engine";
2989 case EM_CSKY
: return "C-SKY";
2990 case EM_ARC_COMPACT3_64
: return "Synopsys ARCv2.3 64-bit";
2991 case EM_MCS6502
: return "MOS Technology MCS 6502 processor";
2992 case EM_ARC_COMPACT3
: return "Synopsys ARCv2.3 32-bit";
2993 case EM_KVX
: return "Kalray VLIW core of the MPPA processor family";
2994 case EM_65816
: return "WDC 65816/65C816";
2995 case EM_LOONGARCH
: return "LoongArch";
2996 case EM_KF32
: return "ChipON KungFu32";
2998 /* Large numbers... */
2999 case EM_MT
: return "Morpho Techologies MT processor";
3000 case EM_ALPHA
: return "Alpha";
3001 case EM_WEBASSEMBLY
: return "Web Assembly";
3002 case EM_DLX
: return "OpenDLX";
3003 case EM_XSTORMY16
: return "Sanyo XStormy16 CPU core";
3004 case EM_IQ2000
: return "Vitesse IQ2000";
3006 case EM_NIOS32
: return "Altera Nios";
3007 case EM_CYGNUS_MEP
: return "Toshiba MeP Media Engine";
3008 case EM_ADAPTEVA_EPIPHANY
: return "Adapteva EPIPHANY";
3009 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
3010 case EM_S12Z
: return "Freescale S12Z";
3013 snprintf (buff
, sizeof (buff
), _("<unknown>: 0x%x"), e_machine
);
3019 decode_ARC_machine_flags (unsigned e_flags
, unsigned e_machine
, char buf
[])
3021 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
3022 other compilers don't specify an architecture type in the e_flags, and
3023 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
3024 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
3027 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
3028 but also sets a specific architecture type in the e_flags field.
3030 However, when decoding the flags we don't worry if we see an
3031 unexpected pairing, for example EM_ARC_COMPACT machine type, with
3032 ARCEM architecture type. */
3034 switch (e_flags
& EF_ARC_MACH_MSK
)
3036 /* We only expect these to occur for EM_ARC_COMPACT2. */
3037 case EF_ARC_CPU_ARCV2EM
:
3038 strcat (buf
, ", ARC EM");
3040 case EF_ARC_CPU_ARCV2HS
:
3041 strcat (buf
, ", ARC HS");
3044 /* We only expect these to occur for EM_ARC_COMPACT. */
3045 case E_ARC_MACH_ARC600
:
3046 strcat (buf
, ", ARC600");
3048 case E_ARC_MACH_ARC601
:
3049 strcat (buf
, ", ARC601");
3051 case E_ARC_MACH_ARC700
:
3052 strcat (buf
, ", ARC700");
3055 /* The only times we should end up here are (a) A corrupt ELF, (b) A
3056 new ELF with new architecture being read by an old version of
3057 readelf, or (c) An ELF built with non-GNU compiler that does not
3058 set the architecture in the e_flags. */
3060 if (e_machine
== EM_ARC_COMPACT
)
3061 strcat (buf
, ", Unknown ARCompact");
3063 strcat (buf
, ", Unknown ARC");
3067 switch (e_flags
& EF_ARC_OSABI_MSK
)
3069 case E_ARC_OSABI_ORIG
:
3070 strcat (buf
, ", (ABI:legacy)");
3072 case E_ARC_OSABI_V2
:
3073 strcat (buf
, ", (ABI:v2)");
3075 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
3076 case E_ARC_OSABI_V3
:
3077 strcat (buf
, ", v3 no-legacy-syscalls ABI");
3079 case E_ARC_OSABI_V4
:
3080 strcat (buf
, ", v4 ABI");
3083 strcat (buf
, ", unrecognised ARC OSABI flag");
3089 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
3092 bool unknown
= false;
3094 eabi
= EF_ARM_EABI_VERSION (e_flags
);
3095 e_flags
&= ~ EF_ARM_EABIMASK
;
3097 /* Handle "generic" ARM flags. */
3098 if (e_flags
& EF_ARM_RELEXEC
)
3100 strcat (buf
, ", relocatable executable");
3101 e_flags
&= ~ EF_ARM_RELEXEC
;
3104 if (e_flags
& EF_ARM_PIC
)
3106 strcat (buf
, ", position independent");
3107 e_flags
&= ~ EF_ARM_PIC
;
3110 /* Now handle EABI specific flags. */
3114 strcat (buf
, ", <unrecognized EABI>");
3119 case EF_ARM_EABI_VER1
:
3120 strcat (buf
, ", Version1 EABI");
3125 /* Process flags one bit at a time. */
3126 flag
= e_flags
& - e_flags
;
3131 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
3132 strcat (buf
, ", sorted symbol tables");
3142 case EF_ARM_EABI_VER2
:
3143 strcat (buf
, ", Version2 EABI");
3148 /* Process flags one bit at a time. */
3149 flag
= e_flags
& - e_flags
;
3154 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
3155 strcat (buf
, ", sorted symbol tables");
3158 case EF_ARM_DYNSYMSUSESEGIDX
:
3159 strcat (buf
, ", dynamic symbols use segment index");
3162 case EF_ARM_MAPSYMSFIRST
:
3163 strcat (buf
, ", mapping symbols precede others");
3173 case EF_ARM_EABI_VER3
:
3174 strcat (buf
, ", Version3 EABI");
3177 case EF_ARM_EABI_VER4
:
3178 strcat (buf
, ", Version4 EABI");
3183 /* Process flags one bit at a time. */
3184 flag
= e_flags
& - e_flags
;
3190 strcat (buf
, ", BE8");
3194 strcat (buf
, ", LE8");
3204 case EF_ARM_EABI_VER5
:
3205 strcat (buf
, ", Version5 EABI");
3210 /* Process flags one bit at a time. */
3211 flag
= e_flags
& - e_flags
;
3217 strcat (buf
, ", BE8");
3221 strcat (buf
, ", LE8");
3224 case EF_ARM_ABI_FLOAT_SOFT
: /* Conflicts with EF_ARM_SOFT_FLOAT. */
3225 strcat (buf
, ", soft-float ABI");
3228 case EF_ARM_ABI_FLOAT_HARD
: /* Conflicts with EF_ARM_VFP_FLOAT. */
3229 strcat (buf
, ", hard-float ABI");
3239 case EF_ARM_EABI_UNKNOWN
:
3240 strcat (buf
, ", GNU EABI");
3245 /* Process flags one bit at a time. */
3246 flag
= e_flags
& - e_flags
;
3251 case EF_ARM_INTERWORK
:
3252 strcat (buf
, ", interworking enabled");
3255 case EF_ARM_APCS_26
:
3256 strcat (buf
, ", uses APCS/26");
3259 case EF_ARM_APCS_FLOAT
:
3260 strcat (buf
, ", uses APCS/float");
3264 strcat (buf
, ", position independent");
3268 strcat (buf
, ", 8 bit structure alignment");
3271 case EF_ARM_NEW_ABI
:
3272 strcat (buf
, ", uses new ABI");
3275 case EF_ARM_OLD_ABI
:
3276 strcat (buf
, ", uses old ABI");
3279 case EF_ARM_SOFT_FLOAT
:
3280 strcat (buf
, ", software FP");
3283 case EF_ARM_VFP_FLOAT
:
3284 strcat (buf
, ", VFP");
3287 case EF_ARM_MAVERICK_FLOAT
:
3288 strcat (buf
, ", Maverick FP");
3299 strcat (buf
,_(", <unknown>"));
3303 decode_AVR_machine_flags (unsigned e_flags
, char buf
[], size_t size
)
3305 --size
; /* Leave space for null terminator. */
3307 switch (e_flags
& EF_AVR_MACH
)
3309 case E_AVR_MACH_AVR1
:
3310 strncat (buf
, ", avr:1", size
);
3312 case E_AVR_MACH_AVR2
:
3313 strncat (buf
, ", avr:2", size
);
3315 case E_AVR_MACH_AVR25
:
3316 strncat (buf
, ", avr:25", size
);
3318 case E_AVR_MACH_AVR3
:
3319 strncat (buf
, ", avr:3", size
);
3321 case E_AVR_MACH_AVR31
:
3322 strncat (buf
, ", avr:31", size
);
3324 case E_AVR_MACH_AVR35
:
3325 strncat (buf
, ", avr:35", size
);
3327 case E_AVR_MACH_AVR4
:
3328 strncat (buf
, ", avr:4", size
);
3330 case E_AVR_MACH_AVR5
:
3331 strncat (buf
, ", avr:5", size
);
3333 case E_AVR_MACH_AVR51
:
3334 strncat (buf
, ", avr:51", size
);
3336 case E_AVR_MACH_AVR6
:
3337 strncat (buf
, ", avr:6", size
);
3339 case E_AVR_MACH_AVRTINY
:
3340 strncat (buf
, ", avr:100", size
);
3342 case E_AVR_MACH_XMEGA1
:
3343 strncat (buf
, ", avr:101", size
);
3345 case E_AVR_MACH_XMEGA2
:
3346 strncat (buf
, ", avr:102", size
);
3348 case E_AVR_MACH_XMEGA3
:
3349 strncat (buf
, ", avr:103", size
);
3351 case E_AVR_MACH_XMEGA4
:
3352 strncat (buf
, ", avr:104", size
);
3354 case E_AVR_MACH_XMEGA5
:
3355 strncat (buf
, ", avr:105", size
);
3357 case E_AVR_MACH_XMEGA6
:
3358 strncat (buf
, ", avr:106", size
);
3360 case E_AVR_MACH_XMEGA7
:
3361 strncat (buf
, ", avr:107", size
);
3364 strncat (buf
, ", avr:<unknown>", size
);
3368 size
-= strlen (buf
);
3369 if (e_flags
& EF_AVR_LINKRELAX_PREPARED
)
3370 strncat (buf
, ", link-relax", size
);
3374 decode_NDS32_machine_flags (unsigned e_flags
, char buf
[], size_t size
)
3380 bool has_fpu
= false;
3383 static const char *ABI_STRINGS
[] =
3385 "ABI v0", /* use r5 as return register; only used in N1213HC */
3386 "ABI v1", /* use r0 as return register */
3387 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
3388 "ABI v2fp", /* for FPU */
3392 static const char *VER_STRINGS
[] =
3394 "Andes ELF V1.3 or older",
3398 static const char *ARCH_STRINGS
[] =
3407 abi
= EF_NDS_ABI
& e_flags
;
3408 arch
= EF_NDS_ARCH
& e_flags
;
3409 config
= EF_NDS_INST
& e_flags
;
3410 version
= EF_NDS32_ELF_VERSION
& e_flags
;
3412 memset (buf
, 0, size
);
3419 case E_NDS_ABI_V2FP
:
3420 case E_NDS_ABI_AABI
:
3421 case E_NDS_ABI_V2FP_PLUS
:
3422 /* In case there are holes in the array. */
3423 r
+= snprintf (buf
+ r
, size
- r
, ", %s", ABI_STRINGS
[abi
>> EF_NDS_ABI_SHIFT
]);
3427 r
+= snprintf (buf
+ r
, size
- r
, ", <unrecognized ABI>");
3433 case E_NDS32_ELF_VER_1_2
:
3434 case E_NDS32_ELF_VER_1_3
:
3435 case E_NDS32_ELF_VER_1_4
:
3436 r
+= snprintf (buf
+ r
, size
- r
, ", %s", VER_STRINGS
[version
>> EF_NDS32_ELF_VERSION_SHIFT
]);
3440 r
+= snprintf (buf
+ r
, size
- r
, ", <unrecognized ELF version number>");
3444 if (E_NDS_ABI_V0
== abi
)
3446 /* OLD ABI; only used in N1213HC, has performance extension 1. */
3447 r
+= snprintf (buf
+ r
, size
- r
, ", Andes Star v1.0, N1213HC, MAC, PERF1");
3448 if (arch
== E_NDS_ARCH_STAR_V1_0
)
3449 r
+= snprintf (buf
+ r
, size
-r
, ", 16b"); /* has 16-bit instructions */
3455 case E_NDS_ARCH_STAR_V1_0
:
3456 case E_NDS_ARCH_STAR_V2_0
:
3457 case E_NDS_ARCH_STAR_V3_0
:
3458 case E_NDS_ARCH_STAR_V3_M
:
3459 r
+= snprintf (buf
+ r
, size
- r
, ", %s", ARCH_STRINGS
[arch
>> EF_NDS_ARCH_SHIFT
]);
3463 r
+= snprintf (buf
+ r
, size
- r
, ", <unrecognized architecture>");
3464 /* ARCH version determines how the e_flags are interpreted.
3465 If it is unknown, we cannot proceed. */
3469 /* Newer ABI; Now handle architecture specific flags. */
3470 if (arch
== E_NDS_ARCH_STAR_V1_0
)
3472 if (config
& E_NDS32_HAS_MFUSR_PC_INST
)
3473 r
+= snprintf (buf
+ r
, size
-r
, ", MFUSR_PC");
3475 if (!(config
& E_NDS32_HAS_NO_MAC_INST
))
3476 r
+= snprintf (buf
+ r
, size
-r
, ", MAC");
3478 if (config
& E_NDS32_HAS_DIV_INST
)
3479 r
+= snprintf (buf
+ r
, size
-r
, ", DIV");
3481 if (config
& E_NDS32_HAS_16BIT_INST
)
3482 r
+= snprintf (buf
+ r
, size
-r
, ", 16b");
3486 if (config
& E_NDS32_HAS_MFUSR_PC_INST
)
3488 if (version
<= E_NDS32_ELF_VER_1_3
)
3489 r
+= snprintf (buf
+ r
, size
-r
, ", [B8]");
3491 r
+= snprintf (buf
+ r
, size
-r
, ", EX9");
3494 if (config
& E_NDS32_HAS_MAC_DX_INST
)
3495 r
+= snprintf (buf
+ r
, size
-r
, ", MAC_DX");
3497 if (config
& E_NDS32_HAS_DIV_DX_INST
)
3498 r
+= snprintf (buf
+ r
, size
-r
, ", DIV_DX");
3500 if (config
& E_NDS32_HAS_16BIT_INST
)
3502 if (version
<= E_NDS32_ELF_VER_1_3
)
3503 r
+= snprintf (buf
+ r
, size
-r
, ", 16b");
3505 r
+= snprintf (buf
+ r
, size
-r
, ", IFC");
3509 if (config
& E_NDS32_HAS_EXT_INST
)
3510 r
+= snprintf (buf
+ r
, size
-r
, ", PERF1");
3512 if (config
& E_NDS32_HAS_EXT2_INST
)
3513 r
+= snprintf (buf
+ r
, size
-r
, ", PERF2");
3515 if (config
& E_NDS32_HAS_FPU_INST
)
3518 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_SP");
3521 if (config
& E_NDS32_HAS_FPU_DP_INST
)
3524 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_DP");
3527 if (config
& E_NDS32_HAS_FPU_MAC_INST
)
3530 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_MAC");
3535 switch ((config
& E_NDS32_FPU_REG_CONF
) >> E_NDS32_FPU_REG_CONF_SHIFT
)
3537 case E_NDS32_FPU_REG_8SP_4DP
:
3538 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_REG:8/4");
3540 case E_NDS32_FPU_REG_16SP_8DP
:
3541 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_REG:16/8");
3543 case E_NDS32_FPU_REG_32SP_16DP
:
3544 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_REG:32/16");
3546 case E_NDS32_FPU_REG_32SP_32DP
:
3547 r
+= snprintf (buf
+ r
, size
-r
, ", FPU_REG:32/32");
3552 if (config
& E_NDS32_HAS_AUDIO_INST
)
3553 r
+= snprintf (buf
+ r
, size
-r
, ", AUDIO");
3555 if (config
& E_NDS32_HAS_STRING_INST
)
3556 r
+= snprintf (buf
+ r
, size
-r
, ", STR");
3558 if (config
& E_NDS32_HAS_REDUCED_REGS
)
3559 r
+= snprintf (buf
+ r
, size
-r
, ", 16REG");
3561 if (config
& E_NDS32_HAS_VIDEO_INST
)
3563 if (version
<= E_NDS32_ELF_VER_1_3
)
3564 r
+= snprintf (buf
+ r
, size
-r
, ", VIDEO");
3566 r
+= snprintf (buf
+ r
, size
-r
, ", SATURATION");
3569 if (config
& E_NDS32_HAS_ENCRIPT_INST
)
3570 r
+= snprintf (buf
+ r
, size
-r
, ", ENCRP");
3572 if (config
& E_NDS32_HAS_L2C_INST
)
3573 r
+= snprintf (buf
+ r
, size
-r
, ", L2C");
3577 decode_AMDGPU_machine_flags (Filedata
*filedata
, unsigned int e_flags
,
3580 unsigned char *e_ident
= filedata
->file_header
.e_ident
;
3581 unsigned char osabi
= e_ident
[EI_OSABI
];
3582 unsigned char abiversion
= e_ident
[EI_ABIVERSION
];
3585 /* HSA OS ABI v2 used a different encoding, but we don't need to support it,
3586 it has been deprecated for a while.
3588 The PAL, MESA3D and NONE OS ABIs are not properly versioned, at the time
3589 of writing, they use the same flags as HSA v3, so the code below uses that
3591 if (osabi
== ELFOSABI_AMDGPU_HSA
&& abiversion
< ELFABIVERSION_AMDGPU_HSA_V3
)
3594 mach
= e_flags
& EF_AMDGPU_MACH
;
3597 #define AMDGPU_CASE(code, string) \
3598 case code: strcat (buf, ", " string); break;
3599 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX600
, "gfx600")
3600 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX601
, "gfx601")
3601 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX700
, "gfx700")
3602 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX701
, "gfx701")
3603 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX702
, "gfx702")
3604 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX703
, "gfx703")
3605 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX704
, "gfx704")
3606 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX801
, "gfx801")
3607 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX802
, "gfx802")
3608 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX803
, "gfx803")
3609 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX810
, "gfx810")
3610 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX900
, "gfx900")
3611 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX902
, "gfx902")
3612 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX904
, "gfx904")
3613 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX906
, "gfx906")
3614 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX908
, "gfx908")
3615 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX909
, "gfx909")
3616 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX90C
, "gfx90c")
3617 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX1010
, "gfx1010")
3618 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX1011
, "gfx1011")
3619 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX1012
, "gfx1012")
3620 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX1030
, "gfx1030")
3621 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX1031
, "gfx1031")
3622 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX1032
, "gfx1032")
3623 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX1033
, "gfx1033")
3624 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX602
, "gfx602")
3625 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX705
, "gfx705")
3626 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX805
, "gfx805")
3627 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX1035
, "gfx1035")
3628 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX1034
, "gfx1034")
3629 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX90A
, "gfx90a")
3630 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX940
, "gfx940")
3631 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX1013
, "gfx1013")
3632 AMDGPU_CASE (EF_AMDGPU_MACH_AMDGCN_GFX1036
, "gfx1036")
3634 sprintf (buf
, _(", <unknown AMDGPU GPU type: %#x>"), mach
);
3639 buf
+= strlen (buf
);
3640 e_flags
&= ~EF_AMDGPU_MACH
;
3642 if ((osabi
== ELFOSABI_AMDGPU_HSA
3643 && abiversion
== ELFABIVERSION_AMDGPU_HSA_V3
)
3644 || osabi
!= ELFOSABI_AMDGPU_HSA
)
3646 /* For HSA v3 and other OS ABIs. */
3647 if (e_flags
& EF_AMDGPU_FEATURE_XNACK_V3
)
3649 strcat (buf
, ", xnack on");
3650 buf
+= strlen (buf
);
3651 e_flags
&= ~EF_AMDGPU_FEATURE_XNACK_V3
;
3654 if (e_flags
& EF_AMDGPU_FEATURE_SRAMECC_V3
)
3656 strcat (buf
, ", sramecc on");
3657 buf
+= strlen (buf
);
3658 e_flags
&= ~EF_AMDGPU_FEATURE_SRAMECC_V3
;
3666 xnack
= e_flags
& EF_AMDGPU_FEATURE_XNACK_V4
;
3669 case EF_AMDGPU_FEATURE_XNACK_UNSUPPORTED_V4
:
3672 case EF_AMDGPU_FEATURE_XNACK_ANY_V4
:
3673 strcat (buf
, ", xnack any");
3676 case EF_AMDGPU_FEATURE_XNACK_OFF_V4
:
3677 strcat (buf
, ", xnack off");
3680 case EF_AMDGPU_FEATURE_XNACK_ON_V4
:
3681 strcat (buf
, ", xnack on");
3685 sprintf (buf
, _(", <unknown xnack value: %#x>"), xnack
);
3689 buf
+= strlen (buf
);
3690 e_flags
&= ~EF_AMDGPU_FEATURE_XNACK_V4
;
3692 sramecc
= e_flags
& EF_AMDGPU_FEATURE_SRAMECC_V4
;
3695 case EF_AMDGPU_FEATURE_SRAMECC_UNSUPPORTED_V4
:
3698 case EF_AMDGPU_FEATURE_SRAMECC_ANY_V4
:
3699 strcat (buf
, ", sramecc any");
3702 case EF_AMDGPU_FEATURE_SRAMECC_OFF_V4
:
3703 strcat (buf
, ", sramecc off");
3706 case EF_AMDGPU_FEATURE_SRAMECC_ON_V4
:
3707 strcat (buf
, ", sramecc on");
3711 sprintf (buf
, _(", <unknown sramecc value: %#x>"), sramecc
);
3715 buf
+= strlen (buf
);
3716 e_flags
&= ~EF_AMDGPU_FEATURE_SRAMECC_V4
;
3720 sprintf (buf
, _(", unknown flags bits: %#x"), e_flags
);
3724 get_machine_flags (Filedata
* filedata
, unsigned e_flags
, unsigned e_machine
)
3726 static char buf
[1024];
3737 case EM_ARC_COMPACT2
:
3738 case EM_ARC_COMPACT
:
3739 decode_ARC_machine_flags (e_flags
, e_machine
, buf
);
3743 decode_ARM_machine_flags (e_flags
, buf
);
3747 decode_AVR_machine_flags (e_flags
, buf
, sizeof buf
);
3751 if (e_flags
& EF_BFIN_PIC
)
3752 strcat (buf
, ", PIC");
3754 if (e_flags
& EF_BFIN_FDPIC
)
3755 strcat (buf
, ", FDPIC");
3757 if (e_flags
& EF_BFIN_CODE_IN_L1
)
3758 strcat (buf
, ", code in L1");
3760 if (e_flags
& EF_BFIN_DATA_IN_L1
)
3761 strcat (buf
, ", data in L1");
3766 switch (e_flags
& EF_FRV_CPU_MASK
)
3768 case EF_FRV_CPU_GENERIC
:
3772 strcat (buf
, ", fr???");
3775 case EF_FRV_CPU_FR300
:
3776 strcat (buf
, ", fr300");
3779 case EF_FRV_CPU_FR400
:
3780 strcat (buf
, ", fr400");
3782 case EF_FRV_CPU_FR405
:
3783 strcat (buf
, ", fr405");
3786 case EF_FRV_CPU_FR450
:
3787 strcat (buf
, ", fr450");
3790 case EF_FRV_CPU_FR500
:
3791 strcat (buf
, ", fr500");
3793 case EF_FRV_CPU_FR550
:
3794 strcat (buf
, ", fr550");
3797 case EF_FRV_CPU_SIMPLE
:
3798 strcat (buf
, ", simple");
3800 case EF_FRV_CPU_TOMCAT
:
3801 strcat (buf
, ", tomcat");
3807 if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_M68000
)
3808 strcat (buf
, ", m68000");
3809 else if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_CPU32
)
3810 strcat (buf
, ", cpu32");
3811 else if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_FIDO
)
3812 strcat (buf
, ", fido_a");
3815 char const * isa
= _("unknown");
3816 char const * mac
= _("unknown mac");
3817 char const * additional
= NULL
;
3819 switch (e_flags
& EF_M68K_CF_ISA_MASK
)
3821 case EF_M68K_CF_ISA_A_NODIV
:
3823 additional
= ", nodiv";
3825 case EF_M68K_CF_ISA_A
:
3828 case EF_M68K_CF_ISA_A_PLUS
:
3831 case EF_M68K_CF_ISA_B_NOUSP
:
3833 additional
= ", nousp";
3835 case EF_M68K_CF_ISA_B
:
3838 case EF_M68K_CF_ISA_C
:
3841 case EF_M68K_CF_ISA_C_NODIV
:
3843 additional
= ", nodiv";
3846 strcat (buf
, ", cf, isa ");
3849 strcat (buf
, additional
);
3850 if (e_flags
& EF_M68K_CF_FLOAT
)
3851 strcat (buf
, ", float");
3852 switch (e_flags
& EF_M68K_CF_MAC_MASK
)
3857 case EF_M68K_CF_MAC
:
3860 case EF_M68K_CF_EMAC
:
3863 case EF_M68K_CF_EMAC_B
:
3876 decode_AMDGPU_machine_flags (filedata
, e_flags
, buf
);
3880 switch (e_flags
& EF_MEP_CPU_MASK
)
3882 case EF_MEP_CPU_MEP
: strcat (buf
, ", generic MeP"); break;
3883 case EF_MEP_CPU_C2
: strcat (buf
, ", MeP C2"); break;
3884 case EF_MEP_CPU_C3
: strcat (buf
, ", MeP C3"); break;
3885 case EF_MEP_CPU_C4
: strcat (buf
, ", MeP C4"); break;
3886 case EF_MEP_CPU_C5
: strcat (buf
, ", MeP C5"); break;
3887 case EF_MEP_CPU_H1
: strcat (buf
, ", MeP H1"); break;
3888 default: strcat (buf
, _(", <unknown MeP cpu type>")); break;
3891 switch (e_flags
& EF_MEP_COP_MASK
)
3893 case EF_MEP_COP_NONE
: break;
3894 case EF_MEP_COP_AVC
: strcat (buf
, ", AVC coprocessor"); break;
3895 case EF_MEP_COP_AVC2
: strcat (buf
, ", AVC2 coprocessor"); break;
3896 case EF_MEP_COP_FMAX
: strcat (buf
, ", FMAX coprocessor"); break;
3897 case EF_MEP_COP_IVC2
: strcat (buf
, ", IVC2 coprocessor"); break;
3898 default: strcat (buf
, _("<unknown MeP copro type>")); break;
3901 if (e_flags
& EF_MEP_LIBRARY
)
3902 strcat (buf
, ", Built for Library");
3904 if (e_flags
& EF_MEP_INDEX_MASK
)
3905 sprintf (buf
+ strlen (buf
), ", Configuration Index: %#x",
3906 e_flags
& EF_MEP_INDEX_MASK
);
3908 if (e_flags
& ~ EF_MEP_ALL_FLAGS
)
3909 sprintf (buf
+ strlen (buf
), _(", unknown flags bits: %#x"),
3910 e_flags
& ~ EF_MEP_ALL_FLAGS
);
3914 if (e_flags
& EF_PPC_EMB
)
3915 strcat (buf
, ", emb");
3917 if (e_flags
& EF_PPC_RELOCATABLE
)
3918 strcat (buf
, _(", relocatable"));
3920 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
3921 strcat (buf
, _(", relocatable-lib"));
3925 if (e_flags
& EF_PPC64_ABI
)
3927 char abi
[] = ", abiv0";
3929 abi
[6] += e_flags
& EF_PPC64_ABI
;
3935 if ((e_flags
& EF_RH850_ABI
) == EF_RH850_ABI
)
3936 strcat (buf
, ", RH850 ABI");
3938 if (e_flags
& EF_V800_850E3
)
3939 strcat (buf
, ", V3 architecture");
3941 if ((e_flags
& (EF_RH850_FPU_DOUBLE
| EF_RH850_FPU_SINGLE
)) == 0)
3942 strcat (buf
, ", FPU not used");
3944 if ((e_flags
& (EF_RH850_REGMODE22
| EF_RH850_REGMODE32
)) == 0)
3945 strcat (buf
, ", regmode: COMMON");
3947 if ((e_flags
& (EF_RH850_GP_FIX
| EF_RH850_GP_NOFIX
)) == 0)
3948 strcat (buf
, ", r4 not used");
3950 if ((e_flags
& (EF_RH850_EP_FIX
| EF_RH850_EP_NOFIX
)) == 0)
3951 strcat (buf
, ", r30 not used");
3953 if ((e_flags
& (EF_RH850_TP_FIX
| EF_RH850_TP_NOFIX
)) == 0)
3954 strcat (buf
, ", r5 not used");
3956 if ((e_flags
& (EF_RH850_REG2_RESERVE
| EF_RH850_REG2_NORESERVE
)) == 0)
3957 strcat (buf
, ", r2 not used");
3959 for (e_flags
&= 0xFFFF; e_flags
; e_flags
&= ~ (e_flags
& - e_flags
))
3961 switch (e_flags
& - e_flags
)
3963 case EF_RH850_FPU_DOUBLE
: strcat (buf
, ", double precision FPU"); break;
3964 case EF_RH850_FPU_SINGLE
: strcat (buf
, ", single precision FPU"); break;
3965 case EF_RH850_REGMODE22
: strcat (buf
, ", regmode:22"); break;
3966 case EF_RH850_REGMODE32
: strcat (buf
, ", regmode:23"); break;
3967 case EF_RH850_GP_FIX
: strcat (buf
, ", r4 fixed"); break;
3968 case EF_RH850_GP_NOFIX
: strcat (buf
, ", r4 free"); break;
3969 case EF_RH850_EP_FIX
: strcat (buf
, ", r30 fixed"); break;
3970 case EF_RH850_EP_NOFIX
: strcat (buf
, ", r30 free"); break;
3971 case EF_RH850_TP_FIX
: strcat (buf
, ", r5 fixed"); break;
3972 case EF_RH850_TP_NOFIX
: strcat (buf
, ", r5 free"); break;
3973 case EF_RH850_REG2_RESERVE
: strcat (buf
, ", r2 fixed"); break;
3974 case EF_RH850_REG2_NORESERVE
: strcat (buf
, ", r2 free"); break;
3981 case EM_CYGNUS_V850
:
3982 switch (e_flags
& EF_V850_ARCH
)
3984 case E_V850E3V5_ARCH
:
3985 strcat (buf
, ", v850e3v5");
3987 case E_V850E2V3_ARCH
:
3988 strcat (buf
, ", v850e2v3");
3991 strcat (buf
, ", v850e2");
3994 strcat (buf
, ", v850e1");
3997 strcat (buf
, ", v850e");
4000 strcat (buf
, ", v850");
4003 strcat (buf
, _(", unknown v850 architecture variant"));
4009 case EM_CYGNUS_M32R
:
4010 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
4011 strcat (buf
, ", m32r");
4015 case EM_MIPS_RS3_LE
:
4016 if (e_flags
& EF_MIPS_NOREORDER
)
4017 strcat (buf
, ", noreorder");
4019 if (e_flags
& EF_MIPS_PIC
)
4020 strcat (buf
, ", pic");
4022 if (e_flags
& EF_MIPS_CPIC
)
4023 strcat (buf
, ", cpic");
4025 if (e_flags
& EF_MIPS_UCODE
)
4026 strcat (buf
, ", ugen_reserved");
4028 if (e_flags
& EF_MIPS_ABI2
)
4029 strcat (buf
, ", abi2");
4031 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
4032 strcat (buf
, ", odk first");
4034 if (e_flags
& EF_MIPS_32BITMODE
)
4035 strcat (buf
, ", 32bitmode");
4037 if (e_flags
& EF_MIPS_NAN2008
)
4038 strcat (buf
, ", nan2008");
4040 if (e_flags
& EF_MIPS_FP64
)
4041 strcat (buf
, ", fp64");
4043 switch ((e_flags
& EF_MIPS_MACH
))
4045 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
4046 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
4047 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
4048 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
4049 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
4050 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
4051 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
4052 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
4053 case E_MIPS_MACH_5900
: strcat (buf
, ", 5900"); break;
4054 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
4055 case E_MIPS_MACH_9000
: strcat (buf
, ", 9000"); break;
4056 case E_MIPS_MACH_LS2E
: strcat (buf
, ", loongson-2e"); break;
4057 case E_MIPS_MACH_LS2F
: strcat (buf
, ", loongson-2f"); break;
4058 case E_MIPS_MACH_GS464
: strcat (buf
, ", gs464"); break;
4059 case E_MIPS_MACH_GS464E
: strcat (buf
, ", gs464e"); break;
4060 case E_MIPS_MACH_GS264E
: strcat (buf
, ", gs264e"); break;
4061 case E_MIPS_MACH_OCTEON
: strcat (buf
, ", octeon"); break;
4062 case E_MIPS_MACH_OCTEON2
: strcat (buf
, ", octeon2"); break;
4063 case E_MIPS_MACH_OCTEON3
: strcat (buf
, ", octeon3"); break;
4064 case E_MIPS_MACH_XLR
: strcat (buf
, ", xlr"); break;
4065 case E_MIPS_MACH_IAMR2
: strcat (buf
, ", interaptiv-mr2"); break;
4067 /* We simply ignore the field in this case to avoid confusion:
4068 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
4071 default: strcat (buf
, _(", unknown CPU")); break;
4074 switch ((e_flags
& EF_MIPS_ABI
))
4076 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
4077 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
4078 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
4079 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
4081 /* We simply ignore the field in this case to avoid confusion:
4082 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
4083 This means it is likely to be an o32 file, but not for
4086 default: strcat (buf
, _(", unknown ABI")); break;
4089 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
4090 strcat (buf
, ", mdmx");
4092 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
4093 strcat (buf
, ", mips16");
4095 if (e_flags
& EF_MIPS_ARCH_ASE_MICROMIPS
)
4096 strcat (buf
, ", micromips");
4098 switch ((e_flags
& EF_MIPS_ARCH
))
4100 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
4101 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
4102 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
4103 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
4104 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
4105 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
4106 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
4107 case E_MIPS_ARCH_32R6
: strcat (buf
, ", mips32r6"); break;
4108 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
4109 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
4110 case E_MIPS_ARCH_64R6
: strcat (buf
, ", mips64r6"); break;
4111 default: strcat (buf
, _(", unknown ISA")); break;
4116 decode_NDS32_machine_flags (e_flags
, buf
, sizeof buf
);
4120 switch (EF_NFP_MACH (e_flags
))
4122 case E_NFP_MACH_3200
:
4123 strcat (buf
, ", NFP-32xx");
4125 case E_NFP_MACH_6000
:
4126 strcat (buf
, ", NFP-6xxx");
4132 if (e_flags
& EF_RISCV_RVC
)
4133 strcat (buf
, ", RVC");
4135 if (e_flags
& EF_RISCV_RVE
)
4136 strcat (buf
, ", RVE");
4138 switch (e_flags
& EF_RISCV_FLOAT_ABI
)
4140 case EF_RISCV_FLOAT_ABI_SOFT
:
4141 strcat (buf
, ", soft-float ABI");
4144 case EF_RISCV_FLOAT_ABI_SINGLE
:
4145 strcat (buf
, ", single-float ABI");
4148 case EF_RISCV_FLOAT_ABI_DOUBLE
:
4149 strcat (buf
, ", double-float ABI");
4152 case EF_RISCV_FLOAT_ABI_QUAD
:
4153 strcat (buf
, ", quad-float ABI");
4159 switch ((e_flags
& EF_SH_MACH_MASK
))
4161 case EF_SH1
: strcat (buf
, ", sh1"); break;
4162 case EF_SH2
: strcat (buf
, ", sh2"); break;
4163 case EF_SH3
: strcat (buf
, ", sh3"); break;
4164 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
4165 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
4166 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
4167 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
4168 case EF_SH4
: strcat (buf
, ", sh4"); break;
4169 case EF_SH5
: strcat (buf
, ", sh5"); break;
4170 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
4171 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
4172 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
4173 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
4174 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
4175 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
4176 case EF_SH3_NOMMU
: strcat (buf
, ", sh3-nommu"); break;
4177 case EF_SH4_NOMMU_NOFPU
: strcat (buf
, ", sh4-nommu-nofpu"); break;
4178 case EF_SH2A_SH4_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
4179 case EF_SH2A_SH3_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh3-nommu"); break;
4180 case EF_SH2A_SH4
: strcat (buf
, ", sh2a-or-sh4"); break;
4181 case EF_SH2A_SH3E
: strcat (buf
, ", sh2a-or-sh3e"); break;
4182 default: strcat (buf
, _(", unknown ISA")); break;
4185 if (e_flags
& EF_SH_PIC
)
4186 strcat (buf
, ", pic");
4188 if (e_flags
& EF_SH_FDPIC
)
4189 strcat (buf
, ", fdpic");
4193 if (e_flags
& EF_OR1K_NODELAY
)
4194 strcat (buf
, ", no delay");
4198 if (e_flags
& EF_SPARC_32PLUS
)
4199 strcat (buf
, ", v8+");
4201 if (e_flags
& EF_SPARC_SUN_US1
)
4202 strcat (buf
, ", ultrasparcI");
4204 if (e_flags
& EF_SPARC_SUN_US3
)
4205 strcat (buf
, ", ultrasparcIII");
4207 if (e_flags
& EF_SPARC_HAL_R1
)
4208 strcat (buf
, ", halr1");
4210 if (e_flags
& EF_SPARC_LEDATA
)
4211 strcat (buf
, ", ledata");
4213 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
4214 strcat (buf
, ", tso");
4216 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
4217 strcat (buf
, ", pso");
4219 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
4220 strcat (buf
, ", rmo");
4224 switch (e_flags
& EF_PARISC_ARCH
)
4226 case EFA_PARISC_1_0
:
4227 strcpy (buf
, ", PA-RISC 1.0");
4229 case EFA_PARISC_1_1
:
4230 strcpy (buf
, ", PA-RISC 1.1");
4232 case EFA_PARISC_2_0
:
4233 strcpy (buf
, ", PA-RISC 2.0");
4238 if (e_flags
& EF_PARISC_TRAPNIL
)
4239 strcat (buf
, ", trapnil");
4240 if (e_flags
& EF_PARISC_EXT
)
4241 strcat (buf
, ", ext");
4242 if (e_flags
& EF_PARISC_LSB
)
4243 strcat (buf
, ", lsb");
4244 if (e_flags
& EF_PARISC_WIDE
)
4245 strcat (buf
, ", wide");
4246 if (e_flags
& EF_PARISC_NO_KABP
)
4247 strcat (buf
, ", no kabp");
4248 if (e_flags
& EF_PARISC_LAZYSWAP
)
4249 strcat (buf
, ", lazyswap");
4254 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
4255 strcat (buf
, ", new calling convention");
4257 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
4258 strcat (buf
, ", gnu calling convention");
4262 if ((e_flags
& EF_IA_64_ABI64
))
4263 strcat (buf
, ", 64-bit");
4265 strcat (buf
, ", 32-bit");
4266 if ((e_flags
& EF_IA_64_REDUCEDFP
))
4267 strcat (buf
, ", reduced fp model");
4268 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
4269 strcat (buf
, ", no function descriptors, constant gp");
4270 else if ((e_flags
& EF_IA_64_CONS_GP
))
4271 strcat (buf
, ", constant gp");
4272 if ((e_flags
& EF_IA_64_ABSOLUTE
))
4273 strcat (buf
, ", absolute");
4274 if (filedata
->file_header
.e_ident
[EI_OSABI
] == ELFOSABI_OPENVMS
)
4276 if ((e_flags
& EF_IA_64_VMS_LINKAGES
))
4277 strcat (buf
, ", vms_linkages");
4278 switch ((e_flags
& EF_IA_64_VMS_COMCOD
))
4280 case EF_IA_64_VMS_COMCOD_SUCCESS
:
4282 case EF_IA_64_VMS_COMCOD_WARNING
:
4283 strcat (buf
, ", warning");
4285 case EF_IA_64_VMS_COMCOD_ERROR
:
4286 strcat (buf
, ", error");
4288 case EF_IA_64_VMS_COMCOD_ABORT
:
4289 strcat (buf
, ", abort");
4292 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
4293 e_flags
& EF_IA_64_VMS_COMCOD
);
4294 strcat (buf
, ", <unknown>");
4300 if ((e_flags
& EF_VAX_NONPIC
))
4301 strcat (buf
, ", non-PIC");
4302 if ((e_flags
& EF_VAX_DFLOAT
))
4303 strcat (buf
, ", D-Float");
4304 if ((e_flags
& EF_VAX_GFLOAT
))
4305 strcat (buf
, ", G-Float");
4309 if (e_flags
& EF_VISIUM_ARCH_MCM
)
4310 strcat (buf
, ", mcm");
4311 else if (e_flags
& EF_VISIUM_ARCH_MCM24
)
4312 strcat (buf
, ", mcm24");
4313 if (e_flags
& EF_VISIUM_ARCH_GR6
)
4314 strcat (buf
, ", gr6");
4318 switch (e_flags
& E_FLAG_RL78_CPU_MASK
)
4320 case E_FLAG_RL78_ANY_CPU
: break;
4321 case E_FLAG_RL78_G10
: strcat (buf
, ", G10"); break;
4322 case E_FLAG_RL78_G13
: strcat (buf
, ", G13"); break;
4323 case E_FLAG_RL78_G14
: strcat (buf
, ", G14"); break;
4325 if (e_flags
& E_FLAG_RL78_64BIT_DOUBLES
)
4326 strcat (buf
, ", 64-bit doubles");
4330 if (e_flags
& E_FLAG_RX_64BIT_DOUBLES
)
4331 strcat (buf
, ", 64-bit doubles");
4332 if (e_flags
& E_FLAG_RX_DSP
)
4333 strcat (buf
, ", dsp");
4334 if (e_flags
& E_FLAG_RX_PID
)
4335 strcat (buf
, ", pid");
4336 if (e_flags
& E_FLAG_RX_ABI
)
4337 strcat (buf
, ", RX ABI");
4338 if (e_flags
& E_FLAG_RX_SINSNS_SET
)
4339 strcat (buf
, e_flags
& E_FLAG_RX_SINSNS_YES
4340 ? ", uses String instructions" : ", bans String instructions");
4341 if (e_flags
& E_FLAG_RX_V2
)
4342 strcat (buf
, ", V2");
4343 if (e_flags
& E_FLAG_RX_V3
)
4344 strcat (buf
, ", V3");
4348 if (e_flags
& EF_S390_HIGH_GPRS
)
4349 strcat (buf
, ", highgprs");
4353 if ((e_flags
& EF_C6000_REL
))
4354 strcat (buf
, ", relocatable module");
4358 strcat (buf
, _(": architecture variant: "));
4359 switch (e_flags
& EF_MSP430_MACH
)
4361 case E_MSP430_MACH_MSP430x11
: strcat (buf
, "MSP430x11"); break;
4362 case E_MSP430_MACH_MSP430x11x1
: strcat (buf
, "MSP430x11x1 "); break;
4363 case E_MSP430_MACH_MSP430x12
: strcat (buf
, "MSP430x12"); break;
4364 case E_MSP430_MACH_MSP430x13
: strcat (buf
, "MSP430x13"); break;
4365 case E_MSP430_MACH_MSP430x14
: strcat (buf
, "MSP430x14"); break;
4366 case E_MSP430_MACH_MSP430x15
: strcat (buf
, "MSP430x15"); break;
4367 case E_MSP430_MACH_MSP430x16
: strcat (buf
, "MSP430x16"); break;
4368 case E_MSP430_MACH_MSP430x31
: strcat (buf
, "MSP430x31"); break;
4369 case E_MSP430_MACH_MSP430x32
: strcat (buf
, "MSP430x32"); break;
4370 case E_MSP430_MACH_MSP430x33
: strcat (buf
, "MSP430x33"); break;
4371 case E_MSP430_MACH_MSP430x41
: strcat (buf
, "MSP430x41"); break;
4372 case E_MSP430_MACH_MSP430x42
: strcat (buf
, "MSP430x42"); break;
4373 case E_MSP430_MACH_MSP430x43
: strcat (buf
, "MSP430x43"); break;
4374 case E_MSP430_MACH_MSP430x44
: strcat (buf
, "MSP430x44"); break;
4375 case E_MSP430_MACH_MSP430X
: strcat (buf
, "MSP430X"); break;
4377 strcat (buf
, _(": unknown")); break;
4380 if (e_flags
& ~ EF_MSP430_MACH
)
4381 strcat (buf
, _(": unknown extra flag bits also present"));
4385 switch (e_flags
& EF_Z80_MACH_MSK
)
4387 case EF_Z80_MACH_Z80
: strcat (buf
, ", Z80"); break;
4388 case EF_Z80_MACH_Z180
: strcat (buf
, ", Z180"); break;
4389 case EF_Z80_MACH_R800
: strcat (buf
, ", R800"); break;
4390 case EF_Z80_MACH_EZ80_Z80
: strcat (buf
, ", EZ80"); break;
4391 case EF_Z80_MACH_EZ80_ADL
: strcat (buf
, ", EZ80, ADL"); break;
4392 case EF_Z80_MACH_GBZ80
: strcat (buf
, ", GBZ80"); break;
4393 case EF_Z80_MACH_Z80N
: strcat (buf
, ", Z80N"); break;
4395 strcat (buf
, _(", unknown")); break;
4399 if (EF_LOONGARCH_IS_LP64 (e_flags
))
4400 strcat (buf
, ", LP64");
4401 else if (EF_LOONGARCH_IS_ILP32 (e_flags
))
4402 strcat (buf
, ", ILP32");
4404 if (EF_LOONGARCH_IS_SOFT_FLOAT (e_flags
))
4405 strcat (buf
, ", SOFT-FLOAT");
4406 else if (EF_LOONGARCH_IS_SINGLE_FLOAT (e_flags
))
4407 strcat (buf
, ", SINGLE-FLOAT");
4408 else if (EF_LOONGARCH_IS_DOUBLE_FLOAT (e_flags
))
4409 strcat (buf
, ", DOUBLE-FLOAT");
4419 get_osabi_name (Filedata
* filedata
, unsigned int osabi
)
4421 static char buff
[32];
4425 case ELFOSABI_NONE
: return "UNIX - System V";
4426 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
4427 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
4428 case ELFOSABI_GNU
: return "UNIX - GNU";
4429 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
4430 case ELFOSABI_AIX
: return "UNIX - AIX";
4431 case ELFOSABI_IRIX
: return "UNIX - IRIX";
4432 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
4433 case ELFOSABI_TRU64
: return "UNIX - TRU64";
4434 case ELFOSABI_MODESTO
: return "Novell - Modesto";
4435 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
4436 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
4437 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
4438 case ELFOSABI_AROS
: return "AROS";
4439 case ELFOSABI_FENIXOS
: return "FenixOS";
4440 case ELFOSABI_CLOUDABI
: return "Nuxi CloudABI";
4441 case ELFOSABI_OPENVOS
: return "Stratus Technologies OpenVOS";
4444 switch (filedata
->file_header
.e_machine
)
4449 case ELFOSABI_AMDGPU_HSA
: return "AMD HSA";
4450 case ELFOSABI_AMDGPU_PAL
: return "AMD PAL";
4451 case ELFOSABI_AMDGPU_MESA3D
: return "AMD Mesa3D";
4460 case ELFOSABI_ARM
: return "ARM";
4461 case ELFOSABI_ARM_FDPIC
: return "ARM FDPIC";
4472 case ELFOSABI_STANDALONE
: return _("Standalone App");
4481 case ELFOSABI_C6000_ELFABI
: return _("Bare-metal C6000");
4482 case ELFOSABI_C6000_LINUX
: return "Linux C6000";
4491 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), osabi
);
4497 get_aarch64_segment_type (unsigned long type
)
4501 case PT_AARCH64_ARCHEXT
: return "AARCH64_ARCHEXT";
4502 default: return NULL
;
4507 get_arm_segment_type (unsigned long type
)
4511 case PT_ARM_EXIDX
: return "EXIDX";
4512 default: return NULL
;
4517 get_s390_segment_type (unsigned long type
)
4521 case PT_S390_PGSTE
: return "S390_PGSTE";
4522 default: return NULL
;
4527 get_mips_segment_type (unsigned long type
)
4531 case PT_MIPS_REGINFO
: return "REGINFO";
4532 case PT_MIPS_RTPROC
: return "RTPROC";
4533 case PT_MIPS_OPTIONS
: return "OPTIONS";
4534 case PT_MIPS_ABIFLAGS
: return "ABIFLAGS";
4535 default: return NULL
;
4540 get_parisc_segment_type (unsigned long type
)
4544 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
4545 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
4546 case PT_PARISC_WEAKORDER
: return "PARISC_WEAKORDER";
4547 default: return NULL
;
4552 get_ia64_segment_type (unsigned long type
)
4556 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
4557 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
4558 default: return NULL
;
4563 get_tic6x_segment_type (unsigned long type
)
4567 case PT_C6000_PHATTR
: return "C6000_PHATTR";
4568 default: return NULL
;
4573 get_riscv_segment_type (unsigned long type
)
4577 case PT_RISCV_ATTRIBUTES
: return "RISCV_ATTRIBUTES";
4578 default: return NULL
;
4583 get_hpux_segment_type (unsigned long type
, unsigned e_machine
)
4585 if (e_machine
== EM_PARISC
)
4588 case PT_HP_TLS
: return "HP_TLS";
4589 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
4590 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
4591 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
4592 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
4593 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
4594 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
4595 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
4596 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
4597 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
4598 case PT_HP_PARALLEL
: return "HP_PARALLEL";
4599 case PT_HP_FASTBIND
: return "HP_FASTBIND";
4600 case PT_HP_OPT_ANNOT
: return "HP_OPT_ANNOT";
4601 case PT_HP_HSL_ANNOT
: return "HP_HSL_ANNOT";
4602 case PT_HP_STACK
: return "HP_STACK";
4603 case PT_HP_CORE_UTSNAME
: return "HP_CORE_UTSNAME";
4604 default: return NULL
;
4607 if (e_machine
== EM_IA_64
)
4610 case PT_HP_TLS
: return "HP_TLS";
4611 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
4612 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
4613 case PT_IA_64_HP_STACK
: return "HP_STACK";
4614 default: return NULL
;
4621 get_solaris_segment_type (unsigned long type
)
4625 case 0x6464e550: return "PT_SUNW_UNWIND";
4626 case 0x6474e550: return "PT_SUNW_EH_FRAME";
4627 case 0x6ffffff7: return "PT_LOSUNW";
4628 case 0x6ffffffa: return "PT_SUNWBSS";
4629 case 0x6ffffffb: return "PT_SUNWSTACK";
4630 case 0x6ffffffc: return "PT_SUNWDTRACE";
4631 case 0x6ffffffd: return "PT_SUNWCAP";
4632 case 0x6fffffff: return "PT_HISUNW";
4633 default: return NULL
;
4638 get_segment_type (Filedata
* filedata
, unsigned long p_type
)
4640 static char buff
[32];
4644 case PT_NULL
: return "NULL";
4645 case PT_LOAD
: return "LOAD";
4646 case PT_DYNAMIC
: return "DYNAMIC";
4647 case PT_INTERP
: return "INTERP";
4648 case PT_NOTE
: return "NOTE";
4649 case PT_SHLIB
: return "SHLIB";
4650 case PT_PHDR
: return "PHDR";
4651 case PT_TLS
: return "TLS";
4652 case PT_GNU_EH_FRAME
: return "GNU_EH_FRAME";
4653 case PT_GNU_STACK
: return "GNU_STACK";
4654 case PT_GNU_RELRO
: return "GNU_RELRO";
4655 case PT_GNU_PROPERTY
: return "GNU_PROPERTY";
4657 case PT_OPENBSD_RANDOMIZE
: return "OPENBSD_RANDOMIZE";
4658 case PT_OPENBSD_WXNEEDED
: return "OPENBSD_WXNEEDED";
4659 case PT_OPENBSD_BOOTDATA
: return "OPENBSD_BOOTDATA";
4662 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
4664 const char * result
;
4666 switch (filedata
->file_header
.e_machine
)
4669 result
= get_aarch64_segment_type (p_type
);
4672 result
= get_arm_segment_type (p_type
);
4675 case EM_MIPS_RS3_LE
:
4676 result
= get_mips_segment_type (p_type
);
4679 result
= get_parisc_segment_type (p_type
);
4682 result
= get_ia64_segment_type (p_type
);
4685 result
= get_tic6x_segment_type (p_type
);
4689 result
= get_s390_segment_type (p_type
);
4692 result
= get_riscv_segment_type (p_type
);
4702 sprintf (buff
, "LOPROC+%#lx", p_type
- PT_LOPROC
);
4704 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
4706 const char * result
= NULL
;
4708 switch (filedata
->file_header
.e_ident
[EI_OSABI
])
4711 case ELFOSABI_FREEBSD
:
4712 if (p_type
>= PT_GNU_MBIND_LO
&& p_type
<= PT_GNU_MBIND_HI
)
4714 sprintf (buff
, "GNU_MBIND+%#lx", p_type
- PT_GNU_MBIND_LO
);
4719 result
= get_hpux_segment_type (p_type
,
4720 filedata
->file_header
.e_machine
);
4722 case ELFOSABI_SOLARIS
:
4723 result
= get_solaris_segment_type (p_type
);
4731 sprintf (buff
, "LOOS+%#lx", p_type
- PT_LOOS
);
4734 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), p_type
);
4741 get_arc_section_type_name (unsigned int sh_type
)
4745 case SHT_ARC_ATTRIBUTES
: return "ARC_ATTRIBUTES";
4753 get_mips_section_type_name (unsigned int sh_type
)
4757 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
4758 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
4759 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
4760 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
4761 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
4762 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
4763 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
4764 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
4765 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
4766 case SHT_MIPS_RELD
: return "MIPS_RELD";
4767 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
4768 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
4769 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
4770 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
4771 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
4772 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
4773 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
4774 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
4775 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
4776 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
4777 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
4778 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
4779 case SHT_MIPS_LINE
: return "MIPS_LINE";
4780 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
4781 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
4782 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
4783 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
4784 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
4785 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
4786 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
4787 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
4788 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
4789 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
4790 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
4791 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
4792 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
4793 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
4794 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
4795 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
4796 case SHT_MIPS_ABIFLAGS
: return "MIPS_ABIFLAGS";
4797 case SHT_MIPS_XHASH
: return "MIPS_XHASH";
4805 get_parisc_section_type_name (unsigned int sh_type
)
4809 case SHT_PARISC_EXT
: return "PARISC_EXT";
4810 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
4811 case SHT_PARISC_DOC
: return "PARISC_DOC";
4812 case SHT_PARISC_ANNOT
: return "PARISC_ANNOT";
4813 case SHT_PARISC_SYMEXTN
: return "PARISC_SYMEXTN";
4814 case SHT_PARISC_STUBS
: return "PARISC_STUBS";
4815 case SHT_PARISC_DLKM
: return "PARISC_DLKM";
4816 default: return NULL
;
4821 get_ia64_section_type_name (Filedata
* filedata
, unsigned int sh_type
)
4823 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
4824 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
4825 return get_osabi_name (filedata
, (sh_type
& 0x00FF0000) >> 16);
4829 case SHT_IA_64_EXT
: return "IA_64_EXT";
4830 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
4831 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
4832 case SHT_IA_64_VMS_TRACE
: return "VMS_TRACE";
4833 case SHT_IA_64_VMS_TIE_SIGNATURES
: return "VMS_TIE_SIGNATURES";
4834 case SHT_IA_64_VMS_DEBUG
: return "VMS_DEBUG";
4835 case SHT_IA_64_VMS_DEBUG_STR
: return "VMS_DEBUG_STR";
4836 case SHT_IA_64_VMS_LINKAGES
: return "VMS_LINKAGES";
4837 case SHT_IA_64_VMS_SYMBOL_VECTOR
: return "VMS_SYMBOL_VECTOR";
4838 case SHT_IA_64_VMS_FIXUP
: return "VMS_FIXUP";
4846 get_x86_64_section_type_name (unsigned int sh_type
)
4850 case SHT_X86_64_UNWIND
: return "X86_64_UNWIND";
4851 default: return NULL
;
4856 get_aarch64_section_type_name (unsigned int sh_type
)
4860 case SHT_AARCH64_ATTRIBUTES
: return "AARCH64_ATTRIBUTES";
4861 default: return NULL
;
4866 get_arm_section_type_name (unsigned int sh_type
)
4870 case SHT_ARM_EXIDX
: return "ARM_EXIDX";
4871 case SHT_ARM_PREEMPTMAP
: return "ARM_PREEMPTMAP";
4872 case SHT_ARM_ATTRIBUTES
: return "ARM_ATTRIBUTES";
4873 case SHT_ARM_DEBUGOVERLAY
: return "ARM_DEBUGOVERLAY";
4874 case SHT_ARM_OVERLAYSECTION
: return "ARM_OVERLAYSECTION";
4875 default: return NULL
;
4880 get_tic6x_section_type_name (unsigned int sh_type
)
4884 case SHT_C6000_UNWIND
: return "C6000_UNWIND";
4885 case SHT_C6000_PREEMPTMAP
: return "C6000_PREEMPTMAP";
4886 case SHT_C6000_ATTRIBUTES
: return "C6000_ATTRIBUTES";
4887 case SHT_TI_ICODE
: return "TI_ICODE";
4888 case SHT_TI_XREF
: return "TI_XREF";
4889 case SHT_TI_HANDLER
: return "TI_HANDLER";
4890 case SHT_TI_INITINFO
: return "TI_INITINFO";
4891 case SHT_TI_PHATTRS
: return "TI_PHATTRS";
4892 default: return NULL
;
4897 get_msp430_section_type_name (unsigned int sh_type
)
4901 case SHT_MSP430_SEC_FLAGS
: return "MSP430_SEC_FLAGS";
4902 case SHT_MSP430_SYM_ALIASES
: return "MSP430_SYM_ALIASES";
4903 case SHT_MSP430_ATTRIBUTES
: return "MSP430_ATTRIBUTES";
4904 default: return NULL
;
4909 get_nfp_section_type_name (unsigned int sh_type
)
4913 case SHT_NFP_MECONFIG
: return "NFP_MECONFIG";
4914 case SHT_NFP_INITREG
: return "NFP_INITREG";
4915 case SHT_NFP_UDEBUG
: return "NFP_UDEBUG";
4916 default: return NULL
;
4921 get_v850_section_type_name (unsigned int sh_type
)
4925 case SHT_V850_SCOMMON
: return "V850 Small Common";
4926 case SHT_V850_TCOMMON
: return "V850 Tiny Common";
4927 case SHT_V850_ZCOMMON
: return "V850 Zero Common";
4928 case SHT_RENESAS_IOP
: return "RENESAS IOP";
4929 case SHT_RENESAS_INFO
: return "RENESAS INFO";
4930 default: return NULL
;
4935 get_riscv_section_type_name (unsigned int sh_type
)
4939 case SHT_RISCV_ATTRIBUTES
: return "RISCV_ATTRIBUTES";
4940 default: return NULL
;
4945 get_csky_section_type_name (unsigned int sh_type
)
4949 case SHT_CSKY_ATTRIBUTES
: return "CSKY_ATTRIBUTES";
4950 default: return NULL
;
4955 get_section_type_name (Filedata
* filedata
, unsigned int sh_type
)
4957 static char buff
[32];
4958 const char * result
;
4962 case SHT_NULL
: return "NULL";
4963 case SHT_PROGBITS
: return "PROGBITS";
4964 case SHT_SYMTAB
: return "SYMTAB";
4965 case SHT_STRTAB
: return "STRTAB";
4966 case SHT_RELA
: return "RELA";
4967 case SHT_RELR
: return "RELR";
4968 case SHT_HASH
: return "HASH";
4969 case SHT_DYNAMIC
: return "DYNAMIC";
4970 case SHT_NOTE
: return "NOTE";
4971 case SHT_NOBITS
: return "NOBITS";
4972 case SHT_REL
: return "REL";
4973 case SHT_SHLIB
: return "SHLIB";
4974 case SHT_DYNSYM
: return "DYNSYM";
4975 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
4976 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
4977 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
4978 case SHT_GNU_HASH
: return "GNU_HASH";
4979 case SHT_GROUP
: return "GROUP";
4980 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICES";
4981 case SHT_GNU_verdef
: return "VERDEF";
4982 case SHT_GNU_verneed
: return "VERNEED";
4983 case SHT_GNU_versym
: return "VERSYM";
4984 case 0x6ffffff0: return "VERSYM";
4985 case 0x6ffffffc: return "VERDEF";
4986 case 0x7ffffffd: return "AUXILIARY";
4987 case 0x7fffffff: return "FILTER";
4988 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
4991 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
4993 switch (filedata
->file_header
.e_machine
)
4996 case EM_ARC_COMPACT
:
4997 case EM_ARC_COMPACT2
:
4998 result
= get_arc_section_type_name (sh_type
);
5001 case EM_MIPS_RS3_LE
:
5002 result
= get_mips_section_type_name (sh_type
);
5005 result
= get_parisc_section_type_name (sh_type
);
5008 result
= get_ia64_section_type_name (filedata
, sh_type
);
5013 result
= get_x86_64_section_type_name (sh_type
);
5016 result
= get_aarch64_section_type_name (sh_type
);
5019 result
= get_arm_section_type_name (sh_type
);
5022 result
= get_tic6x_section_type_name (sh_type
);
5025 result
= get_msp430_section_type_name (sh_type
);
5028 result
= get_nfp_section_type_name (sh_type
);
5032 case EM_CYGNUS_V850
:
5033 result
= get_v850_section_type_name (sh_type
);
5036 result
= get_riscv_section_type_name (sh_type
);
5039 result
= get_csky_section_type_name (sh_type
);
5049 sprintf (buff
, "LOPROC+%#x", sh_type
- SHT_LOPROC
);
5051 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
5053 switch (filedata
->file_header
.e_machine
)
5056 result
= get_ia64_section_type_name (filedata
, sh_type
);
5059 if (filedata
->file_header
.e_ident
[EI_OSABI
] == ELFOSABI_SOLARIS
)
5060 result
= get_solaris_section_type (sh_type
);
5065 case SHT_GNU_INCREMENTAL_INPUTS
: result
= "GNU_INCREMENTAL_INPUTS"; break;
5066 case SHT_GNU_ATTRIBUTES
: result
= "GNU_ATTRIBUTES"; break;
5067 case SHT_GNU_HASH
: result
= "GNU_HASH"; break;
5068 case SHT_GNU_LIBLIST
: result
= "GNU_LIBLIST"; break;
5080 sprintf (buff
, "LOOS+%#x", sh_type
- SHT_LOOS
);
5082 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
5084 switch (filedata
->file_header
.e_machine
)
5088 case EM_CYGNUS_V850
:
5089 result
= get_v850_section_type_name (sh_type
);
5099 sprintf (buff
, "LOUSER+%#x", sh_type
- SHT_LOUSER
);
5102 /* This message is probably going to be displayed in a 15
5103 character wide field, so put the hex value first. */
5104 snprintf (buff
, sizeof (buff
), _("%08x: <unknown>"), sh_type
);
5110 enum long_option_values
5112 OPTION_DEBUG_DUMP
= 512,
5122 OPTION_WITH_SYMBOL_VERSIONS
,
5123 OPTION_RECURSE_LIMIT
,
5124 OPTION_NO_RECURSE_LIMIT
,
5125 OPTION_NO_DEMANGLING
,
5129 static struct option options
[] =
5131 /* Note - This table is alpha-sorted on the 'val'
5132 field in order to make adding new options easier. */
5133 {"arch-specific", no_argument
, 0, 'A'},
5134 {"all", no_argument
, 0, 'a'},
5135 {"demangle", optional_argument
, 0, 'C'},
5136 {"archive-index", no_argument
, 0, 'c'},
5137 {"use-dynamic", no_argument
, 0, 'D'},
5138 {"dynamic", no_argument
, 0, 'd'},
5139 {"headers", no_argument
, 0, 'e'},
5140 {"section-groups", no_argument
, 0, 'g'},
5141 {"help", no_argument
, 0, 'H'},
5142 {"file-header", no_argument
, 0, 'h'},
5143 {"histogram", no_argument
, 0, 'I'},
5144 {"lint", no_argument
, 0, 'L'},
5145 {"enable-checks", no_argument
, 0, 'L'},
5146 {"program-headers", no_argument
, 0, 'l'},
5147 {"segments", no_argument
, 0, 'l'},
5148 {"full-section-name",no_argument
, 0, 'N'},
5149 {"notes", no_argument
, 0, 'n'},
5150 {"process-links", no_argument
, 0, 'P'},
5151 {"string-dump", required_argument
, 0, 'p'},
5152 {"relocated-dump", required_argument
, 0, 'R'},
5153 {"relocs", no_argument
, 0, 'r'},
5154 {"section-headers", no_argument
, 0, 'S'},
5155 {"sections", no_argument
, 0, 'S'},
5156 {"symbols", no_argument
, 0, 's'},
5157 {"syms", no_argument
, 0, 's'},
5158 {"silent-truncation",no_argument
, 0, 'T'},
5159 {"section-details", no_argument
, 0, 't'},
5160 {"unicode", required_argument
, NULL
, 'U'},
5161 {"unwind", no_argument
, 0, 'u'},
5162 {"version-info", no_argument
, 0, 'V'},
5163 {"version", no_argument
, 0, 'v'},
5164 {"wide", no_argument
, 0, 'W'},
5165 {"hex-dump", required_argument
, 0, 'x'},
5166 {"decompress", no_argument
, 0, 'z'},
5168 {"no-demangle", no_argument
, 0, OPTION_NO_DEMANGLING
},
5169 {"recurse-limit", no_argument
, NULL
, OPTION_RECURSE_LIMIT
},
5170 {"no-recurse-limit", no_argument
, NULL
, OPTION_NO_RECURSE_LIMIT
},
5171 {"no-recursion-limit", no_argument
, NULL
, OPTION_NO_RECURSE_LIMIT
},
5172 {"dyn-syms", no_argument
, 0, OPTION_DYN_SYMS
},
5173 {"lto-syms", no_argument
, 0, OPTION_LTO_SYMS
},
5174 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
5175 {"dwarf-depth", required_argument
, 0, OPTION_DWARF_DEPTH
},
5176 {"dwarf-start", required_argument
, 0, OPTION_DWARF_START
},
5177 {"dwarf-check", no_argument
, 0, OPTION_DWARF_CHECK
},
5178 #ifdef ENABLE_LIBCTF
5179 {"ctf", required_argument
, 0, OPTION_CTF_DUMP
},
5180 {"ctf-symbols", required_argument
, 0, OPTION_CTF_SYMBOLS
},
5181 {"ctf-strings", required_argument
, 0, OPTION_CTF_STRINGS
},
5182 {"ctf-parent", required_argument
, 0, OPTION_CTF_PARENT
},
5184 {"sym-base", optional_argument
, 0, OPTION_SYM_BASE
},
5186 {0, no_argument
, 0, 0}
5190 usage (FILE * stream
)
5192 fprintf (stream
, _("Usage: readelf <option(s)> elf-file(s)\n"));
5193 fprintf (stream
, _(" Display information about the contents of ELF format files\n"));
5194 fprintf (stream
, _(" Options are:\n"));
5195 fprintf (stream
, _("\
5196 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
5197 fprintf (stream
, _("\
5198 -h --file-header Display the ELF file header\n"));
5199 fprintf (stream
, _("\
5200 -l --program-headers Display the program headers\n"));
5201 fprintf (stream
, _("\
5202 --segments An alias for --program-headers\n"));
5203 fprintf (stream
, _("\
5204 -S --section-headers Display the sections' header\n"));
5205 fprintf (stream
, _("\
5206 --sections An alias for --section-headers\n"));
5207 fprintf (stream
, _("\
5208 -g --section-groups Display the section groups\n"));
5209 fprintf (stream
, _("\
5210 -t --section-details Display the section details\n"));
5211 fprintf (stream
, _("\
5212 -e --headers Equivalent to: -h -l -S\n"));
5213 fprintf (stream
, _("\
5214 -s --syms Display the symbol table\n"));
5215 fprintf (stream
, _("\
5216 --symbols An alias for --syms\n"));
5217 fprintf (stream
, _("\
5218 --dyn-syms Display the dynamic symbol table\n"));
5219 fprintf (stream
, _("\
5220 --lto-syms Display LTO symbol tables\n"));
5221 fprintf (stream
, _("\
5222 --sym-base=[0|8|10|16] \n\
5223 Force base for symbol sizes. The options are \n\
5224 mixed (the default), octal, decimal, hexadecimal.\n"));
5225 fprintf (stream
, _("\
5226 -C --demangle[=STYLE] Decode mangled/processed symbol names\n"));
5227 display_demangler_styles (stream
, _("\
5229 fprintf (stream
, _("\
5230 --no-demangle Do not demangle low-level symbol names. (default)\n"));
5231 fprintf (stream
, _("\
5232 --recurse-limit Enable a demangling recursion limit. (default)\n"));
5233 fprintf (stream
, _("\
5234 --no-recurse-limit Disable a demangling recursion limit\n"));
5235 fprintf (stream
, _("\
5236 -U[dlexhi] --unicode=[default|locale|escape|hex|highlight|invalid]\n\
5237 Display unicode characters as determined by the current locale\n\
5238 (default), escape sequences, \"<hex sequences>\", highlighted\n\
5239 escape sequences, or treat them as invalid and display as\n\
5240 \"{hex sequences}\"\n"));
5241 fprintf (stream
, _("\
5242 -n --notes Display the core notes (if present)\n"));
5243 fprintf (stream
, _("\
5244 -r --relocs Display the relocations (if present)\n"));
5245 fprintf (stream
, _("\
5246 -u --unwind Display the unwind info (if present)\n"));
5247 fprintf (stream
, _("\
5248 -d --dynamic Display the dynamic section (if present)\n"));
5249 fprintf (stream
, _("\
5250 -V --version-info Display the version sections (if present)\n"));
5251 fprintf (stream
, _("\
5252 -A --arch-specific Display architecture specific information (if any)\n"));
5253 fprintf (stream
, _("\
5254 -c --archive-index Display the symbol/file index in an archive\n"));
5255 fprintf (stream
, _("\
5256 -D --use-dynamic Use the dynamic section info when displaying symbols\n"));
5257 fprintf (stream
, _("\
5258 -L --lint|--enable-checks\n\
5259 Display warning messages for possible problems\n"));
5260 fprintf (stream
, _("\
5261 -x --hex-dump=<number|name>\n\
5262 Dump the contents of section <number|name> as bytes\n"));
5263 fprintf (stream
, _("\
5264 -p --string-dump=<number|name>\n\
5265 Dump the contents of section <number|name> as strings\n"));
5266 fprintf (stream
, _("\
5267 -R --relocated-dump=<number|name>\n\
5268 Dump the relocated contents of section <number|name>\n"));
5269 fprintf (stream
, _("\
5270 -z --decompress Decompress section before dumping it\n"));
5271 fprintf (stream
, _("\
5272 -w --debug-dump[a/=abbrev, A/=addr, r/=aranges, c/=cu_index, L/=decodedline,\n\
5273 f/=frames, F/=frames-interp, g/=gdb_index, i/=info, o/=loc,\n\
5274 m/=macro, p/=pubnames, t/=pubtypes, R/=Ranges, l/=rawline,\n\
5275 s/=str, O/=str-offsets, u/=trace_abbrev, T/=trace_aranges,\n\
5277 Display the contents of DWARF debug sections\n"));
5278 fprintf (stream
, _("\
5279 -wk --debug-dump=links Display the contents of sections that link to separate\n\
5280 debuginfo files\n"));
5281 fprintf (stream
, _("\
5282 -P --process-links Display the contents of non-debug sections in separate\n\
5283 debuginfo files. (Implies -wK)\n"));
5284 #if DEFAULT_FOR_FOLLOW_LINKS
5285 fprintf (stream
, _("\
5286 -wK --debug-dump=follow-links\n\
5287 Follow links to separate debug info files (default)\n"));
5288 fprintf (stream
, _("\
5289 -wN --debug-dump=no-follow-links\n\
5290 Do not follow links to separate debug info files\n"));
5292 fprintf (stream
, _("\
5293 -wK --debug-dump=follow-links\n\
5294 Follow links to separate debug info files\n"));
5295 fprintf (stream
, _("\
5296 -wN --debug-dump=no-follow-links\n\
5297 Do not follow links to separate debug info files\n\
5300 #if HAVE_LIBDEBUGINFOD
5301 fprintf (stream
, _("\
5302 -wD --debug-dump=use-debuginfod\n\
5303 When following links, also query debuginfod servers (default)\n"));
5304 fprintf (stream
, _("\
5305 -wE --debug-dump=do-not-use-debuginfod\n\
5306 When following links, do not query debuginfod servers\n"));
5308 fprintf (stream
, _("\
5309 --dwarf-depth=N Do not display DIEs at depth N or greater\n"));
5310 fprintf (stream
, _("\
5311 --dwarf-start=N Display DIEs starting at offset N\n"));
5312 #ifdef ENABLE_LIBCTF
5313 fprintf (stream
, _("\
5314 --ctf=<number|name> Display CTF info from section <number|name>\n"));
5315 fprintf (stream
, _("\
5316 --ctf-parent=<name> Use CTF archive member <name> as the CTF parent\n"));
5317 fprintf (stream
, _("\
5318 --ctf-symbols=<number|name>\n\
5319 Use section <number|name> as the CTF external symtab\n"));
5320 fprintf (stream
, _("\
5321 --ctf-strings=<number|name>\n\
5322 Use section <number|name> as the CTF external strtab\n"));
5325 #ifdef SUPPORT_DISASSEMBLY
5326 fprintf (stream
, _("\
5327 -i --instruction-dump=<number|name>\n\
5328 Disassemble the contents of section <number|name>\n"));
5330 fprintf (stream
, _("\
5331 -I --histogram Display histogram of bucket list lengths\n"));
5332 fprintf (stream
, _("\
5333 -W --wide Allow output width to exceed 80 characters\n"));
5334 fprintf (stream
, _("\
5335 -T --silent-truncation If a symbol name is truncated, do not add [...] suffix\n"));
5336 fprintf (stream
, _("\
5337 @<file> Read options from <file>\n"));
5338 fprintf (stream
, _("\
5339 -H --help Display this information\n"));
5340 fprintf (stream
, _("\
5341 -v --version Display the version number of readelf\n"));
5343 if (REPORT_BUGS_TO
[0] && stream
== stdout
)
5344 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
5346 exit (stream
== stdout
? 0 : 1);
5349 /* Record the fact that the user wants the contents of section number
5350 SECTION to be displayed using the method(s) encoded as flags bits
5351 in TYPE. Note, TYPE can be zero if we are creating the array for
5355 request_dump_bynumber (struct dump_data
*dumpdata
,
5356 unsigned int section
, dump_type type
)
5358 if (section
>= dumpdata
->num_dump_sects
)
5360 dump_type
* new_dump_sects
;
5362 new_dump_sects
= (dump_type
*) calloc (section
+ 1,
5363 sizeof (* new_dump_sects
));
5365 if (new_dump_sects
== NULL
)
5366 error (_("Out of memory allocating dump request table.\n"));
5369 if (dumpdata
->dump_sects
)
5371 /* Copy current flag settings. */
5372 memcpy (new_dump_sects
, dumpdata
->dump_sects
,
5373 dumpdata
->num_dump_sects
* sizeof (* new_dump_sects
));
5375 free (dumpdata
->dump_sects
);
5378 dumpdata
->dump_sects
= new_dump_sects
;
5379 dumpdata
->num_dump_sects
= section
+ 1;
5383 if (dumpdata
->dump_sects
)
5384 dumpdata
->dump_sects
[section
] |= type
;
5387 /* Request a dump by section name. */
5390 request_dump_byname (const char * section
, dump_type type
)
5392 struct dump_list_entry
* new_request
;
5394 new_request
= (struct dump_list_entry
*)
5395 malloc (sizeof (struct dump_list_entry
));
5397 error (_("Out of memory allocating dump request table.\n"));
5399 new_request
->name
= strdup (section
);
5400 if (!new_request
->name
)
5401 error (_("Out of memory allocating dump request table.\n"));
5403 new_request
->type
= type
;
5405 new_request
->next
= dump_sects_byname
;
5406 dump_sects_byname
= new_request
;
5410 request_dump (struct dump_data
*dumpdata
, dump_type type
)
5416 section
= strtoul (optarg
, & cp
, 0);
5418 if (! *cp
&& section
>= 0)
5419 request_dump_bynumber (dumpdata
, section
, type
);
5421 request_dump_byname (optarg
, type
);
5425 parse_args (struct dump_data
*dumpdata
, int argc
, char ** argv
)
5432 while ((c
= getopt_long
5433 (argc
, argv
, "ACDHILNPR:STU:VWacdeghi:lnp:rstuvw::x:z", options
, NULL
)) != EOF
)
5451 do_section_groups
= true;
5454 do_histogram
= true;
5460 do_section_groups
= true;
5465 do_section_details
= true;
5476 do_using_dynamic
= true;
5500 do_histogram
= true;
5506 do_archive_index
= true;
5512 process_links
= true;
5513 do_follow_links
= true;
5514 dump_any_debugging
= true;
5517 request_dump (dumpdata
, HEX_DUMP
);
5520 request_dump (dumpdata
, STRING_DUMP
);
5523 request_dump (dumpdata
, RELOC_DUMP
);
5526 decompress_dumps
= true;
5530 dump_any_debugging
= true;
5533 do_debugging
= true;
5534 dwarf_select_sections_all ();
5538 do_debugging
= false;
5539 dwarf_select_sections_by_letters (optarg
);
5542 case OPTION_DEBUG_DUMP
:
5544 dump_any_debugging
= true;
5547 do_debugging
= true;
5548 dwarf_select_sections_all ();
5552 do_debugging
= false;
5553 dwarf_select_sections_by_names (optarg
);
5556 case OPTION_DWARF_DEPTH
:
5560 dwarf_cutoff_level
= strtoul (optarg
, & cp
, 0);
5563 case OPTION_DWARF_START
:
5567 dwarf_start_die
= strtoul (optarg
, & cp
, 0);
5570 case OPTION_DWARF_CHECK
:
5573 case OPTION_CTF_DUMP
:
5575 request_dump (dumpdata
, CTF_DUMP
);
5577 case OPTION_CTF_SYMBOLS
:
5578 free (dump_ctf_symtab_name
);
5579 dump_ctf_symtab_name
= strdup (optarg
);
5581 case OPTION_CTF_STRINGS
:
5582 free (dump_ctf_strtab_name
);
5583 dump_ctf_strtab_name
= strdup (optarg
);
5585 case OPTION_CTF_PARENT
:
5586 free (dump_ctf_parent_name
);
5587 dump_ctf_parent_name
= strdup (optarg
);
5589 case OPTION_DYN_SYMS
:
5592 case OPTION_LTO_SYMS
:
5595 #ifdef SUPPORT_DISASSEMBLY
5597 request_dump (dumpdata
, DISASS_DUMP
);
5601 print_version (program_name
);
5610 do_not_show_symbol_truncation
= true;
5616 enum demangling_styles style
;
5618 style
= cplus_demangle_name_to_style (optarg
);
5619 if (style
== unknown_demangling
)
5620 error (_("unknown demangling style `%s'"), optarg
);
5622 cplus_demangle_set_style (style
);
5625 case OPTION_NO_DEMANGLING
:
5626 do_demangle
= false;
5628 case OPTION_RECURSE_LIMIT
:
5629 demangle_flags
&= ~ DMGL_NO_RECURSE_LIMIT
;
5631 case OPTION_NO_RECURSE_LIMIT
:
5632 demangle_flags
|= DMGL_NO_RECURSE_LIMIT
;
5634 case OPTION_WITH_SYMBOL_VERSIONS
:
5635 /* Ignored for backward compatibility. */
5640 error (_("Missing arg to -U/--unicode")); /* Can this happen ? */
5641 else if (streq (optarg
, "default") || streq (optarg
, "d"))
5642 unicode_display
= unicode_default
;
5643 else if (streq (optarg
, "locale") || streq (optarg
, "l"))
5644 unicode_display
= unicode_locale
;
5645 else if (streq (optarg
, "escape") || streq (optarg
, "e"))
5646 unicode_display
= unicode_escape
;
5647 else if (streq (optarg
, "invalid") || streq (optarg
, "i"))
5648 unicode_display
= unicode_invalid
;
5649 else if (streq (optarg
, "hex") || streq (optarg
, "x"))
5650 unicode_display
= unicode_hex
;
5651 else if (streq (optarg
, "highlight") || streq (optarg
, "h"))
5652 unicode_display
= unicode_highlight
;
5654 error (_("invalid argument to -U/--unicode: %s"), optarg
);
5657 case OPTION_SYM_BASE
:
5661 sym_base
= strtoul (optarg
, NULL
, 0);
5678 /* xgettext:c-format */
5679 error (_("Invalid option '-%c'\n"), c
);
5686 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
5687 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
5688 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
5689 && !do_section_groups
&& !do_archive_index
5690 && !do_dyn_syms
&& !do_lto_syms
)
5695 do_dynamic
= do_syms
= do_reloc
= do_unwind
= do_sections
= true;
5696 do_segments
= do_header
= do_dump
= do_version
= true;
5697 do_histogram
= do_debugging
= do_arch
= do_notes
= true;
5698 do_section_groups
= do_archive_index
= do_dyn_syms
= true;
5707 get_elf_class (unsigned int elf_class
)
5709 static char buff
[32];
5713 case ELFCLASSNONE
: return _("none");
5714 case ELFCLASS32
: return "ELF32";
5715 case ELFCLASS64
: return "ELF64";
5717 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), elf_class
);
5723 get_data_encoding (unsigned int encoding
)
5725 static char buff
[32];
5729 case ELFDATANONE
: return _("none");
5730 case ELFDATA2LSB
: return _("2's complement, little endian");
5731 case ELFDATA2MSB
: return _("2's complement, big endian");
5733 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), encoding
);
5738 /* Decode the data held in 'filedata->file_header'. */
5741 process_file_header (Filedata
* filedata
)
5743 Elf_Internal_Ehdr
* header
= & filedata
->file_header
;
5745 if ( header
->e_ident
[EI_MAG0
] != ELFMAG0
5746 || header
->e_ident
[EI_MAG1
] != ELFMAG1
5747 || header
->e_ident
[EI_MAG2
] != ELFMAG2
5748 || header
->e_ident
[EI_MAG3
] != ELFMAG3
)
5751 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
5755 if (! filedata
->is_separate
)
5756 init_dwarf_regnames_by_elf_machine_code (header
->e_machine
);
5762 if (filedata
->is_separate
)
5763 printf (_("ELF Header in linked file '%s':\n"), filedata
->file_name
);
5765 printf (_("ELF Header:\n"));
5766 printf (_(" Magic: "));
5767 for (i
= 0; i
< EI_NIDENT
; i
++)
5768 printf ("%2.2x ", header
->e_ident
[i
]);
5770 printf (_(" Class: %s\n"),
5771 get_elf_class (header
->e_ident
[EI_CLASS
]));
5772 printf (_(" Data: %s\n"),
5773 get_data_encoding (header
->e_ident
[EI_DATA
]));
5774 printf (_(" Version: %d%s\n"),
5775 header
->e_ident
[EI_VERSION
],
5776 (header
->e_ident
[EI_VERSION
] == EV_CURRENT
5778 : (header
->e_ident
[EI_VERSION
] != EV_NONE
5781 printf (_(" OS/ABI: %s\n"),
5782 get_osabi_name (filedata
, header
->e_ident
[EI_OSABI
]));
5783 printf (_(" ABI Version: %d\n"),
5784 header
->e_ident
[EI_ABIVERSION
]);
5785 printf (_(" Type: %s\n"),
5786 get_file_type (filedata
));
5787 printf (_(" Machine: %s\n"),
5788 get_machine_name (header
->e_machine
));
5789 printf (_(" Version: 0x%lx\n"),
5792 printf (_(" Entry point address: "));
5793 print_vma (header
->e_entry
, PREFIX_HEX
);
5794 printf (_("\n Start of program headers: "));
5795 print_vma (header
->e_phoff
, DEC
);
5796 printf (_(" (bytes into file)\n Start of section headers: "));
5797 print_vma (header
->e_shoff
, DEC
);
5798 printf (_(" (bytes into file)\n"));
5800 printf (_(" Flags: 0x%lx%s\n"),
5802 get_machine_flags (filedata
, header
->e_flags
, header
->e_machine
));
5803 printf (_(" Size of this header: %u (bytes)\n"),
5805 printf (_(" Size of program headers: %u (bytes)\n"),
5806 header
->e_phentsize
);
5807 printf (_(" Number of program headers: %u"),
5809 if (filedata
->section_headers
!= NULL
5810 && header
->e_phnum
== PN_XNUM
5811 && filedata
->section_headers
[0].sh_info
!= 0)
5812 printf (" (%u)", filedata
->section_headers
[0].sh_info
);
5813 putc ('\n', stdout
);
5814 printf (_(" Size of section headers: %u (bytes)\n"),
5815 header
->e_shentsize
);
5816 printf (_(" Number of section headers: %u"),
5818 if (filedata
->section_headers
!= NULL
&& header
->e_shnum
== SHN_UNDEF
)
5820 header
->e_shnum
= filedata
->section_headers
[0].sh_size
;
5821 printf (" (%u)", header
->e_shnum
);
5823 putc ('\n', stdout
);
5824 printf (_(" Section header string table index: %u"),
5825 header
->e_shstrndx
);
5826 if (filedata
->section_headers
!= NULL
5827 && header
->e_shstrndx
== (SHN_XINDEX
& 0xffff))
5829 header
->e_shstrndx
= filedata
->section_headers
[0].sh_link
;
5830 printf (" (%u)", header
->e_shstrndx
);
5832 if (header
->e_shstrndx
!= SHN_UNDEF
5833 && header
->e_shstrndx
>= header
->e_shnum
)
5835 header
->e_shstrndx
= SHN_UNDEF
;
5836 printf (_(" <corrupt: out of range>"));
5838 putc ('\n', stdout
);
5841 if (filedata
->section_headers
!= NULL
)
5843 if (header
->e_phnum
== PN_XNUM
5844 && filedata
->section_headers
[0].sh_info
!= 0)
5846 /* Throw away any cached read of PN_XNUM headers. */
5847 free (filedata
->program_headers
);
5848 filedata
->program_headers
= NULL
;
5849 header
->e_phnum
= filedata
->section_headers
[0].sh_info
;
5851 if (header
->e_shnum
== SHN_UNDEF
)
5852 header
->e_shnum
= filedata
->section_headers
[0].sh_size
;
5853 if (header
->e_shstrndx
== (SHN_XINDEX
& 0xffff))
5854 header
->e_shstrndx
= filedata
->section_headers
[0].sh_link
;
5855 if (header
->e_shstrndx
>= header
->e_shnum
)
5856 header
->e_shstrndx
= SHN_UNDEF
;
5862 /* Read in the program headers from FILEDATA and store them in PHEADERS.
5863 Returns TRUE upon success, FALSE otherwise. Loads 32-bit headers. */
5866 get_32bit_program_headers (Filedata
* filedata
, Elf_Internal_Phdr
* pheaders
)
5868 Elf32_External_Phdr
* phdrs
;
5869 Elf32_External_Phdr
* external
;
5870 Elf_Internal_Phdr
* internal
;
5872 unsigned int size
= filedata
->file_header
.e_phentsize
;
5873 unsigned int num
= filedata
->file_header
.e_phnum
;
5875 /* PR binutils/17531: Cope with unexpected section header sizes. */
5876 if (size
== 0 || num
== 0)
5878 if (size
< sizeof * phdrs
)
5880 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
5883 if (size
> sizeof * phdrs
)
5884 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
5886 phdrs
= (Elf32_External_Phdr
*) get_data (NULL
, filedata
, filedata
->file_header
.e_phoff
,
5887 size
, num
, _("program headers"));
5891 for (i
= 0, internal
= pheaders
, external
= phdrs
;
5892 i
< filedata
->file_header
.e_phnum
;
5893 i
++, internal
++, external
++)
5895 internal
->p_type
= BYTE_GET (external
->p_type
);
5896 internal
->p_offset
= BYTE_GET (external
->p_offset
);
5897 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
5898 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
5899 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
5900 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
5901 internal
->p_flags
= BYTE_GET (external
->p_flags
);
5902 internal
->p_align
= BYTE_GET (external
->p_align
);
5909 /* Read in the program headers from FILEDATA and store them in PHEADERS.
5910 Returns TRUE upon success, FALSE otherwise. Loads 64-bit headers. */
5913 get_64bit_program_headers (Filedata
* filedata
, Elf_Internal_Phdr
* pheaders
)
5915 Elf64_External_Phdr
* phdrs
;
5916 Elf64_External_Phdr
* external
;
5917 Elf_Internal_Phdr
* internal
;
5919 unsigned int size
= filedata
->file_header
.e_phentsize
;
5920 unsigned int num
= filedata
->file_header
.e_phnum
;
5922 /* PR binutils/17531: Cope with unexpected section header sizes. */
5923 if (size
== 0 || num
== 0)
5925 if (size
< sizeof * phdrs
)
5927 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
5930 if (size
> sizeof * phdrs
)
5931 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
5933 phdrs
= (Elf64_External_Phdr
*) get_data (NULL
, filedata
, filedata
->file_header
.e_phoff
,
5934 size
, num
, _("program headers"));
5938 for (i
= 0, internal
= pheaders
, external
= phdrs
;
5939 i
< filedata
->file_header
.e_phnum
;
5940 i
++, internal
++, external
++)
5942 internal
->p_type
= BYTE_GET (external
->p_type
);
5943 internal
->p_flags
= BYTE_GET (external
->p_flags
);
5944 internal
->p_offset
= BYTE_GET (external
->p_offset
);
5945 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
5946 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
5947 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
5948 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
5949 internal
->p_align
= BYTE_GET (external
->p_align
);
5956 /* Returns TRUE if the program headers were read into `program_headers'. */
5959 get_program_headers (Filedata
* filedata
)
5961 Elf_Internal_Phdr
* phdrs
;
5963 /* Check cache of prior read. */
5964 if (filedata
->program_headers
!= NULL
)
5967 /* Be kind to memory checkers by looking for
5968 e_phnum values which we know must be invalid. */
5969 if (filedata
->file_header
.e_phnum
5970 * (is_32bit_elf
? sizeof (Elf32_External_Phdr
) : sizeof (Elf64_External_Phdr
))
5971 >= filedata
->file_size
)
5973 error (_("Too many program headers - %#x - the file is not that big\n"),
5974 filedata
->file_header
.e_phnum
);
5978 phdrs
= (Elf_Internal_Phdr
*) cmalloc (filedata
->file_header
.e_phnum
,
5979 sizeof (Elf_Internal_Phdr
));
5982 error (_("Out of memory reading %u program headers\n"),
5983 filedata
->file_header
.e_phnum
);
5988 ? get_32bit_program_headers (filedata
, phdrs
)
5989 : get_64bit_program_headers (filedata
, phdrs
))
5991 filedata
->program_headers
= phdrs
;
5999 /* Print program header info and locate dynamic section. */
6002 process_program_headers (Filedata
* filedata
)
6004 Elf_Internal_Phdr
* segment
;
6006 Elf_Internal_Phdr
* previous_load
= NULL
;
6008 if (filedata
->file_header
.e_phnum
== 0)
6010 /* PR binutils/12467. */
6011 if (filedata
->file_header
.e_phoff
!= 0)
6012 warn (_("possibly corrupt ELF header - it has a non-zero program"
6013 " header offset, but no program headers\n"));
6014 else if (do_segments
)
6016 if (filedata
->is_separate
)
6017 printf (_("\nThere are no program headers in linked file '%s'.\n"),
6018 filedata
->file_name
);
6020 printf (_("\nThere are no program headers in this file.\n"));
6025 if (do_segments
&& !do_header
)
6027 if (filedata
->is_separate
)
6028 printf ("\nIn linked file '%s' the ELF file type is %s\n",
6029 filedata
->file_name
, get_file_type (filedata
));
6031 printf (_("\nElf file type is %s\n"), get_file_type (filedata
));
6032 printf (_("Entry point 0x%s\n"), bfd_vmatoa ("x", filedata
->file_header
.e_entry
));
6033 printf (ngettext ("There is %d program header, starting at offset %s\n",
6034 "There are %d program headers, starting at offset %s\n",
6035 filedata
->file_header
.e_phnum
),
6036 filedata
->file_header
.e_phnum
,
6037 bfd_vmatoa ("u", filedata
->file_header
.e_phoff
));
6040 if (! get_program_headers (filedata
))
6045 if (filedata
->file_header
.e_phnum
> 1)
6046 printf (_("\nProgram Headers:\n"));
6048 printf (_("\nProgram Headers:\n"));
6052 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
6055 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
6059 (_(" Type Offset VirtAddr PhysAddr\n"));
6061 (_(" FileSiz MemSiz Flags Align\n"));
6065 unsigned long dynamic_addr
= 0;
6066 bfd_size_type dynamic_size
= 0;
6067 for (i
= 0, segment
= filedata
->program_headers
;
6068 i
< filedata
->file_header
.e_phnum
;
6073 printf (" %-14.14s ", get_segment_type (filedata
, segment
->p_type
));
6077 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
6078 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
6079 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
6080 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
6081 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
6083 (segment
->p_flags
& PF_R
? 'R' : ' '),
6084 (segment
->p_flags
& PF_W
? 'W' : ' '),
6085 (segment
->p_flags
& PF_X
? 'E' : ' '));
6086 printf ("%#lx", (unsigned long) segment
->p_align
);
6090 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
6091 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
6094 print_vma (segment
->p_offset
, FULL_HEX
);
6098 print_vma (segment
->p_vaddr
, FULL_HEX
);
6100 print_vma (segment
->p_paddr
, FULL_HEX
);
6103 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
6104 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
6107 print_vma (segment
->p_filesz
, FULL_HEX
);
6111 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
6112 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
6115 print_vma (segment
->p_memsz
, FULL_HEX
);
6119 (segment
->p_flags
& PF_R
? 'R' : ' '),
6120 (segment
->p_flags
& PF_W
? 'W' : ' '),
6121 (segment
->p_flags
& PF_X
? 'E' : ' '));
6123 if ((unsigned long) segment
->p_align
== segment
->p_align
)
6124 printf ("%#lx", (unsigned long) segment
->p_align
);
6127 print_vma (segment
->p_align
, PREFIX_HEX
);
6132 print_vma (segment
->p_offset
, FULL_HEX
);
6134 print_vma (segment
->p_vaddr
, FULL_HEX
);
6136 print_vma (segment
->p_paddr
, FULL_HEX
);
6138 print_vma (segment
->p_filesz
, FULL_HEX
);
6140 print_vma (segment
->p_memsz
, FULL_HEX
);
6142 (segment
->p_flags
& PF_R
? 'R' : ' '),
6143 (segment
->p_flags
& PF_W
? 'W' : ' '),
6144 (segment
->p_flags
& PF_X
? 'E' : ' '));
6145 print_vma (segment
->p_align
, PREFIX_HEX
);
6148 putc ('\n', stdout
);
6151 switch (segment
->p_type
)
6154 #if 0 /* Do not warn about out of order PT_LOAD segments. Although officially
6155 required by the ELF standard, several programs, including the Linux
6156 kernel, make use of non-ordered segments. */
6158 && previous_load
->p_vaddr
> segment
->p_vaddr
)
6159 error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
6161 if (segment
->p_memsz
< segment
->p_filesz
)
6162 error (_("the segment's file size is larger than its memory size\n"));
6163 previous_load
= segment
;
6167 /* PR 20815 - Verify that the program header is loaded into memory. */
6168 if (i
> 0 && previous_load
!= NULL
)
6169 error (_("the PHDR segment must occur before any LOAD segment\n"));
6170 if (filedata
->file_header
.e_machine
!= EM_PARISC
)
6174 for (j
= 1; j
< filedata
->file_header
.e_phnum
; j
++)
6176 Elf_Internal_Phdr
*load
= filedata
->program_headers
+ j
;
6177 if (load
->p_type
== PT_LOAD
6178 && load
->p_offset
<= segment
->p_offset
6179 && (load
->p_offset
+ load
->p_filesz
6180 >= segment
->p_offset
+ segment
->p_filesz
)
6181 && load
->p_vaddr
<= segment
->p_vaddr
6182 && (load
->p_vaddr
+ load
->p_filesz
6183 >= segment
->p_vaddr
+ segment
->p_filesz
))
6186 if (j
== filedata
->file_header
.e_phnum
)
6187 error (_("the PHDR segment is not covered by a LOAD segment\n"));
6193 error (_("more than one dynamic segment\n"));
6195 /* By default, assume that the .dynamic section is the first
6196 section in the DYNAMIC segment. */
6197 dynamic_addr
= segment
->p_offset
;
6198 dynamic_size
= segment
->p_filesz
;
6200 /* Try to locate the .dynamic section. If there is
6201 a section header table, we can easily locate it. */
6202 if (filedata
->section_headers
!= NULL
)
6204 Elf_Internal_Shdr
* sec
;
6206 sec
= find_section (filedata
, ".dynamic");
6207 if (sec
== NULL
|| sec
->sh_size
== 0)
6209 /* A corresponding .dynamic section is expected, but on
6210 IA-64/OpenVMS it is OK for it to be missing. */
6211 if (!is_ia64_vms (filedata
))
6212 error (_("no .dynamic section in the dynamic segment\n"));
6216 if (sec
->sh_type
== SHT_NOBITS
)
6223 dynamic_addr
= sec
->sh_offset
;
6224 dynamic_size
= sec
->sh_size
;
6226 /* The PT_DYNAMIC segment, which is used by the run-time
6227 loader, should exactly match the .dynamic section. */
6229 && (dynamic_addr
!= segment
->p_offset
6230 || dynamic_size
!= segment
->p_filesz
))
6232 the .dynamic section is not the same as the dynamic segment\n"));
6235 /* PR binutils/17512: Avoid corrupt dynamic section info in the
6236 segment. Check this after matching against the section headers
6237 so we don't warn on debuginfo file (which have NOBITS .dynamic
6239 if (dynamic_addr
> filedata
->file_size
6240 || (dynamic_size
> filedata
->file_size
- dynamic_addr
))
6242 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
6249 if (segment
->p_offset
>= filedata
->file_size
6250 || segment
->p_filesz
> filedata
->file_size
- segment
->p_offset
6251 || segment
->p_filesz
- 1 >= (size_t) -2
6252 || fseek (filedata
->handle
,
6253 filedata
->archive_file_offset
+ (long) segment
->p_offset
,
6255 error (_("Unable to find program interpreter name\n"));
6258 size_t len
= segment
->p_filesz
;
6259 free (filedata
->program_interpreter
);
6260 filedata
->program_interpreter
= xmalloc (len
+ 1);
6261 len
= fread (filedata
->program_interpreter
, 1, len
,
6263 filedata
->program_interpreter
[len
] = 0;
6266 printf (_(" [Requesting program interpreter: %s]\n"),
6267 filedata
->program_interpreter
);
6274 && filedata
->section_headers
!= NULL
6275 && filedata
->string_table
!= NULL
)
6277 printf (_("\n Section to Segment mapping:\n"));
6278 printf (_(" Segment Sections...\n"));
6280 for (i
= 0; i
< filedata
->file_header
.e_phnum
; i
++)
6283 Elf_Internal_Shdr
* section
;
6285 segment
= filedata
->program_headers
+ i
;
6286 section
= filedata
->section_headers
+ 1;
6288 printf (" %2.2d ", i
);
6290 for (j
= 1; j
< filedata
->file_header
.e_shnum
; j
++, section
++)
6292 if (!ELF_TBSS_SPECIAL (section
, segment
)
6293 && ELF_SECTION_IN_SEGMENT_STRICT (section
, segment
))
6294 printf ("%s ", printable_section_name (filedata
, section
));
6301 filedata
->dynamic_addr
= dynamic_addr
;
6302 filedata
->dynamic_size
= dynamic_size
? dynamic_size
: 1;
6306 filedata
->dynamic_addr
= 0;
6307 filedata
->dynamic_size
= 1;
6311 /* Find the file offset corresponding to VMA by using the program headers. */
6314 offset_from_vma (Filedata
* filedata
, bfd_vma vma
, bfd_size_type size
)
6316 Elf_Internal_Phdr
* seg
;
6318 if (! get_program_headers (filedata
))
6320 warn (_("Cannot interpret virtual addresses without program headers.\n"));
6324 for (seg
= filedata
->program_headers
;
6325 seg
< filedata
->program_headers
+ filedata
->file_header
.e_phnum
;
6328 if (seg
->p_type
!= PT_LOAD
)
6331 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
6332 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
6333 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
6336 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
6337 (unsigned long) vma
);
6342 /* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers.
6343 If PROBE is true, this is just a probe and we do not generate any error
6344 messages if the load fails. */
6347 get_32bit_section_headers (Filedata
* filedata
, bool probe
)
6349 Elf32_External_Shdr
* shdrs
;
6350 Elf_Internal_Shdr
* internal
;
6352 unsigned int size
= filedata
->file_header
.e_shentsize
;
6353 unsigned int num
= probe
? 1 : filedata
->file_header
.e_shnum
;
6355 /* PR binutils/17531: Cope with unexpected section header sizes. */
6356 if (size
== 0 || num
== 0)
6358 if (size
< sizeof * shdrs
)
6361 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
6364 if (!probe
&& size
> sizeof * shdrs
)
6365 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
6367 shdrs
= (Elf32_External_Shdr
*) get_data (NULL
, filedata
, filedata
->file_header
.e_shoff
,
6369 probe
? NULL
: _("section headers"));
6373 filedata
->section_headers
= (Elf_Internal_Shdr
*)
6374 cmalloc (num
, sizeof (Elf_Internal_Shdr
));
6375 if (filedata
->section_headers
== NULL
)
6378 error (_("Out of memory reading %u section headers\n"), num
);
6383 for (i
= 0, internal
= filedata
->section_headers
;
6387 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
6388 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
6389 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
6390 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
6391 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
6392 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
6393 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
6394 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
6395 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
6396 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
6397 if (!probe
&& internal
->sh_link
> num
)
6398 warn (_("Section %u has an out of range sh_link value of %u\n"), i
, internal
->sh_link
);
6399 if (!probe
&& internal
->sh_flags
& SHF_INFO_LINK
&& internal
->sh_info
> num
)
6400 warn (_("Section %u has an out of range sh_info value of %u\n"), i
, internal
->sh_info
);
6407 /* Like get_32bit_section_headers, except that it fetches 64-bit headers. */
6410 get_64bit_section_headers (Filedata
* filedata
, bool probe
)
6412 Elf64_External_Shdr
* shdrs
;
6413 Elf_Internal_Shdr
* internal
;
6415 unsigned int size
= filedata
->file_header
.e_shentsize
;
6416 unsigned int num
= probe
? 1 : filedata
->file_header
.e_shnum
;
6418 /* PR binutils/17531: Cope with unexpected section header sizes. */
6419 if (size
== 0 || num
== 0)
6422 if (size
< sizeof * shdrs
)
6425 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
6429 if (! probe
&& size
> sizeof * shdrs
)
6430 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
6432 shdrs
= (Elf64_External_Shdr
*) get_data (NULL
, filedata
,
6433 filedata
->file_header
.e_shoff
,
6435 probe
? NULL
: _("section headers"));
6439 filedata
->section_headers
= (Elf_Internal_Shdr
*)
6440 cmalloc (num
, sizeof (Elf_Internal_Shdr
));
6441 if (filedata
->section_headers
== NULL
)
6444 error (_("Out of memory reading %u section headers\n"), num
);
6449 for (i
= 0, internal
= filedata
->section_headers
;
6453 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
6454 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
6455 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
6456 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
6457 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
6458 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
6459 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
6460 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
6461 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
6462 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
6463 if (!probe
&& internal
->sh_link
> num
)
6464 warn (_("Section %u has an out of range sh_link value of %u\n"), i
, internal
->sh_link
);
6465 if (!probe
&& internal
->sh_flags
& SHF_INFO_LINK
&& internal
->sh_info
> num
)
6466 warn (_("Section %u has an out of range sh_info value of %u\n"), i
, internal
->sh_info
);
6474 get_section_headers (Filedata
*filedata
, bool probe
)
6476 if (filedata
->section_headers
!= NULL
)
6480 return get_32bit_section_headers (filedata
, probe
);
6482 return get_64bit_section_headers (filedata
, probe
);
6485 static Elf_Internal_Sym
*
6486 get_32bit_elf_symbols (Filedata
* filedata
,
6487 Elf_Internal_Shdr
* section
,
6488 unsigned long * num_syms_return
)
6490 unsigned long number
= 0;
6491 Elf32_External_Sym
* esyms
= NULL
;
6492 Elf_External_Sym_Shndx
* shndx
= NULL
;
6493 Elf_Internal_Sym
* isyms
= NULL
;
6494 Elf_Internal_Sym
* psym
;
6496 elf_section_list
* entry
;
6498 if (section
->sh_size
== 0)
6500 if (num_syms_return
!= NULL
)
6501 * num_syms_return
= 0;
6505 /* Run some sanity checks first. */
6506 if (section
->sh_entsize
== 0 || section
->sh_entsize
> section
->sh_size
)
6508 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
6509 printable_section_name (filedata
, section
),
6510 (unsigned long) section
->sh_entsize
);
6514 if (section
->sh_size
> filedata
->file_size
)
6516 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
6517 printable_section_name (filedata
, section
),
6518 (unsigned long) section
->sh_size
);
6522 number
= section
->sh_size
/ section
->sh_entsize
;
6524 if (number
* sizeof (Elf32_External_Sym
) > section
->sh_size
+ 1)
6526 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
6527 (unsigned long) section
->sh_size
,
6528 printable_section_name (filedata
, section
),
6529 (unsigned long) section
->sh_entsize
);
6533 esyms
= (Elf32_External_Sym
*) get_data (NULL
, filedata
, section
->sh_offset
, 1,
6534 section
->sh_size
, _("symbols"));
6539 for (entry
= filedata
->symtab_shndx_list
; entry
!= NULL
; entry
= entry
->next
)
6541 if (entry
->hdr
->sh_link
!= (unsigned long) (section
- filedata
->section_headers
))
6546 error (_("Multiple symbol table index sections associated with the same symbol section\n"));
6550 shndx
= (Elf_External_Sym_Shndx
*) get_data (NULL
, filedata
,
6551 entry
->hdr
->sh_offset
,
6552 1, entry
->hdr
->sh_size
,
6553 _("symbol table section indices"));
6557 /* PR17531: file: heap-buffer-overflow */
6558 if (entry
->hdr
->sh_size
/ sizeof (Elf_External_Sym_Shndx
) < number
)
6560 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
6561 printable_section_name (filedata
, entry
->hdr
),
6562 (unsigned long) entry
->hdr
->sh_size
,
6563 (unsigned long) section
->sh_size
);
6568 isyms
= (Elf_Internal_Sym
*) cmalloc (number
, sizeof (Elf_Internal_Sym
));
6572 error (_("Out of memory reading %lu symbols\n"),
6573 (unsigned long) number
);
6577 for (j
= 0, psym
= isyms
; j
< number
; j
++, psym
++)
6579 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
6580 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
6581 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
6582 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
6583 if (psym
->st_shndx
== (SHN_XINDEX
& 0xffff) && shndx
!= NULL
)
6585 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
6586 else if (psym
->st_shndx
>= (SHN_LORESERVE
& 0xffff))
6587 psym
->st_shndx
+= SHN_LORESERVE
- (SHN_LORESERVE
& 0xffff);
6588 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
6589 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
6596 if (num_syms_return
!= NULL
)
6597 * num_syms_return
= isyms
== NULL
? 0 : number
;
6602 static Elf_Internal_Sym
*
6603 get_64bit_elf_symbols (Filedata
* filedata
,
6604 Elf_Internal_Shdr
* section
,
6605 unsigned long * num_syms_return
)
6607 unsigned long number
= 0;
6608 Elf64_External_Sym
* esyms
= NULL
;
6609 Elf_External_Sym_Shndx
* shndx
= NULL
;
6610 Elf_Internal_Sym
* isyms
= NULL
;
6611 Elf_Internal_Sym
* psym
;
6613 elf_section_list
* entry
;
6615 if (section
->sh_size
== 0)
6617 if (num_syms_return
!= NULL
)
6618 * num_syms_return
= 0;
6622 /* Run some sanity checks first. */
6623 if (section
->sh_entsize
== 0 || section
->sh_entsize
> section
->sh_size
)
6625 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
6626 printable_section_name (filedata
, section
),
6627 (unsigned long) section
->sh_entsize
);
6631 if (section
->sh_size
> filedata
->file_size
)
6633 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
6634 printable_section_name (filedata
, section
),
6635 (unsigned long) section
->sh_size
);
6639 number
= section
->sh_size
/ section
->sh_entsize
;
6641 if (number
* sizeof (Elf64_External_Sym
) > section
->sh_size
+ 1)
6643 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
6644 (unsigned long) section
->sh_size
,
6645 printable_section_name (filedata
, section
),
6646 (unsigned long) section
->sh_entsize
);
6650 esyms
= (Elf64_External_Sym
*) get_data (NULL
, filedata
, section
->sh_offset
, 1,
6651 section
->sh_size
, _("symbols"));
6656 for (entry
= filedata
->symtab_shndx_list
; entry
!= NULL
; entry
= entry
->next
)
6658 if (entry
->hdr
->sh_link
!= (unsigned long) (section
- filedata
->section_headers
))
6663 error (_("Multiple symbol table index sections associated with the same symbol section\n"));
6667 shndx
= (Elf_External_Sym_Shndx
*) get_data (NULL
, filedata
,
6668 entry
->hdr
->sh_offset
,
6669 1, entry
->hdr
->sh_size
,
6670 _("symbol table section indices"));
6674 /* PR17531: file: heap-buffer-overflow */
6675 if (entry
->hdr
->sh_size
/ sizeof (Elf_External_Sym_Shndx
) < number
)
6677 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
6678 printable_section_name (filedata
, entry
->hdr
),
6679 (unsigned long) entry
->hdr
->sh_size
,
6680 (unsigned long) section
->sh_size
);
6685 isyms
= (Elf_Internal_Sym
*) cmalloc (number
, sizeof (Elf_Internal_Sym
));
6689 error (_("Out of memory reading %lu symbols\n"),
6690 (unsigned long) number
);
6694 for (j
= 0, psym
= isyms
; j
< number
; j
++, psym
++)
6696 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
6697 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
6698 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
6699 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
6701 if (psym
->st_shndx
== (SHN_XINDEX
& 0xffff) && shndx
!= NULL
)
6703 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
6704 else if (psym
->st_shndx
>= (SHN_LORESERVE
& 0xffff))
6705 psym
->st_shndx
+= SHN_LORESERVE
- (SHN_LORESERVE
& 0xffff);
6707 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
6708 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
6715 if (num_syms_return
!= NULL
)
6716 * num_syms_return
= isyms
== NULL
? 0 : number
;
6721 static Elf_Internal_Sym
*
6722 get_elf_symbols (Filedata
*filedata
,
6723 Elf_Internal_Shdr
*section
,
6724 unsigned long *num_syms_return
)
6727 return get_32bit_elf_symbols (filedata
, section
, num_syms_return
);
6729 return get_64bit_elf_symbols (filedata
, section
, num_syms_return
);
6733 get_elf_section_flags (Filedata
* filedata
, bfd_vma sh_flags
)
6735 static char buff
[1024];
6737 unsigned int field_size
= is_32bit_elf
? 8 : 16;
6739 unsigned int size
= sizeof (buff
) - (field_size
+ 4 + 1);
6740 bfd_vma os_flags
= 0;
6741 bfd_vma proc_flags
= 0;
6742 bfd_vma unknown_flags
= 0;
6750 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
6751 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
6752 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
6753 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
6754 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
6755 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
6756 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
6757 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
6758 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
6759 /* 9 */ { STRING_COMMA_LEN ("TLS") },
6760 /* IA-64 specific. */
6761 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
6762 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
6763 /* IA-64 OpenVMS specific. */
6764 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
6765 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
6766 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
6767 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
6768 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
6769 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
6771 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
6772 /* SPARC specific. */
6773 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
6774 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
6776 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
6777 /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
6778 /* 23 */ { STRING_COMMA_LEN ("COMDEF") },
6780 /* 24 */ { STRING_COMMA_LEN ("GNU_MBIND") },
6782 /* 25 */ { STRING_COMMA_LEN ("VLE") },
6784 /* 26 */ { STRING_COMMA_LEN ("GNU_RETAIN") },
6787 if (do_section_details
)
6789 sprintf (buff
, "[%*.*lx]: ",
6790 field_size
, field_size
, (unsigned long) sh_flags
);
6791 p
+= field_size
+ 4;
6798 flag
= sh_flags
& - sh_flags
;
6801 if (do_section_details
)
6805 case SHF_WRITE
: sindex
= 0; break;
6806 case SHF_ALLOC
: sindex
= 1; break;
6807 case SHF_EXECINSTR
: sindex
= 2; break;
6808 case SHF_MERGE
: sindex
= 3; break;
6809 case SHF_STRINGS
: sindex
= 4; break;
6810 case SHF_INFO_LINK
: sindex
= 5; break;
6811 case SHF_LINK_ORDER
: sindex
= 6; break;
6812 case SHF_OS_NONCONFORMING
: sindex
= 7; break;
6813 case SHF_GROUP
: sindex
= 8; break;
6814 case SHF_TLS
: sindex
= 9; break;
6815 case SHF_EXCLUDE
: sindex
= 18; break;
6816 case SHF_COMPRESSED
: sindex
= 20; break;
6820 switch (filedata
->file_header
.e_machine
)
6823 if (flag
== SHF_IA_64_SHORT
)
6825 else if (flag
== SHF_IA_64_NORECOV
)
6828 else if (filedata
->file_header
.e_ident
[EI_OSABI
] == ELFOSABI_OPENVMS
)
6831 case SHF_IA_64_VMS_GLOBAL
: sindex
= 12; break;
6832 case SHF_IA_64_VMS_OVERLAID
: sindex
= 13; break;
6833 case SHF_IA_64_VMS_SHARED
: sindex
= 14; break;
6834 case SHF_IA_64_VMS_VECTOR
: sindex
= 15; break;
6835 case SHF_IA_64_VMS_ALLOC_64BIT
: sindex
= 16; break;
6836 case SHF_IA_64_VMS_PROTECTED
: sindex
= 17; break;
6847 case EM_OLD_SPARCV9
:
6848 case EM_SPARC32PLUS
:
6851 if (flag
== SHF_ORDERED
)
6858 case SHF_ENTRYSECT
: sindex
= 21; break;
6859 case SHF_ARM_PURECODE
: sindex
= 22; break;
6860 case SHF_COMDEF
: sindex
= 23; break;
6865 if (flag
== SHF_PPC_VLE
)
6872 switch (filedata
->file_header
.e_ident
[EI_OSABI
])
6875 case ELFOSABI_FREEBSD
:
6876 if (flag
== SHF_GNU_RETAIN
)
6880 if (flag
== SHF_GNU_MBIND
)
6881 /* We should not recognize SHF_GNU_MBIND for
6882 ELFOSABI_NONE, but binutils as of 2019-07-23 did
6883 not set the EI_OSABI header byte. */
6894 if (p
!= buff
+ field_size
+ 4)
6896 if (size
< (10 + 2))
6898 warn (_("Internal error: not enough buffer room for section flag info"));
6899 return _("<unknown>");
6906 size
-= flags
[sindex
].len
;
6907 p
= stpcpy (p
, flags
[sindex
].str
);
6909 else if (flag
& SHF_MASKOS
)
6911 else if (flag
& SHF_MASKPROC
)
6914 unknown_flags
|= flag
;
6920 case SHF_WRITE
: *p
= 'W'; break;
6921 case SHF_ALLOC
: *p
= 'A'; break;
6922 case SHF_EXECINSTR
: *p
= 'X'; break;
6923 case SHF_MERGE
: *p
= 'M'; break;
6924 case SHF_STRINGS
: *p
= 'S'; break;
6925 case SHF_INFO_LINK
: *p
= 'I'; break;
6926 case SHF_LINK_ORDER
: *p
= 'L'; break;
6927 case SHF_OS_NONCONFORMING
: *p
= 'O'; break;
6928 case SHF_GROUP
: *p
= 'G'; break;
6929 case SHF_TLS
: *p
= 'T'; break;
6930 case SHF_EXCLUDE
: *p
= 'E'; break;
6931 case SHF_COMPRESSED
: *p
= 'C'; break;
6934 if ((filedata
->file_header
.e_machine
== EM_X86_64
6935 || filedata
->file_header
.e_machine
== EM_L1OM
6936 || filedata
->file_header
.e_machine
== EM_K1OM
)
6937 && flag
== SHF_X86_64_LARGE
)
6939 else if (filedata
->file_header
.e_machine
== EM_ARM
6940 && flag
== SHF_ARM_PURECODE
)
6942 else if (filedata
->file_header
.e_machine
== EM_PPC
6943 && flag
== SHF_PPC_VLE
)
6945 else if (flag
& SHF_MASKOS
)
6947 switch (filedata
->file_header
.e_ident
[EI_OSABI
])
6950 case ELFOSABI_FREEBSD
:
6951 if (flag
== SHF_GNU_RETAIN
)
6958 if (flag
== SHF_GNU_MBIND
)
6960 /* We should not recognize SHF_GNU_MBIND for
6961 ELFOSABI_NONE, but binutils as of 2019-07-23 did
6962 not set the EI_OSABI header byte. */
6969 sh_flags
&= ~SHF_MASKOS
;
6973 else if (flag
& SHF_MASKPROC
)
6976 sh_flags
&= ~ SHF_MASKPROC
;
6986 if (do_section_details
)
6990 size
-= 5 + field_size
;
6991 if (p
!= buff
+ field_size
+ 4)
6995 warn (_("Internal error: not enough buffer room for section flag info"));
6996 return _("<unknown>");
7002 sprintf (p
, "OS (%*.*lx)", field_size
, field_size
,
7003 (unsigned long) os_flags
);
7004 p
+= 5 + field_size
;
7008 size
-= 7 + field_size
;
7009 if (p
!= buff
+ field_size
+ 4)
7013 warn (_("Internal error: not enough buffer room for section flag info"));
7014 return _("<unknown>");
7020 sprintf (p
, "PROC (%*.*lx)", field_size
, field_size
,
7021 (unsigned long) proc_flags
);
7022 p
+= 7 + field_size
;
7026 size
-= 10 + field_size
;
7027 if (p
!= buff
+ field_size
+ 4)
7031 warn (_("Internal error: not enough buffer room for section flag info"));
7032 return _("<unknown>");
7038 sprintf (p
, _("UNKNOWN (%*.*lx)"), field_size
, field_size
,
7039 (unsigned long) unknown_flags
);
7040 p
+= 10 + field_size
;
7048 static unsigned int ATTRIBUTE_WARN_UNUSED_RESULT
7049 get_compression_header (Elf_Internal_Chdr
*chdr
, unsigned char *buf
, bfd_size_type size
)
7053 Elf32_External_Chdr
*echdr
= (Elf32_External_Chdr
*) buf
;
7055 if (size
< sizeof (* echdr
))
7057 error (_("Compressed section is too small even for a compression header\n"));
7061 chdr
->ch_type
= BYTE_GET (echdr
->ch_type
);
7062 chdr
->ch_size
= BYTE_GET (echdr
->ch_size
);
7063 chdr
->ch_addralign
= BYTE_GET (echdr
->ch_addralign
);
7064 return sizeof (*echdr
);
7068 Elf64_External_Chdr
*echdr
= (Elf64_External_Chdr
*) buf
;
7070 if (size
< sizeof (* echdr
))
7072 error (_("Compressed section is too small even for a compression header\n"));
7076 chdr
->ch_type
= BYTE_GET (echdr
->ch_type
);
7077 chdr
->ch_size
= BYTE_GET (echdr
->ch_size
);
7078 chdr
->ch_addralign
= BYTE_GET (echdr
->ch_addralign
);
7079 return sizeof (*echdr
);
7084 process_section_headers (Filedata
* filedata
)
7086 Elf_Internal_Shdr
* section
;
7089 if (filedata
->file_header
.e_shnum
== 0)
7091 /* PR binutils/12467. */
7092 if (filedata
->file_header
.e_shoff
!= 0)
7094 warn (_("possibly corrupt ELF file header - it has a non-zero"
7095 " section header offset, but no section headers\n"));
7098 else if (do_sections
)
7099 printf (_("\nThere are no sections in this file.\n"));
7104 if (do_sections
&& !do_header
)
7106 if (filedata
->is_separate
&& process_links
)
7107 printf (_("In linked file '%s': "), filedata
->file_name
);
7108 if (! filedata
->is_separate
|| process_links
)
7109 printf (ngettext ("There is %d section header, "
7110 "starting at offset 0x%lx:\n",
7111 "There are %d section headers, "
7112 "starting at offset 0x%lx:\n",
7113 filedata
->file_header
.e_shnum
),
7114 filedata
->file_header
.e_shnum
,
7115 (unsigned long) filedata
->file_header
.e_shoff
);
7118 if (!get_section_headers (filedata
, false))
7121 /* Read in the string table, so that we have names to display. */
7122 if (filedata
->file_header
.e_shstrndx
!= SHN_UNDEF
7123 && filedata
->file_header
.e_shstrndx
< filedata
->file_header
.e_shnum
)
7125 section
= filedata
->section_headers
+ filedata
->file_header
.e_shstrndx
;
7127 if (section
->sh_size
!= 0)
7129 filedata
->string_table
= (char *) get_data (NULL
, filedata
, section
->sh_offset
,
7130 1, section
->sh_size
,
7133 filedata
->string_table_length
= filedata
->string_table
!= NULL
? section
->sh_size
: 0;
7137 /* Scan the sections for the dynamic symbol table
7138 and dynamic string table and debug sections. */
7139 eh_addr_size
= is_32bit_elf
? 4 : 8;
7140 switch (filedata
->file_header
.e_machine
)
7143 case EM_MIPS_RS3_LE
:
7144 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
7145 FDE addresses. However, the ABI also has a semi-official ILP32
7146 variant for which the normal FDE address size rules apply.
7148 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
7149 section, where XX is the size of longs in bits. Unfortunately,
7150 earlier compilers provided no way of distinguishing ILP32 objects
7151 from LP64 objects, so if there's any doubt, we should assume that
7152 the official LP64 form is being used. */
7153 if ((filedata
->file_header
.e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
7154 && find_section (filedata
, ".gcc_compiled_long32") == NULL
)
7160 switch (filedata
->file_header
.e_flags
& EF_H8_MACH
)
7162 case E_H8_MACH_H8300
:
7163 case E_H8_MACH_H8300HN
:
7164 case E_H8_MACH_H8300SN
:
7165 case E_H8_MACH_H8300SXN
:
7168 case E_H8_MACH_H8300H
:
7169 case E_H8_MACH_H8300S
:
7170 case E_H8_MACH_H8300SX
:
7178 switch (filedata
->file_header
.e_flags
& EF_M32C_CPU_MASK
)
7180 case EF_M32C_CPU_M16C
:
7187 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
7190 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
7191 if (section->sh_entsize != expected_entsize) \
7194 sprintf_vma (buf, section->sh_entsize); \
7195 /* Note: coded this way so that there is a single string for \
7197 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
7198 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
7199 (unsigned) expected_entsize); \
7200 section->sh_entsize = expected_entsize; \
7205 #define CHECK_ENTSIZE(section, i, type) \
7206 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
7207 sizeof (Elf64_External_##type))
7209 for (i
= 0, section
= filedata
->section_headers
;
7210 i
< filedata
->file_header
.e_shnum
;
7213 const char *name
= section_name_print (filedata
, section
);
7215 /* Run some sanity checks on the headers and
7216 possibly fill in some file data as well. */
7217 switch (section
->sh_type
)
7220 if (filedata
->dynamic_symbols
!= NULL
)
7222 error (_("File contains multiple dynamic symbol tables\n"));
7226 CHECK_ENTSIZE (section
, i
, Sym
);
7227 filedata
->dynamic_symbols
7228 = get_elf_symbols (filedata
, section
, &filedata
->num_dynamic_syms
);
7229 filedata
->dynamic_symtab_section
= section
;
7233 if (streq (name
, ".dynstr"))
7235 if (filedata
->dynamic_strings
!= NULL
)
7237 error (_("File contains multiple dynamic string tables\n"));
7241 filedata
->dynamic_strings
7242 = (char *) get_data (NULL
, filedata
, section
->sh_offset
,
7243 1, section
->sh_size
, _("dynamic strings"));
7244 filedata
->dynamic_strings_length
7245 = filedata
->dynamic_strings
== NULL
? 0 : section
->sh_size
;
7246 filedata
->dynamic_strtab_section
= section
;
7250 case SHT_SYMTAB_SHNDX
:
7252 elf_section_list
* entry
= xmalloc (sizeof * entry
);
7254 entry
->hdr
= section
;
7255 entry
->next
= filedata
->symtab_shndx_list
;
7256 filedata
->symtab_shndx_list
= entry
;
7261 CHECK_ENTSIZE (section
, i
, Sym
);
7265 CHECK_ENTSIZE_VALUES (section
, i
, GRP_ENTRY_SIZE
, GRP_ENTRY_SIZE
);
7269 CHECK_ENTSIZE (section
, i
, Rel
);
7270 if (do_checks
&& section
->sh_size
== 0)
7271 warn (_("Section '%s': zero-sized relocation section\n"), name
);
7275 CHECK_ENTSIZE (section
, i
, Rela
);
7276 if (do_checks
&& section
->sh_size
== 0)
7277 warn (_("Section '%s': zero-sized relocation section\n"), name
);
7281 CHECK_ENTSIZE (section
, i
, Relr
);
7286 /* Having a zero sized section is not illegal according to the
7287 ELF standard, but it might be an indication that something
7288 is wrong. So issue a warning if we are running in lint mode. */
7289 if (do_checks
&& section
->sh_size
== 0)
7290 warn (_("Section '%s': has a size of zero - is this intended ?\n"), name
);
7297 if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
7298 || do_debug_lines
|| do_debug_pubnames
|| do_debug_pubtypes
7299 || do_debug_aranges
|| do_debug_frames
|| do_debug_macinfo
7300 || do_debug_str
|| do_debug_str_offsets
|| do_debug_loc
7302 || do_debug_addr
|| do_debug_cu_index
|| do_debug_links
)
7303 && (startswith (name
, ".debug_")
7304 || startswith (name
, ".zdebug_")))
7307 name
+= sizeof (".zdebug_") - 1;
7309 name
+= sizeof (".debug_") - 1;
7312 || (do_debug_info
&& startswith (name
, "info"))
7313 || (do_debug_info
&& startswith (name
, "types"))
7314 || (do_debug_abbrevs
&& startswith (name
, "abbrev"))
7315 || (do_debug_lines
&& strcmp (name
, "line") == 0)
7316 || (do_debug_lines
&& startswith (name
, "line."))
7317 || (do_debug_pubnames
&& startswith (name
, "pubnames"))
7318 || (do_debug_pubtypes
&& startswith (name
, "pubtypes"))
7319 || (do_debug_pubnames
&& startswith (name
, "gnu_pubnames"))
7320 || (do_debug_pubtypes
&& startswith (name
, "gnu_pubtypes"))
7321 || (do_debug_aranges
&& startswith (name
, "aranges"))
7322 || (do_debug_ranges
&& startswith (name
, "ranges"))
7323 || (do_debug_ranges
&& startswith (name
, "rnglists"))
7324 || (do_debug_frames
&& startswith (name
, "frame"))
7325 || (do_debug_macinfo
&& startswith (name
, "macinfo"))
7326 || (do_debug_macinfo
&& startswith (name
, "macro"))
7327 || (do_debug_str
&& startswith (name
, "str"))
7328 || (do_debug_links
&& startswith (name
, "sup"))
7329 || (do_debug_str_offsets
&& startswith (name
, "str_offsets"))
7330 || (do_debug_loc
&& startswith (name
, "loc"))
7331 || (do_debug_loc
&& startswith (name
, "loclists"))
7332 || (do_debug_addr
&& startswith (name
, "addr"))
7333 || (do_debug_cu_index
&& startswith (name
, "cu_index"))
7334 || (do_debug_cu_index
&& startswith (name
, "tu_index"))
7336 request_dump_bynumber (&filedata
->dump
, i
, DEBUG_DUMP
);
7338 /* Linkonce section to be combined with .debug_info at link time. */
7339 else if ((do_debugging
|| do_debug_info
)
7340 && startswith (name
, ".gnu.linkonce.wi."))
7341 request_dump_bynumber (&filedata
->dump
, i
, DEBUG_DUMP
);
7342 else if (do_debug_frames
&& streq (name
, ".eh_frame"))
7343 request_dump_bynumber (&filedata
->dump
, i
, DEBUG_DUMP
);
7344 else if (do_gdb_index
&& (streq (name
, ".gdb_index")
7345 || streq (name
, ".debug_names")))
7346 request_dump_bynumber (&filedata
->dump
, i
, DEBUG_DUMP
);
7347 /* Trace sections for Itanium VMS. */
7348 else if ((do_debugging
|| do_trace_info
|| do_trace_abbrevs
7349 || do_trace_aranges
)
7350 && startswith (name
, ".trace_"))
7352 name
+= sizeof (".trace_") - 1;
7355 || (do_trace_info
&& streq (name
, "info"))
7356 || (do_trace_abbrevs
&& streq (name
, "abbrev"))
7357 || (do_trace_aranges
&& streq (name
, "aranges"))
7359 request_dump_bynumber (&filedata
->dump
, i
, DEBUG_DUMP
);
7361 else if ((do_debugging
|| do_debug_links
)
7362 && (startswith (name
, ".gnu_debuglink")
7363 || startswith (name
, ".gnu_debugaltlink")))
7364 request_dump_bynumber (&filedata
->dump
, i
, DEBUG_DUMP
);
7370 if (filedata
->is_separate
&& ! process_links
)
7373 if (filedata
->is_separate
)
7374 printf (_("\nSection Headers in linked file '%s':\n"), filedata
->file_name
);
7375 else if (filedata
->file_header
.e_shnum
> 1)
7376 printf (_("\nSection Headers:\n"));
7378 printf (_("\nSection Header:\n"));
7382 if (do_section_details
)
7384 printf (_(" [Nr] Name\n"));
7385 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
7389 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
7393 if (do_section_details
)
7395 printf (_(" [Nr] Name\n"));
7396 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
7400 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
7404 if (do_section_details
)
7406 printf (_(" [Nr] Name\n"));
7407 printf (_(" Type Address Offset Link\n"));
7408 printf (_(" Size EntSize Info Align\n"));
7412 printf (_(" [Nr] Name Type Address Offset\n"));
7413 printf (_(" Size EntSize Flags Link Info Align\n"));
7417 if (do_section_details
)
7418 printf (_(" Flags\n"));
7420 for (i
= 0, section
= filedata
->section_headers
;
7421 i
< filedata
->file_header
.e_shnum
;
7424 /* Run some sanity checks on the section header. */
7426 /* Check the sh_link field. */
7427 switch (section
->sh_type
)
7431 if (section
->sh_link
== 0
7432 && (filedata
->file_header
.e_type
== ET_EXEC
7433 || filedata
->file_header
.e_type
== ET_DYN
))
7434 /* A dynamic relocation section where all entries use a
7435 zero symbol index need not specify a symtab section. */
7438 case SHT_SYMTAB_SHNDX
:
7442 case SHT_GNU_versym
:
7443 if (section
->sh_link
== 0
7444 || section
->sh_link
>= filedata
->file_header
.e_shnum
7445 || (filedata
->section_headers
[section
->sh_link
].sh_type
!= SHT_SYMTAB
7446 && filedata
->section_headers
[section
->sh_link
].sh_type
!= SHT_DYNSYM
))
7447 warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
7448 i
, section
->sh_link
);
7454 case SHT_GNU_verneed
:
7455 case SHT_GNU_verdef
:
7456 case SHT_GNU_LIBLIST
:
7457 if (section
->sh_link
== 0
7458 || section
->sh_link
>= filedata
->file_header
.e_shnum
7459 || filedata
->section_headers
[section
->sh_link
].sh_type
!= SHT_STRTAB
)
7460 warn (_("[%2u]: Link field (%u) should index a string section.\n"),
7461 i
, section
->sh_link
);
7464 case SHT_INIT_ARRAY
:
7465 case SHT_FINI_ARRAY
:
7466 case SHT_PREINIT_ARRAY
:
7467 if (section
->sh_type
< SHT_LOOS
&& section
->sh_link
!= 0)
7468 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
7469 i
, section
->sh_link
);
7473 /* FIXME: Add support for target specific section types. */
7474 #if 0 /* Currently we do not check other section types as there are too
7475 many special cases. Stab sections for example have a type
7476 of SHT_PROGBITS but an sh_link field that links to the .stabstr
7478 if (section
->sh_type
< SHT_LOOS
&& section
->sh_link
!= 0)
7479 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
7480 i
, section
->sh_link
);
7485 /* Check the sh_info field. */
7486 switch (section
->sh_type
)
7490 if (section
->sh_info
== 0
7491 && (filedata
->file_header
.e_type
== ET_EXEC
7492 || filedata
->file_header
.e_type
== ET_DYN
))
7493 /* Dynamic relocations apply to segments, so they do not
7494 need to specify the section they relocate. */
7496 if (section
->sh_info
== 0
7497 || section
->sh_info
>= filedata
->file_header
.e_shnum
7498 || (filedata
->section_headers
[section
->sh_info
].sh_type
!= SHT_PROGBITS
7499 && filedata
->section_headers
[section
->sh_info
].sh_type
!= SHT_NOBITS
7500 && filedata
->section_headers
[section
->sh_info
].sh_type
!= SHT_NOTE
7501 && filedata
->section_headers
[section
->sh_info
].sh_type
!= SHT_INIT_ARRAY
7502 && filedata
->section_headers
[section
->sh_info
].sh_type
!= SHT_FINI_ARRAY
7503 && filedata
->section_headers
[section
->sh_info
].sh_type
!= SHT_PREINIT_ARRAY
7504 /* FIXME: Are other section types valid ? */
7505 && filedata
->section_headers
[section
->sh_info
].sh_type
< SHT_LOOS
))
7506 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
7507 i
, section
->sh_info
);
7512 case SHT_SYMTAB_SHNDX
:
7513 case SHT_INIT_ARRAY
:
7514 case SHT_FINI_ARRAY
:
7515 case SHT_PREINIT_ARRAY
:
7516 if (section
->sh_info
!= 0)
7517 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
7518 i
, section
->sh_info
);
7524 /* A symbol index - we assume that it is valid. */
7528 /* FIXME: Add support for target specific section types. */
7529 if (section
->sh_type
== SHT_NOBITS
)
7530 /* NOBITS section headers with non-zero sh_info fields can be
7531 created when a binary is stripped of everything but its debug
7532 information. The stripped sections have their headers
7533 preserved but their types set to SHT_NOBITS. So do not check
7534 this type of section. */
7536 else if (section
->sh_flags
& SHF_INFO_LINK
)
7538 if (section
->sh_info
< 1 || section
->sh_info
>= filedata
->file_header
.e_shnum
)
7539 warn (_("[%2u]: Expected link to another section in info field"), i
);
7541 else if (section
->sh_type
< SHT_LOOS
7542 && (section
->sh_flags
& SHF_GNU_MBIND
) == 0
7543 && section
->sh_info
!= 0)
7544 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
7545 i
, section
->sh_info
);
7549 /* Check the sh_size field. */
7550 if (section
->sh_size
> filedata
->file_size
7551 && section
->sh_type
!= SHT_NOBITS
7552 && section
->sh_type
!= SHT_NULL
7553 && section
->sh_type
< SHT_LOOS
)
7554 warn (_("Size of section %u is larger than the entire file!\n"), i
);
7556 printf (" [%2u] ", i
);
7557 if (do_section_details
)
7558 printf ("%s\n ", printable_section_name (filedata
, section
));
7560 print_symbol (-17, section_name_print (filedata
, section
));
7562 printf (do_wide
? " %-15s " : " %-15.15s ",
7563 get_section_type_name (filedata
, section
->sh_type
));
7567 const char * link_too_big
= NULL
;
7569 print_vma (section
->sh_addr
, LONG_HEX
);
7571 printf ( " %6.6lx %6.6lx %2.2lx",
7572 (unsigned long) section
->sh_offset
,
7573 (unsigned long) section
->sh_size
,
7574 (unsigned long) section
->sh_entsize
);
7576 if (do_section_details
)
7577 fputs (" ", stdout
);
7579 printf (" %3s ", get_elf_section_flags (filedata
, section
->sh_flags
));
7581 if (section
->sh_link
>= filedata
->file_header
.e_shnum
)
7584 /* The sh_link value is out of range. Normally this indicates
7585 an error but it can have special values in Solaris binaries. */
7586 switch (filedata
->file_header
.e_machine
)
7593 case EM_OLD_SPARCV9
:
7594 case EM_SPARC32PLUS
:
7597 if (section
->sh_link
== (SHN_BEFORE
& 0xffff))
7598 link_too_big
= "BEFORE";
7599 else if (section
->sh_link
== (SHN_AFTER
& 0xffff))
7600 link_too_big
= "AFTER";
7607 if (do_section_details
)
7609 if (link_too_big
!= NULL
&& * link_too_big
)
7610 printf ("<%s> ", link_too_big
);
7612 printf ("%2u ", section
->sh_link
);
7613 printf ("%3u %2lu\n", section
->sh_info
,
7614 (unsigned long) section
->sh_addralign
);
7617 printf ("%2u %3u %2lu\n",
7620 (unsigned long) section
->sh_addralign
);
7622 if (link_too_big
&& ! * link_too_big
)
7623 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
7624 i
, section
->sh_link
);
7628 print_vma (section
->sh_addr
, LONG_HEX
);
7630 if ((long) section
->sh_offset
== section
->sh_offset
)
7631 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
7635 print_vma (section
->sh_offset
, LONG_HEX
);
7638 if ((unsigned long) section
->sh_size
== section
->sh_size
)
7639 printf (" %6.6lx", (unsigned long) section
->sh_size
);
7643 print_vma (section
->sh_size
, LONG_HEX
);
7646 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
7647 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
7651 print_vma (section
->sh_entsize
, LONG_HEX
);
7654 if (do_section_details
)
7655 fputs (" ", stdout
);
7657 printf (" %3s ", get_elf_section_flags (filedata
, section
->sh_flags
));
7659 printf ("%2u %3u ", section
->sh_link
, section
->sh_info
);
7661 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
7662 printf ("%2lu\n", (unsigned long) section
->sh_addralign
);
7665 print_vma (section
->sh_addralign
, DEC
);
7669 else if (do_section_details
)
7672 print_vma (section
->sh_addr
, LONG_HEX
);
7673 if ((long) section
->sh_offset
== section
->sh_offset
)
7674 printf (" %16.16lx", (unsigned long) section
->sh_offset
);
7678 print_vma (section
->sh_offset
, LONG_HEX
);
7680 printf (" %u\n ", section
->sh_link
);
7681 print_vma (section
->sh_size
, LONG_HEX
);
7683 print_vma (section
->sh_entsize
, LONG_HEX
);
7685 printf (" %-16u %lu\n",
7687 (unsigned long) section
->sh_addralign
);
7692 print_vma (section
->sh_addr
, LONG_HEX
);
7693 if ((long) section
->sh_offset
== section
->sh_offset
)
7694 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
7698 print_vma (section
->sh_offset
, LONG_HEX
);
7701 print_vma (section
->sh_size
, LONG_HEX
);
7703 print_vma (section
->sh_entsize
, LONG_HEX
);
7705 printf (" %3s ", get_elf_section_flags (filedata
, section
->sh_flags
));
7707 printf (" %2u %3u %lu\n",
7710 (unsigned long) section
->sh_addralign
);
7713 if (do_section_details
)
7715 printf (" %s\n", get_elf_section_flags (filedata
, section
->sh_flags
));
7716 if ((section
->sh_flags
& SHF_COMPRESSED
) != 0)
7718 /* Minimum section size is 12 bytes for 32-bit compression
7719 header + 12 bytes for compressed data header. */
7720 unsigned char buf
[24];
7722 assert (sizeof (buf
) >= sizeof (Elf64_External_Chdr
));
7723 if (get_data (&buf
, filedata
, section
->sh_offset
, 1,
7724 sizeof (buf
), _("compression header")))
7726 Elf_Internal_Chdr chdr
;
7728 if (get_compression_header (&chdr
, buf
, sizeof (buf
)) == 0)
7729 printf (_(" [<corrupt>]\n"));
7732 if (chdr
.ch_type
== ELFCOMPRESS_ZLIB
)
7735 printf (_(" [<unknown>: 0x%x], "),
7737 print_vma (chdr
.ch_size
, LONG_HEX
);
7738 printf (", %lu\n", (unsigned long) chdr
.ch_addralign
);
7745 if (!do_section_details
)
7747 /* The ordering of the letters shown here matches the ordering of the
7748 corresponding SHF_xxx values, and hence the order in which these
7749 letters will be displayed to the user. */
7750 printf (_("Key to Flags:\n\
7751 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
7752 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
7753 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
7754 switch (filedata
->file_header
.e_ident
[EI_OSABI
])
7757 case ELFOSABI_FREEBSD
:
7758 printf (_("R (retain), "));
7761 printf (_("D (mbind), "));
7766 if (filedata
->file_header
.e_machine
== EM_X86_64
7767 || filedata
->file_header
.e_machine
== EM_L1OM
7768 || filedata
->file_header
.e_machine
== EM_K1OM
)
7769 printf (_("l (large), "));
7770 else if (filedata
->file_header
.e_machine
== EM_ARM
)
7771 printf (_("y (purecode), "));
7772 else if (filedata
->file_header
.e_machine
== EM_PPC
)
7773 printf (_("v (VLE), "));
7774 printf ("p (processor specific)\n");
7781 get_symtab (Filedata
*filedata
, Elf_Internal_Shdr
*symsec
,
7782 Elf_Internal_Sym
**symtab
, unsigned long *nsyms
,
7783 char **strtab
, unsigned long *strtablen
)
7787 *symtab
= get_elf_symbols (filedata
, symsec
, nsyms
);
7789 if (*symtab
== NULL
)
7792 if (symsec
->sh_link
!= 0)
7794 Elf_Internal_Shdr
*strsec
;
7796 if (symsec
->sh_link
>= filedata
->file_header
.e_shnum
)
7798 error (_("Bad sh_link in symbol table section\n"));
7805 strsec
= filedata
->section_headers
+ symsec
->sh_link
;
7807 *strtab
= (char *) get_data (NULL
, filedata
, strsec
->sh_offset
,
7808 1, strsec
->sh_size
, _("string table"));
7809 if (*strtab
== NULL
)
7816 *strtablen
= strsec
->sh_size
;
7822 get_group_flags (unsigned int flags
)
7824 static char buff
[128];
7828 else if (flags
== GRP_COMDAT
)
7831 snprintf (buff
, sizeof buff
, "[0x%x: %s%s%s]",
7833 flags
& GRP_MASKOS
? _("<OS specific>") : "",
7834 flags
& GRP_MASKPROC
? _("<PROC specific>") : "",
7835 (flags
& ~(GRP_COMDAT
| GRP_MASKOS
| GRP_MASKPROC
)
7836 ? _("<unknown>") : ""));
7842 process_section_groups (Filedata
* filedata
)
7844 Elf_Internal_Shdr
* section
;
7846 struct group
* group
;
7847 Elf_Internal_Shdr
* symtab_sec
;
7848 Elf_Internal_Shdr
* strtab_sec
;
7849 Elf_Internal_Sym
* symtab
;
7850 unsigned long num_syms
;
7854 /* Don't process section groups unless needed. */
7855 if (!do_unwind
&& !do_section_groups
)
7858 if (filedata
->file_header
.e_shnum
== 0)
7860 if (do_section_groups
)
7862 if (filedata
->is_separate
)
7863 printf (_("\nThere are no sections group in linked file '%s'.\n"),
7864 filedata
->file_name
);
7866 printf (_("\nThere are no section groups in this file.\n"));
7871 if (filedata
->section_headers
== NULL
)
7873 error (_("Section headers are not available!\n"));
7874 /* PR 13622: This can happen with a corrupt ELF header. */
7878 filedata
->section_headers_groups
7879 = (struct group
**) calloc (filedata
->file_header
.e_shnum
,
7880 sizeof (struct group
*));
7882 if (filedata
->section_headers_groups
== NULL
)
7884 error (_("Out of memory reading %u section group headers\n"),
7885 filedata
->file_header
.e_shnum
);
7889 /* Scan the sections for the group section. */
7890 filedata
->group_count
= 0;
7891 for (i
= 0, section
= filedata
->section_headers
;
7892 i
< filedata
->file_header
.e_shnum
;
7894 if (section
->sh_type
== SHT_GROUP
)
7895 filedata
->group_count
++;
7897 if (filedata
->group_count
== 0)
7899 if (do_section_groups
)
7901 if (filedata
->is_separate
)
7902 printf (_("\nThere are no section groups in linked file '%s'.\n"),
7903 filedata
->file_name
);
7905 printf (_("\nThere are no section groups in this file.\n"));
7911 filedata
->section_groups
= (struct group
*) calloc (filedata
->group_count
,
7912 sizeof (struct group
));
7914 if (filedata
->section_groups
== NULL
)
7916 error (_("Out of memory reading %lu groups\n"),
7917 (unsigned long) filedata
->group_count
);
7928 if (filedata
->is_separate
)
7929 printf (_("Section groups in linked file '%s'\n"), filedata
->file_name
);
7931 for (i
= 0, section
= filedata
->section_headers
, group
= filedata
->section_groups
;
7932 i
< filedata
->file_header
.e_shnum
;
7935 if (section
->sh_type
== SHT_GROUP
)
7937 const char * name
= printable_section_name (filedata
, section
);
7938 const char * group_name
;
7939 unsigned char * start
;
7940 unsigned char * indices
;
7941 unsigned int entry
, j
, size
;
7942 Elf_Internal_Shdr
* sec
;
7943 Elf_Internal_Sym
* sym
;
7945 /* Get the symbol table. */
7946 if (section
->sh_link
>= filedata
->file_header
.e_shnum
7947 || ((sec
= filedata
->section_headers
+ section
->sh_link
)->sh_type
7950 error (_("Bad sh_link in group section `%s'\n"), name
);
7954 if (symtab_sec
!= sec
)
7958 symtab
= get_elf_symbols (filedata
, symtab_sec
, & num_syms
);
7963 error (_("Corrupt header in group section `%s'\n"), name
);
7967 if (section
->sh_info
>= num_syms
)
7969 error (_("Bad sh_info in group section `%s'\n"), name
);
7973 sym
= symtab
+ section
->sh_info
;
7975 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
7977 if (sym
->st_shndx
== 0
7978 || sym
->st_shndx
>= filedata
->file_header
.e_shnum
)
7980 error (_("Bad sh_info in group section `%s'\n"), name
);
7984 group_name
= section_name_print (filedata
,
7985 filedata
->section_headers
7994 /* Get the string table. */
7995 if (symtab_sec
->sh_link
>= filedata
->file_header
.e_shnum
)
8003 != (sec
= filedata
->section_headers
+ symtab_sec
->sh_link
))
8008 strtab
= (char *) get_data (NULL
, filedata
, strtab_sec
->sh_offset
,
8009 1, strtab_sec
->sh_size
,
8011 strtab_size
= strtab
!= NULL
? strtab_sec
->sh_size
: 0;
8013 group_name
= sym
->st_name
< strtab_size
8014 ? strtab
+ sym
->st_name
: _("<corrupt>");
8017 /* PR 17531: file: loop. */
8018 if (section
->sh_entsize
> section
->sh_size
)
8020 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
8021 printable_section_name (filedata
, section
),
8022 (unsigned long) section
->sh_entsize
,
8023 (unsigned long) section
->sh_size
);
8027 start
= (unsigned char *) get_data (NULL
, filedata
, section
->sh_offset
,
8028 1, section
->sh_size
,
8034 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
8035 entry
= byte_get (indices
, 4);
8038 if (do_section_groups
)
8040 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
8041 get_group_flags (entry
), i
, name
, group_name
, size
);
8043 printf (_(" [Index] Name\n"));
8046 group
->group_index
= i
;
8048 for (j
= 0; j
< size
; j
++)
8050 struct group_list
* g
;
8052 entry
= byte_get (indices
, 4);
8055 if (entry
>= filedata
->file_header
.e_shnum
)
8057 static unsigned num_group_errors
= 0;
8059 if (num_group_errors
++ < 10)
8061 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
8062 entry
, i
, filedata
->file_header
.e_shnum
- 1);
8063 if (num_group_errors
== 10)
8064 warn (_("Further error messages about overlarge group section indices suppressed\n"));
8069 if (filedata
->section_headers_groups
[entry
] != NULL
)
8073 static unsigned num_errs
= 0;
8075 if (num_errs
++ < 10)
8077 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
8079 filedata
->section_headers_groups
[entry
]->group_index
);
8081 warn (_("Further error messages about already contained group sections suppressed\n"));
8087 /* Intel C/C++ compiler may put section 0 in a
8088 section group. We just warn it the first time
8089 and ignore it afterwards. */
8090 static bool warned
= false;
8093 error (_("section 0 in group section [%5u]\n"),
8094 filedata
->section_headers_groups
[entry
]->group_index
);
8100 filedata
->section_headers_groups
[entry
] = group
;
8102 if (do_section_groups
)
8104 sec
= filedata
->section_headers
+ entry
;
8105 printf (" [%5u] %s\n", entry
, printable_section_name (filedata
, sec
));
8108 g
= (struct group_list
*) xmalloc (sizeof (struct group_list
));
8109 g
->section_index
= entry
;
8110 g
->next
= group
->root
;
8125 /* Data used to display dynamic fixups. */
8127 struct ia64_vms_dynfixup
8129 bfd_vma needed_ident
; /* Library ident number. */
8130 bfd_vma needed
; /* Index in the dstrtab of the library name. */
8131 bfd_vma fixup_needed
; /* Index of the library. */
8132 bfd_vma fixup_rela_cnt
; /* Number of fixups. */
8133 bfd_vma fixup_rela_off
; /* Fixups offset in the dynamic segment. */
8136 /* Data used to display dynamic relocations. */
8138 struct ia64_vms_dynimgrela
8140 bfd_vma img_rela_cnt
; /* Number of relocations. */
8141 bfd_vma img_rela_off
; /* Reloc offset in the dynamic segment. */
8144 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
8148 dump_ia64_vms_dynamic_fixups (Filedata
* filedata
,
8149 struct ia64_vms_dynfixup
* fixup
,
8150 const char * strtab
,
8151 unsigned int strtab_sz
)
8153 Elf64_External_VMS_IMAGE_FIXUP
* imfs
;
8155 const char * lib_name
;
8157 imfs
= get_data (NULL
, filedata
,
8158 filedata
->dynamic_addr
+ fixup
->fixup_rela_off
,
8159 sizeof (*imfs
), fixup
->fixup_rela_cnt
,
8160 _("dynamic section image fixups"));
8164 if (fixup
->needed
< strtab_sz
)
8165 lib_name
= strtab
+ fixup
->needed
;
8168 warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
8169 (unsigned long) fixup
->needed
);
8173 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
8174 (int) fixup
->fixup_needed
, lib_name
, (long) fixup
->needed_ident
);
8176 (_("Seg Offset Type SymVec DataType\n"));
8178 for (i
= 0; i
< (long) fixup
->fixup_rela_cnt
; i
++)
8183 printf ("%3u ", (unsigned) BYTE_GET (imfs
[i
].fixup_seg
));
8184 printf_vma ((bfd_vma
) BYTE_GET (imfs
[i
].fixup_offset
));
8185 type
= BYTE_GET (imfs
[i
].type
);
8186 rtype
= elf_ia64_reloc_type (type
);
8188 printf (" 0x%08x ", type
);
8190 printf (" %-32s ", rtype
);
8191 printf ("%6u ", (unsigned) BYTE_GET (imfs
[i
].symvec_index
));
8192 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs
[i
].data_type
));
8199 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
8202 dump_ia64_vms_dynamic_relocs (Filedata
* filedata
, struct ia64_vms_dynimgrela
*imgrela
)
8204 Elf64_External_VMS_IMAGE_RELA
*imrs
;
8207 imrs
= get_data (NULL
, filedata
,
8208 filedata
->dynamic_addr
+ imgrela
->img_rela_off
,
8209 sizeof (*imrs
), imgrela
->img_rela_cnt
,
8210 _("dynamic section image relocations"));
8214 printf (_("\nImage relocs\n"));
8216 (_("Seg Offset Type Addend Seg Sym Off\n"));
8218 for (i
= 0; i
< (long) imgrela
->img_rela_cnt
; i
++)
8223 printf ("%3u ", (unsigned) BYTE_GET (imrs
[i
].rela_seg
));
8224 printf ("%08" BFD_VMA_FMT
"x ",
8225 (bfd_vma
) BYTE_GET (imrs
[i
].rela_offset
));
8226 type
= BYTE_GET (imrs
[i
].type
);
8227 rtype
= elf_ia64_reloc_type (type
);
8229 printf ("0x%08x ", type
);
8231 printf ("%-31s ", rtype
);
8232 print_vma (BYTE_GET (imrs
[i
].addend
), FULL_HEX
);
8233 printf ("%3u ", (unsigned) BYTE_GET (imrs
[i
].sym_seg
));
8234 printf ("%08" BFD_VMA_FMT
"x\n",
8235 (bfd_vma
) BYTE_GET (imrs
[i
].sym_offset
));
8242 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
8245 process_ia64_vms_dynamic_relocs (Filedata
* filedata
)
8247 struct ia64_vms_dynfixup fixup
;
8248 struct ia64_vms_dynimgrela imgrela
;
8249 Elf_Internal_Dyn
*entry
;
8250 bfd_vma strtab_off
= 0;
8251 bfd_vma strtab_sz
= 0;
8252 char *strtab
= NULL
;
8255 memset (&fixup
, 0, sizeof (fixup
));
8256 memset (&imgrela
, 0, sizeof (imgrela
));
8258 /* Note: the order of the entries is specified by the OpenVMS specs. */
8259 for (entry
= filedata
->dynamic_section
;
8260 entry
< filedata
->dynamic_section
+ filedata
->dynamic_nent
;
8263 switch (entry
->d_tag
)
8265 case DT_IA_64_VMS_STRTAB_OFFSET
:
8266 strtab_off
= entry
->d_un
.d_val
;
8269 strtab_sz
= entry
->d_un
.d_val
;
8271 strtab
= get_data (NULL
, filedata
,
8272 filedata
->dynamic_addr
+ strtab_off
,
8273 1, strtab_sz
, _("dynamic string section"));
8278 case DT_IA_64_VMS_NEEDED_IDENT
:
8279 fixup
.needed_ident
= entry
->d_un
.d_val
;
8282 fixup
.needed
= entry
->d_un
.d_val
;
8284 case DT_IA_64_VMS_FIXUP_NEEDED
:
8285 fixup
.fixup_needed
= entry
->d_un
.d_val
;
8287 case DT_IA_64_VMS_FIXUP_RELA_CNT
:
8288 fixup
.fixup_rela_cnt
= entry
->d_un
.d_val
;
8290 case DT_IA_64_VMS_FIXUP_RELA_OFF
:
8291 fixup
.fixup_rela_off
= entry
->d_un
.d_val
;
8292 if (! dump_ia64_vms_dynamic_fixups (filedata
, &fixup
, strtab
, strtab_sz
))
8295 case DT_IA_64_VMS_IMG_RELA_CNT
:
8296 imgrela
.img_rela_cnt
= entry
->d_un
.d_val
;
8298 case DT_IA_64_VMS_IMG_RELA_OFF
:
8299 imgrela
.img_rela_off
= entry
->d_un
.d_val
;
8300 if (! dump_ia64_vms_dynamic_relocs (filedata
, &imgrela
))
8319 relocation_type rel_type
;
8321 dynamic_relocations
[] =
8323 { "REL", DT_REL
, DT_RELSZ
, reltype_rel
},
8324 { "RELA", DT_RELA
, DT_RELASZ
, reltype_rela
},
8325 { "RELR", DT_RELR
, DT_RELRSZ
, reltype_relr
},
8326 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, reltype_unknown
}
8329 /* Process the reloc section. */
8332 process_relocs (Filedata
* filedata
)
8334 unsigned long rel_size
;
8335 unsigned long rel_offset
;
8340 if (do_using_dynamic
)
8342 relocation_type rel_type
;
8344 bool has_dynamic_reloc
;
8347 has_dynamic_reloc
= false;
8349 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
8351 rel_type
= dynamic_relocations
[i
].rel_type
;
8352 name
= dynamic_relocations
[i
].name
;
8353 rel_size
= filedata
->dynamic_info
[dynamic_relocations
[i
].size
];
8354 rel_offset
= filedata
->dynamic_info
[dynamic_relocations
[i
].reloc
];
8357 has_dynamic_reloc
= true;
8359 if (rel_type
== reltype_unknown
)
8361 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
8362 switch (filedata
->dynamic_info
[DT_PLTREL
])
8365 rel_type
= reltype_rel
;
8368 rel_type
= reltype_rela
;
8375 if (filedata
->is_separate
)
8377 (_("\nIn linked file '%s' section '%s' at offset 0x%lx contains %ld bytes:\n"),
8378 filedata
->file_name
, name
, rel_offset
, rel_size
);
8381 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
8382 name
, rel_offset
, rel_size
);
8384 dump_relocations (filedata
,
8385 offset_from_vma (filedata
, rel_offset
, rel_size
),
8387 filedata
->dynamic_symbols
,
8388 filedata
->num_dynamic_syms
,
8389 filedata
->dynamic_strings
,
8390 filedata
->dynamic_strings_length
,
8391 rel_type
, true /* is_dynamic */);
8395 if (is_ia64_vms (filedata
))
8396 if (process_ia64_vms_dynamic_relocs (filedata
))
8397 has_dynamic_reloc
= true;
8399 if (! has_dynamic_reloc
)
8401 if (filedata
->is_separate
)
8402 printf (_("\nThere are no dynamic relocations in linked file '%s'.\n"),
8403 filedata
->file_name
);
8405 printf (_("\nThere are no dynamic relocations in this file.\n"));
8410 Elf_Internal_Shdr
* section
;
8414 for (i
= 0, section
= filedata
->section_headers
;
8415 i
< filedata
->file_header
.e_shnum
;
8418 if ( section
->sh_type
!= SHT_RELA
8419 && section
->sh_type
!= SHT_REL
8420 && section
->sh_type
!= SHT_RELR
)
8423 rel_offset
= section
->sh_offset
;
8424 rel_size
= section
->sh_size
;
8428 relocation_type rel_type
;
8429 unsigned long num_rela
;
8431 if (filedata
->is_separate
)
8432 printf (_("\nIn linked file '%s' relocation section "),
8433 filedata
->file_name
);
8435 printf (_("\nRelocation section "));
8437 if (filedata
->string_table
== NULL
)
8438 printf ("%d", section
->sh_name
);
8440 printf ("'%s'", printable_section_name (filedata
, section
));
8442 num_rela
= rel_size
/ section
->sh_entsize
;
8443 printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
8444 " at offset 0x%lx contains %lu entries:\n",
8446 rel_offset
, num_rela
);
8448 rel_type
= section
->sh_type
== SHT_RELA
? reltype_rela
:
8449 section
->sh_type
== SHT_REL
? reltype_rel
: reltype_relr
;
8451 if (section
->sh_link
!= 0
8452 && section
->sh_link
< filedata
->file_header
.e_shnum
)
8454 Elf_Internal_Shdr
* symsec
;
8455 Elf_Internal_Sym
* symtab
;
8456 unsigned long nsyms
;
8457 unsigned long strtablen
= 0;
8458 char * strtab
= NULL
;
8460 symsec
= filedata
->section_headers
+ section
->sh_link
;
8461 if (symsec
->sh_type
!= SHT_SYMTAB
8462 && symsec
->sh_type
!= SHT_DYNSYM
)
8465 if (!get_symtab (filedata
, symsec
,
8466 &symtab
, &nsyms
, &strtab
, &strtablen
))
8469 dump_relocations (filedata
, rel_offset
, rel_size
,
8470 symtab
, nsyms
, strtab
, strtablen
,
8472 symsec
->sh_type
== SHT_DYNSYM
);
8477 dump_relocations (filedata
, rel_offset
, rel_size
,
8478 NULL
, 0, NULL
, 0, rel_type
, false /* is_dynamic */);
8486 /* Users sometimes forget the -D option, so try to be helpful. */
8487 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
8489 if (filedata
->dynamic_info
[dynamic_relocations
[i
].size
])
8491 if (filedata
->is_separate
)
8492 printf (_("\nThere are no static relocations in linked file '%s'."),
8493 filedata
->file_name
);
8495 printf (_("\nThere are no static relocations in this file."));
8496 printf (_("\nTo see the dynamic relocations add --use-dynamic to the command line.\n"));
8501 if (i
== ARRAY_SIZE (dynamic_relocations
))
8503 if (filedata
->is_separate
)
8504 printf (_("\nThere are no relocations in linked file '%s'.\n"),
8505 filedata
->file_name
);
8507 printf (_("\nThere are no relocations in this file.\n"));
8515 /* An absolute address consists of a section and an offset. If the
8516 section is NULL, the offset itself is the address, otherwise, the
8517 address equals to LOAD_ADDRESS(section) + offset. */
8521 unsigned short section
;
8525 /* Find the nearest symbol at or below ADDR. Returns the symbol
8526 name, if found, and the offset from the symbol to ADDR. */
8529 find_symbol_for_address (Filedata
* filedata
,
8530 Elf_Internal_Sym
* symtab
,
8531 unsigned long nsyms
,
8532 const char * strtab
,
8533 unsigned long strtab_size
,
8534 struct absaddr addr
,
8535 const char ** symname
,
8538 bfd_vma dist
= 0x100000;
8539 Elf_Internal_Sym
* sym
;
8540 Elf_Internal_Sym
* beg
;
8541 Elf_Internal_Sym
* end
;
8542 Elf_Internal_Sym
* best
= NULL
;
8544 REMOVE_ARCH_BITS (addr
.offset
);
8546 end
= symtab
+ nsyms
;
8552 sym
= beg
+ (end
- beg
) / 2;
8554 value
= sym
->st_value
;
8555 REMOVE_ARCH_BITS (value
);
8557 if (sym
->st_name
!= 0
8558 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
8559 && addr
.offset
>= value
8560 && addr
.offset
- value
< dist
)
8563 dist
= addr
.offset
- value
;
8568 if (addr
.offset
< value
)
8576 *symname
= (best
->st_name
>= strtab_size
8577 ? _("<corrupt>") : strtab
+ best
->st_name
);
8583 *offset
= addr
.offset
;
8586 static /* signed */ int
8587 symcmp (const void *p
, const void *q
)
8589 Elf_Internal_Sym
*sp
= (Elf_Internal_Sym
*) p
;
8590 Elf_Internal_Sym
*sq
= (Elf_Internal_Sym
*) q
;
8592 return sp
->st_value
> sq
->st_value
? 1 : (sp
->st_value
< sq
->st_value
? -1 : 0);
8595 /* Process the unwind section. */
8597 #include "unwind-ia64.h"
8599 struct ia64_unw_table_entry
8601 struct absaddr start
;
8603 struct absaddr info
;
8606 struct ia64_unw_aux_info
8608 struct ia64_unw_table_entry
* table
; /* Unwind table. */
8609 unsigned long table_len
; /* Length of unwind table. */
8610 unsigned char * info
; /* Unwind info. */
8611 unsigned long info_size
; /* Size of unwind info. */
8612 bfd_vma info_addr
; /* Starting address of unwind info. */
8613 bfd_vma seg_base
; /* Starting address of segment. */
8614 Elf_Internal_Sym
* symtab
; /* The symbol table. */
8615 unsigned long nsyms
; /* Number of symbols. */
8616 Elf_Internal_Sym
* funtab
; /* Sorted table of STT_FUNC symbols. */
8617 unsigned long nfuns
; /* Number of entries in funtab. */
8618 char * strtab
; /* The string table. */
8619 unsigned long strtab_size
; /* Size of string table. */
8623 dump_ia64_unwind (Filedata
* filedata
, struct ia64_unw_aux_info
* aux
)
8625 struct ia64_unw_table_entry
* tp
;
8626 unsigned long j
, nfuns
;
8630 aux
->funtab
= xmalloc (aux
->nsyms
* sizeof (Elf_Internal_Sym
));
8631 for (nfuns
= 0, j
= 0; j
< aux
->nsyms
; j
++)
8632 if (aux
->symtab
[j
].st_value
&& ELF_ST_TYPE (aux
->symtab
[j
].st_info
) == STT_FUNC
)
8633 aux
->funtab
[nfuns
++] = aux
->symtab
[j
];
8635 qsort (aux
->funtab
, aux
->nfuns
, sizeof (Elf_Internal_Sym
), symcmp
);
8637 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
8641 const unsigned char * dp
;
8642 const unsigned char * head
;
8643 const unsigned char * end
;
8644 const char * procname
;
8646 find_symbol_for_address (filedata
, aux
->funtab
, aux
->nfuns
, aux
->strtab
,
8647 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
8649 fputs ("\n<", stdout
);
8653 fputs (procname
, stdout
);
8656 printf ("+%lx", (unsigned long) offset
);
8659 fputs (">: [", stdout
);
8660 print_vma (tp
->start
.offset
, PREFIX_HEX
);
8661 fputc ('-', stdout
);
8662 print_vma (tp
->end
.offset
, PREFIX_HEX
);
8663 printf ("], info at +0x%lx\n",
8664 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
8666 /* PR 17531: file: 86232b32. */
8667 if (aux
->info
== NULL
)
8670 offset
= tp
->info
.offset
;
8671 if (tp
->info
.section
)
8673 if (tp
->info
.section
>= filedata
->file_header
.e_shnum
)
8675 warn (_("Invalid section %u in table entry %ld\n"),
8676 tp
->info
.section
, (long) (tp
- aux
->table
));
8680 offset
+= filedata
->section_headers
[tp
->info
.section
].sh_addr
;
8682 offset
-= aux
->info_addr
;
8683 /* PR 17531: file: 0997b4d1. */
8684 if (offset
>= aux
->info_size
8685 || aux
->info_size
- offset
< 8)
8687 warn (_("Invalid offset %lx in table entry %ld\n"),
8688 (long) tp
->info
.offset
, (long) (tp
- aux
->table
));
8693 head
= aux
->info
+ offset
;
8694 stamp
= byte_get ((unsigned char *) head
, sizeof (stamp
));
8696 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
8697 (unsigned) UNW_VER (stamp
),
8698 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
8699 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
8700 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
8701 (unsigned long) (eh_addr_size
* UNW_LENGTH (stamp
)));
8703 if (UNW_VER (stamp
) != 1)
8705 printf (_("\tUnknown version.\n"));
8710 end
= head
+ 8 + eh_addr_size
* UNW_LENGTH (stamp
);
8711 /* PR 17531: file: 16ceda89. */
8712 if (end
> aux
->info
+ aux
->info_size
)
8713 end
= aux
->info
+ aux
->info_size
;
8714 for (dp
= head
+ 8; dp
< end
;)
8715 dp
= unw_decode (dp
, in_body
, & in_body
, end
);
8724 slurp_ia64_unwind_table (Filedata
* filedata
,
8725 struct ia64_unw_aux_info
* aux
,
8726 Elf_Internal_Shdr
* sec
)
8728 unsigned long size
, nrelas
, i
;
8729 Elf_Internal_Phdr
* seg
;
8730 struct ia64_unw_table_entry
* tep
;
8731 Elf_Internal_Shdr
* relsec
;
8732 Elf_Internal_Rela
* rela
;
8733 Elf_Internal_Rela
* rp
;
8734 unsigned char * table
;
8736 Elf_Internal_Sym
* sym
;
8737 const char * relname
;
8741 /* First, find the starting address of the segment that includes
8744 if (filedata
->file_header
.e_phnum
)
8746 if (! get_program_headers (filedata
))
8749 for (seg
= filedata
->program_headers
;
8750 seg
< filedata
->program_headers
+ filedata
->file_header
.e_phnum
;
8753 if (seg
->p_type
!= PT_LOAD
)
8756 if (sec
->sh_addr
>= seg
->p_vaddr
8757 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
8759 aux
->seg_base
= seg
->p_vaddr
;
8765 /* Second, build the unwind table from the contents of the unwind section: */
8766 size
= sec
->sh_size
;
8767 table
= (unsigned char *) get_data (NULL
, filedata
, sec
->sh_offset
, 1, size
,
8772 aux
->table_len
= size
/ (3 * eh_addr_size
);
8773 aux
->table
= (struct ia64_unw_table_entry
*)
8774 xcmalloc (aux
->table_len
, sizeof (aux
->table
[0]));
8777 for (tp
= table
; tp
<= table
+ size
- (3 * eh_addr_size
); ++tep
)
8779 tep
->start
.section
= SHN_UNDEF
;
8780 tep
->end
.section
= SHN_UNDEF
;
8781 tep
->info
.section
= SHN_UNDEF
;
8782 tep
->start
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
8783 tep
->end
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
8784 tep
->info
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
8785 tep
->start
.offset
+= aux
->seg_base
;
8786 tep
->end
.offset
+= aux
->seg_base
;
8787 tep
->info
.offset
+= aux
->seg_base
;
8791 /* Third, apply any relocations to the unwind table: */
8792 for (relsec
= filedata
->section_headers
;
8793 relsec
< filedata
->section_headers
+ filedata
->file_header
.e_shnum
;
8796 if (relsec
->sh_type
!= SHT_RELA
8797 || relsec
->sh_info
>= filedata
->file_header
.e_shnum
8798 || filedata
->section_headers
+ relsec
->sh_info
!= sec
)
8801 if (!slurp_rela_relocs (filedata
, relsec
->sh_offset
, relsec
->sh_size
,
8810 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
8812 unsigned int sym_ndx
;
8813 unsigned int r_type
= get_reloc_type (filedata
, rp
->r_info
);
8814 relname
= elf_ia64_reloc_type (r_type
);
8816 /* PR 17531: file: 9fa67536. */
8817 if (relname
== NULL
)
8819 warn (_("Skipping unknown relocation type: %u\n"), r_type
);
8823 if (! startswith (relname
, "R_IA64_SEGREL"))
8825 warn (_("Skipping unexpected relocation type: %s\n"), relname
);
8829 i
= rp
->r_offset
/ (3 * eh_addr_size
);
8831 /* PR 17531: file: 5bc8d9bf. */
8832 if (i
>= aux
->table_len
)
8834 warn (_("Skipping reloc with overlarge offset: %lx\n"), i
);
8838 sym_ndx
= get_reloc_symindex (rp
->r_info
);
8839 if (sym_ndx
>= aux
->nsyms
)
8841 warn (_("Skipping reloc with invalid symbol index: %u\n"),
8845 sym
= aux
->symtab
+ sym_ndx
;
8847 switch (rp
->r_offset
/ eh_addr_size
% 3)
8850 aux
->table
[i
].start
.section
= sym
->st_shndx
;
8851 aux
->table
[i
].start
.offset
= rp
->r_addend
+ sym
->st_value
;
8854 aux
->table
[i
].end
.section
= sym
->st_shndx
;
8855 aux
->table
[i
].end
.offset
= rp
->r_addend
+ sym
->st_value
;
8858 aux
->table
[i
].info
.section
= sym
->st_shndx
;
8859 aux
->table
[i
].info
.offset
= rp
->r_addend
+ sym
->st_value
;
8873 ia64_process_unwind (Filedata
* filedata
)
8875 Elf_Internal_Shdr
* sec
;
8876 Elf_Internal_Shdr
* unwsec
= NULL
;
8877 unsigned long i
, unwcount
= 0, unwstart
= 0;
8878 struct ia64_unw_aux_info aux
;
8881 memset (& aux
, 0, sizeof (aux
));
8883 for (i
= 0, sec
= filedata
->section_headers
; i
< filedata
->file_header
.e_shnum
; ++i
, ++sec
)
8885 if (sec
->sh_type
== SHT_SYMTAB
)
8889 error (_("Multiple symbol tables encountered\n"));
8895 if (!get_symtab (filedata
, sec
, &aux
.symtab
, &aux
.nsyms
,
8896 &aux
.strtab
, &aux
.strtab_size
))
8899 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
8904 printf (_("\nThere are no unwind sections in this file.\n"));
8906 while (unwcount
-- > 0)
8911 for (i
= unwstart
, sec
= filedata
->section_headers
+ unwstart
, unwsec
= NULL
;
8912 i
< filedata
->file_header
.e_shnum
; ++i
, ++sec
)
8913 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
8918 /* We have already counted the number of SHT_IA64_UNWIND
8919 sections so the loop above should never fail. */
8920 assert (unwsec
!= NULL
);
8923 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
8925 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
8927 /* We need to find which section group it is in. */
8928 struct group_list
* g
;
8930 if (filedata
->section_headers_groups
== NULL
8931 || filedata
->section_headers_groups
[i
] == NULL
)
8932 i
= filedata
->file_header
.e_shnum
;
8935 g
= filedata
->section_headers_groups
[i
]->root
;
8937 for (; g
!= NULL
; g
= g
->next
)
8939 sec
= filedata
->section_headers
+ g
->section_index
;
8941 if (section_name_valid (filedata
, sec
)
8942 && streq (section_name (filedata
, sec
),
8943 ELF_STRING_ia64_unwind_info
))
8948 i
= filedata
->file_header
.e_shnum
;
8951 else if (section_name_valid (filedata
, unwsec
)
8952 && startswith (section_name (filedata
, unwsec
),
8953 ELF_STRING_ia64_unwind_once
))
8955 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
8956 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
8957 suffix
= section_name (filedata
, unwsec
) + len
;
8958 for (i
= 0, sec
= filedata
->section_headers
;
8959 i
< filedata
->file_header
.e_shnum
;
8961 if (section_name_valid (filedata
, sec
)
8962 && startswith (section_name (filedata
, sec
),
8963 ELF_STRING_ia64_unwind_info_once
)
8964 && streq (section_name (filedata
, sec
) + len2
, suffix
))
8969 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
8970 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
8971 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
8972 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
8974 if (section_name_valid (filedata
, unwsec
)
8975 && startswith (section_name (filedata
, unwsec
),
8976 ELF_STRING_ia64_unwind
))
8977 suffix
= section_name (filedata
, unwsec
) + len
;
8978 for (i
= 0, sec
= filedata
->section_headers
;
8979 i
< filedata
->file_header
.e_shnum
;
8981 if (section_name_valid (filedata
, sec
)
8982 && startswith (section_name (filedata
, sec
),
8983 ELF_STRING_ia64_unwind_info
)
8984 && streq (section_name (filedata
, sec
) + len2
, suffix
))
8988 if (i
== filedata
->file_header
.e_shnum
)
8990 printf (_("\nCould not find unwind info section for "));
8992 if (filedata
->string_table
== NULL
)
8993 printf ("%d", unwsec
->sh_name
);
8995 printf ("'%s'", printable_section_name (filedata
, unwsec
));
8999 aux
.info_addr
= sec
->sh_addr
;
9000 aux
.info
= (unsigned char *) get_data (NULL
, filedata
, sec
->sh_offset
, 1,
9003 aux
.info_size
= aux
.info
== NULL
? 0 : sec
->sh_size
;
9005 printf (_("\nUnwind section "));
9007 if (filedata
->string_table
== NULL
)
9008 printf ("%d", unwsec
->sh_name
);
9010 printf ("'%s'", printable_section_name (filedata
, unwsec
));
9012 printf (_(" at offset 0x%lx contains %lu entries:\n"),
9013 (unsigned long) unwsec
->sh_offset
,
9014 (unsigned long) (unwsec
->sh_size
/ (3 * eh_addr_size
)));
9016 if (slurp_ia64_unwind_table (filedata
, & aux
, unwsec
)
9017 && aux
.table_len
> 0)
9018 dump_ia64_unwind (filedata
, & aux
);
9020 free ((char *) aux
.table
);
9021 free ((char *) aux
.info
);
9028 free ((char *) aux
.strtab
);
9033 struct hppa_unw_table_entry
9035 struct absaddr start
;
9037 unsigned int Cannot_unwind
:1; /* 0 */
9038 unsigned int Millicode
:1; /* 1 */
9039 unsigned int Millicode_save_sr0
:1; /* 2 */
9040 unsigned int Region_description
:2; /* 3..4 */
9041 unsigned int reserved1
:1; /* 5 */
9042 unsigned int Entry_SR
:1; /* 6 */
9043 unsigned int Entry_FR
:4; /* Number saved 7..10 */
9044 unsigned int Entry_GR
:5; /* Number saved 11..15 */
9045 unsigned int Args_stored
:1; /* 16 */
9046 unsigned int Variable_Frame
:1; /* 17 */
9047 unsigned int Separate_Package_Body
:1; /* 18 */
9048 unsigned int Frame_Extension_Millicode
:1; /* 19 */
9049 unsigned int Stack_Overflow_Check
:1; /* 20 */
9050 unsigned int Two_Instruction_SP_Increment
:1; /* 21 */
9051 unsigned int Ada_Region
:1; /* 22 */
9052 unsigned int cxx_info
:1; /* 23 */
9053 unsigned int cxx_try_catch
:1; /* 24 */
9054 unsigned int sched_entry_seq
:1; /* 25 */
9055 unsigned int reserved2
:1; /* 26 */
9056 unsigned int Save_SP
:1; /* 27 */
9057 unsigned int Save_RP
:1; /* 28 */
9058 unsigned int Save_MRP_in_frame
:1; /* 29 */
9059 unsigned int extn_ptr_defined
:1; /* 30 */
9060 unsigned int Cleanup_defined
:1; /* 31 */
9062 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
9063 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
9064 unsigned int Large_frame
:1; /* 2 */
9065 unsigned int Pseudo_SP_Set
:1; /* 3 */
9066 unsigned int reserved4
:1; /* 4 */
9067 unsigned int Total_frame_size
:27; /* 5..31 */
9070 struct hppa_unw_aux_info
9072 struct hppa_unw_table_entry
* table
; /* Unwind table. */
9073 unsigned long table_len
; /* Length of unwind table. */
9074 bfd_vma seg_base
; /* Starting address of segment. */
9075 Elf_Internal_Sym
* symtab
; /* The symbol table. */
9076 unsigned long nsyms
; /* Number of symbols. */
9077 Elf_Internal_Sym
* funtab
; /* Sorted table of STT_FUNC symbols. */
9078 unsigned long nfuns
; /* Number of entries in funtab. */
9079 char * strtab
; /* The string table. */
9080 unsigned long strtab_size
; /* Size of string table. */
9084 dump_hppa_unwind (Filedata
* filedata
, struct hppa_unw_aux_info
* aux
)
9086 struct hppa_unw_table_entry
* tp
;
9087 unsigned long j
, nfuns
;
9090 aux
->funtab
= xmalloc (aux
->nsyms
* sizeof (Elf_Internal_Sym
));
9091 for (nfuns
= 0, j
= 0; j
< aux
->nsyms
; j
++)
9092 if (aux
->symtab
[j
].st_value
&& ELF_ST_TYPE (aux
->symtab
[j
].st_info
) == STT_FUNC
)
9093 aux
->funtab
[nfuns
++] = aux
->symtab
[j
];
9095 qsort (aux
->funtab
, aux
->nfuns
, sizeof (Elf_Internal_Sym
), symcmp
);
9097 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
9100 const char * procname
;
9102 find_symbol_for_address (filedata
, aux
->funtab
, aux
->nfuns
, aux
->strtab
,
9103 aux
->strtab_size
, tp
->start
, &procname
,
9106 fputs ("\n<", stdout
);
9110 fputs (procname
, stdout
);
9113 printf ("+%lx", (unsigned long) offset
);
9116 fputs (">: [", stdout
);
9117 print_vma (tp
->start
.offset
, PREFIX_HEX
);
9118 fputc ('-', stdout
);
9119 print_vma (tp
->end
.offset
, PREFIX_HEX
);
9122 #define PF(_m) if (tp->_m) printf (#_m " ");
9123 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
9126 PF(Millicode_save_sr0
);
9127 /* PV(Region_description); */
9133 PF(Separate_Package_Body
);
9134 PF(Frame_Extension_Millicode
);
9135 PF(Stack_Overflow_Check
);
9136 PF(Two_Instruction_SP_Increment
);
9140 PF(sched_entry_seq
);
9143 PF(Save_MRP_in_frame
);
9144 PF(extn_ptr_defined
);
9145 PF(Cleanup_defined
);
9146 PF(MPE_XL_interrupt_marker
);
9147 PF(HP_UX_interrupt_marker
);
9150 PV(Total_frame_size
);
9163 slurp_hppa_unwind_table (Filedata
* filedata
,
9164 struct hppa_unw_aux_info
* aux
,
9165 Elf_Internal_Shdr
* sec
)
9167 unsigned long size
, unw_ent_size
, nentries
, nrelas
, i
;
9168 Elf_Internal_Phdr
* seg
;
9169 struct hppa_unw_table_entry
* tep
;
9170 Elf_Internal_Shdr
* relsec
;
9171 Elf_Internal_Rela
* rela
;
9172 Elf_Internal_Rela
* rp
;
9173 unsigned char * table
;
9175 Elf_Internal_Sym
* sym
;
9176 const char * relname
;
9178 /* First, find the starting address of the segment that includes
9180 if (filedata
->file_header
.e_phnum
)
9182 if (! get_program_headers (filedata
))
9185 for (seg
= filedata
->program_headers
;
9186 seg
< filedata
->program_headers
+ filedata
->file_header
.e_phnum
;
9189 if (seg
->p_type
!= PT_LOAD
)
9192 if (sec
->sh_addr
>= seg
->p_vaddr
9193 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
9195 aux
->seg_base
= seg
->p_vaddr
;
9201 /* Second, build the unwind table from the contents of the unwind
9203 size
= sec
->sh_size
;
9204 table
= (unsigned char *) get_data (NULL
, filedata
, sec
->sh_offset
, 1, size
,
9210 nentries
= size
/ unw_ent_size
;
9211 size
= unw_ent_size
* nentries
;
9213 aux
->table_len
= nentries
;
9214 tep
= aux
->table
= (struct hppa_unw_table_entry
*)
9215 xcmalloc (nentries
, sizeof (aux
->table
[0]));
9217 for (tp
= table
; tp
< table
+ size
; tp
+= unw_ent_size
, ++tep
)
9219 unsigned int tmp1
, tmp2
;
9221 tep
->start
.section
= SHN_UNDEF
;
9222 tep
->end
.section
= SHN_UNDEF
;
9224 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
9225 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
9226 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
9227 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
9229 tep
->start
.offset
+= aux
->seg_base
;
9230 tep
->end
.offset
+= aux
->seg_base
;
9232 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
9233 tep
->Millicode
= (tmp1
>> 30) & 0x1;
9234 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
9235 tep
->Region_description
= (tmp1
>> 27) & 0x3;
9236 tep
->reserved1
= (tmp1
>> 26) & 0x1;
9237 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
9238 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
9239 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
9240 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
9241 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
9242 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
9243 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
9244 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
9245 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
9246 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
9247 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
9248 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
9249 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
9250 tep
->reserved2
= (tmp1
>> 5) & 0x1;
9251 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
9252 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
9253 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
9254 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
9255 tep
->Cleanup_defined
= tmp1
& 0x1;
9257 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
9258 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
9259 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
9260 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
9261 tep
->reserved4
= (tmp2
>> 27) & 0x1;
9262 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
9266 /* Third, apply any relocations to the unwind table. */
9267 for (relsec
= filedata
->section_headers
;
9268 relsec
< filedata
->section_headers
+ filedata
->file_header
.e_shnum
;
9271 if (relsec
->sh_type
!= SHT_RELA
9272 || relsec
->sh_info
>= filedata
->file_header
.e_shnum
9273 || filedata
->section_headers
+ relsec
->sh_info
!= sec
)
9276 if (!slurp_rela_relocs (filedata
, relsec
->sh_offset
, relsec
->sh_size
,
9280 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
9282 unsigned int sym_ndx
;
9283 unsigned int r_type
= get_reloc_type (filedata
, rp
->r_info
);
9284 relname
= elf_hppa_reloc_type (r_type
);
9286 if (relname
== NULL
)
9288 warn (_("Skipping unknown relocation type: %u\n"), r_type
);
9292 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
9293 if (! startswith (relname
, "R_PARISC_SEGREL"))
9295 warn (_("Skipping unexpected relocation type: %s\n"), relname
);
9299 i
= rp
->r_offset
/ unw_ent_size
;
9300 if (i
>= aux
->table_len
)
9302 warn (_("Skipping reloc with overlarge offset: %lx\n"), i
);
9306 sym_ndx
= get_reloc_symindex (rp
->r_info
);
9307 if (sym_ndx
>= aux
->nsyms
)
9309 warn (_("Skipping reloc with invalid symbol index: %u\n"),
9313 sym
= aux
->symtab
+ sym_ndx
;
9315 switch ((rp
->r_offset
% unw_ent_size
) / 4)
9318 aux
->table
[i
].start
.section
= sym
->st_shndx
;
9319 aux
->table
[i
].start
.offset
= sym
->st_value
+ rp
->r_addend
;
9322 aux
->table
[i
].end
.section
= sym
->st_shndx
;
9323 aux
->table
[i
].end
.offset
= sym
->st_value
+ rp
->r_addend
;
9337 hppa_process_unwind (Filedata
* filedata
)
9339 struct hppa_unw_aux_info aux
;
9340 Elf_Internal_Shdr
* unwsec
= NULL
;
9341 Elf_Internal_Shdr
* sec
;
9345 if (filedata
->string_table
== NULL
)
9348 memset (& aux
, 0, sizeof (aux
));
9350 for (i
= 0, sec
= filedata
->section_headers
; i
< filedata
->file_header
.e_shnum
; ++i
, ++sec
)
9352 if (sec
->sh_type
== SHT_SYMTAB
)
9356 error (_("Multiple symbol tables encountered\n"));
9362 if (!get_symtab (filedata
, sec
, &aux
.symtab
, &aux
.nsyms
,
9363 &aux
.strtab
, &aux
.strtab_size
))
9366 else if (section_name_valid (filedata
, sec
)
9367 && streq (section_name (filedata
, sec
), ".PARISC.unwind"))
9372 printf (_("\nThere are no unwind sections in this file.\n"));
9374 for (i
= 0, sec
= filedata
->section_headers
; i
< filedata
->file_header
.e_shnum
; ++i
, ++sec
)
9376 if (section_name_valid (filedata
, sec
)
9377 && streq (section_name (filedata
, sec
), ".PARISC.unwind"))
9379 unsigned long num_unwind
= sec
->sh_size
/ 16;
9381 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9382 "contains %lu entry:\n",
9383 "\nUnwind section '%s' at offset 0x%lx "
9384 "contains %lu entries:\n",
9386 printable_section_name (filedata
, sec
),
9387 (unsigned long) sec
->sh_offset
,
9390 if (! slurp_hppa_unwind_table (filedata
, &aux
, sec
))
9393 if (res
&& aux
.table_len
> 0)
9395 if (! dump_hppa_unwind (filedata
, &aux
))
9399 free ((char *) aux
.table
);
9405 free ((char *) aux
.strtab
);
9412 unsigned char * data
; /* The unwind data. */
9413 Elf_Internal_Shdr
* sec
; /* The cached unwind section header. */
9414 Elf_Internal_Rela
* rela
; /* The cached relocations for this section. */
9415 unsigned long nrelas
; /* The number of relocations. */
9416 unsigned int rel_type
; /* REL or RELA ? */
9417 Elf_Internal_Rela
* next_rela
; /* Cyclic pointer to the next reloc to process. */
9420 struct arm_unw_aux_info
9422 Filedata
* filedata
; /* The file containing the unwind sections. */
9423 Elf_Internal_Sym
* symtab
; /* The file's symbol table. */
9424 unsigned long nsyms
; /* Number of symbols. */
9425 Elf_Internal_Sym
* funtab
; /* Sorted table of STT_FUNC symbols. */
9426 unsigned long nfuns
; /* Number of these symbols. */
9427 char * strtab
; /* The file's string table. */
9428 unsigned long strtab_size
; /* Size of string table. */
9432 arm_print_vma_and_name (Filedata
* filedata
,
9433 struct arm_unw_aux_info
* aux
,
9435 struct absaddr addr
)
9437 const char *procname
;
9440 if (addr
.section
== SHN_UNDEF
)
9443 find_symbol_for_address (filedata
, aux
->funtab
, aux
->nfuns
, aux
->strtab
,
9444 aux
->strtab_size
, addr
, &procname
,
9447 print_vma (fn
, PREFIX_HEX
);
9451 fputs (" <", stdout
);
9452 fputs (procname
, stdout
);
9455 printf ("+0x%lx", (unsigned long) sym_offset
);
9456 fputc ('>', stdout
);
9463 arm_free_section (struct arm_section
*arm_sec
)
9465 free (arm_sec
->data
);
9466 free (arm_sec
->rela
);
9469 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
9470 cached section and install SEC instead.
9471 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
9472 and return its valued in * WORDP, relocating if necessary.
9473 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
9474 relocation's offset in ADDR.
9475 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
9476 into the string table of the symbol associated with the reloc. If no
9477 reloc was applied store -1 there.
9478 5) Return TRUE upon success, FALSE otherwise. */
9481 get_unwind_section_word (Filedata
* filedata
,
9482 struct arm_unw_aux_info
* aux
,
9483 struct arm_section
* arm_sec
,
9484 Elf_Internal_Shdr
* sec
,
9485 bfd_vma word_offset
,
9486 unsigned int * wordp
,
9487 struct absaddr
* addr
,
9490 Elf_Internal_Rela
*rp
;
9491 Elf_Internal_Sym
*sym
;
9492 const char * relname
;
9496 if (sec
== NULL
|| arm_sec
== NULL
)
9499 addr
->section
= SHN_UNDEF
;
9502 if (sym_name
!= NULL
)
9503 *sym_name
= (bfd_vma
) -1;
9505 /* If necessary, update the section cache. */
9506 if (sec
!= arm_sec
->sec
)
9508 Elf_Internal_Shdr
*relsec
;
9510 arm_free_section (arm_sec
);
9513 arm_sec
->data
= get_data (NULL
, aux
->filedata
, sec
->sh_offset
, 1,
9514 sec
->sh_size
, _("unwind data"));
9515 arm_sec
->rela
= NULL
;
9516 arm_sec
->nrelas
= 0;
9518 for (relsec
= filedata
->section_headers
;
9519 relsec
< filedata
->section_headers
+ filedata
->file_header
.e_shnum
;
9522 if (relsec
->sh_info
>= filedata
->file_header
.e_shnum
9523 || filedata
->section_headers
+ relsec
->sh_info
!= sec
9524 /* PR 15745: Check the section type as well. */
9525 || (relsec
->sh_type
!= SHT_REL
9526 && relsec
->sh_type
!= SHT_RELA
))
9529 arm_sec
->rel_type
= relsec
->sh_type
;
9530 if (relsec
->sh_type
== SHT_REL
)
9532 if (!slurp_rel_relocs (aux
->filedata
, relsec
->sh_offset
,
9534 & arm_sec
->rela
, & arm_sec
->nrelas
))
9537 else /* relsec->sh_type == SHT_RELA */
9539 if (!slurp_rela_relocs (aux
->filedata
, relsec
->sh_offset
,
9541 & arm_sec
->rela
, & arm_sec
->nrelas
))
9547 arm_sec
->next_rela
= arm_sec
->rela
;
9550 /* If there is no unwind data we can do nothing. */
9551 if (arm_sec
->data
== NULL
)
9554 /* If the offset is invalid then fail. */
9555 if (/* PR 21343 *//* PR 18879 */
9557 || word_offset
> (sec
->sh_size
- 4)
9558 || ((bfd_signed_vma
) word_offset
) < 0)
9561 /* Get the word at the required offset. */
9562 word
= byte_get (arm_sec
->data
+ word_offset
, 4);
9564 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
9565 if (arm_sec
->rela
== NULL
)
9571 /* Look through the relocs to find the one that applies to the provided offset. */
9573 for (rp
= arm_sec
->next_rela
; rp
!= arm_sec
->rela
+ arm_sec
->nrelas
; rp
++)
9575 bfd_vma prelval
, offset
;
9577 if (rp
->r_offset
> word_offset
&& !wrapped
)
9582 if (rp
->r_offset
> word_offset
)
9585 if (rp
->r_offset
& 3)
9587 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
9588 (unsigned long) rp
->r_offset
);
9592 if (rp
->r_offset
< word_offset
)
9595 /* PR 17531: file: 027-161405-0.004 */
9596 if (aux
->symtab
== NULL
)
9599 if (arm_sec
->rel_type
== SHT_REL
)
9601 offset
= word
& 0x7fffffff;
9602 if (offset
& 0x40000000)
9603 offset
|= ~ (bfd_vma
) 0x7fffffff;
9605 else if (arm_sec
->rel_type
== SHT_RELA
)
9606 offset
= rp
->r_addend
;
9609 error (_("Unknown section relocation type %d encountered\n"),
9614 /* PR 17531 file: 027-1241568-0.004. */
9615 if (ELF32_R_SYM (rp
->r_info
) >= aux
->nsyms
)
9617 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
9618 (unsigned long) ELF32_R_SYM (rp
->r_info
), aux
->nsyms
);
9622 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
9623 offset
+= sym
->st_value
;
9624 prelval
= offset
- (arm_sec
->sec
->sh_addr
+ rp
->r_offset
);
9626 /* Check that we are processing the expected reloc type. */
9627 if (filedata
->file_header
.e_machine
== EM_ARM
)
9629 relname
= elf_arm_reloc_type (ELF32_R_TYPE (rp
->r_info
));
9630 if (relname
== NULL
)
9632 warn (_("Skipping unknown ARM relocation type: %d\n"),
9633 (int) ELF32_R_TYPE (rp
->r_info
));
9637 if (streq (relname
, "R_ARM_NONE"))
9640 if (! streq (relname
, "R_ARM_PREL31"))
9642 warn (_("Skipping unexpected ARM relocation type %s\n"), relname
);
9646 else if (filedata
->file_header
.e_machine
== EM_TI_C6000
)
9648 relname
= elf_tic6x_reloc_type (ELF32_R_TYPE (rp
->r_info
));
9649 if (relname
== NULL
)
9651 warn (_("Skipping unknown C6000 relocation type: %d\n"),
9652 (int) ELF32_R_TYPE (rp
->r_info
));
9656 if (streq (relname
, "R_C6000_NONE"))
9659 if (! streq (relname
, "R_C6000_PREL31"))
9661 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname
);
9669 /* This function currently only supports ARM and TI unwinders. */
9670 warn (_("Only TI and ARM unwinders are currently supported\n"));
9674 word
= (word
& ~ (bfd_vma
) 0x7fffffff) | (prelval
& 0x7fffffff);
9675 addr
->section
= sym
->st_shndx
;
9676 addr
->offset
= offset
;
9679 * sym_name
= sym
->st_name
;
9684 arm_sec
->next_rela
= rp
;
9689 static const char *tic6x_unwind_regnames
[16] =
9691 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
9692 "A14", "A13", "A12", "A11", "A10",
9693 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
9697 decode_tic6x_unwind_regmask (unsigned int mask
)
9701 for (i
= 12; mask
; mask
>>= 1, i
--)
9705 fputs (tic6x_unwind_regnames
[i
], stdout
);
9707 fputs (", ", stdout
);
9713 if (remaining == 0 && more_words) \
9716 if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, \
9717 data_offset, & word, & addr, NULL)) \
9723 #define GET_OP(OP) \
9728 (OP) = word >> 24; \
9733 printf (_("[Truncated opcode]\n")); \
9736 printf ("0x%02x ", OP)
9739 decode_arm_unwind_bytecode (Filedata
* filedata
,
9740 struct arm_unw_aux_info
* aux
,
9742 unsigned int remaining
,
9743 unsigned int more_words
,
9744 bfd_vma data_offset
,
9745 Elf_Internal_Shdr
* data_sec
,
9746 struct arm_section
* data_arm_sec
)
9748 struct absaddr addr
;
9751 /* Decode the unwinding instructions. */
9754 unsigned int op
, op2
;
9763 printf (" 0x%02x ", op
);
9765 if ((op
& 0xc0) == 0x00)
9767 int offset
= ((op
& 0x3f) << 2) + 4;
9769 printf (" vsp = vsp + %d", offset
);
9771 else if ((op
& 0xc0) == 0x40)
9773 int offset
= ((op
& 0x3f) << 2) + 4;
9775 printf (" vsp = vsp - %d", offset
);
9777 else if ((op
& 0xf0) == 0x80)
9780 if (op
== 0x80 && op2
== 0)
9781 printf (_("Refuse to unwind"));
9784 unsigned int mask
= ((op
& 0x0f) << 8) | op2
;
9789 for (i
= 0; i
< 12; i
++)
9790 if (mask
& (1 << i
))
9796 printf ("r%d", 4 + i
);
9801 else if ((op
& 0xf0) == 0x90)
9803 if (op
== 0x9d || op
== 0x9f)
9804 printf (_(" [Reserved]"));
9806 printf (" vsp = r%d", op
& 0x0f);
9808 else if ((op
& 0xf0) == 0xa0)
9810 int end
= 4 + (op
& 0x07);
9815 for (i
= 4; i
<= end
; i
++)
9831 else if (op
== 0xb0)
9832 printf (_(" finish"));
9833 else if (op
== 0xb1)
9836 if (op2
== 0 || (op2
& 0xf0) != 0)
9837 printf (_("[Spare]"));
9840 unsigned int mask
= op2
& 0x0f;
9845 for (i
= 0; i
< 12; i
++)
9846 if (mask
& (1 << i
))
9857 else if (op
== 0xb2)
9859 unsigned char buf
[9];
9860 unsigned int i
, len
;
9861 unsigned long offset
;
9863 for (i
= 0; i
< sizeof (buf
); i
++)
9866 if ((buf
[i
] & 0x80) == 0)
9869 if (i
== sizeof (buf
))
9871 error (_("corrupt change to vsp\n"));
9876 offset
= read_leb128 (buf
, buf
+ i
+ 1, false, &len
, NULL
);
9877 assert (len
== i
+ 1);
9878 offset
= offset
* 4 + 0x204;
9879 printf ("vsp = vsp + %ld", offset
);
9882 else if (op
== 0xb3 || op
== 0xc8 || op
== 0xc9)
9884 unsigned int first
, last
;
9891 printf ("pop {D%d", first
);
9893 printf ("-D%d", first
+ last
);
9896 else if (op
== 0xb4)
9897 printf (_(" pop {ra_auth_code}"));
9898 else if ((op
& 0xf8) == 0xb8 || (op
& 0xf8) == 0xd0)
9900 unsigned int count
= op
& 0x07;
9904 printf ("-D%d", 8 + count
);
9907 else if (op
>= 0xc0 && op
<= 0xc5)
9909 unsigned int count
= op
& 0x07;
9911 printf (" pop {wR10");
9913 printf ("-wR%d", 10 + count
);
9916 else if (op
== 0xc6)
9918 unsigned int first
, last
;
9923 printf ("pop {wR%d", first
);
9925 printf ("-wR%d", first
+ last
);
9928 else if (op
== 0xc7)
9931 if (op2
== 0 || (op2
& 0xf0) != 0)
9932 printf (_("[Spare]"));
9935 unsigned int mask
= op2
& 0x0f;
9940 for (i
= 0; i
< 4; i
++)
9941 if (mask
& (1 << i
))
9947 printf ("wCGR%d", i
);
9954 printf (_(" [unsupported opcode]"));
9965 decode_tic6x_unwind_bytecode (Filedata
* filedata
,
9966 struct arm_unw_aux_info
* aux
,
9968 unsigned int remaining
,
9969 unsigned int more_words
,
9970 bfd_vma data_offset
,
9971 Elf_Internal_Shdr
* data_sec
,
9972 struct arm_section
* data_arm_sec
)
9974 struct absaddr addr
;
9976 /* Decode the unwinding instructions. */
9979 unsigned int op
, op2
;
9988 printf (" 0x%02x ", op
);
9990 if ((op
& 0xc0) == 0x00)
9992 int offset
= ((op
& 0x3f) << 3) + 8;
9993 printf (" sp = sp + %d", offset
);
9995 else if ((op
& 0xc0) == 0x80)
9998 if (op
== 0x80 && op2
== 0)
9999 printf (_("Refuse to unwind"));
10002 unsigned int mask
= ((op
& 0x1f) << 8) | op2
;
10004 printf ("pop compact {");
10008 decode_tic6x_unwind_regmask (mask
);
10012 else if ((op
& 0xf0) == 0xc0)
10015 unsigned int nregs
;
10020 unsigned int offset
;
10024 /* Scan entire instruction first so that GET_OP output is not
10025 interleaved with disassembly. */
10027 for (i
= 0; nregs
< (op
& 0xf); i
++)
10033 regpos
[nregs
].offset
= i
* 2;
10034 regpos
[nregs
].reg
= reg
;
10041 regpos
[nregs
].offset
= i
* 2 + 1;
10042 regpos
[nregs
].reg
= reg
;
10047 printf (_("pop frame {"));
10050 printf (_("*corrupt* - no registers specified"));
10055 for (i
= i
* 2; i
> 0; i
--)
10057 if (regpos
[reg
].offset
== i
- 1)
10059 name
= tic6x_unwind_regnames
[regpos
[reg
].reg
];
10066 fputs (name
, stdout
);
10074 else if (op
== 0xd0)
10075 printf (" MOV FP, SP");
10076 else if (op
== 0xd1)
10077 printf (" __c6xabi_pop_rts");
10078 else if (op
== 0xd2)
10080 unsigned char buf
[9];
10081 unsigned int i
, len
;
10082 unsigned long offset
;
10084 for (i
= 0; i
< sizeof (buf
); i
++)
10087 if ((buf
[i
] & 0x80) == 0)
10090 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
10091 if (i
== sizeof (buf
))
10093 warn (_("Corrupt stack pointer adjustment detected\n"));
10097 offset
= read_leb128 (buf
, buf
+ i
+ 1, false, &len
, NULL
);
10098 assert (len
== i
+ 1);
10099 offset
= offset
* 8 + 0x408;
10100 printf (_("sp = sp + %ld"), offset
);
10102 else if ((op
& 0xf0) == 0xe0)
10104 if ((op
& 0x0f) == 7)
10105 printf (" RETURN");
10107 printf (" MV %s, B3", tic6x_unwind_regnames
[op
& 0x0f]);
10111 printf (_(" [unsupported opcode]"));
10120 arm_expand_prel31 (Filedata
* filedata
, bfd_vma word
, bfd_vma where
)
10124 offset
= word
& 0x7fffffff;
10125 if (offset
& 0x40000000)
10126 offset
|= ~ (bfd_vma
) 0x7fffffff;
10128 if (filedata
->file_header
.e_machine
== EM_TI_C6000
)
10131 return offset
+ where
;
10135 decode_arm_unwind (Filedata
* filedata
,
10136 struct arm_unw_aux_info
* aux
,
10138 unsigned int remaining
,
10139 bfd_vma data_offset
,
10140 Elf_Internal_Shdr
* data_sec
,
10141 struct arm_section
* data_arm_sec
)
10144 unsigned int more_words
= 0;
10145 struct absaddr addr
;
10146 bfd_vma sym_name
= (bfd_vma
) -1;
10149 if (remaining
== 0)
10151 /* Fetch the first word.
10152 Note - when decoding an object file the address extracted
10153 here will always be 0. So we also pass in the sym_name
10154 parameter so that we can find the symbol associated with
10155 the personality routine. */
10156 if (! get_unwind_section_word (filedata
, aux
, data_arm_sec
, data_sec
, data_offset
,
10157 & word
, & addr
, & sym_name
))
10164 addr
.section
= SHN_UNDEF
;
10168 if ((word
& 0x80000000) == 0)
10170 /* Expand prel31 for personality routine. */
10172 const char *procname
;
10174 fn
= arm_expand_prel31 (filedata
, word
, data_sec
->sh_addr
+ data_offset
);
10175 printf (_(" Personality routine: "));
10177 && addr
.section
== SHN_UNDEF
&& addr
.offset
== 0
10178 && sym_name
!= (bfd_vma
) -1 && sym_name
< aux
->strtab_size
)
10180 procname
= aux
->strtab
+ sym_name
;
10181 print_vma (fn
, PREFIX_HEX
);
10184 fputs (" <", stdout
);
10185 fputs (procname
, stdout
);
10186 fputc ('>', stdout
);
10190 procname
= arm_print_vma_and_name (filedata
, aux
, fn
, addr
);
10191 fputc ('\n', stdout
);
10193 /* The GCC personality routines use the standard compact
10194 encoding, starting with one byte giving the number of
10196 if (procname
!= NULL
10197 && (startswith (procname
, "__gcc_personality_v0")
10198 || startswith (procname
, "__gxx_personality_v0")
10199 || startswith (procname
, "__gcj_personality_v0")
10200 || startswith (procname
, "__gnu_objc_personality_v0")))
10207 printf (_(" [Truncated data]\n"));
10210 more_words
= word
>> 24;
10220 /* ARM EHABI Section 6.3:
10222 An exception-handling table entry for the compact model looks like:
10224 31 30-28 27-24 23-0
10225 -- ----- ----- ----
10226 1 0 index Data for personalityRoutine[index] */
10228 if (filedata
->file_header
.e_machine
== EM_ARM
10229 && (word
& 0x70000000))
10231 warn (_("Corrupt ARM compact model table entry: %x \n"), word
);
10235 per_index
= (word
>> 24) & 0x7f;
10236 printf (_(" Compact model index: %d\n"), per_index
);
10237 if (per_index
== 0)
10243 else if (per_index
< 3)
10245 more_words
= (word
>> 16) & 0xff;
10251 switch (filedata
->file_header
.e_machine
)
10256 if (! decode_arm_unwind_bytecode (filedata
, aux
, word
, remaining
, more_words
,
10257 data_offset
, data_sec
, data_arm_sec
))
10262 warn (_("Unknown ARM compact model index encountered\n"));
10263 printf (_(" [reserved]\n"));
10271 if (! decode_tic6x_unwind_bytecode (filedata
, aux
, word
, remaining
, more_words
,
10272 data_offset
, data_sec
, data_arm_sec
))
10275 else if (per_index
< 5)
10277 if (((word
>> 17) & 0x7f) == 0x7f)
10278 printf (_(" Restore stack from frame pointer\n"));
10280 printf (_(" Stack increment %d\n"), (word
>> 14) & 0x1fc);
10281 printf (_(" Registers restored: "));
10282 if (per_index
== 4)
10283 printf (" (compact) ");
10284 decode_tic6x_unwind_regmask ((word
>> 4) & 0x1fff);
10286 printf (_(" Return register: %s\n"),
10287 tic6x_unwind_regnames
[word
& 0xf]);
10290 printf (_(" [reserved (%d)]\n"), per_index
);
10294 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
10295 filedata
->file_header
.e_machine
);
10299 /* Decode the descriptors. Not implemented. */
10305 dump_arm_unwind (Filedata
* filedata
,
10306 struct arm_unw_aux_info
* aux
,
10307 Elf_Internal_Shdr
* exidx_sec
)
10309 struct arm_section exidx_arm_sec
, extab_arm_sec
;
10310 unsigned int i
, exidx_len
;
10311 unsigned long j
, nfuns
;
10314 memset (&exidx_arm_sec
, 0, sizeof (exidx_arm_sec
));
10315 memset (&extab_arm_sec
, 0, sizeof (extab_arm_sec
));
10316 exidx_len
= exidx_sec
->sh_size
/ 8;
10318 aux
->funtab
= xmalloc (aux
->nsyms
* sizeof (Elf_Internal_Sym
));
10319 for (nfuns
= 0, j
= 0; j
< aux
->nsyms
; j
++)
10320 if (aux
->symtab
[j
].st_value
&& ELF_ST_TYPE (aux
->symtab
[j
].st_info
) == STT_FUNC
)
10321 aux
->funtab
[nfuns
++] = aux
->symtab
[j
];
10322 aux
->nfuns
= nfuns
;
10323 qsort (aux
->funtab
, aux
->nfuns
, sizeof (Elf_Internal_Sym
), symcmp
);
10325 for (i
= 0; i
< exidx_len
; i
++)
10327 unsigned int exidx_fn
, exidx_entry
;
10328 struct absaddr fn_addr
, entry_addr
;
10331 fputc ('\n', stdout
);
10333 if (! get_unwind_section_word (filedata
, aux
, & exidx_arm_sec
, exidx_sec
,
10334 8 * i
, & exidx_fn
, & fn_addr
, NULL
)
10335 || ! get_unwind_section_word (filedata
, aux
, & exidx_arm_sec
, exidx_sec
,
10336 8 * i
+ 4, & exidx_entry
, & entry_addr
, NULL
))
10338 free (aux
->funtab
);
10339 arm_free_section (& exidx_arm_sec
);
10340 arm_free_section (& extab_arm_sec
);
10344 /* ARM EHABI, Section 5:
10345 An index table entry consists of 2 words.
10346 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
10347 if (exidx_fn
& 0x80000000)
10349 warn (_("corrupt index table entry: %x\n"), exidx_fn
);
10353 fn
= arm_expand_prel31 (filedata
, exidx_fn
, exidx_sec
->sh_addr
+ 8 * i
);
10355 arm_print_vma_and_name (filedata
, aux
, fn
, fn_addr
);
10356 fputs (": ", stdout
);
10358 if (exidx_entry
== 1)
10360 print_vma (exidx_entry
, PREFIX_HEX
);
10361 fputs (" [cantunwind]\n", stdout
);
10363 else if (exidx_entry
& 0x80000000)
10365 print_vma (exidx_entry
, PREFIX_HEX
);
10366 fputc ('\n', stdout
);
10367 decode_arm_unwind (filedata
, aux
, exidx_entry
, 4, 0, NULL
, NULL
);
10371 bfd_vma table
, table_offset
= 0;
10372 Elf_Internal_Shdr
*table_sec
;
10374 fputs ("@", stdout
);
10375 table
= arm_expand_prel31 (filedata
, exidx_entry
, exidx_sec
->sh_addr
+ 8 * i
+ 4);
10376 print_vma (table
, PREFIX_HEX
);
10379 /* Locate the matching .ARM.extab. */
10380 if (entry_addr
.section
!= SHN_UNDEF
10381 && entry_addr
.section
< filedata
->file_header
.e_shnum
)
10383 table_sec
= filedata
->section_headers
+ entry_addr
.section
;
10384 table_offset
= entry_addr
.offset
;
10386 if (table_offset
> table_sec
->sh_size
10387 || ((bfd_signed_vma
) table_offset
) < 0)
10389 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
10390 (unsigned long) table_offset
,
10391 printable_section_name (filedata
, table_sec
));
10398 table_sec
= find_section_by_address (filedata
, table
);
10399 if (table_sec
!= NULL
)
10400 table_offset
= table
- table_sec
->sh_addr
;
10403 if (table_sec
== NULL
)
10405 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
10406 (unsigned long) table
);
10411 if (! decode_arm_unwind (filedata
, aux
, 0, 0, table_offset
, table_sec
,
10419 free (aux
->funtab
);
10420 arm_free_section (&exidx_arm_sec
);
10421 arm_free_section (&extab_arm_sec
);
10426 /* Used for both ARM and C6X unwinding tables. */
10429 arm_process_unwind (Filedata
* filedata
)
10431 struct arm_unw_aux_info aux
;
10432 Elf_Internal_Shdr
*unwsec
= NULL
;
10433 Elf_Internal_Shdr
*sec
;
10435 unsigned int sec_type
;
10438 switch (filedata
->file_header
.e_machine
)
10441 sec_type
= SHT_ARM_EXIDX
;
10445 sec_type
= SHT_C6000_UNWIND
;
10449 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
10450 filedata
->file_header
.e_machine
);
10454 if (filedata
->string_table
== NULL
)
10457 memset (& aux
, 0, sizeof (aux
));
10458 aux
.filedata
= filedata
;
10460 for (i
= 0, sec
= filedata
->section_headers
; i
< filedata
->file_header
.e_shnum
; ++i
, ++sec
)
10462 if (sec
->sh_type
== SHT_SYMTAB
)
10466 error (_("Multiple symbol tables encountered\n"));
10472 if (!get_symtab (filedata
, sec
, &aux
.symtab
, &aux
.nsyms
,
10473 &aux
.strtab
, &aux
.strtab_size
))
10476 else if (sec
->sh_type
== sec_type
)
10480 if (unwsec
== NULL
)
10481 printf (_("\nThere are no unwind sections in this file.\n"));
10483 for (i
= 0, sec
= filedata
->section_headers
; i
< filedata
->file_header
.e_shnum
; ++i
, ++sec
)
10485 if (sec
->sh_type
== sec_type
)
10487 unsigned long num_unwind
= sec
->sh_size
/ (2 * eh_addr_size
);
10488 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
10489 "contains %lu entry:\n",
10490 "\nUnwind section '%s' at offset 0x%lx "
10491 "contains %lu entries:\n",
10493 printable_section_name (filedata
, sec
),
10494 (unsigned long) sec
->sh_offset
,
10497 if (! dump_arm_unwind (filedata
, &aux
, sec
))
10503 free ((char *) aux
.strtab
);
10509 no_processor_specific_unwind (Filedata
* filedata ATTRIBUTE_UNUSED
)
10511 printf (_("No processor specific unwind information to decode\n"));
10516 process_unwind (Filedata
* filedata
)
10518 struct unwind_handler
10520 unsigned int machtype
;
10521 bool (* handler
)(Filedata
*);
10524 { EM_ARM
, arm_process_unwind
},
10525 { EM_IA_64
, ia64_process_unwind
},
10526 { EM_PARISC
, hppa_process_unwind
},
10527 { EM_TI_C6000
, arm_process_unwind
},
10528 { EM_386
, no_processor_specific_unwind
},
10529 { EM_X86_64
, no_processor_specific_unwind
},
10537 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
10538 if (filedata
->file_header
.e_machine
== handlers
[i
].machtype
)
10539 return handlers
[i
].handler (filedata
);
10541 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
10542 get_machine_name (filedata
->file_header
.e_machine
));
10547 dynamic_section_aarch64_val (Elf_Internal_Dyn
* entry
)
10549 switch (entry
->d_tag
)
10551 case DT_AARCH64_BTI_PLT
:
10552 case DT_AARCH64_PAC_PLT
:
10555 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
10562 dynamic_section_mips_val (Filedata
* filedata
, Elf_Internal_Dyn
* entry
)
10564 switch (entry
->d_tag
)
10566 case DT_MIPS_FLAGS
:
10567 if (entry
->d_un
.d_val
== 0)
10568 printf (_("NONE"));
10571 static const char * opts
[] =
10573 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
10574 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
10575 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
10576 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
10582 for (cnt
= 0; cnt
< ARRAY_SIZE (opts
); ++cnt
)
10583 if (entry
->d_un
.d_val
& (1 << cnt
))
10585 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
10591 case DT_MIPS_IVERSION
:
10592 if (valid_dynamic_name (filedata
, entry
->d_un
.d_val
))
10593 printf (_("Interface Version: %s"),
10594 get_dynamic_name (filedata
, entry
->d_un
.d_val
));
10598 sprintf_vma (buf
, entry
->d_un
.d_ptr
);
10599 /* Note: coded this way so that there is a single string for translation. */
10600 printf (_("<corrupt: %s>"), buf
);
10604 case DT_MIPS_TIME_STAMP
:
10608 time_t atime
= entry
->d_un
.d_val
;
10610 tmp
= gmtime (&atime
);
10611 /* PR 17531: file: 6accc532. */
10613 snprintf (timebuf
, sizeof (timebuf
), _("<corrupt>"));
10615 snprintf (timebuf
, sizeof (timebuf
), "%04u-%02u-%02uT%02u:%02u:%02u",
10616 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
10617 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
10618 printf (_("Time Stamp: %s"), timebuf
);
10622 case DT_MIPS_RLD_VERSION
:
10623 case DT_MIPS_LOCAL_GOTNO
:
10624 case DT_MIPS_CONFLICTNO
:
10625 case DT_MIPS_LIBLISTNO
:
10626 case DT_MIPS_SYMTABNO
:
10627 case DT_MIPS_UNREFEXTNO
:
10628 case DT_MIPS_HIPAGENO
:
10629 case DT_MIPS_DELTA_CLASS_NO
:
10630 case DT_MIPS_DELTA_INSTANCE_NO
:
10631 case DT_MIPS_DELTA_RELOC_NO
:
10632 case DT_MIPS_DELTA_SYM_NO
:
10633 case DT_MIPS_DELTA_CLASSSYM_NO
:
10634 case DT_MIPS_COMPACT_SIZE
:
10635 print_vma (entry
->d_un
.d_val
, DEC
);
10638 case DT_MIPS_XHASH
:
10639 filedata
->dynamic_info_DT_MIPS_XHASH
= entry
->d_un
.d_val
;
10640 filedata
->dynamic_info_DT_GNU_HASH
= entry
->d_un
.d_val
;
10641 /* Falls through. */
10644 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
10650 dynamic_section_parisc_val (Elf_Internal_Dyn
* entry
)
10652 switch (entry
->d_tag
)
10654 case DT_HP_DLD_FLAGS
:
10663 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
10664 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
10665 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
10666 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
10667 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
10668 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
10669 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
10670 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
10671 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
10672 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
10673 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" },
10674 { DT_HP_GST
, "HP_GST" },
10675 { DT_HP_SHLIB_FIXED
, "HP_SHLIB_FIXED" },
10676 { DT_HP_MERGE_SHLIB_SEG
, "HP_MERGE_SHLIB_SEG" },
10677 { DT_HP_NODELETE
, "HP_NODELETE" },
10678 { DT_HP_GROUP
, "HP_GROUP" },
10679 { DT_HP_PROTECT_LINKAGE_TABLE
, "HP_PROTECT_LINKAGE_TABLE" }
10683 bfd_vma val
= entry
->d_un
.d_val
;
10685 for (cnt
= 0; cnt
< ARRAY_SIZE (flags
); ++cnt
)
10686 if (val
& flags
[cnt
].bit
)
10690 fputs (flags
[cnt
].str
, stdout
);
10692 val
^= flags
[cnt
].bit
;
10695 if (val
!= 0 || first
)
10699 print_vma (val
, HEX
);
10705 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
10713 /* VMS vs Unix time offset and factor. */
10715 #define VMS_EPOCH_OFFSET 35067168000000000LL
10716 #define VMS_GRANULARITY_FACTOR 10000000
10718 #define INT64_MIN (-9223372036854775807LL - 1)
10721 /* Display a VMS time in a human readable format. */
10724 print_vms_time (bfd_int64_t vmstime
)
10726 struct tm
*tm
= NULL
;
10729 if (vmstime
>= INT64_MIN
+ VMS_EPOCH_OFFSET
)
10731 vmstime
= (vmstime
- VMS_EPOCH_OFFSET
) / VMS_GRANULARITY_FACTOR
;
10733 if (unxtime
== vmstime
)
10734 tm
= gmtime (&unxtime
);
10737 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
10738 tm
->tm_year
+ 1900, tm
->tm_mon
+ 1, tm
->tm_mday
,
10739 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
10744 dynamic_section_ia64_val (Elf_Internal_Dyn
* entry
)
10746 switch (entry
->d_tag
)
10748 case DT_IA_64_PLT_RESERVE
:
10749 /* First 3 slots reserved. */
10750 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
10752 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
10755 case DT_IA_64_VMS_LINKTIME
:
10757 print_vms_time (entry
->d_un
.d_val
);
10761 case DT_IA_64_VMS_LNKFLAGS
:
10762 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
10763 if (entry
->d_un
.d_val
& VMS_LF_CALL_DEBUG
)
10764 printf (" CALL_DEBUG");
10765 if (entry
->d_un
.d_val
& VMS_LF_NOP0BUFS
)
10766 printf (" NOP0BUFS");
10767 if (entry
->d_un
.d_val
& VMS_LF_P0IMAGE
)
10768 printf (" P0IMAGE");
10769 if (entry
->d_un
.d_val
& VMS_LF_MKTHREADS
)
10770 printf (" MKTHREADS");
10771 if (entry
->d_un
.d_val
& VMS_LF_UPCALLS
)
10772 printf (" UPCALLS");
10773 if (entry
->d_un
.d_val
& VMS_LF_IMGSTA
)
10774 printf (" IMGSTA");
10775 if (entry
->d_un
.d_val
& VMS_LF_INITIALIZE
)
10776 printf (" INITIALIZE");
10777 if (entry
->d_un
.d_val
& VMS_LF_MAIN
)
10779 if (entry
->d_un
.d_val
& VMS_LF_EXE_INIT
)
10780 printf (" EXE_INIT");
10781 if (entry
->d_un
.d_val
& VMS_LF_TBK_IN_IMG
)
10782 printf (" TBK_IN_IMG");
10783 if (entry
->d_un
.d_val
& VMS_LF_DBG_IN_IMG
)
10784 printf (" DBG_IN_IMG");
10785 if (entry
->d_un
.d_val
& VMS_LF_TBK_IN_DSF
)
10786 printf (" TBK_IN_DSF");
10787 if (entry
->d_un
.d_val
& VMS_LF_DBG_IN_DSF
)
10788 printf (" DBG_IN_DSF");
10789 if (entry
->d_un
.d_val
& VMS_LF_SIGNATURES
)
10790 printf (" SIGNATURES");
10791 if (entry
->d_un
.d_val
& VMS_LF_REL_SEG_OFF
)
10792 printf (" REL_SEG_OFF");
10796 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
10803 get_32bit_dynamic_section (Filedata
* filedata
)
10805 Elf32_External_Dyn
* edyn
;
10806 Elf32_External_Dyn
* ext
;
10807 Elf_Internal_Dyn
* entry
;
10809 edyn
= (Elf32_External_Dyn
*) get_data (NULL
, filedata
,
10810 filedata
->dynamic_addr
, 1,
10811 filedata
->dynamic_size
,
10812 _("dynamic section"));
10816 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
10817 might not have the luxury of section headers. Look for the DT_NULL
10818 terminator to determine the number of entries. */
10819 for (ext
= edyn
, filedata
->dynamic_nent
= 0;
10820 (char *) (ext
+ 1) <= (char *) edyn
+ filedata
->dynamic_size
;
10823 filedata
->dynamic_nent
++;
10824 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
10828 filedata
->dynamic_section
10829 = (Elf_Internal_Dyn
*) cmalloc (filedata
->dynamic_nent
, sizeof (* entry
));
10830 if (filedata
->dynamic_section
== NULL
)
10832 error (_("Out of memory allocating space for %lu dynamic entries\n"),
10833 (unsigned long) filedata
->dynamic_nent
);
10838 for (ext
= edyn
, entry
= filedata
->dynamic_section
;
10839 entry
< filedata
->dynamic_section
+ filedata
->dynamic_nent
;
10842 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
10843 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
10852 get_64bit_dynamic_section (Filedata
* filedata
)
10854 Elf64_External_Dyn
* edyn
;
10855 Elf64_External_Dyn
* ext
;
10856 Elf_Internal_Dyn
* entry
;
10858 /* Read in the data. */
10859 edyn
= (Elf64_External_Dyn
*) get_data (NULL
, filedata
,
10860 filedata
->dynamic_addr
, 1,
10861 filedata
->dynamic_size
,
10862 _("dynamic section"));
10866 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
10867 might not have the luxury of section headers. Look for the DT_NULL
10868 terminator to determine the number of entries. */
10869 for (ext
= edyn
, filedata
->dynamic_nent
= 0;
10870 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
10871 (char *) (ext
+ 1) <= (char *) edyn
+ filedata
->dynamic_size
;
10874 filedata
->dynamic_nent
++;
10875 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
10879 filedata
->dynamic_section
10880 = (Elf_Internal_Dyn
*) cmalloc (filedata
->dynamic_nent
, sizeof (* entry
));
10881 if (filedata
->dynamic_section
== NULL
)
10883 error (_("Out of memory allocating space for %lu dynamic entries\n"),
10884 (unsigned long) filedata
->dynamic_nent
);
10889 /* Convert from external to internal formats. */
10890 for (ext
= edyn
, entry
= filedata
->dynamic_section
;
10891 entry
< filedata
->dynamic_section
+ filedata
->dynamic_nent
;
10894 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
10895 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
10904 get_dynamic_section (Filedata
*filedata
)
10906 if (filedata
->dynamic_section
)
10910 return get_32bit_dynamic_section (filedata
);
10912 return get_64bit_dynamic_section (filedata
);
10916 print_dynamic_flags (bfd_vma flags
)
10924 flag
= flags
& - flags
;
10930 putc (' ', stdout
);
10934 case DF_ORIGIN
: fputs ("ORIGIN", stdout
); break;
10935 case DF_SYMBOLIC
: fputs ("SYMBOLIC", stdout
); break;
10936 case DF_TEXTREL
: fputs ("TEXTREL", stdout
); break;
10937 case DF_BIND_NOW
: fputs ("BIND_NOW", stdout
); break;
10938 case DF_STATIC_TLS
: fputs ("STATIC_TLS", stdout
); break;
10939 default: fputs (_("unknown"), stdout
); break;
10946 get_dynamic_data (Filedata
* filedata
, bfd_size_type number
, unsigned int ent_size
)
10948 unsigned char * e_data
;
10951 /* If the size_t type is smaller than the bfd_size_type, eg because
10952 you are building a 32-bit tool on a 64-bit host, then make sure
10953 that when (number) is cast to (size_t) no information is lost. */
10954 if (sizeof (size_t) < sizeof (bfd_size_type
)
10955 && (bfd_size_type
) ((size_t) number
) != number
)
10957 error (_("Size truncation prevents reading %s elements of size %u\n"),
10958 bfd_vmatoa ("u", number
), ent_size
);
10962 /* Be kind to memory checkers (eg valgrind, address sanitizer) by not
10963 attempting to allocate memory when the read is bound to fail. */
10964 if (ent_size
* number
> filedata
->file_size
)
10966 error (_("Invalid number of dynamic entries: %s\n"),
10967 bfd_vmatoa ("u", number
));
10971 e_data
= (unsigned char *) cmalloc ((size_t) number
, ent_size
);
10972 if (e_data
== NULL
)
10974 error (_("Out of memory reading %s dynamic entries\n"),
10975 bfd_vmatoa ("u", number
));
10979 if (fread (e_data
, ent_size
, (size_t) number
, filedata
->handle
) != number
)
10981 error (_("Unable to read in %s bytes of dynamic data\n"),
10982 bfd_vmatoa ("u", number
* ent_size
));
10987 i_data
= (bfd_vma
*) cmalloc ((size_t) number
, sizeof (*i_data
));
10988 if (i_data
== NULL
)
10990 error (_("Out of memory allocating space for %s dynamic entries\n"),
10991 bfd_vmatoa ("u", number
));
10997 i_data
[number
] = byte_get (e_data
+ number
* ent_size
, ent_size
);
11004 static unsigned long
11005 get_num_dynamic_syms (Filedata
* filedata
)
11007 unsigned long num_of_syms
= 0;
11009 if (!do_histogram
&& (!do_using_dynamic
|| do_dyn_syms
))
11010 return num_of_syms
;
11012 if (filedata
->dynamic_info
[DT_HASH
])
11014 unsigned char nb
[8];
11015 unsigned char nc
[8];
11016 unsigned int hash_ent_size
= 4;
11018 if ((filedata
->file_header
.e_machine
== EM_ALPHA
11019 || filedata
->file_header
.e_machine
== EM_S390
11020 || filedata
->file_header
.e_machine
== EM_S390_OLD
)
11021 && filedata
->file_header
.e_ident
[EI_CLASS
] == ELFCLASS64
)
11024 if (fseek (filedata
->handle
,
11025 (filedata
->archive_file_offset
11026 + offset_from_vma (filedata
, filedata
->dynamic_info
[DT_HASH
],
11027 sizeof nb
+ sizeof nc
)),
11030 error (_("Unable to seek to start of dynamic information\n"));
11034 if (fread (nb
, hash_ent_size
, 1, filedata
->handle
) != 1)
11036 error (_("Failed to read in number of buckets\n"));
11040 if (fread (nc
, hash_ent_size
, 1, filedata
->handle
) != 1)
11042 error (_("Failed to read in number of chains\n"));
11046 filedata
->nbuckets
= byte_get (nb
, hash_ent_size
);
11047 filedata
->nchains
= byte_get (nc
, hash_ent_size
);
11049 if (filedata
->nbuckets
!= 0 && filedata
->nchains
!= 0)
11051 filedata
->buckets
= get_dynamic_data (filedata
, filedata
->nbuckets
,
11053 filedata
->chains
= get_dynamic_data (filedata
, filedata
->nchains
,
11056 if (filedata
->buckets
!= NULL
&& filedata
->chains
!= NULL
)
11057 num_of_syms
= filedata
->nchains
;
11060 if (num_of_syms
== 0)
11062 free (filedata
->buckets
);
11063 filedata
->buckets
= NULL
;
11064 free (filedata
->chains
);
11065 filedata
->chains
= NULL
;
11066 filedata
->nbuckets
= 0;
11070 if (filedata
->dynamic_info_DT_GNU_HASH
)
11072 unsigned char nb
[16];
11073 bfd_vma i
, maxchain
= 0xffffffff, bitmaskwords
;
11074 bfd_vma buckets_vma
;
11077 if (fseek (filedata
->handle
,
11078 (filedata
->archive_file_offset
11079 + offset_from_vma (filedata
,
11080 filedata
->dynamic_info_DT_GNU_HASH
,
11084 error (_("Unable to seek to start of dynamic information\n"));
11088 if (fread (nb
, 16, 1, filedata
->handle
) != 1)
11090 error (_("Failed to read in number of buckets\n"));
11094 filedata
->ngnubuckets
= byte_get (nb
, 4);
11095 filedata
->gnusymidx
= byte_get (nb
+ 4, 4);
11096 bitmaskwords
= byte_get (nb
+ 8, 4);
11097 buckets_vma
= filedata
->dynamic_info_DT_GNU_HASH
+ 16;
11099 buckets_vma
+= bitmaskwords
* 4;
11101 buckets_vma
+= bitmaskwords
* 8;
11103 if (fseek (filedata
->handle
,
11104 (filedata
->archive_file_offset
11105 + offset_from_vma (filedata
, buckets_vma
, 4)),
11108 error (_("Unable to seek to start of dynamic information\n"));
11112 filedata
->gnubuckets
11113 = get_dynamic_data (filedata
, filedata
->ngnubuckets
, 4);
11115 if (filedata
->gnubuckets
== NULL
)
11118 for (i
= 0; i
< filedata
->ngnubuckets
; i
++)
11119 if (filedata
->gnubuckets
[i
] != 0)
11121 if (filedata
->gnubuckets
[i
] < filedata
->gnusymidx
)
11124 if (maxchain
== 0xffffffff || filedata
->gnubuckets
[i
] > maxchain
)
11125 maxchain
= filedata
->gnubuckets
[i
];
11128 if (maxchain
== 0xffffffff)
11131 maxchain
-= filedata
->gnusymidx
;
11133 if (fseek (filedata
->handle
,
11134 (filedata
->archive_file_offset
11135 + offset_from_vma (filedata
,
11136 buckets_vma
+ 4 * (filedata
->ngnubuckets
11141 error (_("Unable to seek to start of dynamic information\n"));
11147 if (fread (nb
, 4, 1, filedata
->handle
) != 1)
11149 error (_("Failed to determine last chain length\n"));
11153 if (maxchain
+ 1 == 0)
11158 while ((byte_get (nb
, 4) & 1) == 0);
11160 if (fseek (filedata
->handle
,
11161 (filedata
->archive_file_offset
11162 + offset_from_vma (filedata
, (buckets_vma
11163 + 4 * filedata
->ngnubuckets
),
11167 error (_("Unable to seek to start of dynamic information\n"));
11171 filedata
->gnuchains
= get_dynamic_data (filedata
, maxchain
, 4);
11172 filedata
->ngnuchains
= maxchain
;
11174 if (filedata
->gnuchains
== NULL
)
11177 if (filedata
->dynamic_info_DT_MIPS_XHASH
)
11179 if (fseek (filedata
->handle
,
11180 (filedata
->archive_file_offset
11181 + offset_from_vma (filedata
, (buckets_vma
11182 + 4 * (filedata
->ngnubuckets
11186 error (_("Unable to seek to start of dynamic information\n"));
11190 filedata
->mipsxlat
= get_dynamic_data (filedata
, maxchain
, 4);
11191 if (filedata
->mipsxlat
== NULL
)
11195 for (hn
= 0; hn
< filedata
->ngnubuckets
; ++hn
)
11196 if (filedata
->gnubuckets
[hn
] != 0)
11198 bfd_vma si
= filedata
->gnubuckets
[hn
];
11199 bfd_vma off
= si
- filedata
->gnusymidx
;
11203 if (filedata
->dynamic_info_DT_MIPS_XHASH
)
11205 if (off
< filedata
->ngnuchains
11206 && filedata
->mipsxlat
[off
] >= num_of_syms
)
11207 num_of_syms
= filedata
->mipsxlat
[off
] + 1;
11211 if (si
>= num_of_syms
)
11212 num_of_syms
= si
+ 1;
11216 while (off
< filedata
->ngnuchains
11217 && (filedata
->gnuchains
[off
++] & 1) == 0);
11220 if (num_of_syms
== 0)
11223 free (filedata
->mipsxlat
);
11224 filedata
->mipsxlat
= NULL
;
11225 free (filedata
->gnuchains
);
11226 filedata
->gnuchains
= NULL
;
11227 free (filedata
->gnubuckets
);
11228 filedata
->gnubuckets
= NULL
;
11229 filedata
->ngnubuckets
= 0;
11230 filedata
->ngnuchains
= 0;
11234 return num_of_syms
;
11237 /* Parse and display the contents of the dynamic section. */
11240 process_dynamic_section (Filedata
* filedata
)
11242 Elf_Internal_Dyn
* entry
;
11244 if (filedata
->dynamic_size
<= 1)
11248 if (filedata
->is_separate
)
11249 printf (_("\nThere is no dynamic section in linked file '%s'.\n"),
11250 filedata
->file_name
);
11252 printf (_("\nThere is no dynamic section in this file.\n"));
11258 if (!get_dynamic_section (filedata
))
11261 /* Find the appropriate symbol table. */
11262 if (filedata
->dynamic_symbols
== NULL
|| do_histogram
)
11264 unsigned long num_of_syms
;
11266 for (entry
= filedata
->dynamic_section
;
11267 entry
< filedata
->dynamic_section
+ filedata
->dynamic_nent
;
11269 if (entry
->d_tag
== DT_SYMTAB
)
11270 filedata
->dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
11271 else if (entry
->d_tag
== DT_SYMENT
)
11272 filedata
->dynamic_info
[DT_SYMENT
] = entry
->d_un
.d_val
;
11273 else if (entry
->d_tag
== DT_HASH
)
11274 filedata
->dynamic_info
[DT_HASH
] = entry
->d_un
.d_val
;
11275 else if (entry
->d_tag
== DT_GNU_HASH
)
11276 filedata
->dynamic_info_DT_GNU_HASH
= entry
->d_un
.d_val
;
11277 else if ((filedata
->file_header
.e_machine
== EM_MIPS
11278 || filedata
->file_header
.e_machine
== EM_MIPS_RS3_LE
)
11279 && entry
->d_tag
== DT_MIPS_XHASH
)
11281 filedata
->dynamic_info_DT_MIPS_XHASH
= entry
->d_un
.d_val
;
11282 filedata
->dynamic_info_DT_GNU_HASH
= entry
->d_un
.d_val
;
11285 num_of_syms
= get_num_dynamic_syms (filedata
);
11287 if (num_of_syms
!= 0
11288 && filedata
->dynamic_symbols
== NULL
11289 && filedata
->dynamic_info
[DT_SYMTAB
]
11290 && filedata
->dynamic_info
[DT_SYMENT
])
11292 Elf_Internal_Phdr
*seg
;
11293 bfd_vma vma
= filedata
->dynamic_info
[DT_SYMTAB
];
11295 if (! get_program_headers (filedata
))
11297 error (_("Cannot interpret virtual addresses "
11298 "without program headers.\n"));
11302 for (seg
= filedata
->program_headers
;
11303 seg
< filedata
->program_headers
+ filedata
->file_header
.e_phnum
;
11306 if (seg
->p_type
!= PT_LOAD
)
11309 if (seg
->p_offset
+ seg
->p_filesz
> filedata
->file_size
)
11311 /* See PR 21379 for a reproducer. */
11312 error (_("Invalid PT_LOAD entry\n"));
11316 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
11317 && vma
< seg
->p_vaddr
+ seg
->p_filesz
)
11319 /* Since we do not know how big the symbol table is,
11320 we default to reading in up to the end of PT_LOAD
11321 segment and processing that. This is overkill, I
11322 know, but it should work. */
11323 Elf_Internal_Shdr section
;
11324 section
.sh_offset
= (vma
- seg
->p_vaddr
11326 section
.sh_size
= (num_of_syms
11327 * filedata
->dynamic_info
[DT_SYMENT
]);
11328 section
.sh_entsize
= filedata
->dynamic_info
[DT_SYMENT
];
11331 && filedata
->dynamic_symtab_section
!= NULL
11332 && ((filedata
->dynamic_symtab_section
->sh_offset
11333 != section
.sh_offset
)
11334 || (filedata
->dynamic_symtab_section
->sh_size
11335 != section
.sh_size
)
11336 || (filedata
->dynamic_symtab_section
->sh_entsize
11337 != section
.sh_entsize
)))
11339 the .dynsym section doesn't match the DT_SYMTAB and DT_SYMENT tags\n"));
11341 section
.sh_name
= filedata
->string_table_length
;
11342 filedata
->dynamic_symbols
11343 = get_elf_symbols (filedata
, §ion
,
11344 &filedata
->num_dynamic_syms
);
11345 if (filedata
->dynamic_symbols
== NULL
11346 || filedata
->num_dynamic_syms
!= num_of_syms
)
11348 error (_("Corrupt DT_SYMTAB dynamic entry\n"));
11357 /* Similarly find a string table. */
11358 if (filedata
->dynamic_strings
== NULL
)
11359 for (entry
= filedata
->dynamic_section
;
11360 entry
< filedata
->dynamic_section
+ filedata
->dynamic_nent
;
11363 if (entry
->d_tag
== DT_STRTAB
)
11364 filedata
->dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
11366 if (entry
->d_tag
== DT_STRSZ
)
11367 filedata
->dynamic_info
[DT_STRSZ
] = entry
->d_un
.d_val
;
11369 if (filedata
->dynamic_info
[DT_STRTAB
]
11370 && filedata
->dynamic_info
[DT_STRSZ
])
11372 unsigned long offset
;
11373 bfd_size_type str_tab_len
= filedata
->dynamic_info
[DT_STRSZ
];
11375 offset
= offset_from_vma (filedata
,
11376 filedata
->dynamic_info
[DT_STRTAB
],
11379 && filedata
->dynamic_strtab_section
11380 && ((filedata
->dynamic_strtab_section
->sh_offset
11381 != (file_ptr
) offset
)
11382 || (filedata
->dynamic_strtab_section
->sh_size
11385 the .dynstr section doesn't match the DT_STRTAB and DT_STRSZ tags\n"));
11387 filedata
->dynamic_strings
11388 = (char *) get_data (NULL
, filedata
, offset
, 1, str_tab_len
,
11389 _("dynamic string table"));
11390 if (filedata
->dynamic_strings
== NULL
)
11392 error (_("Corrupt DT_STRTAB dynamic entry\n"));
11396 filedata
->dynamic_strings_length
= str_tab_len
;
11401 /* And find the syminfo section if available. */
11402 if (filedata
->dynamic_syminfo
== NULL
)
11404 unsigned long syminsz
= 0;
11406 for (entry
= filedata
->dynamic_section
;
11407 entry
< filedata
->dynamic_section
+ filedata
->dynamic_nent
;
11410 if (entry
->d_tag
== DT_SYMINENT
)
11412 /* Note: these braces are necessary to avoid a syntax
11413 error from the SunOS4 C compiler. */
11414 /* PR binutils/17531: A corrupt file can trigger this test.
11415 So do not use an assert, instead generate an error message. */
11416 if (sizeof (Elf_External_Syminfo
) != entry
->d_un
.d_val
)
11417 error (_("Bad value (%d) for SYMINENT entry\n"),
11418 (int) entry
->d_un
.d_val
);
11420 else if (entry
->d_tag
== DT_SYMINSZ
)
11421 syminsz
= entry
->d_un
.d_val
;
11422 else if (entry
->d_tag
== DT_SYMINFO
)
11423 filedata
->dynamic_syminfo_offset
11424 = offset_from_vma (filedata
, entry
->d_un
.d_val
, syminsz
);
11427 if (filedata
->dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
11429 Elf_External_Syminfo
* extsyminfo
;
11430 Elf_External_Syminfo
* extsym
;
11431 Elf_Internal_Syminfo
* syminfo
;
11433 /* There is a syminfo section. Read the data. */
11434 extsyminfo
= (Elf_External_Syminfo
*)
11435 get_data (NULL
, filedata
, filedata
->dynamic_syminfo_offset
,
11436 1, syminsz
, _("symbol information"));
11440 if (filedata
->dynamic_syminfo
!= NULL
)
11442 error (_("Multiple dynamic symbol information sections found\n"));
11443 free (filedata
->dynamic_syminfo
);
11445 filedata
->dynamic_syminfo
= (Elf_Internal_Syminfo
*) malloc (syminsz
);
11446 if (filedata
->dynamic_syminfo
== NULL
)
11448 error (_("Out of memory allocating %lu bytes "
11449 "for dynamic symbol info\n"),
11450 (unsigned long) syminsz
);
11454 filedata
->dynamic_syminfo_nent
11455 = syminsz
/ sizeof (Elf_External_Syminfo
);
11456 for (syminfo
= filedata
->dynamic_syminfo
, extsym
= extsyminfo
;
11457 syminfo
< (filedata
->dynamic_syminfo
11458 + filedata
->dynamic_syminfo_nent
);
11459 ++syminfo
, ++extsym
)
11461 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
11462 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
11469 if (do_dynamic
&& filedata
->dynamic_addr
)
11471 if (filedata
->is_separate
)
11472 printf (ngettext ("\nIn linked file '%s' the dynamic section at offset 0x%lx contains %lu entry:\n",
11473 "\nIn linked file '%s' the dynamic section at offset 0x%lx contains %lu entries:\n",
11474 (unsigned long) filedata
->dynamic_nent
),
11475 filedata
->file_name
,
11476 filedata
->dynamic_addr
,
11477 (unsigned long) filedata
->dynamic_nent
);
11479 printf (ngettext ("\nDynamic section at offset 0x%lx contains %lu entry:\n",
11480 "\nDynamic section at offset 0x%lx contains %lu entries:\n",
11481 (unsigned long) filedata
->dynamic_nent
),
11482 filedata
->dynamic_addr
,
11483 (unsigned long) filedata
->dynamic_nent
);
11486 printf (_(" Tag Type Name/Value\n"));
11488 for (entry
= filedata
->dynamic_section
;
11489 entry
< filedata
->dynamic_section
+ filedata
->dynamic_nent
;
11494 const char * dtype
;
11497 print_vma (entry
->d_tag
, FULL_HEX
);
11498 dtype
= get_dynamic_type (filedata
, entry
->d_tag
);
11499 printf (" (%s)%*s", dtype
,
11500 ((is_32bit_elf
? 27 : 19) - (int) strlen (dtype
)), " ");
11503 switch (entry
->d_tag
)
11507 print_dynamic_flags (entry
->d_un
.d_val
);
11517 switch (entry
->d_tag
)
11520 printf (_("Auxiliary library"));
11524 printf (_("Filter library"));
11528 printf (_("Configuration file"));
11532 printf (_("Dependency audit library"));
11536 printf (_("Audit library"));
11540 if (valid_dynamic_name (filedata
, entry
->d_un
.d_val
))
11541 printf (": [%s]\n",
11542 get_dynamic_name (filedata
, entry
->d_un
.d_val
));
11546 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
11555 printf (_("Flags:"));
11557 if (entry
->d_un
.d_val
== 0)
11558 printf (_(" None\n"));
11561 unsigned long int val
= entry
->d_un
.d_val
;
11563 if (val
& DTF_1_PARINIT
)
11565 printf (" PARINIT");
11566 val
^= DTF_1_PARINIT
;
11568 if (val
& DTF_1_CONFEXP
)
11570 printf (" CONFEXP");
11571 val
^= DTF_1_CONFEXP
;
11574 printf (" %lx", val
);
11583 printf (_("Flags:"));
11585 if (entry
->d_un
.d_val
== 0)
11586 printf (_(" None\n"));
11589 unsigned long int val
= entry
->d_un
.d_val
;
11591 if (val
& DF_P1_LAZYLOAD
)
11593 printf (" LAZYLOAD");
11594 val
^= DF_P1_LAZYLOAD
;
11596 if (val
& DF_P1_GROUPPERM
)
11598 printf (" GROUPPERM");
11599 val
^= DF_P1_GROUPPERM
;
11602 printf (" %lx", val
);
11611 printf (_("Flags:"));
11612 if (entry
->d_un
.d_val
== 0)
11613 printf (_(" None\n"));
11616 unsigned long int val
= entry
->d_un
.d_val
;
11618 if (val
& DF_1_NOW
)
11623 if (val
& DF_1_GLOBAL
)
11625 printf (" GLOBAL");
11626 val
^= DF_1_GLOBAL
;
11628 if (val
& DF_1_GROUP
)
11633 if (val
& DF_1_NODELETE
)
11635 printf (" NODELETE");
11636 val
^= DF_1_NODELETE
;
11638 if (val
& DF_1_LOADFLTR
)
11640 printf (" LOADFLTR");
11641 val
^= DF_1_LOADFLTR
;
11643 if (val
& DF_1_INITFIRST
)
11645 printf (" INITFIRST");
11646 val
^= DF_1_INITFIRST
;
11648 if (val
& DF_1_NOOPEN
)
11650 printf (" NOOPEN");
11651 val
^= DF_1_NOOPEN
;
11653 if (val
& DF_1_ORIGIN
)
11655 printf (" ORIGIN");
11656 val
^= DF_1_ORIGIN
;
11658 if (val
& DF_1_DIRECT
)
11660 printf (" DIRECT");
11661 val
^= DF_1_DIRECT
;
11663 if (val
& DF_1_TRANS
)
11668 if (val
& DF_1_INTERPOSE
)
11670 printf (" INTERPOSE");
11671 val
^= DF_1_INTERPOSE
;
11673 if (val
& DF_1_NODEFLIB
)
11675 printf (" NODEFLIB");
11676 val
^= DF_1_NODEFLIB
;
11678 if (val
& DF_1_NODUMP
)
11680 printf (" NODUMP");
11681 val
^= DF_1_NODUMP
;
11683 if (val
& DF_1_CONFALT
)
11685 printf (" CONFALT");
11686 val
^= DF_1_CONFALT
;
11688 if (val
& DF_1_ENDFILTEE
)
11690 printf (" ENDFILTEE");
11691 val
^= DF_1_ENDFILTEE
;
11693 if (val
& DF_1_DISPRELDNE
)
11695 printf (" DISPRELDNE");
11696 val
^= DF_1_DISPRELDNE
;
11698 if (val
& DF_1_DISPRELPND
)
11700 printf (" DISPRELPND");
11701 val
^= DF_1_DISPRELPND
;
11703 if (val
& DF_1_NODIRECT
)
11705 printf (" NODIRECT");
11706 val
^= DF_1_NODIRECT
;
11708 if (val
& DF_1_IGNMULDEF
)
11710 printf (" IGNMULDEF");
11711 val
^= DF_1_IGNMULDEF
;
11713 if (val
& DF_1_NOKSYMS
)
11715 printf (" NOKSYMS");
11716 val
^= DF_1_NOKSYMS
;
11718 if (val
& DF_1_NOHDR
)
11723 if (val
& DF_1_EDITED
)
11725 printf (" EDITED");
11726 val
^= DF_1_EDITED
;
11728 if (val
& DF_1_NORELOC
)
11730 printf (" NORELOC");
11731 val
^= DF_1_NORELOC
;
11733 if (val
& DF_1_SYMINTPOSE
)
11735 printf (" SYMINTPOSE");
11736 val
^= DF_1_SYMINTPOSE
;
11738 if (val
& DF_1_GLOBAUDIT
)
11740 printf (" GLOBAUDIT");
11741 val
^= DF_1_GLOBAUDIT
;
11743 if (val
& DF_1_SINGLETON
)
11745 printf (" SINGLETON");
11746 val
^= DF_1_SINGLETON
;
11748 if (val
& DF_1_STUB
)
11753 if (val
& DF_1_PIE
)
11758 if (val
& DF_1_KMOD
)
11763 if (val
& DF_1_WEAKFILTER
)
11765 printf (" WEAKFILTER");
11766 val
^= DF_1_WEAKFILTER
;
11768 if (val
& DF_1_NOCOMMON
)
11770 printf (" NOCOMMON");
11771 val
^= DF_1_NOCOMMON
;
11774 printf (" %lx", val
);
11781 filedata
->dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
11783 puts (get_dynamic_type (filedata
, entry
->d_un
.d_val
));
11804 filedata
->dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
11810 if (valid_dynamic_name (filedata
, entry
->d_un
.d_val
))
11811 name
= get_dynamic_name (filedata
, entry
->d_un
.d_val
);
11817 switch (entry
->d_tag
)
11820 printf (_("Shared library: [%s]"), name
);
11822 if (filedata
->program_interpreter
11823 && streq (name
, filedata
->program_interpreter
))
11824 printf (_(" program interpreter"));
11828 printf (_("Library soname: [%s]"), name
);
11832 printf (_("Library rpath: [%s]"), name
);
11836 printf (_("Library runpath: [%s]"), name
);
11840 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
11845 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
11860 filedata
->dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
11861 /* Fall through. */
11865 case DT_PREINIT_ARRAYSZ
:
11866 case DT_INIT_ARRAYSZ
:
11867 case DT_FINI_ARRAYSZ
:
11868 case DT_GNU_CONFLICTSZ
:
11869 case DT_GNU_LIBLISTSZ
:
11872 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
11873 printf (_(" (bytes)\n"));
11878 case DT_VERNEEDNUM
:
11883 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
11892 case DT_INIT_ARRAY
:
11893 case DT_FINI_ARRAY
:
11896 if (entry
->d_tag
== DT_USED
11897 && valid_dynamic_name (filedata
, entry
->d_un
.d_val
))
11900 = get_dynamic_name (filedata
, entry
->d_un
.d_val
);
11904 printf (_("Not needed object: [%s]\n"), name
);
11909 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
11915 /* The value of this entry is ignored. */
11920 case DT_GNU_PRELINKED
:
11924 time_t atime
= entry
->d_un
.d_val
;
11926 tmp
= gmtime (&atime
);
11927 /* PR 17533 file: 041-1244816-0.004. */
11929 printf (_("<corrupt time val: %lx"),
11930 (unsigned long) atime
);
11932 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
11933 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
11934 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
11940 filedata
->dynamic_info_DT_GNU_HASH
= entry
->d_un
.d_val
;
11943 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
11948 case DT_GNU_FLAGS_1
:
11951 printf (_("Flags:"));
11952 if (entry
->d_un
.d_val
== 0)
11953 printf (_(" None\n"));
11956 unsigned long int val
= entry
->d_un
.d_val
;
11958 if (val
& DF_GNU_1_UNIQUE
)
11960 printf (" UNIQUE");
11961 val
^= DF_GNU_1_UNIQUE
;
11964 printf (" %lx", val
);
11971 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
11972 filedata
->version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)]
11973 = entry
->d_un
.d_val
;
11977 switch (filedata
->file_header
.e_machine
)
11980 dynamic_section_aarch64_val (entry
);
11983 case EM_MIPS_RS3_LE
:
11984 dynamic_section_mips_val (filedata
, entry
);
11987 dynamic_section_parisc_val (entry
);
11990 dynamic_section_ia64_val (entry
);
11993 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
12005 get_ver_flags (unsigned int flags
)
12007 static char buff
[128];
12014 if (flags
& VER_FLG_BASE
)
12015 strcat (buff
, "BASE");
12017 if (flags
& VER_FLG_WEAK
)
12019 if (flags
& VER_FLG_BASE
)
12020 strcat (buff
, " | ");
12022 strcat (buff
, "WEAK");
12025 if (flags
& VER_FLG_INFO
)
12027 if (flags
& (VER_FLG_BASE
|VER_FLG_WEAK
))
12028 strcat (buff
, " | ");
12030 strcat (buff
, "INFO");
12033 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
| VER_FLG_INFO
))
12035 if (flags
& (VER_FLG_BASE
| VER_FLG_WEAK
| VER_FLG_INFO
))
12036 strcat (buff
, " | ");
12038 strcat (buff
, _("<unknown>"));
12044 /* Display the contents of the version sections. */
12047 process_version_sections (Filedata
* filedata
)
12049 Elf_Internal_Shdr
* section
;
12051 bool found
= false;
12056 for (i
= 0, section
= filedata
->section_headers
;
12057 i
< filedata
->file_header
.e_shnum
;
12060 switch (section
->sh_type
)
12062 case SHT_GNU_verdef
:
12064 Elf_External_Verdef
* edefs
;
12071 if (filedata
->is_separate
)
12072 printf (ngettext ("\nIn linked file '%s' the version definition section '%s' contains %u entry:\n",
12073 "\nIn linked file '%s' the version definition section '%s' contains %u entries:\n",
12075 filedata
->file_name
,
12076 printable_section_name (filedata
, section
),
12079 printf (ngettext ("\nVersion definition section '%s' "
12080 "contains %u entry:\n",
12081 "\nVersion definition section '%s' "
12082 "contains %u entries:\n",
12084 printable_section_name (filedata
, section
),
12087 printf (_(" Addr: 0x"));
12088 printf_vma (section
->sh_addr
);
12089 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
12090 (unsigned long) section
->sh_offset
, section
->sh_link
,
12091 printable_section_name_from_index (filedata
, section
->sh_link
));
12093 edefs
= (Elf_External_Verdef
*)
12094 get_data (NULL
, filedata
, section
->sh_offset
, 1,section
->sh_size
,
12095 _("version definition section"));
12098 endbuf
= (char *) edefs
+ section
->sh_size
;
12100 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
12103 Elf_External_Verdef
* edef
;
12104 Elf_Internal_Verdef ent
;
12105 Elf_External_Verdaux
* eaux
;
12106 Elf_Internal_Verdaux aux
;
12107 unsigned long isum
;
12110 vstart
= ((char *) edefs
) + idx
;
12111 if (vstart
+ sizeof (*edef
) > endbuf
)
12114 edef
= (Elf_External_Verdef
*) vstart
;
12116 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
12117 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
12118 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
12119 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
12120 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
12121 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
12122 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
12124 printf (_(" %#06lx: Rev: %d Flags: %s"),
12125 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
12127 printf (_(" Index: %d Cnt: %d "),
12128 ent
.vd_ndx
, ent
.vd_cnt
);
12130 /* Check for overflow. */
12131 if (ent
.vd_aux
> (size_t) (endbuf
- vstart
))
12134 vstart
+= ent
.vd_aux
;
12136 if (vstart
+ sizeof (*eaux
) > endbuf
)
12138 eaux
= (Elf_External_Verdaux
*) vstart
;
12140 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
12141 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
12143 if (valid_dynamic_name (filedata
, aux
.vda_name
))
12144 printf (_("Name: %s\n"),
12145 get_dynamic_name (filedata
, aux
.vda_name
));
12147 printf (_("Name index: %ld\n"), aux
.vda_name
);
12149 isum
= idx
+ ent
.vd_aux
;
12151 for (j
= 1; j
< ent
.vd_cnt
; j
++)
12153 if (aux
.vda_next
< sizeof (*eaux
)
12154 && !(j
== ent
.vd_cnt
- 1 && aux
.vda_next
== 0))
12156 warn (_("Invalid vda_next field of %lx\n"),
12161 /* Check for overflow. */
12162 if (aux
.vda_next
> (size_t) (endbuf
- vstart
))
12165 isum
+= aux
.vda_next
;
12166 vstart
+= aux
.vda_next
;
12168 if (vstart
+ sizeof (*eaux
) > endbuf
)
12170 eaux
= (Elf_External_Verdaux
*) vstart
;
12172 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
12173 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
12175 if (valid_dynamic_name (filedata
, aux
.vda_name
))
12176 printf (_(" %#06lx: Parent %d: %s\n"),
12178 get_dynamic_name (filedata
, aux
.vda_name
));
12180 printf (_(" %#06lx: Parent %d, name index: %ld\n"),
12181 isum
, j
, aux
.vda_name
);
12184 if (j
< ent
.vd_cnt
)
12185 printf (_(" Version def aux past end of section\n"));
12188 file: id:000001,src:000172+005151,op:splice,rep:2. */
12189 if (ent
.vd_next
< sizeof (*edef
)
12190 && !(cnt
== section
->sh_info
- 1 && ent
.vd_next
== 0))
12192 warn (_("Invalid vd_next field of %lx\n"), ent
.vd_next
);
12193 cnt
= section
->sh_info
;
12196 if (ent
.vd_next
> (size_t) (endbuf
- ((char *) edefs
+ idx
)))
12199 idx
+= ent
.vd_next
;
12202 if (cnt
< section
->sh_info
)
12203 printf (_(" Version definition past end of section\n"));
12209 case SHT_GNU_verneed
:
12211 Elf_External_Verneed
* eneed
;
12218 if (filedata
->is_separate
)
12219 printf (ngettext ("\nIn linked file '%s' the version needs section '%s' contains %u entry:\n",
12220 "\nIn linked file '%s' the version needs section '%s' contains %u entries:\n",
12222 filedata
->file_name
,
12223 printable_section_name (filedata
, section
),
12226 printf (ngettext ("\nVersion needs section '%s' "
12227 "contains %u entry:\n",
12228 "\nVersion needs section '%s' "
12229 "contains %u entries:\n",
12231 printable_section_name (filedata
, section
),
12234 printf (_(" Addr: 0x"));
12235 printf_vma (section
->sh_addr
);
12236 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
12237 (unsigned long) section
->sh_offset
, section
->sh_link
,
12238 printable_section_name_from_index (filedata
, section
->sh_link
));
12240 eneed
= (Elf_External_Verneed
*) get_data (NULL
, filedata
,
12241 section
->sh_offset
, 1,
12243 _("Version Needs section"));
12246 endbuf
= (char *) eneed
+ section
->sh_size
;
12248 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
12250 Elf_External_Verneed
* entry
;
12251 Elf_Internal_Verneed ent
;
12252 unsigned long isum
;
12256 vstart
= ((char *) eneed
) + idx
;
12257 if (vstart
+ sizeof (*entry
) > endbuf
)
12260 entry
= (Elf_External_Verneed
*) vstart
;
12262 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
12263 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
12264 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
12265 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
12266 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
12268 printf (_(" %#06lx: Version: %d"), idx
, ent
.vn_version
);
12270 if (valid_dynamic_name (filedata
, ent
.vn_file
))
12271 printf (_(" File: %s"),
12272 get_dynamic_name (filedata
, ent
.vn_file
));
12274 printf (_(" File: %lx"), ent
.vn_file
);
12276 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
12278 /* Check for overflow. */
12279 if (ent
.vn_aux
> (size_t) (endbuf
- vstart
))
12281 vstart
+= ent
.vn_aux
;
12283 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
12285 Elf_External_Vernaux
* eaux
;
12286 Elf_Internal_Vernaux aux
;
12288 if (vstart
+ sizeof (*eaux
) > endbuf
)
12290 eaux
= (Elf_External_Vernaux
*) vstart
;
12292 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
12293 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
12294 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
12295 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
12296 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
12298 if (valid_dynamic_name (filedata
, aux
.vna_name
))
12299 printf (_(" %#06lx: Name: %s"),
12300 isum
, get_dynamic_name (filedata
, aux
.vna_name
));
12302 printf (_(" %#06lx: Name index: %lx"),
12303 isum
, aux
.vna_name
);
12305 printf (_(" Flags: %s Version: %d\n"),
12306 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
12308 if (aux
.vna_next
< sizeof (*eaux
)
12309 && !(j
== ent
.vn_cnt
- 1 && aux
.vna_next
== 0))
12311 warn (_("Invalid vna_next field of %lx\n"),
12316 /* Check for overflow. */
12317 if (aux
.vna_next
> (size_t) (endbuf
- vstart
))
12319 isum
+= aux
.vna_next
;
12320 vstart
+= aux
.vna_next
;
12323 if (j
< ent
.vn_cnt
)
12324 warn (_("Missing Version Needs auxiliary information\n"));
12326 if (ent
.vn_next
< sizeof (*entry
)
12327 && !(cnt
== section
->sh_info
- 1 && ent
.vn_next
== 0))
12329 warn (_("Invalid vn_next field of %lx\n"), ent
.vn_next
);
12330 cnt
= section
->sh_info
;
12333 if (ent
.vn_next
> (size_t) (endbuf
- ((char *) eneed
+ idx
)))
12335 idx
+= ent
.vn_next
;
12338 if (cnt
< section
->sh_info
)
12339 warn (_("Missing Version Needs information\n"));
12345 case SHT_GNU_versym
:
12347 Elf_Internal_Shdr
* link_section
;
12350 unsigned char * edata
;
12351 unsigned short * data
;
12353 Elf_Internal_Sym
* symbols
;
12354 Elf_Internal_Shdr
* string_sec
;
12355 unsigned long num_syms
;
12358 if (section
->sh_link
>= filedata
->file_header
.e_shnum
)
12361 link_section
= filedata
->section_headers
+ section
->sh_link
;
12362 total
= section
->sh_size
/ sizeof (Elf_External_Versym
);
12364 if (link_section
->sh_link
>= filedata
->file_header
.e_shnum
)
12369 symbols
= get_elf_symbols (filedata
, link_section
, & num_syms
);
12370 if (symbols
== NULL
)
12373 string_sec
= filedata
->section_headers
+ link_section
->sh_link
;
12375 strtab
= (char *) get_data (NULL
, filedata
, string_sec
->sh_offset
, 1,
12376 string_sec
->sh_size
,
12377 _("version string table"));
12384 if (filedata
->is_separate
)
12385 printf (ngettext ("\nIn linked file '%s' the version symbols section '%s' contains %lu entry:\n",
12386 "\nIn linked file '%s' the version symbols section '%s' contains %lu entries:\n",
12388 filedata
->file_name
,
12389 printable_section_name (filedata
, section
),
12390 (unsigned long) total
);
12392 printf (ngettext ("\nVersion symbols section '%s' "
12393 "contains %lu entry:\n",
12394 "\nVersion symbols section '%s' "
12395 "contains %lu entries:\n",
12397 printable_section_name (filedata
, section
),
12398 (unsigned long) total
);
12400 printf (_(" Addr: 0x"));
12401 printf_vma (section
->sh_addr
);
12402 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
12403 (unsigned long) section
->sh_offset
, section
->sh_link
,
12404 printable_section_name (filedata
, link_section
));
12406 off
= offset_from_vma (filedata
,
12407 filedata
->version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
12408 total
* sizeof (short));
12409 edata
= (unsigned char *) get_data (NULL
, filedata
, off
,
12410 sizeof (short), total
,
12411 _("version symbol data"));
12419 data
= (short unsigned int *) cmalloc (total
, sizeof (short));
12421 for (cnt
= total
; cnt
--;)
12422 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
12427 for (cnt
= 0; cnt
< total
; cnt
+= 4)
12431 char *invalid
= _("*invalid*");
12433 printf (" %03x:", cnt
);
12435 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
12436 switch (data
[cnt
+ j
])
12439 fputs (_(" 0 (*local*) "), stdout
);
12443 fputs (_(" 1 (*global*) "), stdout
);
12447 nn
= printf ("%4x%c", data
[cnt
+ j
] & VERSYM_VERSION
,
12448 data
[cnt
+ j
] & VERSYM_HIDDEN
? 'h' : ' ');
12450 /* If this index value is greater than the size of the symbols
12451 array, break to avoid an out-of-bounds read. */
12452 if ((unsigned long)(cnt
+ j
) >= num_syms
)
12454 warn (_("invalid index into symbol array\n"));
12459 if (filedata
->version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
12461 Elf_Internal_Verneed ivn
;
12462 unsigned long offset
;
12464 offset
= offset_from_vma
12466 filedata
->version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
12467 sizeof (Elf_External_Verneed
));
12471 Elf_Internal_Vernaux ivna
;
12472 Elf_External_Verneed evn
;
12473 Elf_External_Vernaux evna
;
12474 unsigned long a_off
;
12476 if (get_data (&evn
, filedata
, offset
, sizeof (evn
), 1,
12477 _("version need")) == NULL
)
12480 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
12481 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
12483 a_off
= offset
+ ivn
.vn_aux
;
12487 if (get_data (&evna
, filedata
, a_off
, sizeof (evna
),
12488 1, _("version need aux (2)")) == NULL
)
12491 ivna
.vna_other
= 0;
12495 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
12496 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
12499 a_off
+= ivna
.vna_next
;
12501 while (ivna
.vna_other
!= data
[cnt
+ j
]
12502 && ivna
.vna_next
!= 0);
12504 if (ivna
.vna_other
== data
[cnt
+ j
])
12506 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
12508 if (ivna
.vna_name
>= string_sec
->sh_size
)
12511 name
= strtab
+ ivna
.vna_name
;
12515 offset
+= ivn
.vn_next
;
12517 while (ivn
.vn_next
);
12520 if (data
[cnt
+ j
] != 0x8001
12521 && filedata
->version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
12523 Elf_Internal_Verdef ivd
;
12524 Elf_External_Verdef evd
;
12525 unsigned long offset
;
12527 offset
= offset_from_vma
12529 filedata
->version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
12534 if (get_data (&evd
, filedata
, offset
, sizeof (evd
), 1,
12535 _("version def")) == NULL
)
12538 /* PR 17531: file: 046-1082287-0.004. */
12539 ivd
.vd_ndx
= (data
[cnt
+ j
] & VERSYM_VERSION
) + 1;
12544 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
12545 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
12548 offset
+= ivd
.vd_next
;
12550 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & VERSYM_VERSION
)
12551 && ivd
.vd_next
!= 0);
12553 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & VERSYM_VERSION
))
12555 Elf_External_Verdaux evda
;
12556 Elf_Internal_Verdaux ivda
;
12558 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
12560 if (get_data (&evda
, filedata
,
12561 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
12563 _("version def aux")) == NULL
)
12566 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
12568 if (ivda
.vda_name
>= string_sec
->sh_size
)
12570 else if (name
!= NULL
&& name
!= invalid
)
12571 name
= _("*both*");
12573 name
= strtab
+ ivda
.vda_name
;
12577 nn
+= printf ("(%s%-*s",
12579 12 - (int) strlen (name
),
12583 printf ("%*c", 18 - nn
, ' ');
12602 if (filedata
->is_separate
)
12603 printf (_("\nNo version information found in linked file '%s'.\n"),
12604 filedata
->file_name
);
12606 printf (_("\nNo version information found in this file.\n"));
12612 static const char *
12613 get_symbol_binding (Filedata
* filedata
, unsigned int binding
)
12615 static char buff
[64];
12619 case STB_LOCAL
: return "LOCAL";
12620 case STB_GLOBAL
: return "GLOBAL";
12621 case STB_WEAK
: return "WEAK";
12623 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
12624 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"),
12626 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
12628 if (binding
== STB_GNU_UNIQUE
12629 && filedata
->file_header
.e_ident
[EI_OSABI
] == ELFOSABI_GNU
)
12631 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), binding
);
12634 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), binding
);
12639 static const char *
12640 get_symbol_type (Filedata
* filedata
, unsigned int type
)
12642 static char buff
[64];
12646 case STT_NOTYPE
: return "NOTYPE";
12647 case STT_OBJECT
: return "OBJECT";
12648 case STT_FUNC
: return "FUNC";
12649 case STT_SECTION
: return "SECTION";
12650 case STT_FILE
: return "FILE";
12651 case STT_COMMON
: return "COMMON";
12652 case STT_TLS
: return "TLS";
12653 case STT_RELC
: return "RELC";
12654 case STT_SRELC
: return "SRELC";
12656 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
12658 if (filedata
->file_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
12659 return "THUMB_FUNC";
12661 if (filedata
->file_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
12664 if (filedata
->file_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
12665 return "PARISC_MILLI";
12667 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"), type
);
12669 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
12671 if (filedata
->file_header
.e_machine
== EM_PARISC
)
12673 if (type
== STT_HP_OPAQUE
)
12674 return "HP_OPAQUE";
12675 if (type
== STT_HP_STUB
)
12679 if (type
== STT_GNU_IFUNC
12680 && (filedata
->file_header
.e_ident
[EI_OSABI
] == ELFOSABI_GNU
12681 || filedata
->file_header
.e_ident
[EI_OSABI
] == ELFOSABI_FREEBSD
))
12684 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), type
);
12687 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), type
);
12692 static const char *
12693 get_symbol_visibility (unsigned int visibility
)
12695 switch (visibility
)
12697 case STV_DEFAULT
: return "DEFAULT";
12698 case STV_INTERNAL
: return "INTERNAL";
12699 case STV_HIDDEN
: return "HIDDEN";
12700 case STV_PROTECTED
: return "PROTECTED";
12702 error (_("Unrecognized visibility value: %u\n"), visibility
);
12703 return _("<unknown>");
12707 static const char *
12708 get_alpha_symbol_other (unsigned int other
)
12712 case STO_ALPHA_NOPV
: return "NOPV";
12713 case STO_ALPHA_STD_GPLOAD
: return "STD GPLOAD";
12715 error (_("Unrecognized alpha specific other value: %u\n"), other
);
12716 return _("<unknown>");
12720 static const char *
12721 get_solaris_symbol_visibility (unsigned int visibility
)
12723 switch (visibility
)
12725 case 4: return "EXPORTED";
12726 case 5: return "SINGLETON";
12727 case 6: return "ELIMINATE";
12728 default: return get_symbol_visibility (visibility
);
12732 static const char *
12733 get_aarch64_symbol_other (unsigned int other
)
12735 static char buf
[32];
12737 if (other
& STO_AARCH64_VARIANT_PCS
)
12739 other
&= ~STO_AARCH64_VARIANT_PCS
;
12741 return "VARIANT_PCS";
12742 snprintf (buf
, sizeof buf
, "VARIANT_PCS | %x", other
);
12748 static const char *
12749 get_mips_symbol_other (unsigned int other
)
12753 case STO_OPTIONAL
: return "OPTIONAL";
12754 case STO_MIPS_PLT
: return "MIPS PLT";
12755 case STO_MIPS_PIC
: return "MIPS PIC";
12756 case STO_MICROMIPS
: return "MICROMIPS";
12757 case STO_MICROMIPS
| STO_MIPS_PIC
: return "MICROMIPS, MIPS PIC";
12758 case STO_MIPS16
: return "MIPS16";
12759 default: return NULL
;
12763 static const char *
12764 get_ia64_symbol_other (Filedata
* filedata
, unsigned int other
)
12766 if (is_ia64_vms (filedata
))
12768 static char res
[32];
12772 /* Function types is for images and .STB files only. */
12773 switch (filedata
->file_header
.e_type
)
12777 switch (VMS_ST_FUNC_TYPE (other
))
12779 case VMS_SFT_CODE_ADDR
:
12780 strcat (res
, " CA");
12782 case VMS_SFT_SYMV_IDX
:
12783 strcat (res
, " VEC");
12786 strcat (res
, " FD");
12788 case VMS_SFT_RESERVE
:
12789 strcat (res
, " RSV");
12792 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
12793 VMS_ST_FUNC_TYPE (other
));
12794 strcat (res
, " <unknown>");
12801 switch (VMS_ST_LINKAGE (other
))
12803 case VMS_STL_IGNORE
:
12804 strcat (res
, " IGN");
12806 case VMS_STL_RESERVE
:
12807 strcat (res
, " RSV");
12810 strcat (res
, " STD");
12813 strcat (res
, " LNK");
12816 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
12817 VMS_ST_LINKAGE (other
));
12818 strcat (res
, " <unknown>");
12830 static const char *
12831 get_ppc64_symbol_other (unsigned int other
)
12833 if ((other
& ~STO_PPC64_LOCAL_MASK
) != 0)
12836 other
>>= STO_PPC64_LOCAL_BIT
;
12839 static char buf
[64];
12841 other
= ppc64_decode_local_entry (other
);
12842 snprintf (buf
, sizeof buf
, _("<localentry>: %d"), other
);
12848 static const char *
12849 get_riscv_symbol_other (unsigned int other
)
12851 static char buf
[32];
12854 if (other
& STO_RISCV_VARIANT_CC
)
12856 strcat (buf
, _(" VARIANT_CC"));
12857 other
&= ~STO_RISCV_VARIANT_CC
;
12861 snprintf (buf
, sizeof buf
, " %x", other
);
12870 static const char *
12871 get_symbol_other (Filedata
* filedata
, unsigned int other
)
12873 const char * result
= NULL
;
12874 static char buff
[64];
12879 switch (filedata
->file_header
.e_machine
)
12882 result
= get_alpha_symbol_other (other
);
12885 result
= get_aarch64_symbol_other (other
);
12888 result
= get_mips_symbol_other (other
);
12891 result
= get_ia64_symbol_other (filedata
, other
);
12894 result
= get_ppc64_symbol_other (other
);
12897 result
= get_riscv_symbol_other (other
);
12907 snprintf (buff
, sizeof buff
, _("<other>: %x"), other
);
12911 static const char *
12912 get_symbol_index_type (Filedata
* filedata
, unsigned int type
)
12914 static char buff
[32];
12918 case SHN_UNDEF
: return "UND";
12919 case SHN_ABS
: return "ABS";
12920 case SHN_COMMON
: return "COM";
12922 if (type
== SHN_IA_64_ANSI_COMMON
12923 && filedata
->file_header
.e_machine
== EM_IA_64
12924 && filedata
->file_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
12926 else if ((filedata
->file_header
.e_machine
== EM_X86_64
12927 || filedata
->file_header
.e_machine
== EM_L1OM
12928 || filedata
->file_header
.e_machine
== EM_K1OM
)
12929 && type
== SHN_X86_64_LCOMMON
)
12930 return "LARGE_COM";
12931 else if ((type
== SHN_MIPS_SCOMMON
12932 && filedata
->file_header
.e_machine
== EM_MIPS
)
12933 || (type
== SHN_TIC6X_SCOMMON
12934 && filedata
->file_header
.e_machine
== EM_TI_C6000
))
12936 else if (type
== SHN_MIPS_SUNDEFINED
12937 && filedata
->file_header
.e_machine
== EM_MIPS
)
12939 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
12940 sprintf (buff
, "PRC[0x%04x]", type
& 0xffff);
12941 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
12942 sprintf (buff
, "OS [0x%04x]", type
& 0xffff);
12943 else if (type
>= SHN_LORESERVE
)
12944 sprintf (buff
, "RSV[0x%04x]", type
& 0xffff);
12945 else if (filedata
->file_header
.e_shnum
!= 0
12946 && type
>= filedata
->file_header
.e_shnum
)
12947 sprintf (buff
, _("bad section index[%3d]"), type
);
12949 sprintf (buff
, "%3d", type
);
12956 static const char *
12957 get_symbol_version_string (Filedata
* filedata
,
12959 const char * strtab
,
12960 unsigned long int strtab_size
,
12962 Elf_Internal_Sym
* psym
,
12963 enum versioned_symbol_info
* sym_info
,
12964 unsigned short * vna_other
)
12966 unsigned char data
[2];
12967 unsigned short vers_data
;
12968 unsigned long offset
;
12969 unsigned short max_vd_ndx
;
12972 || filedata
->version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] == 0)
12975 offset
= offset_from_vma (filedata
,
12976 filedata
->version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
12977 sizeof data
+ si
* sizeof (vers_data
));
12979 if (get_data (&data
, filedata
, offset
+ si
* sizeof (vers_data
),
12980 sizeof (data
), 1, _("version data")) == NULL
)
12983 vers_data
= byte_get (data
, 2);
12985 if ((vers_data
& VERSYM_HIDDEN
) == 0 && vers_data
== 0)
12988 *sym_info
= (vers_data
& VERSYM_HIDDEN
) != 0 ? symbol_hidden
: symbol_public
;
12991 /* Usually we'd only see verdef for defined symbols, and verneed for
12992 undefined symbols. However, symbols defined by the linker in
12993 .dynbss for variables copied from a shared library in order to
12994 avoid text relocations are defined yet have verneed. We could
12995 use a heuristic to detect the special case, for example, check
12996 for verneed first on symbols defined in SHT_NOBITS sections, but
12997 it is simpler and more reliable to just look for both verdef and
12998 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
13000 if (psym
->st_shndx
!= SHN_UNDEF
13001 && vers_data
!= 0x8001
13002 && filedata
->version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
13004 Elf_Internal_Verdef ivd
;
13005 Elf_Internal_Verdaux ivda
;
13006 Elf_External_Verdaux evda
;
13009 off
= offset_from_vma (filedata
,
13010 filedata
->version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
13011 sizeof (Elf_External_Verdef
));
13015 Elf_External_Verdef evd
;
13017 if (get_data (&evd
, filedata
, off
, sizeof (evd
), 1,
13018 _("version def")) == NULL
)
13027 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
13028 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
13029 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
13030 ivd
.vd_flags
= BYTE_GET (evd
.vd_flags
);
13033 if ((ivd
.vd_ndx
& VERSYM_VERSION
) > max_vd_ndx
)
13034 max_vd_ndx
= ivd
.vd_ndx
& VERSYM_VERSION
;
13036 off
+= ivd
.vd_next
;
13038 while (ivd
.vd_ndx
!= (vers_data
& VERSYM_VERSION
) && ivd
.vd_next
!= 0);
13040 if (ivd
.vd_ndx
== (vers_data
& VERSYM_VERSION
))
13042 if (ivd
.vd_ndx
== 1 && ivd
.vd_flags
== VER_FLG_BASE
)
13045 off
-= ivd
.vd_next
;
13048 if (get_data (&evda
, filedata
, off
, sizeof (evda
), 1,
13049 _("version def aux")) != NULL
)
13051 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
13053 if (psym
->st_name
!= ivda
.vda_name
)
13054 return (ivda
.vda_name
< strtab_size
13055 ? strtab
+ ivda
.vda_name
: _("<corrupt>"));
13060 if (filedata
->version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
13062 Elf_External_Verneed evn
;
13063 Elf_Internal_Verneed ivn
;
13064 Elf_Internal_Vernaux ivna
;
13066 offset
= offset_from_vma (filedata
,
13067 filedata
->version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
13071 unsigned long vna_off
;
13073 if (get_data (&evn
, filedata
, offset
, sizeof (evn
), 1,
13074 _("version need")) == NULL
)
13077 ivna
.vna_other
= 0;
13082 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
13083 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
13085 vna_off
= offset
+ ivn
.vn_aux
;
13089 Elf_External_Vernaux evna
;
13091 if (get_data (&evna
, filedata
, vna_off
, sizeof (evna
), 1,
13092 _("version need aux (3)")) == NULL
)
13095 ivna
.vna_other
= 0;
13100 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
13101 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
13102 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
13105 vna_off
+= ivna
.vna_next
;
13107 while (ivna
.vna_other
!= vers_data
&& ivna
.vna_next
!= 0);
13109 if (ivna
.vna_other
== vers_data
)
13112 offset
+= ivn
.vn_next
;
13114 while (ivn
.vn_next
!= 0);
13116 if (ivna
.vna_other
== vers_data
)
13118 *sym_info
= symbol_undefined
;
13119 *vna_other
= ivna
.vna_other
;
13120 return (ivna
.vna_name
< strtab_size
13121 ? strtab
+ ivna
.vna_name
: _("<corrupt>"));
13123 else if ((max_vd_ndx
|| (vers_data
& VERSYM_VERSION
) != 1)
13124 && (vers_data
& VERSYM_VERSION
) > max_vd_ndx
)
13125 return _("<corrupt>");
13130 /* Display a symbol size on stdout. Format is based on --sym-base setting. */
13132 static unsigned int
13133 print_dynamic_symbol_size (bfd_vma vma
, int base
)
13138 return print_vma (vma
, OCTAL_5
);
13141 return print_vma (vma
, UNSIGNED_5
);
13144 return print_vma (vma
, PREFIX_HEX_5
);
13148 return print_vma (vma
, DEC_5
);
13153 print_dynamic_symbol (Filedata
*filedata
, unsigned long si
,
13154 Elf_Internal_Sym
*symtab
,
13155 Elf_Internal_Shdr
*section
,
13156 char *strtab
, size_t strtab_size
)
13158 const char *version_string
;
13159 enum versioned_symbol_info sym_info
;
13160 unsigned short vna_other
;
13163 Elf_Internal_Sym
*psym
= symtab
+ si
;
13165 printf ("%6ld: ", si
);
13166 print_vma (psym
->st_value
, LONG_HEX
);
13168 print_dynamic_symbol_size (psym
->st_size
, sym_base
);
13169 printf (" %-7s", get_symbol_type (filedata
, ELF_ST_TYPE (psym
->st_info
)));
13170 printf (" %-6s", get_symbol_binding (filedata
, ELF_ST_BIND (psym
->st_info
)));
13171 if (filedata
->file_header
.e_ident
[EI_OSABI
] == ELFOSABI_SOLARIS
)
13172 printf (" %-7s", get_solaris_symbol_visibility (psym
->st_other
));
13175 unsigned int vis
= ELF_ST_VISIBILITY (psym
->st_other
);
13177 printf (" %-7s", get_symbol_visibility (vis
));
13178 /* Check to see if any other bits in the st_other field are set.
13179 Note - displaying this information disrupts the layout of the
13180 table being generated, but for the moment this case is very rare. */
13181 if (psym
->st_other
^ vis
)
13182 printf (" [%s] ", get_symbol_other (filedata
, psym
->st_other
^ vis
));
13184 printf (" %4s ", get_symbol_index_type (filedata
, psym
->st_shndx
));
13186 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
13187 && psym
->st_shndx
< filedata
->file_header
.e_shnum
13188 && filedata
->section_headers
!= NULL
13189 && psym
->st_name
== 0)
13192 = section_name_valid (filedata
,
13193 filedata
->section_headers
+ psym
->st_shndx
);
13195 section_name_print (filedata
,
13196 filedata
->section_headers
+ psym
->st_shndx
)
13201 is_valid
= valid_symbol_name (strtab
, strtab_size
, psym
->st_name
);
13202 sstr
= is_valid
? strtab
+ psym
->st_name
: _("<corrupt>");
13206 = get_symbol_version_string (filedata
,
13208 || section
->sh_type
== SHT_DYNSYM
),
13209 strtab
, strtab_size
, si
,
13210 psym
, &sym_info
, &vna_other
);
13212 int len_avail
= 21;
13213 if (! do_wide
&& version_string
!= NULL
)
13217 len_avail
-= 1 + strlen (version_string
);
13219 if (sym_info
== symbol_undefined
)
13220 len_avail
-= sprintf (buffer
," (%d)", vna_other
);
13221 else if (sym_info
!= symbol_hidden
)
13225 print_symbol (len_avail
, sstr
);
13227 if (version_string
)
13229 if (sym_info
== symbol_undefined
)
13230 printf ("@%s (%d)", version_string
, vna_other
);
13232 printf (sym_info
== symbol_hidden
? "@%s" : "@@%s",
13238 if (ELF_ST_BIND (psym
->st_info
) == STB_LOCAL
13240 && si
>= section
->sh_info
13241 /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */
13242 && filedata
->file_header
.e_machine
!= EM_MIPS
13243 /* Solaris binaries have been found to violate this requirement as
13244 well. Not sure if this is a bug or an ABI requirement. */
13245 && filedata
->file_header
.e_ident
[EI_OSABI
] != ELFOSABI_SOLARIS
)
13246 warn (_("local symbol %lu found at index >= %s's sh_info value of %u\n"),
13247 si
, printable_section_name (filedata
, section
), section
->sh_info
);
13250 static const char *
13251 get_lto_kind (unsigned int kind
)
13255 case 0: return "DEF";
13256 case 1: return "WEAKDEF";
13257 case 2: return "UNDEF";
13258 case 3: return "WEAKUNDEF";
13259 case 4: return "COMMON";
13264 static char buffer
[30];
13265 error (_("Unknown LTO symbol definition encountered: %u\n"), kind
);
13266 sprintf (buffer
, "<unknown: %u>", kind
);
13270 static const char *
13271 get_lto_visibility (unsigned int visibility
)
13273 switch (visibility
)
13275 case 0: return "DEFAULT";
13276 case 1: return "PROTECTED";
13277 case 2: return "INTERNAL";
13278 case 3: return "HIDDEN";
13283 static char buffer
[30];
13284 error (_("Unknown LTO symbol visibility encountered: %u\n"), visibility
);
13285 sprintf (buffer
, "<unknown: %u>", visibility
);
13289 static const char *
13290 get_lto_sym_type (unsigned int sym_type
)
13294 case 0: return "UNKNOWN";
13295 case 1: return "FUNCTION";
13296 case 2: return "VARIABLE";
13301 static char buffer
[30];
13302 error (_("Unknown LTO symbol type encountered: %u\n"), sym_type
);
13303 sprintf (buffer
, "<unknown: %u>", sym_type
);
13307 /* Display an LTO format symbol table.
13308 FIXME: The format of LTO symbol tables is not formalized.
13309 So this code could need changing in the future. */
13312 display_lto_symtab (Filedata
* filedata
,
13313 Elf_Internal_Shdr
* section
)
13315 if (section
->sh_size
== 0)
13317 if (filedata
->is_separate
)
13318 printf (_("\nThe LTO Symbol table section '%s' in linked file '%s' is empty!\n"),
13319 printable_section_name (filedata
, section
),
13320 filedata
->file_name
);
13322 printf (_("\nLTO Symbol table '%s' is empty!\n"),
13323 printable_section_name (filedata
, section
));
13328 if (section
->sh_size
> filedata
->file_size
)
13330 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
13331 printable_section_name (filedata
, section
),
13332 (unsigned long) section
->sh_size
);
13336 void * alloced_data
= get_data (NULL
, filedata
, section
->sh_offset
,
13337 section
->sh_size
, 1, _("LTO symbols"));
13338 if (alloced_data
== NULL
)
13341 /* Look for extended data for the symbol table. */
13342 Elf_Internal_Shdr
* ext
;
13343 void * ext_data_orig
= NULL
;
13344 char * ext_data
= NULL
;
13345 char * ext_data_end
= NULL
;
13346 char * ext_name
= NULL
;
13348 if (asprintf (& ext_name
, ".gnu.lto_.ext_symtab.%s",
13349 (section_name (filedata
, section
)
13350 + sizeof (".gnu.lto_.symtab.") - 1)) > 0
13351 && ext_name
!= NULL
/* Paranoia. */
13352 && (ext
= find_section (filedata
, ext_name
)) != NULL
)
13354 if (ext
->sh_size
< 3)
13355 error (_("LTO Symbol extension table '%s' is empty!\n"),
13356 printable_section_name (filedata
, ext
));
13359 ext_data_orig
= ext_data
= get_data (NULL
, filedata
, ext
->sh_offset
,
13361 _("LTO ext symbol data"));
13362 if (ext_data
!= NULL
)
13364 ext_data_end
= ext_data
+ ext
->sh_size
;
13365 if (* ext_data
++ != 1)
13366 error (_("Unexpected version number in symbol extension table\n"));
13371 const unsigned char * data
= (const unsigned char *) alloced_data
;
13372 const unsigned char * end
= data
+ section
->sh_size
;
13374 if (filedata
->is_separate
)
13375 printf (_("\nIn linked file '%s': "), filedata
->file_name
);
13379 if (ext_data_orig
!= NULL
)
13382 printf (_("LTO Symbol table '%s' and extension table '%s' contain:\n"),
13383 printable_section_name (filedata
, section
),
13384 printable_section_name (filedata
, ext
));
13387 printf (_("LTO Symbol table '%s'\n"),
13388 printable_section_name (filedata
, section
));
13389 printf (_(" and extension table '%s' contain:\n"),
13390 printable_section_name (filedata
, ext
));
13394 printf (_("LTO Symbol table '%s' contains:\n"),
13395 printable_section_name (filedata
, section
));
13397 /* FIXME: Add a wide version. */
13398 if (ext_data_orig
!= NULL
)
13399 printf (_(" Comdat_Key Kind Visibility Size Slot Type Section Name\n"));
13401 printf (_(" Comdat_Key Kind Visibility Size Slot Name\n"));
13403 /* FIXME: We do not handle style prefixes. */
13407 const unsigned char * sym_name
= data
;
13408 data
+= strnlen ((const char *) sym_name
, end
- data
) + 1;
13412 const unsigned char * comdat_key
= data
;
13413 data
+= strnlen ((const char *) comdat_key
, end
- data
) + 1;
13417 if (data
+ 2 + 8 + 4 > end
)
13420 unsigned int kind
= *data
++;
13421 unsigned int visibility
= *data
++;
13423 elf_vma size
= byte_get (data
, 8);
13426 elf_vma slot
= byte_get (data
, 4);
13429 if (ext_data
!= NULL
)
13431 if (ext_data
< (ext_data_end
- 1))
13433 unsigned int sym_type
= * ext_data
++;
13434 unsigned int sec_kind
= * ext_data
++;
13436 printf (" %10s %10s %11s %08lx %08lx %9s %08lx _",
13437 * comdat_key
== 0 ? "-" : (char *) comdat_key
,
13438 get_lto_kind (kind
),
13439 get_lto_visibility (visibility
),
13442 get_lto_sym_type (sym_type
),
13444 print_symbol (6, (const char *) sym_name
);
13448 error (_("Ran out of LTO symbol extension data\n"));
13450 /* FIXME: return FAIL result ? */
13455 printf (" %10s %10s %11s %08lx %08lx _",
13456 * comdat_key
== 0 ? "-" : (char *) comdat_key
,
13457 get_lto_kind (kind
),
13458 get_lto_visibility (visibility
),
13461 print_symbol (21, (const char *) sym_name
);
13466 if (ext_data
!= NULL
&& ext_data
< ext_data_end
)
13468 error (_("Data remains in the LTO symbol extension table\n"));
13472 free (alloced_data
);
13473 free (ext_data_orig
);
13478 error (_("Buffer overrun encountered whilst decoding LTO symbol table\n"));
13479 free (alloced_data
);
13480 free (ext_data_orig
);
13485 /* Display LTO symbol tables. */
13488 process_lto_symbol_tables (Filedata
* filedata
)
13490 Elf_Internal_Shdr
* section
;
13497 if (filedata
->section_headers
== NULL
)
13500 for (i
= 0, section
= filedata
->section_headers
;
13501 i
< filedata
->file_header
.e_shnum
;
13503 if (section_name_valid (filedata
, section
)
13504 && startswith (section_name (filedata
, section
), ".gnu.lto_.symtab."))
13505 res
&= display_lto_symtab (filedata
, section
);
13510 /* Dump the symbol table. */
13513 process_symbol_table (Filedata
* filedata
)
13515 Elf_Internal_Shdr
* section
;
13517 if (!do_syms
&& !do_dyn_syms
&& !do_histogram
)
13520 if ((filedata
->dynamic_info
[DT_HASH
] || filedata
->dynamic_info_DT_GNU_HASH
)
13522 && do_using_dynamic
13523 && filedata
->dynamic_strings
!= NULL
13524 && filedata
->dynamic_symbols
!= NULL
)
13528 if (filedata
->is_separate
)
13530 printf (ngettext ("\nIn linked file '%s' the dynamic symbol table contains %lu entry:\n",
13531 "\nIn linked file '%s' the dynamic symbol table contains %lu entries:\n",
13532 filedata
->num_dynamic_syms
),
13533 filedata
->file_name
,
13534 filedata
->num_dynamic_syms
);
13538 printf (ngettext ("\nSymbol table for image contains %lu entry:\n",
13539 "\nSymbol table for image contains %lu entries:\n",
13540 filedata
->num_dynamic_syms
),
13541 filedata
->num_dynamic_syms
);
13544 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
13546 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
13548 for (si
= 0; si
< filedata
->num_dynamic_syms
; si
++)
13549 print_dynamic_symbol (filedata
, si
, filedata
->dynamic_symbols
, NULL
,
13550 filedata
->dynamic_strings
,
13551 filedata
->dynamic_strings_length
);
13553 else if ((do_dyn_syms
|| (do_syms
&& !do_using_dynamic
))
13554 && filedata
->section_headers
!= NULL
)
13558 for (i
= 0, section
= filedata
->section_headers
;
13559 i
< filedata
->file_header
.e_shnum
;
13562 char * strtab
= NULL
;
13563 unsigned long int strtab_size
= 0;
13564 Elf_Internal_Sym
* symtab
;
13565 unsigned long si
, num_syms
;
13567 if ((section
->sh_type
!= SHT_SYMTAB
13568 && section
->sh_type
!= SHT_DYNSYM
)
13570 && section
->sh_type
== SHT_SYMTAB
))
13573 if (section
->sh_entsize
== 0)
13575 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
13576 printable_section_name (filedata
, section
));
13580 num_syms
= section
->sh_size
/ section
->sh_entsize
;
13582 if (filedata
->is_separate
)
13583 printf (ngettext ("\nIn linked file '%s' symbol section '%s' contains %lu entry:\n",
13584 "\nIn linked file '%s' symbol section '%s' contains %lu entries:\n",
13586 filedata
->file_name
,
13587 printable_section_name (filedata
, section
),
13590 printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
13591 "\nSymbol table '%s' contains %lu entries:\n",
13593 printable_section_name (filedata
, section
),
13597 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
13599 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
13601 symtab
= get_elf_symbols (filedata
, section
, & num_syms
);
13602 if (symtab
== NULL
)
13605 if (section
->sh_link
== filedata
->file_header
.e_shstrndx
)
13607 strtab
= filedata
->string_table
;
13608 strtab_size
= filedata
->string_table_length
;
13610 else if (section
->sh_link
< filedata
->file_header
.e_shnum
)
13612 Elf_Internal_Shdr
* string_sec
;
13614 string_sec
= filedata
->section_headers
+ section
->sh_link
;
13616 strtab
= (char *) get_data (NULL
, filedata
, string_sec
->sh_offset
,
13617 1, string_sec
->sh_size
,
13618 _("string table"));
13619 strtab_size
= strtab
!= NULL
? string_sec
->sh_size
: 0;
13622 for (si
= 0; si
< num_syms
; si
++)
13623 print_dynamic_symbol (filedata
, si
, symtab
, section
,
13624 strtab
, strtab_size
);
13627 if (strtab
!= filedata
->string_table
)
13633 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
13635 if (do_histogram
&& filedata
->buckets
!= NULL
)
13637 unsigned long * lengths
;
13638 unsigned long * counts
;
13641 unsigned long maxlength
= 0;
13642 unsigned long nzero_counts
= 0;
13643 unsigned long nsyms
= 0;
13646 printf (ngettext ("\nHistogram for bucket list length "
13647 "(total of %lu bucket):\n",
13648 "\nHistogram for bucket list length "
13649 "(total of %lu buckets):\n",
13650 (unsigned long) filedata
->nbuckets
),
13651 (unsigned long) filedata
->nbuckets
);
13653 lengths
= (unsigned long *) calloc (filedata
->nbuckets
,
13654 sizeof (*lengths
));
13655 if (lengths
== NULL
)
13657 error (_("Out of memory allocating space for histogram buckets\n"));
13660 visited
= xcmalloc (filedata
->nchains
, 1);
13661 memset (visited
, 0, filedata
->nchains
);
13663 printf (_(" Length Number %% of total Coverage\n"));
13664 for (hn
= 0; hn
< filedata
->nbuckets
; ++hn
)
13666 for (si
= filedata
->buckets
[hn
]; si
> 0; si
= filedata
->chains
[si
])
13669 if (maxlength
< ++lengths
[hn
])
13671 if (si
>= filedata
->nchains
|| visited
[si
])
13673 error (_("histogram chain is corrupt\n"));
13681 counts
= (unsigned long *) calloc (maxlength
+ 1, sizeof (*counts
));
13682 if (counts
== NULL
)
13685 error (_("Out of memory allocating space for histogram counts\n"));
13689 for (hn
= 0; hn
< filedata
->nbuckets
; ++hn
)
13690 ++counts
[lengths
[hn
]];
13692 if (filedata
->nbuckets
> 0)
13695 printf (" 0 %-10lu (%5.1f%%)\n",
13696 counts
[0], (counts
[0] * 100.0) / filedata
->nbuckets
);
13697 for (i
= 1; i
<= maxlength
; ++i
)
13699 nzero_counts
+= counts
[i
] * i
;
13700 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
13701 i
, counts
[i
], (counts
[i
] * 100.0) / filedata
->nbuckets
,
13702 (nzero_counts
* 100.0) / nsyms
);
13710 free (filedata
->buckets
);
13711 filedata
->buckets
= NULL
;
13712 filedata
->nbuckets
= 0;
13713 free (filedata
->chains
);
13714 filedata
->chains
= NULL
;
13716 if (do_histogram
&& filedata
->gnubuckets
!= NULL
)
13718 unsigned long * lengths
;
13719 unsigned long * counts
;
13721 unsigned long maxlength
= 0;
13722 unsigned long nzero_counts
= 0;
13723 unsigned long nsyms
= 0;
13725 printf (ngettext ("\nHistogram for `%s' bucket list length "
13726 "(total of %lu bucket):\n",
13727 "\nHistogram for `%s' bucket list length "
13728 "(total of %lu buckets):\n",
13729 (unsigned long) filedata
->ngnubuckets
),
13730 GNU_HASH_SECTION_NAME (filedata
),
13731 (unsigned long) filedata
->ngnubuckets
);
13733 lengths
= (unsigned long *) calloc (filedata
->ngnubuckets
,
13734 sizeof (*lengths
));
13735 if (lengths
== NULL
)
13737 error (_("Out of memory allocating space for gnu histogram buckets\n"));
13741 printf (_(" Length Number %% of total Coverage\n"));
13743 for (hn
= 0; hn
< filedata
->ngnubuckets
; ++hn
)
13744 if (filedata
->gnubuckets
[hn
] != 0)
13746 bfd_vma off
, length
= 1;
13748 for (off
= filedata
->gnubuckets
[hn
] - filedata
->gnusymidx
;
13749 /* PR 17531 file: 010-77222-0.004. */
13750 off
< filedata
->ngnuchains
13751 && (filedata
->gnuchains
[off
] & 1) == 0;
13754 lengths
[hn
] = length
;
13755 if (length
> maxlength
)
13756 maxlength
= length
;
13760 counts
= (unsigned long *) calloc (maxlength
+ 1, sizeof (*counts
));
13761 if (counts
== NULL
)
13764 error (_("Out of memory allocating space for gnu histogram counts\n"));
13768 for (hn
= 0; hn
< filedata
->ngnubuckets
; ++hn
)
13769 ++counts
[lengths
[hn
]];
13771 if (filedata
->ngnubuckets
> 0)
13774 printf (" 0 %-10lu (%5.1f%%)\n",
13775 counts
[0], (counts
[0] * 100.0) / filedata
->ngnubuckets
);
13776 for (j
= 1; j
<= maxlength
; ++j
)
13778 nzero_counts
+= counts
[j
] * j
;
13779 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
13780 j
, counts
[j
], (counts
[j
] * 100.0) / filedata
->ngnubuckets
,
13781 (nzero_counts
* 100.0) / nsyms
);
13788 free (filedata
->gnubuckets
);
13789 filedata
->gnubuckets
= NULL
;
13790 filedata
->ngnubuckets
= 0;
13791 free (filedata
->gnuchains
);
13792 filedata
->gnuchains
= NULL
;
13793 filedata
->ngnuchains
= 0;
13794 free (filedata
->mipsxlat
);
13795 filedata
->mipsxlat
= NULL
;
13799 free (filedata
->gnubuckets
);
13800 filedata
->gnubuckets
= NULL
;
13801 filedata
->ngnubuckets
= 0;
13802 free (filedata
->gnuchains
);
13803 filedata
->gnuchains
= NULL
;
13804 filedata
->ngnuchains
= 0;
13805 free (filedata
->mipsxlat
);
13806 filedata
->mipsxlat
= NULL
;
13807 free (filedata
->buckets
);
13808 filedata
->buckets
= NULL
;
13809 filedata
->nbuckets
= 0;
13810 free (filedata
->chains
);
13811 filedata
->chains
= NULL
;
13816 process_syminfo (Filedata
* filedata
)
13820 if (filedata
->dynamic_syminfo
== NULL
13822 /* No syminfo, this is ok. */
13825 /* There better should be a dynamic symbol section. */
13826 if (filedata
->dynamic_symbols
== NULL
|| filedata
->dynamic_strings
== NULL
)
13829 if (filedata
->is_separate
)
13830 printf (ngettext ("\nIn linked file '%s: the dynamic info segment at offset 0x%lx contains %d entry:\n",
13831 "\nIn linked file '%s: the dynamic info segment at offset 0x%lx contains %d entries:\n",
13832 filedata
->dynamic_syminfo_nent
),
13833 filedata
->file_name
,
13834 filedata
->dynamic_syminfo_offset
,
13835 filedata
->dynamic_syminfo_nent
);
13837 printf (ngettext ("\nDynamic info segment at offset 0x%lx "
13838 "contains %d entry:\n",
13839 "\nDynamic info segment at offset 0x%lx "
13840 "contains %d entries:\n",
13841 filedata
->dynamic_syminfo_nent
),
13842 filedata
->dynamic_syminfo_offset
,
13843 filedata
->dynamic_syminfo_nent
);
13845 printf (_(" Num: Name BoundTo Flags\n"));
13846 for (i
= 0; i
< filedata
->dynamic_syminfo_nent
; ++i
)
13848 unsigned short int flags
= filedata
->dynamic_syminfo
[i
].si_flags
;
13850 printf ("%4d: ", i
);
13851 if (i
>= filedata
->num_dynamic_syms
)
13852 printf (_("<corrupt index>"));
13853 else if (valid_dynamic_name (filedata
, filedata
->dynamic_symbols
[i
].st_name
))
13854 print_symbol (30, get_dynamic_name (filedata
,
13855 filedata
->dynamic_symbols
[i
].st_name
));
13857 printf (_("<corrupt: %19ld>"), filedata
->dynamic_symbols
[i
].st_name
);
13860 switch (filedata
->dynamic_syminfo
[i
].si_boundto
)
13862 case SYMINFO_BT_SELF
:
13863 fputs ("SELF ", stdout
);
13865 case SYMINFO_BT_PARENT
:
13866 fputs ("PARENT ", stdout
);
13869 if (filedata
->dynamic_syminfo
[i
].si_boundto
> 0
13870 && filedata
->dynamic_syminfo
[i
].si_boundto
< filedata
->dynamic_nent
13871 && valid_dynamic_name (filedata
,
13872 filedata
->dynamic_section
[filedata
->dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
13874 print_symbol (10, get_dynamic_name (filedata
,
13875 filedata
->dynamic_section
[filedata
->dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
13879 printf ("%-10d ", filedata
->dynamic_syminfo
[i
].si_boundto
);
13883 if (flags
& SYMINFO_FLG_DIRECT
)
13884 printf (" DIRECT");
13885 if (flags
& SYMINFO_FLG_PASSTHRU
)
13886 printf (" PASSTHRU");
13887 if (flags
& SYMINFO_FLG_COPY
)
13889 if (flags
& SYMINFO_FLG_LAZYLOAD
)
13890 printf (" LAZYLOAD");
13898 /* A macro which evaluates to TRUE if the region ADDR .. ADDR + NELEM
13899 is contained by the region START .. END. The types of ADDR, START
13900 and END should all be the same. Note both ADDR + NELEM and END
13901 point to just beyond the end of the regions that are being tested. */
13902 #define IN_RANGE(START,END,ADDR,NELEM) \
13903 (((ADDR) >= (START)) && ((ADDR) < (END)) && ((ADDR) + (NELEM) <= (END)))
13905 /* Check to see if the given reloc needs to be handled in a target specific
13906 manner. If so then process the reloc and return TRUE otherwise return
13909 If called with reloc == NULL, then this is a signal that reloc processing
13910 for the current section has finished, and any saved state should be
13914 target_specific_reloc_handling (Filedata
* filedata
,
13915 Elf_Internal_Rela
* reloc
,
13916 unsigned char * start
,
13917 unsigned char * end
,
13918 Elf_Internal_Sym
* symtab
,
13919 unsigned long num_syms
)
13921 unsigned int reloc_type
= 0;
13922 unsigned long sym_index
= 0;
13926 reloc_type
= get_reloc_type (filedata
, reloc
->r_info
);
13927 sym_index
= get_reloc_symindex (reloc
->r_info
);
13930 switch (filedata
->file_header
.e_machine
)
13933 case EM_MSP430_OLD
:
13935 static Elf_Internal_Sym
* saved_sym
= NULL
;
13943 switch (reloc_type
)
13945 case 10: /* R_MSP430_SYM_DIFF */
13946 case 12: /* R_MSP430_GNU_SUB_ULEB128 */
13947 if (uses_msp430x_relocs (filedata
))
13949 /* Fall through. */
13950 case 21: /* R_MSP430X_SYM_DIFF */
13951 case 23: /* R_MSP430X_GNU_SUB_ULEB128 */
13953 if (sym_index
>= num_syms
)
13954 error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
13957 saved_sym
= symtab
+ sym_index
;
13960 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
13961 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
13962 goto handle_sym_diff
;
13964 case 5: /* R_MSP430_16_BYTE */
13965 case 9: /* R_MSP430_8 */
13966 case 11: /* R_MSP430_GNU_SET_ULEB128 */
13967 if (uses_msp430x_relocs (filedata
))
13969 goto handle_sym_diff
;
13971 case 2: /* R_MSP430_ABS16 */
13972 case 15: /* R_MSP430X_ABS16 */
13973 case 22: /* R_MSP430X_GNU_SET_ULEB128 */
13974 if (! uses_msp430x_relocs (filedata
))
13976 goto handle_sym_diff
;
13979 if (saved_sym
!= NULL
)
13982 unsigned int reloc_size
= 0;
13984 switch (reloc_type
)
13986 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
13989 case 11: /* R_MSP430_GNU_SET_ULEB128 */
13990 case 22: /* R_MSP430X_GNU_SET_ULEB128 */
13991 if (reloc
->r_offset
< (size_t) (end
- start
))
13992 read_leb128 (start
+ reloc
->r_offset
, end
, false,
13993 &reloc_size
, &leb_ret
);
14000 if (leb_ret
!= 0 || reloc_size
== 0 || reloc_size
> 8)
14001 error (_("MSP430 ULEB128 field at 0x%lx contains invalid "
14002 "ULEB128 value\n"),
14003 (long) reloc
->r_offset
);
14004 else if (sym_index
>= num_syms
)
14005 error (_("MSP430 reloc contains invalid symbol index %lu\n"),
14009 value
= reloc
->r_addend
+ (symtab
[sym_index
].st_value
14010 - saved_sym
->st_value
);
14012 if (IN_RANGE (start
, end
, start
+ reloc
->r_offset
, reloc_size
))
14013 byte_put (start
+ reloc
->r_offset
, value
, reloc_size
);
14016 error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
14017 (long) reloc
->r_offset
);
14026 if (saved_sym
!= NULL
)
14027 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
14034 case EM_CYGNUS_MN10300
:
14036 static Elf_Internal_Sym
* saved_sym
= NULL
;
14044 switch (reloc_type
)
14046 case 34: /* R_MN10300_ALIGN */
14048 case 33: /* R_MN10300_SYM_DIFF */
14049 if (sym_index
>= num_syms
)
14050 error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
14053 saved_sym
= symtab
+ sym_index
;
14056 case 1: /* R_MN10300_32 */
14057 case 2: /* R_MN10300_16 */
14058 if (saved_sym
!= NULL
)
14060 int reloc_size
= reloc_type
== 1 ? 4 : 2;
14063 if (sym_index
>= num_syms
)
14064 error (_("MN10300 reloc contains invalid symbol index %lu\n"),
14068 value
= reloc
->r_addend
+ (symtab
[sym_index
].st_value
14069 - saved_sym
->st_value
);
14071 if (IN_RANGE (start
, end
, start
+ reloc
->r_offset
, reloc_size
))
14072 byte_put (start
+ reloc
->r_offset
, value
, reloc_size
);
14074 error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
14075 (long) reloc
->r_offset
);
14083 if (saved_sym
!= NULL
)
14084 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
14092 static bfd_vma saved_sym1
= 0;
14093 static bfd_vma saved_sym2
= 0;
14094 static bfd_vma value
;
14098 saved_sym1
= saved_sym2
= 0;
14102 switch (reloc_type
)
14104 case 0x80: /* R_RL78_SYM. */
14105 saved_sym1
= saved_sym2
;
14106 if (sym_index
>= num_syms
)
14107 error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
14111 saved_sym2
= symtab
[sym_index
].st_value
;
14112 saved_sym2
+= reloc
->r_addend
;
14116 case 0x83: /* R_RL78_OPsub. */
14117 value
= saved_sym1
- saved_sym2
;
14118 saved_sym2
= saved_sym1
= 0;
14122 case 0x41: /* R_RL78_ABS32. */
14123 if (IN_RANGE (start
, end
, start
+ reloc
->r_offset
, 4))
14124 byte_put (start
+ reloc
->r_offset
, value
, 4);
14126 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
14127 (long) reloc
->r_offset
);
14131 case 0x43: /* R_RL78_ABS16. */
14132 if (IN_RANGE (start
, end
, start
+ reloc
->r_offset
, 2))
14133 byte_put (start
+ reloc
->r_offset
, value
, 2);
14135 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
14136 (long) reloc
->r_offset
);
14150 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
14151 DWARF debug sections. This is a target specific test. Note - we do not
14152 go through the whole including-target-headers-multiple-times route, (as
14153 we have already done with <elf/h8.h>) because this would become very
14154 messy and even then this function would have to contain target specific
14155 information (the names of the relocs instead of their numeric values).
14156 FIXME: This is not the correct way to solve this problem. The proper way
14157 is to have target specific reloc sizing and typing functions created by
14158 the reloc-macros.h header, in the same way that it already creates the
14159 reloc naming functions. */
14162 is_32bit_abs_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14164 /* Please keep this table alpha-sorted for ease of visual lookup. */
14165 switch (filedata
->file_header
.e_machine
)
14169 return reloc_type
== 1; /* R_386_32. */
14171 return reloc_type
== 1; /* R_68K_32. */
14173 return reloc_type
== 1; /* R_860_32. */
14175 return reloc_type
== 2; /* R_960_32. */
14177 return (reloc_type
== 258
14178 || reloc_type
== 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
14180 return reloc_type
== 11; /* R_BPF_DATA_32 */
14181 case EM_ADAPTEVA_EPIPHANY
:
14182 return reloc_type
== 3;
14184 return reloc_type
== 1; /* R_ALPHA_REFLONG. */
14186 return reloc_type
== 1; /* R_ARC_32. */
14187 case EM_ARC_COMPACT
:
14188 case EM_ARC_COMPACT2
:
14189 return reloc_type
== 4; /* R_ARC_32. */
14191 return reloc_type
== 2; /* R_ARM_ABS32 */
14194 return reloc_type
== 1;
14196 return reloc_type
== 0x12; /* R_byte4_data. */
14198 return reloc_type
== 3; /* R_CRIS_32. */
14200 return reloc_type
== 3; /* R_CR16_NUM32. */
14202 return reloc_type
== 15; /* R_CRX_NUM32. */
14204 return reloc_type
== 1; /* R_CKCORE_ADDR32. */
14205 case EM_CYGNUS_FRV
:
14206 return reloc_type
== 1;
14207 case EM_CYGNUS_D10V
:
14209 return reloc_type
== 6; /* R_D10V_32. */
14210 case EM_CYGNUS_D30V
:
14212 return reloc_type
== 12; /* R_D30V_32_NORMAL. */
14214 return reloc_type
== 3; /* R_DLX_RELOC_32. */
14215 case EM_CYGNUS_FR30
:
14217 return reloc_type
== 3; /* R_FR30_32. */
14219 return reloc_type
== 1; /* R_FT32_32. */
14223 return reloc_type
== 1; /* R_H8_DIR32. */
14225 return (reloc_type
== 0x64 /* R_IA64_SECREL32MSB. */
14226 || reloc_type
== 0x65 /* R_IA64_SECREL32LSB. */
14227 || reloc_type
== 0x24 /* R_IA64_DIR32MSB. */
14228 || reloc_type
== 0x25 /* R_IA64_DIR32LSB. */);
14231 return reloc_type
== 2; /* R_IP2K_32. */
14233 return reloc_type
== 2; /* R_IQ2000_32. */
14234 case EM_LATTICEMICO32
:
14235 return reloc_type
== 3; /* R_LM32_32. */
14237 return reloc_type
== 1; /* R_LARCH_32. */
14240 return reloc_type
== 3; /* R_M32C_32. */
14242 return reloc_type
== 34; /* R_M32R_32_RELA. */
14245 return reloc_type
== 6; /* R_M68HC11_32. */
14247 return reloc_type
== 7 || /* R_S12Z_EXT32 */
14248 reloc_type
== 6; /* R_S12Z_CW32. */
14250 return reloc_type
== 1; /* R_MCORE_ADDR32. */
14251 case EM_CYGNUS_MEP
:
14252 return reloc_type
== 4; /* R_MEP_32. */
14254 return reloc_type
== 2; /* R_METAG_ADDR32. */
14255 case EM_MICROBLAZE
:
14256 return reloc_type
== 1; /* R_MICROBLAZE_32. */
14258 return reloc_type
== 2; /* R_MIPS_32. */
14260 return reloc_type
== 4; /* R_MMIX_32. */
14261 case EM_CYGNUS_MN10200
:
14263 return reloc_type
== 1; /* R_MN10200_32. */
14264 case EM_CYGNUS_MN10300
:
14266 return reloc_type
== 1; /* R_MN10300_32. */
14268 return reloc_type
== 1; /* R_MOXIE_32. */
14269 case EM_MSP430_OLD
:
14271 return reloc_type
== 1; /* R_MSP430_32 or R_MSP320_ABS32. */
14273 return reloc_type
== 2; /* R_MT_32. */
14275 return reloc_type
== 20; /* R_NDS32_32_RELA. */
14276 case EM_ALTERA_NIOS2
:
14277 return reloc_type
== 12; /* R_NIOS2_BFD_RELOC_32. */
14279 return reloc_type
== 1; /* R_NIOS_32. */
14281 return reloc_type
== 1; /* R_OR1K_32. */
14283 return (reloc_type
== 1 /* R_PARISC_DIR32. */
14284 || reloc_type
== 2 /* R_PARISC_DIR21L. */
14285 || reloc_type
== 41); /* R_PARISC_SECREL32. */
14288 return reloc_type
== 1; /* R_PJ_DATA_DIR32. */
14290 return reloc_type
== 1; /* R_PPC64_ADDR32. */
14292 return reloc_type
== 1; /* R_PPC_ADDR32. */
14294 return reloc_type
== 11; /* R_PRU_BFD_RELOC_32. */
14296 return reloc_type
== 1; /* R_RISCV_32. */
14298 return reloc_type
== 1; /* R_RL78_DIR32. */
14300 return reloc_type
== 1; /* R_RX_DIR32. */
14302 return reloc_type
== 1; /* R_I370_ADDR31. */
14305 return reloc_type
== 4; /* R_S390_32. */
14307 return reloc_type
== 8; /* R_SCORE_ABS32. */
14309 return reloc_type
== 1; /* R_SH_DIR32. */
14310 case EM_SPARC32PLUS
:
14313 return reloc_type
== 3 /* R_SPARC_32. */
14314 || reloc_type
== 23; /* R_SPARC_UA32. */
14316 return reloc_type
== 6; /* R_SPU_ADDR32 */
14318 return reloc_type
== 1; /* R_C6000_ABS32. */
14320 return reloc_type
== 2; /* R_TILEGX_32. */
14322 return reloc_type
== 1; /* R_TILEPRO_32. */
14323 case EM_CYGNUS_V850
:
14325 return reloc_type
== 6; /* R_V850_ABS32. */
14327 return reloc_type
== 0x33; /* R_V810_WORD. */
14329 return reloc_type
== 1; /* R_VAX_32. */
14331 return reloc_type
== 3; /* R_VISIUM_32. */
14332 case EM_WEBASSEMBLY
:
14333 return reloc_type
== 1; /* R_WASM32_32. */
14337 return reloc_type
== 10; /* R_X86_64_32. */
14340 return reloc_type
== 3; /* R_XC16C_ABS_32. */
14342 return reloc_type
== 4; /* R_XGATE_32. */
14344 return reloc_type
== 1; /* R_XSTROMY16_32. */
14345 case EM_XTENSA_OLD
:
14347 return reloc_type
== 1; /* R_XTENSA_32. */
14349 return reloc_type
== 6; /* R_Z80_32. */
14352 static unsigned int prev_warn
= 0;
14354 /* Avoid repeating the same warning multiple times. */
14355 if (prev_warn
!= filedata
->file_header
.e_machine
)
14356 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
14357 filedata
->file_header
.e_machine
);
14358 prev_warn
= filedata
->file_header
.e_machine
;
14364 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14365 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
14368 is_32bit_pcrel_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14370 switch (filedata
->file_header
.e_machine
)
14371 /* Please keep this table alpha-sorted for ease of visual lookup. */
14375 return reloc_type
== 2; /* R_386_PC32. */
14377 return reloc_type
== 4; /* R_68K_PC32. */
14379 return reloc_type
== 261; /* R_AARCH64_PREL32 */
14380 case EM_ADAPTEVA_EPIPHANY
:
14381 return reloc_type
== 6;
14383 return reloc_type
== 10; /* R_ALPHA_SREL32. */
14384 case EM_ARC_COMPACT
:
14385 case EM_ARC_COMPACT2
:
14386 return reloc_type
== 49; /* R_ARC_32_PCREL. */
14388 return reloc_type
== 3; /* R_ARM_REL32 */
14391 return reloc_type
== 36; /* R_AVR_32_PCREL. */
14392 case EM_MICROBLAZE
:
14393 return reloc_type
== 2; /* R_MICROBLAZE_32_PCREL. */
14395 return reloc_type
== 9; /* R_OR1K_32_PCREL. */
14397 return reloc_type
== 9; /* R_PARISC_PCREL32. */
14399 return reloc_type
== 26; /* R_PPC_REL32. */
14401 return reloc_type
== 26; /* R_PPC64_REL32. */
14403 return reloc_type
== 57; /* R_RISCV_32_PCREL. */
14406 return reloc_type
== 5; /* R_390_PC32. */
14408 return reloc_type
== 2; /* R_SH_REL32. */
14409 case EM_SPARC32PLUS
:
14412 return reloc_type
== 6; /* R_SPARC_DISP32. */
14414 return reloc_type
== 13; /* R_SPU_REL32. */
14416 return reloc_type
== 6; /* R_TILEGX_32_PCREL. */
14418 return reloc_type
== 4; /* R_TILEPRO_32_PCREL. */
14420 return reloc_type
== 6; /* R_VISIUM_32_PCREL */
14424 return reloc_type
== 2; /* R_X86_64_PC32. */
14426 return reloc_type
== 4; /* R_VAX_PCREL32. */
14427 case EM_XTENSA_OLD
:
14429 return reloc_type
== 14; /* R_XTENSA_32_PCREL. */
14431 /* Do not abort or issue an error message here. Not all targets use
14432 pc-relative 32-bit relocs in their DWARF debug information and we
14433 have already tested for target coverage in is_32bit_abs_reloc. A
14434 more helpful warning message will be generated by apply_relocations
14435 anyway, so just return. */
14440 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14441 a 64-bit absolute RELA relocation used in DWARF debug sections. */
14444 is_64bit_abs_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14446 switch (filedata
->file_header
.e_machine
)
14449 return reloc_type
== 257; /* R_AARCH64_ABS64. */
14451 return reloc_type
== 2; /* R_ALPHA_REFQUAD. */
14453 return (reloc_type
== 0x26 /* R_IA64_DIR64MSB. */
14454 || reloc_type
== 0x27 /* R_IA64_DIR64LSB. */);
14456 return reloc_type
== 2; /* R_LARCH_64 */
14458 return reloc_type
== 80; /* R_PARISC_DIR64. */
14460 return reloc_type
== 38; /* R_PPC64_ADDR64. */
14462 return reloc_type
== 2; /* R_RISCV_64. */
14463 case EM_SPARC32PLUS
:
14466 return reloc_type
== 32 /* R_SPARC_64. */
14467 || reloc_type
== 54; /* R_SPARC_UA64. */
14471 return reloc_type
== 1; /* R_X86_64_64. */
14474 return reloc_type
== 22; /* R_S390_64. */
14476 return reloc_type
== 1; /* R_TILEGX_64. */
14478 return reloc_type
== 18; /* R_MIPS_64. */
14484 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
14485 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
14488 is_64bit_pcrel_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14490 switch (filedata
->file_header
.e_machine
)
14493 return reloc_type
== 260; /* R_AARCH64_PREL64. */
14495 return reloc_type
== 11; /* R_ALPHA_SREL64. */
14497 return (reloc_type
== 0x4e /* R_IA64_PCREL64MSB. */
14498 || reloc_type
== 0x4f /* R_IA64_PCREL64LSB. */);
14500 return reloc_type
== 72; /* R_PARISC_PCREL64. */
14502 return reloc_type
== 44; /* R_PPC64_REL64. */
14503 case EM_SPARC32PLUS
:
14506 return reloc_type
== 46; /* R_SPARC_DISP64. */
14510 return reloc_type
== 24; /* R_X86_64_PC64. */
14513 return reloc_type
== 23; /* R_S390_PC64. */
14515 return reloc_type
== 5; /* R_TILEGX_64_PCREL. */
14521 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14522 a 24-bit absolute RELA relocation used in DWARF debug sections. */
14525 is_24bit_abs_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14527 switch (filedata
->file_header
.e_machine
)
14529 case EM_CYGNUS_MN10200
:
14531 return reloc_type
== 4; /* R_MN10200_24. */
14533 return reloc_type
== 5; /* R_FT32_20. */
14535 return reloc_type
== 5; /* R_Z80_24. */
14541 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14542 a 16-bit absolute RELA relocation used in DWARF debug sections. */
14545 is_16bit_abs_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14547 /* Please keep this table alpha-sorted for ease of visual lookup. */
14548 switch (filedata
->file_header
.e_machine
)
14551 case EM_ARC_COMPACT
:
14552 case EM_ARC_COMPACT2
:
14553 return reloc_type
== 2; /* R_ARC_16. */
14554 case EM_ADAPTEVA_EPIPHANY
:
14555 return reloc_type
== 5;
14558 return reloc_type
== 4; /* R_AVR_16. */
14559 case EM_CYGNUS_D10V
:
14561 return reloc_type
== 3; /* R_D10V_16. */
14563 return reloc_type
== 2; /* R_FT32_16. */
14567 return reloc_type
== R_H8_DIR16
;
14570 return reloc_type
== 1; /* R_IP2K_16. */
14573 return reloc_type
== 1; /* R_M32C_16 */
14574 case EM_CYGNUS_MN10200
:
14576 return reloc_type
== 2; /* R_MN10200_16. */
14577 case EM_CYGNUS_MN10300
:
14579 return reloc_type
== 2; /* R_MN10300_16. */
14581 if (uses_msp430x_relocs (filedata
))
14582 return reloc_type
== 2; /* R_MSP430_ABS16. */
14583 /* Fall through. */
14584 case EM_MSP430_OLD
:
14585 return reloc_type
== 5; /* R_MSP430_16_BYTE. */
14587 return reloc_type
== 19; /* R_NDS32_16_RELA. */
14588 case EM_ALTERA_NIOS2
:
14589 return reloc_type
== 13; /* R_NIOS2_BFD_RELOC_16. */
14591 return reloc_type
== 9; /* R_NIOS_16. */
14593 return reloc_type
== 2; /* R_OR1K_16. */
14595 return reloc_type
== 55; /* R_RISCV_SET16. */
14597 return reloc_type
== 8; /* R_PRU_BFD_RELOC_16. */
14599 return reloc_type
== 2; /* R_C6000_ABS16. */
14601 return reloc_type
== 2; /* R_VISIUM_16. */
14604 return reloc_type
== 2; /* R_XC16C_ABS_16. */
14606 return reloc_type
== 3; /* R_XGATE_16. */
14608 return reloc_type
== 4; /* R_Z80_16. */
14614 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14615 a 8-bit absolute RELA relocation used in DWARF debug sections. */
14618 is_8bit_abs_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14620 switch (filedata
->file_header
.e_machine
)
14623 return reloc_type
== 54; /* R_RISCV_SET8. */
14625 return reloc_type
== 1; /* R_Z80_8. */
14631 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14632 a 6-bit absolute RELA relocation used in DWARF debug sections. */
14635 is_6bit_abs_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14637 switch (filedata
->file_header
.e_machine
)
14640 return reloc_type
== 53; /* R_RISCV_SET6. */
14646 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14647 a 32-bit inplace add RELA relocation used in DWARF debug sections. */
14650 is_32bit_inplace_add_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14652 /* Please keep this table alpha-sorted for ease of visual lookup. */
14653 switch (filedata
->file_header
.e_machine
)
14656 return reloc_type
== 35; /* R_RISCV_ADD32. */
14662 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14663 a 32-bit inplace sub RELA relocation used in DWARF debug sections. */
14666 is_32bit_inplace_sub_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14668 /* Please keep this table alpha-sorted for ease of visual lookup. */
14669 switch (filedata
->file_header
.e_machine
)
14672 return reloc_type
== 39; /* R_RISCV_SUB32. */
14678 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14679 a 64-bit inplace add RELA relocation used in DWARF debug sections. */
14682 is_64bit_inplace_add_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14684 /* Please keep this table alpha-sorted for ease of visual lookup. */
14685 switch (filedata
->file_header
.e_machine
)
14688 return reloc_type
== 36; /* R_RISCV_ADD64. */
14694 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14695 a 64-bit inplace sub RELA relocation used in DWARF debug sections. */
14698 is_64bit_inplace_sub_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14700 /* Please keep this table alpha-sorted for ease of visual lookup. */
14701 switch (filedata
->file_header
.e_machine
)
14704 return reloc_type
== 40; /* R_RISCV_SUB64. */
14710 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14711 a 16-bit inplace add RELA relocation used in DWARF debug sections. */
14714 is_16bit_inplace_add_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14716 /* Please keep this table alpha-sorted for ease of visual lookup. */
14717 switch (filedata
->file_header
.e_machine
)
14720 return reloc_type
== 34; /* R_RISCV_ADD16. */
14726 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14727 a 16-bit inplace sub RELA relocation used in DWARF debug sections. */
14730 is_16bit_inplace_sub_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14732 /* Please keep this table alpha-sorted for ease of visual lookup. */
14733 switch (filedata
->file_header
.e_machine
)
14736 return reloc_type
== 38; /* R_RISCV_SUB16. */
14742 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14743 a 8-bit inplace add RELA relocation used in DWARF debug sections. */
14746 is_8bit_inplace_add_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14748 /* Please keep this table alpha-sorted for ease of visual lookup. */
14749 switch (filedata
->file_header
.e_machine
)
14752 return reloc_type
== 33; /* R_RISCV_ADD8. */
14758 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14759 a 8-bit inplace sub RELA relocation used in DWARF debug sections. */
14762 is_8bit_inplace_sub_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14764 /* Please keep this table alpha-sorted for ease of visual lookup. */
14765 switch (filedata
->file_header
.e_machine
)
14768 return reloc_type
== 37; /* R_RISCV_SUB8. */
14774 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14775 a 6-bit inplace sub RELA relocation used in DWARF debug sections. */
14778 is_6bit_inplace_sub_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14780 switch (filedata
->file_header
.e_machine
)
14783 return reloc_type
== 52; /* R_RISCV_SUB6. */
14789 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
14790 relocation entries (possibly formerly used for SHT_GROUP sections). */
14793 is_none_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14795 switch (filedata
->file_header
.e_machine
)
14797 case EM_386
: /* R_386_NONE. */
14798 case EM_68K
: /* R_68K_NONE. */
14799 case EM_ADAPTEVA_EPIPHANY
:
14800 case EM_ALPHA
: /* R_ALPHA_NONE. */
14801 case EM_ALTERA_NIOS2
: /* R_NIOS2_NONE. */
14802 case EM_ARC
: /* R_ARC_NONE. */
14803 case EM_ARC_COMPACT2
: /* R_ARC_NONE. */
14804 case EM_ARC_COMPACT
: /* R_ARC_NONE. */
14805 case EM_ARM
: /* R_ARM_NONE. */
14806 case EM_C166
: /* R_XC16X_NONE. */
14807 case EM_CRIS
: /* R_CRIS_NONE. */
14808 case EM_FT32
: /* R_FT32_NONE. */
14809 case EM_IA_64
: /* R_IA64_NONE. */
14810 case EM_K1OM
: /* R_X86_64_NONE. */
14811 case EM_L1OM
: /* R_X86_64_NONE. */
14812 case EM_M32R
: /* R_M32R_NONE. */
14813 case EM_MIPS
: /* R_MIPS_NONE. */
14814 case EM_MN10300
: /* R_MN10300_NONE. */
14815 case EM_MOXIE
: /* R_MOXIE_NONE. */
14816 case EM_NIOS32
: /* R_NIOS_NONE. */
14817 case EM_OR1K
: /* R_OR1K_NONE. */
14818 case EM_PARISC
: /* R_PARISC_NONE. */
14819 case EM_PPC64
: /* R_PPC64_NONE. */
14820 case EM_PPC
: /* R_PPC_NONE. */
14821 case EM_RISCV
: /* R_RISCV_NONE. */
14822 case EM_S390
: /* R_390_NONE. */
14824 case EM_SH
: /* R_SH_NONE. */
14825 case EM_SPARC32PLUS
:
14826 case EM_SPARC
: /* R_SPARC_NONE. */
14828 case EM_TILEGX
: /* R_TILEGX_NONE. */
14829 case EM_TILEPRO
: /* R_TILEPRO_NONE. */
14830 case EM_TI_C6000
:/* R_C6000_NONE. */
14831 case EM_X86_64
: /* R_X86_64_NONE. */
14833 case EM_Z80
: /* R_Z80_NONE. */
14834 case EM_WEBASSEMBLY
: /* R_WASM32_NONE. */
14835 return reloc_type
== 0;
14838 return reloc_type
== 0 || reloc_type
== 256;
14841 return (reloc_type
== 0 /* R_AVR_NONE. */
14842 || reloc_type
== 30 /* R_AVR_DIFF8. */
14843 || reloc_type
== 31 /* R_AVR_DIFF16. */
14844 || reloc_type
== 32 /* R_AVR_DIFF32. */);
14846 return reloc_type
== 3; /* R_METAG_NONE. */
14848 return (reloc_type
== 0 /* R_NDS32_NONE. */
14849 || reloc_type
== 205 /* R_NDS32_DIFF8. */
14850 || reloc_type
== 206 /* R_NDS32_DIFF16. */
14851 || reloc_type
== 207 /* R_NDS32_DIFF32. */
14852 || reloc_type
== 208 /* R_NDS32_DIFF_ULEB128. */);
14854 return (reloc_type
== 0 /* R_PRU_NONE. */
14855 || reloc_type
== 65 /* R_PRU_DIFF8. */
14856 || reloc_type
== 66 /* R_PRU_DIFF16. */
14857 || reloc_type
== 67 /* R_PRU_DIFF32. */);
14858 case EM_XTENSA_OLD
:
14860 return (reloc_type
== 0 /* R_XTENSA_NONE. */
14861 || reloc_type
== 17 /* R_XTENSA_DIFF8. */
14862 || reloc_type
== 18 /* R_XTENSA_DIFF16. */
14863 || reloc_type
== 19 /* R_XTENSA_DIFF32. */
14864 || reloc_type
== 57 /* R_XTENSA_PDIFF8. */
14865 || reloc_type
== 58 /* R_XTENSA_PDIFF16. */
14866 || reloc_type
== 59 /* R_XTENSA_PDIFF32. */
14867 || reloc_type
== 60 /* R_XTENSA_NDIFF8. */
14868 || reloc_type
== 61 /* R_XTENSA_NDIFF16. */
14869 || reloc_type
== 62 /* R_XTENSA_NDIFF32. */);
14874 /* Returns TRUE if there is a relocation against
14875 section NAME at OFFSET bytes. */
14878 reloc_at (struct dwarf_section
* dsec
, dwarf_vma offset
)
14880 Elf_Internal_Rela
* relocs
;
14881 Elf_Internal_Rela
* rp
;
14883 if (dsec
== NULL
|| dsec
->reloc_info
== NULL
)
14886 relocs
= (Elf_Internal_Rela
*) dsec
->reloc_info
;
14888 for (rp
= relocs
; rp
< relocs
+ dsec
->num_relocs
; ++rp
)
14889 if (rp
->r_offset
== offset
)
14895 /* Apply relocations to a section.
14896 Returns TRUE upon success, FALSE otherwise.
14897 If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
14898 It is then the caller's responsibility to free them. NUM_RELOCS_RETURN
14899 will be set to the number of relocs loaded.
14901 Note: So far support has been added only for those relocations
14902 which can be found in debug sections. FIXME: Add support for
14903 more relocations ? */
14906 apply_relocations (Filedata
* filedata
,
14907 const Elf_Internal_Shdr
* section
,
14908 unsigned char * start
,
14909 bfd_size_type size
,
14910 void ** relocs_return
,
14911 unsigned long * num_relocs_return
)
14913 Elf_Internal_Shdr
* relsec
;
14914 unsigned char * end
= start
+ size
;
14916 if (relocs_return
!= NULL
)
14918 * (Elf_Internal_Rela
**) relocs_return
= NULL
;
14919 * num_relocs_return
= 0;
14922 if (filedata
->file_header
.e_type
!= ET_REL
)
14923 /* No relocs to apply. */
14926 /* Find the reloc section associated with the section. */
14927 for (relsec
= filedata
->section_headers
;
14928 relsec
< filedata
->section_headers
+ filedata
->file_header
.e_shnum
;
14932 unsigned long num_relocs
;
14933 Elf_Internal_Rela
* relocs
;
14934 Elf_Internal_Rela
* rp
;
14935 Elf_Internal_Shdr
* symsec
;
14936 Elf_Internal_Sym
* symtab
;
14937 unsigned long num_syms
;
14938 Elf_Internal_Sym
* sym
;
14940 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
14941 || relsec
->sh_info
>= filedata
->file_header
.e_shnum
14942 || filedata
->section_headers
+ relsec
->sh_info
!= section
14943 || relsec
->sh_size
== 0
14944 || relsec
->sh_link
>= filedata
->file_header
.e_shnum
)
14947 symsec
= filedata
->section_headers
+ relsec
->sh_link
;
14948 if (symsec
->sh_type
!= SHT_SYMTAB
14949 && symsec
->sh_type
!= SHT_DYNSYM
)
14952 is_rela
= relsec
->sh_type
== SHT_RELA
;
14956 if (!slurp_rela_relocs (filedata
, relsec
->sh_offset
,
14957 relsec
->sh_size
, & relocs
, & num_relocs
))
14962 if (!slurp_rel_relocs (filedata
, relsec
->sh_offset
,
14963 relsec
->sh_size
, & relocs
, & num_relocs
))
14967 /* SH uses RELA but uses in place value instead of the addend field. */
14968 if (filedata
->file_header
.e_machine
== EM_SH
)
14971 symtab
= get_elf_symbols (filedata
, symsec
, & num_syms
);
14973 for (rp
= relocs
; rp
< relocs
+ num_relocs
; ++rp
)
14976 unsigned int reloc_type
;
14977 unsigned int reloc_size
;
14978 bool reloc_inplace
= false;
14979 bool reloc_subtract
= false;
14980 unsigned char *rloc
;
14981 unsigned long sym_index
;
14983 reloc_type
= get_reloc_type (filedata
, rp
->r_info
);
14985 if (target_specific_reloc_handling (filedata
, rp
, start
, end
, symtab
, num_syms
))
14987 else if (is_none_reloc (filedata
, reloc_type
))
14989 else if (is_32bit_abs_reloc (filedata
, reloc_type
)
14990 || is_32bit_pcrel_reloc (filedata
, reloc_type
))
14992 else if (is_64bit_abs_reloc (filedata
, reloc_type
)
14993 || is_64bit_pcrel_reloc (filedata
, reloc_type
))
14995 else if (is_24bit_abs_reloc (filedata
, reloc_type
))
14997 else if (is_16bit_abs_reloc (filedata
, reloc_type
))
14999 else if (is_8bit_abs_reloc (filedata
, reloc_type
)
15000 || is_6bit_abs_reloc (filedata
, reloc_type
))
15002 else if ((reloc_subtract
= is_32bit_inplace_sub_reloc (filedata
,
15004 || is_32bit_inplace_add_reloc (filedata
, reloc_type
))
15007 reloc_inplace
= true;
15009 else if ((reloc_subtract
= is_64bit_inplace_sub_reloc (filedata
,
15011 || is_64bit_inplace_add_reloc (filedata
, reloc_type
))
15014 reloc_inplace
= true;
15016 else if ((reloc_subtract
= is_16bit_inplace_sub_reloc (filedata
,
15018 || is_16bit_inplace_add_reloc (filedata
, reloc_type
))
15021 reloc_inplace
= true;
15023 else if ((reloc_subtract
= is_8bit_inplace_sub_reloc (filedata
,
15025 || is_8bit_inplace_add_reloc (filedata
, reloc_type
))
15028 reloc_inplace
= true;
15030 else if ((reloc_subtract
= is_6bit_inplace_sub_reloc (filedata
,
15034 reloc_inplace
= true;
15038 static unsigned int prev_reloc
= 0;
15040 if (reloc_type
!= prev_reloc
)
15041 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
15042 reloc_type
, printable_section_name (filedata
, section
));
15043 prev_reloc
= reloc_type
;
15047 rloc
= start
+ rp
->r_offset
;
15048 if (!IN_RANGE (start
, end
, rloc
, reloc_size
))
15050 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
15051 (unsigned long) rp
->r_offset
,
15052 printable_section_name (filedata
, section
));
15056 sym_index
= (unsigned long) get_reloc_symindex (rp
->r_info
);
15057 if (sym_index
>= num_syms
)
15059 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
15060 sym_index
, printable_section_name (filedata
, section
));
15063 sym
= symtab
+ sym_index
;
15065 /* If the reloc has a symbol associated with it,
15066 make sure that it is of an appropriate type.
15068 Relocations against symbols without type can happen.
15069 Gcc -feliminate-dwarf2-dups may generate symbols
15070 without type for debug info.
15072 Icc generates relocations against function symbols
15073 instead of local labels.
15075 Relocations against object symbols can happen, eg when
15076 referencing a global array. For an example of this see
15077 the _clz.o binary in libgcc.a. */
15079 && ELF_ST_TYPE (sym
->st_info
) != STT_COMMON
15080 && ELF_ST_TYPE (sym
->st_info
) > STT_SECTION
)
15082 warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
15083 get_symbol_type (filedata
, ELF_ST_TYPE (sym
->st_info
)),
15084 printable_section_name (filedata
, relsec
),
15085 (long int)(rp
- relocs
));
15091 addend
+= rp
->r_addend
;
15092 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
15093 partial_inplace. */
15095 || (filedata
->file_header
.e_machine
== EM_XTENSA
15096 && reloc_type
== 1)
15097 || ((filedata
->file_header
.e_machine
== EM_PJ
15098 || filedata
->file_header
.e_machine
== EM_PJ_OLD
)
15099 && reloc_type
== 1)
15100 || ((filedata
->file_header
.e_machine
== EM_D30V
15101 || filedata
->file_header
.e_machine
== EM_CYGNUS_D30V
)
15102 && reloc_type
== 12)
15105 if (is_6bit_inplace_sub_reloc (filedata
, reloc_type
))
15106 addend
+= byte_get (rloc
, reloc_size
) & 0x3f;
15108 addend
+= byte_get (rloc
, reloc_size
);
15111 if (is_32bit_pcrel_reloc (filedata
, reloc_type
)
15112 || is_64bit_pcrel_reloc (filedata
, reloc_type
))
15114 /* On HPPA, all pc-relative relocations are biased by 8. */
15115 if (filedata
->file_header
.e_machine
== EM_PARISC
)
15117 byte_put (rloc
, (addend
+ sym
->st_value
) - rp
->r_offset
,
15120 else if (is_6bit_abs_reloc (filedata
, reloc_type
)
15121 || is_6bit_inplace_sub_reloc (filedata
, reloc_type
))
15123 if (reloc_subtract
)
15124 addend
-= sym
->st_value
;
15126 addend
+= sym
->st_value
;
15127 addend
= (addend
& 0x3f) | (byte_get (rloc
, reloc_size
) & 0xc0);
15128 byte_put (rloc
, addend
, reloc_size
);
15130 else if (reloc_subtract
)
15131 byte_put (rloc
, addend
- sym
->st_value
, reloc_size
);
15133 byte_put (rloc
, addend
+ sym
->st_value
, reloc_size
);
15137 /* Let the target specific reloc processing code know that
15138 we have finished with these relocs. */
15139 target_specific_reloc_handling (filedata
, NULL
, NULL
, NULL
, NULL
, 0);
15143 * (Elf_Internal_Rela
**) relocs_return
= relocs
;
15144 * num_relocs_return
= num_relocs
;
15155 #ifdef SUPPORT_DISASSEMBLY
15157 disassemble_section (Elf_Internal_Shdr
* section
, Filedata
* filedata
)
15159 printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata
, section
));
15161 /* FIXME: XXX -- to be done --- XXX */
15167 /* Reads in the contents of SECTION from FILE, returning a pointer
15168 to a malloc'ed buffer or NULL if something went wrong. */
15171 get_section_contents (Elf_Internal_Shdr
* section
, Filedata
* filedata
)
15173 bfd_size_type num_bytes
= section
->sh_size
;
15175 if (num_bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
15177 printf (_("Section '%s' has no data to dump.\n"),
15178 printable_section_name (filedata
, section
));
15182 return (char *) get_data (NULL
, filedata
, section
->sh_offset
, 1, num_bytes
,
15183 _("section contents"));
15186 /* Uncompresses a section that was compressed using zlib, in place. */
15189 uncompress_section_contents (unsigned char ** buffer
,
15190 dwarf_size_type uncompressed_size
,
15191 dwarf_size_type
* size
)
15193 dwarf_size_type compressed_size
= *size
;
15194 unsigned char * compressed_buffer
= *buffer
;
15195 unsigned char * uncompressed_buffer
;
15199 /* It is possible the section consists of several compressed
15200 buffers concatenated together, so we uncompress in a loop. */
15201 /* PR 18313: The state field in the z_stream structure is supposed
15202 to be invisible to the user (ie us), but some compilers will
15203 still complain about it being used without initialisation. So
15204 we first zero the entire z_stream structure and then set the fields
15206 memset (& strm
, 0, sizeof strm
);
15207 strm
.avail_in
= compressed_size
;
15208 strm
.next_in
= (Bytef
*) compressed_buffer
;
15209 strm
.avail_out
= uncompressed_size
;
15210 uncompressed_buffer
= (unsigned char *) xmalloc (uncompressed_size
);
15212 rc
= inflateInit (& strm
);
15213 while (strm
.avail_in
> 0)
15217 strm
.next_out
= ((Bytef
*) uncompressed_buffer
15218 + (uncompressed_size
- strm
.avail_out
));
15219 rc
= inflate (&strm
, Z_FINISH
);
15220 if (rc
!= Z_STREAM_END
)
15222 rc
= inflateReset (& strm
);
15224 if (inflateEnd (& strm
) != Z_OK
15226 || strm
.avail_out
!= 0)
15229 *buffer
= uncompressed_buffer
;
15230 *size
= uncompressed_size
;
15234 free (uncompressed_buffer
);
15235 /* Indicate decompression failure. */
15241 dump_section_as_strings (Elf_Internal_Shdr
* section
, Filedata
* filedata
)
15243 Elf_Internal_Shdr
*relsec
;
15244 bfd_size_type num_bytes
;
15245 unsigned char *data
;
15246 unsigned char *end
;
15247 unsigned char *real_start
;
15248 unsigned char *start
;
15249 bool some_strings_shown
;
15251 real_start
= start
= (unsigned char *) get_section_contents (section
, filedata
);
15253 /* PR 21820: Do not fail if the section was empty. */
15254 return section
->sh_size
== 0 || section
->sh_type
== SHT_NOBITS
;
15256 num_bytes
= section
->sh_size
;
15258 if (filedata
->is_separate
)
15259 printf (_("\nString dump of section '%s' in linked file %s:\n"),
15260 printable_section_name (filedata
, section
),
15261 filedata
->file_name
);
15263 printf (_("\nString dump of section '%s':\n"),
15264 printable_section_name (filedata
, section
));
15266 if (decompress_dumps
)
15268 dwarf_size_type new_size
= num_bytes
;
15269 dwarf_size_type uncompressed_size
= 0;
15271 if ((section
->sh_flags
& SHF_COMPRESSED
) != 0)
15273 Elf_Internal_Chdr chdr
;
15274 unsigned int compression_header_size
15275 = get_compression_header (& chdr
, (unsigned char *) start
,
15277 if (compression_header_size
== 0)
15278 /* An error message will have already been generated
15279 by get_compression_header. */
15282 if (chdr
.ch_type
!= ELFCOMPRESS_ZLIB
)
15284 warn (_("section '%s' has unsupported compress type: %d\n"),
15285 printable_section_name (filedata
, section
), chdr
.ch_type
);
15288 uncompressed_size
= chdr
.ch_size
;
15289 start
+= compression_header_size
;
15290 new_size
-= compression_header_size
;
15292 else if (new_size
> 12 && streq ((char *) start
, "ZLIB"))
15294 /* Read the zlib header. In this case, it should be "ZLIB"
15295 followed by the uncompressed section size, 8 bytes in
15296 big-endian order. */
15297 uncompressed_size
= start
[4]; uncompressed_size
<<= 8;
15298 uncompressed_size
+= start
[5]; uncompressed_size
<<= 8;
15299 uncompressed_size
+= start
[6]; uncompressed_size
<<= 8;
15300 uncompressed_size
+= start
[7]; uncompressed_size
<<= 8;
15301 uncompressed_size
+= start
[8]; uncompressed_size
<<= 8;
15302 uncompressed_size
+= start
[9]; uncompressed_size
<<= 8;
15303 uncompressed_size
+= start
[10]; uncompressed_size
<<= 8;
15304 uncompressed_size
+= start
[11];
15309 if (uncompressed_size
)
15311 if (uncompress_section_contents (& start
,
15312 uncompressed_size
, & new_size
))
15313 num_bytes
= new_size
;
15316 error (_("Unable to decompress section %s\n"),
15317 printable_section_name (filedata
, section
));
15322 start
= real_start
;
15325 /* If the section being dumped has relocations against it the user might
15326 be expecting these relocations to have been applied. Check for this
15327 case and issue a warning message in order to avoid confusion.
15328 FIXME: Maybe we ought to have an option that dumps a section with
15329 relocs applied ? */
15330 for (relsec
= filedata
->section_headers
;
15331 relsec
< filedata
->section_headers
+ filedata
->file_header
.e_shnum
;
15334 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
15335 || relsec
->sh_info
>= filedata
->file_header
.e_shnum
15336 || filedata
->section_headers
+ relsec
->sh_info
!= section
15337 || relsec
->sh_size
== 0
15338 || relsec
->sh_link
>= filedata
->file_header
.e_shnum
)
15341 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
15346 end
= start
+ num_bytes
;
15347 some_strings_shown
= false;
15349 #ifdef HAVE_MBSTATE_T
15351 /* Initialise the multibyte conversion state. */
15352 memset (& state
, 0, sizeof (state
));
15355 bool continuing
= false;
15359 while (!ISPRINT (* data
))
15360 if (++ data
>= end
)
15365 size_t maxlen
= end
- data
;
15370 continuing
= false;
15374 printf (" [%6lx] ", (unsigned long) (data
- start
));
15388 /* PR 25543: Treat new-lines as string-ending characters. */
15397 /* Do not print control characters directly as they can affect terminal
15398 settings. Such characters usually appear in the names generated
15399 by the assembler for local labels. */
15402 printf ("^%c", c
+ 0x40);
15404 else if (ISPRINT (c
))
15411 #ifdef HAVE_MBSTATE_T
15414 /* Let printf do the hard work of displaying multibyte characters. */
15415 printf ("%.1s", data
- 1);
15416 #ifdef HAVE_MBSTATE_T
15417 /* Try to find out how many bytes made up the character that was
15418 just printed. Advance the symbol pointer past the bytes that
15420 n
= mbrtowc (& w
, (char *)(data
- 1), MB_CUR_MAX
, & state
);
15424 if (n
!= (size_t) -1 && n
!= (size_t) -2 && n
> 0)
15434 printf (_("<corrupt>\n"));
15437 some_strings_shown
= true;
15441 if (! some_strings_shown
)
15442 printf (_(" No strings found in this section."));
15455 dump_section_as_bytes (Elf_Internal_Shdr
*section
,
15456 Filedata
*filedata
,
15459 Elf_Internal_Shdr
* relsec
;
15460 bfd_size_type bytes
;
15461 bfd_size_type section_size
;
15463 unsigned char * data
;
15464 unsigned char * real_start
;
15465 unsigned char * start
;
15467 real_start
= start
= (unsigned char *) get_section_contents (section
, filedata
);
15469 /* PR 21820: Do not fail if the section was empty. */
15470 return section
->sh_size
== 0 || section
->sh_type
== SHT_NOBITS
;
15472 section_size
= section
->sh_size
;
15474 if (filedata
->is_separate
)
15475 printf (_("\nHex dump of section '%s' in linked file %s:\n"),
15476 printable_section_name (filedata
, section
),
15477 filedata
->file_name
);
15479 printf (_("\nHex dump of section '%s':\n"),
15480 printable_section_name (filedata
, section
));
15482 if (decompress_dumps
)
15484 dwarf_size_type new_size
= section_size
;
15485 dwarf_size_type uncompressed_size
= 0;
15487 if ((section
->sh_flags
& SHF_COMPRESSED
) != 0)
15489 Elf_Internal_Chdr chdr
;
15490 unsigned int compression_header_size
15491 = get_compression_header (& chdr
, start
, section_size
);
15493 if (compression_header_size
== 0)
15494 /* An error message will have already been generated
15495 by get_compression_header. */
15498 if (chdr
.ch_type
!= ELFCOMPRESS_ZLIB
)
15500 warn (_("section '%s' has unsupported compress type: %d\n"),
15501 printable_section_name (filedata
, section
), chdr
.ch_type
);
15504 uncompressed_size
= chdr
.ch_size
;
15505 start
+= compression_header_size
;
15506 new_size
-= compression_header_size
;
15508 else if (new_size
> 12 && streq ((char *) start
, "ZLIB"))
15510 /* Read the zlib header. In this case, it should be "ZLIB"
15511 followed by the uncompressed section size, 8 bytes in
15512 big-endian order. */
15513 uncompressed_size
= start
[4]; uncompressed_size
<<= 8;
15514 uncompressed_size
+= start
[5]; uncompressed_size
<<= 8;
15515 uncompressed_size
+= start
[6]; uncompressed_size
<<= 8;
15516 uncompressed_size
+= start
[7]; uncompressed_size
<<= 8;
15517 uncompressed_size
+= start
[8]; uncompressed_size
<<= 8;
15518 uncompressed_size
+= start
[9]; uncompressed_size
<<= 8;
15519 uncompressed_size
+= start
[10]; uncompressed_size
<<= 8;
15520 uncompressed_size
+= start
[11];
15525 if (uncompressed_size
)
15527 if (uncompress_section_contents (& start
, uncompressed_size
,
15530 section_size
= new_size
;
15534 error (_("Unable to decompress section %s\n"),
15535 printable_section_name (filedata
, section
));
15536 /* FIXME: Print the section anyway ? */
15541 start
= real_start
;
15546 if (! apply_relocations (filedata
, section
, start
, section_size
, NULL
, NULL
))
15551 /* If the section being dumped has relocations against it the user might
15552 be expecting these relocations to have been applied. Check for this
15553 case and issue a warning message in order to avoid confusion.
15554 FIXME: Maybe we ought to have an option that dumps a section with
15555 relocs applied ? */
15556 for (relsec
= filedata
->section_headers
;
15557 relsec
< filedata
->section_headers
+ filedata
->file_header
.e_shnum
;
15560 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
15561 || relsec
->sh_info
>= filedata
->file_header
.e_shnum
15562 || filedata
->section_headers
+ relsec
->sh_info
!= section
15563 || relsec
->sh_size
== 0
15564 || relsec
->sh_link
>= filedata
->file_header
.e_shnum
)
15567 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
15572 addr
= section
->sh_addr
;
15573 bytes
= section_size
;
15582 lbytes
= (bytes
> 16 ? 16 : bytes
);
15584 printf (" 0x%8.8lx ", (unsigned long) addr
);
15586 for (j
= 0; j
< 16; j
++)
15589 printf ("%2.2x", data
[j
]);
15597 for (j
= 0; j
< lbytes
; j
++)
15600 if (k
>= ' ' && k
< 0x7f)
15623 #ifdef ENABLE_LIBCTF
15624 static ctf_sect_t
*
15625 shdr_to_ctf_sect (ctf_sect_t
*buf
, Elf_Internal_Shdr
*shdr
, Filedata
*filedata
)
15627 buf
->cts_name
= section_name_print (filedata
, shdr
);
15628 buf
->cts_size
= shdr
->sh_size
;
15629 buf
->cts_entsize
= shdr
->sh_entsize
;
15634 /* Formatting callback function passed to ctf_dump. Returns either the pointer
15635 it is passed, or a pointer to newly-allocated storage, in which case
15636 dump_ctf() will free it when it no longer needs it. */
15639 dump_ctf_indent_lines (ctf_sect_names_t sect ATTRIBUTE_UNUSED
,
15640 char *s
, void *arg
)
15642 const char *blanks
= arg
;
15645 if (asprintf (&new_s
, "%s%s", blanks
, s
) < 0)
15650 /* Dump CTF errors/warnings. */
15652 dump_ctf_errs (ctf_dict_t
*fp
)
15654 ctf_next_t
*it
= NULL
;
15659 /* Dump accumulated errors and warnings. */
15660 while ((errtext
= ctf_errwarning_next (fp
, &it
, &is_warning
, &err
)) != NULL
)
15662 error (_("%s: %s"), is_warning
? _("warning"): _("error"),
15666 if (err
!= ECTF_NEXT_END
)
15667 error (_("CTF error: cannot get CTF errors: `%s'"), ctf_errmsg (err
));
15670 /* Dump one CTF archive member. */
15673 dump_ctf_archive_member (ctf_dict_t
*ctf
, const char *name
, ctf_dict_t
*parent
,
15676 const char *things
[] = {"Header", "Labels", "Data objects",
15677 "Function objects", "Variables", "Types", "Strings",
15679 const char **thing
;
15682 /* Don't print out the name of the default-named archive member if it appears
15683 first in the list. The name .ctf appears everywhere, even for things that
15684 aren't really archives, so printing it out is liable to be confusing; also,
15685 the common case by far is for only one archive member to exist, and hiding
15686 it in that case seems worthwhile. */
15688 if (strcmp (name
, ".ctf") != 0 || member
!= 0)
15689 printf (_("\nCTF archive member: %s:\n"), name
);
15691 if (ctf_parent_name (ctf
) != NULL
)
15692 ctf_import (ctf
, parent
);
15694 for (i
= 0, thing
= things
; *thing
[0]; thing
++, i
++)
15696 ctf_dump_state_t
*s
= NULL
;
15699 printf ("\n %s:\n", *thing
);
15700 while ((item
= ctf_dump (ctf
, &s
, i
, dump_ctf_indent_lines
,
15701 (void *) " ")) != NULL
)
15703 printf ("%s\n", item
);
15707 if (ctf_errno (ctf
))
15709 error (_("Iteration failed: %s, %s\n"), *thing
,
15710 ctf_errmsg (ctf_errno (ctf
)));
15715 dump_ctf_errs (ctf
);
15719 dump_section_as_ctf (Elf_Internal_Shdr
* section
, Filedata
* filedata
)
15721 Elf_Internal_Shdr
* symtab_sec
= NULL
;
15722 Elf_Internal_Shdr
* strtab_sec
= NULL
;
15723 void * data
= NULL
;
15724 void * symdata
= NULL
;
15725 void * strdata
= NULL
;
15726 ctf_sect_t ctfsect
, symsect
, strsect
;
15727 ctf_sect_t
* symsectp
= NULL
;
15728 ctf_sect_t
* strsectp
= NULL
;
15729 ctf_archive_t
* ctfa
= NULL
;
15730 ctf_dict_t
* parent
= NULL
;
15733 ctf_next_t
*i
= NULL
;
15739 shdr_to_ctf_sect (&ctfsect
, section
, filedata
);
15740 data
= get_section_contents (section
, filedata
);
15741 ctfsect
.cts_data
= data
;
15743 if (!dump_ctf_symtab_name
)
15744 dump_ctf_symtab_name
= strdup (".dynsym");
15746 if (!dump_ctf_strtab_name
)
15747 dump_ctf_strtab_name
= strdup (".dynstr");
15749 if (dump_ctf_symtab_name
&& dump_ctf_symtab_name
[0] != 0)
15751 if ((symtab_sec
= find_section (filedata
, dump_ctf_symtab_name
)) == NULL
)
15753 error (_("No symbol section named %s\n"), dump_ctf_symtab_name
);
15756 if ((symdata
= (void *) get_data (NULL
, filedata
,
15757 symtab_sec
->sh_offset
, 1,
15758 symtab_sec
->sh_size
,
15759 _("symbols"))) == NULL
)
15761 symsectp
= shdr_to_ctf_sect (&symsect
, symtab_sec
, filedata
);
15762 symsect
.cts_data
= symdata
;
15765 if (dump_ctf_strtab_name
&& dump_ctf_strtab_name
[0] != 0)
15767 if ((strtab_sec
= find_section (filedata
, dump_ctf_strtab_name
)) == NULL
)
15769 error (_("No string table section named %s\n"),
15770 dump_ctf_strtab_name
);
15773 if ((strdata
= (void *) get_data (NULL
, filedata
,
15774 strtab_sec
->sh_offset
, 1,
15775 strtab_sec
->sh_size
,
15776 _("strings"))) == NULL
)
15778 strsectp
= shdr_to_ctf_sect (&strsect
, strtab_sec
, filedata
);
15779 strsect
.cts_data
= strdata
;
15782 /* Load the CTF file and dump it. It may be a raw CTF section, or an archive:
15783 libctf papers over the difference, so we can pretend it is always an
15786 if ((ctfa
= ctf_arc_bufopen (&ctfsect
, symsectp
, strsectp
, &err
)) == NULL
)
15788 dump_ctf_errs (NULL
);
15789 error (_("CTF open failure: %s\n"), ctf_errmsg (err
));
15793 ctf_arc_symsect_endianness (ctfa
, filedata
->file_header
.e_ident
[EI_DATA
]
15796 /* Preload the parent dict, since it will need to be imported into every
15798 if ((parent
= ctf_dict_open (ctfa
, dump_ctf_parent_name
, &err
)) == NULL
)
15800 dump_ctf_errs (NULL
);
15801 error (_("CTF open failure: %s\n"), ctf_errmsg (err
));
15807 if (filedata
->is_separate
)
15808 printf (_("\nDump of CTF section '%s' in linked file %s:\n"),
15809 printable_section_name (filedata
, section
),
15810 filedata
->file_name
);
15812 printf (_("\nDump of CTF section '%s':\n"),
15813 printable_section_name (filedata
, section
));
15815 while ((fp
= ctf_archive_next (ctfa
, &i
, &name
, 0, &err
)) != NULL
)
15816 dump_ctf_archive_member (fp
, name
, parent
, member
++);
15817 if (err
!= ECTF_NEXT_END
)
15819 dump_ctf_errs (NULL
);
15820 error (_("CTF member open failure: %s\n"), ctf_errmsg (err
));
15825 ctf_dict_close (parent
);
15835 load_specific_debug_section (enum dwarf_section_display_enum debug
,
15836 const Elf_Internal_Shdr
* sec
,
15839 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
15841 Filedata
* filedata
= (Filedata
*) data
;
15843 if (section
->start
!= NULL
)
15845 /* If it is already loaded, do nothing. */
15846 if (streq (section
->filename
, filedata
->file_name
))
15848 free (section
->start
);
15851 snprintf (buf
, sizeof (buf
), _("%s section data"), section
->name
);
15852 section
->address
= sec
->sh_addr
;
15853 section
->filename
= filedata
->file_name
;
15854 section
->start
= (unsigned char *) get_data (NULL
, filedata
,
15856 sec
->sh_size
, buf
);
15857 if (section
->start
== NULL
)
15861 unsigned char *start
= section
->start
;
15862 dwarf_size_type size
= sec
->sh_size
;
15863 dwarf_size_type uncompressed_size
= 0;
15865 if ((sec
->sh_flags
& SHF_COMPRESSED
) != 0)
15867 Elf_Internal_Chdr chdr
;
15868 unsigned int compression_header_size
;
15870 if (size
< (is_32bit_elf
15871 ? sizeof (Elf32_External_Chdr
)
15872 : sizeof (Elf64_External_Chdr
)))
15874 warn (_("compressed section %s is too small to contain a compression header\n"),
15879 compression_header_size
= get_compression_header (&chdr
, start
, size
);
15880 if (compression_header_size
== 0)
15881 /* An error message will have already been generated
15882 by get_compression_header. */
15885 if (chdr
.ch_type
!= ELFCOMPRESS_ZLIB
)
15887 warn (_("section '%s' has unsupported compress type: %d\n"),
15888 section
->name
, chdr
.ch_type
);
15891 uncompressed_size
= chdr
.ch_size
;
15892 start
+= compression_header_size
;
15893 size
-= compression_header_size
;
15895 else if (size
> 12 && streq ((char *) start
, "ZLIB"))
15897 /* Read the zlib header. In this case, it should be "ZLIB"
15898 followed by the uncompressed section size, 8 bytes in
15899 big-endian order. */
15900 uncompressed_size
= start
[4]; uncompressed_size
<<= 8;
15901 uncompressed_size
+= start
[5]; uncompressed_size
<<= 8;
15902 uncompressed_size
+= start
[6]; uncompressed_size
<<= 8;
15903 uncompressed_size
+= start
[7]; uncompressed_size
<<= 8;
15904 uncompressed_size
+= start
[8]; uncompressed_size
<<= 8;
15905 uncompressed_size
+= start
[9]; uncompressed_size
<<= 8;
15906 uncompressed_size
+= start
[10]; uncompressed_size
<<= 8;
15907 uncompressed_size
+= start
[11];
15912 if (uncompressed_size
)
15914 if (uncompress_section_contents (&start
, uncompressed_size
,
15917 /* Free the compressed buffer, update the section buffer
15918 and the section size if uncompress is successful. */
15919 free (section
->start
);
15920 section
->start
= start
;
15924 error (_("Unable to decompress section %s\n"),
15925 printable_section_name (filedata
, sec
));
15930 section
->size
= size
;
15933 if (section
->start
== NULL
)
15936 if (debug_displays
[debug
].relocate
)
15938 if (! apply_relocations (filedata
, sec
, section
->start
, section
->size
,
15939 & section
->reloc_info
, & section
->num_relocs
))
15944 section
->reloc_info
= NULL
;
15945 section
->num_relocs
= 0;
15951 #if HAVE_LIBDEBUGINFOD
15952 /* Return a hex string representation of the build-id. */
15954 get_build_id (void * data
)
15956 Filedata
* filedata
= (Filedata
*) data
;
15957 Elf_Internal_Shdr
* shdr
;
15960 /* Iterate through notes to find note.gnu.build-id.
15961 FIXME: Only the first note in any note section is examined. */
15962 for (i
= 0, shdr
= filedata
->section_headers
;
15963 i
< filedata
->file_header
.e_shnum
&& shdr
!= NULL
;
15966 if (shdr
->sh_type
!= SHT_NOTE
)
15971 size_t data_remaining
;
15973 Elf_External_Note
* enote
;
15974 Elf_Internal_Note inote
;
15976 bfd_vma offset
= shdr
->sh_offset
;
15977 bfd_vma align
= shdr
->sh_addralign
;
15978 bfd_vma length
= shdr
->sh_size
;
15980 enote
= (Elf_External_Note
*) get_section_contents (shdr
, filedata
);
15986 else if (align
!= 4 && align
!= 8)
15992 end
= (char *) enote
+ length
;
15993 data_remaining
= end
- (char *) enote
;
15995 if (!is_ia64_vms (filedata
))
15997 min_notesz
= offsetof (Elf_External_Note
, name
);
15998 if (data_remaining
< min_notesz
)
16001 malformed note encountered in section %s whilst scanning for build-id note\n"),
16002 printable_section_name (filedata
, shdr
));
16006 data_remaining
-= min_notesz
;
16008 inote
.type
= BYTE_GET (enote
->type
);
16009 inote
.namesz
= BYTE_GET (enote
->namesz
);
16010 inote
.namedata
= enote
->name
;
16011 inote
.descsz
= BYTE_GET (enote
->descsz
);
16012 inote
.descdata
= ((char *) enote
16013 + ELF_NOTE_DESC_OFFSET (inote
.namesz
, align
));
16014 inote
.descpos
= offset
+ (inote
.descdata
- (char *) enote
);
16015 next
= ((char *) enote
16016 + ELF_NOTE_NEXT_OFFSET (inote
.namesz
, inote
.descsz
, align
));
16020 Elf64_External_VMS_Note
*vms_enote
;
16022 /* PR binutils/15191
16023 Make sure that there is enough data to read. */
16024 min_notesz
= offsetof (Elf64_External_VMS_Note
, name
);
16025 if (data_remaining
< min_notesz
)
16028 malformed note encountered in section %s whilst scanning for build-id note\n"),
16029 printable_section_name (filedata
, shdr
));
16033 data_remaining
-= min_notesz
;
16035 vms_enote
= (Elf64_External_VMS_Note
*) enote
;
16036 inote
.type
= BYTE_GET (vms_enote
->type
);
16037 inote
.namesz
= BYTE_GET (vms_enote
->namesz
);
16038 inote
.namedata
= vms_enote
->name
;
16039 inote
.descsz
= BYTE_GET (vms_enote
->descsz
);
16040 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 3);
16041 inote
.descpos
= offset
+ (inote
.descdata
- (char *) enote
);
16042 next
= inote
.descdata
+ align_power (inote
.descsz
, 3);
16045 /* Skip malformed notes. */
16046 if ((size_t) (inote
.descdata
- inote
.namedata
) < inote
.namesz
16047 || (size_t) (inote
.descdata
- inote
.namedata
) > data_remaining
16048 || (size_t) (next
- inote
.descdata
) < inote
.descsz
16049 || ((size_t) (next
- inote
.descdata
)
16050 > data_remaining
- (size_t) (inote
.descdata
- inote
.namedata
)))
16053 malformed note encountered in section %s whilst scanning for build-id note\n"),
16054 printable_section_name (filedata
, shdr
));
16059 /* Check if this is the build-id note. If so then convert the build-id
16060 bytes to a hex string. */
16061 if (inote
.namesz
> 0
16062 && startswith (inote
.namedata
, "GNU")
16063 && inote
.type
== NT_GNU_BUILD_ID
)
16068 build_id
= malloc (inote
.descsz
* 2 + 1);
16069 if (build_id
== NULL
)
16075 for (j
= 0; j
< inote
.descsz
; ++j
)
16076 sprintf (build_id
+ (j
* 2), "%02x", inote
.descdata
[j
] & 0xff);
16077 build_id
[inote
.descsz
* 2] = '\0';
16080 return (unsigned char *) build_id
;
16087 #endif /* HAVE_LIBDEBUGINFOD */
16089 /* If this is not NULL, load_debug_section will only look for sections
16090 within the list of sections given here. */
16091 static unsigned int * section_subset
= NULL
;
16094 load_debug_section (enum dwarf_section_display_enum debug
, void * data
)
16096 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
16097 Elf_Internal_Shdr
* sec
;
16098 Filedata
* filedata
= (Filedata
*) data
;
16100 if (!dump_any_debugging
)
16103 /* Without section headers we cannot find any sections. */
16104 if (filedata
->section_headers
== NULL
)
16107 if (filedata
->string_table
== NULL
16108 && filedata
->file_header
.e_shstrndx
!= SHN_UNDEF
16109 && filedata
->file_header
.e_shstrndx
< filedata
->file_header
.e_shnum
)
16111 Elf_Internal_Shdr
* strs
;
16113 /* Read in the string table, so that we have section names to scan. */
16114 strs
= filedata
->section_headers
+ filedata
->file_header
.e_shstrndx
;
16116 if (strs
!= NULL
&& strs
->sh_size
!= 0)
16118 filedata
->string_table
16119 = (char *) get_data (NULL
, filedata
, strs
->sh_offset
,
16120 1, strs
->sh_size
, _("string table"));
16122 filedata
->string_table_length
16123 = filedata
->string_table
!= NULL
? strs
->sh_size
: 0;
16127 /* Locate the debug section. */
16128 sec
= find_section_in_set (filedata
, section
->uncompressed_name
, section_subset
);
16130 section
->name
= section
->uncompressed_name
;
16133 sec
= find_section_in_set (filedata
, section
->compressed_name
, section_subset
);
16135 section
->name
= section
->compressed_name
;
16140 /* If we're loading from a subset of sections, and we've loaded
16141 a section matching this name before, it's likely that it's a
16143 if (section_subset
!= NULL
)
16144 free_debug_section (debug
);
16146 return load_specific_debug_section (debug
, sec
, data
);
16150 free_debug_section (enum dwarf_section_display_enum debug
)
16152 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
16154 if (section
->start
== NULL
)
16157 free ((char *) section
->start
);
16158 section
->start
= NULL
;
16159 section
->address
= 0;
16162 free (section
->reloc_info
);
16163 section
->reloc_info
= NULL
;
16164 section
->num_relocs
= 0;
16168 display_debug_section (int shndx
, Elf_Internal_Shdr
* section
, Filedata
* filedata
)
16170 const char *name
= (section_name_valid (filedata
, section
)
16171 ? section_name (filedata
, section
) : "");
16172 const char *print_name
= printable_section_name (filedata
, section
);
16173 bfd_size_type length
;
16174 bool result
= true;
16177 length
= section
->sh_size
;
16180 printf (_("\nSection '%s' has no debugging data.\n"), print_name
);
16183 if (section
->sh_type
== SHT_NOBITS
)
16185 /* There is no point in dumping the contents of a debugging section
16186 which has the NOBITS type - the bits in the file will be random.
16187 This can happen when a file containing a .eh_frame section is
16188 stripped with the --only-keep-debug command line option. */
16189 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
16194 if (startswith (name
, ".gnu.linkonce.wi."))
16195 name
= ".debug_info";
16197 /* See if we know how to display the contents of this section. */
16198 for (i
= 0; i
< max
; i
++)
16200 enum dwarf_section_display_enum id
= (enum dwarf_section_display_enum
) i
;
16201 struct dwarf_section_display
* display
= debug_displays
+ i
;
16202 struct dwarf_section
* sec
= & display
->section
;
16204 if (streq (sec
->uncompressed_name
, name
)
16205 || (id
== line
&& startswith (name
, ".debug_line."))
16206 || streq (sec
->compressed_name
, name
))
16208 bool secondary
= (section
!= find_section (filedata
, name
));
16211 free_debug_section (id
);
16213 if (i
== line
&& startswith (name
, ".debug_line."))
16215 else if (streq (sec
->uncompressed_name
, name
))
16216 sec
->name
= sec
->uncompressed_name
;
16218 sec
->name
= sec
->compressed_name
;
16220 if (load_specific_debug_section (id
, section
, filedata
))
16222 /* If this debug section is part of a CU/TU set in a .dwp file,
16223 restrict load_debug_section to the sections in that set. */
16224 section_subset
= find_cu_tu_set (filedata
, shndx
);
16226 result
&= display
->display (sec
, filedata
);
16228 section_subset
= NULL
;
16230 if (secondary
|| (id
!= info
&& id
!= abbrev
&& id
!= debug_addr
))
16231 free_debug_section (id
);
16239 printf (_("Unrecognized debug section: %s\n"), print_name
);
16246 /* Set DUMP_SECTS for all sections where dumps were requested
16247 based on section name. */
16250 initialise_dumps_byname (Filedata
* filedata
)
16252 struct dump_list_entry
* cur
;
16254 for (cur
= dump_sects_byname
; cur
; cur
= cur
->next
)
16259 for (i
= 0; i
< filedata
->file_header
.e_shnum
; i
++)
16260 if (section_name_valid (filedata
, filedata
->section_headers
+ i
)
16261 && streq (section_name (filedata
, filedata
->section_headers
+ i
),
16264 request_dump_bynumber (&filedata
->dump
, i
, cur
->type
);
16268 if (!any
&& !filedata
->is_separate
)
16269 warn (_("Section '%s' was not dumped because it does not exist\n"),
16275 process_section_contents (Filedata
* filedata
)
16277 Elf_Internal_Shdr
* section
;
16284 initialise_dumps_byname (filedata
);
16286 for (i
= 0, section
= filedata
->section_headers
;
16287 i
< filedata
->file_header
.e_shnum
&& i
< filedata
->dump
.num_dump_sects
;
16290 dump_type dump
= filedata
->dump
.dump_sects
[i
];
16292 if (filedata
->is_separate
&& ! process_links
)
16293 dump
&= DEBUG_DUMP
;
16295 #ifdef SUPPORT_DISASSEMBLY
16296 if (dump
& DISASS_DUMP
)
16298 if (! disassemble_section (section
, filedata
))
16302 if (dump
& HEX_DUMP
)
16304 if (! dump_section_as_bytes (section
, filedata
, false))
16308 if (dump
& RELOC_DUMP
)
16310 if (! dump_section_as_bytes (section
, filedata
, true))
16314 if (dump
& STRING_DUMP
)
16316 if (! dump_section_as_strings (section
, filedata
))
16320 if (dump
& DEBUG_DUMP
)
16322 if (! display_debug_section (i
, section
, filedata
))
16326 #ifdef ENABLE_LIBCTF
16327 if (dump
& CTF_DUMP
)
16329 if (! dump_section_as_ctf (section
, filedata
))
16335 if (! filedata
->is_separate
)
16337 /* Check to see if the user requested a
16338 dump of a section that does not exist. */
16339 for (; i
< filedata
->dump
.num_dump_sects
; i
++)
16340 if (filedata
->dump
.dump_sects
[i
])
16342 warn (_("Section %d was not dumped because it does not exist!\n"), i
);
16351 process_mips_fpe_exception (int mask
)
16357 if (mask
& OEX_FPU_INEX
)
16358 fputs ("INEX", stdout
), first
= false;
16359 if (mask
& OEX_FPU_UFLO
)
16360 printf ("%sUFLO", first
? "" : "|"), first
= false;
16361 if (mask
& OEX_FPU_OFLO
)
16362 printf ("%sOFLO", first
? "" : "|"), first
= false;
16363 if (mask
& OEX_FPU_DIV0
)
16364 printf ("%sDIV0", first
? "" : "|"), first
= false;
16365 if (mask
& OEX_FPU_INVAL
)
16366 printf ("%sINVAL", first
? "" : "|");
16369 fputs ("0", stdout
);
16372 /* Display's the value of TAG at location P. If TAG is
16373 greater than 0 it is assumed to be an unknown tag, and
16374 a message is printed to this effect. Otherwise it is
16375 assumed that a message has already been printed.
16377 If the bottom bit of TAG is set it assumed to have a
16378 string value, otherwise it is assumed to have an integer
16381 Returns an updated P pointing to the first unread byte
16382 beyond the end of TAG's value.
16384 Reads at or beyond END will not be made. */
16386 static unsigned char *
16387 display_tag_value (signed int tag
,
16389 const unsigned char * const end
)
16394 printf (" Tag_unknown_%d: ", tag
);
16398 warn (_("<corrupt tag>\n"));
16402 /* PR 17531 file: 027-19978-0.004. */
16403 size_t maxlen
= (end
- p
) - 1;
16408 print_symbol ((int) maxlen
, (const char *) p
);
16409 p
+= strnlen ((char *) p
, maxlen
) + 1;
16413 printf (_("<corrupt string tag>"));
16414 p
= (unsigned char *) end
;
16420 READ_ULEB (val
, p
, end
);
16421 printf ("%ld (0x%lx)\n", val
, val
);
16428 /* ARC ABI attributes section. */
16430 static unsigned char *
16431 display_arc_attribute (unsigned char * p
,
16432 const unsigned char * const end
)
16437 READ_ULEB (tag
, p
, end
);
16441 case Tag_ARC_PCS_config
:
16442 READ_ULEB (val
, p
, end
);
16443 printf (" Tag_ARC_PCS_config: ");
16447 printf (_("Absent/Non standard\n"));
16450 printf (_("Bare metal/mwdt\n"));
16453 printf (_("Bare metal/newlib\n"));
16456 printf (_("Linux/uclibc\n"));
16459 printf (_("Linux/glibc\n"));
16462 printf (_("Unknown\n"));
16467 case Tag_ARC_CPU_base
:
16468 READ_ULEB (val
, p
, end
);
16469 printf (" Tag_ARC_CPU_base: ");
16474 printf (_("Absent\n"));
16476 case TAG_CPU_ARC6xx
:
16477 printf ("ARC6xx\n");
16479 case TAG_CPU_ARC7xx
:
16480 printf ("ARC7xx\n");
16482 case TAG_CPU_ARCEM
:
16483 printf ("ARCEM\n");
16485 case TAG_CPU_ARCHS
:
16486 printf ("ARCHS\n");
16491 case Tag_ARC_CPU_variation
:
16492 READ_ULEB (val
, p
, end
);
16493 printf (" Tag_ARC_CPU_variation: ");
16497 if (val
> 0 && val
< 16)
16498 printf ("Core%d\n", val
);
16500 printf ("Unknown\n");
16504 printf (_("Absent\n"));
16509 case Tag_ARC_CPU_name
:
16510 printf (" Tag_ARC_CPU_name: ");
16511 p
= display_tag_value (-1, p
, end
);
16514 case Tag_ARC_ABI_rf16
:
16515 READ_ULEB (val
, p
, end
);
16516 printf (" Tag_ARC_ABI_rf16: %s\n", val
? _("yes") : _("no"));
16519 case Tag_ARC_ABI_osver
:
16520 READ_ULEB (val
, p
, end
);
16521 printf (" Tag_ARC_ABI_osver: v%d\n", val
);
16524 case Tag_ARC_ABI_pic
:
16525 case Tag_ARC_ABI_sda
:
16526 READ_ULEB (val
, p
, end
);
16527 printf (tag
== Tag_ARC_ABI_sda
? " Tag_ARC_ABI_sda: "
16528 : " Tag_ARC_ABI_pic: ");
16532 printf (_("Absent\n"));
16541 printf (_("Unknown\n"));
16546 case Tag_ARC_ABI_tls
:
16547 READ_ULEB (val
, p
, end
);
16548 printf (" Tag_ARC_ABI_tls: %s\n", val
? "r25": "none");
16551 case Tag_ARC_ABI_enumsize
:
16552 READ_ULEB (val
, p
, end
);
16553 printf (" Tag_ARC_ABI_enumsize: %s\n", val
? _("default") :
16557 case Tag_ARC_ABI_exceptions
:
16558 READ_ULEB (val
, p
, end
);
16559 printf (" Tag_ARC_ABI_exceptions: %s\n", val
? _("OPTFP")
16563 case Tag_ARC_ABI_double_size
:
16564 READ_ULEB (val
, p
, end
);
16565 printf (" Tag_ARC_ABI_double_size: %d\n", val
);
16568 case Tag_ARC_ISA_config
:
16569 printf (" Tag_ARC_ISA_config: ");
16570 p
= display_tag_value (-1, p
, end
);
16573 case Tag_ARC_ISA_apex
:
16574 printf (" Tag_ARC_ISA_apex: ");
16575 p
= display_tag_value (-1, p
, end
);
16578 case Tag_ARC_ISA_mpy_option
:
16579 READ_ULEB (val
, p
, end
);
16580 printf (" Tag_ARC_ISA_mpy_option: %d\n", val
);
16583 case Tag_ARC_ATR_version
:
16584 READ_ULEB (val
, p
, end
);
16585 printf (" Tag_ARC_ATR_version: %d\n", val
);
16589 return display_tag_value (tag
& 1, p
, end
);
16595 /* ARM EABI attributes section. */
16600 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
16602 const char *const *table
;
16603 } arm_attr_public_tag
;
16605 static const char *const arm_attr_tag_CPU_arch
[] =
16606 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
16607 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
16608 "v8-M.mainline", "v8.1-A", "v8.2-A", "v8.3-A",
16609 "v8.1-M.mainline", "v9"};
16610 static const char *const arm_attr_tag_ARM_ISA_use
[] = {"No", "Yes"};
16611 static const char *const arm_attr_tag_THUMB_ISA_use
[] =
16612 {"No", "Thumb-1", "Thumb-2", "Yes"};
16613 static const char *const arm_attr_tag_FP_arch
[] =
16614 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
16615 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
16616 static const char *const arm_attr_tag_WMMX_arch
[] = {"No", "WMMXv1", "WMMXv2"};
16617 static const char *const arm_attr_tag_Advanced_SIMD_arch
[] =
16618 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
16619 "NEON for ARMv8.1"};
16620 static const char *const arm_attr_tag_PCS_config
[] =
16621 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
16622 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
16623 static const char *const arm_attr_tag_ABI_PCS_R9_use
[] =
16624 {"V6", "SB", "TLS", "Unused"};
16625 static const char *const arm_attr_tag_ABI_PCS_RW_data
[] =
16626 {"Absolute", "PC-relative", "SB-relative", "None"};
16627 static const char *const arm_attr_tag_ABI_PCS_RO_data
[] =
16628 {"Absolute", "PC-relative", "None"};
16629 static const char *const arm_attr_tag_ABI_PCS_GOT_use
[] =
16630 {"None", "direct", "GOT-indirect"};
16631 static const char *const arm_attr_tag_ABI_PCS_wchar_t
[] =
16632 {"None", "??? 1", "2", "??? 3", "4"};
16633 static const char *const arm_attr_tag_ABI_FP_rounding
[] = {"Unused", "Needed"};
16634 static const char *const arm_attr_tag_ABI_FP_denormal
[] =
16635 {"Unused", "Needed", "Sign only"};
16636 static const char *const arm_attr_tag_ABI_FP_exceptions
[] = {"Unused", "Needed"};
16637 static const char *const arm_attr_tag_ABI_FP_user_exceptions
[] = {"Unused", "Needed"};
16638 static const char *const arm_attr_tag_ABI_FP_number_model
[] =
16639 {"Unused", "Finite", "RTABI", "IEEE 754"};
16640 static const char *const arm_attr_tag_ABI_enum_size
[] =
16641 {"Unused", "small", "int", "forced to int"};
16642 static const char *const arm_attr_tag_ABI_HardFP_use
[] =
16643 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
16644 static const char *const arm_attr_tag_ABI_VFP_args
[] =
16645 {"AAPCS", "VFP registers", "custom", "compatible"};
16646 static const char *const arm_attr_tag_ABI_WMMX_args
[] =
16647 {"AAPCS", "WMMX registers", "custom"};
16648 static const char *const arm_attr_tag_ABI_optimization_goals
[] =
16649 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
16650 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
16651 static const char *const arm_attr_tag_ABI_FP_optimization_goals
[] =
16652 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
16653 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
16654 static const char *const arm_attr_tag_CPU_unaligned_access
[] = {"None", "v6"};
16655 static const char *const arm_attr_tag_FP_HP_extension
[] =
16656 {"Not Allowed", "Allowed"};
16657 static const char *const arm_attr_tag_ABI_FP_16bit_format
[] =
16658 {"None", "IEEE 754", "Alternative Format"};
16659 static const char *const arm_attr_tag_DSP_extension
[] =
16660 {"Follow architecture", "Allowed"};
16661 static const char *const arm_attr_tag_MPextension_use
[] =
16662 {"Not Allowed", "Allowed"};
16663 static const char *const arm_attr_tag_DIV_use
[] =
16664 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
16665 "Allowed in v7-A with integer division extension"};
16666 static const char *const arm_attr_tag_T2EE_use
[] = {"Not Allowed", "Allowed"};
16667 static const char *const arm_attr_tag_Virtualization_use
[] =
16668 {"Not Allowed", "TrustZone", "Virtualization Extensions",
16669 "TrustZone and Virtualization Extensions"};
16670 static const char *const arm_attr_tag_MPextension_use_legacy
[] =
16671 {"Not Allowed", "Allowed"};
16673 static const char *const arm_attr_tag_MVE_arch
[] =
16674 {"No MVE", "MVE Integer only", "MVE Integer and FP"};
16676 static const char * arm_attr_tag_PAC_extension
[] =
16677 {"No PAC/AUT instructions",
16678 "PAC/AUT instructions permitted in the NOP space",
16679 "PAC/AUT instructions permitted in the NOP and in the non-NOP space"};
16681 static const char * arm_attr_tag_BTI_extension
[] =
16682 {"BTI instructions not permitted",
16683 "BTI instructions permitted in the NOP space",
16684 "BTI instructions permitted in the NOP and in the non-NOP space"};
16686 static const char * arm_attr_tag_BTI_use
[] =
16687 {"Compiled without branch target enforcement",
16688 "Compiled with branch target enforcement"};
16690 static const char * arm_attr_tag_PACRET_use
[] =
16691 {"Compiled without return address signing and authentication",
16692 "Compiled with return address signing and authentication"};
16694 #define LOOKUP(id, name) \
16695 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
16696 static arm_attr_public_tag arm_attr_public_tags
[] =
16698 {4, "CPU_raw_name", 1, NULL
},
16699 {5, "CPU_name", 1, NULL
},
16700 LOOKUP(6, CPU_arch
),
16701 {7, "CPU_arch_profile", 0, NULL
},
16702 LOOKUP(8, ARM_ISA_use
),
16703 LOOKUP(9, THUMB_ISA_use
),
16704 LOOKUP(10, FP_arch
),
16705 LOOKUP(11, WMMX_arch
),
16706 LOOKUP(12, Advanced_SIMD_arch
),
16707 LOOKUP(13, PCS_config
),
16708 LOOKUP(14, ABI_PCS_R9_use
),
16709 LOOKUP(15, ABI_PCS_RW_data
),
16710 LOOKUP(16, ABI_PCS_RO_data
),
16711 LOOKUP(17, ABI_PCS_GOT_use
),
16712 LOOKUP(18, ABI_PCS_wchar_t
),
16713 LOOKUP(19, ABI_FP_rounding
),
16714 LOOKUP(20, ABI_FP_denormal
),
16715 LOOKUP(21, ABI_FP_exceptions
),
16716 LOOKUP(22, ABI_FP_user_exceptions
),
16717 LOOKUP(23, ABI_FP_number_model
),
16718 {24, "ABI_align_needed", 0, NULL
},
16719 {25, "ABI_align_preserved", 0, NULL
},
16720 LOOKUP(26, ABI_enum_size
),
16721 LOOKUP(27, ABI_HardFP_use
),
16722 LOOKUP(28, ABI_VFP_args
),
16723 LOOKUP(29, ABI_WMMX_args
),
16724 LOOKUP(30, ABI_optimization_goals
),
16725 LOOKUP(31, ABI_FP_optimization_goals
),
16726 {32, "compatibility", 0, NULL
},
16727 LOOKUP(34, CPU_unaligned_access
),
16728 LOOKUP(36, FP_HP_extension
),
16729 LOOKUP(38, ABI_FP_16bit_format
),
16730 LOOKUP(42, MPextension_use
),
16731 LOOKUP(44, DIV_use
),
16732 LOOKUP(46, DSP_extension
),
16733 LOOKUP(48, MVE_arch
),
16734 LOOKUP(50, PAC_extension
),
16735 LOOKUP(52, BTI_extension
),
16736 LOOKUP(74, BTI_use
),
16737 LOOKUP(76, PACRET_use
),
16738 {64, "nodefaults", 0, NULL
},
16739 {65, "also_compatible_with", 0, NULL
},
16740 LOOKUP(66, T2EE_use
),
16741 {67, "conformance", 1, NULL
},
16742 LOOKUP(68, Virtualization_use
),
16743 LOOKUP(70, MPextension_use_legacy
)
16747 static unsigned char *
16748 display_arm_attribute (unsigned char * p
,
16749 const unsigned char * const end
)
16753 arm_attr_public_tag
* attr
;
16757 READ_ULEB (tag
, p
, end
);
16759 for (i
= 0; i
< ARRAY_SIZE (arm_attr_public_tags
); i
++)
16761 if (arm_attr_public_tags
[i
].tag
== tag
)
16763 attr
= &arm_attr_public_tags
[i
];
16770 printf (" Tag_%s: ", attr
->name
);
16771 switch (attr
->type
)
16776 case 7: /* Tag_CPU_arch_profile. */
16777 READ_ULEB (val
, p
, end
);
16780 case 0: printf (_("None\n")); break;
16781 case 'A': printf (_("Application\n")); break;
16782 case 'R': printf (_("Realtime\n")); break;
16783 case 'M': printf (_("Microcontroller\n")); break;
16784 case 'S': printf (_("Application or Realtime\n")); break;
16785 default: printf ("??? (%d)\n", val
); break;
16789 case 24: /* Tag_align_needed. */
16790 READ_ULEB (val
, p
, end
);
16793 case 0: printf (_("None\n")); break;
16794 case 1: printf (_("8-byte\n")); break;
16795 case 2: printf (_("4-byte\n")); break;
16796 case 3: printf ("??? 3\n"); break;
16799 printf (_("8-byte and up to %d-byte extended\n"),
16802 printf ("??? (%d)\n", val
);
16807 case 25: /* Tag_align_preserved. */
16808 READ_ULEB (val
, p
, end
);
16811 case 0: printf (_("None\n")); break;
16812 case 1: printf (_("8-byte, except leaf SP\n")); break;
16813 case 2: printf (_("8-byte\n")); break;
16814 case 3: printf ("??? 3\n"); break;
16817 printf (_("8-byte and up to %d-byte extended\n"),
16820 printf ("??? (%d)\n", val
);
16825 case 32: /* Tag_compatibility. */
16827 READ_ULEB (val
, p
, end
);
16828 printf (_("flag = %d, vendor = "), val
);
16831 size_t maxlen
= (end
- p
) - 1;
16833 print_symbol ((int) maxlen
, (const char *) p
);
16834 p
+= strnlen ((char *) p
, maxlen
) + 1;
16838 printf (_("<corrupt>"));
16839 p
= (unsigned char *) end
;
16845 case 64: /* Tag_nodefaults. */
16846 /* PR 17531: file: 001-505008-0.01. */
16849 printf (_("True\n"));
16852 case 65: /* Tag_also_compatible_with. */
16853 READ_ULEB (val
, p
, end
);
16854 if (val
== 6 /* Tag_CPU_arch. */)
16856 READ_ULEB (val
, p
, end
);
16857 if ((unsigned int) val
>= ARRAY_SIZE (arm_attr_tag_CPU_arch
))
16858 printf ("??? (%d)\n", val
);
16860 printf ("%s\n", arm_attr_tag_CPU_arch
[val
]);
16864 while (p
< end
&& *(p
++) != '\0' /* NUL terminator. */)
16869 printf (_("<unknown: %d>\n"), tag
);
16875 return display_tag_value (-1, p
, end
);
16877 return display_tag_value (0, p
, end
);
16880 assert (attr
->type
& 0x80);
16881 READ_ULEB (val
, p
, end
);
16882 type
= attr
->type
& 0x7f;
16884 printf ("??? (%d)\n", val
);
16886 printf ("%s\n", attr
->table
[val
]);
16891 return display_tag_value (tag
, p
, end
);
16894 static unsigned char *
16895 display_gnu_attribute (unsigned char * p
,
16896 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, unsigned int, const unsigned char * const),
16897 const unsigned char * const end
)
16902 READ_ULEB (tag
, p
, end
);
16904 /* Tag_compatibility is the only generic GNU attribute defined at
16908 READ_ULEB (val
, p
, end
);
16910 printf (_("flag = %d, vendor = "), val
);
16913 printf (_("<corrupt>\n"));
16914 warn (_("corrupt vendor attribute\n"));
16920 size_t maxlen
= (end
- p
) - 1;
16922 print_symbol ((int) maxlen
, (const char *) p
);
16923 p
+= strnlen ((char *) p
, maxlen
) + 1;
16927 printf (_("<corrupt>"));
16928 p
= (unsigned char *) end
;
16935 if ((tag
& 2) == 0 && display_proc_gnu_attribute
)
16936 return display_proc_gnu_attribute (p
, tag
, end
);
16938 return display_tag_value (tag
, p
, end
);
16941 static unsigned char *
16942 display_m68k_gnu_attribute (unsigned char * p
,
16944 const unsigned char * const end
)
16948 if (tag
== Tag_GNU_M68K_ABI_FP
)
16950 printf (" Tag_GNU_M68K_ABI_FP: ");
16953 printf (_("<corrupt>\n"));
16956 READ_ULEB (val
, p
, end
);
16959 printf ("(%#x), ", val
);
16964 printf (_("unspecified hard/soft float\n"));
16967 printf (_("hard float\n"));
16970 printf (_("soft float\n"));
16976 return display_tag_value (tag
& 1, p
, end
);
16979 static unsigned char *
16980 display_power_gnu_attribute (unsigned char * p
,
16982 const unsigned char * const end
)
16986 if (tag
== Tag_GNU_Power_ABI_FP
)
16988 printf (" Tag_GNU_Power_ABI_FP: ");
16991 printf (_("<corrupt>\n"));
16994 READ_ULEB (val
, p
, end
);
16997 printf ("(%#x), ", val
);
17002 printf (_("unspecified hard/soft float, "));
17005 printf (_("hard float, "));
17008 printf (_("soft float, "));
17011 printf (_("single-precision hard float, "));
17018 printf (_("unspecified long double\n"));
17021 printf (_("128-bit IBM long double\n"));
17024 printf (_("64-bit long double\n"));
17027 printf (_("128-bit IEEE long double\n"));
17033 if (tag
== Tag_GNU_Power_ABI_Vector
)
17035 printf (" Tag_GNU_Power_ABI_Vector: ");
17038 printf (_("<corrupt>\n"));
17041 READ_ULEB (val
, p
, end
);
17044 printf ("(%#x), ", val
);
17049 printf (_("unspecified\n"));
17052 printf (_("generic\n"));
17055 printf ("AltiVec\n");
17064 if (tag
== Tag_GNU_Power_ABI_Struct_Return
)
17066 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
17069 printf (_("<corrupt>\n"));
17072 READ_ULEB (val
, p
, end
);
17075 printf ("(%#x), ", val
);
17080 printf (_("unspecified\n"));
17083 printf ("r3/r4\n");
17086 printf (_("memory\n"));
17095 return display_tag_value (tag
& 1, p
, end
);
17098 static unsigned char *
17099 display_s390_gnu_attribute (unsigned char * p
,
17101 const unsigned char * const end
)
17105 if (tag
== Tag_GNU_S390_ABI_Vector
)
17107 printf (" Tag_GNU_S390_ABI_Vector: ");
17108 READ_ULEB (val
, p
, end
);
17113 printf (_("any\n"));
17116 printf (_("software\n"));
17119 printf (_("hardware\n"));
17122 printf ("??? (%d)\n", val
);
17128 return display_tag_value (tag
& 1, p
, end
);
17132 display_sparc_hwcaps (unsigned int mask
)
17138 if (mask
& ELF_SPARC_HWCAP_MUL32
)
17139 fputs ("mul32", stdout
), first
= false;
17140 if (mask
& ELF_SPARC_HWCAP_DIV32
)
17141 printf ("%sdiv32", first
? "" : "|"), first
= false;
17142 if (mask
& ELF_SPARC_HWCAP_FSMULD
)
17143 printf ("%sfsmuld", first
? "" : "|"), first
= false;
17144 if (mask
& ELF_SPARC_HWCAP_V8PLUS
)
17145 printf ("%sv8plus", first
? "" : "|"), first
= false;
17146 if (mask
& ELF_SPARC_HWCAP_POPC
)
17147 printf ("%spopc", first
? "" : "|"), first
= false;
17148 if (mask
& ELF_SPARC_HWCAP_VIS
)
17149 printf ("%svis", first
? "" : "|"), first
= false;
17150 if (mask
& ELF_SPARC_HWCAP_VIS2
)
17151 printf ("%svis2", first
? "" : "|"), first
= false;
17152 if (mask
& ELF_SPARC_HWCAP_ASI_BLK_INIT
)
17153 printf ("%sASIBlkInit", first
? "" : "|"), first
= false;
17154 if (mask
& ELF_SPARC_HWCAP_FMAF
)
17155 printf ("%sfmaf", first
? "" : "|"), first
= false;
17156 if (mask
& ELF_SPARC_HWCAP_VIS3
)
17157 printf ("%svis3", first
? "" : "|"), first
= false;
17158 if (mask
& ELF_SPARC_HWCAP_HPC
)
17159 printf ("%shpc", first
? "" : "|"), first
= false;
17160 if (mask
& ELF_SPARC_HWCAP_RANDOM
)
17161 printf ("%srandom", first
? "" : "|"), first
= false;
17162 if (mask
& ELF_SPARC_HWCAP_TRANS
)
17163 printf ("%strans", first
? "" : "|"), first
= false;
17164 if (mask
& ELF_SPARC_HWCAP_FJFMAU
)
17165 printf ("%sfjfmau", first
? "" : "|"), first
= false;
17166 if (mask
& ELF_SPARC_HWCAP_IMA
)
17167 printf ("%sima", first
? "" : "|"), first
= false;
17168 if (mask
& ELF_SPARC_HWCAP_ASI_CACHE_SPARING
)
17169 printf ("%scspare", first
? "" : "|"), first
= false;
17172 fputc ('0', stdout
);
17173 fputc ('\n', stdout
);
17177 display_sparc_hwcaps2 (unsigned int mask
)
17183 if (mask
& ELF_SPARC_HWCAP2_FJATHPLUS
)
17184 fputs ("fjathplus", stdout
), first
= false;
17185 if (mask
& ELF_SPARC_HWCAP2_VIS3B
)
17186 printf ("%svis3b", first
? "" : "|"), first
= false;
17187 if (mask
& ELF_SPARC_HWCAP2_ADP
)
17188 printf ("%sadp", first
? "" : "|"), first
= false;
17189 if (mask
& ELF_SPARC_HWCAP2_SPARC5
)
17190 printf ("%ssparc5", first
? "" : "|"), first
= false;
17191 if (mask
& ELF_SPARC_HWCAP2_MWAIT
)
17192 printf ("%smwait", first
? "" : "|"), first
= false;
17193 if (mask
& ELF_SPARC_HWCAP2_XMPMUL
)
17194 printf ("%sxmpmul", first
? "" : "|"), first
= false;
17195 if (mask
& ELF_SPARC_HWCAP2_XMONT
)
17196 printf ("%sxmont2", first
? "" : "|"), first
= false;
17197 if (mask
& ELF_SPARC_HWCAP2_NSEC
)
17198 printf ("%snsec", first
? "" : "|"), first
= false;
17199 if (mask
& ELF_SPARC_HWCAP2_FJATHHPC
)
17200 printf ("%sfjathhpc", first
? "" : "|"), first
= false;
17201 if (mask
& ELF_SPARC_HWCAP2_FJDES
)
17202 printf ("%sfjdes", first
? "" : "|"), first
= false;
17203 if (mask
& ELF_SPARC_HWCAP2_FJAES
)
17204 printf ("%sfjaes", first
? "" : "|"), first
= false;
17207 fputc ('0', stdout
);
17208 fputc ('\n', stdout
);
17211 static unsigned char *
17212 display_sparc_gnu_attribute (unsigned char * p
,
17214 const unsigned char * const end
)
17218 if (tag
== Tag_GNU_Sparc_HWCAPS
)
17220 READ_ULEB (val
, p
, end
);
17221 printf (" Tag_GNU_Sparc_HWCAPS: ");
17222 display_sparc_hwcaps (val
);
17225 if (tag
== Tag_GNU_Sparc_HWCAPS2
)
17227 READ_ULEB (val
, p
, end
);
17228 printf (" Tag_GNU_Sparc_HWCAPS2: ");
17229 display_sparc_hwcaps2 (val
);
17233 return display_tag_value (tag
, p
, end
);
17237 print_mips_fp_abi_value (unsigned int val
)
17241 case Val_GNU_MIPS_ABI_FP_ANY
:
17242 printf (_("Hard or soft float\n"));
17244 case Val_GNU_MIPS_ABI_FP_DOUBLE
:
17245 printf (_("Hard float (double precision)\n"));
17247 case Val_GNU_MIPS_ABI_FP_SINGLE
:
17248 printf (_("Hard float (single precision)\n"));
17250 case Val_GNU_MIPS_ABI_FP_SOFT
:
17251 printf (_("Soft float\n"));
17253 case Val_GNU_MIPS_ABI_FP_OLD_64
:
17254 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
17256 case Val_GNU_MIPS_ABI_FP_XX
:
17257 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
17259 case Val_GNU_MIPS_ABI_FP_64
:
17260 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
17262 case Val_GNU_MIPS_ABI_FP_64A
:
17263 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
17265 case Val_GNU_MIPS_ABI_FP_NAN2008
:
17266 printf (_("NaN 2008 compatibility\n"));
17269 printf ("??? (%d)\n", val
);
17274 static unsigned char *
17275 display_mips_gnu_attribute (unsigned char * p
,
17277 const unsigned char * const end
)
17279 if (tag
== Tag_GNU_MIPS_ABI_FP
)
17283 printf (" Tag_GNU_MIPS_ABI_FP: ");
17284 READ_ULEB (val
, p
, end
);
17285 print_mips_fp_abi_value (val
);
17289 if (tag
== Tag_GNU_MIPS_ABI_MSA
)
17293 printf (" Tag_GNU_MIPS_ABI_MSA: ");
17294 READ_ULEB (val
, p
, end
);
17298 case Val_GNU_MIPS_ABI_MSA_ANY
:
17299 printf (_("Any MSA or not\n"));
17301 case Val_GNU_MIPS_ABI_MSA_128
:
17302 printf (_("128-bit MSA\n"));
17305 printf ("??? (%d)\n", val
);
17311 return display_tag_value (tag
& 1, p
, end
);
17314 static unsigned char *
17315 display_tic6x_attribute (unsigned char * p
,
17316 const unsigned char * const end
)
17321 READ_ULEB (tag
, p
, end
);
17326 printf (" Tag_ISA: ");
17327 READ_ULEB (val
, p
, end
);
17331 case C6XABI_Tag_ISA_none
:
17332 printf (_("None\n"));
17334 case C6XABI_Tag_ISA_C62X
:
17337 case C6XABI_Tag_ISA_C67X
:
17340 case C6XABI_Tag_ISA_C67XP
:
17341 printf ("C67x+\n");
17343 case C6XABI_Tag_ISA_C64X
:
17346 case C6XABI_Tag_ISA_C64XP
:
17347 printf ("C64x+\n");
17349 case C6XABI_Tag_ISA_C674X
:
17350 printf ("C674x\n");
17353 printf ("??? (%d)\n", val
);
17358 case Tag_ABI_wchar_t
:
17359 printf (" Tag_ABI_wchar_t: ");
17360 READ_ULEB (val
, p
, end
);
17364 printf (_("Not used\n"));
17367 printf (_("2 bytes\n"));
17370 printf (_("4 bytes\n"));
17373 printf ("??? (%d)\n", val
);
17378 case Tag_ABI_stack_align_needed
:
17379 printf (" Tag_ABI_stack_align_needed: ");
17380 READ_ULEB (val
, p
, end
);
17384 printf (_("8-byte\n"));
17387 printf (_("16-byte\n"));
17390 printf ("??? (%d)\n", val
);
17395 case Tag_ABI_stack_align_preserved
:
17396 READ_ULEB (val
, p
, end
);
17397 printf (" Tag_ABI_stack_align_preserved: ");
17401 printf (_("8-byte\n"));
17404 printf (_("16-byte\n"));
17407 printf ("??? (%d)\n", val
);
17413 READ_ULEB (val
, p
, end
);
17414 printf (" Tag_ABI_DSBT: ");
17418 printf (_("DSBT addressing not used\n"));
17421 printf (_("DSBT addressing used\n"));
17424 printf ("??? (%d)\n", val
);
17430 READ_ULEB (val
, p
, end
);
17431 printf (" Tag_ABI_PID: ");
17435 printf (_("Data addressing position-dependent\n"));
17438 printf (_("Data addressing position-independent, GOT near DP\n"));
17441 printf (_("Data addressing position-independent, GOT far from DP\n"));
17444 printf ("??? (%d)\n", val
);
17450 READ_ULEB (val
, p
, end
);
17451 printf (" Tag_ABI_PIC: ");
17455 printf (_("Code addressing position-dependent\n"));
17458 printf (_("Code addressing position-independent\n"));
17461 printf ("??? (%d)\n", val
);
17466 case Tag_ABI_array_object_alignment
:
17467 READ_ULEB (val
, p
, end
);
17468 printf (" Tag_ABI_array_object_alignment: ");
17472 printf (_("8-byte\n"));
17475 printf (_("4-byte\n"));
17478 printf (_("16-byte\n"));
17481 printf ("??? (%d)\n", val
);
17486 case Tag_ABI_array_object_align_expected
:
17487 READ_ULEB (val
, p
, end
);
17488 printf (" Tag_ABI_array_object_align_expected: ");
17492 printf (_("8-byte\n"));
17495 printf (_("4-byte\n"));
17498 printf (_("16-byte\n"));
17501 printf ("??? (%d)\n", val
);
17506 case Tag_ABI_compatibility
:
17508 READ_ULEB (val
, p
, end
);
17509 printf (" Tag_ABI_compatibility: ");
17510 printf (_("flag = %d, vendor = "), val
);
17513 size_t maxlen
= (end
- p
) - 1;
17515 print_symbol ((int) maxlen
, (const char *) p
);
17516 p
+= strnlen ((char *) p
, maxlen
) + 1;
17520 printf (_("<corrupt>"));
17521 p
= (unsigned char *) end
;
17527 case Tag_ABI_conformance
:
17529 printf (" Tag_ABI_conformance: \"");
17532 size_t maxlen
= (end
- p
) - 1;
17534 print_symbol ((int) maxlen
, (const char *) p
);
17535 p
+= strnlen ((char *) p
, maxlen
) + 1;
17539 printf (_("<corrupt>"));
17540 p
= (unsigned char *) end
;
17547 return display_tag_value (tag
, p
, end
);
17551 display_raw_attribute (unsigned char * p
, unsigned char const * const end
)
17553 unsigned long addr
= 0;
17554 size_t bytes
= end
- p
;
17561 int lbytes
= (bytes
> 16 ? 16 : bytes
);
17563 printf (" 0x%8.8lx ", addr
);
17565 for (j
= 0; j
< 16; j
++)
17568 printf ("%2.2x", p
[j
]);
17576 for (j
= 0; j
< lbytes
; j
++)
17579 if (k
>= ' ' && k
< 0x7f)
17595 static unsigned char *
17596 display_msp430_attribute (unsigned char * p
,
17597 const unsigned char * const end
)
17602 READ_ULEB (tag
, p
, end
);
17606 case OFBA_MSPABI_Tag_ISA
:
17607 printf (" Tag_ISA: ");
17608 READ_ULEB (val
, p
, end
);
17611 case 0: printf (_("None\n")); break;
17612 case 1: printf (_("MSP430\n")); break;
17613 case 2: printf (_("MSP430X\n")); break;
17614 default: printf ("??? (%d)\n", val
); break;
17618 case OFBA_MSPABI_Tag_Code_Model
:
17619 printf (" Tag_Code_Model: ");
17620 READ_ULEB (val
, p
, end
);
17623 case 0: printf (_("None\n")); break;
17624 case 1: printf (_("Small\n")); break;
17625 case 2: printf (_("Large\n")); break;
17626 default: printf ("??? (%d)\n", val
); break;
17630 case OFBA_MSPABI_Tag_Data_Model
:
17631 printf (" Tag_Data_Model: ");
17632 READ_ULEB (val
, p
, end
);
17635 case 0: printf (_("None\n")); break;
17636 case 1: printf (_("Small\n")); break;
17637 case 2: printf (_("Large\n")); break;
17638 case 3: printf (_("Restricted Large\n")); break;
17639 default: printf ("??? (%d)\n", val
); break;
17644 printf (_(" <unknown tag %d>: "), tag
);
17651 size_t maxlen
= (end
- p
) - 1;
17653 print_symbol ((int) maxlen
, (const char *) p
);
17654 p
+= strnlen ((char *) p
, maxlen
) + 1;
17658 printf (_("<corrupt>"));
17659 p
= (unsigned char *) end
;
17665 READ_ULEB (val
, p
, end
);
17666 printf ("%d (0x%x)\n", val
, val
);
17675 static unsigned char *
17676 display_msp430_gnu_attribute (unsigned char * p
,
17678 const unsigned char * const end
)
17680 if (tag
== Tag_GNU_MSP430_Data_Region
)
17684 printf (" Tag_GNU_MSP430_Data_Region: ");
17685 READ_ULEB (val
, p
, end
);
17689 case Val_GNU_MSP430_Data_Region_Any
:
17690 printf (_("Any Region\n"));
17692 case Val_GNU_MSP430_Data_Region_Lower
:
17693 printf (_("Lower Region Only\n"));
17696 printf ("??? (%u)\n", val
);
17700 return display_tag_value (tag
& 1, p
, end
);
17703 struct riscv_attr_tag_t
{
17708 static struct riscv_attr_tag_t riscv_attr_tag
[] =
17710 #define T(tag) {"Tag_RISCV_" #tag, Tag_RISCV_##tag}
17713 T(priv_spec_minor
),
17714 T(priv_spec_revision
),
17715 T(unaligned_access
),
17720 static unsigned char *
17721 display_riscv_attribute (unsigned char *p
,
17722 const unsigned char * const end
)
17726 struct riscv_attr_tag_t
*attr
= NULL
;
17729 READ_ULEB (tag
, p
, end
);
17731 /* Find the name of attribute. */
17732 for (i
= 0; i
< ARRAY_SIZE (riscv_attr_tag
); i
++)
17734 if (riscv_attr_tag
[i
].tag
== tag
)
17736 attr
= &riscv_attr_tag
[i
];
17742 printf (" %s: ", attr
->name
);
17744 return display_tag_value (tag
, p
, end
);
17748 case Tag_RISCV_priv_spec
:
17749 case Tag_RISCV_priv_spec_minor
:
17750 case Tag_RISCV_priv_spec_revision
:
17751 READ_ULEB (val
, p
, end
);
17752 printf (_("%u\n"), val
);
17754 case Tag_RISCV_unaligned_access
:
17755 READ_ULEB (val
, p
, end
);
17759 printf (_("No unaligned access\n"));
17762 printf (_("Unaligned access\n"));
17766 case Tag_RISCV_stack_align
:
17767 READ_ULEB (val
, p
, end
);
17768 printf (_("%u-bytes\n"), val
);
17770 case Tag_RISCV_arch
:
17771 p
= display_tag_value (-1, p
, end
);
17774 return display_tag_value (tag
, p
, end
);
17780 static unsigned char *
17781 display_csky_attribute (unsigned char * p
,
17782 const unsigned char * const end
)
17786 READ_ULEB (tag
, p
, end
);
17788 if (tag
>= Tag_CSKY_MAX
)
17790 return display_tag_value (-1, p
, end
);
17795 case Tag_CSKY_ARCH_NAME
:
17796 printf (" Tag_CSKY_ARCH_NAME:\t\t");
17797 return display_tag_value (-1, p
, end
);
17798 case Tag_CSKY_CPU_NAME
:
17799 printf (" Tag_CSKY_CPU_NAME:\t\t");
17800 return display_tag_value (-1, p
, end
);
17802 case Tag_CSKY_ISA_FLAGS
:
17803 printf (" Tag_CSKY_ISA_FLAGS:\t\t");
17804 return display_tag_value (0, p
, end
);
17805 case Tag_CSKY_ISA_EXT_FLAGS
:
17806 printf (" Tag_CSKY_ISA_EXT_FLAGS:\t");
17807 return display_tag_value (0, p
, end
);
17809 case Tag_CSKY_DSP_VERSION
:
17810 printf (" Tag_CSKY_DSP_VERSION:\t\t");
17811 READ_ULEB (val
, p
, end
);
17812 if (val
== VAL_CSKY_DSP_VERSION_EXTENSION
)
17813 printf ("DSP Extension\n");
17814 else if (val
== VAL_CSKY_DSP_VERSION_2
)
17815 printf ("DSP 2.0\n");
17818 case Tag_CSKY_VDSP_VERSION
:
17819 printf (" Tag_CSKY_VDSP_VERSION:\t");
17820 READ_ULEB (val
, p
, end
);
17821 printf ("VDSP Version %d\n", val
);
17824 case Tag_CSKY_FPU_VERSION
:
17825 printf (" Tag_CSKY_FPU_VERSION:\t\t");
17826 READ_ULEB (val
, p
, end
);
17827 if (val
== VAL_CSKY_FPU_VERSION_1
)
17828 printf ("ABIV1 FPU Version 1\n");
17829 else if (val
== VAL_CSKY_FPU_VERSION_2
)
17830 printf ("FPU Version 2\n");
17833 case Tag_CSKY_FPU_ABI
:
17834 printf (" Tag_CSKY_FPU_ABI:\t\t");
17835 READ_ULEB (val
, p
, end
);
17836 if (val
== VAL_CSKY_FPU_ABI_HARD
)
17838 else if (val
== VAL_CSKY_FPU_ABI_SOFTFP
)
17839 printf ("SoftFP\n");
17840 else if (val
== VAL_CSKY_FPU_ABI_SOFT
)
17843 case Tag_CSKY_FPU_ROUNDING
:
17844 READ_ULEB (val
, p
, end
);
17847 printf (" Tag_CSKY_FPU_ROUNDING:\t");
17848 printf ("Needed\n");
17851 case Tag_CSKY_FPU_DENORMAL
:
17852 READ_ULEB (val
, p
, end
);
17855 printf (" Tag_CSKY_FPU_DENORMAL:\t");
17856 printf ("Needed\n");
17859 case Tag_CSKY_FPU_Exception
:
17860 READ_ULEB (val
, p
, end
);
17863 printf (" Tag_CSKY_FPU_Exception:\t");
17864 printf ("Needed\n");
17867 case Tag_CSKY_FPU_NUMBER_MODULE
:
17868 printf (" Tag_CSKY_FPU_NUMBER_MODULE:\t");
17869 return display_tag_value (-1, p
, end
);
17870 case Tag_CSKY_FPU_HARDFP
:
17871 printf (" Tag_CSKY_FPU_HARDFP:\t\t");
17872 READ_ULEB (val
, p
, end
);
17873 if (val
& VAL_CSKY_FPU_HARDFP_HALF
)
17875 if (val
& VAL_CSKY_FPU_HARDFP_SINGLE
)
17876 printf (" Single");
17877 if (val
& VAL_CSKY_FPU_HARDFP_DOUBLE
)
17878 printf (" Double");
17882 return display_tag_value (tag
, p
, end
);
17888 process_attributes (Filedata
* filedata
,
17889 const char * public_name
,
17890 unsigned int proc_type
,
17891 unsigned char * (* display_pub_attribute
) (unsigned char *, const unsigned char * const),
17892 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, unsigned int, const unsigned char * const))
17894 Elf_Internal_Shdr
* sect
;
17898 /* Find the section header so that we get the size. */
17899 for (i
= 0, sect
= filedata
->section_headers
;
17900 i
< filedata
->file_header
.e_shnum
;
17903 unsigned char * contents
;
17906 if (sect
->sh_type
!= proc_type
&& sect
->sh_type
!= SHT_GNU_ATTRIBUTES
)
17909 contents
= (unsigned char *) get_data (NULL
, filedata
, sect
->sh_offset
, 1,
17910 sect
->sh_size
, _("attributes"));
17911 if (contents
== NULL
)
17918 /* The first character is the version of the attributes.
17919 Currently only version 1, (aka 'A') is recognised here. */
17922 printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p
, *p
);
17927 bfd_vma section_len
;
17929 section_len
= sect
->sh_size
- 1;
17932 while (section_len
> 0)
17935 unsigned int namelen
;
17936 bool public_section
;
17939 if (section_len
<= 4)
17941 error (_("Tag section ends prematurely\n"));
17945 attr_len
= byte_get (p
, 4);
17948 if (attr_len
> section_len
)
17950 error (_("Bad attribute length (%u > %u)\n"),
17951 (unsigned) attr_len
, (unsigned) section_len
);
17952 attr_len
= section_len
;
17955 /* PR 17531: file: 001-101425-0.004 */
17956 else if (attr_len
< 5)
17958 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len
);
17963 section_len
-= attr_len
;
17966 namelen
= strnlen ((char *) p
, attr_len
) + 1;
17967 if (namelen
== 0 || namelen
>= attr_len
)
17969 error (_("Corrupt attribute section name\n"));
17974 printf (_("Attribute Section: "));
17975 print_symbol (INT_MAX
, (const char *) p
);
17978 if (public_name
&& streq ((char *) p
, public_name
))
17979 public_section
= true;
17981 public_section
= false;
17983 if (streq ((char *) p
, "gnu"))
17984 gnu_section
= true;
17986 gnu_section
= false;
17989 attr_len
-= namelen
;
17991 while (attr_len
> 0 && p
< contents
+ sect
->sh_size
)
17996 unsigned char * end
;
17998 /* PR binutils/17531: Safe handling of corrupt files. */
18001 error (_("Unused bytes at end of section\n"));
18008 size
= byte_get (p
, 4);
18009 if (size
> attr_len
)
18011 error (_("Bad subsection length (%u > %u)\n"),
18012 (unsigned) size
, (unsigned) attr_len
);
18016 /* PR binutils/17531: Safe handling of corrupt files. */
18019 error (_("Bad subsection length (%u < 6)\n"),
18027 end
= p
+ size
- 1;
18028 assert (end
<= contents
+ sect
->sh_size
);
18034 printf (_("File Attributes\n"));
18037 printf (_("Section Attributes:"));
18040 printf (_("Symbol Attributes:"));
18041 /* Fall through. */
18045 READ_ULEB (val
, p
, end
);
18048 printf (" %d", val
);
18053 printf (_("Unknown tag: %d\n"), tag
);
18054 public_section
= false;
18058 if (public_section
&& display_pub_attribute
!= NULL
)
18061 p
= display_pub_attribute (p
, end
);
18064 else if (gnu_section
&& display_proc_gnu_attribute
!= NULL
)
18067 p
= display_gnu_attribute (p
,
18068 display_proc_gnu_attribute
,
18074 printf (_(" Unknown attribute:\n"));
18075 display_raw_attribute (p
, end
);
18090 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
18091 Print the Address, Access and Initial fields of an entry at VMA ADDR
18092 and return the VMA of the next entry, or -1 if there was a problem.
18093 Does not read from DATA_END or beyond. */
18096 print_mips_got_entry (unsigned char * data
, bfd_vma pltgot
, bfd_vma addr
,
18097 unsigned char * data_end
)
18100 print_vma (addr
, LONG_HEX
);
18102 if (addr
< pltgot
+ 0xfff0)
18103 printf ("%6d(gp)", (int) (addr
- pltgot
- 0x7ff0));
18105 printf ("%10s", "");
18108 printf ("%*s", is_32bit_elf
? 8 : 16, _("<unknown>"));
18112 unsigned char * from
= data
+ addr
- pltgot
;
18114 if (from
+ (is_32bit_elf
? 4 : 8) > data_end
)
18116 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
18117 printf ("%*s", is_32bit_elf
? 8 : 16, _("<corrupt>"));
18118 return (bfd_vma
) -1;
18122 entry
= byte_get (data
+ addr
- pltgot
, is_32bit_elf
? 4 : 8);
18123 print_vma (entry
, LONG_HEX
);
18126 return addr
+ (is_32bit_elf
? 4 : 8);
18129 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
18130 PLTGOT. Print the Address and Initial fields of an entry at VMA
18131 ADDR and return the VMA of the next entry. */
18134 print_mips_pltgot_entry (unsigned char * data
, bfd_vma pltgot
, bfd_vma addr
)
18137 print_vma (addr
, LONG_HEX
);
18140 printf ("%*s", is_32bit_elf
? 8 : 16, _("<unknown>"));
18145 entry
= byte_get (data
+ addr
- pltgot
, is_32bit_elf
? 4 : 8);
18146 print_vma (entry
, LONG_HEX
);
18148 return addr
+ (is_32bit_elf
? 4 : 8);
18152 print_mips_ases (unsigned int mask
)
18154 if (mask
& AFL_ASE_DSP
)
18155 fputs ("\n\tDSP ASE", stdout
);
18156 if (mask
& AFL_ASE_DSPR2
)
18157 fputs ("\n\tDSP R2 ASE", stdout
);
18158 if (mask
& AFL_ASE_DSPR3
)
18159 fputs ("\n\tDSP R3 ASE", stdout
);
18160 if (mask
& AFL_ASE_EVA
)
18161 fputs ("\n\tEnhanced VA Scheme", stdout
);
18162 if (mask
& AFL_ASE_MCU
)
18163 fputs ("\n\tMCU (MicroController) ASE", stdout
);
18164 if (mask
& AFL_ASE_MDMX
)
18165 fputs ("\n\tMDMX ASE", stdout
);
18166 if (mask
& AFL_ASE_MIPS3D
)
18167 fputs ("\n\tMIPS-3D ASE", stdout
);
18168 if (mask
& AFL_ASE_MT
)
18169 fputs ("\n\tMT ASE", stdout
);
18170 if (mask
& AFL_ASE_SMARTMIPS
)
18171 fputs ("\n\tSmartMIPS ASE", stdout
);
18172 if (mask
& AFL_ASE_VIRT
)
18173 fputs ("\n\tVZ ASE", stdout
);
18174 if (mask
& AFL_ASE_MSA
)
18175 fputs ("\n\tMSA ASE", stdout
);
18176 if (mask
& AFL_ASE_MIPS16
)
18177 fputs ("\n\tMIPS16 ASE", stdout
);
18178 if (mask
& AFL_ASE_MICROMIPS
)
18179 fputs ("\n\tMICROMIPS ASE", stdout
);
18180 if (mask
& AFL_ASE_XPA
)
18181 fputs ("\n\tXPA ASE", stdout
);
18182 if (mask
& AFL_ASE_MIPS16E2
)
18183 fputs ("\n\tMIPS16e2 ASE", stdout
);
18184 if (mask
& AFL_ASE_CRC
)
18185 fputs ("\n\tCRC ASE", stdout
);
18186 if (mask
& AFL_ASE_GINV
)
18187 fputs ("\n\tGINV ASE", stdout
);
18188 if (mask
& AFL_ASE_LOONGSON_MMI
)
18189 fputs ("\n\tLoongson MMI ASE", stdout
);
18190 if (mask
& AFL_ASE_LOONGSON_CAM
)
18191 fputs ("\n\tLoongson CAM ASE", stdout
);
18192 if (mask
& AFL_ASE_LOONGSON_EXT
)
18193 fputs ("\n\tLoongson EXT ASE", stdout
);
18194 if (mask
& AFL_ASE_LOONGSON_EXT2
)
18195 fputs ("\n\tLoongson EXT2 ASE", stdout
);
18197 fprintf (stdout
, "\n\t%s", _("None"));
18198 else if ((mask
& ~AFL_ASE_MASK
) != 0)
18199 fprintf (stdout
, "\n\t%s (%x)", _("Unknown"), mask
& ~AFL_ASE_MASK
);
18203 print_mips_isa_ext (unsigned int isa_ext
)
18208 fputs (_("None"), stdout
);
18211 fputs ("RMI XLR", stdout
);
18213 case AFL_EXT_OCTEON3
:
18214 fputs ("Cavium Networks Octeon3", stdout
);
18216 case AFL_EXT_OCTEON2
:
18217 fputs ("Cavium Networks Octeon2", stdout
);
18219 case AFL_EXT_OCTEONP
:
18220 fputs ("Cavium Networks OcteonP", stdout
);
18222 case AFL_EXT_OCTEON
:
18223 fputs ("Cavium Networks Octeon", stdout
);
18226 fputs ("Toshiba R5900", stdout
);
18229 fputs ("MIPS R4650", stdout
);
18232 fputs ("LSI R4010", stdout
);
18235 fputs ("NEC VR4100", stdout
);
18238 fputs ("Toshiba R3900", stdout
);
18240 case AFL_EXT_10000
:
18241 fputs ("MIPS R10000", stdout
);
18244 fputs ("Broadcom SB-1", stdout
);
18247 fputs ("NEC VR4111/VR4181", stdout
);
18250 fputs ("NEC VR4120", stdout
);
18253 fputs ("NEC VR5400", stdout
);
18256 fputs ("NEC VR5500", stdout
);
18258 case AFL_EXT_LOONGSON_2E
:
18259 fputs ("ST Microelectronics Loongson 2E", stdout
);
18261 case AFL_EXT_LOONGSON_2F
:
18262 fputs ("ST Microelectronics Loongson 2F", stdout
);
18264 case AFL_EXT_INTERAPTIV_MR2
:
18265 fputs ("Imagination interAptiv MR2", stdout
);
18268 fprintf (stdout
, "%s (%d)", _("Unknown"), isa_ext
);
18273 get_mips_reg_size (int reg_size
)
18275 return (reg_size
== AFL_REG_NONE
) ? 0
18276 : (reg_size
== AFL_REG_32
) ? 32
18277 : (reg_size
== AFL_REG_64
) ? 64
18278 : (reg_size
== AFL_REG_128
) ? 128
18283 process_mips_specific (Filedata
* filedata
)
18285 Elf_Internal_Dyn
* entry
;
18286 Elf_Internal_Shdr
*sect
= NULL
;
18287 size_t liblist_offset
= 0;
18288 size_t liblistno
= 0;
18289 size_t conflictsno
= 0;
18290 size_t options_offset
= 0;
18291 size_t conflicts_offset
= 0;
18292 size_t pltrelsz
= 0;
18294 bfd_vma pltgot
= 0;
18295 bfd_vma mips_pltgot
= 0;
18296 bfd_vma jmprel
= 0;
18297 bfd_vma local_gotno
= 0;
18298 bfd_vma gotsym
= 0;
18299 bfd_vma symtabno
= 0;
18302 if (! process_attributes (filedata
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
18303 display_mips_gnu_attribute
))
18306 sect
= find_section (filedata
, ".MIPS.abiflags");
18310 Elf_External_ABIFlags_v0
*abiflags_ext
;
18311 Elf_Internal_ABIFlags_v0 abiflags_in
;
18313 if (sizeof (Elf_External_ABIFlags_v0
) != sect
->sh_size
)
18315 error (_("Corrupt MIPS ABI Flags section.\n"));
18320 abiflags_ext
= get_data (NULL
, filedata
, sect
->sh_offset
, 1,
18321 sect
->sh_size
, _("MIPS ABI Flags section"));
18324 abiflags_in
.version
= BYTE_GET (abiflags_ext
->version
);
18325 abiflags_in
.isa_level
= BYTE_GET (abiflags_ext
->isa_level
);
18326 abiflags_in
.isa_rev
= BYTE_GET (abiflags_ext
->isa_rev
);
18327 abiflags_in
.gpr_size
= BYTE_GET (abiflags_ext
->gpr_size
);
18328 abiflags_in
.cpr1_size
= BYTE_GET (abiflags_ext
->cpr1_size
);
18329 abiflags_in
.cpr2_size
= BYTE_GET (abiflags_ext
->cpr2_size
);
18330 abiflags_in
.fp_abi
= BYTE_GET (abiflags_ext
->fp_abi
);
18331 abiflags_in
.isa_ext
= BYTE_GET (abiflags_ext
->isa_ext
);
18332 abiflags_in
.ases
= BYTE_GET (abiflags_ext
->ases
);
18333 abiflags_in
.flags1
= BYTE_GET (abiflags_ext
->flags1
);
18334 abiflags_in
.flags2
= BYTE_GET (abiflags_ext
->flags2
);
18336 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in
.version
);
18337 printf ("\nISA: MIPS%d", abiflags_in
.isa_level
);
18338 if (abiflags_in
.isa_rev
> 1)
18339 printf ("r%d", abiflags_in
.isa_rev
);
18340 printf ("\nGPR size: %d",
18341 get_mips_reg_size (abiflags_in
.gpr_size
));
18342 printf ("\nCPR1 size: %d",
18343 get_mips_reg_size (abiflags_in
.cpr1_size
));
18344 printf ("\nCPR2 size: %d",
18345 get_mips_reg_size (abiflags_in
.cpr2_size
));
18346 fputs ("\nFP ABI: ", stdout
);
18347 print_mips_fp_abi_value (abiflags_in
.fp_abi
);
18348 fputs ("ISA Extension: ", stdout
);
18349 print_mips_isa_ext (abiflags_in
.isa_ext
);
18350 fputs ("\nASEs:", stdout
);
18351 print_mips_ases (abiflags_in
.ases
);
18352 printf ("\nFLAGS 1: %8.8lx", abiflags_in
.flags1
);
18353 printf ("\nFLAGS 2: %8.8lx", abiflags_in
.flags2
);
18354 fputc ('\n', stdout
);
18355 free (abiflags_ext
);
18360 /* We have a lot of special sections. Thanks SGI! */
18361 if (filedata
->dynamic_section
== NULL
)
18363 /* No dynamic information available. See if there is static GOT. */
18364 sect
= find_section (filedata
, ".got");
18367 unsigned char *data_end
;
18368 unsigned char *data
;
18372 pltgot
= sect
->sh_addr
;
18375 addr_size
= (is_32bit_elf
? 4 : 8);
18376 end
= pltgot
+ sect
->sh_size
;
18378 data
= (unsigned char *) get_data (NULL
, filedata
, sect
->sh_offset
,
18380 _("Global Offset Table data"));
18381 /* PR 12855: Null data is handled gracefully throughout. */
18382 data_end
= data
+ (end
- pltgot
);
18384 printf (_("\nStatic GOT:\n"));
18385 printf (_(" Canonical gp value: "));
18386 print_vma (ent
+ 0x7ff0, LONG_HEX
);
18389 /* In a dynamic binary GOT[0] is reserved for the dynamic
18390 loader to store the lazy resolver pointer, however in
18391 a static binary it may well have been omitted and GOT
18392 reduced to a table of addresses.
18393 PR 21344: Check for the entry being fully available
18394 before fetching it. */
18396 && data
+ ent
- pltgot
+ addr_size
<= data_end
18397 && byte_get (data
+ ent
- pltgot
, addr_size
) == 0)
18399 printf (_(" Reserved entries:\n"));
18400 printf (_(" %*s %10s %*s\n"),
18401 addr_size
* 2, _("Address"), _("Access"),
18402 addr_size
* 2, _("Value"));
18403 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
18405 if (ent
== (bfd_vma
) -1)
18406 goto sgot_print_fail
;
18408 /* Check for the MSB of GOT[1] being set, identifying a
18409 GNU object. This entry will be used by some runtime
18410 loaders, to store the module pointer. Otherwise this
18411 is an ordinary local entry.
18412 PR 21344: Check for the entry being fully available
18413 before fetching it. */
18415 && data
+ ent
- pltgot
+ addr_size
<= data_end
18416 && (byte_get (data
+ ent
- pltgot
, addr_size
)
18417 >> (addr_size
* 8 - 1)) != 0)
18419 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
18421 if (ent
== (bfd_vma
) -1)
18422 goto sgot_print_fail
;
18427 if (data
!= NULL
&& ent
< end
)
18429 printf (_(" Local entries:\n"));
18430 printf (" %*s %10s %*s\n",
18431 addr_size
* 2, _("Address"), _("Access"),
18432 addr_size
* 2, _("Value"));
18435 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
18437 if (ent
== (bfd_vma
) -1)
18438 goto sgot_print_fail
;
18449 for (entry
= filedata
->dynamic_section
;
18450 /* PR 17531 file: 012-50589-0.004. */
18451 (entry
< filedata
->dynamic_section
+ filedata
->dynamic_nent
18452 && entry
->d_tag
!= DT_NULL
);
18454 switch (entry
->d_tag
)
18456 case DT_MIPS_LIBLIST
:
18458 = offset_from_vma (filedata
, entry
->d_un
.d_val
,
18459 liblistno
* sizeof (Elf32_External_Lib
));
18461 case DT_MIPS_LIBLISTNO
:
18462 liblistno
= entry
->d_un
.d_val
;
18464 case DT_MIPS_OPTIONS
:
18465 options_offset
= offset_from_vma (filedata
, entry
->d_un
.d_val
, 0);
18467 case DT_MIPS_CONFLICT
:
18469 = offset_from_vma (filedata
, entry
->d_un
.d_val
,
18470 conflictsno
* sizeof (Elf32_External_Conflict
));
18472 case DT_MIPS_CONFLICTNO
:
18473 conflictsno
= entry
->d_un
.d_val
;
18476 pltgot
= entry
->d_un
.d_ptr
;
18478 case DT_MIPS_LOCAL_GOTNO
:
18479 local_gotno
= entry
->d_un
.d_val
;
18481 case DT_MIPS_GOTSYM
:
18482 gotsym
= entry
->d_un
.d_val
;
18484 case DT_MIPS_SYMTABNO
:
18485 symtabno
= entry
->d_un
.d_val
;
18487 case DT_MIPS_PLTGOT
:
18488 mips_pltgot
= entry
->d_un
.d_ptr
;
18491 pltrel
= entry
->d_un
.d_val
;
18494 pltrelsz
= entry
->d_un
.d_val
;
18497 jmprel
= entry
->d_un
.d_ptr
;
18503 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
18505 Elf32_External_Lib
* elib
;
18508 elib
= (Elf32_External_Lib
*) get_data (NULL
, filedata
, liblist_offset
,
18509 sizeof (Elf32_External_Lib
),
18511 _("liblist section data"));
18514 printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
18515 "\nSection '.liblist' contains %lu entries:\n",
18516 (unsigned long) liblistno
),
18517 (unsigned long) liblistno
);
18518 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
18521 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
18528 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
18529 atime
= BYTE_GET (elib
[cnt
].l_time_stamp
);
18530 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
18531 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
18532 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
18534 tmp
= gmtime (&atime
);
18535 snprintf (timebuf
, sizeof (timebuf
),
18536 "%04u-%02u-%02uT%02u:%02u:%02u",
18537 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
18538 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
18540 printf ("%3lu: ", (unsigned long) cnt
);
18541 if (valid_dynamic_name (filedata
, liblist
.l_name
))
18542 print_symbol (20, get_dynamic_name (filedata
, liblist
.l_name
));
18544 printf (_("<corrupt: %9ld>"), liblist
.l_name
);
18545 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
18546 liblist
.l_version
);
18548 if (liblist
.l_flags
== 0)
18552 static const struct
18559 { " EXACT_MATCH", LL_EXACT_MATCH
},
18560 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
18561 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
18562 { " EXPORTS", LL_EXPORTS
},
18563 { " DELAY_LOAD", LL_DELAY_LOAD
},
18564 { " DELTA", LL_DELTA
}
18566 int flags
= liblist
.l_flags
;
18569 for (fcnt
= 0; fcnt
< ARRAY_SIZE (l_flags_vals
); ++fcnt
)
18570 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
18572 fputs (l_flags_vals
[fcnt
].name
, stdout
);
18573 flags
^= l_flags_vals
[fcnt
].bit
;
18576 printf (" %#x", (unsigned int) flags
);
18588 if (options_offset
!= 0)
18590 Elf_External_Options
* eopt
;
18594 /* Find the section header so that we get the size. */
18595 sect
= find_section_by_type (filedata
, SHT_MIPS_OPTIONS
);
18596 /* PR 17533 file: 012-277276-0.004. */
18599 error (_("No MIPS_OPTIONS header found\n"));
18603 if (sect
->sh_size
< sizeof (* eopt
))
18605 error (_("The MIPS options section is too small.\n"));
18609 eopt
= (Elf_External_Options
*) get_data (NULL
, filedata
, options_offset
, 1,
18610 sect
->sh_size
, _("options"));
18613 Elf_Internal_Options option
;
18616 while (offset
<= sect
->sh_size
- sizeof (* eopt
))
18618 Elf_External_Options
* eoption
;
18619 unsigned int optsize
;
18621 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
18623 optsize
= BYTE_GET (eoption
->size
);
18625 /* PR 17531: file: ffa0fa3b. */
18626 if (optsize
< sizeof (* eopt
)
18627 || optsize
> sect
->sh_size
- offset
)
18629 error (_("Invalid size (%u) for MIPS option\n"),
18638 printf (ngettext ("\nSection '%s' contains %d entry:\n",
18639 "\nSection '%s' contains %d entries:\n",
18641 printable_section_name (filedata
, sect
), cnt
);
18647 Elf_External_Options
* eoption
;
18649 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
18651 option
.kind
= BYTE_GET (eoption
->kind
);
18652 option
.size
= BYTE_GET (eoption
->size
);
18653 option
.section
= BYTE_GET (eoption
->section
);
18654 option
.info
= BYTE_GET (eoption
->info
);
18656 switch (option
.kind
)
18659 /* This shouldn't happen. */
18660 printf (" NULL %" PRId16
" %" PRIx32
,
18661 option
.section
, option
.info
);
18665 printf (" REGINFO ");
18666 if (filedata
->file_header
.e_machine
== EM_MIPS
)
18668 Elf32_External_RegInfo
* ereg
;
18669 Elf32_RegInfo reginfo
;
18672 if (option
.size
< (sizeof (Elf_External_Options
)
18673 + sizeof (Elf32_External_RegInfo
)))
18675 printf (_("<corrupt>\n"));
18676 error (_("Truncated MIPS REGINFO option\n"));
18681 ereg
= (Elf32_External_RegInfo
*) (eoption
+ 1);
18683 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
18684 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
18685 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
18686 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
18687 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
18688 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
18690 printf ("GPR %08" PRIx32
" GP 0x%" PRIx32
"\n",
18691 reginfo
.ri_gprmask
, reginfo
.ri_gp_value
);
18693 " CPR0 %08" PRIx32
" CPR1 %08" PRIx32
18694 " CPR2 %08" PRIx32
" CPR3 %08" PRIx32
"\n",
18695 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
18696 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
18701 Elf64_External_RegInfo
* ereg
;
18702 Elf64_Internal_RegInfo reginfo
;
18704 if (option
.size
< (sizeof (Elf_External_Options
)
18705 + sizeof (Elf64_External_RegInfo
)))
18707 printf (_("<corrupt>\n"));
18708 error (_("Truncated MIPS REGINFO option\n"));
18713 ereg
= (Elf64_External_RegInfo
*) (eoption
+ 1);
18714 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
18715 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
18716 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
18717 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
18718 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
18719 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
18721 printf ("GPR %08" PRIx32
" GP 0x%" PRIx64
"\n",
18722 reginfo
.ri_gprmask
, reginfo
.ri_gp_value
);
18724 " CPR0 %08" PRIx32
" CPR1 %08" PRIx32
18725 " CPR2 %08" PRIx32
" CPR3 %08" PRIx32
"\n",
18726 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
18727 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
18729 offset
+= option
.size
;
18732 case ODK_EXCEPTIONS
:
18733 fputs (" EXCEPTIONS fpe_min(", stdout
);
18734 process_mips_fpe_exception (option
.info
& OEX_FPU_MIN
);
18735 fputs (") fpe_max(", stdout
);
18736 process_mips_fpe_exception ((option
.info
& OEX_FPU_MAX
) >> 8);
18737 fputs (")", stdout
);
18739 if (option
.info
& OEX_PAGE0
)
18740 fputs (" PAGE0", stdout
);
18741 if (option
.info
& OEX_SMM
)
18742 fputs (" SMM", stdout
);
18743 if (option
.info
& OEX_FPDBUG
)
18744 fputs (" FPDBUG", stdout
);
18745 if (option
.info
& OEX_DISMISS
)
18746 fputs (" DISMISS", stdout
);
18750 fputs (" PAD ", stdout
);
18751 if (option
.info
& OPAD_PREFIX
)
18752 fputs (" PREFIX", stdout
);
18753 if (option
.info
& OPAD_POSTFIX
)
18754 fputs (" POSTFIX", stdout
);
18755 if (option
.info
& OPAD_SYMBOL
)
18756 fputs (" SYMBOL", stdout
);
18760 fputs (" HWPATCH ", stdout
);
18761 if (option
.info
& OHW_R4KEOP
)
18762 fputs (" R4KEOP", stdout
);
18763 if (option
.info
& OHW_R8KPFETCH
)
18764 fputs (" R8KPFETCH", stdout
);
18765 if (option
.info
& OHW_R5KEOP
)
18766 fputs (" R5KEOP", stdout
);
18767 if (option
.info
& OHW_R5KCVTL
)
18768 fputs (" R5KCVTL", stdout
);
18772 fputs (" FILL ", stdout
);
18773 /* XXX Print content of info word? */
18777 fputs (" TAGS ", stdout
);
18778 /* XXX Print content of info word? */
18782 fputs (" HWAND ", stdout
);
18783 if (option
.info
& OHWA0_R4KEOP_CHECKED
)
18784 fputs (" R4KEOP_CHECKED", stdout
);
18785 if (option
.info
& OHWA0_R4KEOP_CLEAN
)
18786 fputs (" R4KEOP_CLEAN", stdout
);
18790 fputs (" HWOR ", stdout
);
18791 if (option
.info
& OHWA0_R4KEOP_CHECKED
)
18792 fputs (" R4KEOP_CHECKED", stdout
);
18793 if (option
.info
& OHWA0_R4KEOP_CLEAN
)
18794 fputs (" R4KEOP_CLEAN", stdout
);
18798 printf (" GP_GROUP %#06x self-contained %#06x",
18799 option
.info
& OGP_GROUP
,
18800 (option
.info
& OGP_SELF
) >> 16);
18804 printf (" IDENT %#06x self-contained %#06x",
18805 option
.info
& OGP_GROUP
,
18806 (option
.info
& OGP_SELF
) >> 16);
18810 /* This shouldn't happen. */
18811 printf (" %3d ??? %" PRId16
" %" PRIx32
,
18812 option
.kind
, option
.section
, option
.info
);
18816 len
= sizeof (* eopt
);
18817 while (len
< option
.size
)
18819 unsigned char datum
= *((unsigned char *) eoption
+ len
);
18821 if (ISPRINT (datum
))
18822 printf ("%c", datum
);
18824 printf ("\\%03o", datum
);
18827 fputs ("\n", stdout
);
18829 offset
+= option
.size
;
18837 if (conflicts_offset
!= 0 && conflictsno
!= 0)
18839 Elf32_Conflict
* iconf
;
18842 if (filedata
->dynamic_symbols
== NULL
)
18844 error (_("conflict list found without a dynamic symbol table\n"));
18848 /* PR 21345 - print a slightly more helpful error message
18849 if we are sure that the cmalloc will fail. */
18850 if (conflictsno
> filedata
->file_size
/ sizeof (* iconf
))
18852 error (_("Overlarge number of conflicts detected: %lx\n"),
18853 (long) conflictsno
);
18857 iconf
= (Elf32_Conflict
*) cmalloc (conflictsno
, sizeof (* iconf
));
18860 error (_("Out of memory allocating space for dynamic conflicts\n"));
18866 Elf32_External_Conflict
* econf32
;
18868 econf32
= (Elf32_External_Conflict
*)
18869 get_data (NULL
, filedata
, conflicts_offset
,
18870 sizeof (*econf32
), conflictsno
, _("conflict"));
18877 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
18878 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
18884 Elf64_External_Conflict
* econf64
;
18886 econf64
= (Elf64_External_Conflict
*)
18887 get_data (NULL
, filedata
, conflicts_offset
,
18888 sizeof (*econf64
), conflictsno
, _("conflict"));
18895 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
18896 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
18901 printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
18902 "\nSection '.conflict' contains %lu entries:\n",
18903 (unsigned long) conflictsno
),
18904 (unsigned long) conflictsno
);
18905 puts (_(" Num: Index Value Name"));
18907 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
18909 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
18911 if (iconf
[cnt
] >= filedata
->num_dynamic_syms
)
18912 printf (_("<corrupt symbol index>"));
18915 Elf_Internal_Sym
* psym
;
18917 psym
= & filedata
->dynamic_symbols
[iconf
[cnt
]];
18918 print_vma (psym
->st_value
, FULL_HEX
);
18920 if (valid_dynamic_name (filedata
, psym
->st_name
))
18921 print_symbol (25, get_dynamic_name (filedata
, psym
->st_name
));
18923 printf (_("<corrupt: %14ld>"), psym
->st_name
);
18931 if (pltgot
!= 0 && local_gotno
!= 0)
18933 bfd_vma ent
, local_end
, global_end
;
18935 unsigned char * data
;
18936 unsigned char * data_end
;
18940 addr_size
= (is_32bit_elf
? 4 : 8);
18941 local_end
= pltgot
+ local_gotno
* addr_size
;
18943 /* PR binutils/17533 file: 012-111227-0.004 */
18944 if (symtabno
< gotsym
)
18946 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
18947 (unsigned long) gotsym
, (unsigned long) symtabno
);
18951 global_end
= local_end
+ (symtabno
- gotsym
) * addr_size
;
18952 /* PR 17531: file: 54c91a34. */
18953 if (global_end
< local_end
)
18955 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno
);
18959 offset
= offset_from_vma (filedata
, pltgot
, global_end
- pltgot
);
18960 data
= (unsigned char *) get_data (NULL
, filedata
, offset
,
18961 global_end
- pltgot
, 1,
18962 _("Global Offset Table data"));
18963 /* PR 12855: Null data is handled gracefully throughout. */
18964 data_end
= data
+ (global_end
- pltgot
);
18966 printf (_("\nPrimary GOT:\n"));
18967 printf (_(" Canonical gp value: "));
18968 print_vma (pltgot
+ 0x7ff0, LONG_HEX
);
18971 printf (_(" Reserved entries:\n"));
18972 printf (_(" %*s %10s %*s Purpose\n"),
18973 addr_size
* 2, _("Address"), _("Access"),
18974 addr_size
* 2, _("Initial"));
18975 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
18976 printf (_(" Lazy resolver\n"));
18977 if (ent
== (bfd_vma
) -1)
18978 goto got_print_fail
;
18980 /* Check for the MSB of GOT[1] being set, denoting a GNU object.
18981 This entry will be used by some runtime loaders, to store the
18982 module pointer. Otherwise this is an ordinary local entry.
18983 PR 21344: Check for the entry being fully available before
18986 && data
+ ent
- pltgot
+ addr_size
<= data_end
18987 && (byte_get (data
+ ent
- pltgot
, addr_size
)
18988 >> (addr_size
* 8 - 1)) != 0)
18990 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
18991 printf (_(" Module pointer (GNU extension)\n"));
18992 if (ent
== (bfd_vma
) -1)
18993 goto got_print_fail
;
18997 if (data
!= NULL
&& ent
< local_end
)
18999 printf (_(" Local entries:\n"));
19000 printf (" %*s %10s %*s\n",
19001 addr_size
* 2, _("Address"), _("Access"),
19002 addr_size
* 2, _("Initial"));
19003 while (ent
< local_end
)
19005 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
19007 if (ent
== (bfd_vma
) -1)
19008 goto got_print_fail
;
19013 if (data
!= NULL
&& gotsym
< symtabno
)
19017 printf (_(" Global entries:\n"));
19018 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
19019 addr_size
* 2, _("Address"),
19021 addr_size
* 2, _("Initial"),
19022 addr_size
* 2, _("Sym.Val."),
19024 /* Note for translators: "Ndx" = abbreviated form of "Index". */
19025 _("Ndx"), _("Name"));
19027 sym_width
= (is_32bit_elf
? 80 : 160) - 28 - addr_size
* 6 - 1;
19029 for (i
= gotsym
; i
< symtabno
; i
++)
19031 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
19034 if (filedata
->dynamic_symbols
== NULL
)
19035 printf (_("<no dynamic symbols>"));
19036 else if (i
< filedata
->num_dynamic_syms
)
19038 Elf_Internal_Sym
* psym
= filedata
->dynamic_symbols
+ i
;
19040 print_vma (psym
->st_value
, LONG_HEX
);
19041 printf (" %-7s %3s ",
19042 get_symbol_type (filedata
, ELF_ST_TYPE (psym
->st_info
)),
19043 get_symbol_index_type (filedata
, psym
->st_shndx
));
19045 if (valid_dynamic_name (filedata
, psym
->st_name
))
19046 print_symbol (sym_width
,
19047 get_dynamic_name (filedata
, psym
->st_name
));
19049 printf (_("<corrupt: %14ld>"), psym
->st_name
);
19052 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
19053 (unsigned long) i
);
19056 if (ent
== (bfd_vma
) -1)
19066 if (mips_pltgot
!= 0 && jmprel
!= 0 && pltrel
!= 0 && pltrelsz
!= 0)
19069 size_t offset
, rel_offset
;
19070 unsigned long count
, i
;
19071 unsigned char * data
;
19072 int addr_size
, sym_width
;
19073 Elf_Internal_Rela
* rels
;
19075 rel_offset
= offset_from_vma (filedata
, jmprel
, pltrelsz
);
19076 if (pltrel
== DT_RELA
)
19078 if (!slurp_rela_relocs (filedata
, rel_offset
, pltrelsz
, &rels
, &count
))
19083 if (!slurp_rel_relocs (filedata
, rel_offset
, pltrelsz
, &rels
, &count
))
19088 addr_size
= (is_32bit_elf
? 4 : 8);
19089 end
= mips_pltgot
+ (2 + count
) * addr_size
;
19091 offset
= offset_from_vma (filedata
, mips_pltgot
, end
- mips_pltgot
);
19092 data
= (unsigned char *) get_data (NULL
, filedata
, offset
, end
- mips_pltgot
,
19093 1, _("Procedure Linkage Table data"));
19100 printf ("\nPLT GOT:\n\n");
19101 printf (_(" Reserved entries:\n"));
19102 printf (_(" %*s %*s Purpose\n"),
19103 addr_size
* 2, _("Address"), addr_size
* 2, _("Initial"));
19104 ent
= print_mips_pltgot_entry (data
, mips_pltgot
, ent
);
19105 printf (_(" PLT lazy resolver\n"));
19106 ent
= print_mips_pltgot_entry (data
, mips_pltgot
, ent
);
19107 printf (_(" Module pointer\n"));
19110 printf (_(" Entries:\n"));
19111 printf (" %*s %*s %*s %-7s %3s %s\n",
19112 addr_size
* 2, _("Address"),
19113 addr_size
* 2, _("Initial"),
19114 addr_size
* 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
19115 sym_width
= (is_32bit_elf
? 80 : 160) - 17 - addr_size
* 6 - 1;
19116 for (i
= 0; i
< count
; i
++)
19118 unsigned long idx
= get_reloc_symindex (rels
[i
].r_info
);
19120 ent
= print_mips_pltgot_entry (data
, mips_pltgot
, ent
);
19123 if (idx
>= filedata
->num_dynamic_syms
)
19124 printf (_("<corrupt symbol index: %lu>"), idx
);
19127 Elf_Internal_Sym
* psym
= filedata
->dynamic_symbols
+ idx
;
19129 print_vma (psym
->st_value
, LONG_HEX
);
19130 printf (" %-7s %3s ",
19131 get_symbol_type (filedata
, ELF_ST_TYPE (psym
->st_info
)),
19132 get_symbol_index_type (filedata
, psym
->st_shndx
));
19133 if (valid_dynamic_name (filedata
, psym
->st_name
))
19134 print_symbol (sym_width
,
19135 get_dynamic_name (filedata
, psym
->st_name
));
19137 printf (_("<corrupt: %14ld>"), psym
->st_name
);
19151 process_nds32_specific (Filedata
* filedata
)
19153 Elf_Internal_Shdr
*sect
= NULL
;
19155 sect
= find_section (filedata
, ".nds32_e_flags");
19156 if (sect
!= NULL
&& sect
->sh_size
>= 4)
19158 unsigned char *buf
;
19161 printf ("\nNDS32 elf flags section:\n");
19162 buf
= get_data (NULL
, filedata
, sect
->sh_offset
, 1, 4,
19163 _("NDS32 elf flags section"));
19168 flag
= byte_get (buf
, 4);
19170 switch (flag
& 0x3)
19173 printf ("(VEC_SIZE):\tNo entry.\n");
19176 printf ("(VEC_SIZE):\t4 bytes\n");
19179 printf ("(VEC_SIZE):\t16 bytes\n");
19182 printf ("(VEC_SIZE):\treserved\n");
19191 process_gnu_liblist (Filedata
* filedata
)
19193 Elf_Internal_Shdr
* section
;
19194 Elf_Internal_Shdr
* string_sec
;
19195 Elf32_External_Lib
* elib
;
19197 size_t strtab_size
;
19199 unsigned long num_liblist
;
19206 for (i
= 0, section
= filedata
->section_headers
;
19207 i
< filedata
->file_header
.e_shnum
;
19210 switch (section
->sh_type
)
19212 case SHT_GNU_LIBLIST
:
19213 if (section
->sh_link
>= filedata
->file_header
.e_shnum
)
19216 elib
= (Elf32_External_Lib
*)
19217 get_data (NULL
, filedata
, section
->sh_offset
, 1, section
->sh_size
,
19218 _("liblist section data"));
19226 string_sec
= filedata
->section_headers
+ section
->sh_link
;
19227 strtab
= (char *) get_data (NULL
, filedata
, string_sec
->sh_offset
, 1,
19228 string_sec
->sh_size
,
19229 _("liblist string table"));
19231 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
19238 strtab_size
= string_sec
->sh_size
;
19240 num_liblist
= section
->sh_size
/ sizeof (Elf32_External_Lib
);
19241 printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
19242 "\nLibrary list section '%s' contains %lu entries:\n",
19244 printable_section_name (filedata
, section
),
19247 puts (_(" Library Time Stamp Checksum Version Flags"));
19249 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
19257 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
19258 atime
= BYTE_GET (elib
[cnt
].l_time_stamp
);
19259 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
19260 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
19261 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
19263 tmp
= gmtime (&atime
);
19264 snprintf (timebuf
, sizeof (timebuf
),
19265 "%04u-%02u-%02uT%02u:%02u:%02u",
19266 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
19267 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
19269 printf ("%3lu: ", (unsigned long) cnt
);
19271 printf ("%-20s", liblist
.l_name
< strtab_size
19272 ? strtab
+ liblist
.l_name
: _("<corrupt>"));
19274 printf ("%-20.20s", liblist
.l_name
< strtab_size
19275 ? strtab
+ liblist
.l_name
: _("<corrupt>"));
19276 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
19277 liblist
.l_version
, liblist
.l_flags
);
19288 static const char *
19289 get_note_type (Filedata
* filedata
, unsigned e_type
)
19291 static char buff
[64];
19293 if (filedata
->file_header
.e_type
== ET_CORE
)
19297 return _("NT_AUXV (auxiliary vector)");
19299 return _("NT_PRSTATUS (prstatus structure)");
19301 return _("NT_FPREGSET (floating point registers)");
19303 return _("NT_PRPSINFO (prpsinfo structure)");
19304 case NT_TASKSTRUCT
:
19305 return _("NT_TASKSTRUCT (task structure)");
19307 return _("NT_GDB_TDESC (GDB XML target description)");
19309 return _("NT_PRXFPREG (user_xfpregs structure)");
19311 return _("NT_PPC_VMX (ppc Altivec registers)");
19313 return _("NT_PPC_VSX (ppc VSX registers)");
19315 return _("NT_PPC_TAR (ppc TAR register)");
19317 return _("NT_PPC_PPR (ppc PPR register)");
19319 return _("NT_PPC_DSCR (ppc DSCR register)");
19321 return _("NT_PPC_EBB (ppc EBB registers)");
19323 return _("NT_PPC_PMU (ppc PMU registers)");
19324 case NT_PPC_TM_CGPR
:
19325 return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
19326 case NT_PPC_TM_CFPR
:
19327 return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
19328 case NT_PPC_TM_CVMX
:
19329 return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
19330 case NT_PPC_TM_CVSX
:
19331 return _("NT_PPC_TM_CVSX (ppc checkpointed VSX registers)");
19332 case NT_PPC_TM_SPR
:
19333 return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
19334 case NT_PPC_TM_CTAR
:
19335 return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
19336 case NT_PPC_TM_CPPR
:
19337 return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
19338 case NT_PPC_TM_CDSCR
:
19339 return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
19341 return _("NT_386_TLS (x86 TLS information)");
19342 case NT_386_IOPERM
:
19343 return _("NT_386_IOPERM (x86 I/O permissions)");
19344 case NT_X86_XSTATE
:
19345 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
19347 return _("NT_X86_CET (x86 CET state)");
19348 case NT_S390_HIGH_GPRS
:
19349 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
19350 case NT_S390_TIMER
:
19351 return _("NT_S390_TIMER (s390 timer register)");
19352 case NT_S390_TODCMP
:
19353 return _("NT_S390_TODCMP (s390 TOD comparator register)");
19354 case NT_S390_TODPREG
:
19355 return _("NT_S390_TODPREG (s390 TOD programmable register)");
19357 return _("NT_S390_CTRS (s390 control registers)");
19358 case NT_S390_PREFIX
:
19359 return _("NT_S390_PREFIX (s390 prefix register)");
19360 case NT_S390_LAST_BREAK
:
19361 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
19362 case NT_S390_SYSTEM_CALL
:
19363 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
19365 return _("NT_S390_TDB (s390 transaction diagnostic block)");
19366 case NT_S390_VXRS_LOW
:
19367 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
19368 case NT_S390_VXRS_HIGH
:
19369 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
19370 case NT_S390_GS_CB
:
19371 return _("NT_S390_GS_CB (s390 guarded-storage registers)");
19372 case NT_S390_GS_BC
:
19373 return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
19375 return _("NT_ARM_VFP (arm VFP registers)");
19377 return _("NT_ARM_TLS (AArch TLS registers)");
19378 case NT_ARM_HW_BREAK
:
19379 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
19380 case NT_ARM_HW_WATCH
:
19381 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
19382 case NT_ARM_SYSTEM_CALL
:
19383 return _("NT_ARM_SYSTEM_CALL (AArch system call number)");
19385 return _("NT_ARM_SVE (AArch SVE registers)");
19386 case NT_ARM_PAC_MASK
:
19387 return _("NT_ARM_PAC_MASK (AArch pointer authentication code masks)");
19388 case NT_ARM_PACA_KEYS
:
19389 return _("NT_ARM_PACA_KEYS (ARM pointer authentication address keys)");
19390 case NT_ARM_PACG_KEYS
:
19391 return _("NT_ARM_PACG_KEYS (ARM pointer authentication generic keys)");
19392 case NT_ARM_TAGGED_ADDR_CTRL
:
19393 return _("NT_ARM_TAGGED_ADDR_CTRL (AArch tagged address control)");
19394 case NT_ARM_PAC_ENABLED_KEYS
:
19395 return _("NT_ARM_PAC_ENABLED_KEYS (AArch64 pointer authentication enabled keys)");
19397 return _("NT_ARC_V2 (ARC HS accumulator/extra registers)");
19399 return _("NT_RISCV_CSR (RISC-V control and status registers)");
19401 return _("NT_PSTATUS (pstatus structure)");
19403 return _("NT_FPREGS (floating point registers)");
19405 return _("NT_PSINFO (psinfo structure)");
19407 return _("NT_LWPSTATUS (lwpstatus_t structure)");
19409 return _("NT_LWPSINFO (lwpsinfo_t structure)");
19410 case NT_WIN32PSTATUS
:
19411 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
19413 return _("NT_SIGINFO (siginfo_t data)");
19415 return _("NT_FILE (mapped files)");
19423 return _("NT_VERSION (version)");
19425 return _("NT_ARCH (architecture)");
19426 case NT_GNU_BUILD_ATTRIBUTE_OPEN
:
19428 case NT_GNU_BUILD_ATTRIBUTE_FUNC
:
19430 case NT_GO_BUILDID
:
19431 return _("GO BUILDID");
19432 case FDO_PACKAGING_METADATA
:
19433 return _("FDO_PACKAGING_METADATA");
19438 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
19443 print_core_note (Elf_Internal_Note
*pnote
)
19445 unsigned int addr_size
= is_32bit_elf
? 4 : 8;
19446 bfd_vma count
, page_size
;
19447 unsigned char *descdata
, *filenames
, *descend
;
19449 if (pnote
->type
!= NT_FILE
)
19459 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
19460 /* Still "successful". */
19465 if (pnote
->descsz
< 2 * addr_size
)
19467 error (_(" Malformed note - too short for header\n"));
19471 descdata
= (unsigned char *) pnote
->descdata
;
19472 descend
= descdata
+ pnote
->descsz
;
19474 if (descdata
[pnote
->descsz
- 1] != '\0')
19476 error (_(" Malformed note - does not end with \\0\n"));
19480 count
= byte_get (descdata
, addr_size
);
19481 descdata
+= addr_size
;
19483 page_size
= byte_get (descdata
, addr_size
);
19484 descdata
+= addr_size
;
19486 if (count
> ((bfd_vma
) -1 - 2 * addr_size
) / (3 * addr_size
)
19487 || pnote
->descsz
< 2 * addr_size
+ count
* 3 * addr_size
)
19489 error (_(" Malformed note - too short for supplied file count\n"));
19493 printf (_(" Page size: "));
19494 print_vma (page_size
, DEC
);
19497 printf (_(" %*s%*s%*s\n"),
19498 (int) (2 + 2 * addr_size
), _("Start"),
19499 (int) (4 + 2 * addr_size
), _("End"),
19500 (int) (4 + 2 * addr_size
), _("Page Offset"));
19501 filenames
= descdata
+ count
* 3 * addr_size
;
19502 while (count
-- > 0)
19504 bfd_vma start
, end
, file_ofs
;
19506 if (filenames
== descend
)
19508 error (_(" Malformed note - filenames end too early\n"));
19512 start
= byte_get (descdata
, addr_size
);
19513 descdata
+= addr_size
;
19514 end
= byte_get (descdata
, addr_size
);
19515 descdata
+= addr_size
;
19516 file_ofs
= byte_get (descdata
, addr_size
);
19517 descdata
+= addr_size
;
19520 print_vma (start
, FULL_HEX
);
19522 print_vma (end
, FULL_HEX
);
19524 print_vma (file_ofs
, FULL_HEX
);
19525 printf ("\n %s\n", filenames
);
19527 filenames
+= 1 + strlen ((char *) filenames
);
19533 static const char *
19534 get_gnu_elf_note_type (unsigned e_type
)
19536 /* NB/ Keep this switch statement in sync with print_gnu_note (). */
19539 case NT_GNU_ABI_TAG
:
19540 return _("NT_GNU_ABI_TAG (ABI version tag)");
19542 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
19543 case NT_GNU_BUILD_ID
:
19544 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
19545 case NT_GNU_GOLD_VERSION
:
19546 return _("NT_GNU_GOLD_VERSION (gold version)");
19547 case NT_GNU_PROPERTY_TYPE_0
:
19548 return _("NT_GNU_PROPERTY_TYPE_0");
19549 case NT_GNU_BUILD_ATTRIBUTE_OPEN
:
19550 return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
19551 case NT_GNU_BUILD_ATTRIBUTE_FUNC
:
19552 return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
19555 static char buff
[64];
19557 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
19564 decode_x86_compat_isa (unsigned int bitmask
)
19568 unsigned int bit
= bitmask
& (- bitmask
);
19573 case GNU_PROPERTY_X86_COMPAT_ISA_1_486
:
19576 case GNU_PROPERTY_X86_COMPAT_ISA_1_586
:
19579 case GNU_PROPERTY_X86_COMPAT_ISA_1_686
:
19582 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE
:
19585 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE2
:
19588 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE3
:
19591 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSSE3
:
19594 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_1
:
19597 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_2
:
19600 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX
:
19603 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX2
:
19606 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512F
:
19607 printf ("AVX512F");
19609 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512CD
:
19610 printf ("AVX512CD");
19612 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512ER
:
19613 printf ("AVX512ER");
19615 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512PF
:
19616 printf ("AVX512PF");
19618 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512VL
:
19619 printf ("AVX512VL");
19621 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512DQ
:
19622 printf ("AVX512DQ");
19624 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512BW
:
19625 printf ("AVX512BW");
19628 printf (_("<unknown: %x>"), bit
);
19637 decode_x86_compat_2_isa (unsigned int bitmask
)
19641 printf (_("<None>"));
19647 unsigned int bit
= bitmask
& (- bitmask
);
19652 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_CMOV
:
19655 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSE
:
19658 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSE2
:
19661 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSE3
:
19664 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSSE3
:
19667 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSE4_1
:
19670 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSE4_2
:
19673 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX
:
19676 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX2
:
19679 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_FMA
:
19682 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512F
:
19683 printf ("AVX512F");
19685 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512CD
:
19686 printf ("AVX512CD");
19688 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512ER
:
19689 printf ("AVX512ER");
19691 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512PF
:
19692 printf ("AVX512PF");
19694 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512VL
:
19695 printf ("AVX512VL");
19697 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512DQ
:
19698 printf ("AVX512DQ");
19700 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512BW
:
19701 printf ("AVX512BW");
19703 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_4FMAPS
:
19704 printf ("AVX512_4FMAPS");
19706 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_4VNNIW
:
19707 printf ("AVX512_4VNNIW");
19709 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_BITALG
:
19710 printf ("AVX512_BITALG");
19712 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_IFMA
:
19713 printf ("AVX512_IFMA");
19715 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_VBMI
:
19716 printf ("AVX512_VBMI");
19718 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_VBMI2
:
19719 printf ("AVX512_VBMI2");
19721 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_VNNI
:
19722 printf ("AVX512_VNNI");
19724 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_BF16
:
19725 printf ("AVX512_BF16");
19728 printf (_("<unknown: %x>"), bit
);
19736 static const char *
19737 get_amdgpu_elf_note_type (unsigned int e_type
)
19741 case NT_AMDGPU_METADATA
:
19742 return _("NT_AMDGPU_METADATA (code object metadata)");
19745 static char buf
[64];
19746 snprintf (buf
, sizeof (buf
), _("Unknown note type: (0x%08x)"), e_type
);
19753 decode_x86_isa (unsigned int bitmask
)
19757 unsigned int bit
= bitmask
& (- bitmask
);
19762 case GNU_PROPERTY_X86_ISA_1_BASELINE
:
19763 printf ("x86-64-baseline");
19765 case GNU_PROPERTY_X86_ISA_1_V2
:
19766 printf ("x86-64-v2");
19768 case GNU_PROPERTY_X86_ISA_1_V3
:
19769 printf ("x86-64-v3");
19771 case GNU_PROPERTY_X86_ISA_1_V4
:
19772 printf ("x86-64-v4");
19775 printf (_("<unknown: %x>"), bit
);
19784 decode_x86_feature_1 (unsigned int bitmask
)
19788 printf (_("<None>"));
19794 unsigned int bit
= bitmask
& (- bitmask
);
19799 case GNU_PROPERTY_X86_FEATURE_1_IBT
:
19802 case GNU_PROPERTY_X86_FEATURE_1_SHSTK
:
19805 case GNU_PROPERTY_X86_FEATURE_1_LAM_U48
:
19806 printf ("LAM_U48");
19808 case GNU_PROPERTY_X86_FEATURE_1_LAM_U57
:
19809 printf ("LAM_U57");
19812 printf (_("<unknown: %x>"), bit
);
19821 decode_x86_feature_2 (unsigned int bitmask
)
19825 printf (_("<None>"));
19831 unsigned int bit
= bitmask
& (- bitmask
);
19836 case GNU_PROPERTY_X86_FEATURE_2_X86
:
19839 case GNU_PROPERTY_X86_FEATURE_2_X87
:
19842 case GNU_PROPERTY_X86_FEATURE_2_MMX
:
19845 case GNU_PROPERTY_X86_FEATURE_2_XMM
:
19848 case GNU_PROPERTY_X86_FEATURE_2_YMM
:
19851 case GNU_PROPERTY_X86_FEATURE_2_ZMM
:
19854 case GNU_PROPERTY_X86_FEATURE_2_TMM
:
19857 case GNU_PROPERTY_X86_FEATURE_2_MASK
:
19860 case GNU_PROPERTY_X86_FEATURE_2_FXSR
:
19863 case GNU_PROPERTY_X86_FEATURE_2_XSAVE
:
19866 case GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT
:
19867 printf ("XSAVEOPT");
19869 case GNU_PROPERTY_X86_FEATURE_2_XSAVEC
:
19873 printf (_("<unknown: %x>"), bit
);
19882 decode_aarch64_feature_1_and (unsigned int bitmask
)
19886 unsigned int bit
= bitmask
& (- bitmask
);
19891 case GNU_PROPERTY_AARCH64_FEATURE_1_BTI
:
19895 case GNU_PROPERTY_AARCH64_FEATURE_1_PAC
:
19900 printf (_("<unknown: %x>"), bit
);
19909 decode_1_needed (unsigned int bitmask
)
19913 unsigned int bit
= bitmask
& (- bitmask
);
19918 case GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS
:
19919 printf ("indirect external access");
19922 printf (_("<unknown: %x>"), bit
);
19931 print_gnu_property_note (Filedata
* filedata
, Elf_Internal_Note
* pnote
)
19933 unsigned char * ptr
= (unsigned char *) pnote
->descdata
;
19934 unsigned char * ptr_end
= ptr
+ pnote
->descsz
;
19935 unsigned int size
= is_32bit_elf
? 4 : 8;
19937 printf (_(" Properties: "));
19939 if (pnote
->descsz
< 8 || (pnote
->descsz
% size
) != 0)
19941 printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote
->descsz
);
19945 while (ptr
< ptr_end
)
19949 unsigned int datasz
;
19951 if ((size_t) (ptr_end
- ptr
) < 8)
19953 printf (_("<corrupt descsz: %#lx>\n"), pnote
->descsz
);
19957 type
= byte_get (ptr
, 4);
19958 datasz
= byte_get (ptr
+ 4, 4);
19962 if (datasz
> (size_t) (ptr_end
- ptr
))
19964 printf (_("<corrupt type (%#x) datasz: %#x>\n"),
19969 if (type
>= GNU_PROPERTY_LOPROC
&& type
<= GNU_PROPERTY_HIPROC
)
19971 if (filedata
->file_header
.e_machine
== EM_X86_64
19972 || filedata
->file_header
.e_machine
== EM_IAMCU
19973 || filedata
->file_header
.e_machine
== EM_386
)
19975 unsigned int bitmask
;
19978 bitmask
= byte_get (ptr
, 4);
19984 case GNU_PROPERTY_X86_ISA_1_USED
:
19986 printf (_("x86 ISA used: <corrupt length: %#x> "),
19990 printf ("x86 ISA used: ");
19991 decode_x86_isa (bitmask
);
19995 case GNU_PROPERTY_X86_ISA_1_NEEDED
:
19997 printf (_("x86 ISA needed: <corrupt length: %#x> "),
20001 printf ("x86 ISA needed: ");
20002 decode_x86_isa (bitmask
);
20006 case GNU_PROPERTY_X86_FEATURE_1_AND
:
20008 printf (_("x86 feature: <corrupt length: %#x> "),
20012 printf ("x86 feature: ");
20013 decode_x86_feature_1 (bitmask
);
20017 case GNU_PROPERTY_X86_FEATURE_2_USED
:
20019 printf (_("x86 feature used: <corrupt length: %#x> "),
20023 printf ("x86 feature used: ");
20024 decode_x86_feature_2 (bitmask
);
20028 case GNU_PROPERTY_X86_FEATURE_2_NEEDED
:
20030 printf (_("x86 feature needed: <corrupt length: %#x> "), datasz
);
20033 printf ("x86 feature needed: ");
20034 decode_x86_feature_2 (bitmask
);
20038 case GNU_PROPERTY_X86_COMPAT_ISA_1_USED
:
20040 printf (_("x86 ISA used: <corrupt length: %#x> "),
20044 printf ("x86 ISA used: ");
20045 decode_x86_compat_isa (bitmask
);
20049 case GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED
:
20051 printf (_("x86 ISA needed: <corrupt length: %#x> "),
20055 printf ("x86 ISA needed: ");
20056 decode_x86_compat_isa (bitmask
);
20060 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_USED
:
20062 printf (_("x86 ISA used: <corrupt length: %#x> "),
20066 printf ("x86 ISA used: ");
20067 decode_x86_compat_2_isa (bitmask
);
20071 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_NEEDED
:
20073 printf (_("x86 ISA needed: <corrupt length: %#x> "),
20077 printf ("x86 ISA needed: ");
20078 decode_x86_compat_2_isa (bitmask
);
20086 else if (filedata
->file_header
.e_machine
== EM_AARCH64
)
20088 if (type
== GNU_PROPERTY_AARCH64_FEATURE_1_AND
)
20090 printf ("AArch64 feature: ");
20092 printf (_("<corrupt length: %#x> "), datasz
);
20094 decode_aarch64_feature_1_and (byte_get (ptr
, 4));
20103 case GNU_PROPERTY_STACK_SIZE
:
20104 printf (_("stack size: "));
20105 if (datasz
!= size
)
20106 printf (_("<corrupt length: %#x> "), datasz
);
20108 printf ("%#lx", (unsigned long) byte_get (ptr
, size
));
20111 case GNU_PROPERTY_NO_COPY_ON_PROTECTED
:
20112 printf ("no copy on protected ");
20114 printf (_("<corrupt length: %#x> "), datasz
);
20118 if ((type
>= GNU_PROPERTY_UINT32_AND_LO
20119 && type
<= GNU_PROPERTY_UINT32_AND_HI
)
20120 || (type
>= GNU_PROPERTY_UINT32_OR_LO
20121 && type
<= GNU_PROPERTY_UINT32_OR_HI
))
20125 case GNU_PROPERTY_1_NEEDED
:
20127 printf (_("1_needed: <corrupt length: %#x> "),
20131 unsigned int bitmask
= byte_get (ptr
, 4);
20132 printf ("1_needed: ");
20133 decode_1_needed (bitmask
);
20140 if (type
<= GNU_PROPERTY_UINT32_AND_HI
)
20141 printf (_("UINT32_AND (%#x): "), type
);
20143 printf (_("UINT32_OR (%#x): "), type
);
20145 printf (_("<corrupt length: %#x> "), datasz
);
20147 printf ("%#x", (unsigned int) byte_get (ptr
, 4));
20154 if (type
< GNU_PROPERTY_LOPROC
)
20155 printf (_("<unknown type %#x data: "), type
);
20156 else if (type
< GNU_PROPERTY_LOUSER
)
20157 printf (_("<processor-specific type %#x data: "), type
);
20159 printf (_("<application-specific type %#x data: "), type
);
20160 for (j
= 0; j
< datasz
; ++j
)
20161 printf ("%02x ", ptr
[j
] & 0xff);
20165 ptr
+= ((datasz
+ (size
- 1)) & ~ (size
- 1));
20166 if (ptr
== ptr_end
)
20179 print_gnu_note (Filedata
* filedata
, Elf_Internal_Note
*pnote
)
20181 /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type (). */
20182 switch (pnote
->type
)
20184 case NT_GNU_BUILD_ID
:
20188 printf (_(" Build ID: "));
20189 for (i
= 0; i
< pnote
->descsz
; ++i
)
20190 printf ("%02x", pnote
->descdata
[i
] & 0xff);
20195 case NT_GNU_ABI_TAG
:
20197 unsigned long os
, major
, minor
, subminor
;
20198 const char *osname
;
20200 /* PR 17531: file: 030-599401-0.004. */
20201 if (pnote
->descsz
< 16)
20203 printf (_(" <corrupt GNU_ABI_TAG>\n"));
20207 os
= byte_get ((unsigned char *) pnote
->descdata
, 4);
20208 major
= byte_get ((unsigned char *) pnote
->descdata
+ 4, 4);
20209 minor
= byte_get ((unsigned char *) pnote
->descdata
+ 8, 4);
20210 subminor
= byte_get ((unsigned char *) pnote
->descdata
+ 12, 4);
20214 case GNU_ABI_TAG_LINUX
:
20217 case GNU_ABI_TAG_HURD
:
20220 case GNU_ABI_TAG_SOLARIS
:
20221 osname
= "Solaris";
20223 case GNU_ABI_TAG_FREEBSD
:
20224 osname
= "FreeBSD";
20226 case GNU_ABI_TAG_NETBSD
:
20229 case GNU_ABI_TAG_SYLLABLE
:
20230 osname
= "Syllable";
20232 case GNU_ABI_TAG_NACL
:
20236 osname
= "Unknown";
20240 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname
,
20241 major
, minor
, subminor
);
20245 case NT_GNU_GOLD_VERSION
:
20249 printf (_(" Version: "));
20250 for (i
= 0; i
< pnote
->descsz
&& pnote
->descdata
[i
] != '\0'; ++i
)
20251 printf ("%c", pnote
->descdata
[i
]);
20258 unsigned long num_entries
, mask
;
20260 /* Hardware capabilities information. Word 0 is the number of entries.
20261 Word 1 is a bitmask of enabled entries. The rest of the descriptor
20262 is a series of entries, where each entry is a single byte followed
20263 by a nul terminated string. The byte gives the bit number to test
20264 if enabled in the bitmask. */
20265 printf (_(" Hardware Capabilities: "));
20266 if (pnote
->descsz
< 8)
20268 error (_("<corrupt GNU_HWCAP>\n"));
20271 num_entries
= byte_get ((unsigned char *) pnote
->descdata
, 4);
20272 mask
= byte_get ((unsigned char *) pnote
->descdata
+ 4, 4);
20273 printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries
, mask
);
20274 /* FIXME: Add code to display the entries... */
20278 case NT_GNU_PROPERTY_TYPE_0
:
20279 print_gnu_property_note (filedata
, pnote
);
20283 /* Handle unrecognised types. An error message should have already been
20284 created by get_gnu_elf_note_type(), so all that we need to do is to
20285 display the data. */
20289 printf (_(" Description data: "));
20290 for (i
= 0; i
< pnote
->descsz
; ++i
)
20291 printf ("%02x ", pnote
->descdata
[i
] & 0xff);
20300 static const char *
20301 get_v850_elf_note_type (enum v850_notes n_type
)
20303 static char buff
[64];
20307 case V850_NOTE_ALIGNMENT
: return _("Alignment of 8-byte objects");
20308 case V850_NOTE_DATA_SIZE
: return _("Sizeof double and long double");
20309 case V850_NOTE_FPU_INFO
: return _("Type of FPU support needed");
20310 case V850_NOTE_SIMD_INFO
: return _("Use of SIMD instructions");
20311 case V850_NOTE_CACHE_INFO
: return _("Use of cache");
20312 case V850_NOTE_MMU_INFO
: return _("Use of MMU");
20314 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), n_type
);
20320 print_v850_note (Elf_Internal_Note
* pnote
)
20324 if (pnote
->descsz
!= 4)
20327 val
= byte_get ((unsigned char *) pnote
->descdata
, pnote
->descsz
);
20331 printf (_("not set\n"));
20335 switch (pnote
->type
)
20337 case V850_NOTE_ALIGNMENT
:
20340 case EF_RH850_DATA_ALIGN4
: printf (_("4-byte\n")); return true;
20341 case EF_RH850_DATA_ALIGN8
: printf (_("8-byte\n")); return true;
20345 case V850_NOTE_DATA_SIZE
:
20348 case EF_RH850_DOUBLE32
: printf (_("4-bytes\n")); return true;
20349 case EF_RH850_DOUBLE64
: printf (_("8-bytes\n")); return true;
20353 case V850_NOTE_FPU_INFO
:
20356 case EF_RH850_FPU20
: printf (_("FPU-2.0\n")); return true;
20357 case EF_RH850_FPU30
: printf (_("FPU-3.0\n")); return true;
20361 case V850_NOTE_MMU_INFO
:
20362 case V850_NOTE_CACHE_INFO
:
20363 case V850_NOTE_SIMD_INFO
:
20364 if (val
== EF_RH850_SIMD
)
20366 printf (_("yes\n"));
20372 /* An 'unknown note type' message will already have been displayed. */
20376 printf (_("unknown value: %x\n"), val
);
20381 process_netbsd_elf_note (Elf_Internal_Note
* pnote
)
20383 unsigned int version
;
20385 switch (pnote
->type
)
20387 case NT_NETBSD_IDENT
:
20388 if (pnote
->descsz
< 1)
20390 version
= byte_get ((unsigned char *) pnote
->descdata
, sizeof (version
));
20391 if ((version
/ 10000) % 100)
20392 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote
->descsz
,
20393 version
, version
/ 100000000, (version
/ 1000000) % 100,
20394 (version
/ 10000) % 100 > 26 ? "Z" : "",
20395 'A' + (version
/ 10000) % 26);
20397 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote
->descsz
,
20398 version
, version
/ 100000000, (version
/ 1000000) % 100,
20399 (version
/ 100) % 100);
20402 case NT_NETBSD_MARCH
:
20403 printf (" NetBSD\t\t0x%08lx\tMARCH <%s>\n", pnote
->descsz
,
20407 case NT_NETBSD_PAX
:
20408 if (pnote
->descsz
< 1)
20410 version
= byte_get ((unsigned char *) pnote
->descdata
, sizeof (version
));
20411 printf (" NetBSD\t\t0x%08lx\tPaX <%s%s%s%s%s%s>\n", pnote
->descsz
,
20412 ((version
& NT_NETBSD_PAX_MPROTECT
) ? "+mprotect" : ""),
20413 ((version
& NT_NETBSD_PAX_NOMPROTECT
) ? "-mprotect" : ""),
20414 ((version
& NT_NETBSD_PAX_GUARD
) ? "+guard" : ""),
20415 ((version
& NT_NETBSD_PAX_NOGUARD
) ? "-guard" : ""),
20416 ((version
& NT_NETBSD_PAX_ASLR
) ? "+ASLR" : ""),
20417 ((version
& NT_NETBSD_PAX_NOASLR
) ? "-ASLR" : ""));
20421 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n",
20422 pnote
->descsz
, pnote
->type
);
20426 static const char *
20427 get_freebsd_elfcore_note_type (Filedata
* filedata
, unsigned e_type
)
20431 case NT_FREEBSD_THRMISC
:
20432 return _("NT_THRMISC (thrmisc structure)");
20433 case NT_FREEBSD_PROCSTAT_PROC
:
20434 return _("NT_PROCSTAT_PROC (proc data)");
20435 case NT_FREEBSD_PROCSTAT_FILES
:
20436 return _("NT_PROCSTAT_FILES (files data)");
20437 case NT_FREEBSD_PROCSTAT_VMMAP
:
20438 return _("NT_PROCSTAT_VMMAP (vmmap data)");
20439 case NT_FREEBSD_PROCSTAT_GROUPS
:
20440 return _("NT_PROCSTAT_GROUPS (groups data)");
20441 case NT_FREEBSD_PROCSTAT_UMASK
:
20442 return _("NT_PROCSTAT_UMASK (umask data)");
20443 case NT_FREEBSD_PROCSTAT_RLIMIT
:
20444 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
20445 case NT_FREEBSD_PROCSTAT_OSREL
:
20446 return _("NT_PROCSTAT_OSREL (osreldate data)");
20447 case NT_FREEBSD_PROCSTAT_PSSTRINGS
:
20448 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
20449 case NT_FREEBSD_PROCSTAT_AUXV
:
20450 return _("NT_PROCSTAT_AUXV (auxv data)");
20451 case NT_FREEBSD_PTLWPINFO
:
20452 return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
20453 case NT_FREEBSD_X86_SEGBASES
:
20454 return _("NT_X86_SEGBASES (x86 segment base registers)");
20456 return get_note_type (filedata
, e_type
);
20459 static const char *
20460 get_netbsd_elfcore_note_type (Filedata
* filedata
, unsigned e_type
)
20462 static char buff
[64];
20466 case NT_NETBSDCORE_PROCINFO
:
20467 /* NetBSD core "procinfo" structure. */
20468 return _("NetBSD procinfo structure");
20470 case NT_NETBSDCORE_AUXV
:
20471 return _("NetBSD ELF auxiliary vector data");
20473 case NT_NETBSDCORE_LWPSTATUS
:
20474 return _("PT_LWPSTATUS (ptrace_lwpstatus structure)");
20477 /* As of Jan 2020 there are no other machine-independent notes
20478 defined for NetBSD core files. If the note type is less
20479 than the start of the machine-dependent note types, we don't
20482 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
20484 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
20490 switch (filedata
->file_header
.e_machine
)
20492 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
20493 and PT_GETFPREGS == mach+2. */
20498 case EM_SPARC32PLUS
:
20502 case NT_NETBSDCORE_FIRSTMACH
+ 0:
20503 return _("PT_GETREGS (reg structure)");
20504 case NT_NETBSDCORE_FIRSTMACH
+ 2:
20505 return _("PT_GETFPREGS (fpreg structure)");
20511 /* On SuperH, PT_GETREGS == mach+3 and PT_GETFPREGS == mach+5.
20512 There's also old PT___GETREGS40 == mach + 1 for old reg
20513 structure which lacks GBR. */
20517 case NT_NETBSDCORE_FIRSTMACH
+ 1:
20518 return _("PT___GETREGS40 (old reg structure)");
20519 case NT_NETBSDCORE_FIRSTMACH
+ 3:
20520 return _("PT_GETREGS (reg structure)");
20521 case NT_NETBSDCORE_FIRSTMACH
+ 5:
20522 return _("PT_GETFPREGS (fpreg structure)");
20528 /* On all other arch's, PT_GETREGS == mach+1 and
20529 PT_GETFPREGS == mach+3. */
20533 case NT_NETBSDCORE_FIRSTMACH
+ 1:
20534 return _("PT_GETREGS (reg structure)");
20535 case NT_NETBSDCORE_FIRSTMACH
+ 3:
20536 return _("PT_GETFPREGS (fpreg structure)");
20542 snprintf (buff
, sizeof (buff
), "PT_FIRSTMACH+%d",
20543 e_type
- NT_NETBSDCORE_FIRSTMACH
);
20547 static const char *
20548 get_openbsd_elfcore_note_type (Filedata
* filedata
, unsigned e_type
)
20552 case NT_OPENBSD_PROCINFO
:
20553 return _("OpenBSD procinfo structure");
20554 case NT_OPENBSD_AUXV
:
20555 return _("OpenBSD ELF auxiliary vector data");
20556 case NT_OPENBSD_REGS
:
20557 return _("OpenBSD regular registers");
20558 case NT_OPENBSD_FPREGS
:
20559 return _("OpenBSD floating point registers");
20560 case NT_OPENBSD_WCOOKIE
:
20561 return _("OpenBSD window cookie");
20564 return get_note_type (filedata
, e_type
);
20567 static const char *
20568 get_stapsdt_note_type (unsigned e_type
)
20570 static char buff
[64];
20575 return _("NT_STAPSDT (SystemTap probe descriptors)");
20581 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
20586 print_stapsdt_note (Elf_Internal_Note
*pnote
)
20588 size_t len
, maxlen
;
20589 unsigned long addr_size
= is_32bit_elf
? 4 : 8;
20590 char *data
= pnote
->descdata
;
20591 char *data_end
= pnote
->descdata
+ pnote
->descsz
;
20592 bfd_vma pc
, base_addr
, semaphore
;
20593 char *provider
, *probe
, *arg_fmt
;
20595 if (pnote
->descsz
< (addr_size
* 3))
20596 goto stapdt_note_too_small
;
20598 pc
= byte_get ((unsigned char *) data
, addr_size
);
20601 base_addr
= byte_get ((unsigned char *) data
, addr_size
);
20604 semaphore
= byte_get ((unsigned char *) data
, addr_size
);
20607 if (data
>= data_end
)
20608 goto stapdt_note_too_small
;
20609 maxlen
= data_end
- data
;
20610 len
= strnlen (data
, maxlen
);
20617 goto stapdt_note_too_small
;
20619 if (data
>= data_end
)
20620 goto stapdt_note_too_small
;
20621 maxlen
= data_end
- data
;
20622 len
= strnlen (data
, maxlen
);
20629 goto stapdt_note_too_small
;
20631 if (data
>= data_end
)
20632 goto stapdt_note_too_small
;
20633 maxlen
= data_end
- data
;
20634 len
= strnlen (data
, maxlen
);
20641 goto stapdt_note_too_small
;
20643 printf (_(" Provider: %s\n"), provider
);
20644 printf (_(" Name: %s\n"), probe
);
20645 printf (_(" Location: "));
20646 print_vma (pc
, FULL_HEX
);
20647 printf (_(", Base: "));
20648 print_vma (base_addr
, FULL_HEX
);
20649 printf (_(", Semaphore: "));
20650 print_vma (semaphore
, FULL_HEX
);
20652 printf (_(" Arguments: %s\n"), arg_fmt
);
20654 return data
== data_end
;
20656 stapdt_note_too_small
:
20657 printf (_(" <corrupt - note is too small>\n"));
20658 error (_("corrupt stapdt note - the data size is too small\n"));
20663 print_fdo_note (Elf_Internal_Note
* pnote
)
20665 if (pnote
->descsz
> 0 && pnote
->type
== FDO_PACKAGING_METADATA
)
20667 printf (_(" Packaging Metadata: %.*s\n"), (int) pnote
->descsz
, pnote
->descdata
);
20673 static const char *
20674 get_ia64_vms_note_type (unsigned e_type
)
20676 static char buff
[64];
20681 return _("NT_VMS_MHD (module header)");
20683 return _("NT_VMS_LNM (language name)");
20685 return _("NT_VMS_SRC (source files)");
20687 return "NT_VMS_TITLE";
20689 return _("NT_VMS_EIDC (consistency check)");
20690 case NT_VMS_FPMODE
:
20691 return _("NT_VMS_FPMODE (FP mode)");
20692 case NT_VMS_LINKTIME
:
20693 return "NT_VMS_LINKTIME";
20694 case NT_VMS_IMGNAM
:
20695 return _("NT_VMS_IMGNAM (image name)");
20697 return _("NT_VMS_IMGID (image id)");
20698 case NT_VMS_LINKID
:
20699 return _("NT_VMS_LINKID (link id)");
20700 case NT_VMS_IMGBID
:
20701 return _("NT_VMS_IMGBID (build id)");
20702 case NT_VMS_GSTNAM
:
20703 return _("NT_VMS_GSTNAM (sym table name)");
20704 case NT_VMS_ORIG_DYN
:
20705 return "NT_VMS_ORIG_DYN";
20706 case NT_VMS_PATCHTIME
:
20707 return "NT_VMS_PATCHTIME";
20709 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
20715 print_ia64_vms_note (Elf_Internal_Note
* pnote
)
20717 int maxlen
= pnote
->descsz
;
20719 if (maxlen
< 2 || (unsigned long) maxlen
!= pnote
->descsz
)
20720 goto desc_size_fail
;
20722 switch (pnote
->type
)
20726 goto desc_size_fail
;
20728 int l
= (int) strnlen (pnote
->descdata
+ 34, maxlen
- 34);
20730 printf (_(" Creation date : %.17s\n"), pnote
->descdata
);
20731 printf (_(" Last patch date: %.17s\n"), pnote
->descdata
+ 17);
20732 if (l
+ 34 < maxlen
)
20734 printf (_(" Module name : %s\n"), pnote
->descdata
+ 34);
20735 if (l
+ 35 < maxlen
)
20736 printf (_(" Module version : %s\n"), pnote
->descdata
+ 34 + l
+ 1);
20738 printf (_(" Module version : <missing>\n"));
20742 printf (_(" Module name : <missing>\n"));
20743 printf (_(" Module version : <missing>\n"));
20748 printf (_(" Language: %.*s\n"), maxlen
, pnote
->descdata
);
20752 case NT_VMS_FPMODE
:
20753 printf (_(" Floating Point mode: "));
20755 goto desc_size_fail
;
20756 /* FIXME: Generate an error if descsz > 8 ? */
20758 printf ("0x%016" BFD_VMA_FMT
"x\n",
20759 (bfd_vma
) byte_get ((unsigned char *)pnote
->descdata
, 8));
20762 case NT_VMS_LINKTIME
:
20763 printf (_(" Link time: "));
20765 goto desc_size_fail
;
20766 /* FIXME: Generate an error if descsz > 8 ? */
20769 ((bfd_int64_t
) byte_get ((unsigned char *)pnote
->descdata
, 8));
20773 case NT_VMS_PATCHTIME
:
20774 printf (_(" Patch time: "));
20776 goto desc_size_fail
;
20777 /* FIXME: Generate an error if descsz > 8 ? */
20780 ((bfd_int64_t
) byte_get ((unsigned char *)pnote
->descdata
, 8));
20784 case NT_VMS_ORIG_DYN
:
20786 goto desc_size_fail
;
20788 printf (_(" Major id: %u, minor id: %u\n"),
20789 (unsigned) byte_get ((unsigned char *)pnote
->descdata
, 4),
20790 (unsigned) byte_get ((unsigned char *)pnote
->descdata
+ 4, 4));
20791 printf (_(" Last modified : "));
20793 ((bfd_int64_t
) byte_get ((unsigned char *)pnote
->descdata
+ 8, 8));
20794 printf (_("\n Link flags : "));
20795 printf ("0x%016" BFD_VMA_FMT
"x\n",
20796 (bfd_vma
) byte_get ((unsigned char *)pnote
->descdata
+ 16, 8));
20797 printf (_(" Header flags: 0x%08x\n"),
20798 (unsigned) byte_get ((unsigned char *)pnote
->descdata
+ 24, 4));
20799 printf (_(" Image id : %.*s\n"), maxlen
- 32, pnote
->descdata
+ 32);
20803 case NT_VMS_IMGNAM
:
20804 printf (_(" Image name: %.*s\n"), maxlen
, pnote
->descdata
);
20807 case NT_VMS_GSTNAM
:
20808 printf (_(" Global symbol table name: %.*s\n"), maxlen
, pnote
->descdata
);
20812 printf (_(" Image id: %.*s\n"), maxlen
, pnote
->descdata
);
20815 case NT_VMS_LINKID
:
20816 printf (_(" Linker id: %.*s\n"), maxlen
, pnote
->descdata
);
20826 printf (_(" <corrupt - data size is too small>\n"));
20827 error (_("corrupt IA64 note: data size is too small\n"));
20831 struct build_attr_cache
{
20832 Filedata
*filedata
;
20834 unsigned long strtablen
;
20835 Elf_Internal_Sym
*symtab
;
20836 unsigned long nsyms
;
20839 /* Find the symbol associated with a build attribute that is attached
20840 to address OFFSET. If PNAME is non-NULL then store the name of
20841 the symbol (if found) in the provided pointer, Returns NULL if a
20842 symbol could not be found. */
20844 static Elf_Internal_Sym
*
20845 get_symbol_for_build_attribute (Filedata
*filedata
,
20846 unsigned long offset
,
20848 const char **pname
)
20850 Elf_Internal_Sym
*saved_sym
= NULL
;
20851 Elf_Internal_Sym
*sym
;
20853 if (filedata
->section_headers
!= NULL
20854 && (ba_cache
.filedata
== NULL
|| filedata
!= ba_cache
.filedata
))
20856 Elf_Internal_Shdr
* symsec
;
20858 free (ba_cache
.strtab
);
20859 ba_cache
.strtab
= NULL
;
20860 free (ba_cache
.symtab
);
20861 ba_cache
.symtab
= NULL
;
20863 /* Load the symbol and string sections. */
20864 for (symsec
= filedata
->section_headers
;
20865 symsec
< filedata
->section_headers
+ filedata
->file_header
.e_shnum
;
20868 if (symsec
->sh_type
== SHT_SYMTAB
20869 && get_symtab (filedata
, symsec
,
20870 &ba_cache
.symtab
, &ba_cache
.nsyms
,
20871 &ba_cache
.strtab
, &ba_cache
.strtablen
))
20874 ba_cache
.filedata
= filedata
;
20877 if (ba_cache
.symtab
== NULL
)
20880 /* Find a symbol whose value matches offset. */
20881 for (sym
= ba_cache
.symtab
; sym
< ba_cache
.symtab
+ ba_cache
.nsyms
; sym
++)
20882 if (sym
->st_value
== offset
)
20884 if (sym
->st_name
>= ba_cache
.strtablen
)
20885 /* Huh ? This should not happen. */
20888 if (ba_cache
.strtab
[sym
->st_name
] == 0)
20891 /* The AArch64, ARM and RISC-V architectures define mapping symbols
20892 (eg $d, $x, $t) which we want to ignore. */
20893 if (ba_cache
.strtab
[sym
->st_name
] == '$'
20894 && ba_cache
.strtab
[sym
->st_name
+ 1] != 0
20895 && ba_cache
.strtab
[sym
->st_name
+ 2] == 0)
20900 /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
20901 and FILE or OBJECT symbols over NOTYPE symbols. We skip
20902 FUNC symbols entirely. */
20903 switch (ELF_ST_TYPE (sym
->st_info
))
20910 /* If the symbol has a size associated
20911 with it then we can stop searching. */
20912 sym
= ba_cache
.symtab
+ ba_cache
.nsyms
;
20917 /* Ignore function symbols. */
20924 switch (ELF_ST_BIND (sym
->st_info
))
20927 if (saved_sym
== NULL
20928 || ELF_ST_TYPE (saved_sym
->st_info
) != STT_OBJECT
)
20933 if (saved_sym
== NULL
)
20943 if (ELF_ST_TYPE (sym
->st_info
) != STT_FUNC
)
20951 if (saved_sym
&& pname
)
20952 * pname
= ba_cache
.strtab
+ saved_sym
->st_name
;
20957 /* Returns true iff addr1 and addr2 are in the same section. */
20960 same_section (Filedata
* filedata
, unsigned long addr1
, unsigned long addr2
)
20962 Elf_Internal_Shdr
* a1
;
20963 Elf_Internal_Shdr
* a2
;
20965 a1
= find_section_by_address (filedata
, addr1
);
20966 a2
= find_section_by_address (filedata
, addr2
);
20968 return a1
== a2
&& a1
!= NULL
;
20972 print_gnu_build_attribute_description (Elf_Internal_Note
* pnote
,
20973 Filedata
* filedata
)
20975 static unsigned long global_offset
= 0;
20976 static unsigned long global_end
= 0;
20977 static unsigned long func_offset
= 0;
20978 static unsigned long func_end
= 0;
20980 Elf_Internal_Sym
*sym
;
20982 unsigned long start
;
20984 bool is_open_attr
= pnote
->type
== NT_GNU_BUILD_ATTRIBUTE_OPEN
;
20986 switch (pnote
->descsz
)
20989 /* A zero-length description means that the range of
20990 the previous note of the same type should be used. */
20993 if (global_end
> global_offset
)
20994 printf (_(" Applies to region from %#lx to %#lx\n"),
20995 global_offset
, global_end
);
20997 printf (_(" Applies to region from %#lx\n"), global_offset
);
21001 if (func_end
> func_offset
)
21002 printf (_(" Applies to region from %#lx to %#lx\n"), func_offset
, func_end
);
21004 printf (_(" Applies to region from %#lx\n"), func_offset
);
21009 start
= byte_get ((unsigned char *) pnote
->descdata
, 4);
21014 start
= byte_get ((unsigned char *) pnote
->descdata
, 4);
21015 end
= byte_get ((unsigned char *) pnote
->descdata
+ 4, 4);
21019 start
= byte_get ((unsigned char *) pnote
->descdata
, 8);
21020 end
= byte_get ((unsigned char *) pnote
->descdata
+ 8, 8);
21024 error (_(" <invalid description size: %lx>\n"), pnote
->descsz
);
21025 printf (_(" <invalid descsz>"));
21030 sym
= get_symbol_for_build_attribute (filedata
, start
, is_open_attr
, & name
);
21031 /* As of version 5 of the annobin plugin, filename symbols are biased by 2
21032 in order to avoid them being confused with the start address of the
21033 first function in the file... */
21034 if (sym
== NULL
&& is_open_attr
)
21035 sym
= get_symbol_for_build_attribute (filedata
, start
+ 2, is_open_attr
,
21038 if (end
== 0 && sym
!= NULL
&& sym
->st_size
> 0)
21039 end
= start
+ sym
->st_size
;
21043 /* FIXME: Need to properly allow for section alignment.
21044 16 is just the alignment used on x86_64. */
21046 && start
> BFD_ALIGN (global_end
, 16)
21047 /* Build notes are not guaranteed to be organised in order of
21048 increasing address, but we should find the all of the notes
21049 for one section in the same place. */
21050 && same_section (filedata
, start
, global_end
))
21051 warn (_("Gap in build notes detected from %#lx to %#lx\n"),
21052 global_end
+ 1, start
- 1);
21054 printf (_(" Applies to region from %#lx"), start
);
21055 global_offset
= start
;
21059 printf (_(" to %#lx"), end
);
21065 printf (_(" Applies to region from %#lx"), start
);
21066 func_offset
= start
;
21070 printf (_(" to %#lx"), end
);
21076 printf (_(" (%s)"), name
);
21083 print_gnu_build_attribute_name (Elf_Internal_Note
* pnote
)
21085 static const char string_expected
[2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING
, 0 };
21086 static const char number_expected
[2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC
, 0 };
21087 static const char bool_expected
[3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE
, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE
, 0 };
21089 char name_attribute
;
21090 const char * expected_types
;
21091 const char * name
= pnote
->namedata
;
21095 if (name
== NULL
|| pnote
->namesz
< 2)
21097 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote
->namesz
);
21098 print_symbol (-20, _(" <corrupt name>"));
21107 /* Version 2 of the spec adds a "GA" prefix to the name field. */
21108 if (name
[0] == 'G' && name
[1] == 'A')
21110 if (pnote
->namesz
< 4)
21112 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote
->namesz
);
21113 print_symbol (-20, _(" <corrupt name>"));
21122 switch ((name_type
= * name
))
21124 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC
:
21125 case GNU_BUILD_ATTRIBUTE_TYPE_STRING
:
21126 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE
:
21127 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE
:
21128 printf ("%c", * name
);
21132 error (_("unrecognised attribute type in name field: %d\n"), name_type
);
21133 print_symbol (-20, _("<unknown name type>"));
21140 switch ((name_attribute
= * name
))
21142 case GNU_BUILD_ATTRIBUTE_VERSION
:
21143 text
= _("<version>");
21144 expected_types
= string_expected
;
21147 case GNU_BUILD_ATTRIBUTE_STACK_PROT
:
21148 text
= _("<stack prot>");
21149 expected_types
= "!+*";
21152 case GNU_BUILD_ATTRIBUTE_RELRO
:
21153 text
= _("<relro>");
21154 expected_types
= bool_expected
;
21157 case GNU_BUILD_ATTRIBUTE_STACK_SIZE
:
21158 text
= _("<stack size>");
21159 expected_types
= number_expected
;
21162 case GNU_BUILD_ATTRIBUTE_TOOL
:
21163 text
= _("<tool>");
21164 expected_types
= string_expected
;
21167 case GNU_BUILD_ATTRIBUTE_ABI
:
21169 expected_types
= "$*";
21172 case GNU_BUILD_ATTRIBUTE_PIC
:
21174 expected_types
= number_expected
;
21177 case GNU_BUILD_ATTRIBUTE_SHORT_ENUM
:
21178 text
= _("<short enum>");
21179 expected_types
= bool_expected
;
21183 if (ISPRINT (* name
))
21185 int len
= strnlen (name
, pnote
->namesz
- (name
- pnote
->namedata
)) + 1;
21187 if (len
> left
&& ! do_wide
)
21189 printf ("%.*s:", len
, name
);
21195 static char tmpbuf
[128];
21197 error (_("unrecognised byte in name field: %d\n"), * name
);
21198 sprintf (tmpbuf
, _("<unknown:_%d>"), * name
);
21202 expected_types
= "*$!+";
21207 left
-= printf ("%s", text
);
21209 if (strchr (expected_types
, name_type
) == NULL
)
21210 warn (_("attribute does not have an expected type (%c)\n"), name_type
);
21212 if ((unsigned long)(name
- pnote
->namedata
) > pnote
->namesz
)
21214 error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
21215 (unsigned long) pnote
->namesz
,
21216 (long) (name
- pnote
->namedata
));
21220 if (left
< 1 && ! do_wide
)
21225 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC
:
21227 unsigned int bytes
;
21228 unsigned long long val
= 0;
21229 unsigned int shift
= 0;
21230 char * decoded
= NULL
;
21232 bytes
= pnote
->namesz
- (name
- pnote
->namedata
);
21234 /* The -1 is because the name field is always 0 terminated, and we
21235 want to be able to ensure that the shift in the while loop below
21236 will not overflow. */
21239 if (bytes
> sizeof (val
))
21241 error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
21243 bytes
= sizeof (val
);
21245 /* We do not bother to warn if bytes == 0 as this can
21246 happen with some early versions of the gcc plugin. */
21250 unsigned long long byte
= *name
++ & 0xff;
21252 val
|= byte
<< shift
;
21256 switch (name_attribute
)
21258 case GNU_BUILD_ATTRIBUTE_PIC
:
21261 case 0: decoded
= "static"; break;
21262 case 1: decoded
= "pic"; break;
21263 case 2: decoded
= "PIC"; break;
21264 case 3: decoded
= "pie"; break;
21265 case 4: decoded
= "PIE"; break;
21269 case GNU_BUILD_ATTRIBUTE_STACK_PROT
:
21272 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c. */
21273 case 0: decoded
= "off"; break;
21274 case 1: decoded
= "on"; break;
21275 case 2: decoded
= "all"; break;
21276 case 3: decoded
= "strong"; break;
21277 case 4: decoded
= "explicit"; break;
21285 if (decoded
!= NULL
)
21287 print_symbol (-left
, decoded
);
21298 left
-= printf ("0x%llx", val
);
21300 left
-= printf ("0x%-.*llx", left
, val
);
21304 case GNU_BUILD_ATTRIBUTE_TYPE_STRING
:
21305 left
-= print_symbol (- left
, name
);
21307 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE
:
21308 left
-= print_symbol (- left
, "true");
21310 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE
:
21311 left
-= print_symbol (- left
, "false");
21315 if (do_wide
&& left
> 0)
21316 printf ("%-*s", left
, " ");
21321 /* Print the contents of PNOTE as hex. */
21324 print_note_contents_hex (Elf_Internal_Note
*pnote
)
21330 printf (_(" description data: "));
21331 for (i
= 0; i
< pnote
->descsz
; i
++)
21332 printf ("%02x ", pnote
->descdata
[i
] & 0xff);
21341 #if defined HAVE_MSGPACK
21344 print_indents (int n
)
21348 for (int i
= 0; i
< n
; i
++)
21352 /* Print OBJ in human-readable form. */
21355 dump_msgpack_obj (const msgpack_object
*obj
, int indent
)
21359 case MSGPACK_OBJECT_NIL
:
21363 case MSGPACK_OBJECT_BOOLEAN
:
21364 printf ("%s", obj
->via
.boolean
? "true" : "false");
21367 case MSGPACK_OBJECT_POSITIVE_INTEGER
:
21368 printf ("%" PRIu64
, obj
->via
.u64
);
21371 case MSGPACK_OBJECT_NEGATIVE_INTEGER
:
21372 printf ("%" PRIi64
, obj
->via
.i64
);
21375 case MSGPACK_OBJECT_FLOAT32
:
21376 case MSGPACK_OBJECT_FLOAT64
:
21377 printf ("%f", obj
->via
.f64
);
21380 case MSGPACK_OBJECT_STR
:
21381 printf ("\"%.*s\"", obj
->via
.str
.size
, obj
->via
.str
.ptr
);
21384 case MSGPACK_OBJECT_ARRAY
:
21386 const msgpack_object_array
*array
= &obj
->via
.array
;
21391 for (uint32_t i
= 0; i
< array
->size
; ++i
)
21393 const msgpack_object
*item
= &array
->ptr
[i
];
21395 print_indents (indent
);
21396 dump_msgpack_obj (item
, indent
);
21401 print_indents (indent
);
21407 case MSGPACK_OBJECT_MAP
:
21409 const msgpack_object_map
*map
= &obj
->via
.map
;
21414 for (uint32_t i
= 0; i
< map
->size
; ++i
)
21416 const msgpack_object_kv
*kv
= &map
->ptr
[i
];
21417 const msgpack_object
*key
= &kv
->key
;
21418 const msgpack_object
*val
= &kv
->val
;
21420 print_indents (indent
);
21421 dump_msgpack_obj (key
, indent
);
21423 dump_msgpack_obj (val
, indent
);
21429 print_indents (indent
);
21435 case MSGPACK_OBJECT_BIN
:
21439 case MSGPACK_OBJECT_EXT
:
21446 dump_msgpack (const msgpack_unpacked
*msg
)
21449 dump_msgpack_obj (&msg
->data
, 0);
21453 #endif /* defined HAVE_MSGPACK */
21456 print_amdgpu_note (Elf_Internal_Note
*pnote
)
21458 #if defined HAVE_MSGPACK
21459 /* If msgpack is available, decode and dump the note's content. */
21461 msgpack_unpacked msg
;
21462 msgpack_unpack_return msgpack_ret
;
21464 assert (pnote
->type
== NT_AMDGPU_METADATA
);
21466 msgpack_unpacked_init (&msg
);
21467 msgpack_ret
= msgpack_unpack_next (&msg
, pnote
->descdata
, pnote
->descsz
,
21470 switch (msgpack_ret
)
21472 case MSGPACK_UNPACK_SUCCESS
:
21473 dump_msgpack (&msg
);
21478 error (_("failed to unpack msgpack contents in NT_AMDGPU_METADATA note"));
21483 msgpack_unpacked_destroy (&msg
);
21486 /* msgpack is not available, dump contents as hex. */
21487 print_note_contents_hex (pnote
);
21492 /* Note that by the ELF standard, the name field is already null byte
21493 terminated, and namesz includes the terminating null byte.
21494 I.E. the value of namesz for the name "FSF" is 4.
21496 If the value of namesz is zero, there is no name present. */
21499 process_note (Elf_Internal_Note
* pnote
,
21500 Filedata
* filedata
)
21502 const char * name
= pnote
->namesz
? pnote
->namedata
: "(NONE)";
21505 if (pnote
->namesz
== 0)
21506 /* If there is no note name, then use the default set of
21507 note type strings. */
21508 nt
= get_note_type (filedata
, pnote
->type
);
21510 else if (startswith (pnote
->namedata
, "GNU"))
21511 /* GNU-specific object file notes. */
21512 nt
= get_gnu_elf_note_type (pnote
->type
);
21514 else if (startswith (pnote
->namedata
, "AMDGPU"))
21515 /* AMDGPU-specific object file notes. */
21516 nt
= get_amdgpu_elf_note_type (pnote
->type
);
21518 else if (startswith (pnote
->namedata
, "FreeBSD"))
21519 /* FreeBSD-specific core file notes. */
21520 nt
= get_freebsd_elfcore_note_type (filedata
, pnote
->type
);
21522 else if (startswith (pnote
->namedata
, "NetBSD-CORE"))
21523 /* NetBSD-specific core file notes. */
21524 nt
= get_netbsd_elfcore_note_type (filedata
, pnote
->type
);
21526 else if (startswith (pnote
->namedata
, "NetBSD"))
21527 /* NetBSD-specific core file notes. */
21528 return process_netbsd_elf_note (pnote
);
21530 else if (startswith (pnote
->namedata
, "PaX"))
21531 /* NetBSD-specific core file notes. */
21532 return process_netbsd_elf_note (pnote
);
21534 else if (startswith (pnote
->namedata
, "OpenBSD"))
21535 /* OpenBSD-specific core file notes. */
21536 nt
= get_openbsd_elfcore_note_type (filedata
, pnote
->type
);
21538 else if (startswith (pnote
->namedata
, "SPU/"))
21540 /* SPU-specific core file notes. */
21541 nt
= pnote
->namedata
+ 4;
21545 else if (startswith (pnote
->namedata
, "IPF/VMS"))
21546 /* VMS/ia64-specific file notes. */
21547 nt
= get_ia64_vms_note_type (pnote
->type
);
21549 else if (startswith (pnote
->namedata
, "stapsdt"))
21550 nt
= get_stapsdt_note_type (pnote
->type
);
21553 /* Don't recognize this note name; just use the default set of
21554 note type strings. */
21555 nt
= get_note_type (filedata
, pnote
->type
);
21559 if (((startswith (pnote
->namedata
, "GA")
21560 && strchr ("*$!+", pnote
->namedata
[2]) != NULL
)
21561 || strchr ("*$!+", pnote
->namedata
[0]) != NULL
)
21562 && (pnote
->type
== NT_GNU_BUILD_ATTRIBUTE_OPEN
21563 || pnote
->type
== NT_GNU_BUILD_ATTRIBUTE_FUNC
))
21564 print_gnu_build_attribute_name (pnote
);
21566 print_symbol (-20, name
);
21569 printf (" 0x%08lx\t%s\t", pnote
->descsz
, nt
);
21571 printf (" 0x%08lx\t%s\n", pnote
->descsz
, nt
);
21573 if (startswith (pnote
->namedata
, "IPF/VMS"))
21574 return print_ia64_vms_note (pnote
);
21575 else if (startswith (pnote
->namedata
, "GNU"))
21576 return print_gnu_note (filedata
, pnote
);
21577 else if (startswith (pnote
->namedata
, "stapsdt"))
21578 return print_stapsdt_note (pnote
);
21579 else if (startswith (pnote
->namedata
, "CORE"))
21580 return print_core_note (pnote
);
21581 else if (startswith (pnote
->namedata
, "FDO"))
21582 return print_fdo_note (pnote
);
21583 else if (((startswith (pnote
->namedata
, "GA")
21584 && strchr ("*$!+", pnote
->namedata
[2]) != NULL
)
21585 || strchr ("*$!+", pnote
->namedata
[0]) != NULL
)
21586 && (pnote
->type
== NT_GNU_BUILD_ATTRIBUTE_OPEN
21587 || pnote
->type
== NT_GNU_BUILD_ATTRIBUTE_FUNC
))
21588 return print_gnu_build_attribute_description (pnote
, filedata
);
21589 else if (startswith (pnote
->namedata
, "AMDGPU")
21590 && pnote
->type
== NT_AMDGPU_METADATA
)
21591 return print_amdgpu_note (pnote
);
21593 print_note_contents_hex (pnote
);
21598 process_notes_at (Filedata
* filedata
,
21599 Elf_Internal_Shdr
* section
,
21604 Elf_External_Note
*pnotes
;
21605 Elf_External_Note
*external
;
21614 pnotes
= (Elf_External_Note
*) get_section_contents (section
, filedata
);
21617 if (! apply_relocations (filedata
, section
, (unsigned char *) pnotes
, length
, NULL
, NULL
))
21625 pnotes
= (Elf_External_Note
*) get_data (NULL
, filedata
, offset
, 1, length
,
21628 if (pnotes
== NULL
)
21633 if (filedata
->is_separate
)
21634 printf (_("In linked file '%s': "), filedata
->file_name
);
21638 printf (_("Displaying notes found in: %s\n"), printable_section_name (filedata
, section
));
21640 printf (_("Displaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
21641 (unsigned long) offset
, (unsigned long) length
);
21643 /* NB: Some note sections may have alignment value of 0 or 1. gABI
21644 specifies that notes should be aligned to 4 bytes in 32-bit
21645 objects and to 8 bytes in 64-bit objects. As a Linux extension,
21646 we also support 4 byte alignment in 64-bit objects. If section
21647 alignment is less than 4, we treate alignment as 4 bytes. */
21650 else if (align
!= 4 && align
!= 8)
21652 warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
21658 printf (_(" %-20s %-10s\tDescription\n"), _("Owner"), _("Data size"));
21660 end
= (char *) pnotes
+ length
;
21661 while ((char *) external
< end
)
21663 Elf_Internal_Note inote
;
21666 char * temp
= NULL
;
21667 size_t data_remaining
= end
- (char *) external
;
21669 if (!is_ia64_vms (filedata
))
21671 /* PR binutils/15191
21672 Make sure that there is enough data to read. */
21673 min_notesz
= offsetof (Elf_External_Note
, name
);
21674 if (data_remaining
< min_notesz
)
21676 warn (ngettext ("Corrupt note: only %ld byte remains, "
21677 "not enough for a full note\n",
21678 "Corrupt note: only %ld bytes remain, "
21679 "not enough for a full note\n",
21681 (long) data_remaining
);
21684 data_remaining
-= min_notesz
;
21686 inote
.type
= BYTE_GET (external
->type
);
21687 inote
.namesz
= BYTE_GET (external
->namesz
);
21688 inote
.namedata
= external
->name
;
21689 inote
.descsz
= BYTE_GET (external
->descsz
);
21690 inote
.descdata
= ((char *) external
21691 + ELF_NOTE_DESC_OFFSET (inote
.namesz
, align
));
21692 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
21693 next
= ((char *) external
21694 + ELF_NOTE_NEXT_OFFSET (inote
.namesz
, inote
.descsz
, align
));
21698 Elf64_External_VMS_Note
*vms_external
;
21700 /* PR binutils/15191
21701 Make sure that there is enough data to read. */
21702 min_notesz
= offsetof (Elf64_External_VMS_Note
, name
);
21703 if (data_remaining
< min_notesz
)
21705 warn (ngettext ("Corrupt note: only %ld byte remains, "
21706 "not enough for a full note\n",
21707 "Corrupt note: only %ld bytes remain, "
21708 "not enough for a full note\n",
21710 (long) data_remaining
);
21713 data_remaining
-= min_notesz
;
21715 vms_external
= (Elf64_External_VMS_Note
*) external
;
21716 inote
.type
= BYTE_GET (vms_external
->type
);
21717 inote
.namesz
= BYTE_GET (vms_external
->namesz
);
21718 inote
.namedata
= vms_external
->name
;
21719 inote
.descsz
= BYTE_GET (vms_external
->descsz
);
21720 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 3);
21721 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
21722 next
= inote
.descdata
+ align_power (inote
.descsz
, 3);
21725 /* PR 17531: file: 3443835e. */
21726 /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
21727 if ((size_t) (inote
.descdata
- inote
.namedata
) < inote
.namesz
21728 || (size_t) (inote
.descdata
- inote
.namedata
) > data_remaining
21729 || (size_t) (next
- inote
.descdata
) < inote
.descsz
21730 || ((size_t) (next
- inote
.descdata
)
21731 > data_remaining
- (size_t) (inote
.descdata
- inote
.namedata
)))
21733 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
21734 (unsigned long) ((char *) external
- (char *) pnotes
));
21735 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
21736 inote
.type
, inote
.namesz
, inote
.descsz
, (int) align
);
21740 external
= (Elf_External_Note
*) next
;
21742 /* Verify that name is null terminated. It appears that at least
21743 one version of Linux (RedHat 6.0) generates corefiles that don't
21744 comply with the ELF spec by failing to include the null byte in
21746 if (inote
.namesz
> 0 && inote
.namedata
[inote
.namesz
- 1] != '\0')
21748 if ((size_t) (inote
.descdata
- inote
.namedata
) == inote
.namesz
)
21750 temp
= (char *) malloc (inote
.namesz
+ 1);
21753 error (_("Out of memory allocating space for inote name\n"));
21758 memcpy (temp
, inote
.namedata
, inote
.namesz
);
21759 inote
.namedata
= temp
;
21761 inote
.namedata
[inote
.namesz
] = 0;
21764 if (! process_note (& inote
, filedata
))
21777 process_corefile_note_segments (Filedata
* filedata
)
21779 Elf_Internal_Phdr
*segment
;
21783 if (! get_program_headers (filedata
))
21786 for (i
= 0, segment
= filedata
->program_headers
;
21787 i
< filedata
->file_header
.e_phnum
;
21790 if (segment
->p_type
== PT_NOTE
)
21791 if (! process_notes_at (filedata
, NULL
,
21792 (bfd_vma
) segment
->p_offset
,
21793 (bfd_vma
) segment
->p_filesz
,
21794 (bfd_vma
) segment
->p_align
))
21802 process_v850_notes (Filedata
* filedata
, bfd_vma offset
, bfd_vma length
)
21804 Elf_External_Note
* pnotes
;
21805 Elf_External_Note
* external
;
21812 pnotes
= (Elf_External_Note
*) get_data (NULL
, filedata
, offset
, 1, length
,
21814 if (pnotes
== NULL
)
21818 end
= (char*) pnotes
+ length
;
21820 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
21821 (unsigned long) offset
, (unsigned long) length
);
21823 while ((char *) external
+ sizeof (Elf_External_Note
) < end
)
21825 Elf_External_Note
* next
;
21826 Elf_Internal_Note inote
;
21828 inote
.type
= BYTE_GET (external
->type
);
21829 inote
.namesz
= BYTE_GET (external
->namesz
);
21830 inote
.namedata
= external
->name
;
21831 inote
.descsz
= BYTE_GET (external
->descsz
);
21832 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
21833 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
21835 if (inote
.descdata
< (char *) pnotes
|| inote
.descdata
>= end
)
21837 warn (_("Corrupt note: name size is too big: %lx\n"), inote
.namesz
);
21838 inote
.descdata
= inote
.namedata
;
21842 next
= (Elf_External_Note
*) (inote
.descdata
+ align_power (inote
.descsz
, 2));
21844 if ( ((char *) next
> end
)
21845 || ((char *) next
< (char *) pnotes
))
21847 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
21848 (unsigned long) ((char *) external
- (char *) pnotes
));
21849 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
21850 inote
.type
, inote
.namesz
, inote
.descsz
);
21856 /* Prevent out-of-bounds indexing. */
21857 if ( inote
.namedata
+ inote
.namesz
> end
21858 || inote
.namedata
+ inote
.namesz
< inote
.namedata
)
21860 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
21861 (unsigned long) ((char *) external
- (char *) pnotes
));
21862 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
21863 inote
.type
, inote
.namesz
, inote
.descsz
);
21867 printf (" %s: ", get_v850_elf_note_type (inote
.type
));
21869 if (! print_v850_note (& inote
))
21872 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
21873 inote
.namesz
, inote
.descsz
);
21883 process_note_sections (Filedata
* filedata
)
21885 Elf_Internal_Shdr
*section
;
21887 unsigned int n
= 0;
21890 for (i
= 0, section
= filedata
->section_headers
;
21891 i
< filedata
->file_header
.e_shnum
&& section
!= NULL
;
21894 if (section
->sh_type
== SHT_NOTE
)
21896 if (! process_notes_at (filedata
, section
,
21897 (bfd_vma
) section
->sh_offset
,
21898 (bfd_vma
) section
->sh_size
,
21899 (bfd_vma
) section
->sh_addralign
))
21904 if (( filedata
->file_header
.e_machine
== EM_V800
21905 || filedata
->file_header
.e_machine
== EM_V850
21906 || filedata
->file_header
.e_machine
== EM_CYGNUS_V850
)
21907 && section
->sh_type
== SHT_RENESAS_INFO
)
21909 if (! process_v850_notes (filedata
,
21910 (bfd_vma
) section
->sh_offset
,
21911 (bfd_vma
) section
->sh_size
))
21918 /* Try processing NOTE segments instead. */
21919 return process_corefile_note_segments (filedata
);
21925 process_notes (Filedata
* filedata
)
21927 /* If we have not been asked to display the notes then do nothing. */
21931 if (filedata
->file_header
.e_type
!= ET_CORE
)
21932 return process_note_sections (filedata
);
21934 /* No program headers means no NOTE segment. */
21935 if (filedata
->file_header
.e_phnum
> 0)
21936 return process_corefile_note_segments (filedata
);
21938 if (filedata
->is_separate
)
21939 printf (_("No notes found in linked file '%s'.\n"),
21940 filedata
->file_name
);
21942 printf (_("No notes found file.\n"));
21947 static unsigned char *
21948 display_public_gnu_attributes (unsigned char * start
,
21949 const unsigned char * const end
)
21951 printf (_(" Unknown GNU attribute: %s\n"), start
);
21953 start
+= strnlen ((char *) start
, end
- start
);
21954 display_raw_attribute (start
, end
);
21956 return (unsigned char *) end
;
21959 static unsigned char *
21960 display_generic_attribute (unsigned char * start
,
21962 const unsigned char * const end
)
21965 return (unsigned char *) end
;
21967 return display_tag_value (tag
, start
, end
);
21971 process_arch_specific (Filedata
* filedata
)
21976 switch (filedata
->file_header
.e_machine
)
21979 case EM_ARC_COMPACT
:
21980 case EM_ARC_COMPACT2
:
21981 return process_attributes (filedata
, "ARC", SHT_ARC_ATTRIBUTES
,
21982 display_arc_attribute
,
21983 display_generic_attribute
);
21985 return process_attributes (filedata
, "aeabi", SHT_ARM_ATTRIBUTES
,
21986 display_arm_attribute
,
21987 display_generic_attribute
);
21990 case EM_MIPS_RS3_LE
:
21991 return process_mips_specific (filedata
);
21994 return process_attributes (filedata
, "mspabi", SHT_MSP430_ATTRIBUTES
,
21995 display_msp430_attribute
,
21996 display_msp430_gnu_attribute
);
21999 return process_attributes (filedata
, "riscv", SHT_RISCV_ATTRIBUTES
,
22000 display_riscv_attribute
,
22001 display_generic_attribute
);
22004 return process_nds32_specific (filedata
);
22007 return process_attributes (filedata
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
22008 display_m68k_gnu_attribute
);
22012 return process_attributes (filedata
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
22013 display_power_gnu_attribute
);
22017 return process_attributes (filedata
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
22018 display_s390_gnu_attribute
);
22021 case EM_SPARC32PLUS
:
22023 return process_attributes (filedata
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
22024 display_sparc_gnu_attribute
);
22027 return process_attributes (filedata
, "c6xabi", SHT_C6000_ATTRIBUTES
,
22028 display_tic6x_attribute
,
22029 display_generic_attribute
);
22032 return process_attributes (filedata
, "csky", SHT_CSKY_ATTRIBUTES
,
22033 display_csky_attribute
, NULL
);
22036 return process_attributes (filedata
, "gnu", SHT_GNU_ATTRIBUTES
,
22037 display_public_gnu_attributes
,
22038 display_generic_attribute
);
22043 get_file_header (Filedata
* filedata
)
22045 /* Read in the identity array. */
22046 if (fread (filedata
->file_header
.e_ident
, EI_NIDENT
, 1, filedata
->handle
) != 1)
22049 /* Determine how to read the rest of the header. */
22050 switch (filedata
->file_header
.e_ident
[EI_DATA
])
22055 byte_get
= byte_get_little_endian
;
22056 byte_put
= byte_put_little_endian
;
22059 byte_get
= byte_get_big_endian
;
22060 byte_put
= byte_put_big_endian
;
22064 /* For now we only support 32 bit and 64 bit ELF files. */
22065 is_32bit_elf
= (filedata
->file_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
22067 /* Read in the rest of the header. */
22070 Elf32_External_Ehdr ehdr32
;
22072 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, filedata
->handle
) != 1)
22075 filedata
->file_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
22076 filedata
->file_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
22077 filedata
->file_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
22078 filedata
->file_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
22079 filedata
->file_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
22080 filedata
->file_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
22081 filedata
->file_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
22082 filedata
->file_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
22083 filedata
->file_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
22084 filedata
->file_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
22085 filedata
->file_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
22086 filedata
->file_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
22087 filedata
->file_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
22091 Elf64_External_Ehdr ehdr64
;
22093 /* If we have been compiled with sizeof (bfd_vma) == 4, then
22094 we will not be able to cope with the 64bit data found in
22095 64 ELF files. Detect this now and abort before we start
22096 overwriting things. */
22097 if (sizeof (bfd_vma
) < 8)
22099 error (_("This instance of readelf has been built without support for a\n\
22100 64 bit data type and so it cannot read 64 bit ELF files.\n"));
22104 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, filedata
->handle
) != 1)
22107 filedata
->file_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
22108 filedata
->file_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
22109 filedata
->file_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
22110 filedata
->file_header
.e_entry
= BYTE_GET (ehdr64
.e_entry
);
22111 filedata
->file_header
.e_phoff
= BYTE_GET (ehdr64
.e_phoff
);
22112 filedata
->file_header
.e_shoff
= BYTE_GET (ehdr64
.e_shoff
);
22113 filedata
->file_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
22114 filedata
->file_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
22115 filedata
->file_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
22116 filedata
->file_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
22117 filedata
->file_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
22118 filedata
->file_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
22119 filedata
->file_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
22126 free_filedata (Filedata
*filedata
)
22128 free (filedata
->program_interpreter
);
22129 free (filedata
->program_headers
);
22130 free (filedata
->section_headers
);
22131 free (filedata
->string_table
);
22132 free (filedata
->dump
.dump_sects
);
22133 free (filedata
->dynamic_strings
);
22134 free (filedata
->dynamic_symbols
);
22135 free (filedata
->dynamic_syminfo
);
22136 free (filedata
->dynamic_section
);
22138 while (filedata
->symtab_shndx_list
!= NULL
)
22140 elf_section_list
*next
= filedata
->symtab_shndx_list
->next
;
22141 free (filedata
->symtab_shndx_list
);
22142 filedata
->symtab_shndx_list
= next
;
22145 free (filedata
->section_headers_groups
);
22147 if (filedata
->section_groups
)
22150 struct group_list
* g
;
22151 struct group_list
* next
;
22153 for (i
= 0; i
< filedata
->group_count
; i
++)
22155 for (g
= filedata
->section_groups
[i
].root
; g
!= NULL
; g
= next
)
22162 free (filedata
->section_groups
);
22164 memset (&filedata
->section_headers
, 0,
22165 sizeof (Filedata
) - offsetof (Filedata
, section_headers
));
22169 close_file (Filedata
* filedata
)
22173 if (filedata
->handle
)
22174 fclose (filedata
->handle
);
22180 close_debug_file (void * data
)
22182 free_filedata ((Filedata
*) data
);
22183 close_file ((Filedata
*) data
);
22187 open_file (const char * pathname
, bool is_separate
)
22189 struct stat statbuf
;
22190 Filedata
* filedata
= NULL
;
22192 if (stat (pathname
, & statbuf
) < 0
22193 || ! S_ISREG (statbuf
.st_mode
))
22196 filedata
= calloc (1, sizeof * filedata
);
22197 if (filedata
== NULL
)
22200 filedata
->handle
= fopen (pathname
, "rb");
22201 if (filedata
->handle
== NULL
)
22204 filedata
->file_size
= (bfd_size_type
) statbuf
.st_size
;
22205 filedata
->file_name
= pathname
;
22206 filedata
->is_separate
= is_separate
;
22208 if (! get_file_header (filedata
))
22211 if (!get_section_headers (filedata
, false))
22219 if (filedata
->handle
)
22220 fclose (filedata
->handle
);
22227 open_debug_file (const char * pathname
)
22229 return open_file (pathname
, true);
22233 initialise_dump_sects (Filedata
* filedata
)
22235 /* Initialise the dump_sects array from the cmdline_dump_sects array.
22236 Note we do this even if cmdline_dump_sects is empty because we
22237 must make sure that the dump_sets array is zeroed out before each
22238 object file is processed. */
22239 if (filedata
->dump
.num_dump_sects
> cmdline
.num_dump_sects
)
22240 memset (filedata
->dump
.dump_sects
, 0,
22241 filedata
->dump
.num_dump_sects
* sizeof (*filedata
->dump
.dump_sects
));
22243 if (cmdline
.num_dump_sects
> 0)
22245 if (filedata
->dump
.num_dump_sects
== 0)
22246 /* A sneaky way of allocating the dump_sects array. */
22247 request_dump_bynumber (&filedata
->dump
, cmdline
.num_dump_sects
, 0);
22249 assert (filedata
->dump
.num_dump_sects
>= cmdline
.num_dump_sects
);
22250 memcpy (filedata
->dump
.dump_sects
, cmdline
.dump_sects
,
22251 cmdline
.num_dump_sects
* sizeof (*filedata
->dump
.dump_sects
));
22255 /* Process one ELF object file according to the command line options.
22256 This file may actually be stored in an archive. The file is
22257 positioned at the start of the ELF object. Returns TRUE if no
22258 problems were encountered, FALSE otherwise. */
22261 process_object (Filedata
* filedata
)
22263 bool have_separate_files
;
22267 if (! get_file_header (filedata
))
22269 error (_("%s: Failed to read file header\n"), filedata
->file_name
);
22273 /* Initialise per file variables. */
22274 for (i
= ARRAY_SIZE (filedata
->version_info
); i
--;)
22275 filedata
->version_info
[i
] = 0;
22277 for (i
= ARRAY_SIZE (filedata
->dynamic_info
); i
--;)
22278 filedata
->dynamic_info
[i
] = 0;
22279 filedata
->dynamic_info_DT_GNU_HASH
= 0;
22280 filedata
->dynamic_info_DT_MIPS_XHASH
= 0;
22282 /* Process the file. */
22284 printf (_("\nFile: %s\n"), filedata
->file_name
);
22286 initialise_dump_sects (filedata
);
22288 /* There may be some extensions in the first section header. Don't
22289 bomb if we can't read it. */
22290 get_section_headers (filedata
, true);
22292 if (! process_file_header (filedata
))
22298 /* Throw away the single section header read above, so that we
22299 re-read the entire set. */
22300 free (filedata
->section_headers
);
22301 filedata
->section_headers
= NULL
;
22303 if (! process_section_headers (filedata
))
22305 /* Without loaded section headers we cannot process lots of things. */
22306 do_unwind
= do_version
= do_dump
= do_arch
= false;
22308 if (! do_using_dynamic
)
22309 do_syms
= do_dyn_syms
= do_reloc
= false;
22312 if (! process_section_groups (filedata
))
22313 /* Without loaded section groups we cannot process unwind. */
22316 process_program_headers (filedata
);
22318 res
= process_dynamic_section (filedata
);
22320 if (! process_relocs (filedata
))
22323 if (! process_unwind (filedata
))
22326 if (! process_symbol_table (filedata
))
22329 if (! process_lto_symbol_tables (filedata
))
22332 if (! process_syminfo (filedata
))
22335 if (! process_version_sections (filedata
))
22338 if (filedata
->file_header
.e_shstrndx
!= SHN_UNDEF
)
22339 have_separate_files
= load_separate_debug_files (filedata
, filedata
->file_name
);
22341 have_separate_files
= false;
22343 if (! process_section_contents (filedata
))
22346 if (have_separate_files
)
22350 for (d
= first_separate_info
; d
!= NULL
; d
= d
->next
)
22352 initialise_dump_sects (d
->handle
);
22354 if (process_links
&& ! process_file_header (d
->handle
))
22356 else if (! process_section_headers (d
->handle
))
22358 else if (! process_section_contents (d
->handle
))
22360 else if (process_links
)
22362 if (! process_section_groups (d
->handle
))
22364 process_program_headers (d
->handle
);
22365 if (! process_dynamic_section (d
->handle
))
22367 if (! process_relocs (d
->handle
))
22369 if (! process_unwind (d
->handle
))
22371 if (! process_symbol_table (d
->handle
))
22373 if (! process_lto_symbol_tables (d
->handle
))
22375 if (! process_syminfo (d
->handle
))
22377 if (! process_version_sections (d
->handle
))
22379 if (! process_notes (d
->handle
))
22384 /* The file handles are closed by the call to free_debug_memory() below. */
22387 if (! process_notes (filedata
))
22390 if (! process_gnu_liblist (filedata
))
22393 if (! process_arch_specific (filedata
))
22397 free_filedata (filedata
);
22399 free_debug_memory ();
22404 /* Process an ELF archive.
22405 On entry the file is positioned just after the ARMAG string.
22406 Returns TRUE upon success, FALSE otherwise. */
22409 process_archive (Filedata
* filedata
, bool is_thin_archive
)
22411 struct archive_info arch
;
22412 struct archive_info nested_arch
;
22418 /* The ARCH structure is used to hold information about this archive. */
22419 arch
.file_name
= NULL
;
22421 arch
.index_array
= NULL
;
22422 arch
.sym_table
= NULL
;
22423 arch
.longnames
= NULL
;
22425 /* The NESTED_ARCH structure is used as a single-item cache of information
22426 about a nested archive (when members of a thin archive reside within
22427 another regular archive file). */
22428 nested_arch
.file_name
= NULL
;
22429 nested_arch
.file
= NULL
;
22430 nested_arch
.index_array
= NULL
;
22431 nested_arch
.sym_table
= NULL
;
22432 nested_arch
.longnames
= NULL
;
22434 if (setup_archive (&arch
, filedata
->file_name
, filedata
->handle
,
22435 filedata
->file_size
, is_thin_archive
,
22436 do_archive_index
) != 0)
22442 if (do_archive_index
)
22444 if (arch
.sym_table
== NULL
)
22445 error (_("%s: unable to dump the index as none was found\n"),
22446 filedata
->file_name
);
22449 unsigned long i
, l
;
22450 unsigned long current_pos
;
22452 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes "
22453 "in the symbol table)\n"),
22454 filedata
->file_name
, (unsigned long) arch
.index_num
,
22457 current_pos
= ftell (filedata
->handle
);
22459 for (i
= l
= 0; i
< arch
.index_num
; i
++)
22462 || (i
> 0 && arch
.index_array
[i
] != arch
.index_array
[i
- 1]))
22465 = get_archive_member_name_at (&arch
, arch
.index_array
[i
],
22468 if (member_name
!= NULL
)
22470 char * qualified_name
22471 = make_qualified_name (&arch
, &nested_arch
,
22474 if (qualified_name
!= NULL
)
22476 printf (_("Contents of binary %s at offset "),
22478 (void) print_vma (arch
.index_array
[i
], PREFIX_HEX
);
22480 free (qualified_name
);
22482 free (member_name
);
22486 if (l
>= arch
.sym_size
)
22488 error (_("%s: end of the symbol table reached "
22489 "before the end of the index\n"),
22490 filedata
->file_name
);
22494 /* PR 17531: file: 0b6630b2. */
22495 printf ("\t%.*s\n",
22496 (int) (arch
.sym_size
- l
), arch
.sym_table
+ l
);
22497 l
+= strnlen (arch
.sym_table
+ l
, arch
.sym_size
- l
) + 1;
22500 if (arch
.uses_64bit_indices
)
22505 if (l
< arch
.sym_size
)
22507 error (ngettext ("%s: %ld byte remains in the symbol table, "
22508 "but without corresponding entries in "
22509 "the index table\n",
22510 "%s: %ld bytes remain in the symbol table, "
22511 "but without corresponding entries in "
22512 "the index table\n",
22513 arch
.sym_size
- l
),
22514 filedata
->file_name
, arch
.sym_size
- l
);
22518 if (fseek (filedata
->handle
, current_pos
, SEEK_SET
) != 0)
22520 error (_("%s: failed to seek back to start of object files "
22521 "in the archive\n"),
22522 filedata
->file_name
);
22528 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
22529 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
22530 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
22531 && !do_section_groups
&& !do_dyn_syms
)
22533 ret
= true; /* Archive index only. */
22542 char * qualified_name
;
22544 /* Read the next archive header. */
22545 if (fseek (filedata
->handle
, arch
.next_arhdr_offset
, SEEK_SET
) != 0)
22547 error (_("%s: failed to seek to next archive header\n"),
22552 got
= fread (&arch
.arhdr
, 1, sizeof arch
.arhdr
, filedata
->handle
);
22553 if (got
!= sizeof arch
.arhdr
)
22557 /* PR 24049 - we cannot use filedata->file_name as this will
22558 have already been freed. */
22559 error (_("%s: failed to read archive header\n"), arch
.file_name
);
22564 if (memcmp (arch
.arhdr
.ar_fmag
, ARFMAG
, 2) != 0)
22566 error (_("%s: did not find a valid archive header\n"),
22572 arch
.next_arhdr_offset
+= sizeof arch
.arhdr
;
22574 filedata
->archive_file_size
= strtoul (arch
.arhdr
.ar_size
, NULL
, 10);
22576 name
= get_archive_member_name (&arch
, &nested_arch
);
22579 error (_("%s: bad archive file name\n"), arch
.file_name
);
22583 namelen
= strlen (name
);
22585 qualified_name
= make_qualified_name (&arch
, &nested_arch
, name
);
22586 if (qualified_name
== NULL
)
22588 error (_("%s: bad archive file name\n"), arch
.file_name
);
22594 if (is_thin_archive
&& arch
.nested_member_origin
== 0)
22596 /* This is a proxy for an external member of a thin archive. */
22597 Filedata
* member_filedata
;
22598 char * member_file_name
= adjust_relative_path
22599 (filedata
->file_name
, name
, namelen
);
22602 if (member_file_name
== NULL
)
22604 free (qualified_name
);
22609 member_filedata
= open_file (member_file_name
, false);
22610 if (member_filedata
== NULL
)
22612 error (_("Input file '%s' is not readable.\n"), member_file_name
);
22613 free (member_file_name
);
22614 free (qualified_name
);
22619 filedata
->archive_file_offset
= arch
.nested_member_origin
;
22620 member_filedata
->file_name
= qualified_name
;
22622 /* The call to process_object() expects the file to be at the beginning. */
22623 rewind (member_filedata
->handle
);
22625 if (! process_object (member_filedata
))
22628 close_file (member_filedata
);
22629 free (member_file_name
);
22631 else if (is_thin_archive
)
22633 Filedata thin_filedata
;
22635 memset (&thin_filedata
, 0, sizeof (thin_filedata
));
22637 /* PR 15140: Allow for corrupt thin archives. */
22638 if (nested_arch
.file
== NULL
)
22640 error (_("%s: contains corrupt thin archive: %s\n"),
22641 qualified_name
, name
);
22642 free (qualified_name
);
22649 /* This is a proxy for a member of a nested archive. */
22650 filedata
->archive_file_offset
22651 = arch
.nested_member_origin
+ sizeof arch
.arhdr
;
22653 /* The nested archive file will have been opened and setup by
22654 get_archive_member_name. */
22655 if (fseek (nested_arch
.file
, filedata
->archive_file_offset
,
22658 error (_("%s: failed to seek to archive member.\n"),
22659 nested_arch
.file_name
);
22660 free (qualified_name
);
22665 thin_filedata
.handle
= nested_arch
.file
;
22666 thin_filedata
.file_name
= qualified_name
;
22668 if (! process_object (& thin_filedata
))
22674 filedata
->archive_file_offset
= arch
.next_arhdr_offset
;
22675 filedata
->file_name
= qualified_name
;
22676 if (! process_object (filedata
))
22678 arch
.next_arhdr_offset
+= (filedata
->archive_file_size
+ 1) & -2;
22679 /* Stop looping with "negative" archive_file_size. */
22680 if (arch
.next_arhdr_offset
< filedata
->archive_file_size
)
22681 arch
.next_arhdr_offset
= -1ul;
22684 free (qualified_name
);
22688 if (nested_arch
.file
!= NULL
)
22689 fclose (nested_arch
.file
);
22690 release_archive (&nested_arch
);
22691 release_archive (&arch
);
22697 process_file (char * file_name
)
22699 Filedata
* filedata
= NULL
;
22700 struct stat statbuf
;
22701 char armag
[SARMAG
];
22704 if (stat (file_name
, &statbuf
) < 0)
22706 if (errno
== ENOENT
)
22707 error (_("'%s': No such file\n"), file_name
);
22709 error (_("Could not locate '%s'. System error message: %s\n"),
22710 file_name
, strerror (errno
));
22714 if (! S_ISREG (statbuf
.st_mode
))
22716 error (_("'%s' is not an ordinary file\n"), file_name
);
22720 filedata
= calloc (1, sizeof * filedata
);
22721 if (filedata
== NULL
)
22723 error (_("Out of memory allocating file data structure\n"));
22727 filedata
->file_name
= file_name
;
22728 filedata
->handle
= fopen (file_name
, "rb");
22729 if (filedata
->handle
== NULL
)
22731 error (_("Input file '%s' is not readable.\n"), file_name
);
22736 if (fread (armag
, SARMAG
, 1, filedata
->handle
) != 1)
22738 error (_("%s: Failed to read file's magic number\n"), file_name
);
22739 fclose (filedata
->handle
);
22744 filedata
->file_size
= (bfd_size_type
) statbuf
.st_size
;
22745 filedata
->is_separate
= false;
22747 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
22749 if (! process_archive (filedata
, false))
22752 else if (memcmp (armag
, ARMAGT
, SARMAG
) == 0)
22754 if ( ! process_archive (filedata
, true))
22759 if (do_archive_index
&& !check_all
)
22760 error (_("File %s is not an archive so its index cannot be displayed.\n"),
22763 rewind (filedata
->handle
);
22764 filedata
->archive_file_size
= filedata
->archive_file_offset
= 0;
22766 if (! process_object (filedata
))
22770 fclose (filedata
->handle
);
22771 free (filedata
->section_headers
);
22772 free (filedata
->program_headers
);
22773 free (filedata
->string_table
);
22774 free (filedata
->dump
.dump_sects
);
22777 free (ba_cache
.strtab
);
22778 ba_cache
.strtab
= NULL
;
22779 free (ba_cache
.symtab
);
22780 ba_cache
.symtab
= NULL
;
22781 ba_cache
.filedata
= NULL
;
22786 #ifdef SUPPORT_DISASSEMBLY
22787 /* Needed by the i386 disassembler. For extra credit, someone could
22788 fix this so that we insert symbolic addresses here, esp for GOT/PLT
22792 print_address (unsigned int addr
, FILE * outfile
)
22794 fprintf (outfile
,"0x%8.8x", addr
);
22797 /* Needed by the i386 disassembler. */
22800 db_task_printsym (unsigned int addr
)
22802 print_address (addr
, stderr
);
22807 main (int argc
, char ** argv
)
22811 #ifdef HAVE_LC_MESSAGES
22812 setlocale (LC_MESSAGES
, "");
22814 setlocale (LC_CTYPE
, "");
22815 bindtextdomain (PACKAGE
, LOCALEDIR
);
22816 textdomain (PACKAGE
);
22818 expandargv (&argc
, &argv
);
22820 parse_args (& cmdline
, argc
, argv
);
22822 if (optind
< (argc
- 1))
22823 /* When displaying information for more than one file,
22824 prefix the information with the file name. */
22826 else if (optind
>= argc
)
22828 /* Ensure that the warning is always displayed. */
22831 warn (_("Nothing to do.\n"));
22836 while (optind
< argc
)
22837 if (! process_file (argv
[optind
++]))
22840 free (cmdline
.dump_sects
);
22842 free (dump_ctf_symtab_name
);
22843 free (dump_ctf_strtab_name
);
22844 free (dump_ctf_parent_name
);
22846 return err
? EXIT_FAILURE
: EXIT_SUCCESS
;