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;
5531 do_debugging
= true;
5533 dump_any_debugging
= true;
5534 dwarf_select_sections_all ();
5538 do_debugging
= false;
5539 if (dwarf_select_sections_by_letters (optarg
))
5542 dump_any_debugging
= true;
5546 case OPTION_DEBUG_DUMP
:
5550 do_debugging
= true;
5551 dump_any_debugging
= true;
5552 dwarf_select_sections_all ();
5556 do_debugging
= false;
5557 if (dwarf_select_sections_by_names (optarg
))
5560 dump_any_debugging
= true;
5564 case OPTION_DWARF_DEPTH
:
5568 dwarf_cutoff_level
= strtoul (optarg
, & cp
, 0);
5571 case OPTION_DWARF_START
:
5575 dwarf_start_die
= strtoul (optarg
, & cp
, 0);
5578 case OPTION_DWARF_CHECK
:
5581 case OPTION_CTF_DUMP
:
5583 request_dump (dumpdata
, CTF_DUMP
);
5585 case OPTION_CTF_SYMBOLS
:
5586 free (dump_ctf_symtab_name
);
5587 dump_ctf_symtab_name
= strdup (optarg
);
5589 case OPTION_CTF_STRINGS
:
5590 free (dump_ctf_strtab_name
);
5591 dump_ctf_strtab_name
= strdup (optarg
);
5593 case OPTION_CTF_PARENT
:
5594 free (dump_ctf_parent_name
);
5595 dump_ctf_parent_name
= strdup (optarg
);
5597 case OPTION_DYN_SYMS
:
5600 case OPTION_LTO_SYMS
:
5603 #ifdef SUPPORT_DISASSEMBLY
5605 request_dump (dumpdata
, DISASS_DUMP
);
5609 print_version (program_name
);
5618 do_not_show_symbol_truncation
= true;
5624 enum demangling_styles style
;
5626 style
= cplus_demangle_name_to_style (optarg
);
5627 if (style
== unknown_demangling
)
5628 error (_("unknown demangling style `%s'"), optarg
);
5630 cplus_demangle_set_style (style
);
5633 case OPTION_NO_DEMANGLING
:
5634 do_demangle
= false;
5636 case OPTION_RECURSE_LIMIT
:
5637 demangle_flags
&= ~ DMGL_NO_RECURSE_LIMIT
;
5639 case OPTION_NO_RECURSE_LIMIT
:
5640 demangle_flags
|= DMGL_NO_RECURSE_LIMIT
;
5642 case OPTION_WITH_SYMBOL_VERSIONS
:
5643 /* Ignored for backward compatibility. */
5648 error (_("Missing arg to -U/--unicode")); /* Can this happen ? */
5649 else if (streq (optarg
, "default") || streq (optarg
, "d"))
5650 unicode_display
= unicode_default
;
5651 else if (streq (optarg
, "locale") || streq (optarg
, "l"))
5652 unicode_display
= unicode_locale
;
5653 else if (streq (optarg
, "escape") || streq (optarg
, "e"))
5654 unicode_display
= unicode_escape
;
5655 else if (streq (optarg
, "invalid") || streq (optarg
, "i"))
5656 unicode_display
= unicode_invalid
;
5657 else if (streq (optarg
, "hex") || streq (optarg
, "x"))
5658 unicode_display
= unicode_hex
;
5659 else if (streq (optarg
, "highlight") || streq (optarg
, "h"))
5660 unicode_display
= unicode_highlight
;
5662 error (_("invalid argument to -U/--unicode: %s"), optarg
);
5665 case OPTION_SYM_BASE
:
5669 sym_base
= strtoul (optarg
, NULL
, 0);
5686 /* xgettext:c-format */
5687 error (_("Invalid option '-%c'\n"), c
);
5694 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
5695 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
5696 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
5697 && !do_section_groups
&& !do_archive_index
5698 && !do_dyn_syms
&& !do_lto_syms
)
5703 do_dynamic
= do_syms
= do_reloc
= do_unwind
= do_sections
= true;
5704 do_segments
= do_header
= do_dump
= do_version
= true;
5705 do_histogram
= do_debugging
= do_arch
= do_notes
= true;
5706 do_section_groups
= do_archive_index
= do_dyn_syms
= true;
5715 get_elf_class (unsigned int elf_class
)
5717 static char buff
[32];
5721 case ELFCLASSNONE
: return _("none");
5722 case ELFCLASS32
: return "ELF32";
5723 case ELFCLASS64
: return "ELF64";
5725 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), elf_class
);
5731 get_data_encoding (unsigned int encoding
)
5733 static char buff
[32];
5737 case ELFDATANONE
: return _("none");
5738 case ELFDATA2LSB
: return _("2's complement, little endian");
5739 case ELFDATA2MSB
: return _("2's complement, big endian");
5741 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), encoding
);
5746 /* Decode the data held in 'filedata->file_header'. */
5749 process_file_header (Filedata
* filedata
)
5751 Elf_Internal_Ehdr
* header
= & filedata
->file_header
;
5753 if ( header
->e_ident
[EI_MAG0
] != ELFMAG0
5754 || header
->e_ident
[EI_MAG1
] != ELFMAG1
5755 || header
->e_ident
[EI_MAG2
] != ELFMAG2
5756 || header
->e_ident
[EI_MAG3
] != ELFMAG3
)
5759 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
5763 if (! filedata
->is_separate
)
5764 init_dwarf_regnames_by_elf_machine_code (header
->e_machine
);
5770 if (filedata
->is_separate
)
5771 printf (_("ELF Header in linked file '%s':\n"), filedata
->file_name
);
5773 printf (_("ELF Header:\n"));
5774 printf (_(" Magic: "));
5775 for (i
= 0; i
< EI_NIDENT
; i
++)
5776 printf ("%2.2x ", header
->e_ident
[i
]);
5778 printf (_(" Class: %s\n"),
5779 get_elf_class (header
->e_ident
[EI_CLASS
]));
5780 printf (_(" Data: %s\n"),
5781 get_data_encoding (header
->e_ident
[EI_DATA
]));
5782 printf (_(" Version: %d%s\n"),
5783 header
->e_ident
[EI_VERSION
],
5784 (header
->e_ident
[EI_VERSION
] == EV_CURRENT
5786 : (header
->e_ident
[EI_VERSION
] != EV_NONE
5789 printf (_(" OS/ABI: %s\n"),
5790 get_osabi_name (filedata
, header
->e_ident
[EI_OSABI
]));
5791 printf (_(" ABI Version: %d\n"),
5792 header
->e_ident
[EI_ABIVERSION
]);
5793 printf (_(" Type: %s\n"),
5794 get_file_type (filedata
));
5795 printf (_(" Machine: %s\n"),
5796 get_machine_name (header
->e_machine
));
5797 printf (_(" Version: 0x%lx\n"),
5800 printf (_(" Entry point address: "));
5801 print_vma (header
->e_entry
, PREFIX_HEX
);
5802 printf (_("\n Start of program headers: "));
5803 print_vma (header
->e_phoff
, DEC
);
5804 printf (_(" (bytes into file)\n Start of section headers: "));
5805 print_vma (header
->e_shoff
, DEC
);
5806 printf (_(" (bytes into file)\n"));
5808 printf (_(" Flags: 0x%lx%s\n"),
5810 get_machine_flags (filedata
, header
->e_flags
, header
->e_machine
));
5811 printf (_(" Size of this header: %u (bytes)\n"),
5813 printf (_(" Size of program headers: %u (bytes)\n"),
5814 header
->e_phentsize
);
5815 printf (_(" Number of program headers: %u"),
5817 if (filedata
->section_headers
!= NULL
5818 && header
->e_phnum
== PN_XNUM
5819 && filedata
->section_headers
[0].sh_info
!= 0)
5820 printf (" (%u)", filedata
->section_headers
[0].sh_info
);
5821 putc ('\n', stdout
);
5822 printf (_(" Size of section headers: %u (bytes)\n"),
5823 header
->e_shentsize
);
5824 printf (_(" Number of section headers: %u"),
5826 if (filedata
->section_headers
!= NULL
&& header
->e_shnum
== SHN_UNDEF
)
5828 header
->e_shnum
= filedata
->section_headers
[0].sh_size
;
5829 printf (" (%u)", header
->e_shnum
);
5831 putc ('\n', stdout
);
5832 printf (_(" Section header string table index: %u"),
5833 header
->e_shstrndx
);
5834 if (filedata
->section_headers
!= NULL
5835 && header
->e_shstrndx
== (SHN_XINDEX
& 0xffff))
5837 header
->e_shstrndx
= filedata
->section_headers
[0].sh_link
;
5838 printf (" (%u)", header
->e_shstrndx
);
5840 if (header
->e_shstrndx
!= SHN_UNDEF
5841 && header
->e_shstrndx
>= header
->e_shnum
)
5843 header
->e_shstrndx
= SHN_UNDEF
;
5844 printf (_(" <corrupt: out of range>"));
5846 putc ('\n', stdout
);
5849 if (filedata
->section_headers
!= NULL
)
5851 if (header
->e_phnum
== PN_XNUM
5852 && filedata
->section_headers
[0].sh_info
!= 0)
5854 /* Throw away any cached read of PN_XNUM headers. */
5855 free (filedata
->program_headers
);
5856 filedata
->program_headers
= NULL
;
5857 header
->e_phnum
= filedata
->section_headers
[0].sh_info
;
5859 if (header
->e_shnum
== SHN_UNDEF
)
5860 header
->e_shnum
= filedata
->section_headers
[0].sh_size
;
5861 if (header
->e_shstrndx
== (SHN_XINDEX
& 0xffff))
5862 header
->e_shstrndx
= filedata
->section_headers
[0].sh_link
;
5863 if (header
->e_shstrndx
>= header
->e_shnum
)
5864 header
->e_shstrndx
= SHN_UNDEF
;
5870 /* Read in the program headers from FILEDATA and store them in PHEADERS.
5871 Returns TRUE upon success, FALSE otherwise. Loads 32-bit headers. */
5874 get_32bit_program_headers (Filedata
* filedata
, Elf_Internal_Phdr
* pheaders
)
5876 Elf32_External_Phdr
* phdrs
;
5877 Elf32_External_Phdr
* external
;
5878 Elf_Internal_Phdr
* internal
;
5880 unsigned int size
= filedata
->file_header
.e_phentsize
;
5881 unsigned int num
= filedata
->file_header
.e_phnum
;
5883 /* PR binutils/17531: Cope with unexpected section header sizes. */
5884 if (size
== 0 || num
== 0)
5886 if (size
< sizeof * phdrs
)
5888 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
5891 if (size
> sizeof * phdrs
)
5892 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
5894 phdrs
= (Elf32_External_Phdr
*) get_data (NULL
, filedata
, filedata
->file_header
.e_phoff
,
5895 size
, num
, _("program headers"));
5899 for (i
= 0, internal
= pheaders
, external
= phdrs
;
5900 i
< filedata
->file_header
.e_phnum
;
5901 i
++, internal
++, external
++)
5903 internal
->p_type
= BYTE_GET (external
->p_type
);
5904 internal
->p_offset
= BYTE_GET (external
->p_offset
);
5905 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
5906 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
5907 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
5908 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
5909 internal
->p_flags
= BYTE_GET (external
->p_flags
);
5910 internal
->p_align
= BYTE_GET (external
->p_align
);
5917 /* Read in the program headers from FILEDATA and store them in PHEADERS.
5918 Returns TRUE upon success, FALSE otherwise. Loads 64-bit headers. */
5921 get_64bit_program_headers (Filedata
* filedata
, Elf_Internal_Phdr
* pheaders
)
5923 Elf64_External_Phdr
* phdrs
;
5924 Elf64_External_Phdr
* external
;
5925 Elf_Internal_Phdr
* internal
;
5927 unsigned int size
= filedata
->file_header
.e_phentsize
;
5928 unsigned int num
= filedata
->file_header
.e_phnum
;
5930 /* PR binutils/17531: Cope with unexpected section header sizes. */
5931 if (size
== 0 || num
== 0)
5933 if (size
< sizeof * phdrs
)
5935 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
5938 if (size
> sizeof * phdrs
)
5939 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
5941 phdrs
= (Elf64_External_Phdr
*) get_data (NULL
, filedata
, filedata
->file_header
.e_phoff
,
5942 size
, num
, _("program headers"));
5946 for (i
= 0, internal
= pheaders
, external
= phdrs
;
5947 i
< filedata
->file_header
.e_phnum
;
5948 i
++, internal
++, external
++)
5950 internal
->p_type
= BYTE_GET (external
->p_type
);
5951 internal
->p_flags
= BYTE_GET (external
->p_flags
);
5952 internal
->p_offset
= BYTE_GET (external
->p_offset
);
5953 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
5954 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
5955 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
5956 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
5957 internal
->p_align
= BYTE_GET (external
->p_align
);
5964 /* Returns TRUE if the program headers were read into `program_headers'. */
5967 get_program_headers (Filedata
* filedata
)
5969 Elf_Internal_Phdr
* phdrs
;
5971 /* Check cache of prior read. */
5972 if (filedata
->program_headers
!= NULL
)
5975 /* Be kind to memory checkers by looking for
5976 e_phnum values which we know must be invalid. */
5977 if (filedata
->file_header
.e_phnum
5978 * (is_32bit_elf
? sizeof (Elf32_External_Phdr
) : sizeof (Elf64_External_Phdr
))
5979 >= filedata
->file_size
)
5981 error (_("Too many program headers - %#x - the file is not that big\n"),
5982 filedata
->file_header
.e_phnum
);
5986 phdrs
= (Elf_Internal_Phdr
*) cmalloc (filedata
->file_header
.e_phnum
,
5987 sizeof (Elf_Internal_Phdr
));
5990 error (_("Out of memory reading %u program headers\n"),
5991 filedata
->file_header
.e_phnum
);
5996 ? get_32bit_program_headers (filedata
, phdrs
)
5997 : get_64bit_program_headers (filedata
, phdrs
))
5999 filedata
->program_headers
= phdrs
;
6007 /* Print program header info and locate dynamic section. */
6010 process_program_headers (Filedata
* filedata
)
6012 Elf_Internal_Phdr
* segment
;
6014 Elf_Internal_Phdr
* previous_load
= NULL
;
6016 if (filedata
->file_header
.e_phnum
== 0)
6018 /* PR binutils/12467. */
6019 if (filedata
->file_header
.e_phoff
!= 0)
6020 warn (_("possibly corrupt ELF header - it has a non-zero program"
6021 " header offset, but no program headers\n"));
6022 else if (do_segments
)
6024 if (filedata
->is_separate
)
6025 printf (_("\nThere are no program headers in linked file '%s'.\n"),
6026 filedata
->file_name
);
6028 printf (_("\nThere are no program headers in this file.\n"));
6033 if (do_segments
&& !do_header
)
6035 if (filedata
->is_separate
)
6036 printf ("\nIn linked file '%s' the ELF file type is %s\n",
6037 filedata
->file_name
, get_file_type (filedata
));
6039 printf (_("\nElf file type is %s\n"), get_file_type (filedata
));
6040 printf (_("Entry point 0x%s\n"), bfd_vmatoa ("x", filedata
->file_header
.e_entry
));
6041 printf (ngettext ("There is %d program header, starting at offset %s\n",
6042 "There are %d program headers, starting at offset %s\n",
6043 filedata
->file_header
.e_phnum
),
6044 filedata
->file_header
.e_phnum
,
6045 bfd_vmatoa ("u", filedata
->file_header
.e_phoff
));
6048 if (! get_program_headers (filedata
))
6053 if (filedata
->file_header
.e_phnum
> 1)
6054 printf (_("\nProgram Headers:\n"));
6056 printf (_("\nProgram Headers:\n"));
6060 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
6063 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
6067 (_(" Type Offset VirtAddr PhysAddr\n"));
6069 (_(" FileSiz MemSiz Flags Align\n"));
6073 unsigned long dynamic_addr
= 0;
6074 bfd_size_type dynamic_size
= 0;
6075 for (i
= 0, segment
= filedata
->program_headers
;
6076 i
< filedata
->file_header
.e_phnum
;
6081 printf (" %-14.14s ", get_segment_type (filedata
, segment
->p_type
));
6085 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
6086 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
6087 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
6088 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
6089 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
6091 (segment
->p_flags
& PF_R
? 'R' : ' '),
6092 (segment
->p_flags
& PF_W
? 'W' : ' '),
6093 (segment
->p_flags
& PF_X
? 'E' : ' '));
6094 printf ("%#lx", (unsigned long) segment
->p_align
);
6098 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
6099 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
6102 print_vma (segment
->p_offset
, FULL_HEX
);
6106 print_vma (segment
->p_vaddr
, FULL_HEX
);
6108 print_vma (segment
->p_paddr
, FULL_HEX
);
6111 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
6112 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
6115 print_vma (segment
->p_filesz
, FULL_HEX
);
6119 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
6120 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
6123 print_vma (segment
->p_memsz
, FULL_HEX
);
6127 (segment
->p_flags
& PF_R
? 'R' : ' '),
6128 (segment
->p_flags
& PF_W
? 'W' : ' '),
6129 (segment
->p_flags
& PF_X
? 'E' : ' '));
6131 if ((unsigned long) segment
->p_align
== segment
->p_align
)
6132 printf ("%#lx", (unsigned long) segment
->p_align
);
6135 print_vma (segment
->p_align
, PREFIX_HEX
);
6140 print_vma (segment
->p_offset
, FULL_HEX
);
6142 print_vma (segment
->p_vaddr
, FULL_HEX
);
6144 print_vma (segment
->p_paddr
, FULL_HEX
);
6146 print_vma (segment
->p_filesz
, FULL_HEX
);
6148 print_vma (segment
->p_memsz
, FULL_HEX
);
6150 (segment
->p_flags
& PF_R
? 'R' : ' '),
6151 (segment
->p_flags
& PF_W
? 'W' : ' '),
6152 (segment
->p_flags
& PF_X
? 'E' : ' '));
6153 print_vma (segment
->p_align
, PREFIX_HEX
);
6156 putc ('\n', stdout
);
6159 switch (segment
->p_type
)
6162 #if 0 /* Do not warn about out of order PT_LOAD segments. Although officially
6163 required by the ELF standard, several programs, including the Linux
6164 kernel, make use of non-ordered segments. */
6166 && previous_load
->p_vaddr
> segment
->p_vaddr
)
6167 error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
6169 if (segment
->p_memsz
< segment
->p_filesz
)
6170 error (_("the segment's file size is larger than its memory size\n"));
6171 previous_load
= segment
;
6175 /* PR 20815 - Verify that the program header is loaded into memory. */
6176 if (i
> 0 && previous_load
!= NULL
)
6177 error (_("the PHDR segment must occur before any LOAD segment\n"));
6178 if (filedata
->file_header
.e_machine
!= EM_PARISC
)
6182 for (j
= 1; j
< filedata
->file_header
.e_phnum
; j
++)
6184 Elf_Internal_Phdr
*load
= filedata
->program_headers
+ j
;
6185 if (load
->p_type
== PT_LOAD
6186 && load
->p_offset
<= segment
->p_offset
6187 && (load
->p_offset
+ load
->p_filesz
6188 >= segment
->p_offset
+ segment
->p_filesz
)
6189 && load
->p_vaddr
<= segment
->p_vaddr
6190 && (load
->p_vaddr
+ load
->p_filesz
6191 >= segment
->p_vaddr
+ segment
->p_filesz
))
6194 if (j
== filedata
->file_header
.e_phnum
)
6195 error (_("the PHDR segment is not covered by a LOAD segment\n"));
6201 error (_("more than one dynamic segment\n"));
6203 /* By default, assume that the .dynamic section is the first
6204 section in the DYNAMIC segment. */
6205 dynamic_addr
= segment
->p_offset
;
6206 dynamic_size
= segment
->p_filesz
;
6208 /* Try to locate the .dynamic section. If there is
6209 a section header table, we can easily locate it. */
6210 if (filedata
->section_headers
!= NULL
)
6212 Elf_Internal_Shdr
* sec
;
6214 sec
= find_section (filedata
, ".dynamic");
6215 if (sec
== NULL
|| sec
->sh_size
== 0)
6217 /* A corresponding .dynamic section is expected, but on
6218 IA-64/OpenVMS it is OK for it to be missing. */
6219 if (!is_ia64_vms (filedata
))
6220 error (_("no .dynamic section in the dynamic segment\n"));
6224 if (sec
->sh_type
== SHT_NOBITS
)
6231 dynamic_addr
= sec
->sh_offset
;
6232 dynamic_size
= sec
->sh_size
;
6234 /* The PT_DYNAMIC segment, which is used by the run-time
6235 loader, should exactly match the .dynamic section. */
6237 && (dynamic_addr
!= segment
->p_offset
6238 || dynamic_size
!= segment
->p_filesz
))
6240 the .dynamic section is not the same as the dynamic segment\n"));
6243 /* PR binutils/17512: Avoid corrupt dynamic section info in the
6244 segment. Check this after matching against the section headers
6245 so we don't warn on debuginfo file (which have NOBITS .dynamic
6247 if (dynamic_addr
> filedata
->file_size
6248 || (dynamic_size
> filedata
->file_size
- dynamic_addr
))
6250 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
6257 if (segment
->p_offset
>= filedata
->file_size
6258 || segment
->p_filesz
> filedata
->file_size
- segment
->p_offset
6259 || segment
->p_filesz
- 1 >= (size_t) -2
6260 || fseek (filedata
->handle
,
6261 filedata
->archive_file_offset
+ (long) segment
->p_offset
,
6263 error (_("Unable to find program interpreter name\n"));
6266 size_t len
= segment
->p_filesz
;
6267 free (filedata
->program_interpreter
);
6268 filedata
->program_interpreter
= xmalloc (len
+ 1);
6269 len
= fread (filedata
->program_interpreter
, 1, len
,
6271 filedata
->program_interpreter
[len
] = 0;
6274 printf (_(" [Requesting program interpreter: %s]\n"),
6275 filedata
->program_interpreter
);
6282 && filedata
->section_headers
!= NULL
6283 && filedata
->string_table
!= NULL
)
6285 printf (_("\n Section to Segment mapping:\n"));
6286 printf (_(" Segment Sections...\n"));
6288 for (i
= 0; i
< filedata
->file_header
.e_phnum
; i
++)
6291 Elf_Internal_Shdr
* section
;
6293 segment
= filedata
->program_headers
+ i
;
6294 section
= filedata
->section_headers
+ 1;
6296 printf (" %2.2d ", i
);
6298 for (j
= 1; j
< filedata
->file_header
.e_shnum
; j
++, section
++)
6300 if (!ELF_TBSS_SPECIAL (section
, segment
)
6301 && ELF_SECTION_IN_SEGMENT_STRICT (section
, segment
))
6302 printf ("%s ", printable_section_name (filedata
, section
));
6309 filedata
->dynamic_addr
= dynamic_addr
;
6310 filedata
->dynamic_size
= dynamic_size
? dynamic_size
: 1;
6314 filedata
->dynamic_addr
= 0;
6315 filedata
->dynamic_size
= 1;
6319 /* Find the file offset corresponding to VMA by using the program headers. */
6322 offset_from_vma (Filedata
* filedata
, bfd_vma vma
, bfd_size_type size
)
6324 Elf_Internal_Phdr
* seg
;
6326 if (! get_program_headers (filedata
))
6328 warn (_("Cannot interpret virtual addresses without program headers.\n"));
6332 for (seg
= filedata
->program_headers
;
6333 seg
< filedata
->program_headers
+ filedata
->file_header
.e_phnum
;
6336 if (seg
->p_type
!= PT_LOAD
)
6339 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
6340 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
6341 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
6344 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
6345 (unsigned long) vma
);
6350 /* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers.
6351 If PROBE is true, this is just a probe and we do not generate any error
6352 messages if the load fails. */
6355 get_32bit_section_headers (Filedata
* filedata
, bool probe
)
6357 Elf32_External_Shdr
* shdrs
;
6358 Elf_Internal_Shdr
* internal
;
6360 unsigned int size
= filedata
->file_header
.e_shentsize
;
6361 unsigned int num
= probe
? 1 : filedata
->file_header
.e_shnum
;
6363 /* PR binutils/17531: Cope with unexpected section header sizes. */
6364 if (size
== 0 || num
== 0)
6366 if (size
< sizeof * shdrs
)
6369 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
6372 if (!probe
&& size
> sizeof * shdrs
)
6373 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
6375 shdrs
= (Elf32_External_Shdr
*) get_data (NULL
, filedata
, filedata
->file_header
.e_shoff
,
6377 probe
? NULL
: _("section headers"));
6381 filedata
->section_headers
= (Elf_Internal_Shdr
*)
6382 cmalloc (num
, sizeof (Elf_Internal_Shdr
));
6383 if (filedata
->section_headers
== NULL
)
6386 error (_("Out of memory reading %u section headers\n"), num
);
6391 for (i
= 0, internal
= filedata
->section_headers
;
6395 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
6396 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
6397 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
6398 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
6399 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
6400 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
6401 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
6402 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
6403 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
6404 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
6405 if (!probe
&& internal
->sh_link
> num
)
6406 warn (_("Section %u has an out of range sh_link value of %u\n"), i
, internal
->sh_link
);
6407 if (!probe
&& internal
->sh_flags
& SHF_INFO_LINK
&& internal
->sh_info
> num
)
6408 warn (_("Section %u has an out of range sh_info value of %u\n"), i
, internal
->sh_info
);
6415 /* Like get_32bit_section_headers, except that it fetches 64-bit headers. */
6418 get_64bit_section_headers (Filedata
* filedata
, bool probe
)
6420 Elf64_External_Shdr
* shdrs
;
6421 Elf_Internal_Shdr
* internal
;
6423 unsigned int size
= filedata
->file_header
.e_shentsize
;
6424 unsigned int num
= probe
? 1 : filedata
->file_header
.e_shnum
;
6426 /* PR binutils/17531: Cope with unexpected section header sizes. */
6427 if (size
== 0 || num
== 0)
6430 if (size
< sizeof * shdrs
)
6433 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
6437 if (! probe
&& size
> sizeof * shdrs
)
6438 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
6440 shdrs
= (Elf64_External_Shdr
*) get_data (NULL
, filedata
,
6441 filedata
->file_header
.e_shoff
,
6443 probe
? NULL
: _("section headers"));
6447 filedata
->section_headers
= (Elf_Internal_Shdr
*)
6448 cmalloc (num
, sizeof (Elf_Internal_Shdr
));
6449 if (filedata
->section_headers
== NULL
)
6452 error (_("Out of memory reading %u section headers\n"), num
);
6457 for (i
= 0, internal
= filedata
->section_headers
;
6461 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
6462 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
6463 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
6464 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
6465 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
6466 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
6467 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
6468 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
6469 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
6470 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
6471 if (!probe
&& internal
->sh_link
> num
)
6472 warn (_("Section %u has an out of range sh_link value of %u\n"), i
, internal
->sh_link
);
6473 if (!probe
&& internal
->sh_flags
& SHF_INFO_LINK
&& internal
->sh_info
> num
)
6474 warn (_("Section %u has an out of range sh_info value of %u\n"), i
, internal
->sh_info
);
6482 get_section_headers (Filedata
*filedata
, bool probe
)
6484 if (filedata
->section_headers
!= NULL
)
6488 return get_32bit_section_headers (filedata
, probe
);
6490 return get_64bit_section_headers (filedata
, probe
);
6493 static Elf_Internal_Sym
*
6494 get_32bit_elf_symbols (Filedata
* filedata
,
6495 Elf_Internal_Shdr
* section
,
6496 unsigned long * num_syms_return
)
6498 unsigned long number
= 0;
6499 Elf32_External_Sym
* esyms
= NULL
;
6500 Elf_External_Sym_Shndx
* shndx
= NULL
;
6501 Elf_Internal_Sym
* isyms
= NULL
;
6502 Elf_Internal_Sym
* psym
;
6504 elf_section_list
* entry
;
6506 if (section
->sh_size
== 0)
6508 if (num_syms_return
!= NULL
)
6509 * num_syms_return
= 0;
6513 /* Run some sanity checks first. */
6514 if (section
->sh_entsize
== 0 || section
->sh_entsize
> section
->sh_size
)
6516 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
6517 printable_section_name (filedata
, section
),
6518 (unsigned long) section
->sh_entsize
);
6522 if (section
->sh_size
> filedata
->file_size
)
6524 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
6525 printable_section_name (filedata
, section
),
6526 (unsigned long) section
->sh_size
);
6530 number
= section
->sh_size
/ section
->sh_entsize
;
6532 if (number
* sizeof (Elf32_External_Sym
) > section
->sh_size
+ 1)
6534 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
6535 (unsigned long) section
->sh_size
,
6536 printable_section_name (filedata
, section
),
6537 (unsigned long) section
->sh_entsize
);
6541 esyms
= (Elf32_External_Sym
*) get_data (NULL
, filedata
, section
->sh_offset
, 1,
6542 section
->sh_size
, _("symbols"));
6547 for (entry
= filedata
->symtab_shndx_list
; entry
!= NULL
; entry
= entry
->next
)
6549 if (entry
->hdr
->sh_link
!= (unsigned long) (section
- filedata
->section_headers
))
6554 error (_("Multiple symbol table index sections associated with the same symbol section\n"));
6558 shndx
= (Elf_External_Sym_Shndx
*) get_data (NULL
, filedata
,
6559 entry
->hdr
->sh_offset
,
6560 1, entry
->hdr
->sh_size
,
6561 _("symbol table section indices"));
6565 /* PR17531: file: heap-buffer-overflow */
6566 if (entry
->hdr
->sh_size
/ sizeof (Elf_External_Sym_Shndx
) < number
)
6568 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
6569 printable_section_name (filedata
, entry
->hdr
),
6570 (unsigned long) entry
->hdr
->sh_size
,
6571 (unsigned long) section
->sh_size
);
6576 isyms
= (Elf_Internal_Sym
*) cmalloc (number
, sizeof (Elf_Internal_Sym
));
6580 error (_("Out of memory reading %lu symbols\n"),
6581 (unsigned long) number
);
6585 for (j
= 0, psym
= isyms
; j
< number
; j
++, psym
++)
6587 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
6588 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
6589 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
6590 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
6591 if (psym
->st_shndx
== (SHN_XINDEX
& 0xffff) && shndx
!= NULL
)
6593 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
6594 else if (psym
->st_shndx
>= (SHN_LORESERVE
& 0xffff))
6595 psym
->st_shndx
+= SHN_LORESERVE
- (SHN_LORESERVE
& 0xffff);
6596 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
6597 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
6604 if (num_syms_return
!= NULL
)
6605 * num_syms_return
= isyms
== NULL
? 0 : number
;
6610 static Elf_Internal_Sym
*
6611 get_64bit_elf_symbols (Filedata
* filedata
,
6612 Elf_Internal_Shdr
* section
,
6613 unsigned long * num_syms_return
)
6615 unsigned long number
= 0;
6616 Elf64_External_Sym
* esyms
= NULL
;
6617 Elf_External_Sym_Shndx
* shndx
= NULL
;
6618 Elf_Internal_Sym
* isyms
= NULL
;
6619 Elf_Internal_Sym
* psym
;
6621 elf_section_list
* entry
;
6623 if (section
->sh_size
== 0)
6625 if (num_syms_return
!= NULL
)
6626 * num_syms_return
= 0;
6630 /* Run some sanity checks first. */
6631 if (section
->sh_entsize
== 0 || section
->sh_entsize
> section
->sh_size
)
6633 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
6634 printable_section_name (filedata
, section
),
6635 (unsigned long) section
->sh_entsize
);
6639 if (section
->sh_size
> filedata
->file_size
)
6641 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
6642 printable_section_name (filedata
, section
),
6643 (unsigned long) section
->sh_size
);
6647 number
= section
->sh_size
/ section
->sh_entsize
;
6649 if (number
* sizeof (Elf64_External_Sym
) > section
->sh_size
+ 1)
6651 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
6652 (unsigned long) section
->sh_size
,
6653 printable_section_name (filedata
, section
),
6654 (unsigned long) section
->sh_entsize
);
6658 esyms
= (Elf64_External_Sym
*) get_data (NULL
, filedata
, section
->sh_offset
, 1,
6659 section
->sh_size
, _("symbols"));
6664 for (entry
= filedata
->symtab_shndx_list
; entry
!= NULL
; entry
= entry
->next
)
6666 if (entry
->hdr
->sh_link
!= (unsigned long) (section
- filedata
->section_headers
))
6671 error (_("Multiple symbol table index sections associated with the same symbol section\n"));
6675 shndx
= (Elf_External_Sym_Shndx
*) get_data (NULL
, filedata
,
6676 entry
->hdr
->sh_offset
,
6677 1, entry
->hdr
->sh_size
,
6678 _("symbol table section indices"));
6682 /* PR17531: file: heap-buffer-overflow */
6683 if (entry
->hdr
->sh_size
/ sizeof (Elf_External_Sym_Shndx
) < number
)
6685 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
6686 printable_section_name (filedata
, entry
->hdr
),
6687 (unsigned long) entry
->hdr
->sh_size
,
6688 (unsigned long) section
->sh_size
);
6693 isyms
= (Elf_Internal_Sym
*) cmalloc (number
, sizeof (Elf_Internal_Sym
));
6697 error (_("Out of memory reading %lu symbols\n"),
6698 (unsigned long) number
);
6702 for (j
= 0, psym
= isyms
; j
< number
; j
++, psym
++)
6704 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
6705 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
6706 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
6707 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
6709 if (psym
->st_shndx
== (SHN_XINDEX
& 0xffff) && shndx
!= NULL
)
6711 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
6712 else if (psym
->st_shndx
>= (SHN_LORESERVE
& 0xffff))
6713 psym
->st_shndx
+= SHN_LORESERVE
- (SHN_LORESERVE
& 0xffff);
6715 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
6716 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
6723 if (num_syms_return
!= NULL
)
6724 * num_syms_return
= isyms
== NULL
? 0 : number
;
6729 static Elf_Internal_Sym
*
6730 get_elf_symbols (Filedata
*filedata
,
6731 Elf_Internal_Shdr
*section
,
6732 unsigned long *num_syms_return
)
6735 return get_32bit_elf_symbols (filedata
, section
, num_syms_return
);
6737 return get_64bit_elf_symbols (filedata
, section
, num_syms_return
);
6741 get_elf_section_flags (Filedata
* filedata
, bfd_vma sh_flags
)
6743 static char buff
[1024];
6745 unsigned int field_size
= is_32bit_elf
? 8 : 16;
6747 unsigned int size
= sizeof (buff
) - (field_size
+ 4 + 1);
6748 bfd_vma os_flags
= 0;
6749 bfd_vma proc_flags
= 0;
6750 bfd_vma unknown_flags
= 0;
6758 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
6759 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
6760 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
6761 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
6762 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
6763 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
6764 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
6765 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
6766 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
6767 /* 9 */ { STRING_COMMA_LEN ("TLS") },
6768 /* IA-64 specific. */
6769 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
6770 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
6771 /* IA-64 OpenVMS specific. */
6772 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
6773 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
6774 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
6775 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
6776 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
6777 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
6779 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
6780 /* SPARC specific. */
6781 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
6782 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
6784 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
6785 /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
6786 /* 23 */ { STRING_COMMA_LEN ("COMDEF") },
6788 /* 24 */ { STRING_COMMA_LEN ("GNU_MBIND") },
6790 /* 25 */ { STRING_COMMA_LEN ("VLE") },
6792 /* 26 */ { STRING_COMMA_LEN ("GNU_RETAIN") },
6795 if (do_section_details
)
6797 sprintf (buff
, "[%*.*lx]: ",
6798 field_size
, field_size
, (unsigned long) sh_flags
);
6799 p
+= field_size
+ 4;
6806 flag
= sh_flags
& - sh_flags
;
6809 if (do_section_details
)
6813 case SHF_WRITE
: sindex
= 0; break;
6814 case SHF_ALLOC
: sindex
= 1; break;
6815 case SHF_EXECINSTR
: sindex
= 2; break;
6816 case SHF_MERGE
: sindex
= 3; break;
6817 case SHF_STRINGS
: sindex
= 4; break;
6818 case SHF_INFO_LINK
: sindex
= 5; break;
6819 case SHF_LINK_ORDER
: sindex
= 6; break;
6820 case SHF_OS_NONCONFORMING
: sindex
= 7; break;
6821 case SHF_GROUP
: sindex
= 8; break;
6822 case SHF_TLS
: sindex
= 9; break;
6823 case SHF_EXCLUDE
: sindex
= 18; break;
6824 case SHF_COMPRESSED
: sindex
= 20; break;
6828 switch (filedata
->file_header
.e_machine
)
6831 if (flag
== SHF_IA_64_SHORT
)
6833 else if (flag
== SHF_IA_64_NORECOV
)
6836 else if (filedata
->file_header
.e_ident
[EI_OSABI
] == ELFOSABI_OPENVMS
)
6839 case SHF_IA_64_VMS_GLOBAL
: sindex
= 12; break;
6840 case SHF_IA_64_VMS_OVERLAID
: sindex
= 13; break;
6841 case SHF_IA_64_VMS_SHARED
: sindex
= 14; break;
6842 case SHF_IA_64_VMS_VECTOR
: sindex
= 15; break;
6843 case SHF_IA_64_VMS_ALLOC_64BIT
: sindex
= 16; break;
6844 case SHF_IA_64_VMS_PROTECTED
: sindex
= 17; break;
6855 case EM_OLD_SPARCV9
:
6856 case EM_SPARC32PLUS
:
6859 if (flag
== SHF_ORDERED
)
6866 case SHF_ENTRYSECT
: sindex
= 21; break;
6867 case SHF_ARM_PURECODE
: sindex
= 22; break;
6868 case SHF_COMDEF
: sindex
= 23; break;
6873 if (flag
== SHF_PPC_VLE
)
6880 switch (filedata
->file_header
.e_ident
[EI_OSABI
])
6883 case ELFOSABI_FREEBSD
:
6884 if (flag
== SHF_GNU_RETAIN
)
6888 if (flag
== SHF_GNU_MBIND
)
6889 /* We should not recognize SHF_GNU_MBIND for
6890 ELFOSABI_NONE, but binutils as of 2019-07-23 did
6891 not set the EI_OSABI header byte. */
6902 if (p
!= buff
+ field_size
+ 4)
6904 if (size
< (10 + 2))
6906 warn (_("Internal error: not enough buffer room for section flag info"));
6907 return _("<unknown>");
6914 size
-= flags
[sindex
].len
;
6915 p
= stpcpy (p
, flags
[sindex
].str
);
6917 else if (flag
& SHF_MASKOS
)
6919 else if (flag
& SHF_MASKPROC
)
6922 unknown_flags
|= flag
;
6928 case SHF_WRITE
: *p
= 'W'; break;
6929 case SHF_ALLOC
: *p
= 'A'; break;
6930 case SHF_EXECINSTR
: *p
= 'X'; break;
6931 case SHF_MERGE
: *p
= 'M'; break;
6932 case SHF_STRINGS
: *p
= 'S'; break;
6933 case SHF_INFO_LINK
: *p
= 'I'; break;
6934 case SHF_LINK_ORDER
: *p
= 'L'; break;
6935 case SHF_OS_NONCONFORMING
: *p
= 'O'; break;
6936 case SHF_GROUP
: *p
= 'G'; break;
6937 case SHF_TLS
: *p
= 'T'; break;
6938 case SHF_EXCLUDE
: *p
= 'E'; break;
6939 case SHF_COMPRESSED
: *p
= 'C'; break;
6942 if ((filedata
->file_header
.e_machine
== EM_X86_64
6943 || filedata
->file_header
.e_machine
== EM_L1OM
6944 || filedata
->file_header
.e_machine
== EM_K1OM
)
6945 && flag
== SHF_X86_64_LARGE
)
6947 else if (filedata
->file_header
.e_machine
== EM_ARM
6948 && flag
== SHF_ARM_PURECODE
)
6950 else if (filedata
->file_header
.e_machine
== EM_PPC
6951 && flag
== SHF_PPC_VLE
)
6953 else if (flag
& SHF_MASKOS
)
6955 switch (filedata
->file_header
.e_ident
[EI_OSABI
])
6958 case ELFOSABI_FREEBSD
:
6959 if (flag
== SHF_GNU_RETAIN
)
6966 if (flag
== SHF_GNU_MBIND
)
6968 /* We should not recognize SHF_GNU_MBIND for
6969 ELFOSABI_NONE, but binutils as of 2019-07-23 did
6970 not set the EI_OSABI header byte. */
6977 sh_flags
&= ~SHF_MASKOS
;
6981 else if (flag
& SHF_MASKPROC
)
6984 sh_flags
&= ~ SHF_MASKPROC
;
6994 if (do_section_details
)
6998 size
-= 5 + field_size
;
6999 if (p
!= buff
+ field_size
+ 4)
7003 warn (_("Internal error: not enough buffer room for section flag info"));
7004 return _("<unknown>");
7010 sprintf (p
, "OS (%*.*lx)", field_size
, field_size
,
7011 (unsigned long) os_flags
);
7012 p
+= 5 + field_size
;
7016 size
-= 7 + field_size
;
7017 if (p
!= buff
+ field_size
+ 4)
7021 warn (_("Internal error: not enough buffer room for section flag info"));
7022 return _("<unknown>");
7028 sprintf (p
, "PROC (%*.*lx)", field_size
, field_size
,
7029 (unsigned long) proc_flags
);
7030 p
+= 7 + field_size
;
7034 size
-= 10 + field_size
;
7035 if (p
!= buff
+ field_size
+ 4)
7039 warn (_("Internal error: not enough buffer room for section flag info"));
7040 return _("<unknown>");
7046 sprintf (p
, _("UNKNOWN (%*.*lx)"), field_size
, field_size
,
7047 (unsigned long) unknown_flags
);
7048 p
+= 10 + field_size
;
7056 static unsigned int ATTRIBUTE_WARN_UNUSED_RESULT
7057 get_compression_header (Elf_Internal_Chdr
*chdr
, unsigned char *buf
, bfd_size_type size
)
7061 Elf32_External_Chdr
*echdr
= (Elf32_External_Chdr
*) buf
;
7063 if (size
< sizeof (* echdr
))
7065 error (_("Compressed section is too small even for a compression header\n"));
7069 chdr
->ch_type
= BYTE_GET (echdr
->ch_type
);
7070 chdr
->ch_size
= BYTE_GET (echdr
->ch_size
);
7071 chdr
->ch_addralign
= BYTE_GET (echdr
->ch_addralign
);
7072 return sizeof (*echdr
);
7076 Elf64_External_Chdr
*echdr
= (Elf64_External_Chdr
*) buf
;
7078 if (size
< sizeof (* echdr
))
7080 error (_("Compressed section is too small even for a compression header\n"));
7084 chdr
->ch_type
= BYTE_GET (echdr
->ch_type
);
7085 chdr
->ch_size
= BYTE_GET (echdr
->ch_size
);
7086 chdr
->ch_addralign
= BYTE_GET (echdr
->ch_addralign
);
7087 return sizeof (*echdr
);
7092 process_section_headers (Filedata
* filedata
)
7094 Elf_Internal_Shdr
* section
;
7097 if (filedata
->file_header
.e_shnum
== 0)
7099 /* PR binutils/12467. */
7100 if (filedata
->file_header
.e_shoff
!= 0)
7102 warn (_("possibly corrupt ELF file header - it has a non-zero"
7103 " section header offset, but no section headers\n"));
7106 else if (do_sections
)
7107 printf (_("\nThere are no sections in this file.\n"));
7112 if (do_sections
&& !do_header
)
7114 if (filedata
->is_separate
&& process_links
)
7115 printf (_("In linked file '%s': "), filedata
->file_name
);
7116 if (! filedata
->is_separate
|| process_links
)
7117 printf (ngettext ("There is %d section header, "
7118 "starting at offset 0x%lx:\n",
7119 "There are %d section headers, "
7120 "starting at offset 0x%lx:\n",
7121 filedata
->file_header
.e_shnum
),
7122 filedata
->file_header
.e_shnum
,
7123 (unsigned long) filedata
->file_header
.e_shoff
);
7126 if (!get_section_headers (filedata
, false))
7129 /* Read in the string table, so that we have names to display. */
7130 if (filedata
->file_header
.e_shstrndx
!= SHN_UNDEF
7131 && filedata
->file_header
.e_shstrndx
< filedata
->file_header
.e_shnum
)
7133 section
= filedata
->section_headers
+ filedata
->file_header
.e_shstrndx
;
7135 if (section
->sh_size
!= 0)
7137 filedata
->string_table
= (char *) get_data (NULL
, filedata
, section
->sh_offset
,
7138 1, section
->sh_size
,
7141 filedata
->string_table_length
= filedata
->string_table
!= NULL
? section
->sh_size
: 0;
7145 /* Scan the sections for the dynamic symbol table
7146 and dynamic string table and debug sections. */
7147 eh_addr_size
= is_32bit_elf
? 4 : 8;
7148 switch (filedata
->file_header
.e_machine
)
7151 case EM_MIPS_RS3_LE
:
7152 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
7153 FDE addresses. However, the ABI also has a semi-official ILP32
7154 variant for which the normal FDE address size rules apply.
7156 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
7157 section, where XX is the size of longs in bits. Unfortunately,
7158 earlier compilers provided no way of distinguishing ILP32 objects
7159 from LP64 objects, so if there's any doubt, we should assume that
7160 the official LP64 form is being used. */
7161 if ((filedata
->file_header
.e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
7162 && find_section (filedata
, ".gcc_compiled_long32") == NULL
)
7168 switch (filedata
->file_header
.e_flags
& EF_H8_MACH
)
7170 case E_H8_MACH_H8300
:
7171 case E_H8_MACH_H8300HN
:
7172 case E_H8_MACH_H8300SN
:
7173 case E_H8_MACH_H8300SXN
:
7176 case E_H8_MACH_H8300H
:
7177 case E_H8_MACH_H8300S
:
7178 case E_H8_MACH_H8300SX
:
7186 switch (filedata
->file_header
.e_flags
& EF_M32C_CPU_MASK
)
7188 case EF_M32C_CPU_M16C
:
7195 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
7198 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
7199 if (section->sh_entsize != expected_entsize) \
7202 sprintf_vma (buf, section->sh_entsize); \
7203 /* Note: coded this way so that there is a single string for \
7205 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
7206 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
7207 (unsigned) expected_entsize); \
7208 section->sh_entsize = expected_entsize; \
7213 #define CHECK_ENTSIZE(section, i, type) \
7214 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
7215 sizeof (Elf64_External_##type))
7217 for (i
= 0, section
= filedata
->section_headers
;
7218 i
< filedata
->file_header
.e_shnum
;
7221 const char *name
= section_name_print (filedata
, section
);
7223 /* Run some sanity checks on the headers and
7224 possibly fill in some file data as well. */
7225 switch (section
->sh_type
)
7228 if (filedata
->dynamic_symbols
!= NULL
)
7230 error (_("File contains multiple dynamic symbol tables\n"));
7234 CHECK_ENTSIZE (section
, i
, Sym
);
7235 filedata
->dynamic_symbols
7236 = get_elf_symbols (filedata
, section
, &filedata
->num_dynamic_syms
);
7237 filedata
->dynamic_symtab_section
= section
;
7241 if (streq (name
, ".dynstr"))
7243 if (filedata
->dynamic_strings
!= NULL
)
7245 error (_("File contains multiple dynamic string tables\n"));
7249 filedata
->dynamic_strings
7250 = (char *) get_data (NULL
, filedata
, section
->sh_offset
,
7251 1, section
->sh_size
, _("dynamic strings"));
7252 filedata
->dynamic_strings_length
7253 = filedata
->dynamic_strings
== NULL
? 0 : section
->sh_size
;
7254 filedata
->dynamic_strtab_section
= section
;
7258 case SHT_SYMTAB_SHNDX
:
7260 elf_section_list
* entry
= xmalloc (sizeof * entry
);
7262 entry
->hdr
= section
;
7263 entry
->next
= filedata
->symtab_shndx_list
;
7264 filedata
->symtab_shndx_list
= entry
;
7269 CHECK_ENTSIZE (section
, i
, Sym
);
7273 CHECK_ENTSIZE_VALUES (section
, i
, GRP_ENTRY_SIZE
, GRP_ENTRY_SIZE
);
7277 CHECK_ENTSIZE (section
, i
, Rel
);
7278 if (do_checks
&& section
->sh_size
== 0)
7279 warn (_("Section '%s': zero-sized relocation section\n"), name
);
7283 CHECK_ENTSIZE (section
, i
, Rela
);
7284 if (do_checks
&& section
->sh_size
== 0)
7285 warn (_("Section '%s': zero-sized relocation section\n"), name
);
7289 CHECK_ENTSIZE (section
, i
, Relr
);
7294 /* Having a zero sized section is not illegal according to the
7295 ELF standard, but it might be an indication that something
7296 is wrong. So issue a warning if we are running in lint mode. */
7297 if (do_checks
&& section
->sh_size
== 0)
7298 warn (_("Section '%s': has a size of zero - is this intended ?\n"), name
);
7305 if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
7306 || do_debug_lines
|| do_debug_pubnames
|| do_debug_pubtypes
7307 || do_debug_aranges
|| do_debug_frames
|| do_debug_macinfo
7308 || do_debug_str
|| do_debug_str_offsets
|| do_debug_loc
7310 || do_debug_addr
|| do_debug_cu_index
|| do_debug_links
)
7311 && (startswith (name
, ".debug_")
7312 || startswith (name
, ".zdebug_")))
7315 name
+= sizeof (".zdebug_") - 1;
7317 name
+= sizeof (".debug_") - 1;
7320 || (do_debug_info
&& startswith (name
, "info"))
7321 || (do_debug_info
&& startswith (name
, "types"))
7322 || (do_debug_abbrevs
&& startswith (name
, "abbrev"))
7323 || (do_debug_lines
&& strcmp (name
, "line") == 0)
7324 || (do_debug_lines
&& startswith (name
, "line."))
7325 || (do_debug_pubnames
&& startswith (name
, "pubnames"))
7326 || (do_debug_pubtypes
&& startswith (name
, "pubtypes"))
7327 || (do_debug_pubnames
&& startswith (name
, "gnu_pubnames"))
7328 || (do_debug_pubtypes
&& startswith (name
, "gnu_pubtypes"))
7329 || (do_debug_aranges
&& startswith (name
, "aranges"))
7330 || (do_debug_ranges
&& startswith (name
, "ranges"))
7331 || (do_debug_ranges
&& startswith (name
, "rnglists"))
7332 || (do_debug_frames
&& startswith (name
, "frame"))
7333 || (do_debug_macinfo
&& startswith (name
, "macinfo"))
7334 || (do_debug_macinfo
&& startswith (name
, "macro"))
7335 || (do_debug_str
&& startswith (name
, "str"))
7336 || (do_debug_links
&& startswith (name
, "sup"))
7337 || (do_debug_str_offsets
&& startswith (name
, "str_offsets"))
7338 || (do_debug_loc
&& startswith (name
, "loc"))
7339 || (do_debug_loc
&& startswith (name
, "loclists"))
7340 || (do_debug_addr
&& startswith (name
, "addr"))
7341 || (do_debug_cu_index
&& startswith (name
, "cu_index"))
7342 || (do_debug_cu_index
&& startswith (name
, "tu_index"))
7344 request_dump_bynumber (&filedata
->dump
, i
, DEBUG_DUMP
);
7346 /* Linkonce section to be combined with .debug_info at link time. */
7347 else if ((do_debugging
|| do_debug_info
)
7348 && startswith (name
, ".gnu.linkonce.wi."))
7349 request_dump_bynumber (&filedata
->dump
, i
, DEBUG_DUMP
);
7350 else if (do_debug_frames
&& streq (name
, ".eh_frame"))
7351 request_dump_bynumber (&filedata
->dump
, i
, DEBUG_DUMP
);
7352 else if (do_gdb_index
&& (streq (name
, ".gdb_index")
7353 || streq (name
, ".debug_names")))
7354 request_dump_bynumber (&filedata
->dump
, i
, DEBUG_DUMP
);
7355 /* Trace sections for Itanium VMS. */
7356 else if ((do_debugging
|| do_trace_info
|| do_trace_abbrevs
7357 || do_trace_aranges
)
7358 && startswith (name
, ".trace_"))
7360 name
+= sizeof (".trace_") - 1;
7363 || (do_trace_info
&& streq (name
, "info"))
7364 || (do_trace_abbrevs
&& streq (name
, "abbrev"))
7365 || (do_trace_aranges
&& streq (name
, "aranges"))
7367 request_dump_bynumber (&filedata
->dump
, i
, DEBUG_DUMP
);
7369 else if ((do_debugging
|| do_debug_links
)
7370 && (startswith (name
, ".gnu_debuglink")
7371 || startswith (name
, ".gnu_debugaltlink")))
7372 request_dump_bynumber (&filedata
->dump
, i
, DEBUG_DUMP
);
7378 if (filedata
->is_separate
&& ! process_links
)
7381 if (filedata
->is_separate
)
7382 printf (_("\nSection Headers in linked file '%s':\n"), filedata
->file_name
);
7383 else if (filedata
->file_header
.e_shnum
> 1)
7384 printf (_("\nSection Headers:\n"));
7386 printf (_("\nSection Header:\n"));
7390 if (do_section_details
)
7392 printf (_(" [Nr] Name\n"));
7393 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
7397 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
7401 if (do_section_details
)
7403 printf (_(" [Nr] Name\n"));
7404 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
7408 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
7412 if (do_section_details
)
7414 printf (_(" [Nr] Name\n"));
7415 printf (_(" Type Address Offset Link\n"));
7416 printf (_(" Size EntSize Info Align\n"));
7420 printf (_(" [Nr] Name Type Address Offset\n"));
7421 printf (_(" Size EntSize Flags Link Info Align\n"));
7425 if (do_section_details
)
7426 printf (_(" Flags\n"));
7428 for (i
= 0, section
= filedata
->section_headers
;
7429 i
< filedata
->file_header
.e_shnum
;
7432 /* Run some sanity checks on the section header. */
7434 /* Check the sh_link field. */
7435 switch (section
->sh_type
)
7439 if (section
->sh_link
== 0
7440 && (filedata
->file_header
.e_type
== ET_EXEC
7441 || filedata
->file_header
.e_type
== ET_DYN
))
7442 /* A dynamic relocation section where all entries use a
7443 zero symbol index need not specify a symtab section. */
7446 case SHT_SYMTAB_SHNDX
:
7450 case SHT_GNU_versym
:
7451 if (section
->sh_link
== 0
7452 || section
->sh_link
>= filedata
->file_header
.e_shnum
7453 || (filedata
->section_headers
[section
->sh_link
].sh_type
!= SHT_SYMTAB
7454 && filedata
->section_headers
[section
->sh_link
].sh_type
!= SHT_DYNSYM
))
7455 warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
7456 i
, section
->sh_link
);
7462 case SHT_GNU_verneed
:
7463 case SHT_GNU_verdef
:
7464 case SHT_GNU_LIBLIST
:
7465 if (section
->sh_link
== 0
7466 || section
->sh_link
>= filedata
->file_header
.e_shnum
7467 || filedata
->section_headers
[section
->sh_link
].sh_type
!= SHT_STRTAB
)
7468 warn (_("[%2u]: Link field (%u) should index a string section.\n"),
7469 i
, section
->sh_link
);
7472 case SHT_INIT_ARRAY
:
7473 case SHT_FINI_ARRAY
:
7474 case SHT_PREINIT_ARRAY
:
7475 if (section
->sh_type
< SHT_LOOS
&& section
->sh_link
!= 0)
7476 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
7477 i
, section
->sh_link
);
7481 /* FIXME: Add support for target specific section types. */
7482 #if 0 /* Currently we do not check other section types as there are too
7483 many special cases. Stab sections for example have a type
7484 of SHT_PROGBITS but an sh_link field that links to the .stabstr
7486 if (section
->sh_type
< SHT_LOOS
&& section
->sh_link
!= 0)
7487 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
7488 i
, section
->sh_link
);
7493 /* Check the sh_info field. */
7494 switch (section
->sh_type
)
7498 if (section
->sh_info
== 0
7499 && (filedata
->file_header
.e_type
== ET_EXEC
7500 || filedata
->file_header
.e_type
== ET_DYN
))
7501 /* Dynamic relocations apply to segments, so they do not
7502 need to specify the section they relocate. */
7504 if (section
->sh_info
== 0
7505 || section
->sh_info
>= filedata
->file_header
.e_shnum
7506 || (filedata
->section_headers
[section
->sh_info
].sh_type
!= SHT_PROGBITS
7507 && filedata
->section_headers
[section
->sh_info
].sh_type
!= SHT_NOBITS
7508 && filedata
->section_headers
[section
->sh_info
].sh_type
!= SHT_NOTE
7509 && filedata
->section_headers
[section
->sh_info
].sh_type
!= SHT_INIT_ARRAY
7510 && filedata
->section_headers
[section
->sh_info
].sh_type
!= SHT_FINI_ARRAY
7511 && filedata
->section_headers
[section
->sh_info
].sh_type
!= SHT_PREINIT_ARRAY
7512 /* FIXME: Are other section types valid ? */
7513 && filedata
->section_headers
[section
->sh_info
].sh_type
< SHT_LOOS
))
7514 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
7515 i
, section
->sh_info
);
7520 case SHT_SYMTAB_SHNDX
:
7521 case SHT_INIT_ARRAY
:
7522 case SHT_FINI_ARRAY
:
7523 case SHT_PREINIT_ARRAY
:
7524 if (section
->sh_info
!= 0)
7525 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
7526 i
, section
->sh_info
);
7532 /* A symbol index - we assume that it is valid. */
7536 /* FIXME: Add support for target specific section types. */
7537 if (section
->sh_type
== SHT_NOBITS
)
7538 /* NOBITS section headers with non-zero sh_info fields can be
7539 created when a binary is stripped of everything but its debug
7540 information. The stripped sections have their headers
7541 preserved but their types set to SHT_NOBITS. So do not check
7542 this type of section. */
7544 else if (section
->sh_flags
& SHF_INFO_LINK
)
7546 if (section
->sh_info
< 1 || section
->sh_info
>= filedata
->file_header
.e_shnum
)
7547 warn (_("[%2u]: Expected link to another section in info field"), i
);
7549 else if (section
->sh_type
< SHT_LOOS
7550 && (section
->sh_flags
& SHF_GNU_MBIND
) == 0
7551 && section
->sh_info
!= 0)
7552 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
7553 i
, section
->sh_info
);
7557 /* Check the sh_size field. */
7558 if (section
->sh_size
> filedata
->file_size
7559 && section
->sh_type
!= SHT_NOBITS
7560 && section
->sh_type
!= SHT_NULL
7561 && section
->sh_type
< SHT_LOOS
)
7562 warn (_("Size of section %u is larger than the entire file!\n"), i
);
7564 printf (" [%2u] ", i
);
7565 if (do_section_details
)
7566 printf ("%s\n ", printable_section_name (filedata
, section
));
7568 print_symbol (-17, section_name_print (filedata
, section
));
7570 printf (do_wide
? " %-15s " : " %-15.15s ",
7571 get_section_type_name (filedata
, section
->sh_type
));
7575 const char * link_too_big
= NULL
;
7577 print_vma (section
->sh_addr
, LONG_HEX
);
7579 printf ( " %6.6lx %6.6lx %2.2lx",
7580 (unsigned long) section
->sh_offset
,
7581 (unsigned long) section
->sh_size
,
7582 (unsigned long) section
->sh_entsize
);
7584 if (do_section_details
)
7585 fputs (" ", stdout
);
7587 printf (" %3s ", get_elf_section_flags (filedata
, section
->sh_flags
));
7589 if (section
->sh_link
>= filedata
->file_header
.e_shnum
)
7592 /* The sh_link value is out of range. Normally this indicates
7593 an error but it can have special values in Solaris binaries. */
7594 switch (filedata
->file_header
.e_machine
)
7601 case EM_OLD_SPARCV9
:
7602 case EM_SPARC32PLUS
:
7605 if (section
->sh_link
== (SHN_BEFORE
& 0xffff))
7606 link_too_big
= "BEFORE";
7607 else if (section
->sh_link
== (SHN_AFTER
& 0xffff))
7608 link_too_big
= "AFTER";
7615 if (do_section_details
)
7617 if (link_too_big
!= NULL
&& * link_too_big
)
7618 printf ("<%s> ", link_too_big
);
7620 printf ("%2u ", section
->sh_link
);
7621 printf ("%3u %2lu\n", section
->sh_info
,
7622 (unsigned long) section
->sh_addralign
);
7625 printf ("%2u %3u %2lu\n",
7628 (unsigned long) section
->sh_addralign
);
7630 if (link_too_big
&& ! * link_too_big
)
7631 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
7632 i
, section
->sh_link
);
7636 print_vma (section
->sh_addr
, LONG_HEX
);
7638 if ((long) section
->sh_offset
== section
->sh_offset
)
7639 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
7643 print_vma (section
->sh_offset
, LONG_HEX
);
7646 if ((unsigned long) section
->sh_size
== section
->sh_size
)
7647 printf (" %6.6lx", (unsigned long) section
->sh_size
);
7651 print_vma (section
->sh_size
, LONG_HEX
);
7654 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
7655 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
7659 print_vma (section
->sh_entsize
, LONG_HEX
);
7662 if (do_section_details
)
7663 fputs (" ", stdout
);
7665 printf (" %3s ", get_elf_section_flags (filedata
, section
->sh_flags
));
7667 printf ("%2u %3u ", section
->sh_link
, section
->sh_info
);
7669 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
7670 printf ("%2lu\n", (unsigned long) section
->sh_addralign
);
7673 print_vma (section
->sh_addralign
, DEC
);
7677 else if (do_section_details
)
7680 print_vma (section
->sh_addr
, LONG_HEX
);
7681 if ((long) section
->sh_offset
== section
->sh_offset
)
7682 printf (" %16.16lx", (unsigned long) section
->sh_offset
);
7686 print_vma (section
->sh_offset
, LONG_HEX
);
7688 printf (" %u\n ", section
->sh_link
);
7689 print_vma (section
->sh_size
, LONG_HEX
);
7691 print_vma (section
->sh_entsize
, LONG_HEX
);
7693 printf (" %-16u %lu\n",
7695 (unsigned long) section
->sh_addralign
);
7700 print_vma (section
->sh_addr
, LONG_HEX
);
7701 if ((long) section
->sh_offset
== section
->sh_offset
)
7702 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
7706 print_vma (section
->sh_offset
, LONG_HEX
);
7709 print_vma (section
->sh_size
, LONG_HEX
);
7711 print_vma (section
->sh_entsize
, LONG_HEX
);
7713 printf (" %3s ", get_elf_section_flags (filedata
, section
->sh_flags
));
7715 printf (" %2u %3u %lu\n",
7718 (unsigned long) section
->sh_addralign
);
7721 if (do_section_details
)
7723 printf (" %s\n", get_elf_section_flags (filedata
, section
->sh_flags
));
7724 if ((section
->sh_flags
& SHF_COMPRESSED
) != 0)
7726 /* Minimum section size is 12 bytes for 32-bit compression
7727 header + 12 bytes for compressed data header. */
7728 unsigned char buf
[24];
7730 assert (sizeof (buf
) >= sizeof (Elf64_External_Chdr
));
7731 if (get_data (&buf
, filedata
, section
->sh_offset
, 1,
7732 sizeof (buf
), _("compression header")))
7734 Elf_Internal_Chdr chdr
;
7736 if (get_compression_header (&chdr
, buf
, sizeof (buf
)) == 0)
7737 printf (_(" [<corrupt>]\n"));
7740 if (chdr
.ch_type
== ELFCOMPRESS_ZLIB
)
7743 printf (_(" [<unknown>: 0x%x], "),
7745 print_vma (chdr
.ch_size
, LONG_HEX
);
7746 printf (", %lu\n", (unsigned long) chdr
.ch_addralign
);
7753 if (!do_section_details
)
7755 /* The ordering of the letters shown here matches the ordering of the
7756 corresponding SHF_xxx values, and hence the order in which these
7757 letters will be displayed to the user. */
7758 printf (_("Key to Flags:\n\
7759 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
7760 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
7761 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
7762 switch (filedata
->file_header
.e_ident
[EI_OSABI
])
7765 case ELFOSABI_FREEBSD
:
7766 printf (_("R (retain), "));
7769 printf (_("D (mbind), "));
7774 if (filedata
->file_header
.e_machine
== EM_X86_64
7775 || filedata
->file_header
.e_machine
== EM_L1OM
7776 || filedata
->file_header
.e_machine
== EM_K1OM
)
7777 printf (_("l (large), "));
7778 else if (filedata
->file_header
.e_machine
== EM_ARM
)
7779 printf (_("y (purecode), "));
7780 else if (filedata
->file_header
.e_machine
== EM_PPC
)
7781 printf (_("v (VLE), "));
7782 printf ("p (processor specific)\n");
7789 get_symtab (Filedata
*filedata
, Elf_Internal_Shdr
*symsec
,
7790 Elf_Internal_Sym
**symtab
, unsigned long *nsyms
,
7791 char **strtab
, unsigned long *strtablen
)
7795 *symtab
= get_elf_symbols (filedata
, symsec
, nsyms
);
7797 if (*symtab
== NULL
)
7800 if (symsec
->sh_link
!= 0)
7802 Elf_Internal_Shdr
*strsec
;
7804 if (symsec
->sh_link
>= filedata
->file_header
.e_shnum
)
7806 error (_("Bad sh_link in symbol table section\n"));
7813 strsec
= filedata
->section_headers
+ symsec
->sh_link
;
7815 *strtab
= (char *) get_data (NULL
, filedata
, strsec
->sh_offset
,
7816 1, strsec
->sh_size
, _("string table"));
7817 if (*strtab
== NULL
)
7824 *strtablen
= strsec
->sh_size
;
7830 get_group_flags (unsigned int flags
)
7832 static char buff
[128];
7836 else if (flags
== GRP_COMDAT
)
7839 snprintf (buff
, sizeof buff
, "[0x%x: %s%s%s]",
7841 flags
& GRP_MASKOS
? _("<OS specific>") : "",
7842 flags
& GRP_MASKPROC
? _("<PROC specific>") : "",
7843 (flags
& ~(GRP_COMDAT
| GRP_MASKOS
| GRP_MASKPROC
)
7844 ? _("<unknown>") : ""));
7850 process_section_groups (Filedata
* filedata
)
7852 Elf_Internal_Shdr
* section
;
7854 struct group
* group
;
7855 Elf_Internal_Shdr
* symtab_sec
;
7856 Elf_Internal_Shdr
* strtab_sec
;
7857 Elf_Internal_Sym
* symtab
;
7858 unsigned long num_syms
;
7862 /* Don't process section groups unless needed. */
7863 if (!do_unwind
&& !do_section_groups
)
7866 if (filedata
->file_header
.e_shnum
== 0)
7868 if (do_section_groups
)
7870 if (filedata
->is_separate
)
7871 printf (_("\nThere are no sections group in linked file '%s'.\n"),
7872 filedata
->file_name
);
7874 printf (_("\nThere are no section groups in this file.\n"));
7879 if (filedata
->section_headers
== NULL
)
7881 error (_("Section headers are not available!\n"));
7882 /* PR 13622: This can happen with a corrupt ELF header. */
7886 filedata
->section_headers_groups
7887 = (struct group
**) calloc (filedata
->file_header
.e_shnum
,
7888 sizeof (struct group
*));
7890 if (filedata
->section_headers_groups
== NULL
)
7892 error (_("Out of memory reading %u section group headers\n"),
7893 filedata
->file_header
.e_shnum
);
7897 /* Scan the sections for the group section. */
7898 filedata
->group_count
= 0;
7899 for (i
= 0, section
= filedata
->section_headers
;
7900 i
< filedata
->file_header
.e_shnum
;
7902 if (section
->sh_type
== SHT_GROUP
)
7903 filedata
->group_count
++;
7905 if (filedata
->group_count
== 0)
7907 if (do_section_groups
)
7909 if (filedata
->is_separate
)
7910 printf (_("\nThere are no section groups in linked file '%s'.\n"),
7911 filedata
->file_name
);
7913 printf (_("\nThere are no section groups in this file.\n"));
7919 filedata
->section_groups
= (struct group
*) calloc (filedata
->group_count
,
7920 sizeof (struct group
));
7922 if (filedata
->section_groups
== NULL
)
7924 error (_("Out of memory reading %lu groups\n"),
7925 (unsigned long) filedata
->group_count
);
7936 if (filedata
->is_separate
)
7937 printf (_("Section groups in linked file '%s'\n"), filedata
->file_name
);
7939 for (i
= 0, section
= filedata
->section_headers
, group
= filedata
->section_groups
;
7940 i
< filedata
->file_header
.e_shnum
;
7943 if (section
->sh_type
== SHT_GROUP
)
7945 const char * name
= printable_section_name (filedata
, section
);
7946 const char * group_name
;
7947 unsigned char * start
;
7948 unsigned char * indices
;
7949 unsigned int entry
, j
, size
;
7950 Elf_Internal_Shdr
* sec
;
7951 Elf_Internal_Sym
* sym
;
7953 /* Get the symbol table. */
7954 if (section
->sh_link
>= filedata
->file_header
.e_shnum
7955 || ((sec
= filedata
->section_headers
+ section
->sh_link
)->sh_type
7958 error (_("Bad sh_link in group section `%s'\n"), name
);
7962 if (symtab_sec
!= sec
)
7966 symtab
= get_elf_symbols (filedata
, symtab_sec
, & num_syms
);
7971 error (_("Corrupt header in group section `%s'\n"), name
);
7975 if (section
->sh_info
>= num_syms
)
7977 error (_("Bad sh_info in group section `%s'\n"), name
);
7981 sym
= symtab
+ section
->sh_info
;
7983 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
7985 if (sym
->st_shndx
== 0
7986 || sym
->st_shndx
>= filedata
->file_header
.e_shnum
)
7988 error (_("Bad sh_info in group section `%s'\n"), name
);
7992 group_name
= section_name_print (filedata
,
7993 filedata
->section_headers
8002 /* Get the string table. */
8003 if (symtab_sec
->sh_link
>= filedata
->file_header
.e_shnum
)
8011 != (sec
= filedata
->section_headers
+ symtab_sec
->sh_link
))
8016 strtab
= (char *) get_data (NULL
, filedata
, strtab_sec
->sh_offset
,
8017 1, strtab_sec
->sh_size
,
8019 strtab_size
= strtab
!= NULL
? strtab_sec
->sh_size
: 0;
8021 group_name
= sym
->st_name
< strtab_size
8022 ? strtab
+ sym
->st_name
: _("<corrupt>");
8025 /* PR 17531: file: loop. */
8026 if (section
->sh_entsize
> section
->sh_size
)
8028 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
8029 printable_section_name (filedata
, section
),
8030 (unsigned long) section
->sh_entsize
,
8031 (unsigned long) section
->sh_size
);
8035 start
= (unsigned char *) get_data (NULL
, filedata
, section
->sh_offset
,
8036 1, section
->sh_size
,
8042 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
8043 entry
= byte_get (indices
, 4);
8046 if (do_section_groups
)
8048 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
8049 get_group_flags (entry
), i
, name
, group_name
, size
);
8051 printf (_(" [Index] Name\n"));
8054 group
->group_index
= i
;
8056 for (j
= 0; j
< size
; j
++)
8058 struct group_list
* g
;
8060 entry
= byte_get (indices
, 4);
8063 if (entry
>= filedata
->file_header
.e_shnum
)
8065 static unsigned num_group_errors
= 0;
8067 if (num_group_errors
++ < 10)
8069 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
8070 entry
, i
, filedata
->file_header
.e_shnum
- 1);
8071 if (num_group_errors
== 10)
8072 warn (_("Further error messages about overlarge group section indices suppressed\n"));
8077 if (filedata
->section_headers_groups
[entry
] != NULL
)
8081 static unsigned num_errs
= 0;
8083 if (num_errs
++ < 10)
8085 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
8087 filedata
->section_headers_groups
[entry
]->group_index
);
8089 warn (_("Further error messages about already contained group sections suppressed\n"));
8095 /* Intel C/C++ compiler may put section 0 in a
8096 section group. We just warn it the first time
8097 and ignore it afterwards. */
8098 static bool warned
= false;
8101 error (_("section 0 in group section [%5u]\n"),
8102 filedata
->section_headers_groups
[entry
]->group_index
);
8108 filedata
->section_headers_groups
[entry
] = group
;
8110 if (do_section_groups
)
8112 sec
= filedata
->section_headers
+ entry
;
8113 printf (" [%5u] %s\n", entry
, printable_section_name (filedata
, sec
));
8116 g
= (struct group_list
*) xmalloc (sizeof (struct group_list
));
8117 g
->section_index
= entry
;
8118 g
->next
= group
->root
;
8133 /* Data used to display dynamic fixups. */
8135 struct ia64_vms_dynfixup
8137 bfd_vma needed_ident
; /* Library ident number. */
8138 bfd_vma needed
; /* Index in the dstrtab of the library name. */
8139 bfd_vma fixup_needed
; /* Index of the library. */
8140 bfd_vma fixup_rela_cnt
; /* Number of fixups. */
8141 bfd_vma fixup_rela_off
; /* Fixups offset in the dynamic segment. */
8144 /* Data used to display dynamic relocations. */
8146 struct ia64_vms_dynimgrela
8148 bfd_vma img_rela_cnt
; /* Number of relocations. */
8149 bfd_vma img_rela_off
; /* Reloc offset in the dynamic segment. */
8152 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
8156 dump_ia64_vms_dynamic_fixups (Filedata
* filedata
,
8157 struct ia64_vms_dynfixup
* fixup
,
8158 const char * strtab
,
8159 unsigned int strtab_sz
)
8161 Elf64_External_VMS_IMAGE_FIXUP
* imfs
;
8163 const char * lib_name
;
8165 imfs
= get_data (NULL
, filedata
,
8166 filedata
->dynamic_addr
+ fixup
->fixup_rela_off
,
8167 sizeof (*imfs
), fixup
->fixup_rela_cnt
,
8168 _("dynamic section image fixups"));
8172 if (fixup
->needed
< strtab_sz
)
8173 lib_name
= strtab
+ fixup
->needed
;
8176 warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
8177 (unsigned long) fixup
->needed
);
8181 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
8182 (int) fixup
->fixup_needed
, lib_name
, (long) fixup
->needed_ident
);
8184 (_("Seg Offset Type SymVec DataType\n"));
8186 for (i
= 0; i
< (long) fixup
->fixup_rela_cnt
; i
++)
8191 printf ("%3u ", (unsigned) BYTE_GET (imfs
[i
].fixup_seg
));
8192 printf_vma ((bfd_vma
) BYTE_GET (imfs
[i
].fixup_offset
));
8193 type
= BYTE_GET (imfs
[i
].type
);
8194 rtype
= elf_ia64_reloc_type (type
);
8196 printf (" 0x%08x ", type
);
8198 printf (" %-32s ", rtype
);
8199 printf ("%6u ", (unsigned) BYTE_GET (imfs
[i
].symvec_index
));
8200 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs
[i
].data_type
));
8207 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
8210 dump_ia64_vms_dynamic_relocs (Filedata
* filedata
, struct ia64_vms_dynimgrela
*imgrela
)
8212 Elf64_External_VMS_IMAGE_RELA
*imrs
;
8215 imrs
= get_data (NULL
, filedata
,
8216 filedata
->dynamic_addr
+ imgrela
->img_rela_off
,
8217 sizeof (*imrs
), imgrela
->img_rela_cnt
,
8218 _("dynamic section image relocations"));
8222 printf (_("\nImage relocs\n"));
8224 (_("Seg Offset Type Addend Seg Sym Off\n"));
8226 for (i
= 0; i
< (long) imgrela
->img_rela_cnt
; i
++)
8231 printf ("%3u ", (unsigned) BYTE_GET (imrs
[i
].rela_seg
));
8232 printf ("%08" BFD_VMA_FMT
"x ",
8233 (bfd_vma
) BYTE_GET (imrs
[i
].rela_offset
));
8234 type
= BYTE_GET (imrs
[i
].type
);
8235 rtype
= elf_ia64_reloc_type (type
);
8237 printf ("0x%08x ", type
);
8239 printf ("%-31s ", rtype
);
8240 print_vma (BYTE_GET (imrs
[i
].addend
), FULL_HEX
);
8241 printf ("%3u ", (unsigned) BYTE_GET (imrs
[i
].sym_seg
));
8242 printf ("%08" BFD_VMA_FMT
"x\n",
8243 (bfd_vma
) BYTE_GET (imrs
[i
].sym_offset
));
8250 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
8253 process_ia64_vms_dynamic_relocs (Filedata
* filedata
)
8255 struct ia64_vms_dynfixup fixup
;
8256 struct ia64_vms_dynimgrela imgrela
;
8257 Elf_Internal_Dyn
*entry
;
8258 bfd_vma strtab_off
= 0;
8259 bfd_vma strtab_sz
= 0;
8260 char *strtab
= NULL
;
8263 memset (&fixup
, 0, sizeof (fixup
));
8264 memset (&imgrela
, 0, sizeof (imgrela
));
8266 /* Note: the order of the entries is specified by the OpenVMS specs. */
8267 for (entry
= filedata
->dynamic_section
;
8268 entry
< filedata
->dynamic_section
+ filedata
->dynamic_nent
;
8271 switch (entry
->d_tag
)
8273 case DT_IA_64_VMS_STRTAB_OFFSET
:
8274 strtab_off
= entry
->d_un
.d_val
;
8277 strtab_sz
= entry
->d_un
.d_val
;
8279 strtab
= get_data (NULL
, filedata
,
8280 filedata
->dynamic_addr
+ strtab_off
,
8281 1, strtab_sz
, _("dynamic string section"));
8286 case DT_IA_64_VMS_NEEDED_IDENT
:
8287 fixup
.needed_ident
= entry
->d_un
.d_val
;
8290 fixup
.needed
= entry
->d_un
.d_val
;
8292 case DT_IA_64_VMS_FIXUP_NEEDED
:
8293 fixup
.fixup_needed
= entry
->d_un
.d_val
;
8295 case DT_IA_64_VMS_FIXUP_RELA_CNT
:
8296 fixup
.fixup_rela_cnt
= entry
->d_un
.d_val
;
8298 case DT_IA_64_VMS_FIXUP_RELA_OFF
:
8299 fixup
.fixup_rela_off
= entry
->d_un
.d_val
;
8300 if (! dump_ia64_vms_dynamic_fixups (filedata
, &fixup
, strtab
, strtab_sz
))
8303 case DT_IA_64_VMS_IMG_RELA_CNT
:
8304 imgrela
.img_rela_cnt
= entry
->d_un
.d_val
;
8306 case DT_IA_64_VMS_IMG_RELA_OFF
:
8307 imgrela
.img_rela_off
= entry
->d_un
.d_val
;
8308 if (! dump_ia64_vms_dynamic_relocs (filedata
, &imgrela
))
8327 relocation_type rel_type
;
8329 dynamic_relocations
[] =
8331 { "REL", DT_REL
, DT_RELSZ
, reltype_rel
},
8332 { "RELA", DT_RELA
, DT_RELASZ
, reltype_rela
},
8333 { "RELR", DT_RELR
, DT_RELRSZ
, reltype_relr
},
8334 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, reltype_unknown
}
8337 /* Process the reloc section. */
8340 process_relocs (Filedata
* filedata
)
8342 unsigned long rel_size
;
8343 unsigned long rel_offset
;
8348 if (do_using_dynamic
)
8350 relocation_type rel_type
;
8352 bool has_dynamic_reloc
;
8355 has_dynamic_reloc
= false;
8357 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
8359 rel_type
= dynamic_relocations
[i
].rel_type
;
8360 name
= dynamic_relocations
[i
].name
;
8361 rel_size
= filedata
->dynamic_info
[dynamic_relocations
[i
].size
];
8362 rel_offset
= filedata
->dynamic_info
[dynamic_relocations
[i
].reloc
];
8365 has_dynamic_reloc
= true;
8367 if (rel_type
== reltype_unknown
)
8369 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
8370 switch (filedata
->dynamic_info
[DT_PLTREL
])
8373 rel_type
= reltype_rel
;
8376 rel_type
= reltype_rela
;
8383 if (filedata
->is_separate
)
8385 (_("\nIn linked file '%s' section '%s' at offset 0x%lx contains %ld bytes:\n"),
8386 filedata
->file_name
, name
, rel_offset
, rel_size
);
8389 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
8390 name
, rel_offset
, rel_size
);
8392 dump_relocations (filedata
,
8393 offset_from_vma (filedata
, rel_offset
, rel_size
),
8395 filedata
->dynamic_symbols
,
8396 filedata
->num_dynamic_syms
,
8397 filedata
->dynamic_strings
,
8398 filedata
->dynamic_strings_length
,
8399 rel_type
, true /* is_dynamic */);
8403 if (is_ia64_vms (filedata
))
8404 if (process_ia64_vms_dynamic_relocs (filedata
))
8405 has_dynamic_reloc
= true;
8407 if (! has_dynamic_reloc
)
8409 if (filedata
->is_separate
)
8410 printf (_("\nThere are no dynamic relocations in linked file '%s'.\n"),
8411 filedata
->file_name
);
8413 printf (_("\nThere are no dynamic relocations in this file.\n"));
8418 Elf_Internal_Shdr
* section
;
8422 for (i
= 0, section
= filedata
->section_headers
;
8423 i
< filedata
->file_header
.e_shnum
;
8426 if ( section
->sh_type
!= SHT_RELA
8427 && section
->sh_type
!= SHT_REL
8428 && section
->sh_type
!= SHT_RELR
)
8431 rel_offset
= section
->sh_offset
;
8432 rel_size
= section
->sh_size
;
8436 relocation_type rel_type
;
8437 unsigned long num_rela
;
8439 if (filedata
->is_separate
)
8440 printf (_("\nIn linked file '%s' relocation section "),
8441 filedata
->file_name
);
8443 printf (_("\nRelocation section "));
8445 if (filedata
->string_table
== NULL
)
8446 printf ("%d", section
->sh_name
);
8448 printf ("'%s'", printable_section_name (filedata
, section
));
8450 num_rela
= rel_size
/ section
->sh_entsize
;
8451 printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
8452 " at offset 0x%lx contains %lu entries:\n",
8454 rel_offset
, num_rela
);
8456 rel_type
= section
->sh_type
== SHT_RELA
? reltype_rela
:
8457 section
->sh_type
== SHT_REL
? reltype_rel
: reltype_relr
;
8459 if (section
->sh_link
!= 0
8460 && section
->sh_link
< filedata
->file_header
.e_shnum
)
8462 Elf_Internal_Shdr
* symsec
;
8463 Elf_Internal_Sym
* symtab
;
8464 unsigned long nsyms
;
8465 unsigned long strtablen
= 0;
8466 char * strtab
= NULL
;
8468 symsec
= filedata
->section_headers
+ section
->sh_link
;
8469 if (symsec
->sh_type
!= SHT_SYMTAB
8470 && symsec
->sh_type
!= SHT_DYNSYM
)
8473 if (!get_symtab (filedata
, symsec
,
8474 &symtab
, &nsyms
, &strtab
, &strtablen
))
8477 dump_relocations (filedata
, rel_offset
, rel_size
,
8478 symtab
, nsyms
, strtab
, strtablen
,
8480 symsec
->sh_type
== SHT_DYNSYM
);
8485 dump_relocations (filedata
, rel_offset
, rel_size
,
8486 NULL
, 0, NULL
, 0, rel_type
, false /* is_dynamic */);
8494 /* Users sometimes forget the -D option, so try to be helpful. */
8495 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
8497 if (filedata
->dynamic_info
[dynamic_relocations
[i
].size
])
8499 if (filedata
->is_separate
)
8500 printf (_("\nThere are no static relocations in linked file '%s'."),
8501 filedata
->file_name
);
8503 printf (_("\nThere are no static relocations in this file."));
8504 printf (_("\nTo see the dynamic relocations add --use-dynamic to the command line.\n"));
8509 if (i
== ARRAY_SIZE (dynamic_relocations
))
8511 if (filedata
->is_separate
)
8512 printf (_("\nThere are no relocations in linked file '%s'.\n"),
8513 filedata
->file_name
);
8515 printf (_("\nThere are no relocations in this file.\n"));
8523 /* An absolute address consists of a section and an offset. If the
8524 section is NULL, the offset itself is the address, otherwise, the
8525 address equals to LOAD_ADDRESS(section) + offset. */
8529 unsigned short section
;
8533 /* Find the nearest symbol at or below ADDR. Returns the symbol
8534 name, if found, and the offset from the symbol to ADDR. */
8537 find_symbol_for_address (Filedata
* filedata
,
8538 Elf_Internal_Sym
* symtab
,
8539 unsigned long nsyms
,
8540 const char * strtab
,
8541 unsigned long strtab_size
,
8542 struct absaddr addr
,
8543 const char ** symname
,
8546 bfd_vma dist
= 0x100000;
8547 Elf_Internal_Sym
* sym
;
8548 Elf_Internal_Sym
* beg
;
8549 Elf_Internal_Sym
* end
;
8550 Elf_Internal_Sym
* best
= NULL
;
8552 REMOVE_ARCH_BITS (addr
.offset
);
8554 end
= symtab
+ nsyms
;
8560 sym
= beg
+ (end
- beg
) / 2;
8562 value
= sym
->st_value
;
8563 REMOVE_ARCH_BITS (value
);
8565 if (sym
->st_name
!= 0
8566 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
8567 && addr
.offset
>= value
8568 && addr
.offset
- value
< dist
)
8571 dist
= addr
.offset
- value
;
8576 if (addr
.offset
< value
)
8584 *symname
= (best
->st_name
>= strtab_size
8585 ? _("<corrupt>") : strtab
+ best
->st_name
);
8591 *offset
= addr
.offset
;
8594 static /* signed */ int
8595 symcmp (const void *p
, const void *q
)
8597 Elf_Internal_Sym
*sp
= (Elf_Internal_Sym
*) p
;
8598 Elf_Internal_Sym
*sq
= (Elf_Internal_Sym
*) q
;
8600 return sp
->st_value
> sq
->st_value
? 1 : (sp
->st_value
< sq
->st_value
? -1 : 0);
8603 /* Process the unwind section. */
8605 #include "unwind-ia64.h"
8607 struct ia64_unw_table_entry
8609 struct absaddr start
;
8611 struct absaddr info
;
8614 struct ia64_unw_aux_info
8616 struct ia64_unw_table_entry
* table
; /* Unwind table. */
8617 unsigned long table_len
; /* Length of unwind table. */
8618 unsigned char * info
; /* Unwind info. */
8619 unsigned long info_size
; /* Size of unwind info. */
8620 bfd_vma info_addr
; /* Starting address of unwind info. */
8621 bfd_vma seg_base
; /* Starting address of segment. */
8622 Elf_Internal_Sym
* symtab
; /* The symbol table. */
8623 unsigned long nsyms
; /* Number of symbols. */
8624 Elf_Internal_Sym
* funtab
; /* Sorted table of STT_FUNC symbols. */
8625 unsigned long nfuns
; /* Number of entries in funtab. */
8626 char * strtab
; /* The string table. */
8627 unsigned long strtab_size
; /* Size of string table. */
8631 dump_ia64_unwind (Filedata
* filedata
, struct ia64_unw_aux_info
* aux
)
8633 struct ia64_unw_table_entry
* tp
;
8634 unsigned long j
, nfuns
;
8638 aux
->funtab
= xmalloc (aux
->nsyms
* sizeof (Elf_Internal_Sym
));
8639 for (nfuns
= 0, j
= 0; j
< aux
->nsyms
; j
++)
8640 if (aux
->symtab
[j
].st_value
&& ELF_ST_TYPE (aux
->symtab
[j
].st_info
) == STT_FUNC
)
8641 aux
->funtab
[nfuns
++] = aux
->symtab
[j
];
8643 qsort (aux
->funtab
, aux
->nfuns
, sizeof (Elf_Internal_Sym
), symcmp
);
8645 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
8649 const unsigned char * dp
;
8650 const unsigned char * head
;
8651 const unsigned char * end
;
8652 const char * procname
;
8654 find_symbol_for_address (filedata
, aux
->funtab
, aux
->nfuns
, aux
->strtab
,
8655 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
8657 fputs ("\n<", stdout
);
8661 fputs (procname
, stdout
);
8664 printf ("+%lx", (unsigned long) offset
);
8667 fputs (">: [", stdout
);
8668 print_vma (tp
->start
.offset
, PREFIX_HEX
);
8669 fputc ('-', stdout
);
8670 print_vma (tp
->end
.offset
, PREFIX_HEX
);
8671 printf ("], info at +0x%lx\n",
8672 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
8674 /* PR 17531: file: 86232b32. */
8675 if (aux
->info
== NULL
)
8678 offset
= tp
->info
.offset
;
8679 if (tp
->info
.section
)
8681 if (tp
->info
.section
>= filedata
->file_header
.e_shnum
)
8683 warn (_("Invalid section %u in table entry %ld\n"),
8684 tp
->info
.section
, (long) (tp
- aux
->table
));
8688 offset
+= filedata
->section_headers
[tp
->info
.section
].sh_addr
;
8690 offset
-= aux
->info_addr
;
8691 /* PR 17531: file: 0997b4d1. */
8692 if (offset
>= aux
->info_size
8693 || aux
->info_size
- offset
< 8)
8695 warn (_("Invalid offset %lx in table entry %ld\n"),
8696 (long) tp
->info
.offset
, (long) (tp
- aux
->table
));
8701 head
= aux
->info
+ offset
;
8702 stamp
= byte_get ((unsigned char *) head
, sizeof (stamp
));
8704 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
8705 (unsigned) UNW_VER (stamp
),
8706 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
8707 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
8708 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
8709 (unsigned long) (eh_addr_size
* UNW_LENGTH (stamp
)));
8711 if (UNW_VER (stamp
) != 1)
8713 printf (_("\tUnknown version.\n"));
8718 end
= head
+ 8 + eh_addr_size
* UNW_LENGTH (stamp
);
8719 /* PR 17531: file: 16ceda89. */
8720 if (end
> aux
->info
+ aux
->info_size
)
8721 end
= aux
->info
+ aux
->info_size
;
8722 for (dp
= head
+ 8; dp
< end
;)
8723 dp
= unw_decode (dp
, in_body
, & in_body
, end
);
8732 slurp_ia64_unwind_table (Filedata
* filedata
,
8733 struct ia64_unw_aux_info
* aux
,
8734 Elf_Internal_Shdr
* sec
)
8736 unsigned long size
, nrelas
, i
;
8737 Elf_Internal_Phdr
* seg
;
8738 struct ia64_unw_table_entry
* tep
;
8739 Elf_Internal_Shdr
* relsec
;
8740 Elf_Internal_Rela
* rela
;
8741 Elf_Internal_Rela
* rp
;
8742 unsigned char * table
;
8744 Elf_Internal_Sym
* sym
;
8745 const char * relname
;
8749 /* First, find the starting address of the segment that includes
8752 if (filedata
->file_header
.e_phnum
)
8754 if (! get_program_headers (filedata
))
8757 for (seg
= filedata
->program_headers
;
8758 seg
< filedata
->program_headers
+ filedata
->file_header
.e_phnum
;
8761 if (seg
->p_type
!= PT_LOAD
)
8764 if (sec
->sh_addr
>= seg
->p_vaddr
8765 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
8767 aux
->seg_base
= seg
->p_vaddr
;
8773 /* Second, build the unwind table from the contents of the unwind section: */
8774 size
= sec
->sh_size
;
8775 table
= (unsigned char *) get_data (NULL
, filedata
, sec
->sh_offset
, 1, size
,
8780 aux
->table_len
= size
/ (3 * eh_addr_size
);
8781 aux
->table
= (struct ia64_unw_table_entry
*)
8782 xcmalloc (aux
->table_len
, sizeof (aux
->table
[0]));
8785 for (tp
= table
; tp
<= table
+ size
- (3 * eh_addr_size
); ++tep
)
8787 tep
->start
.section
= SHN_UNDEF
;
8788 tep
->end
.section
= SHN_UNDEF
;
8789 tep
->info
.section
= SHN_UNDEF
;
8790 tep
->start
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
8791 tep
->end
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
8792 tep
->info
.offset
= byte_get (tp
, eh_addr_size
); tp
+= eh_addr_size
;
8793 tep
->start
.offset
+= aux
->seg_base
;
8794 tep
->end
.offset
+= aux
->seg_base
;
8795 tep
->info
.offset
+= aux
->seg_base
;
8799 /* Third, apply any relocations to the unwind table: */
8800 for (relsec
= filedata
->section_headers
;
8801 relsec
< filedata
->section_headers
+ filedata
->file_header
.e_shnum
;
8804 if (relsec
->sh_type
!= SHT_RELA
8805 || relsec
->sh_info
>= filedata
->file_header
.e_shnum
8806 || filedata
->section_headers
+ relsec
->sh_info
!= sec
)
8809 if (!slurp_rela_relocs (filedata
, relsec
->sh_offset
, relsec
->sh_size
,
8818 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
8820 unsigned int sym_ndx
;
8821 unsigned int r_type
= get_reloc_type (filedata
, rp
->r_info
);
8822 relname
= elf_ia64_reloc_type (r_type
);
8824 /* PR 17531: file: 9fa67536. */
8825 if (relname
== NULL
)
8827 warn (_("Skipping unknown relocation type: %u\n"), r_type
);
8831 if (! startswith (relname
, "R_IA64_SEGREL"))
8833 warn (_("Skipping unexpected relocation type: %s\n"), relname
);
8837 i
= rp
->r_offset
/ (3 * eh_addr_size
);
8839 /* PR 17531: file: 5bc8d9bf. */
8840 if (i
>= aux
->table_len
)
8842 warn (_("Skipping reloc with overlarge offset: %lx\n"), i
);
8846 sym_ndx
= get_reloc_symindex (rp
->r_info
);
8847 if (sym_ndx
>= aux
->nsyms
)
8849 warn (_("Skipping reloc with invalid symbol index: %u\n"),
8853 sym
= aux
->symtab
+ sym_ndx
;
8855 switch (rp
->r_offset
/ eh_addr_size
% 3)
8858 aux
->table
[i
].start
.section
= sym
->st_shndx
;
8859 aux
->table
[i
].start
.offset
= rp
->r_addend
+ sym
->st_value
;
8862 aux
->table
[i
].end
.section
= sym
->st_shndx
;
8863 aux
->table
[i
].end
.offset
= rp
->r_addend
+ sym
->st_value
;
8866 aux
->table
[i
].info
.section
= sym
->st_shndx
;
8867 aux
->table
[i
].info
.offset
= rp
->r_addend
+ sym
->st_value
;
8881 ia64_process_unwind (Filedata
* filedata
)
8883 Elf_Internal_Shdr
* sec
;
8884 Elf_Internal_Shdr
* unwsec
= NULL
;
8885 unsigned long i
, unwcount
= 0, unwstart
= 0;
8886 struct ia64_unw_aux_info aux
;
8889 memset (& aux
, 0, sizeof (aux
));
8891 for (i
= 0, sec
= filedata
->section_headers
; i
< filedata
->file_header
.e_shnum
; ++i
, ++sec
)
8893 if (sec
->sh_type
== SHT_SYMTAB
)
8897 error (_("Multiple symbol tables encountered\n"));
8903 if (!get_symtab (filedata
, sec
, &aux
.symtab
, &aux
.nsyms
,
8904 &aux
.strtab
, &aux
.strtab_size
))
8907 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
8912 printf (_("\nThere are no unwind sections in this file.\n"));
8914 while (unwcount
-- > 0)
8919 for (i
= unwstart
, sec
= filedata
->section_headers
+ unwstart
, unwsec
= NULL
;
8920 i
< filedata
->file_header
.e_shnum
; ++i
, ++sec
)
8921 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
8926 /* We have already counted the number of SHT_IA64_UNWIND
8927 sections so the loop above should never fail. */
8928 assert (unwsec
!= NULL
);
8931 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
8933 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
8935 /* We need to find which section group it is in. */
8936 struct group_list
* g
;
8938 if (filedata
->section_headers_groups
== NULL
8939 || filedata
->section_headers_groups
[i
] == NULL
)
8940 i
= filedata
->file_header
.e_shnum
;
8943 g
= filedata
->section_headers_groups
[i
]->root
;
8945 for (; g
!= NULL
; g
= g
->next
)
8947 sec
= filedata
->section_headers
+ g
->section_index
;
8949 if (section_name_valid (filedata
, sec
)
8950 && streq (section_name (filedata
, sec
),
8951 ELF_STRING_ia64_unwind_info
))
8956 i
= filedata
->file_header
.e_shnum
;
8959 else if (section_name_valid (filedata
, unwsec
)
8960 && startswith (section_name (filedata
, unwsec
),
8961 ELF_STRING_ia64_unwind_once
))
8963 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
8964 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
8965 suffix
= section_name (filedata
, unwsec
) + len
;
8966 for (i
= 0, sec
= filedata
->section_headers
;
8967 i
< filedata
->file_header
.e_shnum
;
8969 if (section_name_valid (filedata
, sec
)
8970 && startswith (section_name (filedata
, sec
),
8971 ELF_STRING_ia64_unwind_info_once
)
8972 && streq (section_name (filedata
, sec
) + len2
, suffix
))
8977 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
8978 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
8979 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
8980 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
8982 if (section_name_valid (filedata
, unwsec
)
8983 && startswith (section_name (filedata
, unwsec
),
8984 ELF_STRING_ia64_unwind
))
8985 suffix
= section_name (filedata
, unwsec
) + len
;
8986 for (i
= 0, sec
= filedata
->section_headers
;
8987 i
< filedata
->file_header
.e_shnum
;
8989 if (section_name_valid (filedata
, sec
)
8990 && startswith (section_name (filedata
, sec
),
8991 ELF_STRING_ia64_unwind_info
)
8992 && streq (section_name (filedata
, sec
) + len2
, suffix
))
8996 if (i
== filedata
->file_header
.e_shnum
)
8998 printf (_("\nCould not find unwind info section for "));
9000 if (filedata
->string_table
== NULL
)
9001 printf ("%d", unwsec
->sh_name
);
9003 printf ("'%s'", printable_section_name (filedata
, unwsec
));
9007 aux
.info_addr
= sec
->sh_addr
;
9008 aux
.info
= (unsigned char *) get_data (NULL
, filedata
, sec
->sh_offset
, 1,
9011 aux
.info_size
= aux
.info
== NULL
? 0 : sec
->sh_size
;
9013 printf (_("\nUnwind section "));
9015 if (filedata
->string_table
== NULL
)
9016 printf ("%d", unwsec
->sh_name
);
9018 printf ("'%s'", printable_section_name (filedata
, unwsec
));
9020 printf (_(" at offset 0x%lx contains %lu entries:\n"),
9021 (unsigned long) unwsec
->sh_offset
,
9022 (unsigned long) (unwsec
->sh_size
/ (3 * eh_addr_size
)));
9024 if (slurp_ia64_unwind_table (filedata
, & aux
, unwsec
)
9025 && aux
.table_len
> 0)
9026 dump_ia64_unwind (filedata
, & aux
);
9028 free ((char *) aux
.table
);
9029 free ((char *) aux
.info
);
9036 free ((char *) aux
.strtab
);
9041 struct hppa_unw_table_entry
9043 struct absaddr start
;
9045 unsigned int Cannot_unwind
:1; /* 0 */
9046 unsigned int Millicode
:1; /* 1 */
9047 unsigned int Millicode_save_sr0
:1; /* 2 */
9048 unsigned int Region_description
:2; /* 3..4 */
9049 unsigned int reserved1
:1; /* 5 */
9050 unsigned int Entry_SR
:1; /* 6 */
9051 unsigned int Entry_FR
:4; /* Number saved 7..10 */
9052 unsigned int Entry_GR
:5; /* Number saved 11..15 */
9053 unsigned int Args_stored
:1; /* 16 */
9054 unsigned int Variable_Frame
:1; /* 17 */
9055 unsigned int Separate_Package_Body
:1; /* 18 */
9056 unsigned int Frame_Extension_Millicode
:1; /* 19 */
9057 unsigned int Stack_Overflow_Check
:1; /* 20 */
9058 unsigned int Two_Instruction_SP_Increment
:1; /* 21 */
9059 unsigned int Ada_Region
:1; /* 22 */
9060 unsigned int cxx_info
:1; /* 23 */
9061 unsigned int cxx_try_catch
:1; /* 24 */
9062 unsigned int sched_entry_seq
:1; /* 25 */
9063 unsigned int reserved2
:1; /* 26 */
9064 unsigned int Save_SP
:1; /* 27 */
9065 unsigned int Save_RP
:1; /* 28 */
9066 unsigned int Save_MRP_in_frame
:1; /* 29 */
9067 unsigned int extn_ptr_defined
:1; /* 30 */
9068 unsigned int Cleanup_defined
:1; /* 31 */
9070 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
9071 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
9072 unsigned int Large_frame
:1; /* 2 */
9073 unsigned int Pseudo_SP_Set
:1; /* 3 */
9074 unsigned int reserved4
:1; /* 4 */
9075 unsigned int Total_frame_size
:27; /* 5..31 */
9078 struct hppa_unw_aux_info
9080 struct hppa_unw_table_entry
* table
; /* Unwind table. */
9081 unsigned long table_len
; /* Length of unwind table. */
9082 bfd_vma seg_base
; /* Starting address of segment. */
9083 Elf_Internal_Sym
* symtab
; /* The symbol table. */
9084 unsigned long nsyms
; /* Number of symbols. */
9085 Elf_Internal_Sym
* funtab
; /* Sorted table of STT_FUNC symbols. */
9086 unsigned long nfuns
; /* Number of entries in funtab. */
9087 char * strtab
; /* The string table. */
9088 unsigned long strtab_size
; /* Size of string table. */
9092 dump_hppa_unwind (Filedata
* filedata
, struct hppa_unw_aux_info
* aux
)
9094 struct hppa_unw_table_entry
* tp
;
9095 unsigned long j
, nfuns
;
9098 aux
->funtab
= xmalloc (aux
->nsyms
* sizeof (Elf_Internal_Sym
));
9099 for (nfuns
= 0, j
= 0; j
< aux
->nsyms
; j
++)
9100 if (aux
->symtab
[j
].st_value
&& ELF_ST_TYPE (aux
->symtab
[j
].st_info
) == STT_FUNC
)
9101 aux
->funtab
[nfuns
++] = aux
->symtab
[j
];
9103 qsort (aux
->funtab
, aux
->nfuns
, sizeof (Elf_Internal_Sym
), symcmp
);
9105 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
9108 const char * procname
;
9110 find_symbol_for_address (filedata
, aux
->funtab
, aux
->nfuns
, aux
->strtab
,
9111 aux
->strtab_size
, tp
->start
, &procname
,
9114 fputs ("\n<", stdout
);
9118 fputs (procname
, stdout
);
9121 printf ("+%lx", (unsigned long) offset
);
9124 fputs (">: [", stdout
);
9125 print_vma (tp
->start
.offset
, PREFIX_HEX
);
9126 fputc ('-', stdout
);
9127 print_vma (tp
->end
.offset
, PREFIX_HEX
);
9130 #define PF(_m) if (tp->_m) printf (#_m " ");
9131 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
9134 PF(Millicode_save_sr0
);
9135 /* PV(Region_description); */
9141 PF(Separate_Package_Body
);
9142 PF(Frame_Extension_Millicode
);
9143 PF(Stack_Overflow_Check
);
9144 PF(Two_Instruction_SP_Increment
);
9148 PF(sched_entry_seq
);
9151 PF(Save_MRP_in_frame
);
9152 PF(extn_ptr_defined
);
9153 PF(Cleanup_defined
);
9154 PF(MPE_XL_interrupt_marker
);
9155 PF(HP_UX_interrupt_marker
);
9158 PV(Total_frame_size
);
9171 slurp_hppa_unwind_table (Filedata
* filedata
,
9172 struct hppa_unw_aux_info
* aux
,
9173 Elf_Internal_Shdr
* sec
)
9175 unsigned long size
, unw_ent_size
, nentries
, nrelas
, i
;
9176 Elf_Internal_Phdr
* seg
;
9177 struct hppa_unw_table_entry
* tep
;
9178 Elf_Internal_Shdr
* relsec
;
9179 Elf_Internal_Rela
* rela
;
9180 Elf_Internal_Rela
* rp
;
9181 unsigned char * table
;
9183 Elf_Internal_Sym
* sym
;
9184 const char * relname
;
9186 /* First, find the starting address of the segment that includes
9188 if (filedata
->file_header
.e_phnum
)
9190 if (! get_program_headers (filedata
))
9193 for (seg
= filedata
->program_headers
;
9194 seg
< filedata
->program_headers
+ filedata
->file_header
.e_phnum
;
9197 if (seg
->p_type
!= PT_LOAD
)
9200 if (sec
->sh_addr
>= seg
->p_vaddr
9201 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
9203 aux
->seg_base
= seg
->p_vaddr
;
9209 /* Second, build the unwind table from the contents of the unwind
9211 size
= sec
->sh_size
;
9212 table
= (unsigned char *) get_data (NULL
, filedata
, sec
->sh_offset
, 1, size
,
9218 nentries
= size
/ unw_ent_size
;
9219 size
= unw_ent_size
* nentries
;
9221 aux
->table_len
= nentries
;
9222 tep
= aux
->table
= (struct hppa_unw_table_entry
*)
9223 xcmalloc (nentries
, sizeof (aux
->table
[0]));
9225 for (tp
= table
; tp
< table
+ size
; tp
+= unw_ent_size
, ++tep
)
9227 unsigned int tmp1
, tmp2
;
9229 tep
->start
.section
= SHN_UNDEF
;
9230 tep
->end
.section
= SHN_UNDEF
;
9232 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
9233 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
9234 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
9235 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
9237 tep
->start
.offset
+= aux
->seg_base
;
9238 tep
->end
.offset
+= aux
->seg_base
;
9240 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
9241 tep
->Millicode
= (tmp1
>> 30) & 0x1;
9242 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
9243 tep
->Region_description
= (tmp1
>> 27) & 0x3;
9244 tep
->reserved1
= (tmp1
>> 26) & 0x1;
9245 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
9246 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
9247 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
9248 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
9249 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
9250 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
9251 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
9252 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
9253 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
9254 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
9255 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
9256 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
9257 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
9258 tep
->reserved2
= (tmp1
>> 5) & 0x1;
9259 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
9260 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
9261 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
9262 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
9263 tep
->Cleanup_defined
= tmp1
& 0x1;
9265 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
9266 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
9267 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
9268 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
9269 tep
->reserved4
= (tmp2
>> 27) & 0x1;
9270 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
9274 /* Third, apply any relocations to the unwind table. */
9275 for (relsec
= filedata
->section_headers
;
9276 relsec
< filedata
->section_headers
+ filedata
->file_header
.e_shnum
;
9279 if (relsec
->sh_type
!= SHT_RELA
9280 || relsec
->sh_info
>= filedata
->file_header
.e_shnum
9281 || filedata
->section_headers
+ relsec
->sh_info
!= sec
)
9284 if (!slurp_rela_relocs (filedata
, relsec
->sh_offset
, relsec
->sh_size
,
9288 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
9290 unsigned int sym_ndx
;
9291 unsigned int r_type
= get_reloc_type (filedata
, rp
->r_info
);
9292 relname
= elf_hppa_reloc_type (r_type
);
9294 if (relname
== NULL
)
9296 warn (_("Skipping unknown relocation type: %u\n"), r_type
);
9300 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
9301 if (! startswith (relname
, "R_PARISC_SEGREL"))
9303 warn (_("Skipping unexpected relocation type: %s\n"), relname
);
9307 i
= rp
->r_offset
/ unw_ent_size
;
9308 if (i
>= aux
->table_len
)
9310 warn (_("Skipping reloc with overlarge offset: %lx\n"), i
);
9314 sym_ndx
= get_reloc_symindex (rp
->r_info
);
9315 if (sym_ndx
>= aux
->nsyms
)
9317 warn (_("Skipping reloc with invalid symbol index: %u\n"),
9321 sym
= aux
->symtab
+ sym_ndx
;
9323 switch ((rp
->r_offset
% unw_ent_size
) / 4)
9326 aux
->table
[i
].start
.section
= sym
->st_shndx
;
9327 aux
->table
[i
].start
.offset
= sym
->st_value
+ rp
->r_addend
;
9330 aux
->table
[i
].end
.section
= sym
->st_shndx
;
9331 aux
->table
[i
].end
.offset
= sym
->st_value
+ rp
->r_addend
;
9345 hppa_process_unwind (Filedata
* filedata
)
9347 struct hppa_unw_aux_info aux
;
9348 Elf_Internal_Shdr
* unwsec
= NULL
;
9349 Elf_Internal_Shdr
* sec
;
9353 if (filedata
->string_table
== NULL
)
9356 memset (& aux
, 0, sizeof (aux
));
9358 for (i
= 0, sec
= filedata
->section_headers
; i
< filedata
->file_header
.e_shnum
; ++i
, ++sec
)
9360 if (sec
->sh_type
== SHT_SYMTAB
)
9364 error (_("Multiple symbol tables encountered\n"));
9370 if (!get_symtab (filedata
, sec
, &aux
.symtab
, &aux
.nsyms
,
9371 &aux
.strtab
, &aux
.strtab_size
))
9374 else if (section_name_valid (filedata
, sec
)
9375 && streq (section_name (filedata
, sec
), ".PARISC.unwind"))
9380 printf (_("\nThere are no unwind sections in this file.\n"));
9382 for (i
= 0, sec
= filedata
->section_headers
; i
< filedata
->file_header
.e_shnum
; ++i
, ++sec
)
9384 if (section_name_valid (filedata
, sec
)
9385 && streq (section_name (filedata
, sec
), ".PARISC.unwind"))
9387 unsigned long num_unwind
= sec
->sh_size
/ 16;
9389 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9390 "contains %lu entry:\n",
9391 "\nUnwind section '%s' at offset 0x%lx "
9392 "contains %lu entries:\n",
9394 printable_section_name (filedata
, sec
),
9395 (unsigned long) sec
->sh_offset
,
9398 if (! slurp_hppa_unwind_table (filedata
, &aux
, sec
))
9401 if (res
&& aux
.table_len
> 0)
9403 if (! dump_hppa_unwind (filedata
, &aux
))
9407 free ((char *) aux
.table
);
9413 free ((char *) aux
.strtab
);
9420 unsigned char * data
; /* The unwind data. */
9421 Elf_Internal_Shdr
* sec
; /* The cached unwind section header. */
9422 Elf_Internal_Rela
* rela
; /* The cached relocations for this section. */
9423 unsigned long nrelas
; /* The number of relocations. */
9424 unsigned int rel_type
; /* REL or RELA ? */
9425 Elf_Internal_Rela
* next_rela
; /* Cyclic pointer to the next reloc to process. */
9428 struct arm_unw_aux_info
9430 Filedata
* filedata
; /* The file containing the unwind sections. */
9431 Elf_Internal_Sym
* symtab
; /* The file's symbol table. */
9432 unsigned long nsyms
; /* Number of symbols. */
9433 Elf_Internal_Sym
* funtab
; /* Sorted table of STT_FUNC symbols. */
9434 unsigned long nfuns
; /* Number of these symbols. */
9435 char * strtab
; /* The file's string table. */
9436 unsigned long strtab_size
; /* Size of string table. */
9440 arm_print_vma_and_name (Filedata
* filedata
,
9441 struct arm_unw_aux_info
* aux
,
9443 struct absaddr addr
)
9445 const char *procname
;
9448 if (addr
.section
== SHN_UNDEF
)
9451 find_symbol_for_address (filedata
, aux
->funtab
, aux
->nfuns
, aux
->strtab
,
9452 aux
->strtab_size
, addr
, &procname
,
9455 print_vma (fn
, PREFIX_HEX
);
9459 fputs (" <", stdout
);
9460 fputs (procname
, stdout
);
9463 printf ("+0x%lx", (unsigned long) sym_offset
);
9464 fputc ('>', stdout
);
9471 arm_free_section (struct arm_section
*arm_sec
)
9473 free (arm_sec
->data
);
9474 free (arm_sec
->rela
);
9477 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
9478 cached section and install SEC instead.
9479 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
9480 and return its valued in * WORDP, relocating if necessary.
9481 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
9482 relocation's offset in ADDR.
9483 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
9484 into the string table of the symbol associated with the reloc. If no
9485 reloc was applied store -1 there.
9486 5) Return TRUE upon success, FALSE otherwise. */
9489 get_unwind_section_word (Filedata
* filedata
,
9490 struct arm_unw_aux_info
* aux
,
9491 struct arm_section
* arm_sec
,
9492 Elf_Internal_Shdr
* sec
,
9493 bfd_vma word_offset
,
9494 unsigned int * wordp
,
9495 struct absaddr
* addr
,
9498 Elf_Internal_Rela
*rp
;
9499 Elf_Internal_Sym
*sym
;
9500 const char * relname
;
9504 if (sec
== NULL
|| arm_sec
== NULL
)
9507 addr
->section
= SHN_UNDEF
;
9510 if (sym_name
!= NULL
)
9511 *sym_name
= (bfd_vma
) -1;
9513 /* If necessary, update the section cache. */
9514 if (sec
!= arm_sec
->sec
)
9516 Elf_Internal_Shdr
*relsec
;
9518 arm_free_section (arm_sec
);
9521 arm_sec
->data
= get_data (NULL
, aux
->filedata
, sec
->sh_offset
, 1,
9522 sec
->sh_size
, _("unwind data"));
9523 arm_sec
->rela
= NULL
;
9524 arm_sec
->nrelas
= 0;
9526 for (relsec
= filedata
->section_headers
;
9527 relsec
< filedata
->section_headers
+ filedata
->file_header
.e_shnum
;
9530 if (relsec
->sh_info
>= filedata
->file_header
.e_shnum
9531 || filedata
->section_headers
+ relsec
->sh_info
!= sec
9532 /* PR 15745: Check the section type as well. */
9533 || (relsec
->sh_type
!= SHT_REL
9534 && relsec
->sh_type
!= SHT_RELA
))
9537 arm_sec
->rel_type
= relsec
->sh_type
;
9538 if (relsec
->sh_type
== SHT_REL
)
9540 if (!slurp_rel_relocs (aux
->filedata
, relsec
->sh_offset
,
9542 & arm_sec
->rela
, & arm_sec
->nrelas
))
9545 else /* relsec->sh_type == SHT_RELA */
9547 if (!slurp_rela_relocs (aux
->filedata
, relsec
->sh_offset
,
9549 & arm_sec
->rela
, & arm_sec
->nrelas
))
9555 arm_sec
->next_rela
= arm_sec
->rela
;
9558 /* If there is no unwind data we can do nothing. */
9559 if (arm_sec
->data
== NULL
)
9562 /* If the offset is invalid then fail. */
9563 if (/* PR 21343 *//* PR 18879 */
9565 || word_offset
> (sec
->sh_size
- 4)
9566 || ((bfd_signed_vma
) word_offset
) < 0)
9569 /* Get the word at the required offset. */
9570 word
= byte_get (arm_sec
->data
+ word_offset
, 4);
9572 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
9573 if (arm_sec
->rela
== NULL
)
9579 /* Look through the relocs to find the one that applies to the provided offset. */
9581 for (rp
= arm_sec
->next_rela
; rp
!= arm_sec
->rela
+ arm_sec
->nrelas
; rp
++)
9583 bfd_vma prelval
, offset
;
9585 if (rp
->r_offset
> word_offset
&& !wrapped
)
9590 if (rp
->r_offset
> word_offset
)
9593 if (rp
->r_offset
& 3)
9595 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
9596 (unsigned long) rp
->r_offset
);
9600 if (rp
->r_offset
< word_offset
)
9603 /* PR 17531: file: 027-161405-0.004 */
9604 if (aux
->symtab
== NULL
)
9607 if (arm_sec
->rel_type
== SHT_REL
)
9609 offset
= word
& 0x7fffffff;
9610 if (offset
& 0x40000000)
9611 offset
|= ~ (bfd_vma
) 0x7fffffff;
9613 else if (arm_sec
->rel_type
== SHT_RELA
)
9614 offset
= rp
->r_addend
;
9617 error (_("Unknown section relocation type %d encountered\n"),
9622 /* PR 17531 file: 027-1241568-0.004. */
9623 if (ELF32_R_SYM (rp
->r_info
) >= aux
->nsyms
)
9625 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
9626 (unsigned long) ELF32_R_SYM (rp
->r_info
), aux
->nsyms
);
9630 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
9631 offset
+= sym
->st_value
;
9632 prelval
= offset
- (arm_sec
->sec
->sh_addr
+ rp
->r_offset
);
9634 /* Check that we are processing the expected reloc type. */
9635 if (filedata
->file_header
.e_machine
== EM_ARM
)
9637 relname
= elf_arm_reloc_type (ELF32_R_TYPE (rp
->r_info
));
9638 if (relname
== NULL
)
9640 warn (_("Skipping unknown ARM relocation type: %d\n"),
9641 (int) ELF32_R_TYPE (rp
->r_info
));
9645 if (streq (relname
, "R_ARM_NONE"))
9648 if (! streq (relname
, "R_ARM_PREL31"))
9650 warn (_("Skipping unexpected ARM relocation type %s\n"), relname
);
9654 else if (filedata
->file_header
.e_machine
== EM_TI_C6000
)
9656 relname
= elf_tic6x_reloc_type (ELF32_R_TYPE (rp
->r_info
));
9657 if (relname
== NULL
)
9659 warn (_("Skipping unknown C6000 relocation type: %d\n"),
9660 (int) ELF32_R_TYPE (rp
->r_info
));
9664 if (streq (relname
, "R_C6000_NONE"))
9667 if (! streq (relname
, "R_C6000_PREL31"))
9669 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname
);
9677 /* This function currently only supports ARM and TI unwinders. */
9678 warn (_("Only TI and ARM unwinders are currently supported\n"));
9682 word
= (word
& ~ (bfd_vma
) 0x7fffffff) | (prelval
& 0x7fffffff);
9683 addr
->section
= sym
->st_shndx
;
9684 addr
->offset
= offset
;
9687 * sym_name
= sym
->st_name
;
9692 arm_sec
->next_rela
= rp
;
9697 static const char *tic6x_unwind_regnames
[16] =
9699 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
9700 "A14", "A13", "A12", "A11", "A10",
9701 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
9705 decode_tic6x_unwind_regmask (unsigned int mask
)
9709 for (i
= 12; mask
; mask
>>= 1, i
--)
9713 fputs (tic6x_unwind_regnames
[i
], stdout
);
9715 fputs (", ", stdout
);
9721 if (remaining == 0 && more_words) \
9724 if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, \
9725 data_offset, & word, & addr, NULL)) \
9731 #define GET_OP(OP) \
9736 (OP) = word >> 24; \
9741 printf (_("[Truncated opcode]\n")); \
9744 printf ("0x%02x ", OP)
9747 decode_arm_unwind_bytecode (Filedata
* filedata
,
9748 struct arm_unw_aux_info
* aux
,
9750 unsigned int remaining
,
9751 unsigned int more_words
,
9752 bfd_vma data_offset
,
9753 Elf_Internal_Shdr
* data_sec
,
9754 struct arm_section
* data_arm_sec
)
9756 struct absaddr addr
;
9759 /* Decode the unwinding instructions. */
9762 unsigned int op
, op2
;
9771 printf (" 0x%02x ", op
);
9773 if ((op
& 0xc0) == 0x00)
9775 int offset
= ((op
& 0x3f) << 2) + 4;
9777 printf (" vsp = vsp + %d", offset
);
9779 else if ((op
& 0xc0) == 0x40)
9781 int offset
= ((op
& 0x3f) << 2) + 4;
9783 printf (" vsp = vsp - %d", offset
);
9785 else if ((op
& 0xf0) == 0x80)
9788 if (op
== 0x80 && op2
== 0)
9789 printf (_("Refuse to unwind"));
9792 unsigned int mask
= ((op
& 0x0f) << 8) | op2
;
9797 for (i
= 0; i
< 12; i
++)
9798 if (mask
& (1 << i
))
9804 printf ("r%d", 4 + i
);
9809 else if ((op
& 0xf0) == 0x90)
9811 if (op
== 0x9d || op
== 0x9f)
9812 printf (_(" [Reserved]"));
9814 printf (" vsp = r%d", op
& 0x0f);
9816 else if ((op
& 0xf0) == 0xa0)
9818 int end
= 4 + (op
& 0x07);
9823 for (i
= 4; i
<= end
; i
++)
9839 else if (op
== 0xb0)
9840 printf (_(" finish"));
9841 else if (op
== 0xb1)
9844 if (op2
== 0 || (op2
& 0xf0) != 0)
9845 printf (_("[Spare]"));
9848 unsigned int mask
= op2
& 0x0f;
9853 for (i
= 0; i
< 12; i
++)
9854 if (mask
& (1 << i
))
9865 else if (op
== 0xb2)
9867 unsigned char buf
[9];
9868 unsigned int i
, len
;
9869 unsigned long offset
;
9871 for (i
= 0; i
< sizeof (buf
); i
++)
9874 if ((buf
[i
] & 0x80) == 0)
9877 if (i
== sizeof (buf
))
9879 error (_("corrupt change to vsp\n"));
9884 offset
= read_leb128 (buf
, buf
+ i
+ 1, false, &len
, NULL
);
9885 assert (len
== i
+ 1);
9886 offset
= offset
* 4 + 0x204;
9887 printf ("vsp = vsp + %ld", offset
);
9890 else if (op
== 0xb3 || op
== 0xc8 || op
== 0xc9)
9892 unsigned int first
, last
;
9899 printf ("pop {D%d", first
);
9901 printf ("-D%d", first
+ last
);
9904 else if (op
== 0xb4)
9905 printf (_(" pop {ra_auth_code}"));
9906 else if ((op
& 0xf8) == 0xb8 || (op
& 0xf8) == 0xd0)
9908 unsigned int count
= op
& 0x07;
9912 printf ("-D%d", 8 + count
);
9915 else if (op
>= 0xc0 && op
<= 0xc5)
9917 unsigned int count
= op
& 0x07;
9919 printf (" pop {wR10");
9921 printf ("-wR%d", 10 + count
);
9924 else if (op
== 0xc6)
9926 unsigned int first
, last
;
9931 printf ("pop {wR%d", first
);
9933 printf ("-wR%d", first
+ last
);
9936 else if (op
== 0xc7)
9939 if (op2
== 0 || (op2
& 0xf0) != 0)
9940 printf (_("[Spare]"));
9943 unsigned int mask
= op2
& 0x0f;
9948 for (i
= 0; i
< 4; i
++)
9949 if (mask
& (1 << i
))
9955 printf ("wCGR%d", i
);
9962 printf (_(" [unsupported opcode]"));
9973 decode_tic6x_unwind_bytecode (Filedata
* filedata
,
9974 struct arm_unw_aux_info
* aux
,
9976 unsigned int remaining
,
9977 unsigned int more_words
,
9978 bfd_vma data_offset
,
9979 Elf_Internal_Shdr
* data_sec
,
9980 struct arm_section
* data_arm_sec
)
9982 struct absaddr addr
;
9984 /* Decode the unwinding instructions. */
9987 unsigned int op
, op2
;
9996 printf (" 0x%02x ", op
);
9998 if ((op
& 0xc0) == 0x00)
10000 int offset
= ((op
& 0x3f) << 3) + 8;
10001 printf (" sp = sp + %d", offset
);
10003 else if ((op
& 0xc0) == 0x80)
10006 if (op
== 0x80 && op2
== 0)
10007 printf (_("Refuse to unwind"));
10010 unsigned int mask
= ((op
& 0x1f) << 8) | op2
;
10012 printf ("pop compact {");
10016 decode_tic6x_unwind_regmask (mask
);
10020 else if ((op
& 0xf0) == 0xc0)
10023 unsigned int nregs
;
10028 unsigned int offset
;
10032 /* Scan entire instruction first so that GET_OP output is not
10033 interleaved with disassembly. */
10035 for (i
= 0; nregs
< (op
& 0xf); i
++)
10041 regpos
[nregs
].offset
= i
* 2;
10042 regpos
[nregs
].reg
= reg
;
10049 regpos
[nregs
].offset
= i
* 2 + 1;
10050 regpos
[nregs
].reg
= reg
;
10055 printf (_("pop frame {"));
10058 printf (_("*corrupt* - no registers specified"));
10063 for (i
= i
* 2; i
> 0; i
--)
10065 if (regpos
[reg
].offset
== i
- 1)
10067 name
= tic6x_unwind_regnames
[regpos
[reg
].reg
];
10074 fputs (name
, stdout
);
10082 else if (op
== 0xd0)
10083 printf (" MOV FP, SP");
10084 else if (op
== 0xd1)
10085 printf (" __c6xabi_pop_rts");
10086 else if (op
== 0xd2)
10088 unsigned char buf
[9];
10089 unsigned int i
, len
;
10090 unsigned long offset
;
10092 for (i
= 0; i
< sizeof (buf
); i
++)
10095 if ((buf
[i
] & 0x80) == 0)
10098 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
10099 if (i
== sizeof (buf
))
10101 warn (_("Corrupt stack pointer adjustment detected\n"));
10105 offset
= read_leb128 (buf
, buf
+ i
+ 1, false, &len
, NULL
);
10106 assert (len
== i
+ 1);
10107 offset
= offset
* 8 + 0x408;
10108 printf (_("sp = sp + %ld"), offset
);
10110 else if ((op
& 0xf0) == 0xe0)
10112 if ((op
& 0x0f) == 7)
10113 printf (" RETURN");
10115 printf (" MV %s, B3", tic6x_unwind_regnames
[op
& 0x0f]);
10119 printf (_(" [unsupported opcode]"));
10128 arm_expand_prel31 (Filedata
* filedata
, bfd_vma word
, bfd_vma where
)
10132 offset
= word
& 0x7fffffff;
10133 if (offset
& 0x40000000)
10134 offset
|= ~ (bfd_vma
) 0x7fffffff;
10136 if (filedata
->file_header
.e_machine
== EM_TI_C6000
)
10139 return offset
+ where
;
10143 decode_arm_unwind (Filedata
* filedata
,
10144 struct arm_unw_aux_info
* aux
,
10146 unsigned int remaining
,
10147 bfd_vma data_offset
,
10148 Elf_Internal_Shdr
* data_sec
,
10149 struct arm_section
* data_arm_sec
)
10152 unsigned int more_words
= 0;
10153 struct absaddr addr
;
10154 bfd_vma sym_name
= (bfd_vma
) -1;
10157 if (remaining
== 0)
10159 /* Fetch the first word.
10160 Note - when decoding an object file the address extracted
10161 here will always be 0. So we also pass in the sym_name
10162 parameter so that we can find the symbol associated with
10163 the personality routine. */
10164 if (! get_unwind_section_word (filedata
, aux
, data_arm_sec
, data_sec
, data_offset
,
10165 & word
, & addr
, & sym_name
))
10172 addr
.section
= SHN_UNDEF
;
10176 if ((word
& 0x80000000) == 0)
10178 /* Expand prel31 for personality routine. */
10180 const char *procname
;
10182 fn
= arm_expand_prel31 (filedata
, word
, data_sec
->sh_addr
+ data_offset
);
10183 printf (_(" Personality routine: "));
10185 && addr
.section
== SHN_UNDEF
&& addr
.offset
== 0
10186 && sym_name
!= (bfd_vma
) -1 && sym_name
< aux
->strtab_size
)
10188 procname
= aux
->strtab
+ sym_name
;
10189 print_vma (fn
, PREFIX_HEX
);
10192 fputs (" <", stdout
);
10193 fputs (procname
, stdout
);
10194 fputc ('>', stdout
);
10198 procname
= arm_print_vma_and_name (filedata
, aux
, fn
, addr
);
10199 fputc ('\n', stdout
);
10201 /* The GCC personality routines use the standard compact
10202 encoding, starting with one byte giving the number of
10204 if (procname
!= NULL
10205 && (startswith (procname
, "__gcc_personality_v0")
10206 || startswith (procname
, "__gxx_personality_v0")
10207 || startswith (procname
, "__gcj_personality_v0")
10208 || startswith (procname
, "__gnu_objc_personality_v0")))
10215 printf (_(" [Truncated data]\n"));
10218 more_words
= word
>> 24;
10228 /* ARM EHABI Section 6.3:
10230 An exception-handling table entry for the compact model looks like:
10232 31 30-28 27-24 23-0
10233 -- ----- ----- ----
10234 1 0 index Data for personalityRoutine[index] */
10236 if (filedata
->file_header
.e_machine
== EM_ARM
10237 && (word
& 0x70000000))
10239 warn (_("Corrupt ARM compact model table entry: %x \n"), word
);
10243 per_index
= (word
>> 24) & 0x7f;
10244 printf (_(" Compact model index: %d\n"), per_index
);
10245 if (per_index
== 0)
10251 else if (per_index
< 3)
10253 more_words
= (word
>> 16) & 0xff;
10259 switch (filedata
->file_header
.e_machine
)
10264 if (! decode_arm_unwind_bytecode (filedata
, aux
, word
, remaining
, more_words
,
10265 data_offset
, data_sec
, data_arm_sec
))
10270 warn (_("Unknown ARM compact model index encountered\n"));
10271 printf (_(" [reserved]\n"));
10279 if (! decode_tic6x_unwind_bytecode (filedata
, aux
, word
, remaining
, more_words
,
10280 data_offset
, data_sec
, data_arm_sec
))
10283 else if (per_index
< 5)
10285 if (((word
>> 17) & 0x7f) == 0x7f)
10286 printf (_(" Restore stack from frame pointer\n"));
10288 printf (_(" Stack increment %d\n"), (word
>> 14) & 0x1fc);
10289 printf (_(" Registers restored: "));
10290 if (per_index
== 4)
10291 printf (" (compact) ");
10292 decode_tic6x_unwind_regmask ((word
>> 4) & 0x1fff);
10294 printf (_(" Return register: %s\n"),
10295 tic6x_unwind_regnames
[word
& 0xf]);
10298 printf (_(" [reserved (%d)]\n"), per_index
);
10302 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
10303 filedata
->file_header
.e_machine
);
10307 /* Decode the descriptors. Not implemented. */
10313 dump_arm_unwind (Filedata
* filedata
,
10314 struct arm_unw_aux_info
* aux
,
10315 Elf_Internal_Shdr
* exidx_sec
)
10317 struct arm_section exidx_arm_sec
, extab_arm_sec
;
10318 unsigned int i
, exidx_len
;
10319 unsigned long j
, nfuns
;
10322 memset (&exidx_arm_sec
, 0, sizeof (exidx_arm_sec
));
10323 memset (&extab_arm_sec
, 0, sizeof (extab_arm_sec
));
10324 exidx_len
= exidx_sec
->sh_size
/ 8;
10326 aux
->funtab
= xmalloc (aux
->nsyms
* sizeof (Elf_Internal_Sym
));
10327 for (nfuns
= 0, j
= 0; j
< aux
->nsyms
; j
++)
10328 if (aux
->symtab
[j
].st_value
&& ELF_ST_TYPE (aux
->symtab
[j
].st_info
) == STT_FUNC
)
10329 aux
->funtab
[nfuns
++] = aux
->symtab
[j
];
10330 aux
->nfuns
= nfuns
;
10331 qsort (aux
->funtab
, aux
->nfuns
, sizeof (Elf_Internal_Sym
), symcmp
);
10333 for (i
= 0; i
< exidx_len
; i
++)
10335 unsigned int exidx_fn
, exidx_entry
;
10336 struct absaddr fn_addr
, entry_addr
;
10339 fputc ('\n', stdout
);
10341 if (! get_unwind_section_word (filedata
, aux
, & exidx_arm_sec
, exidx_sec
,
10342 8 * i
, & exidx_fn
, & fn_addr
, NULL
)
10343 || ! get_unwind_section_word (filedata
, aux
, & exidx_arm_sec
, exidx_sec
,
10344 8 * i
+ 4, & exidx_entry
, & entry_addr
, NULL
))
10346 free (aux
->funtab
);
10347 arm_free_section (& exidx_arm_sec
);
10348 arm_free_section (& extab_arm_sec
);
10352 /* ARM EHABI, Section 5:
10353 An index table entry consists of 2 words.
10354 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
10355 if (exidx_fn
& 0x80000000)
10357 warn (_("corrupt index table entry: %x\n"), exidx_fn
);
10361 fn
= arm_expand_prel31 (filedata
, exidx_fn
, exidx_sec
->sh_addr
+ 8 * i
);
10363 arm_print_vma_and_name (filedata
, aux
, fn
, fn_addr
);
10364 fputs (": ", stdout
);
10366 if (exidx_entry
== 1)
10368 print_vma (exidx_entry
, PREFIX_HEX
);
10369 fputs (" [cantunwind]\n", stdout
);
10371 else if (exidx_entry
& 0x80000000)
10373 print_vma (exidx_entry
, PREFIX_HEX
);
10374 fputc ('\n', stdout
);
10375 decode_arm_unwind (filedata
, aux
, exidx_entry
, 4, 0, NULL
, NULL
);
10379 bfd_vma table
, table_offset
= 0;
10380 Elf_Internal_Shdr
*table_sec
;
10382 fputs ("@", stdout
);
10383 table
= arm_expand_prel31 (filedata
, exidx_entry
, exidx_sec
->sh_addr
+ 8 * i
+ 4);
10384 print_vma (table
, PREFIX_HEX
);
10387 /* Locate the matching .ARM.extab. */
10388 if (entry_addr
.section
!= SHN_UNDEF
10389 && entry_addr
.section
< filedata
->file_header
.e_shnum
)
10391 table_sec
= filedata
->section_headers
+ entry_addr
.section
;
10392 table_offset
= entry_addr
.offset
;
10394 if (table_offset
> table_sec
->sh_size
10395 || ((bfd_signed_vma
) table_offset
) < 0)
10397 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
10398 (unsigned long) table_offset
,
10399 printable_section_name (filedata
, table_sec
));
10406 table_sec
= find_section_by_address (filedata
, table
);
10407 if (table_sec
!= NULL
)
10408 table_offset
= table
- table_sec
->sh_addr
;
10411 if (table_sec
== NULL
)
10413 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
10414 (unsigned long) table
);
10419 if (! decode_arm_unwind (filedata
, aux
, 0, 0, table_offset
, table_sec
,
10427 free (aux
->funtab
);
10428 arm_free_section (&exidx_arm_sec
);
10429 arm_free_section (&extab_arm_sec
);
10434 /* Used for both ARM and C6X unwinding tables. */
10437 arm_process_unwind (Filedata
* filedata
)
10439 struct arm_unw_aux_info aux
;
10440 Elf_Internal_Shdr
*unwsec
= NULL
;
10441 Elf_Internal_Shdr
*sec
;
10443 unsigned int sec_type
;
10446 switch (filedata
->file_header
.e_machine
)
10449 sec_type
= SHT_ARM_EXIDX
;
10453 sec_type
= SHT_C6000_UNWIND
;
10457 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
10458 filedata
->file_header
.e_machine
);
10462 if (filedata
->string_table
== NULL
)
10465 memset (& aux
, 0, sizeof (aux
));
10466 aux
.filedata
= filedata
;
10468 for (i
= 0, sec
= filedata
->section_headers
; i
< filedata
->file_header
.e_shnum
; ++i
, ++sec
)
10470 if (sec
->sh_type
== SHT_SYMTAB
)
10474 error (_("Multiple symbol tables encountered\n"));
10480 if (!get_symtab (filedata
, sec
, &aux
.symtab
, &aux
.nsyms
,
10481 &aux
.strtab
, &aux
.strtab_size
))
10484 else if (sec
->sh_type
== sec_type
)
10488 if (unwsec
== NULL
)
10489 printf (_("\nThere are no unwind sections in this file.\n"));
10491 for (i
= 0, sec
= filedata
->section_headers
; i
< filedata
->file_header
.e_shnum
; ++i
, ++sec
)
10493 if (sec
->sh_type
== sec_type
)
10495 unsigned long num_unwind
= sec
->sh_size
/ (2 * eh_addr_size
);
10496 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
10497 "contains %lu entry:\n",
10498 "\nUnwind section '%s' at offset 0x%lx "
10499 "contains %lu entries:\n",
10501 printable_section_name (filedata
, sec
),
10502 (unsigned long) sec
->sh_offset
,
10505 if (! dump_arm_unwind (filedata
, &aux
, sec
))
10511 free ((char *) aux
.strtab
);
10517 no_processor_specific_unwind (Filedata
* filedata ATTRIBUTE_UNUSED
)
10519 printf (_("No processor specific unwind information to decode\n"));
10524 process_unwind (Filedata
* filedata
)
10526 struct unwind_handler
10528 unsigned int machtype
;
10529 bool (* handler
)(Filedata
*);
10532 { EM_ARM
, arm_process_unwind
},
10533 { EM_IA_64
, ia64_process_unwind
},
10534 { EM_PARISC
, hppa_process_unwind
},
10535 { EM_TI_C6000
, arm_process_unwind
},
10536 { EM_386
, no_processor_specific_unwind
},
10537 { EM_X86_64
, no_processor_specific_unwind
},
10545 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
10546 if (filedata
->file_header
.e_machine
== handlers
[i
].machtype
)
10547 return handlers
[i
].handler (filedata
);
10549 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
10550 get_machine_name (filedata
->file_header
.e_machine
));
10555 dynamic_section_aarch64_val (Elf_Internal_Dyn
* entry
)
10557 switch (entry
->d_tag
)
10559 case DT_AARCH64_BTI_PLT
:
10560 case DT_AARCH64_PAC_PLT
:
10563 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
10570 dynamic_section_mips_val (Filedata
* filedata
, Elf_Internal_Dyn
* entry
)
10572 switch (entry
->d_tag
)
10574 case DT_MIPS_FLAGS
:
10575 if (entry
->d_un
.d_val
== 0)
10576 printf (_("NONE"));
10579 static const char * opts
[] =
10581 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
10582 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
10583 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
10584 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
10590 for (cnt
= 0; cnt
< ARRAY_SIZE (opts
); ++cnt
)
10591 if (entry
->d_un
.d_val
& (1 << cnt
))
10593 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
10599 case DT_MIPS_IVERSION
:
10600 if (valid_dynamic_name (filedata
, entry
->d_un
.d_val
))
10601 printf (_("Interface Version: %s"),
10602 get_dynamic_name (filedata
, entry
->d_un
.d_val
));
10606 sprintf_vma (buf
, entry
->d_un
.d_ptr
);
10607 /* Note: coded this way so that there is a single string for translation. */
10608 printf (_("<corrupt: %s>"), buf
);
10612 case DT_MIPS_TIME_STAMP
:
10616 time_t atime
= entry
->d_un
.d_val
;
10618 tmp
= gmtime (&atime
);
10619 /* PR 17531: file: 6accc532. */
10621 snprintf (timebuf
, sizeof (timebuf
), _("<corrupt>"));
10623 snprintf (timebuf
, sizeof (timebuf
), "%04u-%02u-%02uT%02u:%02u:%02u",
10624 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
10625 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
10626 printf (_("Time Stamp: %s"), timebuf
);
10630 case DT_MIPS_RLD_VERSION
:
10631 case DT_MIPS_LOCAL_GOTNO
:
10632 case DT_MIPS_CONFLICTNO
:
10633 case DT_MIPS_LIBLISTNO
:
10634 case DT_MIPS_SYMTABNO
:
10635 case DT_MIPS_UNREFEXTNO
:
10636 case DT_MIPS_HIPAGENO
:
10637 case DT_MIPS_DELTA_CLASS_NO
:
10638 case DT_MIPS_DELTA_INSTANCE_NO
:
10639 case DT_MIPS_DELTA_RELOC_NO
:
10640 case DT_MIPS_DELTA_SYM_NO
:
10641 case DT_MIPS_DELTA_CLASSSYM_NO
:
10642 case DT_MIPS_COMPACT_SIZE
:
10643 print_vma (entry
->d_un
.d_val
, DEC
);
10646 case DT_MIPS_XHASH
:
10647 filedata
->dynamic_info_DT_MIPS_XHASH
= entry
->d_un
.d_val
;
10648 filedata
->dynamic_info_DT_GNU_HASH
= entry
->d_un
.d_val
;
10649 /* Falls through. */
10652 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
10658 dynamic_section_parisc_val (Elf_Internal_Dyn
* entry
)
10660 switch (entry
->d_tag
)
10662 case DT_HP_DLD_FLAGS
:
10671 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
10672 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
10673 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
10674 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
10675 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
10676 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
10677 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
10678 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
10679 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
10680 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
10681 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" },
10682 { DT_HP_GST
, "HP_GST" },
10683 { DT_HP_SHLIB_FIXED
, "HP_SHLIB_FIXED" },
10684 { DT_HP_MERGE_SHLIB_SEG
, "HP_MERGE_SHLIB_SEG" },
10685 { DT_HP_NODELETE
, "HP_NODELETE" },
10686 { DT_HP_GROUP
, "HP_GROUP" },
10687 { DT_HP_PROTECT_LINKAGE_TABLE
, "HP_PROTECT_LINKAGE_TABLE" }
10691 bfd_vma val
= entry
->d_un
.d_val
;
10693 for (cnt
= 0; cnt
< ARRAY_SIZE (flags
); ++cnt
)
10694 if (val
& flags
[cnt
].bit
)
10698 fputs (flags
[cnt
].str
, stdout
);
10700 val
^= flags
[cnt
].bit
;
10703 if (val
!= 0 || first
)
10707 print_vma (val
, HEX
);
10713 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
10721 /* VMS vs Unix time offset and factor. */
10723 #define VMS_EPOCH_OFFSET 35067168000000000LL
10724 #define VMS_GRANULARITY_FACTOR 10000000
10726 #define INT64_MIN (-9223372036854775807LL - 1)
10729 /* Display a VMS time in a human readable format. */
10732 print_vms_time (int64_t vmstime
)
10734 struct tm
*tm
= NULL
;
10737 if (vmstime
>= INT64_MIN
+ VMS_EPOCH_OFFSET
)
10739 vmstime
= (vmstime
- VMS_EPOCH_OFFSET
) / VMS_GRANULARITY_FACTOR
;
10741 if (unxtime
== vmstime
)
10742 tm
= gmtime (&unxtime
);
10745 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
10746 tm
->tm_year
+ 1900, tm
->tm_mon
+ 1, tm
->tm_mday
,
10747 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
10752 dynamic_section_ia64_val (Elf_Internal_Dyn
* entry
)
10754 switch (entry
->d_tag
)
10756 case DT_IA_64_PLT_RESERVE
:
10757 /* First 3 slots reserved. */
10758 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
10760 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
10763 case DT_IA_64_VMS_LINKTIME
:
10765 print_vms_time (entry
->d_un
.d_val
);
10769 case DT_IA_64_VMS_LNKFLAGS
:
10770 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
10771 if (entry
->d_un
.d_val
& VMS_LF_CALL_DEBUG
)
10772 printf (" CALL_DEBUG");
10773 if (entry
->d_un
.d_val
& VMS_LF_NOP0BUFS
)
10774 printf (" NOP0BUFS");
10775 if (entry
->d_un
.d_val
& VMS_LF_P0IMAGE
)
10776 printf (" P0IMAGE");
10777 if (entry
->d_un
.d_val
& VMS_LF_MKTHREADS
)
10778 printf (" MKTHREADS");
10779 if (entry
->d_un
.d_val
& VMS_LF_UPCALLS
)
10780 printf (" UPCALLS");
10781 if (entry
->d_un
.d_val
& VMS_LF_IMGSTA
)
10782 printf (" IMGSTA");
10783 if (entry
->d_un
.d_val
& VMS_LF_INITIALIZE
)
10784 printf (" INITIALIZE");
10785 if (entry
->d_un
.d_val
& VMS_LF_MAIN
)
10787 if (entry
->d_un
.d_val
& VMS_LF_EXE_INIT
)
10788 printf (" EXE_INIT");
10789 if (entry
->d_un
.d_val
& VMS_LF_TBK_IN_IMG
)
10790 printf (" TBK_IN_IMG");
10791 if (entry
->d_un
.d_val
& VMS_LF_DBG_IN_IMG
)
10792 printf (" DBG_IN_IMG");
10793 if (entry
->d_un
.d_val
& VMS_LF_TBK_IN_DSF
)
10794 printf (" TBK_IN_DSF");
10795 if (entry
->d_un
.d_val
& VMS_LF_DBG_IN_DSF
)
10796 printf (" DBG_IN_DSF");
10797 if (entry
->d_un
.d_val
& VMS_LF_SIGNATURES
)
10798 printf (" SIGNATURES");
10799 if (entry
->d_un
.d_val
& VMS_LF_REL_SEG_OFF
)
10800 printf (" REL_SEG_OFF");
10804 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
10811 get_32bit_dynamic_section (Filedata
* filedata
)
10813 Elf32_External_Dyn
* edyn
;
10814 Elf32_External_Dyn
* ext
;
10815 Elf_Internal_Dyn
* entry
;
10817 edyn
= (Elf32_External_Dyn
*) get_data (NULL
, filedata
,
10818 filedata
->dynamic_addr
, 1,
10819 filedata
->dynamic_size
,
10820 _("dynamic section"));
10824 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
10825 might not have the luxury of section headers. Look for the DT_NULL
10826 terminator to determine the number of entries. */
10827 for (ext
= edyn
, filedata
->dynamic_nent
= 0;
10828 (char *) (ext
+ 1) <= (char *) edyn
+ filedata
->dynamic_size
;
10831 filedata
->dynamic_nent
++;
10832 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
10836 filedata
->dynamic_section
10837 = (Elf_Internal_Dyn
*) cmalloc (filedata
->dynamic_nent
, sizeof (* entry
));
10838 if (filedata
->dynamic_section
== NULL
)
10840 error (_("Out of memory allocating space for %lu dynamic entries\n"),
10841 (unsigned long) filedata
->dynamic_nent
);
10846 for (ext
= edyn
, entry
= filedata
->dynamic_section
;
10847 entry
< filedata
->dynamic_section
+ filedata
->dynamic_nent
;
10850 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
10851 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
10860 get_64bit_dynamic_section (Filedata
* filedata
)
10862 Elf64_External_Dyn
* edyn
;
10863 Elf64_External_Dyn
* ext
;
10864 Elf_Internal_Dyn
* entry
;
10866 /* Read in the data. */
10867 edyn
= (Elf64_External_Dyn
*) get_data (NULL
, filedata
,
10868 filedata
->dynamic_addr
, 1,
10869 filedata
->dynamic_size
,
10870 _("dynamic section"));
10874 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
10875 might not have the luxury of section headers. Look for the DT_NULL
10876 terminator to determine the number of entries. */
10877 for (ext
= edyn
, filedata
->dynamic_nent
= 0;
10878 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
10879 (char *) (ext
+ 1) <= (char *) edyn
+ filedata
->dynamic_size
;
10882 filedata
->dynamic_nent
++;
10883 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
10887 filedata
->dynamic_section
10888 = (Elf_Internal_Dyn
*) cmalloc (filedata
->dynamic_nent
, sizeof (* entry
));
10889 if (filedata
->dynamic_section
== NULL
)
10891 error (_("Out of memory allocating space for %lu dynamic entries\n"),
10892 (unsigned long) filedata
->dynamic_nent
);
10897 /* Convert from external to internal formats. */
10898 for (ext
= edyn
, entry
= filedata
->dynamic_section
;
10899 entry
< filedata
->dynamic_section
+ filedata
->dynamic_nent
;
10902 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
10903 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
10912 get_dynamic_section (Filedata
*filedata
)
10914 if (filedata
->dynamic_section
)
10918 return get_32bit_dynamic_section (filedata
);
10920 return get_64bit_dynamic_section (filedata
);
10924 print_dynamic_flags (bfd_vma flags
)
10932 flag
= flags
& - flags
;
10938 putc (' ', stdout
);
10942 case DF_ORIGIN
: fputs ("ORIGIN", stdout
); break;
10943 case DF_SYMBOLIC
: fputs ("SYMBOLIC", stdout
); break;
10944 case DF_TEXTREL
: fputs ("TEXTREL", stdout
); break;
10945 case DF_BIND_NOW
: fputs ("BIND_NOW", stdout
); break;
10946 case DF_STATIC_TLS
: fputs ("STATIC_TLS", stdout
); break;
10947 default: fputs (_("unknown"), stdout
); break;
10954 get_dynamic_data (Filedata
* filedata
, bfd_size_type number
, unsigned int ent_size
)
10956 unsigned char * e_data
;
10959 /* If the size_t type is smaller than the bfd_size_type, eg because
10960 you are building a 32-bit tool on a 64-bit host, then make sure
10961 that when (number) is cast to (size_t) no information is lost. */
10962 if (sizeof (size_t) < sizeof (bfd_size_type
)
10963 && (bfd_size_type
) ((size_t) number
) != number
)
10965 error (_("Size truncation prevents reading %s elements of size %u\n"),
10966 bfd_vmatoa ("u", number
), ent_size
);
10970 /* Be kind to memory checkers (eg valgrind, address sanitizer) by not
10971 attempting to allocate memory when the read is bound to fail. */
10972 if (ent_size
* number
> filedata
->file_size
)
10974 error (_("Invalid number of dynamic entries: %s\n"),
10975 bfd_vmatoa ("u", number
));
10979 e_data
= (unsigned char *) cmalloc ((size_t) number
, ent_size
);
10980 if (e_data
== NULL
)
10982 error (_("Out of memory reading %s dynamic entries\n"),
10983 bfd_vmatoa ("u", number
));
10987 if (fread (e_data
, ent_size
, (size_t) number
, filedata
->handle
) != number
)
10989 error (_("Unable to read in %s bytes of dynamic data\n"),
10990 bfd_vmatoa ("u", number
* ent_size
));
10995 i_data
= (bfd_vma
*) cmalloc ((size_t) number
, sizeof (*i_data
));
10996 if (i_data
== NULL
)
10998 error (_("Out of memory allocating space for %s dynamic entries\n"),
10999 bfd_vmatoa ("u", number
));
11005 i_data
[number
] = byte_get (e_data
+ number
* ent_size
, ent_size
);
11012 static unsigned long
11013 get_num_dynamic_syms (Filedata
* filedata
)
11015 unsigned long num_of_syms
= 0;
11017 if (!do_histogram
&& (!do_using_dynamic
|| do_dyn_syms
))
11018 return num_of_syms
;
11020 if (filedata
->dynamic_info
[DT_HASH
])
11022 unsigned char nb
[8];
11023 unsigned char nc
[8];
11024 unsigned int hash_ent_size
= 4;
11026 if ((filedata
->file_header
.e_machine
== EM_ALPHA
11027 || filedata
->file_header
.e_machine
== EM_S390
11028 || filedata
->file_header
.e_machine
== EM_S390_OLD
)
11029 && filedata
->file_header
.e_ident
[EI_CLASS
] == ELFCLASS64
)
11032 if (fseek (filedata
->handle
,
11033 (filedata
->archive_file_offset
11034 + offset_from_vma (filedata
, filedata
->dynamic_info
[DT_HASH
],
11035 sizeof nb
+ sizeof nc
)),
11038 error (_("Unable to seek to start of dynamic information\n"));
11042 if (fread (nb
, hash_ent_size
, 1, filedata
->handle
) != 1)
11044 error (_("Failed to read in number of buckets\n"));
11048 if (fread (nc
, hash_ent_size
, 1, filedata
->handle
) != 1)
11050 error (_("Failed to read in number of chains\n"));
11054 filedata
->nbuckets
= byte_get (nb
, hash_ent_size
);
11055 filedata
->nchains
= byte_get (nc
, hash_ent_size
);
11057 if (filedata
->nbuckets
!= 0 && filedata
->nchains
!= 0)
11059 filedata
->buckets
= get_dynamic_data (filedata
, filedata
->nbuckets
,
11061 filedata
->chains
= get_dynamic_data (filedata
, filedata
->nchains
,
11064 if (filedata
->buckets
!= NULL
&& filedata
->chains
!= NULL
)
11065 num_of_syms
= filedata
->nchains
;
11068 if (num_of_syms
== 0)
11070 free (filedata
->buckets
);
11071 filedata
->buckets
= NULL
;
11072 free (filedata
->chains
);
11073 filedata
->chains
= NULL
;
11074 filedata
->nbuckets
= 0;
11078 if (filedata
->dynamic_info_DT_GNU_HASH
)
11080 unsigned char nb
[16];
11081 bfd_vma i
, maxchain
= 0xffffffff, bitmaskwords
;
11082 bfd_vma buckets_vma
;
11085 if (fseek (filedata
->handle
,
11086 (filedata
->archive_file_offset
11087 + offset_from_vma (filedata
,
11088 filedata
->dynamic_info_DT_GNU_HASH
,
11092 error (_("Unable to seek to start of dynamic information\n"));
11096 if (fread (nb
, 16, 1, filedata
->handle
) != 1)
11098 error (_("Failed to read in number of buckets\n"));
11102 filedata
->ngnubuckets
= byte_get (nb
, 4);
11103 filedata
->gnusymidx
= byte_get (nb
+ 4, 4);
11104 bitmaskwords
= byte_get (nb
+ 8, 4);
11105 buckets_vma
= filedata
->dynamic_info_DT_GNU_HASH
+ 16;
11107 buckets_vma
+= bitmaskwords
* 4;
11109 buckets_vma
+= bitmaskwords
* 8;
11111 if (fseek (filedata
->handle
,
11112 (filedata
->archive_file_offset
11113 + offset_from_vma (filedata
, buckets_vma
, 4)),
11116 error (_("Unable to seek to start of dynamic information\n"));
11120 filedata
->gnubuckets
11121 = get_dynamic_data (filedata
, filedata
->ngnubuckets
, 4);
11123 if (filedata
->gnubuckets
== NULL
)
11126 for (i
= 0; i
< filedata
->ngnubuckets
; i
++)
11127 if (filedata
->gnubuckets
[i
] != 0)
11129 if (filedata
->gnubuckets
[i
] < filedata
->gnusymidx
)
11132 if (maxchain
== 0xffffffff || filedata
->gnubuckets
[i
] > maxchain
)
11133 maxchain
= filedata
->gnubuckets
[i
];
11136 if (maxchain
== 0xffffffff)
11139 maxchain
-= filedata
->gnusymidx
;
11141 if (fseek (filedata
->handle
,
11142 (filedata
->archive_file_offset
11143 + offset_from_vma (filedata
,
11144 buckets_vma
+ 4 * (filedata
->ngnubuckets
11149 error (_("Unable to seek to start of dynamic information\n"));
11155 if (fread (nb
, 4, 1, filedata
->handle
) != 1)
11157 error (_("Failed to determine last chain length\n"));
11161 if (maxchain
+ 1 == 0)
11166 while ((byte_get (nb
, 4) & 1) == 0);
11168 if (fseek (filedata
->handle
,
11169 (filedata
->archive_file_offset
11170 + offset_from_vma (filedata
, (buckets_vma
11171 + 4 * filedata
->ngnubuckets
),
11175 error (_("Unable to seek to start of dynamic information\n"));
11179 filedata
->gnuchains
= get_dynamic_data (filedata
, maxchain
, 4);
11180 filedata
->ngnuchains
= maxchain
;
11182 if (filedata
->gnuchains
== NULL
)
11185 if (filedata
->dynamic_info_DT_MIPS_XHASH
)
11187 if (fseek (filedata
->handle
,
11188 (filedata
->archive_file_offset
11189 + offset_from_vma (filedata
, (buckets_vma
11190 + 4 * (filedata
->ngnubuckets
11194 error (_("Unable to seek to start of dynamic information\n"));
11198 filedata
->mipsxlat
= get_dynamic_data (filedata
, maxchain
, 4);
11199 if (filedata
->mipsxlat
== NULL
)
11203 for (hn
= 0; hn
< filedata
->ngnubuckets
; ++hn
)
11204 if (filedata
->gnubuckets
[hn
] != 0)
11206 bfd_vma si
= filedata
->gnubuckets
[hn
];
11207 bfd_vma off
= si
- filedata
->gnusymidx
;
11211 if (filedata
->dynamic_info_DT_MIPS_XHASH
)
11213 if (off
< filedata
->ngnuchains
11214 && filedata
->mipsxlat
[off
] >= num_of_syms
)
11215 num_of_syms
= filedata
->mipsxlat
[off
] + 1;
11219 if (si
>= num_of_syms
)
11220 num_of_syms
= si
+ 1;
11224 while (off
< filedata
->ngnuchains
11225 && (filedata
->gnuchains
[off
++] & 1) == 0);
11228 if (num_of_syms
== 0)
11231 free (filedata
->mipsxlat
);
11232 filedata
->mipsxlat
= NULL
;
11233 free (filedata
->gnuchains
);
11234 filedata
->gnuchains
= NULL
;
11235 free (filedata
->gnubuckets
);
11236 filedata
->gnubuckets
= NULL
;
11237 filedata
->ngnubuckets
= 0;
11238 filedata
->ngnuchains
= 0;
11242 return num_of_syms
;
11245 /* Parse and display the contents of the dynamic section. */
11248 process_dynamic_section (Filedata
* filedata
)
11250 Elf_Internal_Dyn
* entry
;
11252 if (filedata
->dynamic_size
<= 1)
11256 if (filedata
->is_separate
)
11257 printf (_("\nThere is no dynamic section in linked file '%s'.\n"),
11258 filedata
->file_name
);
11260 printf (_("\nThere is no dynamic section in this file.\n"));
11266 if (!get_dynamic_section (filedata
))
11269 /* Find the appropriate symbol table. */
11270 if (filedata
->dynamic_symbols
== NULL
|| do_histogram
)
11272 unsigned long num_of_syms
;
11274 for (entry
= filedata
->dynamic_section
;
11275 entry
< filedata
->dynamic_section
+ filedata
->dynamic_nent
;
11277 if (entry
->d_tag
== DT_SYMTAB
)
11278 filedata
->dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
11279 else if (entry
->d_tag
== DT_SYMENT
)
11280 filedata
->dynamic_info
[DT_SYMENT
] = entry
->d_un
.d_val
;
11281 else if (entry
->d_tag
== DT_HASH
)
11282 filedata
->dynamic_info
[DT_HASH
] = entry
->d_un
.d_val
;
11283 else if (entry
->d_tag
== DT_GNU_HASH
)
11284 filedata
->dynamic_info_DT_GNU_HASH
= entry
->d_un
.d_val
;
11285 else if ((filedata
->file_header
.e_machine
== EM_MIPS
11286 || filedata
->file_header
.e_machine
== EM_MIPS_RS3_LE
)
11287 && entry
->d_tag
== DT_MIPS_XHASH
)
11289 filedata
->dynamic_info_DT_MIPS_XHASH
= entry
->d_un
.d_val
;
11290 filedata
->dynamic_info_DT_GNU_HASH
= entry
->d_un
.d_val
;
11293 num_of_syms
= get_num_dynamic_syms (filedata
);
11295 if (num_of_syms
!= 0
11296 && filedata
->dynamic_symbols
== NULL
11297 && filedata
->dynamic_info
[DT_SYMTAB
]
11298 && filedata
->dynamic_info
[DT_SYMENT
])
11300 Elf_Internal_Phdr
*seg
;
11301 bfd_vma vma
= filedata
->dynamic_info
[DT_SYMTAB
];
11303 if (! get_program_headers (filedata
))
11305 error (_("Cannot interpret virtual addresses "
11306 "without program headers.\n"));
11310 for (seg
= filedata
->program_headers
;
11311 seg
< filedata
->program_headers
+ filedata
->file_header
.e_phnum
;
11314 if (seg
->p_type
!= PT_LOAD
)
11317 if (seg
->p_offset
+ seg
->p_filesz
> filedata
->file_size
)
11319 /* See PR 21379 for a reproducer. */
11320 error (_("Invalid PT_LOAD entry\n"));
11324 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
11325 && vma
< seg
->p_vaddr
+ seg
->p_filesz
)
11327 /* Since we do not know how big the symbol table is,
11328 we default to reading in up to the end of PT_LOAD
11329 segment and processing that. This is overkill, I
11330 know, but it should work. */
11331 Elf_Internal_Shdr section
;
11332 section
.sh_offset
= (vma
- seg
->p_vaddr
11334 section
.sh_size
= (num_of_syms
11335 * filedata
->dynamic_info
[DT_SYMENT
]);
11336 section
.sh_entsize
= filedata
->dynamic_info
[DT_SYMENT
];
11339 && filedata
->dynamic_symtab_section
!= NULL
11340 && ((filedata
->dynamic_symtab_section
->sh_offset
11341 != section
.sh_offset
)
11342 || (filedata
->dynamic_symtab_section
->sh_size
11343 != section
.sh_size
)
11344 || (filedata
->dynamic_symtab_section
->sh_entsize
11345 != section
.sh_entsize
)))
11347 the .dynsym section doesn't match the DT_SYMTAB and DT_SYMENT tags\n"));
11349 section
.sh_name
= filedata
->string_table_length
;
11350 filedata
->dynamic_symbols
11351 = get_elf_symbols (filedata
, §ion
,
11352 &filedata
->num_dynamic_syms
);
11353 if (filedata
->dynamic_symbols
== NULL
11354 || filedata
->num_dynamic_syms
!= num_of_syms
)
11356 error (_("Corrupt DT_SYMTAB dynamic entry\n"));
11365 /* Similarly find a string table. */
11366 if (filedata
->dynamic_strings
== NULL
)
11367 for (entry
= filedata
->dynamic_section
;
11368 entry
< filedata
->dynamic_section
+ filedata
->dynamic_nent
;
11371 if (entry
->d_tag
== DT_STRTAB
)
11372 filedata
->dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
11374 if (entry
->d_tag
== DT_STRSZ
)
11375 filedata
->dynamic_info
[DT_STRSZ
] = entry
->d_un
.d_val
;
11377 if (filedata
->dynamic_info
[DT_STRTAB
]
11378 && filedata
->dynamic_info
[DT_STRSZ
])
11380 unsigned long offset
;
11381 bfd_size_type str_tab_len
= filedata
->dynamic_info
[DT_STRSZ
];
11383 offset
= offset_from_vma (filedata
,
11384 filedata
->dynamic_info
[DT_STRTAB
],
11387 && filedata
->dynamic_strtab_section
11388 && ((filedata
->dynamic_strtab_section
->sh_offset
11389 != (file_ptr
) offset
)
11390 || (filedata
->dynamic_strtab_section
->sh_size
11393 the .dynstr section doesn't match the DT_STRTAB and DT_STRSZ tags\n"));
11395 filedata
->dynamic_strings
11396 = (char *) get_data (NULL
, filedata
, offset
, 1, str_tab_len
,
11397 _("dynamic string table"));
11398 if (filedata
->dynamic_strings
== NULL
)
11400 error (_("Corrupt DT_STRTAB dynamic entry\n"));
11404 filedata
->dynamic_strings_length
= str_tab_len
;
11409 /* And find the syminfo section if available. */
11410 if (filedata
->dynamic_syminfo
== NULL
)
11412 unsigned long syminsz
= 0;
11414 for (entry
= filedata
->dynamic_section
;
11415 entry
< filedata
->dynamic_section
+ filedata
->dynamic_nent
;
11418 if (entry
->d_tag
== DT_SYMINENT
)
11420 /* Note: these braces are necessary to avoid a syntax
11421 error from the SunOS4 C compiler. */
11422 /* PR binutils/17531: A corrupt file can trigger this test.
11423 So do not use an assert, instead generate an error message. */
11424 if (sizeof (Elf_External_Syminfo
) != entry
->d_un
.d_val
)
11425 error (_("Bad value (%d) for SYMINENT entry\n"),
11426 (int) entry
->d_un
.d_val
);
11428 else if (entry
->d_tag
== DT_SYMINSZ
)
11429 syminsz
= entry
->d_un
.d_val
;
11430 else if (entry
->d_tag
== DT_SYMINFO
)
11431 filedata
->dynamic_syminfo_offset
11432 = offset_from_vma (filedata
, entry
->d_un
.d_val
, syminsz
);
11435 if (filedata
->dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
11437 Elf_External_Syminfo
* extsyminfo
;
11438 Elf_External_Syminfo
* extsym
;
11439 Elf_Internal_Syminfo
* syminfo
;
11441 /* There is a syminfo section. Read the data. */
11442 extsyminfo
= (Elf_External_Syminfo
*)
11443 get_data (NULL
, filedata
, filedata
->dynamic_syminfo_offset
,
11444 1, syminsz
, _("symbol information"));
11448 if (filedata
->dynamic_syminfo
!= NULL
)
11450 error (_("Multiple dynamic symbol information sections found\n"));
11451 free (filedata
->dynamic_syminfo
);
11453 filedata
->dynamic_syminfo
= (Elf_Internal_Syminfo
*) malloc (syminsz
);
11454 if (filedata
->dynamic_syminfo
== NULL
)
11456 error (_("Out of memory allocating %lu bytes "
11457 "for dynamic symbol info\n"),
11458 (unsigned long) syminsz
);
11462 filedata
->dynamic_syminfo_nent
11463 = syminsz
/ sizeof (Elf_External_Syminfo
);
11464 for (syminfo
= filedata
->dynamic_syminfo
, extsym
= extsyminfo
;
11465 syminfo
< (filedata
->dynamic_syminfo
11466 + filedata
->dynamic_syminfo_nent
);
11467 ++syminfo
, ++extsym
)
11469 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
11470 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
11477 if (do_dynamic
&& filedata
->dynamic_addr
)
11479 if (filedata
->is_separate
)
11480 printf (ngettext ("\nIn linked file '%s' the dynamic section at offset 0x%lx contains %lu entry:\n",
11481 "\nIn linked file '%s' the dynamic section at offset 0x%lx contains %lu entries:\n",
11482 (unsigned long) filedata
->dynamic_nent
),
11483 filedata
->file_name
,
11484 filedata
->dynamic_addr
,
11485 (unsigned long) filedata
->dynamic_nent
);
11487 printf (ngettext ("\nDynamic section at offset 0x%lx contains %lu entry:\n",
11488 "\nDynamic section at offset 0x%lx contains %lu entries:\n",
11489 (unsigned long) filedata
->dynamic_nent
),
11490 filedata
->dynamic_addr
,
11491 (unsigned long) filedata
->dynamic_nent
);
11494 printf (_(" Tag Type Name/Value\n"));
11496 for (entry
= filedata
->dynamic_section
;
11497 entry
< filedata
->dynamic_section
+ filedata
->dynamic_nent
;
11502 const char * dtype
;
11505 print_vma (entry
->d_tag
, FULL_HEX
);
11506 dtype
= get_dynamic_type (filedata
, entry
->d_tag
);
11507 printf (" (%s)%*s", dtype
,
11508 ((is_32bit_elf
? 27 : 19) - (int) strlen (dtype
)), " ");
11511 switch (entry
->d_tag
)
11515 print_dynamic_flags (entry
->d_un
.d_val
);
11525 switch (entry
->d_tag
)
11528 printf (_("Auxiliary library"));
11532 printf (_("Filter library"));
11536 printf (_("Configuration file"));
11540 printf (_("Dependency audit library"));
11544 printf (_("Audit library"));
11548 if (valid_dynamic_name (filedata
, entry
->d_un
.d_val
))
11549 printf (": [%s]\n",
11550 get_dynamic_name (filedata
, entry
->d_un
.d_val
));
11554 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
11563 printf (_("Flags:"));
11565 if (entry
->d_un
.d_val
== 0)
11566 printf (_(" None\n"));
11569 unsigned long int val
= entry
->d_un
.d_val
;
11571 if (val
& DTF_1_PARINIT
)
11573 printf (" PARINIT");
11574 val
^= DTF_1_PARINIT
;
11576 if (val
& DTF_1_CONFEXP
)
11578 printf (" CONFEXP");
11579 val
^= DTF_1_CONFEXP
;
11582 printf (" %lx", val
);
11591 printf (_("Flags:"));
11593 if (entry
->d_un
.d_val
== 0)
11594 printf (_(" None\n"));
11597 unsigned long int val
= entry
->d_un
.d_val
;
11599 if (val
& DF_P1_LAZYLOAD
)
11601 printf (" LAZYLOAD");
11602 val
^= DF_P1_LAZYLOAD
;
11604 if (val
& DF_P1_GROUPPERM
)
11606 printf (" GROUPPERM");
11607 val
^= DF_P1_GROUPPERM
;
11610 printf (" %lx", val
);
11619 printf (_("Flags:"));
11620 if (entry
->d_un
.d_val
== 0)
11621 printf (_(" None\n"));
11624 unsigned long int val
= entry
->d_un
.d_val
;
11626 if (val
& DF_1_NOW
)
11631 if (val
& DF_1_GLOBAL
)
11633 printf (" GLOBAL");
11634 val
^= DF_1_GLOBAL
;
11636 if (val
& DF_1_GROUP
)
11641 if (val
& DF_1_NODELETE
)
11643 printf (" NODELETE");
11644 val
^= DF_1_NODELETE
;
11646 if (val
& DF_1_LOADFLTR
)
11648 printf (" LOADFLTR");
11649 val
^= DF_1_LOADFLTR
;
11651 if (val
& DF_1_INITFIRST
)
11653 printf (" INITFIRST");
11654 val
^= DF_1_INITFIRST
;
11656 if (val
& DF_1_NOOPEN
)
11658 printf (" NOOPEN");
11659 val
^= DF_1_NOOPEN
;
11661 if (val
& DF_1_ORIGIN
)
11663 printf (" ORIGIN");
11664 val
^= DF_1_ORIGIN
;
11666 if (val
& DF_1_DIRECT
)
11668 printf (" DIRECT");
11669 val
^= DF_1_DIRECT
;
11671 if (val
& DF_1_TRANS
)
11676 if (val
& DF_1_INTERPOSE
)
11678 printf (" INTERPOSE");
11679 val
^= DF_1_INTERPOSE
;
11681 if (val
& DF_1_NODEFLIB
)
11683 printf (" NODEFLIB");
11684 val
^= DF_1_NODEFLIB
;
11686 if (val
& DF_1_NODUMP
)
11688 printf (" NODUMP");
11689 val
^= DF_1_NODUMP
;
11691 if (val
& DF_1_CONFALT
)
11693 printf (" CONFALT");
11694 val
^= DF_1_CONFALT
;
11696 if (val
& DF_1_ENDFILTEE
)
11698 printf (" ENDFILTEE");
11699 val
^= DF_1_ENDFILTEE
;
11701 if (val
& DF_1_DISPRELDNE
)
11703 printf (" DISPRELDNE");
11704 val
^= DF_1_DISPRELDNE
;
11706 if (val
& DF_1_DISPRELPND
)
11708 printf (" DISPRELPND");
11709 val
^= DF_1_DISPRELPND
;
11711 if (val
& DF_1_NODIRECT
)
11713 printf (" NODIRECT");
11714 val
^= DF_1_NODIRECT
;
11716 if (val
& DF_1_IGNMULDEF
)
11718 printf (" IGNMULDEF");
11719 val
^= DF_1_IGNMULDEF
;
11721 if (val
& DF_1_NOKSYMS
)
11723 printf (" NOKSYMS");
11724 val
^= DF_1_NOKSYMS
;
11726 if (val
& DF_1_NOHDR
)
11731 if (val
& DF_1_EDITED
)
11733 printf (" EDITED");
11734 val
^= DF_1_EDITED
;
11736 if (val
& DF_1_NORELOC
)
11738 printf (" NORELOC");
11739 val
^= DF_1_NORELOC
;
11741 if (val
& DF_1_SYMINTPOSE
)
11743 printf (" SYMINTPOSE");
11744 val
^= DF_1_SYMINTPOSE
;
11746 if (val
& DF_1_GLOBAUDIT
)
11748 printf (" GLOBAUDIT");
11749 val
^= DF_1_GLOBAUDIT
;
11751 if (val
& DF_1_SINGLETON
)
11753 printf (" SINGLETON");
11754 val
^= DF_1_SINGLETON
;
11756 if (val
& DF_1_STUB
)
11761 if (val
& DF_1_PIE
)
11766 if (val
& DF_1_KMOD
)
11771 if (val
& DF_1_WEAKFILTER
)
11773 printf (" WEAKFILTER");
11774 val
^= DF_1_WEAKFILTER
;
11776 if (val
& DF_1_NOCOMMON
)
11778 printf (" NOCOMMON");
11779 val
^= DF_1_NOCOMMON
;
11782 printf (" %lx", val
);
11789 filedata
->dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
11791 puts (get_dynamic_type (filedata
, entry
->d_un
.d_val
));
11812 filedata
->dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
11818 if (valid_dynamic_name (filedata
, entry
->d_un
.d_val
))
11819 name
= get_dynamic_name (filedata
, entry
->d_un
.d_val
);
11825 switch (entry
->d_tag
)
11828 printf (_("Shared library: [%s]"), name
);
11830 if (filedata
->program_interpreter
11831 && streq (name
, filedata
->program_interpreter
))
11832 printf (_(" program interpreter"));
11836 printf (_("Library soname: [%s]"), name
);
11840 printf (_("Library rpath: [%s]"), name
);
11844 printf (_("Library runpath: [%s]"), name
);
11848 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
11853 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
11868 filedata
->dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
11869 /* Fall through. */
11873 case DT_PREINIT_ARRAYSZ
:
11874 case DT_INIT_ARRAYSZ
:
11875 case DT_FINI_ARRAYSZ
:
11876 case DT_GNU_CONFLICTSZ
:
11877 case DT_GNU_LIBLISTSZ
:
11880 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
11881 printf (_(" (bytes)\n"));
11886 case DT_VERNEEDNUM
:
11891 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
11900 case DT_INIT_ARRAY
:
11901 case DT_FINI_ARRAY
:
11904 if (entry
->d_tag
== DT_USED
11905 && valid_dynamic_name (filedata
, entry
->d_un
.d_val
))
11908 = get_dynamic_name (filedata
, entry
->d_un
.d_val
);
11912 printf (_("Not needed object: [%s]\n"), name
);
11917 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
11923 /* The value of this entry is ignored. */
11928 case DT_GNU_PRELINKED
:
11932 time_t atime
= entry
->d_un
.d_val
;
11934 tmp
= gmtime (&atime
);
11935 /* PR 17533 file: 041-1244816-0.004. */
11937 printf (_("<corrupt time val: %lx"),
11938 (unsigned long) atime
);
11940 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
11941 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
11942 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
11948 filedata
->dynamic_info_DT_GNU_HASH
= entry
->d_un
.d_val
;
11951 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
11956 case DT_GNU_FLAGS_1
:
11959 printf (_("Flags:"));
11960 if (entry
->d_un
.d_val
== 0)
11961 printf (_(" None\n"));
11964 unsigned long int val
= entry
->d_un
.d_val
;
11966 if (val
& DF_GNU_1_UNIQUE
)
11968 printf (" UNIQUE");
11969 val
^= DF_GNU_1_UNIQUE
;
11972 printf (" %lx", val
);
11979 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
11980 filedata
->version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)]
11981 = entry
->d_un
.d_val
;
11985 switch (filedata
->file_header
.e_machine
)
11988 dynamic_section_aarch64_val (entry
);
11991 case EM_MIPS_RS3_LE
:
11992 dynamic_section_mips_val (filedata
, entry
);
11995 dynamic_section_parisc_val (entry
);
11998 dynamic_section_ia64_val (entry
);
12001 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
12013 get_ver_flags (unsigned int flags
)
12015 static char buff
[128];
12022 if (flags
& VER_FLG_BASE
)
12023 strcat (buff
, "BASE");
12025 if (flags
& VER_FLG_WEAK
)
12027 if (flags
& VER_FLG_BASE
)
12028 strcat (buff
, " | ");
12030 strcat (buff
, "WEAK");
12033 if (flags
& VER_FLG_INFO
)
12035 if (flags
& (VER_FLG_BASE
|VER_FLG_WEAK
))
12036 strcat (buff
, " | ");
12038 strcat (buff
, "INFO");
12041 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
| VER_FLG_INFO
))
12043 if (flags
& (VER_FLG_BASE
| VER_FLG_WEAK
| VER_FLG_INFO
))
12044 strcat (buff
, " | ");
12046 strcat (buff
, _("<unknown>"));
12052 /* Display the contents of the version sections. */
12055 process_version_sections (Filedata
* filedata
)
12057 Elf_Internal_Shdr
* section
;
12059 bool found
= false;
12064 for (i
= 0, section
= filedata
->section_headers
;
12065 i
< filedata
->file_header
.e_shnum
;
12068 switch (section
->sh_type
)
12070 case SHT_GNU_verdef
:
12072 Elf_External_Verdef
* edefs
;
12079 if (filedata
->is_separate
)
12080 printf (ngettext ("\nIn linked file '%s' the version definition section '%s' contains %u entry:\n",
12081 "\nIn linked file '%s' the version definition section '%s' contains %u entries:\n",
12083 filedata
->file_name
,
12084 printable_section_name (filedata
, section
),
12087 printf (ngettext ("\nVersion definition section '%s' "
12088 "contains %u entry:\n",
12089 "\nVersion definition section '%s' "
12090 "contains %u entries:\n",
12092 printable_section_name (filedata
, section
),
12095 printf (_(" Addr: 0x"));
12096 printf_vma (section
->sh_addr
);
12097 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
12098 (unsigned long) section
->sh_offset
, section
->sh_link
,
12099 printable_section_name_from_index (filedata
, section
->sh_link
));
12101 edefs
= (Elf_External_Verdef
*)
12102 get_data (NULL
, filedata
, section
->sh_offset
, 1,section
->sh_size
,
12103 _("version definition section"));
12106 endbuf
= (char *) edefs
+ section
->sh_size
;
12108 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
12111 Elf_External_Verdef
* edef
;
12112 Elf_Internal_Verdef ent
;
12113 Elf_External_Verdaux
* eaux
;
12114 Elf_Internal_Verdaux aux
;
12115 unsigned long isum
;
12118 vstart
= ((char *) edefs
) + idx
;
12119 if (vstart
+ sizeof (*edef
) > endbuf
)
12122 edef
= (Elf_External_Verdef
*) vstart
;
12124 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
12125 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
12126 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
12127 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
12128 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
12129 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
12130 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
12132 printf (_(" %#06lx: Rev: %d Flags: %s"),
12133 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
12135 printf (_(" Index: %d Cnt: %d "),
12136 ent
.vd_ndx
, ent
.vd_cnt
);
12138 /* Check for overflow. */
12139 if (ent
.vd_aux
> (size_t) (endbuf
- vstart
))
12142 vstart
+= ent
.vd_aux
;
12144 if (vstart
+ sizeof (*eaux
) > endbuf
)
12146 eaux
= (Elf_External_Verdaux
*) vstart
;
12148 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
12149 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
12151 if (valid_dynamic_name (filedata
, aux
.vda_name
))
12152 printf (_("Name: %s\n"),
12153 get_dynamic_name (filedata
, aux
.vda_name
));
12155 printf (_("Name index: %ld\n"), aux
.vda_name
);
12157 isum
= idx
+ ent
.vd_aux
;
12159 for (j
= 1; j
< ent
.vd_cnt
; j
++)
12161 if (aux
.vda_next
< sizeof (*eaux
)
12162 && !(j
== ent
.vd_cnt
- 1 && aux
.vda_next
== 0))
12164 warn (_("Invalid vda_next field of %lx\n"),
12169 /* Check for overflow. */
12170 if (aux
.vda_next
> (size_t) (endbuf
- vstart
))
12173 isum
+= aux
.vda_next
;
12174 vstart
+= aux
.vda_next
;
12176 if (vstart
+ sizeof (*eaux
) > endbuf
)
12178 eaux
= (Elf_External_Verdaux
*) vstart
;
12180 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
12181 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
12183 if (valid_dynamic_name (filedata
, aux
.vda_name
))
12184 printf (_(" %#06lx: Parent %d: %s\n"),
12186 get_dynamic_name (filedata
, aux
.vda_name
));
12188 printf (_(" %#06lx: Parent %d, name index: %ld\n"),
12189 isum
, j
, aux
.vda_name
);
12192 if (j
< ent
.vd_cnt
)
12193 printf (_(" Version def aux past end of section\n"));
12196 file: id:000001,src:000172+005151,op:splice,rep:2. */
12197 if (ent
.vd_next
< sizeof (*edef
)
12198 && !(cnt
== section
->sh_info
- 1 && ent
.vd_next
== 0))
12200 warn (_("Invalid vd_next field of %lx\n"), ent
.vd_next
);
12201 cnt
= section
->sh_info
;
12204 if (ent
.vd_next
> (size_t) (endbuf
- ((char *) edefs
+ idx
)))
12207 idx
+= ent
.vd_next
;
12210 if (cnt
< section
->sh_info
)
12211 printf (_(" Version definition past end of section\n"));
12217 case SHT_GNU_verneed
:
12219 Elf_External_Verneed
* eneed
;
12226 if (filedata
->is_separate
)
12227 printf (ngettext ("\nIn linked file '%s' the version needs section '%s' contains %u entry:\n",
12228 "\nIn linked file '%s' the version needs section '%s' contains %u entries:\n",
12230 filedata
->file_name
,
12231 printable_section_name (filedata
, section
),
12234 printf (ngettext ("\nVersion needs section '%s' "
12235 "contains %u entry:\n",
12236 "\nVersion needs section '%s' "
12237 "contains %u entries:\n",
12239 printable_section_name (filedata
, section
),
12242 printf (_(" Addr: 0x"));
12243 printf_vma (section
->sh_addr
);
12244 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
12245 (unsigned long) section
->sh_offset
, section
->sh_link
,
12246 printable_section_name_from_index (filedata
, section
->sh_link
));
12248 eneed
= (Elf_External_Verneed
*) get_data (NULL
, filedata
,
12249 section
->sh_offset
, 1,
12251 _("Version Needs section"));
12254 endbuf
= (char *) eneed
+ section
->sh_size
;
12256 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
12258 Elf_External_Verneed
* entry
;
12259 Elf_Internal_Verneed ent
;
12260 unsigned long isum
;
12264 vstart
= ((char *) eneed
) + idx
;
12265 if (vstart
+ sizeof (*entry
) > endbuf
)
12268 entry
= (Elf_External_Verneed
*) vstart
;
12270 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
12271 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
12272 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
12273 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
12274 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
12276 printf (_(" %#06lx: Version: %d"), idx
, ent
.vn_version
);
12278 if (valid_dynamic_name (filedata
, ent
.vn_file
))
12279 printf (_(" File: %s"),
12280 get_dynamic_name (filedata
, ent
.vn_file
));
12282 printf (_(" File: %lx"), ent
.vn_file
);
12284 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
12286 /* Check for overflow. */
12287 if (ent
.vn_aux
> (size_t) (endbuf
- vstart
))
12289 vstart
+= ent
.vn_aux
;
12291 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
12293 Elf_External_Vernaux
* eaux
;
12294 Elf_Internal_Vernaux aux
;
12296 if (vstart
+ sizeof (*eaux
) > endbuf
)
12298 eaux
= (Elf_External_Vernaux
*) vstart
;
12300 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
12301 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
12302 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
12303 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
12304 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
12306 if (valid_dynamic_name (filedata
, aux
.vna_name
))
12307 printf (_(" %#06lx: Name: %s"),
12308 isum
, get_dynamic_name (filedata
, aux
.vna_name
));
12310 printf (_(" %#06lx: Name index: %lx"),
12311 isum
, aux
.vna_name
);
12313 printf (_(" Flags: %s Version: %d\n"),
12314 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
12316 if (aux
.vna_next
< sizeof (*eaux
)
12317 && !(j
== ent
.vn_cnt
- 1 && aux
.vna_next
== 0))
12319 warn (_("Invalid vna_next field of %lx\n"),
12324 /* Check for overflow. */
12325 if (aux
.vna_next
> (size_t) (endbuf
- vstart
))
12327 isum
+= aux
.vna_next
;
12328 vstart
+= aux
.vna_next
;
12331 if (j
< ent
.vn_cnt
)
12332 warn (_("Missing Version Needs auxiliary information\n"));
12334 if (ent
.vn_next
< sizeof (*entry
)
12335 && !(cnt
== section
->sh_info
- 1 && ent
.vn_next
== 0))
12337 warn (_("Invalid vn_next field of %lx\n"), ent
.vn_next
);
12338 cnt
= section
->sh_info
;
12341 if (ent
.vn_next
> (size_t) (endbuf
- ((char *) eneed
+ idx
)))
12343 idx
+= ent
.vn_next
;
12346 if (cnt
< section
->sh_info
)
12347 warn (_("Missing Version Needs information\n"));
12353 case SHT_GNU_versym
:
12355 Elf_Internal_Shdr
* link_section
;
12358 unsigned char * edata
;
12359 unsigned short * data
;
12361 Elf_Internal_Sym
* symbols
;
12362 Elf_Internal_Shdr
* string_sec
;
12363 unsigned long num_syms
;
12366 if (section
->sh_link
>= filedata
->file_header
.e_shnum
)
12369 link_section
= filedata
->section_headers
+ section
->sh_link
;
12370 total
= section
->sh_size
/ sizeof (Elf_External_Versym
);
12372 if (link_section
->sh_link
>= filedata
->file_header
.e_shnum
)
12377 symbols
= get_elf_symbols (filedata
, link_section
, & num_syms
);
12378 if (symbols
== NULL
)
12381 string_sec
= filedata
->section_headers
+ link_section
->sh_link
;
12383 strtab
= (char *) get_data (NULL
, filedata
, string_sec
->sh_offset
, 1,
12384 string_sec
->sh_size
,
12385 _("version string table"));
12392 if (filedata
->is_separate
)
12393 printf (ngettext ("\nIn linked file '%s' the version symbols section '%s' contains %lu entry:\n",
12394 "\nIn linked file '%s' the version symbols section '%s' contains %lu entries:\n",
12396 filedata
->file_name
,
12397 printable_section_name (filedata
, section
),
12398 (unsigned long) total
);
12400 printf (ngettext ("\nVersion symbols section '%s' "
12401 "contains %lu entry:\n",
12402 "\nVersion symbols section '%s' "
12403 "contains %lu entries:\n",
12405 printable_section_name (filedata
, section
),
12406 (unsigned long) total
);
12408 printf (_(" Addr: 0x"));
12409 printf_vma (section
->sh_addr
);
12410 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
12411 (unsigned long) section
->sh_offset
, section
->sh_link
,
12412 printable_section_name (filedata
, link_section
));
12414 off
= offset_from_vma (filedata
,
12415 filedata
->version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
12416 total
* sizeof (short));
12417 edata
= (unsigned char *) get_data (NULL
, filedata
, off
,
12418 sizeof (short), total
,
12419 _("version symbol data"));
12427 data
= (short unsigned int *) cmalloc (total
, sizeof (short));
12429 for (cnt
= total
; cnt
--;)
12430 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
12435 for (cnt
= 0; cnt
< total
; cnt
+= 4)
12439 char *invalid
= _("*invalid*");
12441 printf (" %03x:", cnt
);
12443 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
12444 switch (data
[cnt
+ j
])
12447 fputs (_(" 0 (*local*) "), stdout
);
12451 fputs (_(" 1 (*global*) "), stdout
);
12455 nn
= printf ("%4x%c", data
[cnt
+ j
] & VERSYM_VERSION
,
12456 data
[cnt
+ j
] & VERSYM_HIDDEN
? 'h' : ' ');
12458 /* If this index value is greater than the size of the symbols
12459 array, break to avoid an out-of-bounds read. */
12460 if ((unsigned long)(cnt
+ j
) >= num_syms
)
12462 warn (_("invalid index into symbol array\n"));
12467 if (filedata
->version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
12469 Elf_Internal_Verneed ivn
;
12470 unsigned long offset
;
12472 offset
= offset_from_vma
12474 filedata
->version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
12475 sizeof (Elf_External_Verneed
));
12479 Elf_Internal_Vernaux ivna
;
12480 Elf_External_Verneed evn
;
12481 Elf_External_Vernaux evna
;
12482 unsigned long a_off
;
12484 if (get_data (&evn
, filedata
, offset
, sizeof (evn
), 1,
12485 _("version need")) == NULL
)
12488 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
12489 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
12491 a_off
= offset
+ ivn
.vn_aux
;
12495 if (get_data (&evna
, filedata
, a_off
, sizeof (evna
),
12496 1, _("version need aux (2)")) == NULL
)
12499 ivna
.vna_other
= 0;
12503 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
12504 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
12507 a_off
+= ivna
.vna_next
;
12509 while (ivna
.vna_other
!= data
[cnt
+ j
]
12510 && ivna
.vna_next
!= 0);
12512 if (ivna
.vna_other
== data
[cnt
+ j
])
12514 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
12516 if (ivna
.vna_name
>= string_sec
->sh_size
)
12519 name
= strtab
+ ivna
.vna_name
;
12523 offset
+= ivn
.vn_next
;
12525 while (ivn
.vn_next
);
12528 if (data
[cnt
+ j
] != 0x8001
12529 && filedata
->version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
12531 Elf_Internal_Verdef ivd
;
12532 Elf_External_Verdef evd
;
12533 unsigned long offset
;
12535 offset
= offset_from_vma
12537 filedata
->version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
12542 if (get_data (&evd
, filedata
, offset
, sizeof (evd
), 1,
12543 _("version def")) == NULL
)
12546 /* PR 17531: file: 046-1082287-0.004. */
12547 ivd
.vd_ndx
= (data
[cnt
+ j
] & VERSYM_VERSION
) + 1;
12552 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
12553 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
12556 offset
+= ivd
.vd_next
;
12558 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & VERSYM_VERSION
)
12559 && ivd
.vd_next
!= 0);
12561 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & VERSYM_VERSION
))
12563 Elf_External_Verdaux evda
;
12564 Elf_Internal_Verdaux ivda
;
12566 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
12568 if (get_data (&evda
, filedata
,
12569 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
12571 _("version def aux")) == NULL
)
12574 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
12576 if (ivda
.vda_name
>= string_sec
->sh_size
)
12578 else if (name
!= NULL
&& name
!= invalid
)
12579 name
= _("*both*");
12581 name
= strtab
+ ivda
.vda_name
;
12585 nn
+= printf ("(%s%-*s",
12587 12 - (int) strlen (name
),
12591 printf ("%*c", 18 - nn
, ' ');
12610 if (filedata
->is_separate
)
12611 printf (_("\nNo version information found in linked file '%s'.\n"),
12612 filedata
->file_name
);
12614 printf (_("\nNo version information found in this file.\n"));
12620 static const char *
12621 get_symbol_binding (Filedata
* filedata
, unsigned int binding
)
12623 static char buff
[64];
12627 case STB_LOCAL
: return "LOCAL";
12628 case STB_GLOBAL
: return "GLOBAL";
12629 case STB_WEAK
: return "WEAK";
12631 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
12632 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"),
12634 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
12636 if (binding
== STB_GNU_UNIQUE
12637 && filedata
->file_header
.e_ident
[EI_OSABI
] == ELFOSABI_GNU
)
12639 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), binding
);
12642 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), binding
);
12647 static const char *
12648 get_symbol_type (Filedata
* filedata
, unsigned int type
)
12650 static char buff
[64];
12654 case STT_NOTYPE
: return "NOTYPE";
12655 case STT_OBJECT
: return "OBJECT";
12656 case STT_FUNC
: return "FUNC";
12657 case STT_SECTION
: return "SECTION";
12658 case STT_FILE
: return "FILE";
12659 case STT_COMMON
: return "COMMON";
12660 case STT_TLS
: return "TLS";
12661 case STT_RELC
: return "RELC";
12662 case STT_SRELC
: return "SRELC";
12664 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
12666 if (filedata
->file_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
12667 return "THUMB_FUNC";
12669 if (filedata
->file_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
12672 if (filedata
->file_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
12673 return "PARISC_MILLI";
12675 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"), type
);
12677 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
12679 if (filedata
->file_header
.e_machine
== EM_PARISC
)
12681 if (type
== STT_HP_OPAQUE
)
12682 return "HP_OPAQUE";
12683 if (type
== STT_HP_STUB
)
12687 if (type
== STT_GNU_IFUNC
12688 && (filedata
->file_header
.e_ident
[EI_OSABI
] == ELFOSABI_GNU
12689 || filedata
->file_header
.e_ident
[EI_OSABI
] == ELFOSABI_FREEBSD
))
12692 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), type
);
12695 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), type
);
12700 static const char *
12701 get_symbol_visibility (unsigned int visibility
)
12703 switch (visibility
)
12705 case STV_DEFAULT
: return "DEFAULT";
12706 case STV_INTERNAL
: return "INTERNAL";
12707 case STV_HIDDEN
: return "HIDDEN";
12708 case STV_PROTECTED
: return "PROTECTED";
12710 error (_("Unrecognized visibility value: %u\n"), visibility
);
12711 return _("<unknown>");
12715 static const char *
12716 get_alpha_symbol_other (unsigned int other
)
12720 case STO_ALPHA_NOPV
: return "NOPV";
12721 case STO_ALPHA_STD_GPLOAD
: return "STD GPLOAD";
12723 error (_("Unrecognized alpha specific other value: %u\n"), other
);
12724 return _("<unknown>");
12728 static const char *
12729 get_solaris_symbol_visibility (unsigned int visibility
)
12731 switch (visibility
)
12733 case 4: return "EXPORTED";
12734 case 5: return "SINGLETON";
12735 case 6: return "ELIMINATE";
12736 default: return get_symbol_visibility (visibility
);
12740 static const char *
12741 get_aarch64_symbol_other (unsigned int other
)
12743 static char buf
[32];
12745 if (other
& STO_AARCH64_VARIANT_PCS
)
12747 other
&= ~STO_AARCH64_VARIANT_PCS
;
12749 return "VARIANT_PCS";
12750 snprintf (buf
, sizeof buf
, "VARIANT_PCS | %x", other
);
12756 static const char *
12757 get_mips_symbol_other (unsigned int other
)
12761 case STO_OPTIONAL
: return "OPTIONAL";
12762 case STO_MIPS_PLT
: return "MIPS PLT";
12763 case STO_MIPS_PIC
: return "MIPS PIC";
12764 case STO_MICROMIPS
: return "MICROMIPS";
12765 case STO_MICROMIPS
| STO_MIPS_PIC
: return "MICROMIPS, MIPS PIC";
12766 case STO_MIPS16
: return "MIPS16";
12767 default: return NULL
;
12771 static const char *
12772 get_ia64_symbol_other (Filedata
* filedata
, unsigned int other
)
12774 if (is_ia64_vms (filedata
))
12776 static char res
[32];
12780 /* Function types is for images and .STB files only. */
12781 switch (filedata
->file_header
.e_type
)
12785 switch (VMS_ST_FUNC_TYPE (other
))
12787 case VMS_SFT_CODE_ADDR
:
12788 strcat (res
, " CA");
12790 case VMS_SFT_SYMV_IDX
:
12791 strcat (res
, " VEC");
12794 strcat (res
, " FD");
12796 case VMS_SFT_RESERVE
:
12797 strcat (res
, " RSV");
12800 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
12801 VMS_ST_FUNC_TYPE (other
));
12802 strcat (res
, " <unknown>");
12809 switch (VMS_ST_LINKAGE (other
))
12811 case VMS_STL_IGNORE
:
12812 strcat (res
, " IGN");
12814 case VMS_STL_RESERVE
:
12815 strcat (res
, " RSV");
12818 strcat (res
, " STD");
12821 strcat (res
, " LNK");
12824 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
12825 VMS_ST_LINKAGE (other
));
12826 strcat (res
, " <unknown>");
12838 static const char *
12839 get_ppc64_symbol_other (unsigned int other
)
12841 if ((other
& ~STO_PPC64_LOCAL_MASK
) != 0)
12844 other
>>= STO_PPC64_LOCAL_BIT
;
12847 static char buf
[64];
12849 other
= ppc64_decode_local_entry (other
);
12850 snprintf (buf
, sizeof buf
, _("<localentry>: %d"), other
);
12856 static const char *
12857 get_riscv_symbol_other (unsigned int other
)
12859 static char buf
[32];
12862 if (other
& STO_RISCV_VARIANT_CC
)
12864 strcat (buf
, _(" VARIANT_CC"));
12865 other
&= ~STO_RISCV_VARIANT_CC
;
12869 snprintf (buf
, sizeof buf
, " %x", other
);
12878 static const char *
12879 get_symbol_other (Filedata
* filedata
, unsigned int other
)
12881 const char * result
= NULL
;
12882 static char buff
[64];
12887 switch (filedata
->file_header
.e_machine
)
12890 result
= get_alpha_symbol_other (other
);
12893 result
= get_aarch64_symbol_other (other
);
12896 result
= get_mips_symbol_other (other
);
12899 result
= get_ia64_symbol_other (filedata
, other
);
12902 result
= get_ppc64_symbol_other (other
);
12905 result
= get_riscv_symbol_other (other
);
12915 snprintf (buff
, sizeof buff
, _("<other>: %x"), other
);
12919 static const char *
12920 get_symbol_index_type (Filedata
* filedata
, unsigned int type
)
12922 static char buff
[32];
12926 case SHN_UNDEF
: return "UND";
12927 case SHN_ABS
: return "ABS";
12928 case SHN_COMMON
: return "COM";
12930 if (type
== SHN_IA_64_ANSI_COMMON
12931 && filedata
->file_header
.e_machine
== EM_IA_64
12932 && filedata
->file_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
12934 else if ((filedata
->file_header
.e_machine
== EM_X86_64
12935 || filedata
->file_header
.e_machine
== EM_L1OM
12936 || filedata
->file_header
.e_machine
== EM_K1OM
)
12937 && type
== SHN_X86_64_LCOMMON
)
12938 return "LARGE_COM";
12939 else if ((type
== SHN_MIPS_SCOMMON
12940 && filedata
->file_header
.e_machine
== EM_MIPS
)
12941 || (type
== SHN_TIC6X_SCOMMON
12942 && filedata
->file_header
.e_machine
== EM_TI_C6000
))
12944 else if (type
== SHN_MIPS_SUNDEFINED
12945 && filedata
->file_header
.e_machine
== EM_MIPS
)
12947 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
12948 sprintf (buff
, "PRC[0x%04x]", type
& 0xffff);
12949 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
12950 sprintf (buff
, "OS [0x%04x]", type
& 0xffff);
12951 else if (type
>= SHN_LORESERVE
)
12952 sprintf (buff
, "RSV[0x%04x]", type
& 0xffff);
12953 else if (filedata
->file_header
.e_shnum
!= 0
12954 && type
>= filedata
->file_header
.e_shnum
)
12955 sprintf (buff
, _("bad section index[%3d]"), type
);
12957 sprintf (buff
, "%3d", type
);
12964 static const char *
12965 get_symbol_version_string (Filedata
* filedata
,
12967 const char * strtab
,
12968 unsigned long int strtab_size
,
12970 Elf_Internal_Sym
* psym
,
12971 enum versioned_symbol_info
* sym_info
,
12972 unsigned short * vna_other
)
12974 unsigned char data
[2];
12975 unsigned short vers_data
;
12976 unsigned long offset
;
12977 unsigned short max_vd_ndx
;
12980 || filedata
->version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] == 0)
12983 offset
= offset_from_vma (filedata
,
12984 filedata
->version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
12985 sizeof data
+ si
* sizeof (vers_data
));
12987 if (get_data (&data
, filedata
, offset
+ si
* sizeof (vers_data
),
12988 sizeof (data
), 1, _("version data")) == NULL
)
12991 vers_data
= byte_get (data
, 2);
12993 if ((vers_data
& VERSYM_HIDDEN
) == 0 && vers_data
== 0)
12996 *sym_info
= (vers_data
& VERSYM_HIDDEN
) != 0 ? symbol_hidden
: symbol_public
;
12999 /* Usually we'd only see verdef for defined symbols, and verneed for
13000 undefined symbols. However, symbols defined by the linker in
13001 .dynbss for variables copied from a shared library in order to
13002 avoid text relocations are defined yet have verneed. We could
13003 use a heuristic to detect the special case, for example, check
13004 for verneed first on symbols defined in SHT_NOBITS sections, but
13005 it is simpler and more reliable to just look for both verdef and
13006 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
13008 if (psym
->st_shndx
!= SHN_UNDEF
13009 && vers_data
!= 0x8001
13010 && filedata
->version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
13012 Elf_Internal_Verdef ivd
;
13013 Elf_Internal_Verdaux ivda
;
13014 Elf_External_Verdaux evda
;
13017 off
= offset_from_vma (filedata
,
13018 filedata
->version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
13019 sizeof (Elf_External_Verdef
));
13023 Elf_External_Verdef evd
;
13025 if (get_data (&evd
, filedata
, off
, sizeof (evd
), 1,
13026 _("version def")) == NULL
)
13035 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
13036 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
13037 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
13038 ivd
.vd_flags
= BYTE_GET (evd
.vd_flags
);
13041 if ((ivd
.vd_ndx
& VERSYM_VERSION
) > max_vd_ndx
)
13042 max_vd_ndx
= ivd
.vd_ndx
& VERSYM_VERSION
;
13044 off
+= ivd
.vd_next
;
13046 while (ivd
.vd_ndx
!= (vers_data
& VERSYM_VERSION
) && ivd
.vd_next
!= 0);
13048 if (ivd
.vd_ndx
== (vers_data
& VERSYM_VERSION
))
13050 if (ivd
.vd_ndx
== 1 && ivd
.vd_flags
== VER_FLG_BASE
)
13053 off
-= ivd
.vd_next
;
13056 if (get_data (&evda
, filedata
, off
, sizeof (evda
), 1,
13057 _("version def aux")) != NULL
)
13059 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
13061 if (psym
->st_name
!= ivda
.vda_name
)
13062 return (ivda
.vda_name
< strtab_size
13063 ? strtab
+ ivda
.vda_name
: _("<corrupt>"));
13068 if (filedata
->version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
13070 Elf_External_Verneed evn
;
13071 Elf_Internal_Verneed ivn
;
13072 Elf_Internal_Vernaux ivna
;
13074 offset
= offset_from_vma (filedata
,
13075 filedata
->version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
13079 unsigned long vna_off
;
13081 if (get_data (&evn
, filedata
, offset
, sizeof (evn
), 1,
13082 _("version need")) == NULL
)
13085 ivna
.vna_other
= 0;
13090 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
13091 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
13093 vna_off
= offset
+ ivn
.vn_aux
;
13097 Elf_External_Vernaux evna
;
13099 if (get_data (&evna
, filedata
, vna_off
, sizeof (evna
), 1,
13100 _("version need aux (3)")) == NULL
)
13103 ivna
.vna_other
= 0;
13108 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
13109 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
13110 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
13113 vna_off
+= ivna
.vna_next
;
13115 while (ivna
.vna_other
!= vers_data
&& ivna
.vna_next
!= 0);
13117 if (ivna
.vna_other
== vers_data
)
13120 offset
+= ivn
.vn_next
;
13122 while (ivn
.vn_next
!= 0);
13124 if (ivna
.vna_other
== vers_data
)
13126 *sym_info
= symbol_undefined
;
13127 *vna_other
= ivna
.vna_other
;
13128 return (ivna
.vna_name
< strtab_size
13129 ? strtab
+ ivna
.vna_name
: _("<corrupt>"));
13131 else if ((max_vd_ndx
|| (vers_data
& VERSYM_VERSION
) != 1)
13132 && (vers_data
& VERSYM_VERSION
) > max_vd_ndx
)
13133 return _("<corrupt>");
13138 /* Display a symbol size on stdout. Format is based on --sym-base setting. */
13140 static unsigned int
13141 print_dynamic_symbol_size (bfd_vma vma
, int base
)
13146 return print_vma (vma
, OCTAL_5
);
13149 return print_vma (vma
, UNSIGNED_5
);
13152 return print_vma (vma
, PREFIX_HEX_5
);
13156 return print_vma (vma
, DEC_5
);
13161 print_dynamic_symbol (Filedata
*filedata
, unsigned long si
,
13162 Elf_Internal_Sym
*symtab
,
13163 Elf_Internal_Shdr
*section
,
13164 char *strtab
, size_t strtab_size
)
13166 const char *version_string
;
13167 enum versioned_symbol_info sym_info
;
13168 unsigned short vna_other
;
13171 Elf_Internal_Sym
*psym
= symtab
+ si
;
13173 printf ("%6ld: ", si
);
13174 print_vma (psym
->st_value
, LONG_HEX
);
13176 print_dynamic_symbol_size (psym
->st_size
, sym_base
);
13177 printf (" %-7s", get_symbol_type (filedata
, ELF_ST_TYPE (psym
->st_info
)));
13178 printf (" %-6s", get_symbol_binding (filedata
, ELF_ST_BIND (psym
->st_info
)));
13179 if (filedata
->file_header
.e_ident
[EI_OSABI
] == ELFOSABI_SOLARIS
)
13180 printf (" %-7s", get_solaris_symbol_visibility (psym
->st_other
));
13183 unsigned int vis
= ELF_ST_VISIBILITY (psym
->st_other
);
13185 printf (" %-7s", get_symbol_visibility (vis
));
13186 /* Check to see if any other bits in the st_other field are set.
13187 Note - displaying this information disrupts the layout of the
13188 table being generated, but for the moment this case is very rare. */
13189 if (psym
->st_other
^ vis
)
13190 printf (" [%s] ", get_symbol_other (filedata
, psym
->st_other
^ vis
));
13192 printf (" %4s ", get_symbol_index_type (filedata
, psym
->st_shndx
));
13194 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
13195 && psym
->st_shndx
< filedata
->file_header
.e_shnum
13196 && filedata
->section_headers
!= NULL
13197 && psym
->st_name
== 0)
13200 = section_name_valid (filedata
,
13201 filedata
->section_headers
+ psym
->st_shndx
);
13203 section_name_print (filedata
,
13204 filedata
->section_headers
+ psym
->st_shndx
)
13209 is_valid
= valid_symbol_name (strtab
, strtab_size
, psym
->st_name
);
13210 sstr
= is_valid
? strtab
+ psym
->st_name
: _("<corrupt>");
13214 = get_symbol_version_string (filedata
,
13216 || section
->sh_type
== SHT_DYNSYM
),
13217 strtab
, strtab_size
, si
,
13218 psym
, &sym_info
, &vna_other
);
13220 int len_avail
= 21;
13221 if (! do_wide
&& version_string
!= NULL
)
13225 len_avail
-= 1 + strlen (version_string
);
13227 if (sym_info
== symbol_undefined
)
13228 len_avail
-= sprintf (buffer
," (%d)", vna_other
);
13229 else if (sym_info
!= symbol_hidden
)
13233 print_symbol (len_avail
, sstr
);
13235 if (version_string
)
13237 if (sym_info
== symbol_undefined
)
13238 printf ("@%s (%d)", version_string
, vna_other
);
13240 printf (sym_info
== symbol_hidden
? "@%s" : "@@%s",
13246 if (ELF_ST_BIND (psym
->st_info
) == STB_LOCAL
13248 && si
>= section
->sh_info
13249 /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */
13250 && filedata
->file_header
.e_machine
!= EM_MIPS
13251 /* Solaris binaries have been found to violate this requirement as
13252 well. Not sure if this is a bug or an ABI requirement. */
13253 && filedata
->file_header
.e_ident
[EI_OSABI
] != ELFOSABI_SOLARIS
)
13254 warn (_("local symbol %lu found at index >= %s's sh_info value of %u\n"),
13255 si
, printable_section_name (filedata
, section
), section
->sh_info
);
13258 static const char *
13259 get_lto_kind (unsigned int kind
)
13263 case 0: return "DEF";
13264 case 1: return "WEAKDEF";
13265 case 2: return "UNDEF";
13266 case 3: return "WEAKUNDEF";
13267 case 4: return "COMMON";
13272 static char buffer
[30];
13273 error (_("Unknown LTO symbol definition encountered: %u\n"), kind
);
13274 sprintf (buffer
, "<unknown: %u>", kind
);
13278 static const char *
13279 get_lto_visibility (unsigned int visibility
)
13281 switch (visibility
)
13283 case 0: return "DEFAULT";
13284 case 1: return "PROTECTED";
13285 case 2: return "INTERNAL";
13286 case 3: return "HIDDEN";
13291 static char buffer
[30];
13292 error (_("Unknown LTO symbol visibility encountered: %u\n"), visibility
);
13293 sprintf (buffer
, "<unknown: %u>", visibility
);
13297 static const char *
13298 get_lto_sym_type (unsigned int sym_type
)
13302 case 0: return "UNKNOWN";
13303 case 1: return "FUNCTION";
13304 case 2: return "VARIABLE";
13309 static char buffer
[30];
13310 error (_("Unknown LTO symbol type encountered: %u\n"), sym_type
);
13311 sprintf (buffer
, "<unknown: %u>", sym_type
);
13315 /* Display an LTO format symbol table.
13316 FIXME: The format of LTO symbol tables is not formalized.
13317 So this code could need changing in the future. */
13320 display_lto_symtab (Filedata
* filedata
,
13321 Elf_Internal_Shdr
* section
)
13323 if (section
->sh_size
== 0)
13325 if (filedata
->is_separate
)
13326 printf (_("\nThe LTO Symbol table section '%s' in linked file '%s' is empty!\n"),
13327 printable_section_name (filedata
, section
),
13328 filedata
->file_name
);
13330 printf (_("\nLTO Symbol table '%s' is empty!\n"),
13331 printable_section_name (filedata
, section
));
13336 if (section
->sh_size
> filedata
->file_size
)
13338 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
13339 printable_section_name (filedata
, section
),
13340 (unsigned long) section
->sh_size
);
13344 void * alloced_data
= get_data (NULL
, filedata
, section
->sh_offset
,
13345 section
->sh_size
, 1, _("LTO symbols"));
13346 if (alloced_data
== NULL
)
13349 /* Look for extended data for the symbol table. */
13350 Elf_Internal_Shdr
* ext
;
13351 void * ext_data_orig
= NULL
;
13352 char * ext_data
= NULL
;
13353 char * ext_data_end
= NULL
;
13354 char * ext_name
= NULL
;
13356 if (asprintf (& ext_name
, ".gnu.lto_.ext_symtab.%s",
13357 (section_name (filedata
, section
)
13358 + sizeof (".gnu.lto_.symtab.") - 1)) > 0
13359 && ext_name
!= NULL
/* Paranoia. */
13360 && (ext
= find_section (filedata
, ext_name
)) != NULL
)
13362 if (ext
->sh_size
< 3)
13363 error (_("LTO Symbol extension table '%s' is empty!\n"),
13364 printable_section_name (filedata
, ext
));
13367 ext_data_orig
= ext_data
= get_data (NULL
, filedata
, ext
->sh_offset
,
13369 _("LTO ext symbol data"));
13370 if (ext_data
!= NULL
)
13372 ext_data_end
= ext_data
+ ext
->sh_size
;
13373 if (* ext_data
++ != 1)
13374 error (_("Unexpected version number in symbol extension table\n"));
13379 const unsigned char * data
= (const unsigned char *) alloced_data
;
13380 const unsigned char * end
= data
+ section
->sh_size
;
13382 if (filedata
->is_separate
)
13383 printf (_("\nIn linked file '%s': "), filedata
->file_name
);
13387 if (ext_data_orig
!= NULL
)
13390 printf (_("LTO Symbol table '%s' and extension table '%s' contain:\n"),
13391 printable_section_name (filedata
, section
),
13392 printable_section_name (filedata
, ext
));
13395 printf (_("LTO Symbol table '%s'\n"),
13396 printable_section_name (filedata
, section
));
13397 printf (_(" and extension table '%s' contain:\n"),
13398 printable_section_name (filedata
, ext
));
13402 printf (_("LTO Symbol table '%s' contains:\n"),
13403 printable_section_name (filedata
, section
));
13405 /* FIXME: Add a wide version. */
13406 if (ext_data_orig
!= NULL
)
13407 printf (_(" Comdat_Key Kind Visibility Size Slot Type Section Name\n"));
13409 printf (_(" Comdat_Key Kind Visibility Size Slot Name\n"));
13411 /* FIXME: We do not handle style prefixes. */
13415 const unsigned char * sym_name
= data
;
13416 data
+= strnlen ((const char *) sym_name
, end
- data
) + 1;
13420 const unsigned char * comdat_key
= data
;
13421 data
+= strnlen ((const char *) comdat_key
, end
- data
) + 1;
13425 if (data
+ 2 + 8 + 4 > end
)
13428 unsigned int kind
= *data
++;
13429 unsigned int visibility
= *data
++;
13431 elf_vma size
= byte_get (data
, 8);
13434 elf_vma slot
= byte_get (data
, 4);
13437 if (ext_data
!= NULL
)
13439 if (ext_data
< (ext_data_end
- 1))
13441 unsigned int sym_type
= * ext_data
++;
13442 unsigned int sec_kind
= * ext_data
++;
13444 printf (" %10s %10s %11s %08lx %08lx %9s %08lx _",
13445 * comdat_key
== 0 ? "-" : (char *) comdat_key
,
13446 get_lto_kind (kind
),
13447 get_lto_visibility (visibility
),
13450 get_lto_sym_type (sym_type
),
13452 print_symbol (6, (const char *) sym_name
);
13456 error (_("Ran out of LTO symbol extension data\n"));
13458 /* FIXME: return FAIL result ? */
13463 printf (" %10s %10s %11s %08lx %08lx _",
13464 * comdat_key
== 0 ? "-" : (char *) comdat_key
,
13465 get_lto_kind (kind
),
13466 get_lto_visibility (visibility
),
13469 print_symbol (21, (const char *) sym_name
);
13474 if (ext_data
!= NULL
&& ext_data
< ext_data_end
)
13476 error (_("Data remains in the LTO symbol extension table\n"));
13480 free (alloced_data
);
13481 free (ext_data_orig
);
13486 error (_("Buffer overrun encountered whilst decoding LTO symbol table\n"));
13487 free (alloced_data
);
13488 free (ext_data_orig
);
13493 /* Display LTO symbol tables. */
13496 process_lto_symbol_tables (Filedata
* filedata
)
13498 Elf_Internal_Shdr
* section
;
13505 if (filedata
->section_headers
== NULL
)
13508 for (i
= 0, section
= filedata
->section_headers
;
13509 i
< filedata
->file_header
.e_shnum
;
13511 if (section_name_valid (filedata
, section
)
13512 && startswith (section_name (filedata
, section
), ".gnu.lto_.symtab."))
13513 res
&= display_lto_symtab (filedata
, section
);
13518 /* Dump the symbol table. */
13521 process_symbol_table (Filedata
* filedata
)
13523 Elf_Internal_Shdr
* section
;
13525 if (!do_syms
&& !do_dyn_syms
&& !do_histogram
)
13528 if ((filedata
->dynamic_info
[DT_HASH
] || filedata
->dynamic_info_DT_GNU_HASH
)
13530 && do_using_dynamic
13531 && filedata
->dynamic_strings
!= NULL
13532 && filedata
->dynamic_symbols
!= NULL
)
13536 if (filedata
->is_separate
)
13538 printf (ngettext ("\nIn linked file '%s' the dynamic symbol table contains %lu entry:\n",
13539 "\nIn linked file '%s' the dynamic symbol table contains %lu entries:\n",
13540 filedata
->num_dynamic_syms
),
13541 filedata
->file_name
,
13542 filedata
->num_dynamic_syms
);
13546 printf (ngettext ("\nSymbol table for image contains %lu entry:\n",
13547 "\nSymbol table for image contains %lu entries:\n",
13548 filedata
->num_dynamic_syms
),
13549 filedata
->num_dynamic_syms
);
13552 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
13554 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
13556 for (si
= 0; si
< filedata
->num_dynamic_syms
; si
++)
13557 print_dynamic_symbol (filedata
, si
, filedata
->dynamic_symbols
, NULL
,
13558 filedata
->dynamic_strings
,
13559 filedata
->dynamic_strings_length
);
13561 else if ((do_dyn_syms
|| (do_syms
&& !do_using_dynamic
))
13562 && filedata
->section_headers
!= NULL
)
13566 for (i
= 0, section
= filedata
->section_headers
;
13567 i
< filedata
->file_header
.e_shnum
;
13570 char * strtab
= NULL
;
13571 unsigned long int strtab_size
= 0;
13572 Elf_Internal_Sym
* symtab
;
13573 unsigned long si
, num_syms
;
13575 if ((section
->sh_type
!= SHT_SYMTAB
13576 && section
->sh_type
!= SHT_DYNSYM
)
13578 && section
->sh_type
== SHT_SYMTAB
))
13581 if (section
->sh_entsize
== 0)
13583 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
13584 printable_section_name (filedata
, section
));
13588 num_syms
= section
->sh_size
/ section
->sh_entsize
;
13590 if (filedata
->is_separate
)
13591 printf (ngettext ("\nIn linked file '%s' symbol section '%s' contains %lu entry:\n",
13592 "\nIn linked file '%s' symbol section '%s' contains %lu entries:\n",
13594 filedata
->file_name
,
13595 printable_section_name (filedata
, section
),
13598 printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
13599 "\nSymbol table '%s' contains %lu entries:\n",
13601 printable_section_name (filedata
, section
),
13605 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
13607 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
13609 symtab
= get_elf_symbols (filedata
, section
, & num_syms
);
13610 if (symtab
== NULL
)
13613 if (section
->sh_link
== filedata
->file_header
.e_shstrndx
)
13615 strtab
= filedata
->string_table
;
13616 strtab_size
= filedata
->string_table_length
;
13618 else if (section
->sh_link
< filedata
->file_header
.e_shnum
)
13620 Elf_Internal_Shdr
* string_sec
;
13622 string_sec
= filedata
->section_headers
+ section
->sh_link
;
13624 strtab
= (char *) get_data (NULL
, filedata
, string_sec
->sh_offset
,
13625 1, string_sec
->sh_size
,
13626 _("string table"));
13627 strtab_size
= strtab
!= NULL
? string_sec
->sh_size
: 0;
13630 for (si
= 0; si
< num_syms
; si
++)
13631 print_dynamic_symbol (filedata
, si
, symtab
, section
,
13632 strtab
, strtab_size
);
13635 if (strtab
!= filedata
->string_table
)
13641 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
13643 if (do_histogram
&& filedata
->buckets
!= NULL
)
13645 unsigned long * lengths
;
13646 unsigned long * counts
;
13649 unsigned long maxlength
= 0;
13650 unsigned long nzero_counts
= 0;
13651 unsigned long nsyms
= 0;
13654 printf (ngettext ("\nHistogram for bucket list length "
13655 "(total of %lu bucket):\n",
13656 "\nHistogram for bucket list length "
13657 "(total of %lu buckets):\n",
13658 (unsigned long) filedata
->nbuckets
),
13659 (unsigned long) filedata
->nbuckets
);
13661 lengths
= (unsigned long *) calloc (filedata
->nbuckets
,
13662 sizeof (*lengths
));
13663 if (lengths
== NULL
)
13665 error (_("Out of memory allocating space for histogram buckets\n"));
13668 visited
= xcmalloc (filedata
->nchains
, 1);
13669 memset (visited
, 0, filedata
->nchains
);
13671 printf (_(" Length Number %% of total Coverage\n"));
13672 for (hn
= 0; hn
< filedata
->nbuckets
; ++hn
)
13674 for (si
= filedata
->buckets
[hn
]; si
> 0; si
= filedata
->chains
[si
])
13677 if (maxlength
< ++lengths
[hn
])
13679 if (si
>= filedata
->nchains
|| visited
[si
])
13681 error (_("histogram chain is corrupt\n"));
13689 counts
= (unsigned long *) calloc (maxlength
+ 1, sizeof (*counts
));
13690 if (counts
== NULL
)
13693 error (_("Out of memory allocating space for histogram counts\n"));
13697 for (hn
= 0; hn
< filedata
->nbuckets
; ++hn
)
13698 ++counts
[lengths
[hn
]];
13700 if (filedata
->nbuckets
> 0)
13703 printf (" 0 %-10lu (%5.1f%%)\n",
13704 counts
[0], (counts
[0] * 100.0) / filedata
->nbuckets
);
13705 for (i
= 1; i
<= maxlength
; ++i
)
13707 nzero_counts
+= counts
[i
] * i
;
13708 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
13709 i
, counts
[i
], (counts
[i
] * 100.0) / filedata
->nbuckets
,
13710 (nzero_counts
* 100.0) / nsyms
);
13718 free (filedata
->buckets
);
13719 filedata
->buckets
= NULL
;
13720 filedata
->nbuckets
= 0;
13721 free (filedata
->chains
);
13722 filedata
->chains
= NULL
;
13724 if (do_histogram
&& filedata
->gnubuckets
!= NULL
)
13726 unsigned long * lengths
;
13727 unsigned long * counts
;
13729 unsigned long maxlength
= 0;
13730 unsigned long nzero_counts
= 0;
13731 unsigned long nsyms
= 0;
13733 printf (ngettext ("\nHistogram for `%s' bucket list length "
13734 "(total of %lu bucket):\n",
13735 "\nHistogram for `%s' bucket list length "
13736 "(total of %lu buckets):\n",
13737 (unsigned long) filedata
->ngnubuckets
),
13738 GNU_HASH_SECTION_NAME (filedata
),
13739 (unsigned long) filedata
->ngnubuckets
);
13741 lengths
= (unsigned long *) calloc (filedata
->ngnubuckets
,
13742 sizeof (*lengths
));
13743 if (lengths
== NULL
)
13745 error (_("Out of memory allocating space for gnu histogram buckets\n"));
13749 printf (_(" Length Number %% of total Coverage\n"));
13751 for (hn
= 0; hn
< filedata
->ngnubuckets
; ++hn
)
13752 if (filedata
->gnubuckets
[hn
] != 0)
13754 bfd_vma off
, length
= 1;
13756 for (off
= filedata
->gnubuckets
[hn
] - filedata
->gnusymidx
;
13757 /* PR 17531 file: 010-77222-0.004. */
13758 off
< filedata
->ngnuchains
13759 && (filedata
->gnuchains
[off
] & 1) == 0;
13762 lengths
[hn
] = length
;
13763 if (length
> maxlength
)
13764 maxlength
= length
;
13768 counts
= (unsigned long *) calloc (maxlength
+ 1, sizeof (*counts
));
13769 if (counts
== NULL
)
13772 error (_("Out of memory allocating space for gnu histogram counts\n"));
13776 for (hn
= 0; hn
< filedata
->ngnubuckets
; ++hn
)
13777 ++counts
[lengths
[hn
]];
13779 if (filedata
->ngnubuckets
> 0)
13782 printf (" 0 %-10lu (%5.1f%%)\n",
13783 counts
[0], (counts
[0] * 100.0) / filedata
->ngnubuckets
);
13784 for (j
= 1; j
<= maxlength
; ++j
)
13786 nzero_counts
+= counts
[j
] * j
;
13787 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
13788 j
, counts
[j
], (counts
[j
] * 100.0) / filedata
->ngnubuckets
,
13789 (nzero_counts
* 100.0) / nsyms
);
13796 free (filedata
->gnubuckets
);
13797 filedata
->gnubuckets
= NULL
;
13798 filedata
->ngnubuckets
= 0;
13799 free (filedata
->gnuchains
);
13800 filedata
->gnuchains
= NULL
;
13801 filedata
->ngnuchains
= 0;
13802 free (filedata
->mipsxlat
);
13803 filedata
->mipsxlat
= NULL
;
13807 free (filedata
->gnubuckets
);
13808 filedata
->gnubuckets
= NULL
;
13809 filedata
->ngnubuckets
= 0;
13810 free (filedata
->gnuchains
);
13811 filedata
->gnuchains
= NULL
;
13812 filedata
->ngnuchains
= 0;
13813 free (filedata
->mipsxlat
);
13814 filedata
->mipsxlat
= NULL
;
13815 free (filedata
->buckets
);
13816 filedata
->buckets
= NULL
;
13817 filedata
->nbuckets
= 0;
13818 free (filedata
->chains
);
13819 filedata
->chains
= NULL
;
13824 process_syminfo (Filedata
* filedata
)
13828 if (filedata
->dynamic_syminfo
== NULL
13830 /* No syminfo, this is ok. */
13833 /* There better should be a dynamic symbol section. */
13834 if (filedata
->dynamic_symbols
== NULL
|| filedata
->dynamic_strings
== NULL
)
13837 if (filedata
->is_separate
)
13838 printf (ngettext ("\nIn linked file '%s: the dynamic info segment at offset 0x%lx contains %d entry:\n",
13839 "\nIn linked file '%s: the dynamic info segment at offset 0x%lx contains %d entries:\n",
13840 filedata
->dynamic_syminfo_nent
),
13841 filedata
->file_name
,
13842 filedata
->dynamic_syminfo_offset
,
13843 filedata
->dynamic_syminfo_nent
);
13845 printf (ngettext ("\nDynamic info segment at offset 0x%lx "
13846 "contains %d entry:\n",
13847 "\nDynamic info segment at offset 0x%lx "
13848 "contains %d entries:\n",
13849 filedata
->dynamic_syminfo_nent
),
13850 filedata
->dynamic_syminfo_offset
,
13851 filedata
->dynamic_syminfo_nent
);
13853 printf (_(" Num: Name BoundTo Flags\n"));
13854 for (i
= 0; i
< filedata
->dynamic_syminfo_nent
; ++i
)
13856 unsigned short int flags
= filedata
->dynamic_syminfo
[i
].si_flags
;
13858 printf ("%4d: ", i
);
13859 if (i
>= filedata
->num_dynamic_syms
)
13860 printf (_("<corrupt index>"));
13861 else if (valid_dynamic_name (filedata
, filedata
->dynamic_symbols
[i
].st_name
))
13862 print_symbol (30, get_dynamic_name (filedata
,
13863 filedata
->dynamic_symbols
[i
].st_name
));
13865 printf (_("<corrupt: %19ld>"), filedata
->dynamic_symbols
[i
].st_name
);
13868 switch (filedata
->dynamic_syminfo
[i
].si_boundto
)
13870 case SYMINFO_BT_SELF
:
13871 fputs ("SELF ", stdout
);
13873 case SYMINFO_BT_PARENT
:
13874 fputs ("PARENT ", stdout
);
13877 if (filedata
->dynamic_syminfo
[i
].si_boundto
> 0
13878 && filedata
->dynamic_syminfo
[i
].si_boundto
< filedata
->dynamic_nent
13879 && valid_dynamic_name (filedata
,
13880 filedata
->dynamic_section
[filedata
->dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
13882 print_symbol (10, get_dynamic_name (filedata
,
13883 filedata
->dynamic_section
[filedata
->dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
13887 printf ("%-10d ", filedata
->dynamic_syminfo
[i
].si_boundto
);
13891 if (flags
& SYMINFO_FLG_DIRECT
)
13892 printf (" DIRECT");
13893 if (flags
& SYMINFO_FLG_PASSTHRU
)
13894 printf (" PASSTHRU");
13895 if (flags
& SYMINFO_FLG_COPY
)
13897 if (flags
& SYMINFO_FLG_LAZYLOAD
)
13898 printf (" LAZYLOAD");
13906 /* A macro which evaluates to TRUE if the region ADDR .. ADDR + NELEM
13907 is contained by the region START .. END. The types of ADDR, START
13908 and END should all be the same. Note both ADDR + NELEM and END
13909 point to just beyond the end of the regions that are being tested. */
13910 #define IN_RANGE(START,END,ADDR,NELEM) \
13911 (((ADDR) >= (START)) && ((ADDR) < (END)) && ((ADDR) + (NELEM) <= (END)))
13913 /* Check to see if the given reloc needs to be handled in a target specific
13914 manner. If so then process the reloc and return TRUE otherwise return
13917 If called with reloc == NULL, then this is a signal that reloc processing
13918 for the current section has finished, and any saved state should be
13922 target_specific_reloc_handling (Filedata
* filedata
,
13923 Elf_Internal_Rela
* reloc
,
13924 unsigned char * start
,
13925 unsigned char * end
,
13926 Elf_Internal_Sym
* symtab
,
13927 unsigned long num_syms
)
13929 unsigned int reloc_type
= 0;
13930 unsigned long sym_index
= 0;
13934 reloc_type
= get_reloc_type (filedata
, reloc
->r_info
);
13935 sym_index
= get_reloc_symindex (reloc
->r_info
);
13938 switch (filedata
->file_header
.e_machine
)
13941 case EM_MSP430_OLD
:
13943 static Elf_Internal_Sym
* saved_sym
= NULL
;
13951 switch (reloc_type
)
13953 case 10: /* R_MSP430_SYM_DIFF */
13954 case 12: /* R_MSP430_GNU_SUB_ULEB128 */
13955 if (uses_msp430x_relocs (filedata
))
13957 /* Fall through. */
13958 case 21: /* R_MSP430X_SYM_DIFF */
13959 case 23: /* R_MSP430X_GNU_SUB_ULEB128 */
13961 if (sym_index
>= num_syms
)
13962 error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
13965 saved_sym
= symtab
+ sym_index
;
13968 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
13969 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
13970 goto handle_sym_diff
;
13972 case 5: /* R_MSP430_16_BYTE */
13973 case 9: /* R_MSP430_8 */
13974 case 11: /* R_MSP430_GNU_SET_ULEB128 */
13975 if (uses_msp430x_relocs (filedata
))
13977 goto handle_sym_diff
;
13979 case 2: /* R_MSP430_ABS16 */
13980 case 15: /* R_MSP430X_ABS16 */
13981 case 22: /* R_MSP430X_GNU_SET_ULEB128 */
13982 if (! uses_msp430x_relocs (filedata
))
13984 goto handle_sym_diff
;
13987 if (saved_sym
!= NULL
)
13990 unsigned int reloc_size
= 0;
13992 switch (reloc_type
)
13994 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
13997 case 11: /* R_MSP430_GNU_SET_ULEB128 */
13998 case 22: /* R_MSP430X_GNU_SET_ULEB128 */
13999 if (reloc
->r_offset
< (size_t) (end
- start
))
14000 read_leb128 (start
+ reloc
->r_offset
, end
, false,
14001 &reloc_size
, &leb_ret
);
14008 if (leb_ret
!= 0 || reloc_size
== 0 || reloc_size
> 8)
14009 error (_("MSP430 ULEB128 field at 0x%lx contains invalid "
14010 "ULEB128 value\n"),
14011 (long) reloc
->r_offset
);
14012 else if (sym_index
>= num_syms
)
14013 error (_("MSP430 reloc contains invalid symbol index %lu\n"),
14017 value
= reloc
->r_addend
+ (symtab
[sym_index
].st_value
14018 - saved_sym
->st_value
);
14020 if (IN_RANGE (start
, end
, start
+ reloc
->r_offset
, reloc_size
))
14021 byte_put (start
+ reloc
->r_offset
, value
, reloc_size
);
14024 error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
14025 (long) reloc
->r_offset
);
14034 if (saved_sym
!= NULL
)
14035 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
14042 case EM_CYGNUS_MN10300
:
14044 static Elf_Internal_Sym
* saved_sym
= NULL
;
14052 switch (reloc_type
)
14054 case 34: /* R_MN10300_ALIGN */
14056 case 33: /* R_MN10300_SYM_DIFF */
14057 if (sym_index
>= num_syms
)
14058 error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
14061 saved_sym
= symtab
+ sym_index
;
14064 case 1: /* R_MN10300_32 */
14065 case 2: /* R_MN10300_16 */
14066 if (saved_sym
!= NULL
)
14068 int reloc_size
= reloc_type
== 1 ? 4 : 2;
14071 if (sym_index
>= num_syms
)
14072 error (_("MN10300 reloc contains invalid symbol index %lu\n"),
14076 value
= reloc
->r_addend
+ (symtab
[sym_index
].st_value
14077 - saved_sym
->st_value
);
14079 if (IN_RANGE (start
, end
, start
+ reloc
->r_offset
, reloc_size
))
14080 byte_put (start
+ reloc
->r_offset
, value
, reloc_size
);
14082 error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
14083 (long) reloc
->r_offset
);
14091 if (saved_sym
!= NULL
)
14092 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
14100 static bfd_vma saved_sym1
= 0;
14101 static bfd_vma saved_sym2
= 0;
14102 static bfd_vma value
;
14106 saved_sym1
= saved_sym2
= 0;
14110 switch (reloc_type
)
14112 case 0x80: /* R_RL78_SYM. */
14113 saved_sym1
= saved_sym2
;
14114 if (sym_index
>= num_syms
)
14115 error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
14119 saved_sym2
= symtab
[sym_index
].st_value
;
14120 saved_sym2
+= reloc
->r_addend
;
14124 case 0x83: /* R_RL78_OPsub. */
14125 value
= saved_sym1
- saved_sym2
;
14126 saved_sym2
= saved_sym1
= 0;
14130 case 0x41: /* R_RL78_ABS32. */
14131 if (IN_RANGE (start
, end
, start
+ reloc
->r_offset
, 4))
14132 byte_put (start
+ reloc
->r_offset
, value
, 4);
14134 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
14135 (long) reloc
->r_offset
);
14139 case 0x43: /* R_RL78_ABS16. */
14140 if (IN_RANGE (start
, end
, start
+ reloc
->r_offset
, 2))
14141 byte_put (start
+ reloc
->r_offset
, value
, 2);
14143 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
14144 (long) reloc
->r_offset
);
14158 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
14159 DWARF debug sections. This is a target specific test. Note - we do not
14160 go through the whole including-target-headers-multiple-times route, (as
14161 we have already done with <elf/h8.h>) because this would become very
14162 messy and even then this function would have to contain target specific
14163 information (the names of the relocs instead of their numeric values).
14164 FIXME: This is not the correct way to solve this problem. The proper way
14165 is to have target specific reloc sizing and typing functions created by
14166 the reloc-macros.h header, in the same way that it already creates the
14167 reloc naming functions. */
14170 is_32bit_abs_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14172 /* Please keep this table alpha-sorted for ease of visual lookup. */
14173 switch (filedata
->file_header
.e_machine
)
14177 return reloc_type
== 1; /* R_386_32. */
14179 return reloc_type
== 1; /* R_68K_32. */
14181 return reloc_type
== 1; /* R_860_32. */
14183 return reloc_type
== 2; /* R_960_32. */
14185 return (reloc_type
== 258
14186 || reloc_type
== 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
14188 return reloc_type
== 11; /* R_BPF_DATA_32 */
14189 case EM_ADAPTEVA_EPIPHANY
:
14190 return reloc_type
== 3;
14192 return reloc_type
== 1; /* R_ALPHA_REFLONG. */
14194 return reloc_type
== 1; /* R_ARC_32. */
14195 case EM_ARC_COMPACT
:
14196 case EM_ARC_COMPACT2
:
14197 return reloc_type
== 4; /* R_ARC_32. */
14199 return reloc_type
== 2; /* R_ARM_ABS32 */
14202 return reloc_type
== 1;
14204 return reloc_type
== 0x12; /* R_byte4_data. */
14206 return reloc_type
== 3; /* R_CRIS_32. */
14208 return reloc_type
== 3; /* R_CR16_NUM32. */
14210 return reloc_type
== 15; /* R_CRX_NUM32. */
14212 return reloc_type
== 1; /* R_CKCORE_ADDR32. */
14213 case EM_CYGNUS_FRV
:
14214 return reloc_type
== 1;
14215 case EM_CYGNUS_D10V
:
14217 return reloc_type
== 6; /* R_D10V_32. */
14218 case EM_CYGNUS_D30V
:
14220 return reloc_type
== 12; /* R_D30V_32_NORMAL. */
14222 return reloc_type
== 3; /* R_DLX_RELOC_32. */
14223 case EM_CYGNUS_FR30
:
14225 return reloc_type
== 3; /* R_FR30_32. */
14227 return reloc_type
== 1; /* R_FT32_32. */
14231 return reloc_type
== 1; /* R_H8_DIR32. */
14233 return (reloc_type
== 0x64 /* R_IA64_SECREL32MSB. */
14234 || reloc_type
== 0x65 /* R_IA64_SECREL32LSB. */
14235 || reloc_type
== 0x24 /* R_IA64_DIR32MSB. */
14236 || reloc_type
== 0x25 /* R_IA64_DIR32LSB. */);
14239 return reloc_type
== 2; /* R_IP2K_32. */
14241 return reloc_type
== 2; /* R_IQ2000_32. */
14242 case EM_LATTICEMICO32
:
14243 return reloc_type
== 3; /* R_LM32_32. */
14245 return reloc_type
== 1; /* R_LARCH_32. */
14248 return reloc_type
== 3; /* R_M32C_32. */
14250 return reloc_type
== 34; /* R_M32R_32_RELA. */
14253 return reloc_type
== 6; /* R_M68HC11_32. */
14255 return reloc_type
== 7 || /* R_S12Z_EXT32 */
14256 reloc_type
== 6; /* R_S12Z_CW32. */
14258 return reloc_type
== 1; /* R_MCORE_ADDR32. */
14259 case EM_CYGNUS_MEP
:
14260 return reloc_type
== 4; /* R_MEP_32. */
14262 return reloc_type
== 2; /* R_METAG_ADDR32. */
14263 case EM_MICROBLAZE
:
14264 return reloc_type
== 1; /* R_MICROBLAZE_32. */
14266 return reloc_type
== 2; /* R_MIPS_32. */
14268 return reloc_type
== 4; /* R_MMIX_32. */
14269 case EM_CYGNUS_MN10200
:
14271 return reloc_type
== 1; /* R_MN10200_32. */
14272 case EM_CYGNUS_MN10300
:
14274 return reloc_type
== 1; /* R_MN10300_32. */
14276 return reloc_type
== 1; /* R_MOXIE_32. */
14277 case EM_MSP430_OLD
:
14279 return reloc_type
== 1; /* R_MSP430_32 or R_MSP320_ABS32. */
14281 return reloc_type
== 2; /* R_MT_32. */
14283 return reloc_type
== 20; /* R_NDS32_32_RELA. */
14284 case EM_ALTERA_NIOS2
:
14285 return reloc_type
== 12; /* R_NIOS2_BFD_RELOC_32. */
14287 return reloc_type
== 1; /* R_NIOS_32. */
14289 return reloc_type
== 1; /* R_OR1K_32. */
14291 return (reloc_type
== 1 /* R_PARISC_DIR32. */
14292 || reloc_type
== 2 /* R_PARISC_DIR21L. */
14293 || reloc_type
== 41); /* R_PARISC_SECREL32. */
14296 return reloc_type
== 1; /* R_PJ_DATA_DIR32. */
14298 return reloc_type
== 1; /* R_PPC64_ADDR32. */
14300 return reloc_type
== 1; /* R_PPC_ADDR32. */
14302 return reloc_type
== 11; /* R_PRU_BFD_RELOC_32. */
14304 return reloc_type
== 1; /* R_RISCV_32. */
14306 return reloc_type
== 1; /* R_RL78_DIR32. */
14308 return reloc_type
== 1; /* R_RX_DIR32. */
14310 return reloc_type
== 1; /* R_I370_ADDR31. */
14313 return reloc_type
== 4; /* R_S390_32. */
14315 return reloc_type
== 8; /* R_SCORE_ABS32. */
14317 return reloc_type
== 1; /* R_SH_DIR32. */
14318 case EM_SPARC32PLUS
:
14321 return reloc_type
== 3 /* R_SPARC_32. */
14322 || reloc_type
== 23; /* R_SPARC_UA32. */
14324 return reloc_type
== 6; /* R_SPU_ADDR32 */
14326 return reloc_type
== 1; /* R_C6000_ABS32. */
14328 return reloc_type
== 2; /* R_TILEGX_32. */
14330 return reloc_type
== 1; /* R_TILEPRO_32. */
14331 case EM_CYGNUS_V850
:
14333 return reloc_type
== 6; /* R_V850_ABS32. */
14335 return reloc_type
== 0x33; /* R_V810_WORD. */
14337 return reloc_type
== 1; /* R_VAX_32. */
14339 return reloc_type
== 3; /* R_VISIUM_32. */
14340 case EM_WEBASSEMBLY
:
14341 return reloc_type
== 1; /* R_WASM32_32. */
14345 return reloc_type
== 10; /* R_X86_64_32. */
14348 return reloc_type
== 3; /* R_XC16C_ABS_32. */
14350 return reloc_type
== 4; /* R_XGATE_32. */
14352 return reloc_type
== 1; /* R_XSTROMY16_32. */
14353 case EM_XTENSA_OLD
:
14355 return reloc_type
== 1; /* R_XTENSA_32. */
14357 return reloc_type
== 6; /* R_Z80_32. */
14360 static unsigned int prev_warn
= 0;
14362 /* Avoid repeating the same warning multiple times. */
14363 if (prev_warn
!= filedata
->file_header
.e_machine
)
14364 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
14365 filedata
->file_header
.e_machine
);
14366 prev_warn
= filedata
->file_header
.e_machine
;
14372 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14373 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
14376 is_32bit_pcrel_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14378 switch (filedata
->file_header
.e_machine
)
14379 /* Please keep this table alpha-sorted for ease of visual lookup. */
14383 return reloc_type
== 2; /* R_386_PC32. */
14385 return reloc_type
== 4; /* R_68K_PC32. */
14387 return reloc_type
== 261; /* R_AARCH64_PREL32 */
14388 case EM_ADAPTEVA_EPIPHANY
:
14389 return reloc_type
== 6;
14391 return reloc_type
== 10; /* R_ALPHA_SREL32. */
14392 case EM_ARC_COMPACT
:
14393 case EM_ARC_COMPACT2
:
14394 return reloc_type
== 49; /* R_ARC_32_PCREL. */
14396 return reloc_type
== 3; /* R_ARM_REL32 */
14399 return reloc_type
== 36; /* R_AVR_32_PCREL. */
14400 case EM_MICROBLAZE
:
14401 return reloc_type
== 2; /* R_MICROBLAZE_32_PCREL. */
14403 return reloc_type
== 9; /* R_OR1K_32_PCREL. */
14405 return reloc_type
== 9; /* R_PARISC_PCREL32. */
14407 return reloc_type
== 26; /* R_PPC_REL32. */
14409 return reloc_type
== 26; /* R_PPC64_REL32. */
14411 return reloc_type
== 57; /* R_RISCV_32_PCREL. */
14414 return reloc_type
== 5; /* R_390_PC32. */
14416 return reloc_type
== 2; /* R_SH_REL32. */
14417 case EM_SPARC32PLUS
:
14420 return reloc_type
== 6; /* R_SPARC_DISP32. */
14422 return reloc_type
== 13; /* R_SPU_REL32. */
14424 return reloc_type
== 6; /* R_TILEGX_32_PCREL. */
14426 return reloc_type
== 4; /* R_TILEPRO_32_PCREL. */
14428 return reloc_type
== 6; /* R_VISIUM_32_PCREL */
14432 return reloc_type
== 2; /* R_X86_64_PC32. */
14434 return reloc_type
== 4; /* R_VAX_PCREL32. */
14435 case EM_XTENSA_OLD
:
14437 return reloc_type
== 14; /* R_XTENSA_32_PCREL. */
14439 /* Do not abort or issue an error message here. Not all targets use
14440 pc-relative 32-bit relocs in their DWARF debug information and we
14441 have already tested for target coverage in is_32bit_abs_reloc. A
14442 more helpful warning message will be generated by apply_relocations
14443 anyway, so just return. */
14448 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14449 a 64-bit absolute RELA relocation used in DWARF debug sections. */
14452 is_64bit_abs_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14454 switch (filedata
->file_header
.e_machine
)
14457 return reloc_type
== 257; /* R_AARCH64_ABS64. */
14459 return reloc_type
== 2; /* R_ALPHA_REFQUAD. */
14461 return (reloc_type
== 0x26 /* R_IA64_DIR64MSB. */
14462 || reloc_type
== 0x27 /* R_IA64_DIR64LSB. */);
14464 return reloc_type
== 2; /* R_LARCH_64 */
14466 return reloc_type
== 80; /* R_PARISC_DIR64. */
14468 return reloc_type
== 38; /* R_PPC64_ADDR64. */
14470 return reloc_type
== 2; /* R_RISCV_64. */
14471 case EM_SPARC32PLUS
:
14474 return reloc_type
== 32 /* R_SPARC_64. */
14475 || reloc_type
== 54; /* R_SPARC_UA64. */
14479 return reloc_type
== 1; /* R_X86_64_64. */
14482 return reloc_type
== 22; /* R_S390_64. */
14484 return reloc_type
== 1; /* R_TILEGX_64. */
14486 return reloc_type
== 18; /* R_MIPS_64. */
14492 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
14493 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
14496 is_64bit_pcrel_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14498 switch (filedata
->file_header
.e_machine
)
14501 return reloc_type
== 260; /* R_AARCH64_PREL64. */
14503 return reloc_type
== 11; /* R_ALPHA_SREL64. */
14505 return (reloc_type
== 0x4e /* R_IA64_PCREL64MSB. */
14506 || reloc_type
== 0x4f /* R_IA64_PCREL64LSB. */);
14508 return reloc_type
== 72; /* R_PARISC_PCREL64. */
14510 return reloc_type
== 44; /* R_PPC64_REL64. */
14511 case EM_SPARC32PLUS
:
14514 return reloc_type
== 46; /* R_SPARC_DISP64. */
14518 return reloc_type
== 24; /* R_X86_64_PC64. */
14521 return reloc_type
== 23; /* R_S390_PC64. */
14523 return reloc_type
== 5; /* R_TILEGX_64_PCREL. */
14529 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14530 a 24-bit absolute RELA relocation used in DWARF debug sections. */
14533 is_24bit_abs_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14535 switch (filedata
->file_header
.e_machine
)
14537 case EM_CYGNUS_MN10200
:
14539 return reloc_type
== 4; /* R_MN10200_24. */
14541 return reloc_type
== 5; /* R_FT32_20. */
14543 return reloc_type
== 5; /* R_Z80_24. */
14549 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14550 a 16-bit absolute RELA relocation used in DWARF debug sections. */
14553 is_16bit_abs_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14555 /* Please keep this table alpha-sorted for ease of visual lookup. */
14556 switch (filedata
->file_header
.e_machine
)
14559 case EM_ARC_COMPACT
:
14560 case EM_ARC_COMPACT2
:
14561 return reloc_type
== 2; /* R_ARC_16. */
14562 case EM_ADAPTEVA_EPIPHANY
:
14563 return reloc_type
== 5;
14566 return reloc_type
== 4; /* R_AVR_16. */
14567 case EM_CYGNUS_D10V
:
14569 return reloc_type
== 3; /* R_D10V_16. */
14571 return reloc_type
== 2; /* R_FT32_16. */
14575 return reloc_type
== R_H8_DIR16
;
14578 return reloc_type
== 1; /* R_IP2K_16. */
14581 return reloc_type
== 1; /* R_M32C_16 */
14582 case EM_CYGNUS_MN10200
:
14584 return reloc_type
== 2; /* R_MN10200_16. */
14585 case EM_CYGNUS_MN10300
:
14587 return reloc_type
== 2; /* R_MN10300_16. */
14589 if (uses_msp430x_relocs (filedata
))
14590 return reloc_type
== 2; /* R_MSP430_ABS16. */
14591 /* Fall through. */
14592 case EM_MSP430_OLD
:
14593 return reloc_type
== 5; /* R_MSP430_16_BYTE. */
14595 return reloc_type
== 19; /* R_NDS32_16_RELA. */
14596 case EM_ALTERA_NIOS2
:
14597 return reloc_type
== 13; /* R_NIOS2_BFD_RELOC_16. */
14599 return reloc_type
== 9; /* R_NIOS_16. */
14601 return reloc_type
== 2; /* R_OR1K_16. */
14603 return reloc_type
== 55; /* R_RISCV_SET16. */
14605 return reloc_type
== 8; /* R_PRU_BFD_RELOC_16. */
14607 return reloc_type
== 2; /* R_C6000_ABS16. */
14609 return reloc_type
== 2; /* R_VISIUM_16. */
14612 return reloc_type
== 2; /* R_XC16C_ABS_16. */
14614 return reloc_type
== 3; /* R_XGATE_16. */
14616 return reloc_type
== 4; /* R_Z80_16. */
14622 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14623 a 8-bit absolute RELA relocation used in DWARF debug sections. */
14626 is_8bit_abs_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14628 switch (filedata
->file_header
.e_machine
)
14631 return reloc_type
== 54; /* R_RISCV_SET8. */
14633 return reloc_type
== 1; /* R_Z80_8. */
14639 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14640 a 6-bit absolute RELA relocation used in DWARF debug sections. */
14643 is_6bit_abs_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14645 switch (filedata
->file_header
.e_machine
)
14648 return reloc_type
== 53; /* R_RISCV_SET6. */
14654 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14655 a 32-bit inplace add RELA relocation used in DWARF debug sections. */
14658 is_32bit_inplace_add_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14660 /* Please keep this table alpha-sorted for ease of visual lookup. */
14661 switch (filedata
->file_header
.e_machine
)
14664 return reloc_type
== 35; /* R_RISCV_ADD32. */
14670 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14671 a 32-bit inplace sub RELA relocation used in DWARF debug sections. */
14674 is_32bit_inplace_sub_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14676 /* Please keep this table alpha-sorted for ease of visual lookup. */
14677 switch (filedata
->file_header
.e_machine
)
14680 return reloc_type
== 39; /* R_RISCV_SUB32. */
14686 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14687 a 64-bit inplace add RELA relocation used in DWARF debug sections. */
14690 is_64bit_inplace_add_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14692 /* Please keep this table alpha-sorted for ease of visual lookup. */
14693 switch (filedata
->file_header
.e_machine
)
14696 return reloc_type
== 36; /* R_RISCV_ADD64. */
14702 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14703 a 64-bit inplace sub RELA relocation used in DWARF debug sections. */
14706 is_64bit_inplace_sub_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14708 /* Please keep this table alpha-sorted for ease of visual lookup. */
14709 switch (filedata
->file_header
.e_machine
)
14712 return reloc_type
== 40; /* R_RISCV_SUB64. */
14718 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14719 a 16-bit inplace add RELA relocation used in DWARF debug sections. */
14722 is_16bit_inplace_add_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14724 /* Please keep this table alpha-sorted for ease of visual lookup. */
14725 switch (filedata
->file_header
.e_machine
)
14728 return reloc_type
== 34; /* R_RISCV_ADD16. */
14734 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14735 a 16-bit inplace sub RELA relocation used in DWARF debug sections. */
14738 is_16bit_inplace_sub_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14740 /* Please keep this table alpha-sorted for ease of visual lookup. */
14741 switch (filedata
->file_header
.e_machine
)
14744 return reloc_type
== 38; /* R_RISCV_SUB16. */
14750 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14751 a 8-bit inplace add RELA relocation used in DWARF debug sections. */
14754 is_8bit_inplace_add_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14756 /* Please keep this table alpha-sorted for ease of visual lookup. */
14757 switch (filedata
->file_header
.e_machine
)
14760 return reloc_type
== 33; /* R_RISCV_ADD8. */
14766 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14767 a 8-bit inplace sub RELA relocation used in DWARF debug sections. */
14770 is_8bit_inplace_sub_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14772 /* Please keep this table alpha-sorted for ease of visual lookup. */
14773 switch (filedata
->file_header
.e_machine
)
14776 return reloc_type
== 37; /* R_RISCV_SUB8. */
14782 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
14783 a 6-bit inplace sub RELA relocation used in DWARF debug sections. */
14786 is_6bit_inplace_sub_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14788 switch (filedata
->file_header
.e_machine
)
14791 return reloc_type
== 52; /* R_RISCV_SUB6. */
14797 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
14798 relocation entries (possibly formerly used for SHT_GROUP sections). */
14801 is_none_reloc (Filedata
* filedata
, unsigned int reloc_type
)
14803 switch (filedata
->file_header
.e_machine
)
14805 case EM_386
: /* R_386_NONE. */
14806 case EM_68K
: /* R_68K_NONE. */
14807 case EM_ADAPTEVA_EPIPHANY
:
14808 case EM_ALPHA
: /* R_ALPHA_NONE. */
14809 case EM_ALTERA_NIOS2
: /* R_NIOS2_NONE. */
14810 case EM_ARC
: /* R_ARC_NONE. */
14811 case EM_ARC_COMPACT2
: /* R_ARC_NONE. */
14812 case EM_ARC_COMPACT
: /* R_ARC_NONE. */
14813 case EM_ARM
: /* R_ARM_NONE. */
14814 case EM_C166
: /* R_XC16X_NONE. */
14815 case EM_CRIS
: /* R_CRIS_NONE. */
14816 case EM_FT32
: /* R_FT32_NONE. */
14817 case EM_IA_64
: /* R_IA64_NONE. */
14818 case EM_K1OM
: /* R_X86_64_NONE. */
14819 case EM_L1OM
: /* R_X86_64_NONE. */
14820 case EM_M32R
: /* R_M32R_NONE. */
14821 case EM_MIPS
: /* R_MIPS_NONE. */
14822 case EM_MN10300
: /* R_MN10300_NONE. */
14823 case EM_MOXIE
: /* R_MOXIE_NONE. */
14824 case EM_NIOS32
: /* R_NIOS_NONE. */
14825 case EM_OR1K
: /* R_OR1K_NONE. */
14826 case EM_PARISC
: /* R_PARISC_NONE. */
14827 case EM_PPC64
: /* R_PPC64_NONE. */
14828 case EM_PPC
: /* R_PPC_NONE. */
14829 case EM_RISCV
: /* R_RISCV_NONE. */
14830 case EM_S390
: /* R_390_NONE. */
14832 case EM_SH
: /* R_SH_NONE. */
14833 case EM_SPARC32PLUS
:
14834 case EM_SPARC
: /* R_SPARC_NONE. */
14836 case EM_TILEGX
: /* R_TILEGX_NONE. */
14837 case EM_TILEPRO
: /* R_TILEPRO_NONE. */
14838 case EM_TI_C6000
:/* R_C6000_NONE. */
14839 case EM_X86_64
: /* R_X86_64_NONE. */
14841 case EM_Z80
: /* R_Z80_NONE. */
14842 case EM_WEBASSEMBLY
: /* R_WASM32_NONE. */
14843 return reloc_type
== 0;
14846 return reloc_type
== 0 || reloc_type
== 256;
14849 return (reloc_type
== 0 /* R_AVR_NONE. */
14850 || reloc_type
== 30 /* R_AVR_DIFF8. */
14851 || reloc_type
== 31 /* R_AVR_DIFF16. */
14852 || reloc_type
== 32 /* R_AVR_DIFF32. */);
14854 return reloc_type
== 3; /* R_METAG_NONE. */
14856 return (reloc_type
== 0 /* R_NDS32_NONE. */
14857 || reloc_type
== 205 /* R_NDS32_DIFF8. */
14858 || reloc_type
== 206 /* R_NDS32_DIFF16. */
14859 || reloc_type
== 207 /* R_NDS32_DIFF32. */
14860 || reloc_type
== 208 /* R_NDS32_DIFF_ULEB128. */);
14862 return (reloc_type
== 0 /* R_PRU_NONE. */
14863 || reloc_type
== 65 /* R_PRU_DIFF8. */
14864 || reloc_type
== 66 /* R_PRU_DIFF16. */
14865 || reloc_type
== 67 /* R_PRU_DIFF32. */);
14866 case EM_XTENSA_OLD
:
14868 return (reloc_type
== 0 /* R_XTENSA_NONE. */
14869 || reloc_type
== 17 /* R_XTENSA_DIFF8. */
14870 || reloc_type
== 18 /* R_XTENSA_DIFF16. */
14871 || reloc_type
== 19 /* R_XTENSA_DIFF32. */
14872 || reloc_type
== 57 /* R_XTENSA_PDIFF8. */
14873 || reloc_type
== 58 /* R_XTENSA_PDIFF16. */
14874 || reloc_type
== 59 /* R_XTENSA_PDIFF32. */
14875 || reloc_type
== 60 /* R_XTENSA_NDIFF8. */
14876 || reloc_type
== 61 /* R_XTENSA_NDIFF16. */
14877 || reloc_type
== 62 /* R_XTENSA_NDIFF32. */);
14882 /* Returns TRUE if there is a relocation against
14883 section NAME at OFFSET bytes. */
14886 reloc_at (struct dwarf_section
* dsec
, dwarf_vma offset
)
14888 Elf_Internal_Rela
* relocs
;
14889 Elf_Internal_Rela
* rp
;
14891 if (dsec
== NULL
|| dsec
->reloc_info
== NULL
)
14894 relocs
= (Elf_Internal_Rela
*) dsec
->reloc_info
;
14896 for (rp
= relocs
; rp
< relocs
+ dsec
->num_relocs
; ++rp
)
14897 if (rp
->r_offset
== offset
)
14903 /* Apply relocations to a section.
14904 Returns TRUE upon success, FALSE otherwise.
14905 If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
14906 It is then the caller's responsibility to free them. NUM_RELOCS_RETURN
14907 will be set to the number of relocs loaded.
14909 Note: So far support has been added only for those relocations
14910 which can be found in debug sections. FIXME: Add support for
14911 more relocations ? */
14914 apply_relocations (Filedata
* filedata
,
14915 const Elf_Internal_Shdr
* section
,
14916 unsigned char * start
,
14917 bfd_size_type size
,
14918 void ** relocs_return
,
14919 unsigned long * num_relocs_return
)
14921 Elf_Internal_Shdr
* relsec
;
14922 unsigned char * end
= start
+ size
;
14924 if (relocs_return
!= NULL
)
14926 * (Elf_Internal_Rela
**) relocs_return
= NULL
;
14927 * num_relocs_return
= 0;
14930 if (filedata
->file_header
.e_type
!= ET_REL
)
14931 /* No relocs to apply. */
14934 /* Find the reloc section associated with the section. */
14935 for (relsec
= filedata
->section_headers
;
14936 relsec
< filedata
->section_headers
+ filedata
->file_header
.e_shnum
;
14940 unsigned long num_relocs
;
14941 Elf_Internal_Rela
* relocs
;
14942 Elf_Internal_Rela
* rp
;
14943 Elf_Internal_Shdr
* symsec
;
14944 Elf_Internal_Sym
* symtab
;
14945 unsigned long num_syms
;
14946 Elf_Internal_Sym
* sym
;
14948 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
14949 || relsec
->sh_info
>= filedata
->file_header
.e_shnum
14950 || filedata
->section_headers
+ relsec
->sh_info
!= section
14951 || relsec
->sh_size
== 0
14952 || relsec
->sh_link
>= filedata
->file_header
.e_shnum
)
14955 symsec
= filedata
->section_headers
+ relsec
->sh_link
;
14956 if (symsec
->sh_type
!= SHT_SYMTAB
14957 && symsec
->sh_type
!= SHT_DYNSYM
)
14960 is_rela
= relsec
->sh_type
== SHT_RELA
;
14964 if (!slurp_rela_relocs (filedata
, relsec
->sh_offset
,
14965 relsec
->sh_size
, & relocs
, & num_relocs
))
14970 if (!slurp_rel_relocs (filedata
, relsec
->sh_offset
,
14971 relsec
->sh_size
, & relocs
, & num_relocs
))
14975 /* SH uses RELA but uses in place value instead of the addend field. */
14976 if (filedata
->file_header
.e_machine
== EM_SH
)
14979 symtab
= get_elf_symbols (filedata
, symsec
, & num_syms
);
14981 for (rp
= relocs
; rp
< relocs
+ num_relocs
; ++rp
)
14984 unsigned int reloc_type
;
14985 unsigned int reloc_size
;
14986 bool reloc_inplace
= false;
14987 bool reloc_subtract
= false;
14988 unsigned char *rloc
;
14989 unsigned long sym_index
;
14991 reloc_type
= get_reloc_type (filedata
, rp
->r_info
);
14993 if (target_specific_reloc_handling (filedata
, rp
, start
, end
, symtab
, num_syms
))
14995 else if (is_none_reloc (filedata
, reloc_type
))
14997 else if (is_32bit_abs_reloc (filedata
, reloc_type
)
14998 || is_32bit_pcrel_reloc (filedata
, reloc_type
))
15000 else if (is_64bit_abs_reloc (filedata
, reloc_type
)
15001 || is_64bit_pcrel_reloc (filedata
, reloc_type
))
15003 else if (is_24bit_abs_reloc (filedata
, reloc_type
))
15005 else if (is_16bit_abs_reloc (filedata
, reloc_type
))
15007 else if (is_8bit_abs_reloc (filedata
, reloc_type
)
15008 || is_6bit_abs_reloc (filedata
, reloc_type
))
15010 else if ((reloc_subtract
= is_32bit_inplace_sub_reloc (filedata
,
15012 || is_32bit_inplace_add_reloc (filedata
, reloc_type
))
15015 reloc_inplace
= true;
15017 else if ((reloc_subtract
= is_64bit_inplace_sub_reloc (filedata
,
15019 || is_64bit_inplace_add_reloc (filedata
, reloc_type
))
15022 reloc_inplace
= true;
15024 else if ((reloc_subtract
= is_16bit_inplace_sub_reloc (filedata
,
15026 || is_16bit_inplace_add_reloc (filedata
, reloc_type
))
15029 reloc_inplace
= true;
15031 else if ((reloc_subtract
= is_8bit_inplace_sub_reloc (filedata
,
15033 || is_8bit_inplace_add_reloc (filedata
, reloc_type
))
15036 reloc_inplace
= true;
15038 else if ((reloc_subtract
= is_6bit_inplace_sub_reloc (filedata
,
15042 reloc_inplace
= true;
15046 static unsigned int prev_reloc
= 0;
15048 if (reloc_type
!= prev_reloc
)
15049 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
15050 reloc_type
, printable_section_name (filedata
, section
));
15051 prev_reloc
= reloc_type
;
15055 rloc
= start
+ rp
->r_offset
;
15056 if (!IN_RANGE (start
, end
, rloc
, reloc_size
))
15058 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
15059 (unsigned long) rp
->r_offset
,
15060 printable_section_name (filedata
, section
));
15064 sym_index
= (unsigned long) get_reloc_symindex (rp
->r_info
);
15065 if (sym_index
>= num_syms
)
15067 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
15068 sym_index
, printable_section_name (filedata
, section
));
15071 sym
= symtab
+ sym_index
;
15073 /* If the reloc has a symbol associated with it,
15074 make sure that it is of an appropriate type.
15076 Relocations against symbols without type can happen.
15077 Gcc -feliminate-dwarf2-dups may generate symbols
15078 without type for debug info.
15080 Icc generates relocations against function symbols
15081 instead of local labels.
15083 Relocations against object symbols can happen, eg when
15084 referencing a global array. For an example of this see
15085 the _clz.o binary in libgcc.a. */
15087 && ELF_ST_TYPE (sym
->st_info
) != STT_COMMON
15088 && ELF_ST_TYPE (sym
->st_info
) > STT_SECTION
)
15090 warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
15091 get_symbol_type (filedata
, ELF_ST_TYPE (sym
->st_info
)),
15092 printable_section_name (filedata
, relsec
),
15093 (long int)(rp
- relocs
));
15099 addend
+= rp
->r_addend
;
15100 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
15101 partial_inplace. */
15103 || (filedata
->file_header
.e_machine
== EM_XTENSA
15104 && reloc_type
== 1)
15105 || ((filedata
->file_header
.e_machine
== EM_PJ
15106 || filedata
->file_header
.e_machine
== EM_PJ_OLD
)
15107 && reloc_type
== 1)
15108 || ((filedata
->file_header
.e_machine
== EM_D30V
15109 || filedata
->file_header
.e_machine
== EM_CYGNUS_D30V
)
15110 && reloc_type
== 12)
15113 if (is_6bit_inplace_sub_reloc (filedata
, reloc_type
))
15114 addend
+= byte_get (rloc
, reloc_size
) & 0x3f;
15116 addend
+= byte_get (rloc
, reloc_size
);
15119 if (is_32bit_pcrel_reloc (filedata
, reloc_type
)
15120 || is_64bit_pcrel_reloc (filedata
, reloc_type
))
15122 /* On HPPA, all pc-relative relocations are biased by 8. */
15123 if (filedata
->file_header
.e_machine
== EM_PARISC
)
15125 byte_put (rloc
, (addend
+ sym
->st_value
) - rp
->r_offset
,
15128 else if (is_6bit_abs_reloc (filedata
, reloc_type
)
15129 || is_6bit_inplace_sub_reloc (filedata
, reloc_type
))
15131 if (reloc_subtract
)
15132 addend
-= sym
->st_value
;
15134 addend
+= sym
->st_value
;
15135 addend
= (addend
& 0x3f) | (byte_get (rloc
, reloc_size
) & 0xc0);
15136 byte_put (rloc
, addend
, reloc_size
);
15138 else if (reloc_subtract
)
15139 byte_put (rloc
, addend
- sym
->st_value
, reloc_size
);
15141 byte_put (rloc
, addend
+ sym
->st_value
, reloc_size
);
15145 /* Let the target specific reloc processing code know that
15146 we have finished with these relocs. */
15147 target_specific_reloc_handling (filedata
, NULL
, NULL
, NULL
, NULL
, 0);
15151 * (Elf_Internal_Rela
**) relocs_return
= relocs
;
15152 * num_relocs_return
= num_relocs
;
15163 #ifdef SUPPORT_DISASSEMBLY
15165 disassemble_section (Elf_Internal_Shdr
* section
, Filedata
* filedata
)
15167 printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata
, section
));
15169 /* FIXME: XXX -- to be done --- XXX */
15175 /* Reads in the contents of SECTION from FILE, returning a pointer
15176 to a malloc'ed buffer or NULL if something went wrong. */
15179 get_section_contents (Elf_Internal_Shdr
* section
, Filedata
* filedata
)
15181 bfd_size_type num_bytes
= section
->sh_size
;
15183 if (num_bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
15185 printf (_("Section '%s' has no data to dump.\n"),
15186 printable_section_name (filedata
, section
));
15190 return (char *) get_data (NULL
, filedata
, section
->sh_offset
, 1, num_bytes
,
15191 _("section contents"));
15194 /* Uncompresses a section that was compressed using zlib, in place. */
15197 uncompress_section_contents (unsigned char ** buffer
,
15198 dwarf_size_type uncompressed_size
,
15199 dwarf_size_type
* size
)
15201 dwarf_size_type compressed_size
= *size
;
15202 unsigned char * compressed_buffer
= *buffer
;
15203 unsigned char * uncompressed_buffer
;
15207 /* It is possible the section consists of several compressed
15208 buffers concatenated together, so we uncompress in a loop. */
15209 /* PR 18313: The state field in the z_stream structure is supposed
15210 to be invisible to the user (ie us), but some compilers will
15211 still complain about it being used without initialisation. So
15212 we first zero the entire z_stream structure and then set the fields
15214 memset (& strm
, 0, sizeof strm
);
15215 strm
.avail_in
= compressed_size
;
15216 strm
.next_in
= (Bytef
*) compressed_buffer
;
15217 strm
.avail_out
= uncompressed_size
;
15218 uncompressed_buffer
= (unsigned char *) xmalloc (uncompressed_size
);
15220 rc
= inflateInit (& strm
);
15221 while (strm
.avail_in
> 0)
15225 strm
.next_out
= ((Bytef
*) uncompressed_buffer
15226 + (uncompressed_size
- strm
.avail_out
));
15227 rc
= inflate (&strm
, Z_FINISH
);
15228 if (rc
!= Z_STREAM_END
)
15230 rc
= inflateReset (& strm
);
15232 if (inflateEnd (& strm
) != Z_OK
15234 || strm
.avail_out
!= 0)
15237 *buffer
= uncompressed_buffer
;
15238 *size
= uncompressed_size
;
15242 free (uncompressed_buffer
);
15243 /* Indicate decompression failure. */
15249 dump_section_as_strings (Elf_Internal_Shdr
* section
, Filedata
* filedata
)
15251 Elf_Internal_Shdr
*relsec
;
15252 bfd_size_type num_bytes
;
15253 unsigned char *data
;
15254 unsigned char *end
;
15255 unsigned char *real_start
;
15256 unsigned char *start
;
15257 bool some_strings_shown
;
15259 real_start
= start
= (unsigned char *) get_section_contents (section
, filedata
);
15261 /* PR 21820: Do not fail if the section was empty. */
15262 return section
->sh_size
== 0 || section
->sh_type
== SHT_NOBITS
;
15264 num_bytes
= section
->sh_size
;
15266 if (filedata
->is_separate
)
15267 printf (_("\nString dump of section '%s' in linked file %s:\n"),
15268 printable_section_name (filedata
, section
),
15269 filedata
->file_name
);
15271 printf (_("\nString dump of section '%s':\n"),
15272 printable_section_name (filedata
, section
));
15274 if (decompress_dumps
)
15276 dwarf_size_type new_size
= num_bytes
;
15277 dwarf_size_type uncompressed_size
= 0;
15279 if ((section
->sh_flags
& SHF_COMPRESSED
) != 0)
15281 Elf_Internal_Chdr chdr
;
15282 unsigned int compression_header_size
15283 = get_compression_header (& chdr
, (unsigned char *) start
,
15285 if (compression_header_size
== 0)
15286 /* An error message will have already been generated
15287 by get_compression_header. */
15290 if (chdr
.ch_type
!= ELFCOMPRESS_ZLIB
)
15292 warn (_("section '%s' has unsupported compress type: %d\n"),
15293 printable_section_name (filedata
, section
), chdr
.ch_type
);
15296 uncompressed_size
= chdr
.ch_size
;
15297 start
+= compression_header_size
;
15298 new_size
-= compression_header_size
;
15300 else if (new_size
> 12 && streq ((char *) start
, "ZLIB"))
15302 /* Read the zlib header. In this case, it should be "ZLIB"
15303 followed by the uncompressed section size, 8 bytes in
15304 big-endian order. */
15305 uncompressed_size
= start
[4]; uncompressed_size
<<= 8;
15306 uncompressed_size
+= start
[5]; uncompressed_size
<<= 8;
15307 uncompressed_size
+= start
[6]; uncompressed_size
<<= 8;
15308 uncompressed_size
+= start
[7]; uncompressed_size
<<= 8;
15309 uncompressed_size
+= start
[8]; uncompressed_size
<<= 8;
15310 uncompressed_size
+= start
[9]; uncompressed_size
<<= 8;
15311 uncompressed_size
+= start
[10]; uncompressed_size
<<= 8;
15312 uncompressed_size
+= start
[11];
15317 if (uncompressed_size
)
15319 if (uncompress_section_contents (& start
,
15320 uncompressed_size
, & new_size
))
15321 num_bytes
= new_size
;
15324 error (_("Unable to decompress section %s\n"),
15325 printable_section_name (filedata
, section
));
15330 start
= real_start
;
15333 /* If the section being dumped has relocations against it the user might
15334 be expecting these relocations to have been applied. Check for this
15335 case and issue a warning message in order to avoid confusion.
15336 FIXME: Maybe we ought to have an option that dumps a section with
15337 relocs applied ? */
15338 for (relsec
= filedata
->section_headers
;
15339 relsec
< filedata
->section_headers
+ filedata
->file_header
.e_shnum
;
15342 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
15343 || relsec
->sh_info
>= filedata
->file_header
.e_shnum
15344 || filedata
->section_headers
+ relsec
->sh_info
!= section
15345 || relsec
->sh_size
== 0
15346 || relsec
->sh_link
>= filedata
->file_header
.e_shnum
)
15349 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
15354 end
= start
+ num_bytes
;
15355 some_strings_shown
= false;
15357 #ifdef HAVE_MBSTATE_T
15359 /* Initialise the multibyte conversion state. */
15360 memset (& state
, 0, sizeof (state
));
15363 bool continuing
= false;
15367 while (!ISPRINT (* data
))
15368 if (++ data
>= end
)
15373 size_t maxlen
= end
- data
;
15378 continuing
= false;
15382 printf (" [%6lx] ", (unsigned long) (data
- start
));
15396 /* PR 25543: Treat new-lines as string-ending characters. */
15405 /* Do not print control characters directly as they can affect terminal
15406 settings. Such characters usually appear in the names generated
15407 by the assembler for local labels. */
15410 printf ("^%c", c
+ 0x40);
15412 else if (ISPRINT (c
))
15419 #ifdef HAVE_MBSTATE_T
15422 /* Let printf do the hard work of displaying multibyte characters. */
15423 printf ("%.1s", data
- 1);
15424 #ifdef HAVE_MBSTATE_T
15425 /* Try to find out how many bytes made up the character that was
15426 just printed. Advance the symbol pointer past the bytes that
15428 n
= mbrtowc (& w
, (char *)(data
- 1), MB_CUR_MAX
, & state
);
15432 if (n
!= (size_t) -1 && n
!= (size_t) -2 && n
> 0)
15442 printf (_("<corrupt>\n"));
15445 some_strings_shown
= true;
15449 if (! some_strings_shown
)
15450 printf (_(" No strings found in this section."));
15463 dump_section_as_bytes (Elf_Internal_Shdr
*section
,
15464 Filedata
*filedata
,
15467 Elf_Internal_Shdr
* relsec
;
15468 bfd_size_type bytes
;
15469 bfd_size_type section_size
;
15471 unsigned char * data
;
15472 unsigned char * real_start
;
15473 unsigned char * start
;
15475 real_start
= start
= (unsigned char *) get_section_contents (section
, filedata
);
15477 /* PR 21820: Do not fail if the section was empty. */
15478 return section
->sh_size
== 0 || section
->sh_type
== SHT_NOBITS
;
15480 section_size
= section
->sh_size
;
15482 if (filedata
->is_separate
)
15483 printf (_("\nHex dump of section '%s' in linked file %s:\n"),
15484 printable_section_name (filedata
, section
),
15485 filedata
->file_name
);
15487 printf (_("\nHex dump of section '%s':\n"),
15488 printable_section_name (filedata
, section
));
15490 if (decompress_dumps
)
15492 dwarf_size_type new_size
= section_size
;
15493 dwarf_size_type uncompressed_size
= 0;
15495 if ((section
->sh_flags
& SHF_COMPRESSED
) != 0)
15497 Elf_Internal_Chdr chdr
;
15498 unsigned int compression_header_size
15499 = get_compression_header (& chdr
, start
, section_size
);
15501 if (compression_header_size
== 0)
15502 /* An error message will have already been generated
15503 by get_compression_header. */
15506 if (chdr
.ch_type
!= ELFCOMPRESS_ZLIB
)
15508 warn (_("section '%s' has unsupported compress type: %d\n"),
15509 printable_section_name (filedata
, section
), chdr
.ch_type
);
15512 uncompressed_size
= chdr
.ch_size
;
15513 start
+= compression_header_size
;
15514 new_size
-= compression_header_size
;
15516 else if (new_size
> 12 && streq ((char *) start
, "ZLIB"))
15518 /* Read the zlib header. In this case, it should be "ZLIB"
15519 followed by the uncompressed section size, 8 bytes in
15520 big-endian order. */
15521 uncompressed_size
= start
[4]; uncompressed_size
<<= 8;
15522 uncompressed_size
+= start
[5]; uncompressed_size
<<= 8;
15523 uncompressed_size
+= start
[6]; uncompressed_size
<<= 8;
15524 uncompressed_size
+= start
[7]; uncompressed_size
<<= 8;
15525 uncompressed_size
+= start
[8]; uncompressed_size
<<= 8;
15526 uncompressed_size
+= start
[9]; uncompressed_size
<<= 8;
15527 uncompressed_size
+= start
[10]; uncompressed_size
<<= 8;
15528 uncompressed_size
+= start
[11];
15533 if (uncompressed_size
)
15535 if (uncompress_section_contents (& start
, uncompressed_size
,
15538 section_size
= new_size
;
15542 error (_("Unable to decompress section %s\n"),
15543 printable_section_name (filedata
, section
));
15544 /* FIXME: Print the section anyway ? */
15549 start
= real_start
;
15554 if (! apply_relocations (filedata
, section
, start
, section_size
, NULL
, NULL
))
15559 /* If the section being dumped has relocations against it the user might
15560 be expecting these relocations to have been applied. Check for this
15561 case and issue a warning message in order to avoid confusion.
15562 FIXME: Maybe we ought to have an option that dumps a section with
15563 relocs applied ? */
15564 for (relsec
= filedata
->section_headers
;
15565 relsec
< filedata
->section_headers
+ filedata
->file_header
.e_shnum
;
15568 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
15569 || relsec
->sh_info
>= filedata
->file_header
.e_shnum
15570 || filedata
->section_headers
+ relsec
->sh_info
!= section
15571 || relsec
->sh_size
== 0
15572 || relsec
->sh_link
>= filedata
->file_header
.e_shnum
)
15575 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
15580 addr
= section
->sh_addr
;
15581 bytes
= section_size
;
15590 lbytes
= (bytes
> 16 ? 16 : bytes
);
15592 printf (" 0x%8.8lx ", (unsigned long) addr
);
15594 for (j
= 0; j
< 16; j
++)
15597 printf ("%2.2x", data
[j
]);
15605 for (j
= 0; j
< lbytes
; j
++)
15608 if (k
>= ' ' && k
< 0x7f)
15631 #ifdef ENABLE_LIBCTF
15632 static ctf_sect_t
*
15633 shdr_to_ctf_sect (ctf_sect_t
*buf
, Elf_Internal_Shdr
*shdr
, Filedata
*filedata
)
15635 buf
->cts_name
= section_name_print (filedata
, shdr
);
15636 buf
->cts_size
= shdr
->sh_size
;
15637 buf
->cts_entsize
= shdr
->sh_entsize
;
15642 /* Formatting callback function passed to ctf_dump. Returns either the pointer
15643 it is passed, or a pointer to newly-allocated storage, in which case
15644 dump_ctf() will free it when it no longer needs it. */
15647 dump_ctf_indent_lines (ctf_sect_names_t sect ATTRIBUTE_UNUSED
,
15648 char *s
, void *arg
)
15650 const char *blanks
= arg
;
15653 if (asprintf (&new_s
, "%s%s", blanks
, s
) < 0)
15658 /* Dump CTF errors/warnings. */
15660 dump_ctf_errs (ctf_dict_t
*fp
)
15662 ctf_next_t
*it
= NULL
;
15667 /* Dump accumulated errors and warnings. */
15668 while ((errtext
= ctf_errwarning_next (fp
, &it
, &is_warning
, &err
)) != NULL
)
15670 error (_("%s: %s"), is_warning
? _("warning"): _("error"),
15674 if (err
!= ECTF_NEXT_END
)
15675 error (_("CTF error: cannot get CTF errors: `%s'"), ctf_errmsg (err
));
15678 /* Dump one CTF archive member. */
15681 dump_ctf_archive_member (ctf_dict_t
*ctf
, const char *name
, ctf_dict_t
*parent
,
15684 const char *things
[] = {"Header", "Labels", "Data objects",
15685 "Function objects", "Variables", "Types", "Strings",
15687 const char **thing
;
15690 /* Don't print out the name of the default-named archive member if it appears
15691 first in the list. The name .ctf appears everywhere, even for things that
15692 aren't really archives, so printing it out is liable to be confusing; also,
15693 the common case by far is for only one archive member to exist, and hiding
15694 it in that case seems worthwhile. */
15696 if (strcmp (name
, ".ctf") != 0 || member
!= 0)
15697 printf (_("\nCTF archive member: %s:\n"), name
);
15699 if (ctf_parent_name (ctf
) != NULL
)
15700 ctf_import (ctf
, parent
);
15702 for (i
= 0, thing
= things
; *thing
[0]; thing
++, i
++)
15704 ctf_dump_state_t
*s
= NULL
;
15707 printf ("\n %s:\n", *thing
);
15708 while ((item
= ctf_dump (ctf
, &s
, i
, dump_ctf_indent_lines
,
15709 (void *) " ")) != NULL
)
15711 printf ("%s\n", item
);
15715 if (ctf_errno (ctf
))
15717 error (_("Iteration failed: %s, %s\n"), *thing
,
15718 ctf_errmsg (ctf_errno (ctf
)));
15723 dump_ctf_errs (ctf
);
15727 dump_section_as_ctf (Elf_Internal_Shdr
* section
, Filedata
* filedata
)
15729 Elf_Internal_Shdr
* symtab_sec
= NULL
;
15730 Elf_Internal_Shdr
* strtab_sec
= NULL
;
15731 void * data
= NULL
;
15732 void * symdata
= NULL
;
15733 void * strdata
= NULL
;
15734 ctf_sect_t ctfsect
, symsect
, strsect
;
15735 ctf_sect_t
* symsectp
= NULL
;
15736 ctf_sect_t
* strsectp
= NULL
;
15737 ctf_archive_t
* ctfa
= NULL
;
15738 ctf_dict_t
* parent
= NULL
;
15741 ctf_next_t
*i
= NULL
;
15747 shdr_to_ctf_sect (&ctfsect
, section
, filedata
);
15748 data
= get_section_contents (section
, filedata
);
15749 ctfsect
.cts_data
= data
;
15751 if (!dump_ctf_symtab_name
)
15752 dump_ctf_symtab_name
= strdup (".dynsym");
15754 if (!dump_ctf_strtab_name
)
15755 dump_ctf_strtab_name
= strdup (".dynstr");
15757 if (dump_ctf_symtab_name
&& dump_ctf_symtab_name
[0] != 0)
15759 if ((symtab_sec
= find_section (filedata
, dump_ctf_symtab_name
)) == NULL
)
15761 error (_("No symbol section named %s\n"), dump_ctf_symtab_name
);
15764 if ((symdata
= (void *) get_data (NULL
, filedata
,
15765 symtab_sec
->sh_offset
, 1,
15766 symtab_sec
->sh_size
,
15767 _("symbols"))) == NULL
)
15769 symsectp
= shdr_to_ctf_sect (&symsect
, symtab_sec
, filedata
);
15770 symsect
.cts_data
= symdata
;
15773 if (dump_ctf_strtab_name
&& dump_ctf_strtab_name
[0] != 0)
15775 if ((strtab_sec
= find_section (filedata
, dump_ctf_strtab_name
)) == NULL
)
15777 error (_("No string table section named %s\n"),
15778 dump_ctf_strtab_name
);
15781 if ((strdata
= (void *) get_data (NULL
, filedata
,
15782 strtab_sec
->sh_offset
, 1,
15783 strtab_sec
->sh_size
,
15784 _("strings"))) == NULL
)
15786 strsectp
= shdr_to_ctf_sect (&strsect
, strtab_sec
, filedata
);
15787 strsect
.cts_data
= strdata
;
15790 /* Load the CTF file and dump it. It may be a raw CTF section, or an archive:
15791 libctf papers over the difference, so we can pretend it is always an
15794 if ((ctfa
= ctf_arc_bufopen (&ctfsect
, symsectp
, strsectp
, &err
)) == NULL
)
15796 dump_ctf_errs (NULL
);
15797 error (_("CTF open failure: %s\n"), ctf_errmsg (err
));
15801 ctf_arc_symsect_endianness (ctfa
, filedata
->file_header
.e_ident
[EI_DATA
]
15804 /* Preload the parent dict, since it will need to be imported into every
15806 if ((parent
= ctf_dict_open (ctfa
, dump_ctf_parent_name
, &err
)) == NULL
)
15808 dump_ctf_errs (NULL
);
15809 error (_("CTF open failure: %s\n"), ctf_errmsg (err
));
15815 if (filedata
->is_separate
)
15816 printf (_("\nDump of CTF section '%s' in linked file %s:\n"),
15817 printable_section_name (filedata
, section
),
15818 filedata
->file_name
);
15820 printf (_("\nDump of CTF section '%s':\n"),
15821 printable_section_name (filedata
, section
));
15823 while ((fp
= ctf_archive_next (ctfa
, &i
, &name
, 0, &err
)) != NULL
)
15824 dump_ctf_archive_member (fp
, name
, parent
, member
++);
15825 if (err
!= ECTF_NEXT_END
)
15827 dump_ctf_errs (NULL
);
15828 error (_("CTF member open failure: %s\n"), ctf_errmsg (err
));
15833 ctf_dict_close (parent
);
15843 load_specific_debug_section (enum dwarf_section_display_enum debug
,
15844 const Elf_Internal_Shdr
* sec
,
15847 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
15849 Filedata
* filedata
= (Filedata
*) data
;
15851 if (section
->start
!= NULL
)
15853 /* If it is already loaded, do nothing. */
15854 if (streq (section
->filename
, filedata
->file_name
))
15856 free (section
->start
);
15859 snprintf (buf
, sizeof (buf
), _("%s section data"), section
->name
);
15860 section
->address
= sec
->sh_addr
;
15861 section
->filename
= filedata
->file_name
;
15862 section
->start
= (unsigned char *) get_data (NULL
, filedata
,
15864 sec
->sh_size
, buf
);
15865 if (section
->start
== NULL
)
15869 unsigned char *start
= section
->start
;
15870 dwarf_size_type size
= sec
->sh_size
;
15871 dwarf_size_type uncompressed_size
= 0;
15873 if ((sec
->sh_flags
& SHF_COMPRESSED
) != 0)
15875 Elf_Internal_Chdr chdr
;
15876 unsigned int compression_header_size
;
15878 if (size
< (is_32bit_elf
15879 ? sizeof (Elf32_External_Chdr
)
15880 : sizeof (Elf64_External_Chdr
)))
15882 warn (_("compressed section %s is too small to contain a compression header\n"),
15887 compression_header_size
= get_compression_header (&chdr
, start
, size
);
15888 if (compression_header_size
== 0)
15889 /* An error message will have already been generated
15890 by get_compression_header. */
15893 if (chdr
.ch_type
!= ELFCOMPRESS_ZLIB
)
15895 warn (_("section '%s' has unsupported compress type: %d\n"),
15896 section
->name
, chdr
.ch_type
);
15899 uncompressed_size
= chdr
.ch_size
;
15900 start
+= compression_header_size
;
15901 size
-= compression_header_size
;
15903 else if (size
> 12 && streq ((char *) start
, "ZLIB"))
15905 /* Read the zlib header. In this case, it should be "ZLIB"
15906 followed by the uncompressed section size, 8 bytes in
15907 big-endian order. */
15908 uncompressed_size
= start
[4]; uncompressed_size
<<= 8;
15909 uncompressed_size
+= start
[5]; uncompressed_size
<<= 8;
15910 uncompressed_size
+= start
[6]; uncompressed_size
<<= 8;
15911 uncompressed_size
+= start
[7]; uncompressed_size
<<= 8;
15912 uncompressed_size
+= start
[8]; uncompressed_size
<<= 8;
15913 uncompressed_size
+= start
[9]; uncompressed_size
<<= 8;
15914 uncompressed_size
+= start
[10]; uncompressed_size
<<= 8;
15915 uncompressed_size
+= start
[11];
15920 if (uncompressed_size
)
15922 if (uncompress_section_contents (&start
, uncompressed_size
,
15925 /* Free the compressed buffer, update the section buffer
15926 and the section size if uncompress is successful. */
15927 free (section
->start
);
15928 section
->start
= start
;
15932 error (_("Unable to decompress section %s\n"),
15933 printable_section_name (filedata
, sec
));
15938 section
->size
= size
;
15941 if (section
->start
== NULL
)
15944 if (debug_displays
[debug
].relocate
)
15946 if (! apply_relocations (filedata
, sec
, section
->start
, section
->size
,
15947 & section
->reloc_info
, & section
->num_relocs
))
15952 section
->reloc_info
= NULL
;
15953 section
->num_relocs
= 0;
15959 #if HAVE_LIBDEBUGINFOD
15960 /* Return a hex string representation of the build-id. */
15962 get_build_id (void * data
)
15964 Filedata
* filedata
= (Filedata
*) data
;
15965 Elf_Internal_Shdr
* shdr
;
15968 /* Iterate through notes to find note.gnu.build-id.
15969 FIXME: Only the first note in any note section is examined. */
15970 for (i
= 0, shdr
= filedata
->section_headers
;
15971 i
< filedata
->file_header
.e_shnum
&& shdr
!= NULL
;
15974 if (shdr
->sh_type
!= SHT_NOTE
)
15979 size_t data_remaining
;
15981 Elf_External_Note
* enote
;
15982 Elf_Internal_Note inote
;
15984 bfd_vma offset
= shdr
->sh_offset
;
15985 bfd_vma align
= shdr
->sh_addralign
;
15986 bfd_vma length
= shdr
->sh_size
;
15988 enote
= (Elf_External_Note
*) get_section_contents (shdr
, filedata
);
15994 else if (align
!= 4 && align
!= 8)
16000 end
= (char *) enote
+ length
;
16001 data_remaining
= end
- (char *) enote
;
16003 if (!is_ia64_vms (filedata
))
16005 min_notesz
= offsetof (Elf_External_Note
, name
);
16006 if (data_remaining
< min_notesz
)
16009 malformed note encountered in section %s whilst scanning for build-id note\n"),
16010 printable_section_name (filedata
, shdr
));
16014 data_remaining
-= min_notesz
;
16016 inote
.type
= BYTE_GET (enote
->type
);
16017 inote
.namesz
= BYTE_GET (enote
->namesz
);
16018 inote
.namedata
= enote
->name
;
16019 inote
.descsz
= BYTE_GET (enote
->descsz
);
16020 inote
.descdata
= ((char *) enote
16021 + ELF_NOTE_DESC_OFFSET (inote
.namesz
, align
));
16022 inote
.descpos
= offset
+ (inote
.descdata
- (char *) enote
);
16023 next
= ((char *) enote
16024 + ELF_NOTE_NEXT_OFFSET (inote
.namesz
, inote
.descsz
, align
));
16028 Elf64_External_VMS_Note
*vms_enote
;
16030 /* PR binutils/15191
16031 Make sure that there is enough data to read. */
16032 min_notesz
= offsetof (Elf64_External_VMS_Note
, name
);
16033 if (data_remaining
< min_notesz
)
16036 malformed note encountered in section %s whilst scanning for build-id note\n"),
16037 printable_section_name (filedata
, shdr
));
16041 data_remaining
-= min_notesz
;
16043 vms_enote
= (Elf64_External_VMS_Note
*) enote
;
16044 inote
.type
= BYTE_GET (vms_enote
->type
);
16045 inote
.namesz
= BYTE_GET (vms_enote
->namesz
);
16046 inote
.namedata
= vms_enote
->name
;
16047 inote
.descsz
= BYTE_GET (vms_enote
->descsz
);
16048 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 3);
16049 inote
.descpos
= offset
+ (inote
.descdata
- (char *) enote
);
16050 next
= inote
.descdata
+ align_power (inote
.descsz
, 3);
16053 /* Skip malformed notes. */
16054 if ((size_t) (inote
.descdata
- inote
.namedata
) < inote
.namesz
16055 || (size_t) (inote
.descdata
- inote
.namedata
) > data_remaining
16056 || (size_t) (next
- inote
.descdata
) < inote
.descsz
16057 || ((size_t) (next
- inote
.descdata
)
16058 > data_remaining
- (size_t) (inote
.descdata
- inote
.namedata
)))
16061 malformed note encountered in section %s whilst scanning for build-id note\n"),
16062 printable_section_name (filedata
, shdr
));
16067 /* Check if this is the build-id note. If so then convert the build-id
16068 bytes to a hex string. */
16069 if (inote
.namesz
> 0
16070 && startswith (inote
.namedata
, "GNU")
16071 && inote
.type
== NT_GNU_BUILD_ID
)
16076 build_id
= malloc (inote
.descsz
* 2 + 1);
16077 if (build_id
== NULL
)
16083 for (j
= 0; j
< inote
.descsz
; ++j
)
16084 sprintf (build_id
+ (j
* 2), "%02x", inote
.descdata
[j
] & 0xff);
16085 build_id
[inote
.descsz
* 2] = '\0';
16088 return (unsigned char *) build_id
;
16095 #endif /* HAVE_LIBDEBUGINFOD */
16097 /* If this is not NULL, load_debug_section will only look for sections
16098 within the list of sections given here. */
16099 static unsigned int * section_subset
= NULL
;
16102 load_debug_section (enum dwarf_section_display_enum debug
, void * data
)
16104 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
16105 Elf_Internal_Shdr
* sec
;
16106 Filedata
* filedata
= (Filedata
*) data
;
16108 if (!dump_any_debugging
)
16111 /* Without section headers we cannot find any sections. */
16112 if (filedata
->section_headers
== NULL
)
16115 if (filedata
->string_table
== NULL
16116 && filedata
->file_header
.e_shstrndx
!= SHN_UNDEF
16117 && filedata
->file_header
.e_shstrndx
< filedata
->file_header
.e_shnum
)
16119 Elf_Internal_Shdr
* strs
;
16121 /* Read in the string table, so that we have section names to scan. */
16122 strs
= filedata
->section_headers
+ filedata
->file_header
.e_shstrndx
;
16124 if (strs
!= NULL
&& strs
->sh_size
!= 0)
16126 filedata
->string_table
16127 = (char *) get_data (NULL
, filedata
, strs
->sh_offset
,
16128 1, strs
->sh_size
, _("string table"));
16130 filedata
->string_table_length
16131 = filedata
->string_table
!= NULL
? strs
->sh_size
: 0;
16135 /* Locate the debug section. */
16136 sec
= find_section_in_set (filedata
, section
->uncompressed_name
, section_subset
);
16138 section
->name
= section
->uncompressed_name
;
16141 sec
= find_section_in_set (filedata
, section
->compressed_name
, section_subset
);
16143 section
->name
= section
->compressed_name
;
16148 /* If we're loading from a subset of sections, and we've loaded
16149 a section matching this name before, it's likely that it's a
16151 if (section_subset
!= NULL
)
16152 free_debug_section (debug
);
16154 return load_specific_debug_section (debug
, sec
, data
);
16158 free_debug_section (enum dwarf_section_display_enum debug
)
16160 struct dwarf_section
* section
= &debug_displays
[debug
].section
;
16162 if (section
->start
== NULL
)
16165 free ((char *) section
->start
);
16166 section
->start
= NULL
;
16167 section
->address
= 0;
16170 free (section
->reloc_info
);
16171 section
->reloc_info
= NULL
;
16172 section
->num_relocs
= 0;
16176 display_debug_section (int shndx
, Elf_Internal_Shdr
* section
, Filedata
* filedata
)
16178 const char *name
= (section_name_valid (filedata
, section
)
16179 ? section_name (filedata
, section
) : "");
16180 const char *print_name
= printable_section_name (filedata
, section
);
16181 bfd_size_type length
;
16182 bool result
= true;
16185 length
= section
->sh_size
;
16188 printf (_("\nSection '%s' has no debugging data.\n"), print_name
);
16191 if (section
->sh_type
== SHT_NOBITS
)
16193 /* There is no point in dumping the contents of a debugging section
16194 which has the NOBITS type - the bits in the file will be random.
16195 This can happen when a file containing a .eh_frame section is
16196 stripped with the --only-keep-debug command line option. */
16197 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
16202 if (startswith (name
, ".gnu.linkonce.wi."))
16203 name
= ".debug_info";
16205 /* See if we know how to display the contents of this section. */
16206 for (i
= 0; i
< max
; i
++)
16208 enum dwarf_section_display_enum id
= (enum dwarf_section_display_enum
) i
;
16209 struct dwarf_section_display
* display
= debug_displays
+ i
;
16210 struct dwarf_section
* sec
= & display
->section
;
16212 if (streq (sec
->uncompressed_name
, name
)
16213 || (id
== line
&& startswith (name
, ".debug_line."))
16214 || streq (sec
->compressed_name
, name
))
16216 bool secondary
= (section
!= find_section (filedata
, name
));
16219 free_debug_section (id
);
16221 if (i
== line
&& startswith (name
, ".debug_line."))
16223 else if (streq (sec
->uncompressed_name
, name
))
16224 sec
->name
= sec
->uncompressed_name
;
16226 sec
->name
= sec
->compressed_name
;
16228 if (load_specific_debug_section (id
, section
, filedata
))
16230 /* If this debug section is part of a CU/TU set in a .dwp file,
16231 restrict load_debug_section to the sections in that set. */
16232 section_subset
= find_cu_tu_set (filedata
, shndx
);
16234 result
&= display
->display (sec
, filedata
);
16236 section_subset
= NULL
;
16238 if (secondary
|| (id
!= info
&& id
!= abbrev
&& id
!= debug_addr
))
16239 free_debug_section (id
);
16247 printf (_("Unrecognized debug section: %s\n"), print_name
);
16254 /* Set DUMP_SECTS for all sections where dumps were requested
16255 based on section name. */
16258 initialise_dumps_byname (Filedata
* filedata
)
16260 struct dump_list_entry
* cur
;
16262 for (cur
= dump_sects_byname
; cur
; cur
= cur
->next
)
16267 for (i
= 0; i
< filedata
->file_header
.e_shnum
; i
++)
16268 if (section_name_valid (filedata
, filedata
->section_headers
+ i
)
16269 && streq (section_name (filedata
, filedata
->section_headers
+ i
),
16272 request_dump_bynumber (&filedata
->dump
, i
, cur
->type
);
16276 if (!any
&& !filedata
->is_separate
)
16277 warn (_("Section '%s' was not dumped because it does not exist\n"),
16283 process_section_contents (Filedata
* filedata
)
16285 Elf_Internal_Shdr
* section
;
16292 initialise_dumps_byname (filedata
);
16294 for (i
= 0, section
= filedata
->section_headers
;
16295 i
< filedata
->file_header
.e_shnum
&& i
< filedata
->dump
.num_dump_sects
;
16298 dump_type dump
= filedata
->dump
.dump_sects
[i
];
16300 if (filedata
->is_separate
&& ! process_links
)
16301 dump
&= DEBUG_DUMP
;
16303 #ifdef SUPPORT_DISASSEMBLY
16304 if (dump
& DISASS_DUMP
)
16306 if (! disassemble_section (section
, filedata
))
16310 if (dump
& HEX_DUMP
)
16312 if (! dump_section_as_bytes (section
, filedata
, false))
16316 if (dump
& RELOC_DUMP
)
16318 if (! dump_section_as_bytes (section
, filedata
, true))
16322 if (dump
& STRING_DUMP
)
16324 if (! dump_section_as_strings (section
, filedata
))
16328 if (dump
& DEBUG_DUMP
)
16330 if (! display_debug_section (i
, section
, filedata
))
16334 #ifdef ENABLE_LIBCTF
16335 if (dump
& CTF_DUMP
)
16337 if (! dump_section_as_ctf (section
, filedata
))
16343 if (! filedata
->is_separate
)
16345 /* Check to see if the user requested a
16346 dump of a section that does not exist. */
16347 for (; i
< filedata
->dump
.num_dump_sects
; i
++)
16348 if (filedata
->dump
.dump_sects
[i
])
16350 warn (_("Section %d was not dumped because it does not exist!\n"), i
);
16359 process_mips_fpe_exception (int mask
)
16365 if (mask
& OEX_FPU_INEX
)
16366 fputs ("INEX", stdout
), first
= false;
16367 if (mask
& OEX_FPU_UFLO
)
16368 printf ("%sUFLO", first
? "" : "|"), first
= false;
16369 if (mask
& OEX_FPU_OFLO
)
16370 printf ("%sOFLO", first
? "" : "|"), first
= false;
16371 if (mask
& OEX_FPU_DIV0
)
16372 printf ("%sDIV0", first
? "" : "|"), first
= false;
16373 if (mask
& OEX_FPU_INVAL
)
16374 printf ("%sINVAL", first
? "" : "|");
16377 fputs ("0", stdout
);
16380 /* Display's the value of TAG at location P. If TAG is
16381 greater than 0 it is assumed to be an unknown tag, and
16382 a message is printed to this effect. Otherwise it is
16383 assumed that a message has already been printed.
16385 If the bottom bit of TAG is set it assumed to have a
16386 string value, otherwise it is assumed to have an integer
16389 Returns an updated P pointing to the first unread byte
16390 beyond the end of TAG's value.
16392 Reads at or beyond END will not be made. */
16394 static unsigned char *
16395 display_tag_value (signed int tag
,
16397 const unsigned char * const end
)
16402 printf (" Tag_unknown_%d: ", tag
);
16406 warn (_("<corrupt tag>\n"));
16410 /* PR 17531 file: 027-19978-0.004. */
16411 size_t maxlen
= (end
- p
) - 1;
16416 print_symbol ((int) maxlen
, (const char *) p
);
16417 p
+= strnlen ((char *) p
, maxlen
) + 1;
16421 printf (_("<corrupt string tag>"));
16422 p
= (unsigned char *) end
;
16428 READ_ULEB (val
, p
, end
);
16429 printf ("%ld (0x%lx)\n", val
, val
);
16436 /* ARC ABI attributes section. */
16438 static unsigned char *
16439 display_arc_attribute (unsigned char * p
,
16440 const unsigned char * const end
)
16445 READ_ULEB (tag
, p
, end
);
16449 case Tag_ARC_PCS_config
:
16450 READ_ULEB (val
, p
, end
);
16451 printf (" Tag_ARC_PCS_config: ");
16455 printf (_("Absent/Non standard\n"));
16458 printf (_("Bare metal/mwdt\n"));
16461 printf (_("Bare metal/newlib\n"));
16464 printf (_("Linux/uclibc\n"));
16467 printf (_("Linux/glibc\n"));
16470 printf (_("Unknown\n"));
16475 case Tag_ARC_CPU_base
:
16476 READ_ULEB (val
, p
, end
);
16477 printf (" Tag_ARC_CPU_base: ");
16482 printf (_("Absent\n"));
16484 case TAG_CPU_ARC6xx
:
16485 printf ("ARC6xx\n");
16487 case TAG_CPU_ARC7xx
:
16488 printf ("ARC7xx\n");
16490 case TAG_CPU_ARCEM
:
16491 printf ("ARCEM\n");
16493 case TAG_CPU_ARCHS
:
16494 printf ("ARCHS\n");
16499 case Tag_ARC_CPU_variation
:
16500 READ_ULEB (val
, p
, end
);
16501 printf (" Tag_ARC_CPU_variation: ");
16505 if (val
> 0 && val
< 16)
16506 printf ("Core%d\n", val
);
16508 printf ("Unknown\n");
16512 printf (_("Absent\n"));
16517 case Tag_ARC_CPU_name
:
16518 printf (" Tag_ARC_CPU_name: ");
16519 p
= display_tag_value (-1, p
, end
);
16522 case Tag_ARC_ABI_rf16
:
16523 READ_ULEB (val
, p
, end
);
16524 printf (" Tag_ARC_ABI_rf16: %s\n", val
? _("yes") : _("no"));
16527 case Tag_ARC_ABI_osver
:
16528 READ_ULEB (val
, p
, end
);
16529 printf (" Tag_ARC_ABI_osver: v%d\n", val
);
16532 case Tag_ARC_ABI_pic
:
16533 case Tag_ARC_ABI_sda
:
16534 READ_ULEB (val
, p
, end
);
16535 printf (tag
== Tag_ARC_ABI_sda
? " Tag_ARC_ABI_sda: "
16536 : " Tag_ARC_ABI_pic: ");
16540 printf (_("Absent\n"));
16549 printf (_("Unknown\n"));
16554 case Tag_ARC_ABI_tls
:
16555 READ_ULEB (val
, p
, end
);
16556 printf (" Tag_ARC_ABI_tls: %s\n", val
? "r25": "none");
16559 case Tag_ARC_ABI_enumsize
:
16560 READ_ULEB (val
, p
, end
);
16561 printf (" Tag_ARC_ABI_enumsize: %s\n", val
? _("default") :
16565 case Tag_ARC_ABI_exceptions
:
16566 READ_ULEB (val
, p
, end
);
16567 printf (" Tag_ARC_ABI_exceptions: %s\n", val
? _("OPTFP")
16571 case Tag_ARC_ABI_double_size
:
16572 READ_ULEB (val
, p
, end
);
16573 printf (" Tag_ARC_ABI_double_size: %d\n", val
);
16576 case Tag_ARC_ISA_config
:
16577 printf (" Tag_ARC_ISA_config: ");
16578 p
= display_tag_value (-1, p
, end
);
16581 case Tag_ARC_ISA_apex
:
16582 printf (" Tag_ARC_ISA_apex: ");
16583 p
= display_tag_value (-1, p
, end
);
16586 case Tag_ARC_ISA_mpy_option
:
16587 READ_ULEB (val
, p
, end
);
16588 printf (" Tag_ARC_ISA_mpy_option: %d\n", val
);
16591 case Tag_ARC_ATR_version
:
16592 READ_ULEB (val
, p
, end
);
16593 printf (" Tag_ARC_ATR_version: %d\n", val
);
16597 return display_tag_value (tag
& 1, p
, end
);
16603 /* ARM EABI attributes section. */
16608 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
16610 const char *const *table
;
16611 } arm_attr_public_tag
;
16613 static const char *const arm_attr_tag_CPU_arch
[] =
16614 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
16615 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
16616 "v8-M.mainline", "v8.1-A", "v8.2-A", "v8.3-A",
16617 "v8.1-M.mainline", "v9"};
16618 static const char *const arm_attr_tag_ARM_ISA_use
[] = {"No", "Yes"};
16619 static const char *const arm_attr_tag_THUMB_ISA_use
[] =
16620 {"No", "Thumb-1", "Thumb-2", "Yes"};
16621 static const char *const arm_attr_tag_FP_arch
[] =
16622 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
16623 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
16624 static const char *const arm_attr_tag_WMMX_arch
[] = {"No", "WMMXv1", "WMMXv2"};
16625 static const char *const arm_attr_tag_Advanced_SIMD_arch
[] =
16626 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
16627 "NEON for ARMv8.1"};
16628 static const char *const arm_attr_tag_PCS_config
[] =
16629 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
16630 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
16631 static const char *const arm_attr_tag_ABI_PCS_R9_use
[] =
16632 {"V6", "SB", "TLS", "Unused"};
16633 static const char *const arm_attr_tag_ABI_PCS_RW_data
[] =
16634 {"Absolute", "PC-relative", "SB-relative", "None"};
16635 static const char *const arm_attr_tag_ABI_PCS_RO_data
[] =
16636 {"Absolute", "PC-relative", "None"};
16637 static const char *const arm_attr_tag_ABI_PCS_GOT_use
[] =
16638 {"None", "direct", "GOT-indirect"};
16639 static const char *const arm_attr_tag_ABI_PCS_wchar_t
[] =
16640 {"None", "??? 1", "2", "??? 3", "4"};
16641 static const char *const arm_attr_tag_ABI_FP_rounding
[] = {"Unused", "Needed"};
16642 static const char *const arm_attr_tag_ABI_FP_denormal
[] =
16643 {"Unused", "Needed", "Sign only"};
16644 static const char *const arm_attr_tag_ABI_FP_exceptions
[] = {"Unused", "Needed"};
16645 static const char *const arm_attr_tag_ABI_FP_user_exceptions
[] = {"Unused", "Needed"};
16646 static const char *const arm_attr_tag_ABI_FP_number_model
[] =
16647 {"Unused", "Finite", "RTABI", "IEEE 754"};
16648 static const char *const arm_attr_tag_ABI_enum_size
[] =
16649 {"Unused", "small", "int", "forced to int"};
16650 static const char *const arm_attr_tag_ABI_HardFP_use
[] =
16651 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
16652 static const char *const arm_attr_tag_ABI_VFP_args
[] =
16653 {"AAPCS", "VFP registers", "custom", "compatible"};
16654 static const char *const arm_attr_tag_ABI_WMMX_args
[] =
16655 {"AAPCS", "WMMX registers", "custom"};
16656 static const char *const arm_attr_tag_ABI_optimization_goals
[] =
16657 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
16658 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
16659 static const char *const arm_attr_tag_ABI_FP_optimization_goals
[] =
16660 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
16661 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
16662 static const char *const arm_attr_tag_CPU_unaligned_access
[] = {"None", "v6"};
16663 static const char *const arm_attr_tag_FP_HP_extension
[] =
16664 {"Not Allowed", "Allowed"};
16665 static const char *const arm_attr_tag_ABI_FP_16bit_format
[] =
16666 {"None", "IEEE 754", "Alternative Format"};
16667 static const char *const arm_attr_tag_DSP_extension
[] =
16668 {"Follow architecture", "Allowed"};
16669 static const char *const arm_attr_tag_MPextension_use
[] =
16670 {"Not Allowed", "Allowed"};
16671 static const char *const arm_attr_tag_DIV_use
[] =
16672 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
16673 "Allowed in v7-A with integer division extension"};
16674 static const char *const arm_attr_tag_T2EE_use
[] = {"Not Allowed", "Allowed"};
16675 static const char *const arm_attr_tag_Virtualization_use
[] =
16676 {"Not Allowed", "TrustZone", "Virtualization Extensions",
16677 "TrustZone and Virtualization Extensions"};
16678 static const char *const arm_attr_tag_MPextension_use_legacy
[] =
16679 {"Not Allowed", "Allowed"};
16681 static const char *const arm_attr_tag_MVE_arch
[] =
16682 {"No MVE", "MVE Integer only", "MVE Integer and FP"};
16684 static const char * arm_attr_tag_PAC_extension
[] =
16685 {"No PAC/AUT instructions",
16686 "PAC/AUT instructions permitted in the NOP space",
16687 "PAC/AUT instructions permitted in the NOP and in the non-NOP space"};
16689 static const char * arm_attr_tag_BTI_extension
[] =
16690 {"BTI instructions not permitted",
16691 "BTI instructions permitted in the NOP space",
16692 "BTI instructions permitted in the NOP and in the non-NOP space"};
16694 static const char * arm_attr_tag_BTI_use
[] =
16695 {"Compiled without branch target enforcement",
16696 "Compiled with branch target enforcement"};
16698 static const char * arm_attr_tag_PACRET_use
[] =
16699 {"Compiled without return address signing and authentication",
16700 "Compiled with return address signing and authentication"};
16702 #define LOOKUP(id, name) \
16703 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
16704 static arm_attr_public_tag arm_attr_public_tags
[] =
16706 {4, "CPU_raw_name", 1, NULL
},
16707 {5, "CPU_name", 1, NULL
},
16708 LOOKUP(6, CPU_arch
),
16709 {7, "CPU_arch_profile", 0, NULL
},
16710 LOOKUP(8, ARM_ISA_use
),
16711 LOOKUP(9, THUMB_ISA_use
),
16712 LOOKUP(10, FP_arch
),
16713 LOOKUP(11, WMMX_arch
),
16714 LOOKUP(12, Advanced_SIMD_arch
),
16715 LOOKUP(13, PCS_config
),
16716 LOOKUP(14, ABI_PCS_R9_use
),
16717 LOOKUP(15, ABI_PCS_RW_data
),
16718 LOOKUP(16, ABI_PCS_RO_data
),
16719 LOOKUP(17, ABI_PCS_GOT_use
),
16720 LOOKUP(18, ABI_PCS_wchar_t
),
16721 LOOKUP(19, ABI_FP_rounding
),
16722 LOOKUP(20, ABI_FP_denormal
),
16723 LOOKUP(21, ABI_FP_exceptions
),
16724 LOOKUP(22, ABI_FP_user_exceptions
),
16725 LOOKUP(23, ABI_FP_number_model
),
16726 {24, "ABI_align_needed", 0, NULL
},
16727 {25, "ABI_align_preserved", 0, NULL
},
16728 LOOKUP(26, ABI_enum_size
),
16729 LOOKUP(27, ABI_HardFP_use
),
16730 LOOKUP(28, ABI_VFP_args
),
16731 LOOKUP(29, ABI_WMMX_args
),
16732 LOOKUP(30, ABI_optimization_goals
),
16733 LOOKUP(31, ABI_FP_optimization_goals
),
16734 {32, "compatibility", 0, NULL
},
16735 LOOKUP(34, CPU_unaligned_access
),
16736 LOOKUP(36, FP_HP_extension
),
16737 LOOKUP(38, ABI_FP_16bit_format
),
16738 LOOKUP(42, MPextension_use
),
16739 LOOKUP(44, DIV_use
),
16740 LOOKUP(46, DSP_extension
),
16741 LOOKUP(48, MVE_arch
),
16742 LOOKUP(50, PAC_extension
),
16743 LOOKUP(52, BTI_extension
),
16744 LOOKUP(74, BTI_use
),
16745 LOOKUP(76, PACRET_use
),
16746 {64, "nodefaults", 0, NULL
},
16747 {65, "also_compatible_with", 0, NULL
},
16748 LOOKUP(66, T2EE_use
),
16749 {67, "conformance", 1, NULL
},
16750 LOOKUP(68, Virtualization_use
),
16751 LOOKUP(70, MPextension_use_legacy
)
16755 static unsigned char *
16756 display_arm_attribute (unsigned char * p
,
16757 const unsigned char * const end
)
16761 arm_attr_public_tag
* attr
;
16765 READ_ULEB (tag
, p
, end
);
16767 for (i
= 0; i
< ARRAY_SIZE (arm_attr_public_tags
); i
++)
16769 if (arm_attr_public_tags
[i
].tag
== tag
)
16771 attr
= &arm_attr_public_tags
[i
];
16778 printf (" Tag_%s: ", attr
->name
);
16779 switch (attr
->type
)
16784 case 7: /* Tag_CPU_arch_profile. */
16785 READ_ULEB (val
, p
, end
);
16788 case 0: printf (_("None\n")); break;
16789 case 'A': printf (_("Application\n")); break;
16790 case 'R': printf (_("Realtime\n")); break;
16791 case 'M': printf (_("Microcontroller\n")); break;
16792 case 'S': printf (_("Application or Realtime\n")); break;
16793 default: printf ("??? (%d)\n", val
); break;
16797 case 24: /* Tag_align_needed. */
16798 READ_ULEB (val
, p
, end
);
16801 case 0: printf (_("None\n")); break;
16802 case 1: printf (_("8-byte\n")); break;
16803 case 2: printf (_("4-byte\n")); break;
16804 case 3: printf ("??? 3\n"); break;
16807 printf (_("8-byte and up to %d-byte extended\n"),
16810 printf ("??? (%d)\n", val
);
16815 case 25: /* Tag_align_preserved. */
16816 READ_ULEB (val
, p
, end
);
16819 case 0: printf (_("None\n")); break;
16820 case 1: printf (_("8-byte, except leaf SP\n")); break;
16821 case 2: printf (_("8-byte\n")); break;
16822 case 3: printf ("??? 3\n"); break;
16825 printf (_("8-byte and up to %d-byte extended\n"),
16828 printf ("??? (%d)\n", val
);
16833 case 32: /* Tag_compatibility. */
16835 READ_ULEB (val
, p
, end
);
16836 printf (_("flag = %d, vendor = "), val
);
16839 size_t maxlen
= (end
- p
) - 1;
16841 print_symbol ((int) maxlen
, (const char *) p
);
16842 p
+= strnlen ((char *) p
, maxlen
) + 1;
16846 printf (_("<corrupt>"));
16847 p
= (unsigned char *) end
;
16853 case 64: /* Tag_nodefaults. */
16854 /* PR 17531: file: 001-505008-0.01. */
16857 printf (_("True\n"));
16860 case 65: /* Tag_also_compatible_with. */
16861 READ_ULEB (val
, p
, end
);
16862 if (val
== 6 /* Tag_CPU_arch. */)
16864 READ_ULEB (val
, p
, end
);
16865 if ((unsigned int) val
>= ARRAY_SIZE (arm_attr_tag_CPU_arch
))
16866 printf ("??? (%d)\n", val
);
16868 printf ("%s\n", arm_attr_tag_CPU_arch
[val
]);
16872 while (p
< end
&& *(p
++) != '\0' /* NUL terminator. */)
16877 printf (_("<unknown: %d>\n"), tag
);
16883 return display_tag_value (-1, p
, end
);
16885 return display_tag_value (0, p
, end
);
16888 assert (attr
->type
& 0x80);
16889 READ_ULEB (val
, p
, end
);
16890 type
= attr
->type
& 0x7f;
16892 printf ("??? (%d)\n", val
);
16894 printf ("%s\n", attr
->table
[val
]);
16899 return display_tag_value (tag
, p
, end
);
16902 static unsigned char *
16903 display_gnu_attribute (unsigned char * p
,
16904 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, unsigned int, const unsigned char * const),
16905 const unsigned char * const end
)
16910 READ_ULEB (tag
, p
, end
);
16912 /* Tag_compatibility is the only generic GNU attribute defined at
16916 READ_ULEB (val
, p
, end
);
16918 printf (_("flag = %d, vendor = "), val
);
16921 printf (_("<corrupt>\n"));
16922 warn (_("corrupt vendor attribute\n"));
16928 size_t maxlen
= (end
- p
) - 1;
16930 print_symbol ((int) maxlen
, (const char *) p
);
16931 p
+= strnlen ((char *) p
, maxlen
) + 1;
16935 printf (_("<corrupt>"));
16936 p
= (unsigned char *) end
;
16943 if ((tag
& 2) == 0 && display_proc_gnu_attribute
)
16944 return display_proc_gnu_attribute (p
, tag
, end
);
16946 return display_tag_value (tag
, p
, end
);
16949 static unsigned char *
16950 display_m68k_gnu_attribute (unsigned char * p
,
16952 const unsigned char * const end
)
16956 if (tag
== Tag_GNU_M68K_ABI_FP
)
16958 printf (" Tag_GNU_M68K_ABI_FP: ");
16961 printf (_("<corrupt>\n"));
16964 READ_ULEB (val
, p
, end
);
16967 printf ("(%#x), ", val
);
16972 printf (_("unspecified hard/soft float\n"));
16975 printf (_("hard float\n"));
16978 printf (_("soft float\n"));
16984 return display_tag_value (tag
& 1, p
, end
);
16987 static unsigned char *
16988 display_power_gnu_attribute (unsigned char * p
,
16990 const unsigned char * const end
)
16994 if (tag
== Tag_GNU_Power_ABI_FP
)
16996 printf (" Tag_GNU_Power_ABI_FP: ");
16999 printf (_("<corrupt>\n"));
17002 READ_ULEB (val
, p
, end
);
17005 printf ("(%#x), ", val
);
17010 printf (_("unspecified hard/soft float, "));
17013 printf (_("hard float, "));
17016 printf (_("soft float, "));
17019 printf (_("single-precision hard float, "));
17026 printf (_("unspecified long double\n"));
17029 printf (_("128-bit IBM long double\n"));
17032 printf (_("64-bit long double\n"));
17035 printf (_("128-bit IEEE long double\n"));
17041 if (tag
== Tag_GNU_Power_ABI_Vector
)
17043 printf (" Tag_GNU_Power_ABI_Vector: ");
17046 printf (_("<corrupt>\n"));
17049 READ_ULEB (val
, p
, end
);
17052 printf ("(%#x), ", val
);
17057 printf (_("unspecified\n"));
17060 printf (_("generic\n"));
17063 printf ("AltiVec\n");
17072 if (tag
== Tag_GNU_Power_ABI_Struct_Return
)
17074 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
17077 printf (_("<corrupt>\n"));
17080 READ_ULEB (val
, p
, end
);
17083 printf ("(%#x), ", val
);
17088 printf (_("unspecified\n"));
17091 printf ("r3/r4\n");
17094 printf (_("memory\n"));
17103 return display_tag_value (tag
& 1, p
, end
);
17106 static unsigned char *
17107 display_s390_gnu_attribute (unsigned char * p
,
17109 const unsigned char * const end
)
17113 if (tag
== Tag_GNU_S390_ABI_Vector
)
17115 printf (" Tag_GNU_S390_ABI_Vector: ");
17116 READ_ULEB (val
, p
, end
);
17121 printf (_("any\n"));
17124 printf (_("software\n"));
17127 printf (_("hardware\n"));
17130 printf ("??? (%d)\n", val
);
17136 return display_tag_value (tag
& 1, p
, end
);
17140 display_sparc_hwcaps (unsigned int mask
)
17146 if (mask
& ELF_SPARC_HWCAP_MUL32
)
17147 fputs ("mul32", stdout
), first
= false;
17148 if (mask
& ELF_SPARC_HWCAP_DIV32
)
17149 printf ("%sdiv32", first
? "" : "|"), first
= false;
17150 if (mask
& ELF_SPARC_HWCAP_FSMULD
)
17151 printf ("%sfsmuld", first
? "" : "|"), first
= false;
17152 if (mask
& ELF_SPARC_HWCAP_V8PLUS
)
17153 printf ("%sv8plus", first
? "" : "|"), first
= false;
17154 if (mask
& ELF_SPARC_HWCAP_POPC
)
17155 printf ("%spopc", first
? "" : "|"), first
= false;
17156 if (mask
& ELF_SPARC_HWCAP_VIS
)
17157 printf ("%svis", first
? "" : "|"), first
= false;
17158 if (mask
& ELF_SPARC_HWCAP_VIS2
)
17159 printf ("%svis2", first
? "" : "|"), first
= false;
17160 if (mask
& ELF_SPARC_HWCAP_ASI_BLK_INIT
)
17161 printf ("%sASIBlkInit", first
? "" : "|"), first
= false;
17162 if (mask
& ELF_SPARC_HWCAP_FMAF
)
17163 printf ("%sfmaf", first
? "" : "|"), first
= false;
17164 if (mask
& ELF_SPARC_HWCAP_VIS3
)
17165 printf ("%svis3", first
? "" : "|"), first
= false;
17166 if (mask
& ELF_SPARC_HWCAP_HPC
)
17167 printf ("%shpc", first
? "" : "|"), first
= false;
17168 if (mask
& ELF_SPARC_HWCAP_RANDOM
)
17169 printf ("%srandom", first
? "" : "|"), first
= false;
17170 if (mask
& ELF_SPARC_HWCAP_TRANS
)
17171 printf ("%strans", first
? "" : "|"), first
= false;
17172 if (mask
& ELF_SPARC_HWCAP_FJFMAU
)
17173 printf ("%sfjfmau", first
? "" : "|"), first
= false;
17174 if (mask
& ELF_SPARC_HWCAP_IMA
)
17175 printf ("%sima", first
? "" : "|"), first
= false;
17176 if (mask
& ELF_SPARC_HWCAP_ASI_CACHE_SPARING
)
17177 printf ("%scspare", first
? "" : "|"), first
= false;
17180 fputc ('0', stdout
);
17181 fputc ('\n', stdout
);
17185 display_sparc_hwcaps2 (unsigned int mask
)
17191 if (mask
& ELF_SPARC_HWCAP2_FJATHPLUS
)
17192 fputs ("fjathplus", stdout
), first
= false;
17193 if (mask
& ELF_SPARC_HWCAP2_VIS3B
)
17194 printf ("%svis3b", first
? "" : "|"), first
= false;
17195 if (mask
& ELF_SPARC_HWCAP2_ADP
)
17196 printf ("%sadp", first
? "" : "|"), first
= false;
17197 if (mask
& ELF_SPARC_HWCAP2_SPARC5
)
17198 printf ("%ssparc5", first
? "" : "|"), first
= false;
17199 if (mask
& ELF_SPARC_HWCAP2_MWAIT
)
17200 printf ("%smwait", first
? "" : "|"), first
= false;
17201 if (mask
& ELF_SPARC_HWCAP2_XMPMUL
)
17202 printf ("%sxmpmul", first
? "" : "|"), first
= false;
17203 if (mask
& ELF_SPARC_HWCAP2_XMONT
)
17204 printf ("%sxmont2", first
? "" : "|"), first
= false;
17205 if (mask
& ELF_SPARC_HWCAP2_NSEC
)
17206 printf ("%snsec", first
? "" : "|"), first
= false;
17207 if (mask
& ELF_SPARC_HWCAP2_FJATHHPC
)
17208 printf ("%sfjathhpc", first
? "" : "|"), first
= false;
17209 if (mask
& ELF_SPARC_HWCAP2_FJDES
)
17210 printf ("%sfjdes", first
? "" : "|"), first
= false;
17211 if (mask
& ELF_SPARC_HWCAP2_FJAES
)
17212 printf ("%sfjaes", first
? "" : "|"), first
= false;
17215 fputc ('0', stdout
);
17216 fputc ('\n', stdout
);
17219 static unsigned char *
17220 display_sparc_gnu_attribute (unsigned char * p
,
17222 const unsigned char * const end
)
17226 if (tag
== Tag_GNU_Sparc_HWCAPS
)
17228 READ_ULEB (val
, p
, end
);
17229 printf (" Tag_GNU_Sparc_HWCAPS: ");
17230 display_sparc_hwcaps (val
);
17233 if (tag
== Tag_GNU_Sparc_HWCAPS2
)
17235 READ_ULEB (val
, p
, end
);
17236 printf (" Tag_GNU_Sparc_HWCAPS2: ");
17237 display_sparc_hwcaps2 (val
);
17241 return display_tag_value (tag
, p
, end
);
17245 print_mips_fp_abi_value (unsigned int val
)
17249 case Val_GNU_MIPS_ABI_FP_ANY
:
17250 printf (_("Hard or soft float\n"));
17252 case Val_GNU_MIPS_ABI_FP_DOUBLE
:
17253 printf (_("Hard float (double precision)\n"));
17255 case Val_GNU_MIPS_ABI_FP_SINGLE
:
17256 printf (_("Hard float (single precision)\n"));
17258 case Val_GNU_MIPS_ABI_FP_SOFT
:
17259 printf (_("Soft float\n"));
17261 case Val_GNU_MIPS_ABI_FP_OLD_64
:
17262 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
17264 case Val_GNU_MIPS_ABI_FP_XX
:
17265 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
17267 case Val_GNU_MIPS_ABI_FP_64
:
17268 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
17270 case Val_GNU_MIPS_ABI_FP_64A
:
17271 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
17273 case Val_GNU_MIPS_ABI_FP_NAN2008
:
17274 printf (_("NaN 2008 compatibility\n"));
17277 printf ("??? (%d)\n", val
);
17282 static unsigned char *
17283 display_mips_gnu_attribute (unsigned char * p
,
17285 const unsigned char * const end
)
17287 if (tag
== Tag_GNU_MIPS_ABI_FP
)
17291 printf (" Tag_GNU_MIPS_ABI_FP: ");
17292 READ_ULEB (val
, p
, end
);
17293 print_mips_fp_abi_value (val
);
17297 if (tag
== Tag_GNU_MIPS_ABI_MSA
)
17301 printf (" Tag_GNU_MIPS_ABI_MSA: ");
17302 READ_ULEB (val
, p
, end
);
17306 case Val_GNU_MIPS_ABI_MSA_ANY
:
17307 printf (_("Any MSA or not\n"));
17309 case Val_GNU_MIPS_ABI_MSA_128
:
17310 printf (_("128-bit MSA\n"));
17313 printf ("??? (%d)\n", val
);
17319 return display_tag_value (tag
& 1, p
, end
);
17322 static unsigned char *
17323 display_tic6x_attribute (unsigned char * p
,
17324 const unsigned char * const end
)
17329 READ_ULEB (tag
, p
, end
);
17334 printf (" Tag_ISA: ");
17335 READ_ULEB (val
, p
, end
);
17339 case C6XABI_Tag_ISA_none
:
17340 printf (_("None\n"));
17342 case C6XABI_Tag_ISA_C62X
:
17345 case C6XABI_Tag_ISA_C67X
:
17348 case C6XABI_Tag_ISA_C67XP
:
17349 printf ("C67x+\n");
17351 case C6XABI_Tag_ISA_C64X
:
17354 case C6XABI_Tag_ISA_C64XP
:
17355 printf ("C64x+\n");
17357 case C6XABI_Tag_ISA_C674X
:
17358 printf ("C674x\n");
17361 printf ("??? (%d)\n", val
);
17366 case Tag_ABI_wchar_t
:
17367 printf (" Tag_ABI_wchar_t: ");
17368 READ_ULEB (val
, p
, end
);
17372 printf (_("Not used\n"));
17375 printf (_("2 bytes\n"));
17378 printf (_("4 bytes\n"));
17381 printf ("??? (%d)\n", val
);
17386 case Tag_ABI_stack_align_needed
:
17387 printf (" Tag_ABI_stack_align_needed: ");
17388 READ_ULEB (val
, p
, end
);
17392 printf (_("8-byte\n"));
17395 printf (_("16-byte\n"));
17398 printf ("??? (%d)\n", val
);
17403 case Tag_ABI_stack_align_preserved
:
17404 READ_ULEB (val
, p
, end
);
17405 printf (" Tag_ABI_stack_align_preserved: ");
17409 printf (_("8-byte\n"));
17412 printf (_("16-byte\n"));
17415 printf ("??? (%d)\n", val
);
17421 READ_ULEB (val
, p
, end
);
17422 printf (" Tag_ABI_DSBT: ");
17426 printf (_("DSBT addressing not used\n"));
17429 printf (_("DSBT addressing used\n"));
17432 printf ("??? (%d)\n", val
);
17438 READ_ULEB (val
, p
, end
);
17439 printf (" Tag_ABI_PID: ");
17443 printf (_("Data addressing position-dependent\n"));
17446 printf (_("Data addressing position-independent, GOT near DP\n"));
17449 printf (_("Data addressing position-independent, GOT far from DP\n"));
17452 printf ("??? (%d)\n", val
);
17458 READ_ULEB (val
, p
, end
);
17459 printf (" Tag_ABI_PIC: ");
17463 printf (_("Code addressing position-dependent\n"));
17466 printf (_("Code addressing position-independent\n"));
17469 printf ("??? (%d)\n", val
);
17474 case Tag_ABI_array_object_alignment
:
17475 READ_ULEB (val
, p
, end
);
17476 printf (" Tag_ABI_array_object_alignment: ");
17480 printf (_("8-byte\n"));
17483 printf (_("4-byte\n"));
17486 printf (_("16-byte\n"));
17489 printf ("??? (%d)\n", val
);
17494 case Tag_ABI_array_object_align_expected
:
17495 READ_ULEB (val
, p
, end
);
17496 printf (" Tag_ABI_array_object_align_expected: ");
17500 printf (_("8-byte\n"));
17503 printf (_("4-byte\n"));
17506 printf (_("16-byte\n"));
17509 printf ("??? (%d)\n", val
);
17514 case Tag_ABI_compatibility
:
17516 READ_ULEB (val
, p
, end
);
17517 printf (" Tag_ABI_compatibility: ");
17518 printf (_("flag = %d, vendor = "), val
);
17521 size_t maxlen
= (end
- p
) - 1;
17523 print_symbol ((int) maxlen
, (const char *) p
);
17524 p
+= strnlen ((char *) p
, maxlen
) + 1;
17528 printf (_("<corrupt>"));
17529 p
= (unsigned char *) end
;
17535 case Tag_ABI_conformance
:
17537 printf (" Tag_ABI_conformance: \"");
17540 size_t maxlen
= (end
- p
) - 1;
17542 print_symbol ((int) maxlen
, (const char *) p
);
17543 p
+= strnlen ((char *) p
, maxlen
) + 1;
17547 printf (_("<corrupt>"));
17548 p
= (unsigned char *) end
;
17555 return display_tag_value (tag
, p
, end
);
17559 display_raw_attribute (unsigned char * p
, unsigned char const * const end
)
17561 unsigned long addr
= 0;
17562 size_t bytes
= end
- p
;
17569 int lbytes
= (bytes
> 16 ? 16 : bytes
);
17571 printf (" 0x%8.8lx ", addr
);
17573 for (j
= 0; j
< 16; j
++)
17576 printf ("%2.2x", p
[j
]);
17584 for (j
= 0; j
< lbytes
; j
++)
17587 if (k
>= ' ' && k
< 0x7f)
17603 static unsigned char *
17604 display_msp430_attribute (unsigned char * p
,
17605 const unsigned char * const end
)
17610 READ_ULEB (tag
, p
, end
);
17614 case OFBA_MSPABI_Tag_ISA
:
17615 printf (" Tag_ISA: ");
17616 READ_ULEB (val
, p
, end
);
17619 case 0: printf (_("None\n")); break;
17620 case 1: printf (_("MSP430\n")); break;
17621 case 2: printf (_("MSP430X\n")); break;
17622 default: printf ("??? (%d)\n", val
); break;
17626 case OFBA_MSPABI_Tag_Code_Model
:
17627 printf (" Tag_Code_Model: ");
17628 READ_ULEB (val
, p
, end
);
17631 case 0: printf (_("None\n")); break;
17632 case 1: printf (_("Small\n")); break;
17633 case 2: printf (_("Large\n")); break;
17634 default: printf ("??? (%d)\n", val
); break;
17638 case OFBA_MSPABI_Tag_Data_Model
:
17639 printf (" Tag_Data_Model: ");
17640 READ_ULEB (val
, p
, end
);
17643 case 0: printf (_("None\n")); break;
17644 case 1: printf (_("Small\n")); break;
17645 case 2: printf (_("Large\n")); break;
17646 case 3: printf (_("Restricted Large\n")); break;
17647 default: printf ("??? (%d)\n", val
); break;
17652 printf (_(" <unknown tag %d>: "), tag
);
17659 size_t maxlen
= (end
- p
) - 1;
17661 print_symbol ((int) maxlen
, (const char *) p
);
17662 p
+= strnlen ((char *) p
, maxlen
) + 1;
17666 printf (_("<corrupt>"));
17667 p
= (unsigned char *) end
;
17673 READ_ULEB (val
, p
, end
);
17674 printf ("%d (0x%x)\n", val
, val
);
17683 static unsigned char *
17684 display_msp430_gnu_attribute (unsigned char * p
,
17686 const unsigned char * const end
)
17688 if (tag
== Tag_GNU_MSP430_Data_Region
)
17692 printf (" Tag_GNU_MSP430_Data_Region: ");
17693 READ_ULEB (val
, p
, end
);
17697 case Val_GNU_MSP430_Data_Region_Any
:
17698 printf (_("Any Region\n"));
17700 case Val_GNU_MSP430_Data_Region_Lower
:
17701 printf (_("Lower Region Only\n"));
17704 printf ("??? (%u)\n", val
);
17708 return display_tag_value (tag
& 1, p
, end
);
17711 struct riscv_attr_tag_t
{
17716 static struct riscv_attr_tag_t riscv_attr_tag
[] =
17718 #define T(tag) {"Tag_RISCV_" #tag, Tag_RISCV_##tag}
17721 T(priv_spec_minor
),
17722 T(priv_spec_revision
),
17723 T(unaligned_access
),
17728 static unsigned char *
17729 display_riscv_attribute (unsigned char *p
,
17730 const unsigned char * const end
)
17734 struct riscv_attr_tag_t
*attr
= NULL
;
17737 READ_ULEB (tag
, p
, end
);
17739 /* Find the name of attribute. */
17740 for (i
= 0; i
< ARRAY_SIZE (riscv_attr_tag
); i
++)
17742 if (riscv_attr_tag
[i
].tag
== tag
)
17744 attr
= &riscv_attr_tag
[i
];
17750 printf (" %s: ", attr
->name
);
17752 return display_tag_value (tag
, p
, end
);
17756 case Tag_RISCV_priv_spec
:
17757 case Tag_RISCV_priv_spec_minor
:
17758 case Tag_RISCV_priv_spec_revision
:
17759 READ_ULEB (val
, p
, end
);
17760 printf (_("%u\n"), val
);
17762 case Tag_RISCV_unaligned_access
:
17763 READ_ULEB (val
, p
, end
);
17767 printf (_("No unaligned access\n"));
17770 printf (_("Unaligned access\n"));
17774 case Tag_RISCV_stack_align
:
17775 READ_ULEB (val
, p
, end
);
17776 printf (_("%u-bytes\n"), val
);
17778 case Tag_RISCV_arch
:
17779 p
= display_tag_value (-1, p
, end
);
17782 return display_tag_value (tag
, p
, end
);
17788 static unsigned char *
17789 display_csky_attribute (unsigned char * p
,
17790 const unsigned char * const end
)
17794 READ_ULEB (tag
, p
, end
);
17796 if (tag
>= Tag_CSKY_MAX
)
17798 return display_tag_value (-1, p
, end
);
17803 case Tag_CSKY_ARCH_NAME
:
17804 printf (" Tag_CSKY_ARCH_NAME:\t\t");
17805 return display_tag_value (-1, p
, end
);
17806 case Tag_CSKY_CPU_NAME
:
17807 printf (" Tag_CSKY_CPU_NAME:\t\t");
17808 return display_tag_value (-1, p
, end
);
17810 case Tag_CSKY_ISA_FLAGS
:
17811 printf (" Tag_CSKY_ISA_FLAGS:\t\t");
17812 return display_tag_value (0, p
, end
);
17813 case Tag_CSKY_ISA_EXT_FLAGS
:
17814 printf (" Tag_CSKY_ISA_EXT_FLAGS:\t");
17815 return display_tag_value (0, p
, end
);
17817 case Tag_CSKY_DSP_VERSION
:
17818 printf (" Tag_CSKY_DSP_VERSION:\t\t");
17819 READ_ULEB (val
, p
, end
);
17820 if (val
== VAL_CSKY_DSP_VERSION_EXTENSION
)
17821 printf ("DSP Extension\n");
17822 else if (val
== VAL_CSKY_DSP_VERSION_2
)
17823 printf ("DSP 2.0\n");
17826 case Tag_CSKY_VDSP_VERSION
:
17827 printf (" Tag_CSKY_VDSP_VERSION:\t");
17828 READ_ULEB (val
, p
, end
);
17829 printf ("VDSP Version %d\n", val
);
17832 case Tag_CSKY_FPU_VERSION
:
17833 printf (" Tag_CSKY_FPU_VERSION:\t\t");
17834 READ_ULEB (val
, p
, end
);
17835 if (val
== VAL_CSKY_FPU_VERSION_1
)
17836 printf ("ABIV1 FPU Version 1\n");
17837 else if (val
== VAL_CSKY_FPU_VERSION_2
)
17838 printf ("FPU Version 2\n");
17841 case Tag_CSKY_FPU_ABI
:
17842 printf (" Tag_CSKY_FPU_ABI:\t\t");
17843 READ_ULEB (val
, p
, end
);
17844 if (val
== VAL_CSKY_FPU_ABI_HARD
)
17846 else if (val
== VAL_CSKY_FPU_ABI_SOFTFP
)
17847 printf ("SoftFP\n");
17848 else if (val
== VAL_CSKY_FPU_ABI_SOFT
)
17851 case Tag_CSKY_FPU_ROUNDING
:
17852 READ_ULEB (val
, p
, end
);
17855 printf (" Tag_CSKY_FPU_ROUNDING:\t");
17856 printf ("Needed\n");
17859 case Tag_CSKY_FPU_DENORMAL
:
17860 READ_ULEB (val
, p
, end
);
17863 printf (" Tag_CSKY_FPU_DENORMAL:\t");
17864 printf ("Needed\n");
17867 case Tag_CSKY_FPU_Exception
:
17868 READ_ULEB (val
, p
, end
);
17871 printf (" Tag_CSKY_FPU_Exception:\t");
17872 printf ("Needed\n");
17875 case Tag_CSKY_FPU_NUMBER_MODULE
:
17876 printf (" Tag_CSKY_FPU_NUMBER_MODULE:\t");
17877 return display_tag_value (-1, p
, end
);
17878 case Tag_CSKY_FPU_HARDFP
:
17879 printf (" Tag_CSKY_FPU_HARDFP:\t\t");
17880 READ_ULEB (val
, p
, end
);
17881 if (val
& VAL_CSKY_FPU_HARDFP_HALF
)
17883 if (val
& VAL_CSKY_FPU_HARDFP_SINGLE
)
17884 printf (" Single");
17885 if (val
& VAL_CSKY_FPU_HARDFP_DOUBLE
)
17886 printf (" Double");
17890 return display_tag_value (tag
, p
, end
);
17896 process_attributes (Filedata
* filedata
,
17897 const char * public_name
,
17898 unsigned int proc_type
,
17899 unsigned char * (* display_pub_attribute
) (unsigned char *, const unsigned char * const),
17900 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, unsigned int, const unsigned char * const))
17902 Elf_Internal_Shdr
* sect
;
17906 /* Find the section header so that we get the size. */
17907 for (i
= 0, sect
= filedata
->section_headers
;
17908 i
< filedata
->file_header
.e_shnum
;
17911 unsigned char * contents
;
17914 if (sect
->sh_type
!= proc_type
&& sect
->sh_type
!= SHT_GNU_ATTRIBUTES
)
17917 contents
= (unsigned char *) get_data (NULL
, filedata
, sect
->sh_offset
, 1,
17918 sect
->sh_size
, _("attributes"));
17919 if (contents
== NULL
)
17926 /* The first character is the version of the attributes.
17927 Currently only version 1, (aka 'A') is recognised here. */
17930 printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p
, *p
);
17935 bfd_vma section_len
;
17937 section_len
= sect
->sh_size
- 1;
17940 while (section_len
> 0)
17943 unsigned int namelen
;
17944 bool public_section
;
17947 if (section_len
<= 4)
17949 error (_("Tag section ends prematurely\n"));
17953 attr_len
= byte_get (p
, 4);
17956 if (attr_len
> section_len
)
17958 error (_("Bad attribute length (%u > %u)\n"),
17959 (unsigned) attr_len
, (unsigned) section_len
);
17960 attr_len
= section_len
;
17963 /* PR 17531: file: 001-101425-0.004 */
17964 else if (attr_len
< 5)
17966 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len
);
17971 section_len
-= attr_len
;
17974 namelen
= strnlen ((char *) p
, attr_len
) + 1;
17975 if (namelen
== 0 || namelen
>= attr_len
)
17977 error (_("Corrupt attribute section name\n"));
17982 printf (_("Attribute Section: "));
17983 print_symbol (INT_MAX
, (const char *) p
);
17986 if (public_name
&& streq ((char *) p
, public_name
))
17987 public_section
= true;
17989 public_section
= false;
17991 if (streq ((char *) p
, "gnu"))
17992 gnu_section
= true;
17994 gnu_section
= false;
17997 attr_len
-= namelen
;
17999 while (attr_len
> 0 && p
< contents
+ sect
->sh_size
)
18004 unsigned char * end
;
18006 /* PR binutils/17531: Safe handling of corrupt files. */
18009 error (_("Unused bytes at end of section\n"));
18016 size
= byte_get (p
, 4);
18017 if (size
> attr_len
)
18019 error (_("Bad subsection length (%u > %u)\n"),
18020 (unsigned) size
, (unsigned) attr_len
);
18024 /* PR binutils/17531: Safe handling of corrupt files. */
18027 error (_("Bad subsection length (%u < 6)\n"),
18035 end
= p
+ size
- 1;
18036 assert (end
<= contents
+ sect
->sh_size
);
18042 printf (_("File Attributes\n"));
18045 printf (_("Section Attributes:"));
18048 printf (_("Symbol Attributes:"));
18049 /* Fall through. */
18053 READ_ULEB (val
, p
, end
);
18056 printf (" %d", val
);
18061 printf (_("Unknown tag: %d\n"), tag
);
18062 public_section
= false;
18066 if (public_section
&& display_pub_attribute
!= NULL
)
18069 p
= display_pub_attribute (p
, end
);
18072 else if (gnu_section
&& display_proc_gnu_attribute
!= NULL
)
18075 p
= display_gnu_attribute (p
,
18076 display_proc_gnu_attribute
,
18082 printf (_(" Unknown attribute:\n"));
18083 display_raw_attribute (p
, end
);
18098 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
18099 Print the Address, Access and Initial fields of an entry at VMA ADDR
18100 and return the VMA of the next entry, or -1 if there was a problem.
18101 Does not read from DATA_END or beyond. */
18104 print_mips_got_entry (unsigned char * data
, bfd_vma pltgot
, bfd_vma addr
,
18105 unsigned char * data_end
)
18108 print_vma (addr
, LONG_HEX
);
18110 if (addr
< pltgot
+ 0xfff0)
18111 printf ("%6d(gp)", (int) (addr
- pltgot
- 0x7ff0));
18113 printf ("%10s", "");
18116 printf ("%*s", is_32bit_elf
? 8 : 16, _("<unknown>"));
18120 unsigned char * from
= data
+ addr
- pltgot
;
18122 if (from
+ (is_32bit_elf
? 4 : 8) > data_end
)
18124 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
18125 printf ("%*s", is_32bit_elf
? 8 : 16, _("<corrupt>"));
18126 return (bfd_vma
) -1;
18130 entry
= byte_get (data
+ addr
- pltgot
, is_32bit_elf
? 4 : 8);
18131 print_vma (entry
, LONG_HEX
);
18134 return addr
+ (is_32bit_elf
? 4 : 8);
18137 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
18138 PLTGOT. Print the Address and Initial fields of an entry at VMA
18139 ADDR and return the VMA of the next entry. */
18142 print_mips_pltgot_entry (unsigned char * data
, bfd_vma pltgot
, bfd_vma addr
)
18145 print_vma (addr
, LONG_HEX
);
18148 printf ("%*s", is_32bit_elf
? 8 : 16, _("<unknown>"));
18153 entry
= byte_get (data
+ addr
- pltgot
, is_32bit_elf
? 4 : 8);
18154 print_vma (entry
, LONG_HEX
);
18156 return addr
+ (is_32bit_elf
? 4 : 8);
18160 print_mips_ases (unsigned int mask
)
18162 if (mask
& AFL_ASE_DSP
)
18163 fputs ("\n\tDSP ASE", stdout
);
18164 if (mask
& AFL_ASE_DSPR2
)
18165 fputs ("\n\tDSP R2 ASE", stdout
);
18166 if (mask
& AFL_ASE_DSPR3
)
18167 fputs ("\n\tDSP R3 ASE", stdout
);
18168 if (mask
& AFL_ASE_EVA
)
18169 fputs ("\n\tEnhanced VA Scheme", stdout
);
18170 if (mask
& AFL_ASE_MCU
)
18171 fputs ("\n\tMCU (MicroController) ASE", stdout
);
18172 if (mask
& AFL_ASE_MDMX
)
18173 fputs ("\n\tMDMX ASE", stdout
);
18174 if (mask
& AFL_ASE_MIPS3D
)
18175 fputs ("\n\tMIPS-3D ASE", stdout
);
18176 if (mask
& AFL_ASE_MT
)
18177 fputs ("\n\tMT ASE", stdout
);
18178 if (mask
& AFL_ASE_SMARTMIPS
)
18179 fputs ("\n\tSmartMIPS ASE", stdout
);
18180 if (mask
& AFL_ASE_VIRT
)
18181 fputs ("\n\tVZ ASE", stdout
);
18182 if (mask
& AFL_ASE_MSA
)
18183 fputs ("\n\tMSA ASE", stdout
);
18184 if (mask
& AFL_ASE_MIPS16
)
18185 fputs ("\n\tMIPS16 ASE", stdout
);
18186 if (mask
& AFL_ASE_MICROMIPS
)
18187 fputs ("\n\tMICROMIPS ASE", stdout
);
18188 if (mask
& AFL_ASE_XPA
)
18189 fputs ("\n\tXPA ASE", stdout
);
18190 if (mask
& AFL_ASE_MIPS16E2
)
18191 fputs ("\n\tMIPS16e2 ASE", stdout
);
18192 if (mask
& AFL_ASE_CRC
)
18193 fputs ("\n\tCRC ASE", stdout
);
18194 if (mask
& AFL_ASE_GINV
)
18195 fputs ("\n\tGINV ASE", stdout
);
18196 if (mask
& AFL_ASE_LOONGSON_MMI
)
18197 fputs ("\n\tLoongson MMI ASE", stdout
);
18198 if (mask
& AFL_ASE_LOONGSON_CAM
)
18199 fputs ("\n\tLoongson CAM ASE", stdout
);
18200 if (mask
& AFL_ASE_LOONGSON_EXT
)
18201 fputs ("\n\tLoongson EXT ASE", stdout
);
18202 if (mask
& AFL_ASE_LOONGSON_EXT2
)
18203 fputs ("\n\tLoongson EXT2 ASE", stdout
);
18205 fprintf (stdout
, "\n\t%s", _("None"));
18206 else if ((mask
& ~AFL_ASE_MASK
) != 0)
18207 fprintf (stdout
, "\n\t%s (%x)", _("Unknown"), mask
& ~AFL_ASE_MASK
);
18211 print_mips_isa_ext (unsigned int isa_ext
)
18216 fputs (_("None"), stdout
);
18219 fputs ("RMI XLR", stdout
);
18221 case AFL_EXT_OCTEON3
:
18222 fputs ("Cavium Networks Octeon3", stdout
);
18224 case AFL_EXT_OCTEON2
:
18225 fputs ("Cavium Networks Octeon2", stdout
);
18227 case AFL_EXT_OCTEONP
:
18228 fputs ("Cavium Networks OcteonP", stdout
);
18230 case AFL_EXT_OCTEON
:
18231 fputs ("Cavium Networks Octeon", stdout
);
18234 fputs ("Toshiba R5900", stdout
);
18237 fputs ("MIPS R4650", stdout
);
18240 fputs ("LSI R4010", stdout
);
18243 fputs ("NEC VR4100", stdout
);
18246 fputs ("Toshiba R3900", stdout
);
18248 case AFL_EXT_10000
:
18249 fputs ("MIPS R10000", stdout
);
18252 fputs ("Broadcom SB-1", stdout
);
18255 fputs ("NEC VR4111/VR4181", stdout
);
18258 fputs ("NEC VR4120", stdout
);
18261 fputs ("NEC VR5400", stdout
);
18264 fputs ("NEC VR5500", stdout
);
18266 case AFL_EXT_LOONGSON_2E
:
18267 fputs ("ST Microelectronics Loongson 2E", stdout
);
18269 case AFL_EXT_LOONGSON_2F
:
18270 fputs ("ST Microelectronics Loongson 2F", stdout
);
18272 case AFL_EXT_INTERAPTIV_MR2
:
18273 fputs ("Imagination interAptiv MR2", stdout
);
18276 fprintf (stdout
, "%s (%d)", _("Unknown"), isa_ext
);
18281 get_mips_reg_size (int reg_size
)
18283 return (reg_size
== AFL_REG_NONE
) ? 0
18284 : (reg_size
== AFL_REG_32
) ? 32
18285 : (reg_size
== AFL_REG_64
) ? 64
18286 : (reg_size
== AFL_REG_128
) ? 128
18291 process_mips_specific (Filedata
* filedata
)
18293 Elf_Internal_Dyn
* entry
;
18294 Elf_Internal_Shdr
*sect
= NULL
;
18295 size_t liblist_offset
= 0;
18296 size_t liblistno
= 0;
18297 size_t conflictsno
= 0;
18298 size_t options_offset
= 0;
18299 size_t conflicts_offset
= 0;
18300 size_t pltrelsz
= 0;
18302 bfd_vma pltgot
= 0;
18303 bfd_vma mips_pltgot
= 0;
18304 bfd_vma jmprel
= 0;
18305 bfd_vma local_gotno
= 0;
18306 bfd_vma gotsym
= 0;
18307 bfd_vma symtabno
= 0;
18310 if (! process_attributes (filedata
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
18311 display_mips_gnu_attribute
))
18314 sect
= find_section (filedata
, ".MIPS.abiflags");
18318 Elf_External_ABIFlags_v0
*abiflags_ext
;
18319 Elf_Internal_ABIFlags_v0 abiflags_in
;
18321 if (sizeof (Elf_External_ABIFlags_v0
) != sect
->sh_size
)
18323 error (_("Corrupt MIPS ABI Flags section.\n"));
18328 abiflags_ext
= get_data (NULL
, filedata
, sect
->sh_offset
, 1,
18329 sect
->sh_size
, _("MIPS ABI Flags section"));
18332 abiflags_in
.version
= BYTE_GET (abiflags_ext
->version
);
18333 abiflags_in
.isa_level
= BYTE_GET (abiflags_ext
->isa_level
);
18334 abiflags_in
.isa_rev
= BYTE_GET (abiflags_ext
->isa_rev
);
18335 abiflags_in
.gpr_size
= BYTE_GET (abiflags_ext
->gpr_size
);
18336 abiflags_in
.cpr1_size
= BYTE_GET (abiflags_ext
->cpr1_size
);
18337 abiflags_in
.cpr2_size
= BYTE_GET (abiflags_ext
->cpr2_size
);
18338 abiflags_in
.fp_abi
= BYTE_GET (abiflags_ext
->fp_abi
);
18339 abiflags_in
.isa_ext
= BYTE_GET (abiflags_ext
->isa_ext
);
18340 abiflags_in
.ases
= BYTE_GET (abiflags_ext
->ases
);
18341 abiflags_in
.flags1
= BYTE_GET (abiflags_ext
->flags1
);
18342 abiflags_in
.flags2
= BYTE_GET (abiflags_ext
->flags2
);
18344 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in
.version
);
18345 printf ("\nISA: MIPS%d", abiflags_in
.isa_level
);
18346 if (abiflags_in
.isa_rev
> 1)
18347 printf ("r%d", abiflags_in
.isa_rev
);
18348 printf ("\nGPR size: %d",
18349 get_mips_reg_size (abiflags_in
.gpr_size
));
18350 printf ("\nCPR1 size: %d",
18351 get_mips_reg_size (abiflags_in
.cpr1_size
));
18352 printf ("\nCPR2 size: %d",
18353 get_mips_reg_size (abiflags_in
.cpr2_size
));
18354 fputs ("\nFP ABI: ", stdout
);
18355 print_mips_fp_abi_value (abiflags_in
.fp_abi
);
18356 fputs ("ISA Extension: ", stdout
);
18357 print_mips_isa_ext (abiflags_in
.isa_ext
);
18358 fputs ("\nASEs:", stdout
);
18359 print_mips_ases (abiflags_in
.ases
);
18360 printf ("\nFLAGS 1: %8.8lx", abiflags_in
.flags1
);
18361 printf ("\nFLAGS 2: %8.8lx", abiflags_in
.flags2
);
18362 fputc ('\n', stdout
);
18363 free (abiflags_ext
);
18368 /* We have a lot of special sections. Thanks SGI! */
18369 if (filedata
->dynamic_section
== NULL
)
18371 /* No dynamic information available. See if there is static GOT. */
18372 sect
= find_section (filedata
, ".got");
18375 unsigned char *data_end
;
18376 unsigned char *data
;
18380 pltgot
= sect
->sh_addr
;
18383 addr_size
= (is_32bit_elf
? 4 : 8);
18384 end
= pltgot
+ sect
->sh_size
;
18386 data
= (unsigned char *) get_data (NULL
, filedata
, sect
->sh_offset
,
18388 _("Global Offset Table data"));
18389 /* PR 12855: Null data is handled gracefully throughout. */
18390 data_end
= data
+ (end
- pltgot
);
18392 printf (_("\nStatic GOT:\n"));
18393 printf (_(" Canonical gp value: "));
18394 print_vma (ent
+ 0x7ff0, LONG_HEX
);
18397 /* In a dynamic binary GOT[0] is reserved for the dynamic
18398 loader to store the lazy resolver pointer, however in
18399 a static binary it may well have been omitted and GOT
18400 reduced to a table of addresses.
18401 PR 21344: Check for the entry being fully available
18402 before fetching it. */
18404 && data
+ ent
- pltgot
+ addr_size
<= data_end
18405 && byte_get (data
+ ent
- pltgot
, addr_size
) == 0)
18407 printf (_(" Reserved entries:\n"));
18408 printf (_(" %*s %10s %*s\n"),
18409 addr_size
* 2, _("Address"), _("Access"),
18410 addr_size
* 2, _("Value"));
18411 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
18413 if (ent
== (bfd_vma
) -1)
18414 goto sgot_print_fail
;
18416 /* Check for the MSB of GOT[1] being set, identifying a
18417 GNU object. This entry will be used by some runtime
18418 loaders, to store the module pointer. Otherwise this
18419 is an ordinary local entry.
18420 PR 21344: Check for the entry being fully available
18421 before fetching it. */
18423 && data
+ ent
- pltgot
+ addr_size
<= data_end
18424 && (byte_get (data
+ ent
- pltgot
, addr_size
)
18425 >> (addr_size
* 8 - 1)) != 0)
18427 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
18429 if (ent
== (bfd_vma
) -1)
18430 goto sgot_print_fail
;
18435 if (data
!= NULL
&& ent
< end
)
18437 printf (_(" Local entries:\n"));
18438 printf (" %*s %10s %*s\n",
18439 addr_size
* 2, _("Address"), _("Access"),
18440 addr_size
* 2, _("Value"));
18443 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
18445 if (ent
== (bfd_vma
) -1)
18446 goto sgot_print_fail
;
18457 for (entry
= filedata
->dynamic_section
;
18458 /* PR 17531 file: 012-50589-0.004. */
18459 (entry
< filedata
->dynamic_section
+ filedata
->dynamic_nent
18460 && entry
->d_tag
!= DT_NULL
);
18462 switch (entry
->d_tag
)
18464 case DT_MIPS_LIBLIST
:
18466 = offset_from_vma (filedata
, entry
->d_un
.d_val
,
18467 liblistno
* sizeof (Elf32_External_Lib
));
18469 case DT_MIPS_LIBLISTNO
:
18470 liblistno
= entry
->d_un
.d_val
;
18472 case DT_MIPS_OPTIONS
:
18473 options_offset
= offset_from_vma (filedata
, entry
->d_un
.d_val
, 0);
18475 case DT_MIPS_CONFLICT
:
18477 = offset_from_vma (filedata
, entry
->d_un
.d_val
,
18478 conflictsno
* sizeof (Elf32_External_Conflict
));
18480 case DT_MIPS_CONFLICTNO
:
18481 conflictsno
= entry
->d_un
.d_val
;
18484 pltgot
= entry
->d_un
.d_ptr
;
18486 case DT_MIPS_LOCAL_GOTNO
:
18487 local_gotno
= entry
->d_un
.d_val
;
18489 case DT_MIPS_GOTSYM
:
18490 gotsym
= entry
->d_un
.d_val
;
18492 case DT_MIPS_SYMTABNO
:
18493 symtabno
= entry
->d_un
.d_val
;
18495 case DT_MIPS_PLTGOT
:
18496 mips_pltgot
= entry
->d_un
.d_ptr
;
18499 pltrel
= entry
->d_un
.d_val
;
18502 pltrelsz
= entry
->d_un
.d_val
;
18505 jmprel
= entry
->d_un
.d_ptr
;
18511 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
18513 Elf32_External_Lib
* elib
;
18516 elib
= (Elf32_External_Lib
*) get_data (NULL
, filedata
, liblist_offset
,
18517 sizeof (Elf32_External_Lib
),
18519 _("liblist section data"));
18522 printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
18523 "\nSection '.liblist' contains %lu entries:\n",
18524 (unsigned long) liblistno
),
18525 (unsigned long) liblistno
);
18526 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
18529 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
18536 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
18537 atime
= BYTE_GET (elib
[cnt
].l_time_stamp
);
18538 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
18539 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
18540 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
18542 tmp
= gmtime (&atime
);
18543 snprintf (timebuf
, sizeof (timebuf
),
18544 "%04u-%02u-%02uT%02u:%02u:%02u",
18545 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
18546 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
18548 printf ("%3lu: ", (unsigned long) cnt
);
18549 if (valid_dynamic_name (filedata
, liblist
.l_name
))
18550 print_symbol (20, get_dynamic_name (filedata
, liblist
.l_name
));
18552 printf (_("<corrupt: %9ld>"), liblist
.l_name
);
18553 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
18554 liblist
.l_version
);
18556 if (liblist
.l_flags
== 0)
18560 static const struct
18567 { " EXACT_MATCH", LL_EXACT_MATCH
},
18568 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
18569 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
18570 { " EXPORTS", LL_EXPORTS
},
18571 { " DELAY_LOAD", LL_DELAY_LOAD
},
18572 { " DELTA", LL_DELTA
}
18574 int flags
= liblist
.l_flags
;
18577 for (fcnt
= 0; fcnt
< ARRAY_SIZE (l_flags_vals
); ++fcnt
)
18578 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
18580 fputs (l_flags_vals
[fcnt
].name
, stdout
);
18581 flags
^= l_flags_vals
[fcnt
].bit
;
18584 printf (" %#x", (unsigned int) flags
);
18596 if (options_offset
!= 0)
18598 Elf_External_Options
* eopt
;
18602 /* Find the section header so that we get the size. */
18603 sect
= find_section_by_type (filedata
, SHT_MIPS_OPTIONS
);
18604 /* PR 17533 file: 012-277276-0.004. */
18607 error (_("No MIPS_OPTIONS header found\n"));
18611 if (sect
->sh_size
< sizeof (* eopt
))
18613 error (_("The MIPS options section is too small.\n"));
18617 eopt
= (Elf_External_Options
*) get_data (NULL
, filedata
, options_offset
, 1,
18618 sect
->sh_size
, _("options"));
18621 Elf_Internal_Options option
;
18624 while (offset
<= sect
->sh_size
- sizeof (* eopt
))
18626 Elf_External_Options
* eoption
;
18627 unsigned int optsize
;
18629 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
18631 optsize
= BYTE_GET (eoption
->size
);
18633 /* PR 17531: file: ffa0fa3b. */
18634 if (optsize
< sizeof (* eopt
)
18635 || optsize
> sect
->sh_size
- offset
)
18637 error (_("Invalid size (%u) for MIPS option\n"),
18646 printf (ngettext ("\nSection '%s' contains %d entry:\n",
18647 "\nSection '%s' contains %d entries:\n",
18649 printable_section_name (filedata
, sect
), cnt
);
18655 Elf_External_Options
* eoption
;
18657 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
18659 option
.kind
= BYTE_GET (eoption
->kind
);
18660 option
.size
= BYTE_GET (eoption
->size
);
18661 option
.section
= BYTE_GET (eoption
->section
);
18662 option
.info
= BYTE_GET (eoption
->info
);
18664 switch (option
.kind
)
18667 /* This shouldn't happen. */
18668 printf (" NULL %" PRId16
" %" PRIx32
,
18669 option
.section
, option
.info
);
18673 printf (" REGINFO ");
18674 if (filedata
->file_header
.e_machine
== EM_MIPS
)
18676 Elf32_External_RegInfo
* ereg
;
18677 Elf32_RegInfo reginfo
;
18680 if (option
.size
< (sizeof (Elf_External_Options
)
18681 + sizeof (Elf32_External_RegInfo
)))
18683 printf (_("<corrupt>\n"));
18684 error (_("Truncated MIPS REGINFO option\n"));
18689 ereg
= (Elf32_External_RegInfo
*) (eoption
+ 1);
18691 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
18692 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
18693 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
18694 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
18695 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
18696 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
18698 printf ("GPR %08" PRIx32
" GP 0x%" PRIx32
"\n",
18699 reginfo
.ri_gprmask
, reginfo
.ri_gp_value
);
18701 " CPR0 %08" PRIx32
" CPR1 %08" PRIx32
18702 " CPR2 %08" PRIx32
" CPR3 %08" PRIx32
"\n",
18703 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
18704 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
18709 Elf64_External_RegInfo
* ereg
;
18710 Elf64_Internal_RegInfo reginfo
;
18712 if (option
.size
< (sizeof (Elf_External_Options
)
18713 + sizeof (Elf64_External_RegInfo
)))
18715 printf (_("<corrupt>\n"));
18716 error (_("Truncated MIPS REGINFO option\n"));
18721 ereg
= (Elf64_External_RegInfo
*) (eoption
+ 1);
18722 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
18723 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
18724 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
18725 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
18726 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
18727 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
18729 printf ("GPR %08" PRIx32
" GP 0x%" PRIx64
"\n",
18730 reginfo
.ri_gprmask
, reginfo
.ri_gp_value
);
18732 " CPR0 %08" PRIx32
" CPR1 %08" PRIx32
18733 " CPR2 %08" PRIx32
" CPR3 %08" PRIx32
"\n",
18734 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
18735 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
18737 offset
+= option
.size
;
18740 case ODK_EXCEPTIONS
:
18741 fputs (" EXCEPTIONS fpe_min(", stdout
);
18742 process_mips_fpe_exception (option
.info
& OEX_FPU_MIN
);
18743 fputs (") fpe_max(", stdout
);
18744 process_mips_fpe_exception ((option
.info
& OEX_FPU_MAX
) >> 8);
18745 fputs (")", stdout
);
18747 if (option
.info
& OEX_PAGE0
)
18748 fputs (" PAGE0", stdout
);
18749 if (option
.info
& OEX_SMM
)
18750 fputs (" SMM", stdout
);
18751 if (option
.info
& OEX_FPDBUG
)
18752 fputs (" FPDBUG", stdout
);
18753 if (option
.info
& OEX_DISMISS
)
18754 fputs (" DISMISS", stdout
);
18758 fputs (" PAD ", stdout
);
18759 if (option
.info
& OPAD_PREFIX
)
18760 fputs (" PREFIX", stdout
);
18761 if (option
.info
& OPAD_POSTFIX
)
18762 fputs (" POSTFIX", stdout
);
18763 if (option
.info
& OPAD_SYMBOL
)
18764 fputs (" SYMBOL", stdout
);
18768 fputs (" HWPATCH ", stdout
);
18769 if (option
.info
& OHW_R4KEOP
)
18770 fputs (" R4KEOP", stdout
);
18771 if (option
.info
& OHW_R8KPFETCH
)
18772 fputs (" R8KPFETCH", stdout
);
18773 if (option
.info
& OHW_R5KEOP
)
18774 fputs (" R5KEOP", stdout
);
18775 if (option
.info
& OHW_R5KCVTL
)
18776 fputs (" R5KCVTL", stdout
);
18780 fputs (" FILL ", stdout
);
18781 /* XXX Print content of info word? */
18785 fputs (" TAGS ", stdout
);
18786 /* XXX Print content of info word? */
18790 fputs (" HWAND ", 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 fputs (" HWOR ", stdout
);
18799 if (option
.info
& OHWA0_R4KEOP_CHECKED
)
18800 fputs (" R4KEOP_CHECKED", stdout
);
18801 if (option
.info
& OHWA0_R4KEOP_CLEAN
)
18802 fputs (" R4KEOP_CLEAN", stdout
);
18806 printf (" GP_GROUP %#06x self-contained %#06x",
18807 option
.info
& OGP_GROUP
,
18808 (option
.info
& OGP_SELF
) >> 16);
18812 printf (" IDENT %#06x self-contained %#06x",
18813 option
.info
& OGP_GROUP
,
18814 (option
.info
& OGP_SELF
) >> 16);
18818 /* This shouldn't happen. */
18819 printf (" %3d ??? %" PRId16
" %" PRIx32
,
18820 option
.kind
, option
.section
, option
.info
);
18824 len
= sizeof (* eopt
);
18825 while (len
< option
.size
)
18827 unsigned char datum
= *((unsigned char *) eoption
+ len
);
18829 if (ISPRINT (datum
))
18830 printf ("%c", datum
);
18832 printf ("\\%03o", datum
);
18835 fputs ("\n", stdout
);
18837 offset
+= option
.size
;
18845 if (conflicts_offset
!= 0 && conflictsno
!= 0)
18847 Elf32_Conflict
* iconf
;
18850 if (filedata
->dynamic_symbols
== NULL
)
18852 error (_("conflict list found without a dynamic symbol table\n"));
18856 /* PR 21345 - print a slightly more helpful error message
18857 if we are sure that the cmalloc will fail. */
18858 if (conflictsno
> filedata
->file_size
/ sizeof (* iconf
))
18860 error (_("Overlarge number of conflicts detected: %lx\n"),
18861 (long) conflictsno
);
18865 iconf
= (Elf32_Conflict
*) cmalloc (conflictsno
, sizeof (* iconf
));
18868 error (_("Out of memory allocating space for dynamic conflicts\n"));
18874 Elf32_External_Conflict
* econf32
;
18876 econf32
= (Elf32_External_Conflict
*)
18877 get_data (NULL
, filedata
, conflicts_offset
,
18878 sizeof (*econf32
), conflictsno
, _("conflict"));
18885 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
18886 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
18892 Elf64_External_Conflict
* econf64
;
18894 econf64
= (Elf64_External_Conflict
*)
18895 get_data (NULL
, filedata
, conflicts_offset
,
18896 sizeof (*econf64
), conflictsno
, _("conflict"));
18903 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
18904 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
18909 printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
18910 "\nSection '.conflict' contains %lu entries:\n",
18911 (unsigned long) conflictsno
),
18912 (unsigned long) conflictsno
);
18913 puts (_(" Num: Index Value Name"));
18915 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
18917 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
18919 if (iconf
[cnt
] >= filedata
->num_dynamic_syms
)
18920 printf (_("<corrupt symbol index>"));
18923 Elf_Internal_Sym
* psym
;
18925 psym
= & filedata
->dynamic_symbols
[iconf
[cnt
]];
18926 print_vma (psym
->st_value
, FULL_HEX
);
18928 if (valid_dynamic_name (filedata
, psym
->st_name
))
18929 print_symbol (25, get_dynamic_name (filedata
, psym
->st_name
));
18931 printf (_("<corrupt: %14ld>"), psym
->st_name
);
18939 if (pltgot
!= 0 && local_gotno
!= 0)
18941 bfd_vma ent
, local_end
, global_end
;
18943 unsigned char * data
;
18944 unsigned char * data_end
;
18948 addr_size
= (is_32bit_elf
? 4 : 8);
18949 local_end
= pltgot
+ local_gotno
* addr_size
;
18951 /* PR binutils/17533 file: 012-111227-0.004 */
18952 if (symtabno
< gotsym
)
18954 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
18955 (unsigned long) gotsym
, (unsigned long) symtabno
);
18959 global_end
= local_end
+ (symtabno
- gotsym
) * addr_size
;
18960 /* PR 17531: file: 54c91a34. */
18961 if (global_end
< local_end
)
18963 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno
);
18967 offset
= offset_from_vma (filedata
, pltgot
, global_end
- pltgot
);
18968 data
= (unsigned char *) get_data (NULL
, filedata
, offset
,
18969 global_end
- pltgot
, 1,
18970 _("Global Offset Table data"));
18971 /* PR 12855: Null data is handled gracefully throughout. */
18972 data_end
= data
+ (global_end
- pltgot
);
18974 printf (_("\nPrimary GOT:\n"));
18975 printf (_(" Canonical gp value: "));
18976 print_vma (pltgot
+ 0x7ff0, LONG_HEX
);
18979 printf (_(" Reserved entries:\n"));
18980 printf (_(" %*s %10s %*s Purpose\n"),
18981 addr_size
* 2, _("Address"), _("Access"),
18982 addr_size
* 2, _("Initial"));
18983 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
18984 printf (_(" Lazy resolver\n"));
18985 if (ent
== (bfd_vma
) -1)
18986 goto got_print_fail
;
18988 /* Check for the MSB of GOT[1] being set, denoting a GNU object.
18989 This entry will be used by some runtime loaders, to store the
18990 module pointer. Otherwise this is an ordinary local entry.
18991 PR 21344: Check for the entry being fully available before
18994 && data
+ ent
- pltgot
+ addr_size
<= data_end
18995 && (byte_get (data
+ ent
- pltgot
, addr_size
)
18996 >> (addr_size
* 8 - 1)) != 0)
18998 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
18999 printf (_(" Module pointer (GNU extension)\n"));
19000 if (ent
== (bfd_vma
) -1)
19001 goto got_print_fail
;
19005 if (data
!= NULL
&& ent
< local_end
)
19007 printf (_(" Local entries:\n"));
19008 printf (" %*s %10s %*s\n",
19009 addr_size
* 2, _("Address"), _("Access"),
19010 addr_size
* 2, _("Initial"));
19011 while (ent
< local_end
)
19013 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
19015 if (ent
== (bfd_vma
) -1)
19016 goto got_print_fail
;
19021 if (data
!= NULL
&& gotsym
< symtabno
)
19025 printf (_(" Global entries:\n"));
19026 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
19027 addr_size
* 2, _("Address"),
19029 addr_size
* 2, _("Initial"),
19030 addr_size
* 2, _("Sym.Val."),
19032 /* Note for translators: "Ndx" = abbreviated form of "Index". */
19033 _("Ndx"), _("Name"));
19035 sym_width
= (is_32bit_elf
? 80 : 160) - 28 - addr_size
* 6 - 1;
19037 for (i
= gotsym
; i
< symtabno
; i
++)
19039 ent
= print_mips_got_entry (data
, pltgot
, ent
, data_end
);
19042 if (filedata
->dynamic_symbols
== NULL
)
19043 printf (_("<no dynamic symbols>"));
19044 else if (i
< filedata
->num_dynamic_syms
)
19046 Elf_Internal_Sym
* psym
= filedata
->dynamic_symbols
+ i
;
19048 print_vma (psym
->st_value
, LONG_HEX
);
19049 printf (" %-7s %3s ",
19050 get_symbol_type (filedata
, ELF_ST_TYPE (psym
->st_info
)),
19051 get_symbol_index_type (filedata
, psym
->st_shndx
));
19053 if (valid_dynamic_name (filedata
, psym
->st_name
))
19054 print_symbol (sym_width
,
19055 get_dynamic_name (filedata
, psym
->st_name
));
19057 printf (_("<corrupt: %14ld>"), psym
->st_name
);
19060 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
19061 (unsigned long) i
);
19064 if (ent
== (bfd_vma
) -1)
19074 if (mips_pltgot
!= 0 && jmprel
!= 0 && pltrel
!= 0 && pltrelsz
!= 0)
19077 size_t offset
, rel_offset
;
19078 unsigned long count
, i
;
19079 unsigned char * data
;
19080 int addr_size
, sym_width
;
19081 Elf_Internal_Rela
* rels
;
19083 rel_offset
= offset_from_vma (filedata
, jmprel
, pltrelsz
);
19084 if (pltrel
== DT_RELA
)
19086 if (!slurp_rela_relocs (filedata
, rel_offset
, pltrelsz
, &rels
, &count
))
19091 if (!slurp_rel_relocs (filedata
, rel_offset
, pltrelsz
, &rels
, &count
))
19096 addr_size
= (is_32bit_elf
? 4 : 8);
19097 end
= mips_pltgot
+ (2 + count
) * addr_size
;
19099 offset
= offset_from_vma (filedata
, mips_pltgot
, end
- mips_pltgot
);
19100 data
= (unsigned char *) get_data (NULL
, filedata
, offset
, end
- mips_pltgot
,
19101 1, _("Procedure Linkage Table data"));
19108 printf ("\nPLT GOT:\n\n");
19109 printf (_(" Reserved entries:\n"));
19110 printf (_(" %*s %*s Purpose\n"),
19111 addr_size
* 2, _("Address"), addr_size
* 2, _("Initial"));
19112 ent
= print_mips_pltgot_entry (data
, mips_pltgot
, ent
);
19113 printf (_(" PLT lazy resolver\n"));
19114 ent
= print_mips_pltgot_entry (data
, mips_pltgot
, ent
);
19115 printf (_(" Module pointer\n"));
19118 printf (_(" Entries:\n"));
19119 printf (" %*s %*s %*s %-7s %3s %s\n",
19120 addr_size
* 2, _("Address"),
19121 addr_size
* 2, _("Initial"),
19122 addr_size
* 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
19123 sym_width
= (is_32bit_elf
? 80 : 160) - 17 - addr_size
* 6 - 1;
19124 for (i
= 0; i
< count
; i
++)
19126 unsigned long idx
= get_reloc_symindex (rels
[i
].r_info
);
19128 ent
= print_mips_pltgot_entry (data
, mips_pltgot
, ent
);
19131 if (idx
>= filedata
->num_dynamic_syms
)
19132 printf (_("<corrupt symbol index: %lu>"), idx
);
19135 Elf_Internal_Sym
* psym
= filedata
->dynamic_symbols
+ idx
;
19137 print_vma (psym
->st_value
, LONG_HEX
);
19138 printf (" %-7s %3s ",
19139 get_symbol_type (filedata
, ELF_ST_TYPE (psym
->st_info
)),
19140 get_symbol_index_type (filedata
, psym
->st_shndx
));
19141 if (valid_dynamic_name (filedata
, psym
->st_name
))
19142 print_symbol (sym_width
,
19143 get_dynamic_name (filedata
, psym
->st_name
));
19145 printf (_("<corrupt: %14ld>"), psym
->st_name
);
19159 process_nds32_specific (Filedata
* filedata
)
19161 Elf_Internal_Shdr
*sect
= NULL
;
19163 sect
= find_section (filedata
, ".nds32_e_flags");
19164 if (sect
!= NULL
&& sect
->sh_size
>= 4)
19166 unsigned char *buf
;
19169 printf ("\nNDS32 elf flags section:\n");
19170 buf
= get_data (NULL
, filedata
, sect
->sh_offset
, 1, 4,
19171 _("NDS32 elf flags section"));
19176 flag
= byte_get (buf
, 4);
19178 switch (flag
& 0x3)
19181 printf ("(VEC_SIZE):\tNo entry.\n");
19184 printf ("(VEC_SIZE):\t4 bytes\n");
19187 printf ("(VEC_SIZE):\t16 bytes\n");
19190 printf ("(VEC_SIZE):\treserved\n");
19199 process_gnu_liblist (Filedata
* filedata
)
19201 Elf_Internal_Shdr
* section
;
19202 Elf_Internal_Shdr
* string_sec
;
19203 Elf32_External_Lib
* elib
;
19205 size_t strtab_size
;
19207 unsigned long num_liblist
;
19214 for (i
= 0, section
= filedata
->section_headers
;
19215 i
< filedata
->file_header
.e_shnum
;
19218 switch (section
->sh_type
)
19220 case SHT_GNU_LIBLIST
:
19221 if (section
->sh_link
>= filedata
->file_header
.e_shnum
)
19224 elib
= (Elf32_External_Lib
*)
19225 get_data (NULL
, filedata
, section
->sh_offset
, 1, section
->sh_size
,
19226 _("liblist section data"));
19234 string_sec
= filedata
->section_headers
+ section
->sh_link
;
19235 strtab
= (char *) get_data (NULL
, filedata
, string_sec
->sh_offset
, 1,
19236 string_sec
->sh_size
,
19237 _("liblist string table"));
19239 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
19246 strtab_size
= string_sec
->sh_size
;
19248 num_liblist
= section
->sh_size
/ sizeof (Elf32_External_Lib
);
19249 printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
19250 "\nLibrary list section '%s' contains %lu entries:\n",
19252 printable_section_name (filedata
, section
),
19255 puts (_(" Library Time Stamp Checksum Version Flags"));
19257 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
19265 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
19266 atime
= BYTE_GET (elib
[cnt
].l_time_stamp
);
19267 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
19268 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
19269 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
19271 tmp
= gmtime (&atime
);
19272 snprintf (timebuf
, sizeof (timebuf
),
19273 "%04u-%02u-%02uT%02u:%02u:%02u",
19274 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
19275 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
19277 printf ("%3lu: ", (unsigned long) cnt
);
19279 printf ("%-20s", liblist
.l_name
< strtab_size
19280 ? strtab
+ liblist
.l_name
: _("<corrupt>"));
19282 printf ("%-20.20s", liblist
.l_name
< strtab_size
19283 ? strtab
+ liblist
.l_name
: _("<corrupt>"));
19284 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
19285 liblist
.l_version
, liblist
.l_flags
);
19296 static const char *
19297 get_note_type (Filedata
* filedata
, unsigned e_type
)
19299 static char buff
[64];
19301 if (filedata
->file_header
.e_type
== ET_CORE
)
19305 return _("NT_AUXV (auxiliary vector)");
19307 return _("NT_PRSTATUS (prstatus structure)");
19309 return _("NT_FPREGSET (floating point registers)");
19311 return _("NT_PRPSINFO (prpsinfo structure)");
19312 case NT_TASKSTRUCT
:
19313 return _("NT_TASKSTRUCT (task structure)");
19315 return _("NT_GDB_TDESC (GDB XML target description)");
19317 return _("NT_PRXFPREG (user_xfpregs structure)");
19319 return _("NT_PPC_VMX (ppc Altivec registers)");
19321 return _("NT_PPC_VSX (ppc VSX registers)");
19323 return _("NT_PPC_TAR (ppc TAR register)");
19325 return _("NT_PPC_PPR (ppc PPR register)");
19327 return _("NT_PPC_DSCR (ppc DSCR register)");
19329 return _("NT_PPC_EBB (ppc EBB registers)");
19331 return _("NT_PPC_PMU (ppc PMU registers)");
19332 case NT_PPC_TM_CGPR
:
19333 return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
19334 case NT_PPC_TM_CFPR
:
19335 return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
19336 case NT_PPC_TM_CVMX
:
19337 return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
19338 case NT_PPC_TM_CVSX
:
19339 return _("NT_PPC_TM_CVSX (ppc checkpointed VSX registers)");
19340 case NT_PPC_TM_SPR
:
19341 return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
19342 case NT_PPC_TM_CTAR
:
19343 return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
19344 case NT_PPC_TM_CPPR
:
19345 return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
19346 case NT_PPC_TM_CDSCR
:
19347 return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
19349 return _("NT_386_TLS (x86 TLS information)");
19350 case NT_386_IOPERM
:
19351 return _("NT_386_IOPERM (x86 I/O permissions)");
19352 case NT_X86_XSTATE
:
19353 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
19355 return _("NT_X86_CET (x86 CET state)");
19356 case NT_S390_HIGH_GPRS
:
19357 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
19358 case NT_S390_TIMER
:
19359 return _("NT_S390_TIMER (s390 timer register)");
19360 case NT_S390_TODCMP
:
19361 return _("NT_S390_TODCMP (s390 TOD comparator register)");
19362 case NT_S390_TODPREG
:
19363 return _("NT_S390_TODPREG (s390 TOD programmable register)");
19365 return _("NT_S390_CTRS (s390 control registers)");
19366 case NT_S390_PREFIX
:
19367 return _("NT_S390_PREFIX (s390 prefix register)");
19368 case NT_S390_LAST_BREAK
:
19369 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
19370 case NT_S390_SYSTEM_CALL
:
19371 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
19373 return _("NT_S390_TDB (s390 transaction diagnostic block)");
19374 case NT_S390_VXRS_LOW
:
19375 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
19376 case NT_S390_VXRS_HIGH
:
19377 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
19378 case NT_S390_GS_CB
:
19379 return _("NT_S390_GS_CB (s390 guarded-storage registers)");
19380 case NT_S390_GS_BC
:
19381 return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
19383 return _("NT_ARM_VFP (arm VFP registers)");
19385 return _("NT_ARM_TLS (AArch TLS registers)");
19386 case NT_ARM_HW_BREAK
:
19387 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
19388 case NT_ARM_HW_WATCH
:
19389 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
19390 case NT_ARM_SYSTEM_CALL
:
19391 return _("NT_ARM_SYSTEM_CALL (AArch system call number)");
19393 return _("NT_ARM_SVE (AArch SVE registers)");
19394 case NT_ARM_PAC_MASK
:
19395 return _("NT_ARM_PAC_MASK (AArch pointer authentication code masks)");
19396 case NT_ARM_PACA_KEYS
:
19397 return _("NT_ARM_PACA_KEYS (ARM pointer authentication address keys)");
19398 case NT_ARM_PACG_KEYS
:
19399 return _("NT_ARM_PACG_KEYS (ARM pointer authentication generic keys)");
19400 case NT_ARM_TAGGED_ADDR_CTRL
:
19401 return _("NT_ARM_TAGGED_ADDR_CTRL (AArch tagged address control)");
19402 case NT_ARM_PAC_ENABLED_KEYS
:
19403 return _("NT_ARM_PAC_ENABLED_KEYS (AArch64 pointer authentication enabled keys)");
19405 return _("NT_ARC_V2 (ARC HS accumulator/extra registers)");
19407 return _("NT_RISCV_CSR (RISC-V control and status registers)");
19409 return _("NT_PSTATUS (pstatus structure)");
19411 return _("NT_FPREGS (floating point registers)");
19413 return _("NT_PSINFO (psinfo structure)");
19415 return _("NT_LWPSTATUS (lwpstatus_t structure)");
19417 return _("NT_LWPSINFO (lwpsinfo_t structure)");
19418 case NT_WIN32PSTATUS
:
19419 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
19421 return _("NT_SIGINFO (siginfo_t data)");
19423 return _("NT_FILE (mapped files)");
19431 return _("NT_VERSION (version)");
19433 return _("NT_ARCH (architecture)");
19434 case NT_GNU_BUILD_ATTRIBUTE_OPEN
:
19436 case NT_GNU_BUILD_ATTRIBUTE_FUNC
:
19438 case NT_GO_BUILDID
:
19439 return _("GO BUILDID");
19440 case FDO_PACKAGING_METADATA
:
19441 return _("FDO_PACKAGING_METADATA");
19446 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
19451 print_core_note (Elf_Internal_Note
*pnote
)
19453 unsigned int addr_size
= is_32bit_elf
? 4 : 8;
19454 bfd_vma count
, page_size
;
19455 unsigned char *descdata
, *filenames
, *descend
;
19457 if (pnote
->type
!= NT_FILE
)
19467 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
19468 /* Still "successful". */
19473 if (pnote
->descsz
< 2 * addr_size
)
19475 error (_(" Malformed note - too short for header\n"));
19479 descdata
= (unsigned char *) pnote
->descdata
;
19480 descend
= descdata
+ pnote
->descsz
;
19482 if (descdata
[pnote
->descsz
- 1] != '\0')
19484 error (_(" Malformed note - does not end with \\0\n"));
19488 count
= byte_get (descdata
, addr_size
);
19489 descdata
+= addr_size
;
19491 page_size
= byte_get (descdata
, addr_size
);
19492 descdata
+= addr_size
;
19494 if (count
> ((bfd_vma
) -1 - 2 * addr_size
) / (3 * addr_size
)
19495 || pnote
->descsz
< 2 * addr_size
+ count
* 3 * addr_size
)
19497 error (_(" Malformed note - too short for supplied file count\n"));
19501 printf (_(" Page size: "));
19502 print_vma (page_size
, DEC
);
19505 printf (_(" %*s%*s%*s\n"),
19506 (int) (2 + 2 * addr_size
), _("Start"),
19507 (int) (4 + 2 * addr_size
), _("End"),
19508 (int) (4 + 2 * addr_size
), _("Page Offset"));
19509 filenames
= descdata
+ count
* 3 * addr_size
;
19510 while (count
-- > 0)
19512 bfd_vma start
, end
, file_ofs
;
19514 if (filenames
== descend
)
19516 error (_(" Malformed note - filenames end too early\n"));
19520 start
= byte_get (descdata
, addr_size
);
19521 descdata
+= addr_size
;
19522 end
= byte_get (descdata
, addr_size
);
19523 descdata
+= addr_size
;
19524 file_ofs
= byte_get (descdata
, addr_size
);
19525 descdata
+= addr_size
;
19528 print_vma (start
, FULL_HEX
);
19530 print_vma (end
, FULL_HEX
);
19532 print_vma (file_ofs
, FULL_HEX
);
19533 printf ("\n %s\n", filenames
);
19535 filenames
+= 1 + strlen ((char *) filenames
);
19541 static const char *
19542 get_gnu_elf_note_type (unsigned e_type
)
19544 /* NB/ Keep this switch statement in sync with print_gnu_note (). */
19547 case NT_GNU_ABI_TAG
:
19548 return _("NT_GNU_ABI_TAG (ABI version tag)");
19550 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
19551 case NT_GNU_BUILD_ID
:
19552 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
19553 case NT_GNU_GOLD_VERSION
:
19554 return _("NT_GNU_GOLD_VERSION (gold version)");
19555 case NT_GNU_PROPERTY_TYPE_0
:
19556 return _("NT_GNU_PROPERTY_TYPE_0");
19557 case NT_GNU_BUILD_ATTRIBUTE_OPEN
:
19558 return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
19559 case NT_GNU_BUILD_ATTRIBUTE_FUNC
:
19560 return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
19563 static char buff
[64];
19565 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
19572 decode_x86_compat_isa (unsigned int bitmask
)
19576 unsigned int bit
= bitmask
& (- bitmask
);
19581 case GNU_PROPERTY_X86_COMPAT_ISA_1_486
:
19584 case GNU_PROPERTY_X86_COMPAT_ISA_1_586
:
19587 case GNU_PROPERTY_X86_COMPAT_ISA_1_686
:
19590 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE
:
19593 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE2
:
19596 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE3
:
19599 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSSE3
:
19602 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_1
:
19605 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_2
:
19608 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX
:
19611 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX2
:
19614 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512F
:
19615 printf ("AVX512F");
19617 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512CD
:
19618 printf ("AVX512CD");
19620 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512ER
:
19621 printf ("AVX512ER");
19623 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512PF
:
19624 printf ("AVX512PF");
19626 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512VL
:
19627 printf ("AVX512VL");
19629 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512DQ
:
19630 printf ("AVX512DQ");
19632 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512BW
:
19633 printf ("AVX512BW");
19636 printf (_("<unknown: %x>"), bit
);
19645 decode_x86_compat_2_isa (unsigned int bitmask
)
19649 printf (_("<None>"));
19655 unsigned int bit
= bitmask
& (- bitmask
);
19660 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_CMOV
:
19663 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSE
:
19666 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSE2
:
19669 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSE3
:
19672 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSSE3
:
19675 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSE4_1
:
19678 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSE4_2
:
19681 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX
:
19684 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX2
:
19687 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_FMA
:
19690 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512F
:
19691 printf ("AVX512F");
19693 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512CD
:
19694 printf ("AVX512CD");
19696 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512ER
:
19697 printf ("AVX512ER");
19699 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512PF
:
19700 printf ("AVX512PF");
19702 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512VL
:
19703 printf ("AVX512VL");
19705 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512DQ
:
19706 printf ("AVX512DQ");
19708 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512BW
:
19709 printf ("AVX512BW");
19711 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_4FMAPS
:
19712 printf ("AVX512_4FMAPS");
19714 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_4VNNIW
:
19715 printf ("AVX512_4VNNIW");
19717 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_BITALG
:
19718 printf ("AVX512_BITALG");
19720 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_IFMA
:
19721 printf ("AVX512_IFMA");
19723 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_VBMI
:
19724 printf ("AVX512_VBMI");
19726 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_VBMI2
:
19727 printf ("AVX512_VBMI2");
19729 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_VNNI
:
19730 printf ("AVX512_VNNI");
19732 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_BF16
:
19733 printf ("AVX512_BF16");
19736 printf (_("<unknown: %x>"), bit
);
19744 static const char *
19745 get_amdgpu_elf_note_type (unsigned int e_type
)
19749 case NT_AMDGPU_METADATA
:
19750 return _("NT_AMDGPU_METADATA (code object metadata)");
19753 static char buf
[64];
19754 snprintf (buf
, sizeof (buf
), _("Unknown note type: (0x%08x)"), e_type
);
19761 decode_x86_isa (unsigned int bitmask
)
19765 unsigned int bit
= bitmask
& (- bitmask
);
19770 case GNU_PROPERTY_X86_ISA_1_BASELINE
:
19771 printf ("x86-64-baseline");
19773 case GNU_PROPERTY_X86_ISA_1_V2
:
19774 printf ("x86-64-v2");
19776 case GNU_PROPERTY_X86_ISA_1_V3
:
19777 printf ("x86-64-v3");
19779 case GNU_PROPERTY_X86_ISA_1_V4
:
19780 printf ("x86-64-v4");
19783 printf (_("<unknown: %x>"), bit
);
19792 decode_x86_feature_1 (unsigned int bitmask
)
19796 printf (_("<None>"));
19802 unsigned int bit
= bitmask
& (- bitmask
);
19807 case GNU_PROPERTY_X86_FEATURE_1_IBT
:
19810 case GNU_PROPERTY_X86_FEATURE_1_SHSTK
:
19813 case GNU_PROPERTY_X86_FEATURE_1_LAM_U48
:
19814 printf ("LAM_U48");
19816 case GNU_PROPERTY_X86_FEATURE_1_LAM_U57
:
19817 printf ("LAM_U57");
19820 printf (_("<unknown: %x>"), bit
);
19829 decode_x86_feature_2 (unsigned int bitmask
)
19833 printf (_("<None>"));
19839 unsigned int bit
= bitmask
& (- bitmask
);
19844 case GNU_PROPERTY_X86_FEATURE_2_X86
:
19847 case GNU_PROPERTY_X86_FEATURE_2_X87
:
19850 case GNU_PROPERTY_X86_FEATURE_2_MMX
:
19853 case GNU_PROPERTY_X86_FEATURE_2_XMM
:
19856 case GNU_PROPERTY_X86_FEATURE_2_YMM
:
19859 case GNU_PROPERTY_X86_FEATURE_2_ZMM
:
19862 case GNU_PROPERTY_X86_FEATURE_2_TMM
:
19865 case GNU_PROPERTY_X86_FEATURE_2_MASK
:
19868 case GNU_PROPERTY_X86_FEATURE_2_FXSR
:
19871 case GNU_PROPERTY_X86_FEATURE_2_XSAVE
:
19874 case GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT
:
19875 printf ("XSAVEOPT");
19877 case GNU_PROPERTY_X86_FEATURE_2_XSAVEC
:
19881 printf (_("<unknown: %x>"), bit
);
19890 decode_aarch64_feature_1_and (unsigned int bitmask
)
19894 unsigned int bit
= bitmask
& (- bitmask
);
19899 case GNU_PROPERTY_AARCH64_FEATURE_1_BTI
:
19903 case GNU_PROPERTY_AARCH64_FEATURE_1_PAC
:
19908 printf (_("<unknown: %x>"), bit
);
19917 decode_1_needed (unsigned int bitmask
)
19921 unsigned int bit
= bitmask
& (- bitmask
);
19926 case GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS
:
19927 printf ("indirect external access");
19930 printf (_("<unknown: %x>"), bit
);
19939 print_gnu_property_note (Filedata
* filedata
, Elf_Internal_Note
* pnote
)
19941 unsigned char * ptr
= (unsigned char *) pnote
->descdata
;
19942 unsigned char * ptr_end
= ptr
+ pnote
->descsz
;
19943 unsigned int size
= is_32bit_elf
? 4 : 8;
19945 printf (_(" Properties: "));
19947 if (pnote
->descsz
< 8 || (pnote
->descsz
% size
) != 0)
19949 printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote
->descsz
);
19953 while (ptr
< ptr_end
)
19957 unsigned int datasz
;
19959 if ((size_t) (ptr_end
- ptr
) < 8)
19961 printf (_("<corrupt descsz: %#lx>\n"), pnote
->descsz
);
19965 type
= byte_get (ptr
, 4);
19966 datasz
= byte_get (ptr
+ 4, 4);
19970 if (datasz
> (size_t) (ptr_end
- ptr
))
19972 printf (_("<corrupt type (%#x) datasz: %#x>\n"),
19977 if (type
>= GNU_PROPERTY_LOPROC
&& type
<= GNU_PROPERTY_HIPROC
)
19979 if (filedata
->file_header
.e_machine
== EM_X86_64
19980 || filedata
->file_header
.e_machine
== EM_IAMCU
19981 || filedata
->file_header
.e_machine
== EM_386
)
19983 unsigned int bitmask
;
19986 bitmask
= byte_get (ptr
, 4);
19992 case GNU_PROPERTY_X86_ISA_1_USED
:
19994 printf (_("x86 ISA used: <corrupt length: %#x> "),
19998 printf ("x86 ISA used: ");
19999 decode_x86_isa (bitmask
);
20003 case GNU_PROPERTY_X86_ISA_1_NEEDED
:
20005 printf (_("x86 ISA needed: <corrupt length: %#x> "),
20009 printf ("x86 ISA needed: ");
20010 decode_x86_isa (bitmask
);
20014 case GNU_PROPERTY_X86_FEATURE_1_AND
:
20016 printf (_("x86 feature: <corrupt length: %#x> "),
20020 printf ("x86 feature: ");
20021 decode_x86_feature_1 (bitmask
);
20025 case GNU_PROPERTY_X86_FEATURE_2_USED
:
20027 printf (_("x86 feature used: <corrupt length: %#x> "),
20031 printf ("x86 feature used: ");
20032 decode_x86_feature_2 (bitmask
);
20036 case GNU_PROPERTY_X86_FEATURE_2_NEEDED
:
20038 printf (_("x86 feature needed: <corrupt length: %#x> "), datasz
);
20041 printf ("x86 feature needed: ");
20042 decode_x86_feature_2 (bitmask
);
20046 case GNU_PROPERTY_X86_COMPAT_ISA_1_USED
:
20048 printf (_("x86 ISA used: <corrupt length: %#x> "),
20052 printf ("x86 ISA used: ");
20053 decode_x86_compat_isa (bitmask
);
20057 case GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED
:
20059 printf (_("x86 ISA needed: <corrupt length: %#x> "),
20063 printf ("x86 ISA needed: ");
20064 decode_x86_compat_isa (bitmask
);
20068 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_USED
:
20070 printf (_("x86 ISA used: <corrupt length: %#x> "),
20074 printf ("x86 ISA used: ");
20075 decode_x86_compat_2_isa (bitmask
);
20079 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_NEEDED
:
20081 printf (_("x86 ISA needed: <corrupt length: %#x> "),
20085 printf ("x86 ISA needed: ");
20086 decode_x86_compat_2_isa (bitmask
);
20094 else if (filedata
->file_header
.e_machine
== EM_AARCH64
)
20096 if (type
== GNU_PROPERTY_AARCH64_FEATURE_1_AND
)
20098 printf ("AArch64 feature: ");
20100 printf (_("<corrupt length: %#x> "), datasz
);
20102 decode_aarch64_feature_1_and (byte_get (ptr
, 4));
20111 case GNU_PROPERTY_STACK_SIZE
:
20112 printf (_("stack size: "));
20113 if (datasz
!= size
)
20114 printf (_("<corrupt length: %#x> "), datasz
);
20116 printf ("%#lx", (unsigned long) byte_get (ptr
, size
));
20119 case GNU_PROPERTY_NO_COPY_ON_PROTECTED
:
20120 printf ("no copy on protected ");
20122 printf (_("<corrupt length: %#x> "), datasz
);
20126 if ((type
>= GNU_PROPERTY_UINT32_AND_LO
20127 && type
<= GNU_PROPERTY_UINT32_AND_HI
)
20128 || (type
>= GNU_PROPERTY_UINT32_OR_LO
20129 && type
<= GNU_PROPERTY_UINT32_OR_HI
))
20133 case GNU_PROPERTY_1_NEEDED
:
20135 printf (_("1_needed: <corrupt length: %#x> "),
20139 unsigned int bitmask
= byte_get (ptr
, 4);
20140 printf ("1_needed: ");
20141 decode_1_needed (bitmask
);
20148 if (type
<= GNU_PROPERTY_UINT32_AND_HI
)
20149 printf (_("UINT32_AND (%#x): "), type
);
20151 printf (_("UINT32_OR (%#x): "), type
);
20153 printf (_("<corrupt length: %#x> "), datasz
);
20155 printf ("%#x", (unsigned int) byte_get (ptr
, 4));
20162 if (type
< GNU_PROPERTY_LOPROC
)
20163 printf (_("<unknown type %#x data: "), type
);
20164 else if (type
< GNU_PROPERTY_LOUSER
)
20165 printf (_("<processor-specific type %#x data: "), type
);
20167 printf (_("<application-specific type %#x data: "), type
);
20168 for (j
= 0; j
< datasz
; ++j
)
20169 printf ("%02x ", ptr
[j
] & 0xff);
20173 ptr
+= ((datasz
+ (size
- 1)) & ~ (size
- 1));
20174 if (ptr
== ptr_end
)
20187 print_gnu_note (Filedata
* filedata
, Elf_Internal_Note
*pnote
)
20189 /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type (). */
20190 switch (pnote
->type
)
20192 case NT_GNU_BUILD_ID
:
20196 printf (_(" Build ID: "));
20197 for (i
= 0; i
< pnote
->descsz
; ++i
)
20198 printf ("%02x", pnote
->descdata
[i
] & 0xff);
20203 case NT_GNU_ABI_TAG
:
20205 unsigned long os
, major
, minor
, subminor
;
20206 const char *osname
;
20208 /* PR 17531: file: 030-599401-0.004. */
20209 if (pnote
->descsz
< 16)
20211 printf (_(" <corrupt GNU_ABI_TAG>\n"));
20215 os
= byte_get ((unsigned char *) pnote
->descdata
, 4);
20216 major
= byte_get ((unsigned char *) pnote
->descdata
+ 4, 4);
20217 minor
= byte_get ((unsigned char *) pnote
->descdata
+ 8, 4);
20218 subminor
= byte_get ((unsigned char *) pnote
->descdata
+ 12, 4);
20222 case GNU_ABI_TAG_LINUX
:
20225 case GNU_ABI_TAG_HURD
:
20228 case GNU_ABI_TAG_SOLARIS
:
20229 osname
= "Solaris";
20231 case GNU_ABI_TAG_FREEBSD
:
20232 osname
= "FreeBSD";
20234 case GNU_ABI_TAG_NETBSD
:
20237 case GNU_ABI_TAG_SYLLABLE
:
20238 osname
= "Syllable";
20240 case GNU_ABI_TAG_NACL
:
20244 osname
= "Unknown";
20248 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname
,
20249 major
, minor
, subminor
);
20253 case NT_GNU_GOLD_VERSION
:
20257 printf (_(" Version: "));
20258 for (i
= 0; i
< pnote
->descsz
&& pnote
->descdata
[i
] != '\0'; ++i
)
20259 printf ("%c", pnote
->descdata
[i
]);
20266 unsigned long num_entries
, mask
;
20268 /* Hardware capabilities information. Word 0 is the number of entries.
20269 Word 1 is a bitmask of enabled entries. The rest of the descriptor
20270 is a series of entries, where each entry is a single byte followed
20271 by a nul terminated string. The byte gives the bit number to test
20272 if enabled in the bitmask. */
20273 printf (_(" Hardware Capabilities: "));
20274 if (pnote
->descsz
< 8)
20276 error (_("<corrupt GNU_HWCAP>\n"));
20279 num_entries
= byte_get ((unsigned char *) pnote
->descdata
, 4);
20280 mask
= byte_get ((unsigned char *) pnote
->descdata
+ 4, 4);
20281 printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries
, mask
);
20282 /* FIXME: Add code to display the entries... */
20286 case NT_GNU_PROPERTY_TYPE_0
:
20287 print_gnu_property_note (filedata
, pnote
);
20291 /* Handle unrecognised types. An error message should have already been
20292 created by get_gnu_elf_note_type(), so all that we need to do is to
20293 display the data. */
20297 printf (_(" Description data: "));
20298 for (i
= 0; i
< pnote
->descsz
; ++i
)
20299 printf ("%02x ", pnote
->descdata
[i
] & 0xff);
20308 static const char *
20309 get_v850_elf_note_type (enum v850_notes n_type
)
20311 static char buff
[64];
20315 case V850_NOTE_ALIGNMENT
: return _("Alignment of 8-byte objects");
20316 case V850_NOTE_DATA_SIZE
: return _("Sizeof double and long double");
20317 case V850_NOTE_FPU_INFO
: return _("Type of FPU support needed");
20318 case V850_NOTE_SIMD_INFO
: return _("Use of SIMD instructions");
20319 case V850_NOTE_CACHE_INFO
: return _("Use of cache");
20320 case V850_NOTE_MMU_INFO
: return _("Use of MMU");
20322 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), n_type
);
20328 print_v850_note (Elf_Internal_Note
* pnote
)
20332 if (pnote
->descsz
!= 4)
20335 val
= byte_get ((unsigned char *) pnote
->descdata
, pnote
->descsz
);
20339 printf (_("not set\n"));
20343 switch (pnote
->type
)
20345 case V850_NOTE_ALIGNMENT
:
20348 case EF_RH850_DATA_ALIGN4
: printf (_("4-byte\n")); return true;
20349 case EF_RH850_DATA_ALIGN8
: printf (_("8-byte\n")); return true;
20353 case V850_NOTE_DATA_SIZE
:
20356 case EF_RH850_DOUBLE32
: printf (_("4-bytes\n")); return true;
20357 case EF_RH850_DOUBLE64
: printf (_("8-bytes\n")); return true;
20361 case V850_NOTE_FPU_INFO
:
20364 case EF_RH850_FPU20
: printf (_("FPU-2.0\n")); return true;
20365 case EF_RH850_FPU30
: printf (_("FPU-3.0\n")); return true;
20369 case V850_NOTE_MMU_INFO
:
20370 case V850_NOTE_CACHE_INFO
:
20371 case V850_NOTE_SIMD_INFO
:
20372 if (val
== EF_RH850_SIMD
)
20374 printf (_("yes\n"));
20380 /* An 'unknown note type' message will already have been displayed. */
20384 printf (_("unknown value: %x\n"), val
);
20389 process_netbsd_elf_note (Elf_Internal_Note
* pnote
)
20391 unsigned int version
;
20393 switch (pnote
->type
)
20395 case NT_NETBSD_IDENT
:
20396 if (pnote
->descsz
< 1)
20398 version
= byte_get ((unsigned char *) pnote
->descdata
, sizeof (version
));
20399 if ((version
/ 10000) % 100)
20400 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote
->descsz
,
20401 version
, version
/ 100000000, (version
/ 1000000) % 100,
20402 (version
/ 10000) % 100 > 26 ? "Z" : "",
20403 'A' + (version
/ 10000) % 26);
20405 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote
->descsz
,
20406 version
, version
/ 100000000, (version
/ 1000000) % 100,
20407 (version
/ 100) % 100);
20410 case NT_NETBSD_MARCH
:
20411 printf (" NetBSD\t\t0x%08lx\tMARCH <%s>\n", pnote
->descsz
,
20415 case NT_NETBSD_PAX
:
20416 if (pnote
->descsz
< 1)
20418 version
= byte_get ((unsigned char *) pnote
->descdata
, sizeof (version
));
20419 printf (" NetBSD\t\t0x%08lx\tPaX <%s%s%s%s%s%s>\n", pnote
->descsz
,
20420 ((version
& NT_NETBSD_PAX_MPROTECT
) ? "+mprotect" : ""),
20421 ((version
& NT_NETBSD_PAX_NOMPROTECT
) ? "-mprotect" : ""),
20422 ((version
& NT_NETBSD_PAX_GUARD
) ? "+guard" : ""),
20423 ((version
& NT_NETBSD_PAX_NOGUARD
) ? "-guard" : ""),
20424 ((version
& NT_NETBSD_PAX_ASLR
) ? "+ASLR" : ""),
20425 ((version
& NT_NETBSD_PAX_NOASLR
) ? "-ASLR" : ""));
20429 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n",
20430 pnote
->descsz
, pnote
->type
);
20434 static const char *
20435 get_freebsd_elfcore_note_type (Filedata
* filedata
, unsigned e_type
)
20439 case NT_FREEBSD_THRMISC
:
20440 return _("NT_THRMISC (thrmisc structure)");
20441 case NT_FREEBSD_PROCSTAT_PROC
:
20442 return _("NT_PROCSTAT_PROC (proc data)");
20443 case NT_FREEBSD_PROCSTAT_FILES
:
20444 return _("NT_PROCSTAT_FILES (files data)");
20445 case NT_FREEBSD_PROCSTAT_VMMAP
:
20446 return _("NT_PROCSTAT_VMMAP (vmmap data)");
20447 case NT_FREEBSD_PROCSTAT_GROUPS
:
20448 return _("NT_PROCSTAT_GROUPS (groups data)");
20449 case NT_FREEBSD_PROCSTAT_UMASK
:
20450 return _("NT_PROCSTAT_UMASK (umask data)");
20451 case NT_FREEBSD_PROCSTAT_RLIMIT
:
20452 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
20453 case NT_FREEBSD_PROCSTAT_OSREL
:
20454 return _("NT_PROCSTAT_OSREL (osreldate data)");
20455 case NT_FREEBSD_PROCSTAT_PSSTRINGS
:
20456 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
20457 case NT_FREEBSD_PROCSTAT_AUXV
:
20458 return _("NT_PROCSTAT_AUXV (auxv data)");
20459 case NT_FREEBSD_PTLWPINFO
:
20460 return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
20461 case NT_FREEBSD_X86_SEGBASES
:
20462 return _("NT_X86_SEGBASES (x86 segment base registers)");
20464 return get_note_type (filedata
, e_type
);
20467 static const char *
20468 get_netbsd_elfcore_note_type (Filedata
* filedata
, unsigned e_type
)
20470 static char buff
[64];
20474 case NT_NETBSDCORE_PROCINFO
:
20475 /* NetBSD core "procinfo" structure. */
20476 return _("NetBSD procinfo structure");
20478 case NT_NETBSDCORE_AUXV
:
20479 return _("NetBSD ELF auxiliary vector data");
20481 case NT_NETBSDCORE_LWPSTATUS
:
20482 return _("PT_LWPSTATUS (ptrace_lwpstatus structure)");
20485 /* As of Jan 2020 there are no other machine-independent notes
20486 defined for NetBSD core files. If the note type is less
20487 than the start of the machine-dependent note types, we don't
20490 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
20492 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
20498 switch (filedata
->file_header
.e_machine
)
20500 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
20501 and PT_GETFPREGS == mach+2. */
20506 case EM_SPARC32PLUS
:
20510 case NT_NETBSDCORE_FIRSTMACH
+ 0:
20511 return _("PT_GETREGS (reg structure)");
20512 case NT_NETBSDCORE_FIRSTMACH
+ 2:
20513 return _("PT_GETFPREGS (fpreg structure)");
20519 /* On SuperH, PT_GETREGS == mach+3 and PT_GETFPREGS == mach+5.
20520 There's also old PT___GETREGS40 == mach + 1 for old reg
20521 structure which lacks GBR. */
20525 case NT_NETBSDCORE_FIRSTMACH
+ 1:
20526 return _("PT___GETREGS40 (old reg structure)");
20527 case NT_NETBSDCORE_FIRSTMACH
+ 3:
20528 return _("PT_GETREGS (reg structure)");
20529 case NT_NETBSDCORE_FIRSTMACH
+ 5:
20530 return _("PT_GETFPREGS (fpreg structure)");
20536 /* On all other arch's, PT_GETREGS == mach+1 and
20537 PT_GETFPREGS == mach+3. */
20541 case NT_NETBSDCORE_FIRSTMACH
+ 1:
20542 return _("PT_GETREGS (reg structure)");
20543 case NT_NETBSDCORE_FIRSTMACH
+ 3:
20544 return _("PT_GETFPREGS (fpreg structure)");
20550 snprintf (buff
, sizeof (buff
), "PT_FIRSTMACH+%d",
20551 e_type
- NT_NETBSDCORE_FIRSTMACH
);
20555 static const char *
20556 get_openbsd_elfcore_note_type (Filedata
* filedata
, unsigned e_type
)
20560 case NT_OPENBSD_PROCINFO
:
20561 return _("OpenBSD procinfo structure");
20562 case NT_OPENBSD_AUXV
:
20563 return _("OpenBSD ELF auxiliary vector data");
20564 case NT_OPENBSD_REGS
:
20565 return _("OpenBSD regular registers");
20566 case NT_OPENBSD_FPREGS
:
20567 return _("OpenBSD floating point registers");
20568 case NT_OPENBSD_WCOOKIE
:
20569 return _("OpenBSD window cookie");
20572 return get_note_type (filedata
, e_type
);
20575 static const char *
20576 get_stapsdt_note_type (unsigned e_type
)
20578 static char buff
[64];
20583 return _("NT_STAPSDT (SystemTap probe descriptors)");
20589 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
20594 print_stapsdt_note (Elf_Internal_Note
*pnote
)
20596 size_t len
, maxlen
;
20597 unsigned long addr_size
= is_32bit_elf
? 4 : 8;
20598 char *data
= pnote
->descdata
;
20599 char *data_end
= pnote
->descdata
+ pnote
->descsz
;
20600 bfd_vma pc
, base_addr
, semaphore
;
20601 char *provider
, *probe
, *arg_fmt
;
20603 if (pnote
->descsz
< (addr_size
* 3))
20604 goto stapdt_note_too_small
;
20606 pc
= byte_get ((unsigned char *) data
, addr_size
);
20609 base_addr
= byte_get ((unsigned char *) data
, addr_size
);
20612 semaphore
= byte_get ((unsigned char *) data
, addr_size
);
20615 if (data
>= data_end
)
20616 goto stapdt_note_too_small
;
20617 maxlen
= data_end
- data
;
20618 len
= strnlen (data
, maxlen
);
20625 goto stapdt_note_too_small
;
20627 if (data
>= data_end
)
20628 goto stapdt_note_too_small
;
20629 maxlen
= data_end
- data
;
20630 len
= strnlen (data
, maxlen
);
20637 goto stapdt_note_too_small
;
20639 if (data
>= data_end
)
20640 goto stapdt_note_too_small
;
20641 maxlen
= data_end
- data
;
20642 len
= strnlen (data
, maxlen
);
20649 goto stapdt_note_too_small
;
20651 printf (_(" Provider: %s\n"), provider
);
20652 printf (_(" Name: %s\n"), probe
);
20653 printf (_(" Location: "));
20654 print_vma (pc
, FULL_HEX
);
20655 printf (_(", Base: "));
20656 print_vma (base_addr
, FULL_HEX
);
20657 printf (_(", Semaphore: "));
20658 print_vma (semaphore
, FULL_HEX
);
20660 printf (_(" Arguments: %s\n"), arg_fmt
);
20662 return data
== data_end
;
20664 stapdt_note_too_small
:
20665 printf (_(" <corrupt - note is too small>\n"));
20666 error (_("corrupt stapdt note - the data size is too small\n"));
20671 print_fdo_note (Elf_Internal_Note
* pnote
)
20673 if (pnote
->descsz
> 0 && pnote
->type
== FDO_PACKAGING_METADATA
)
20675 printf (_(" Packaging Metadata: %.*s\n"), (int) pnote
->descsz
, pnote
->descdata
);
20681 static const char *
20682 get_ia64_vms_note_type (unsigned e_type
)
20684 static char buff
[64];
20689 return _("NT_VMS_MHD (module header)");
20691 return _("NT_VMS_LNM (language name)");
20693 return _("NT_VMS_SRC (source files)");
20695 return "NT_VMS_TITLE";
20697 return _("NT_VMS_EIDC (consistency check)");
20698 case NT_VMS_FPMODE
:
20699 return _("NT_VMS_FPMODE (FP mode)");
20700 case NT_VMS_LINKTIME
:
20701 return "NT_VMS_LINKTIME";
20702 case NT_VMS_IMGNAM
:
20703 return _("NT_VMS_IMGNAM (image name)");
20705 return _("NT_VMS_IMGID (image id)");
20706 case NT_VMS_LINKID
:
20707 return _("NT_VMS_LINKID (link id)");
20708 case NT_VMS_IMGBID
:
20709 return _("NT_VMS_IMGBID (build id)");
20710 case NT_VMS_GSTNAM
:
20711 return _("NT_VMS_GSTNAM (sym table name)");
20712 case NT_VMS_ORIG_DYN
:
20713 return "NT_VMS_ORIG_DYN";
20714 case NT_VMS_PATCHTIME
:
20715 return "NT_VMS_PATCHTIME";
20717 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
20723 print_ia64_vms_note (Elf_Internal_Note
* pnote
)
20725 int maxlen
= pnote
->descsz
;
20727 if (maxlen
< 2 || (unsigned long) maxlen
!= pnote
->descsz
)
20728 goto desc_size_fail
;
20730 switch (pnote
->type
)
20734 goto desc_size_fail
;
20736 int l
= (int) strnlen (pnote
->descdata
+ 34, maxlen
- 34);
20738 printf (_(" Creation date : %.17s\n"), pnote
->descdata
);
20739 printf (_(" Last patch date: %.17s\n"), pnote
->descdata
+ 17);
20740 if (l
+ 34 < maxlen
)
20742 printf (_(" Module name : %s\n"), pnote
->descdata
+ 34);
20743 if (l
+ 35 < maxlen
)
20744 printf (_(" Module version : %s\n"), pnote
->descdata
+ 34 + l
+ 1);
20746 printf (_(" Module version : <missing>\n"));
20750 printf (_(" Module name : <missing>\n"));
20751 printf (_(" Module version : <missing>\n"));
20756 printf (_(" Language: %.*s\n"), maxlen
, pnote
->descdata
);
20760 case NT_VMS_FPMODE
:
20761 printf (_(" Floating Point mode: "));
20763 goto desc_size_fail
;
20764 /* FIXME: Generate an error if descsz > 8 ? */
20766 printf ("0x%016" BFD_VMA_FMT
"x\n",
20767 (bfd_vma
) byte_get ((unsigned char *) pnote
->descdata
, 8));
20770 case NT_VMS_LINKTIME
:
20771 printf (_(" Link time: "));
20773 goto desc_size_fail
;
20774 /* FIXME: Generate an error if descsz > 8 ? */
20776 print_vms_time (byte_get ((unsigned char *) pnote
->descdata
, 8));
20780 case NT_VMS_PATCHTIME
:
20781 printf (_(" Patch time: "));
20783 goto desc_size_fail
;
20784 /* FIXME: Generate an error if descsz > 8 ? */
20786 print_vms_time (byte_get ((unsigned char *) pnote
->descdata
, 8));
20790 case NT_VMS_ORIG_DYN
:
20792 goto desc_size_fail
;
20794 printf (_(" Major id: %u, minor id: %u\n"),
20795 (unsigned) byte_get ((unsigned char *) pnote
->descdata
, 4),
20796 (unsigned) byte_get ((unsigned char *) pnote
->descdata
+ 4, 4));
20797 printf (_(" Last modified : "));
20798 print_vms_time (byte_get ((unsigned char *) pnote
->descdata
+ 8, 8));
20799 printf (_("\n Link flags : "));
20800 printf ("0x%016" BFD_VMA_FMT
"x\n",
20801 (bfd_vma
) byte_get ((unsigned char *) pnote
->descdata
+ 16, 8));
20802 printf (_(" Header flags: 0x%08x\n"),
20803 (unsigned) byte_get ((unsigned char *) pnote
->descdata
+ 24, 4));
20804 printf (_(" Image id : %.*s\n"), maxlen
- 32, pnote
->descdata
+ 32);
20808 case NT_VMS_IMGNAM
:
20809 printf (_(" Image name: %.*s\n"), maxlen
, pnote
->descdata
);
20812 case NT_VMS_GSTNAM
:
20813 printf (_(" Global symbol table name: %.*s\n"), maxlen
, pnote
->descdata
);
20817 printf (_(" Image id: %.*s\n"), maxlen
, pnote
->descdata
);
20820 case NT_VMS_LINKID
:
20821 printf (_(" Linker id: %.*s\n"), maxlen
, pnote
->descdata
);
20831 printf (_(" <corrupt - data size is too small>\n"));
20832 error (_("corrupt IA64 note: data size is too small\n"));
20836 struct build_attr_cache
{
20837 Filedata
*filedata
;
20839 unsigned long strtablen
;
20840 Elf_Internal_Sym
*symtab
;
20841 unsigned long nsyms
;
20844 /* Find the symbol associated with a build attribute that is attached
20845 to address OFFSET. If PNAME is non-NULL then store the name of
20846 the symbol (if found) in the provided pointer, Returns NULL if a
20847 symbol could not be found. */
20849 static Elf_Internal_Sym
*
20850 get_symbol_for_build_attribute (Filedata
*filedata
,
20851 unsigned long offset
,
20853 const char **pname
)
20855 Elf_Internal_Sym
*saved_sym
= NULL
;
20856 Elf_Internal_Sym
*sym
;
20858 if (filedata
->section_headers
!= NULL
20859 && (ba_cache
.filedata
== NULL
|| filedata
!= ba_cache
.filedata
))
20861 Elf_Internal_Shdr
* symsec
;
20863 free (ba_cache
.strtab
);
20864 ba_cache
.strtab
= NULL
;
20865 free (ba_cache
.symtab
);
20866 ba_cache
.symtab
= NULL
;
20868 /* Load the symbol and string sections. */
20869 for (symsec
= filedata
->section_headers
;
20870 symsec
< filedata
->section_headers
+ filedata
->file_header
.e_shnum
;
20873 if (symsec
->sh_type
== SHT_SYMTAB
20874 && get_symtab (filedata
, symsec
,
20875 &ba_cache
.symtab
, &ba_cache
.nsyms
,
20876 &ba_cache
.strtab
, &ba_cache
.strtablen
))
20879 ba_cache
.filedata
= filedata
;
20882 if (ba_cache
.symtab
== NULL
)
20885 /* Find a symbol whose value matches offset. */
20886 for (sym
= ba_cache
.symtab
; sym
< ba_cache
.symtab
+ ba_cache
.nsyms
; sym
++)
20887 if (sym
->st_value
== offset
)
20889 if (sym
->st_name
>= ba_cache
.strtablen
)
20890 /* Huh ? This should not happen. */
20893 if (ba_cache
.strtab
[sym
->st_name
] == 0)
20896 /* The AArch64, ARM and RISC-V architectures define mapping symbols
20897 (eg $d, $x, $t) which we want to ignore. */
20898 if (ba_cache
.strtab
[sym
->st_name
] == '$'
20899 && ba_cache
.strtab
[sym
->st_name
+ 1] != 0
20900 && ba_cache
.strtab
[sym
->st_name
+ 2] == 0)
20905 /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
20906 and FILE or OBJECT symbols over NOTYPE symbols. We skip
20907 FUNC symbols entirely. */
20908 switch (ELF_ST_TYPE (sym
->st_info
))
20915 /* If the symbol has a size associated
20916 with it then we can stop searching. */
20917 sym
= ba_cache
.symtab
+ ba_cache
.nsyms
;
20922 /* Ignore function symbols. */
20929 switch (ELF_ST_BIND (sym
->st_info
))
20932 if (saved_sym
== NULL
20933 || ELF_ST_TYPE (saved_sym
->st_info
) != STT_OBJECT
)
20938 if (saved_sym
== NULL
)
20948 if (ELF_ST_TYPE (sym
->st_info
) != STT_FUNC
)
20956 if (saved_sym
&& pname
)
20957 * pname
= ba_cache
.strtab
+ saved_sym
->st_name
;
20962 /* Returns true iff addr1 and addr2 are in the same section. */
20965 same_section (Filedata
* filedata
, unsigned long addr1
, unsigned long addr2
)
20967 Elf_Internal_Shdr
* a1
;
20968 Elf_Internal_Shdr
* a2
;
20970 a1
= find_section_by_address (filedata
, addr1
);
20971 a2
= find_section_by_address (filedata
, addr2
);
20973 return a1
== a2
&& a1
!= NULL
;
20977 print_gnu_build_attribute_description (Elf_Internal_Note
* pnote
,
20978 Filedata
* filedata
)
20980 static unsigned long global_offset
= 0;
20981 static unsigned long global_end
= 0;
20982 static unsigned long func_offset
= 0;
20983 static unsigned long func_end
= 0;
20985 Elf_Internal_Sym
*sym
;
20987 unsigned long start
;
20989 bool is_open_attr
= pnote
->type
== NT_GNU_BUILD_ATTRIBUTE_OPEN
;
20991 switch (pnote
->descsz
)
20994 /* A zero-length description means that the range of
20995 the previous note of the same type should be used. */
20998 if (global_end
> global_offset
)
20999 printf (_(" Applies to region from %#lx to %#lx\n"),
21000 global_offset
, global_end
);
21002 printf (_(" Applies to region from %#lx\n"), global_offset
);
21006 if (func_end
> func_offset
)
21007 printf (_(" Applies to region from %#lx to %#lx\n"), func_offset
, func_end
);
21009 printf (_(" Applies to region from %#lx\n"), func_offset
);
21014 start
= byte_get ((unsigned char *) pnote
->descdata
, 4);
21019 start
= byte_get ((unsigned char *) pnote
->descdata
, 4);
21020 end
= byte_get ((unsigned char *) pnote
->descdata
+ 4, 4);
21024 start
= byte_get ((unsigned char *) pnote
->descdata
, 8);
21025 end
= byte_get ((unsigned char *) pnote
->descdata
+ 8, 8);
21029 error (_(" <invalid description size: %lx>\n"), pnote
->descsz
);
21030 printf (_(" <invalid descsz>"));
21035 sym
= get_symbol_for_build_attribute (filedata
, start
, is_open_attr
, & name
);
21036 /* As of version 5 of the annobin plugin, filename symbols are biased by 2
21037 in order to avoid them being confused with the start address of the
21038 first function in the file... */
21039 if (sym
== NULL
&& is_open_attr
)
21040 sym
= get_symbol_for_build_attribute (filedata
, start
+ 2, is_open_attr
,
21043 if (end
== 0 && sym
!= NULL
&& sym
->st_size
> 0)
21044 end
= start
+ sym
->st_size
;
21048 /* FIXME: Need to properly allow for section alignment.
21049 16 is just the alignment used on x86_64. */
21051 && start
> BFD_ALIGN (global_end
, 16)
21052 /* Build notes are not guaranteed to be organised in order of
21053 increasing address, but we should find the all of the notes
21054 for one section in the same place. */
21055 && same_section (filedata
, start
, global_end
))
21056 warn (_("Gap in build notes detected from %#lx to %#lx\n"),
21057 global_end
+ 1, start
- 1);
21059 printf (_(" Applies to region from %#lx"), start
);
21060 global_offset
= start
;
21064 printf (_(" to %#lx"), end
);
21070 printf (_(" Applies to region from %#lx"), start
);
21071 func_offset
= start
;
21075 printf (_(" to %#lx"), end
);
21081 printf (_(" (%s)"), name
);
21088 print_gnu_build_attribute_name (Elf_Internal_Note
* pnote
)
21090 static const char string_expected
[2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING
, 0 };
21091 static const char number_expected
[2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC
, 0 };
21092 static const char bool_expected
[3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE
, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE
, 0 };
21094 char name_attribute
;
21095 const char * expected_types
;
21096 const char * name
= pnote
->namedata
;
21100 if (name
== NULL
|| pnote
->namesz
< 2)
21102 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote
->namesz
);
21103 print_symbol (-20, _(" <corrupt name>"));
21112 /* Version 2 of the spec adds a "GA" prefix to the name field. */
21113 if (name
[0] == 'G' && name
[1] == 'A')
21115 if (pnote
->namesz
< 4)
21117 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote
->namesz
);
21118 print_symbol (-20, _(" <corrupt name>"));
21127 switch ((name_type
= * name
))
21129 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC
:
21130 case GNU_BUILD_ATTRIBUTE_TYPE_STRING
:
21131 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE
:
21132 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE
:
21133 printf ("%c", * name
);
21137 error (_("unrecognised attribute type in name field: %d\n"), name_type
);
21138 print_symbol (-20, _("<unknown name type>"));
21145 switch ((name_attribute
= * name
))
21147 case GNU_BUILD_ATTRIBUTE_VERSION
:
21148 text
= _("<version>");
21149 expected_types
= string_expected
;
21152 case GNU_BUILD_ATTRIBUTE_STACK_PROT
:
21153 text
= _("<stack prot>");
21154 expected_types
= "!+*";
21157 case GNU_BUILD_ATTRIBUTE_RELRO
:
21158 text
= _("<relro>");
21159 expected_types
= bool_expected
;
21162 case GNU_BUILD_ATTRIBUTE_STACK_SIZE
:
21163 text
= _("<stack size>");
21164 expected_types
= number_expected
;
21167 case GNU_BUILD_ATTRIBUTE_TOOL
:
21168 text
= _("<tool>");
21169 expected_types
= string_expected
;
21172 case GNU_BUILD_ATTRIBUTE_ABI
:
21174 expected_types
= "$*";
21177 case GNU_BUILD_ATTRIBUTE_PIC
:
21179 expected_types
= number_expected
;
21182 case GNU_BUILD_ATTRIBUTE_SHORT_ENUM
:
21183 text
= _("<short enum>");
21184 expected_types
= bool_expected
;
21188 if (ISPRINT (* name
))
21190 int len
= strnlen (name
, pnote
->namesz
- (name
- pnote
->namedata
)) + 1;
21192 if (len
> left
&& ! do_wide
)
21194 printf ("%.*s:", len
, name
);
21200 static char tmpbuf
[128];
21202 error (_("unrecognised byte in name field: %d\n"), * name
);
21203 sprintf (tmpbuf
, _("<unknown:_%d>"), * name
);
21207 expected_types
= "*$!+";
21212 left
-= printf ("%s", text
);
21214 if (strchr (expected_types
, name_type
) == NULL
)
21215 warn (_("attribute does not have an expected type (%c)\n"), name_type
);
21217 if ((unsigned long)(name
- pnote
->namedata
) > pnote
->namesz
)
21219 error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
21220 (unsigned long) pnote
->namesz
,
21221 (long) (name
- pnote
->namedata
));
21225 if (left
< 1 && ! do_wide
)
21230 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC
:
21232 unsigned int bytes
;
21233 unsigned long long val
= 0;
21234 unsigned int shift
= 0;
21235 char * decoded
= NULL
;
21237 bytes
= pnote
->namesz
- (name
- pnote
->namedata
);
21239 /* The -1 is because the name field is always 0 terminated, and we
21240 want to be able to ensure that the shift in the while loop below
21241 will not overflow. */
21244 if (bytes
> sizeof (val
))
21246 error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
21248 bytes
= sizeof (val
);
21250 /* We do not bother to warn if bytes == 0 as this can
21251 happen with some early versions of the gcc plugin. */
21255 unsigned long long byte
= *name
++ & 0xff;
21257 val
|= byte
<< shift
;
21261 switch (name_attribute
)
21263 case GNU_BUILD_ATTRIBUTE_PIC
:
21266 case 0: decoded
= "static"; break;
21267 case 1: decoded
= "pic"; break;
21268 case 2: decoded
= "PIC"; break;
21269 case 3: decoded
= "pie"; break;
21270 case 4: decoded
= "PIE"; break;
21274 case GNU_BUILD_ATTRIBUTE_STACK_PROT
:
21277 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c. */
21278 case 0: decoded
= "off"; break;
21279 case 1: decoded
= "on"; break;
21280 case 2: decoded
= "all"; break;
21281 case 3: decoded
= "strong"; break;
21282 case 4: decoded
= "explicit"; break;
21290 if (decoded
!= NULL
)
21292 print_symbol (-left
, decoded
);
21303 left
-= printf ("0x%llx", val
);
21305 left
-= printf ("0x%-.*llx", left
, val
);
21309 case GNU_BUILD_ATTRIBUTE_TYPE_STRING
:
21310 left
-= print_symbol (- left
, name
);
21312 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE
:
21313 left
-= print_symbol (- left
, "true");
21315 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE
:
21316 left
-= print_symbol (- left
, "false");
21320 if (do_wide
&& left
> 0)
21321 printf ("%-*s", left
, " ");
21326 /* Print the contents of PNOTE as hex. */
21329 print_note_contents_hex (Elf_Internal_Note
*pnote
)
21335 printf (_(" description data: "));
21336 for (i
= 0; i
< pnote
->descsz
; i
++)
21337 printf ("%02x ", pnote
->descdata
[i
] & 0xff);
21346 #if defined HAVE_MSGPACK
21349 print_indents (int n
)
21353 for (int i
= 0; i
< n
; i
++)
21357 /* Print OBJ in human-readable form. */
21360 dump_msgpack_obj (const msgpack_object
*obj
, int indent
)
21364 case MSGPACK_OBJECT_NIL
:
21368 case MSGPACK_OBJECT_BOOLEAN
:
21369 printf ("%s", obj
->via
.boolean
? "true" : "false");
21372 case MSGPACK_OBJECT_POSITIVE_INTEGER
:
21373 printf ("%" PRIu64
, obj
->via
.u64
);
21376 case MSGPACK_OBJECT_NEGATIVE_INTEGER
:
21377 printf ("%" PRIi64
, obj
->via
.i64
);
21380 case MSGPACK_OBJECT_FLOAT32
:
21381 case MSGPACK_OBJECT_FLOAT64
:
21382 printf ("%f", obj
->via
.f64
);
21385 case MSGPACK_OBJECT_STR
:
21386 printf ("\"%.*s\"", obj
->via
.str
.size
, obj
->via
.str
.ptr
);
21389 case MSGPACK_OBJECT_ARRAY
:
21391 const msgpack_object_array
*array
= &obj
->via
.array
;
21396 for (uint32_t i
= 0; i
< array
->size
; ++i
)
21398 const msgpack_object
*item
= &array
->ptr
[i
];
21400 print_indents (indent
);
21401 dump_msgpack_obj (item
, indent
);
21406 print_indents (indent
);
21412 case MSGPACK_OBJECT_MAP
:
21414 const msgpack_object_map
*map
= &obj
->via
.map
;
21419 for (uint32_t i
= 0; i
< map
->size
; ++i
)
21421 const msgpack_object_kv
*kv
= &map
->ptr
[i
];
21422 const msgpack_object
*key
= &kv
->key
;
21423 const msgpack_object
*val
= &kv
->val
;
21425 print_indents (indent
);
21426 dump_msgpack_obj (key
, indent
);
21428 dump_msgpack_obj (val
, indent
);
21434 print_indents (indent
);
21440 case MSGPACK_OBJECT_BIN
:
21444 case MSGPACK_OBJECT_EXT
:
21451 dump_msgpack (const msgpack_unpacked
*msg
)
21454 dump_msgpack_obj (&msg
->data
, 0);
21458 #endif /* defined HAVE_MSGPACK */
21461 print_amdgpu_note (Elf_Internal_Note
*pnote
)
21463 #if defined HAVE_MSGPACK
21464 /* If msgpack is available, decode and dump the note's content. */
21466 msgpack_unpacked msg
;
21467 msgpack_unpack_return msgpack_ret
;
21469 assert (pnote
->type
== NT_AMDGPU_METADATA
);
21471 msgpack_unpacked_init (&msg
);
21472 msgpack_ret
= msgpack_unpack_next (&msg
, pnote
->descdata
, pnote
->descsz
,
21475 switch (msgpack_ret
)
21477 case MSGPACK_UNPACK_SUCCESS
:
21478 dump_msgpack (&msg
);
21483 error (_("failed to unpack msgpack contents in NT_AMDGPU_METADATA note"));
21488 msgpack_unpacked_destroy (&msg
);
21491 /* msgpack is not available, dump contents as hex. */
21492 print_note_contents_hex (pnote
);
21497 /* Note that by the ELF standard, the name field is already null byte
21498 terminated, and namesz includes the terminating null byte.
21499 I.E. the value of namesz for the name "FSF" is 4.
21501 If the value of namesz is zero, there is no name present. */
21504 process_note (Elf_Internal_Note
* pnote
,
21505 Filedata
* filedata
)
21507 const char * name
= pnote
->namesz
? pnote
->namedata
: "(NONE)";
21510 if (pnote
->namesz
== 0)
21511 /* If there is no note name, then use the default set of
21512 note type strings. */
21513 nt
= get_note_type (filedata
, pnote
->type
);
21515 else if (startswith (pnote
->namedata
, "GNU"))
21516 /* GNU-specific object file notes. */
21517 nt
= get_gnu_elf_note_type (pnote
->type
);
21519 else if (startswith (pnote
->namedata
, "AMDGPU"))
21520 /* AMDGPU-specific object file notes. */
21521 nt
= get_amdgpu_elf_note_type (pnote
->type
);
21523 else if (startswith (pnote
->namedata
, "FreeBSD"))
21524 /* FreeBSD-specific core file notes. */
21525 nt
= get_freebsd_elfcore_note_type (filedata
, pnote
->type
);
21527 else if (startswith (pnote
->namedata
, "NetBSD-CORE"))
21528 /* NetBSD-specific core file notes. */
21529 nt
= get_netbsd_elfcore_note_type (filedata
, pnote
->type
);
21531 else if (startswith (pnote
->namedata
, "NetBSD"))
21532 /* NetBSD-specific core file notes. */
21533 return process_netbsd_elf_note (pnote
);
21535 else if (startswith (pnote
->namedata
, "PaX"))
21536 /* NetBSD-specific core file notes. */
21537 return process_netbsd_elf_note (pnote
);
21539 else if (startswith (pnote
->namedata
, "OpenBSD"))
21540 /* OpenBSD-specific core file notes. */
21541 nt
= get_openbsd_elfcore_note_type (filedata
, pnote
->type
);
21543 else if (startswith (pnote
->namedata
, "SPU/"))
21545 /* SPU-specific core file notes. */
21546 nt
= pnote
->namedata
+ 4;
21550 else if (startswith (pnote
->namedata
, "IPF/VMS"))
21551 /* VMS/ia64-specific file notes. */
21552 nt
= get_ia64_vms_note_type (pnote
->type
);
21554 else if (startswith (pnote
->namedata
, "stapsdt"))
21555 nt
= get_stapsdt_note_type (pnote
->type
);
21558 /* Don't recognize this note name; just use the default set of
21559 note type strings. */
21560 nt
= get_note_type (filedata
, pnote
->type
);
21564 if (((startswith (pnote
->namedata
, "GA")
21565 && strchr ("*$!+", pnote
->namedata
[2]) != NULL
)
21566 || strchr ("*$!+", pnote
->namedata
[0]) != NULL
)
21567 && (pnote
->type
== NT_GNU_BUILD_ATTRIBUTE_OPEN
21568 || pnote
->type
== NT_GNU_BUILD_ATTRIBUTE_FUNC
))
21569 print_gnu_build_attribute_name (pnote
);
21571 print_symbol (-20, name
);
21574 printf (" 0x%08lx\t%s\t", pnote
->descsz
, nt
);
21576 printf (" 0x%08lx\t%s\n", pnote
->descsz
, nt
);
21578 if (startswith (pnote
->namedata
, "IPF/VMS"))
21579 return print_ia64_vms_note (pnote
);
21580 else if (startswith (pnote
->namedata
, "GNU"))
21581 return print_gnu_note (filedata
, pnote
);
21582 else if (startswith (pnote
->namedata
, "stapsdt"))
21583 return print_stapsdt_note (pnote
);
21584 else if (startswith (pnote
->namedata
, "CORE"))
21585 return print_core_note (pnote
);
21586 else if (startswith (pnote
->namedata
, "FDO"))
21587 return print_fdo_note (pnote
);
21588 else if (((startswith (pnote
->namedata
, "GA")
21589 && strchr ("*$!+", pnote
->namedata
[2]) != NULL
)
21590 || strchr ("*$!+", pnote
->namedata
[0]) != NULL
)
21591 && (pnote
->type
== NT_GNU_BUILD_ATTRIBUTE_OPEN
21592 || pnote
->type
== NT_GNU_BUILD_ATTRIBUTE_FUNC
))
21593 return print_gnu_build_attribute_description (pnote
, filedata
);
21594 else if (startswith (pnote
->namedata
, "AMDGPU")
21595 && pnote
->type
== NT_AMDGPU_METADATA
)
21596 return print_amdgpu_note (pnote
);
21598 print_note_contents_hex (pnote
);
21603 process_notes_at (Filedata
* filedata
,
21604 Elf_Internal_Shdr
* section
,
21609 Elf_External_Note
*pnotes
;
21610 Elf_External_Note
*external
;
21619 pnotes
= (Elf_External_Note
*) get_section_contents (section
, filedata
);
21622 if (! apply_relocations (filedata
, section
, (unsigned char *) pnotes
, length
, NULL
, NULL
))
21630 pnotes
= (Elf_External_Note
*) get_data (NULL
, filedata
, offset
, 1, length
,
21633 if (pnotes
== NULL
)
21638 if (filedata
->is_separate
)
21639 printf (_("In linked file '%s': "), filedata
->file_name
);
21643 printf (_("Displaying notes found in: %s\n"), printable_section_name (filedata
, section
));
21645 printf (_("Displaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
21646 (unsigned long) offset
, (unsigned long) length
);
21648 /* NB: Some note sections may have alignment value of 0 or 1. gABI
21649 specifies that notes should be aligned to 4 bytes in 32-bit
21650 objects and to 8 bytes in 64-bit objects. As a Linux extension,
21651 we also support 4 byte alignment in 64-bit objects. If section
21652 alignment is less than 4, we treate alignment as 4 bytes. */
21655 else if (align
!= 4 && align
!= 8)
21657 warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
21663 printf (_(" %-20s %-10s\tDescription\n"), _("Owner"), _("Data size"));
21665 end
= (char *) pnotes
+ length
;
21666 while ((char *) external
< end
)
21668 Elf_Internal_Note inote
;
21671 char * temp
= NULL
;
21672 size_t data_remaining
= end
- (char *) external
;
21674 if (!is_ia64_vms (filedata
))
21676 /* PR binutils/15191
21677 Make sure that there is enough data to read. */
21678 min_notesz
= offsetof (Elf_External_Note
, name
);
21679 if (data_remaining
< min_notesz
)
21681 warn (ngettext ("Corrupt note: only %ld byte remains, "
21682 "not enough for a full note\n",
21683 "Corrupt note: only %ld bytes remain, "
21684 "not enough for a full note\n",
21686 (long) data_remaining
);
21689 data_remaining
-= min_notesz
;
21691 inote
.type
= BYTE_GET (external
->type
);
21692 inote
.namesz
= BYTE_GET (external
->namesz
);
21693 inote
.namedata
= external
->name
;
21694 inote
.descsz
= BYTE_GET (external
->descsz
);
21695 inote
.descdata
= ((char *) external
21696 + ELF_NOTE_DESC_OFFSET (inote
.namesz
, align
));
21697 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
21698 next
= ((char *) external
21699 + ELF_NOTE_NEXT_OFFSET (inote
.namesz
, inote
.descsz
, align
));
21703 Elf64_External_VMS_Note
*vms_external
;
21705 /* PR binutils/15191
21706 Make sure that there is enough data to read. */
21707 min_notesz
= offsetof (Elf64_External_VMS_Note
, name
);
21708 if (data_remaining
< min_notesz
)
21710 warn (ngettext ("Corrupt note: only %ld byte remains, "
21711 "not enough for a full note\n",
21712 "Corrupt note: only %ld bytes remain, "
21713 "not enough for a full note\n",
21715 (long) data_remaining
);
21718 data_remaining
-= min_notesz
;
21720 vms_external
= (Elf64_External_VMS_Note
*) external
;
21721 inote
.type
= BYTE_GET (vms_external
->type
);
21722 inote
.namesz
= BYTE_GET (vms_external
->namesz
);
21723 inote
.namedata
= vms_external
->name
;
21724 inote
.descsz
= BYTE_GET (vms_external
->descsz
);
21725 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 3);
21726 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
21727 next
= inote
.descdata
+ align_power (inote
.descsz
, 3);
21730 /* PR 17531: file: 3443835e. */
21731 /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
21732 if ((size_t) (inote
.descdata
- inote
.namedata
) < inote
.namesz
21733 || (size_t) (inote
.descdata
- inote
.namedata
) > data_remaining
21734 || (size_t) (next
- inote
.descdata
) < inote
.descsz
21735 || ((size_t) (next
- inote
.descdata
)
21736 > data_remaining
- (size_t) (inote
.descdata
- inote
.namedata
)))
21738 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
21739 (unsigned long) ((char *) external
- (char *) pnotes
));
21740 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
21741 inote
.type
, inote
.namesz
, inote
.descsz
, (int) align
);
21745 external
= (Elf_External_Note
*) next
;
21747 /* Verify that name is null terminated. It appears that at least
21748 one version of Linux (RedHat 6.0) generates corefiles that don't
21749 comply with the ELF spec by failing to include the null byte in
21751 if (inote
.namesz
> 0 && inote
.namedata
[inote
.namesz
- 1] != '\0')
21753 if ((size_t) (inote
.descdata
- inote
.namedata
) == inote
.namesz
)
21755 temp
= (char *) malloc (inote
.namesz
+ 1);
21758 error (_("Out of memory allocating space for inote name\n"));
21763 memcpy (temp
, inote
.namedata
, inote
.namesz
);
21764 inote
.namedata
= temp
;
21766 inote
.namedata
[inote
.namesz
] = 0;
21769 if (! process_note (& inote
, filedata
))
21782 process_corefile_note_segments (Filedata
* filedata
)
21784 Elf_Internal_Phdr
*segment
;
21788 if (! get_program_headers (filedata
))
21791 for (i
= 0, segment
= filedata
->program_headers
;
21792 i
< filedata
->file_header
.e_phnum
;
21795 if (segment
->p_type
== PT_NOTE
)
21796 if (! process_notes_at (filedata
, NULL
,
21797 (bfd_vma
) segment
->p_offset
,
21798 (bfd_vma
) segment
->p_filesz
,
21799 (bfd_vma
) segment
->p_align
))
21807 process_v850_notes (Filedata
* filedata
, bfd_vma offset
, bfd_vma length
)
21809 Elf_External_Note
* pnotes
;
21810 Elf_External_Note
* external
;
21817 pnotes
= (Elf_External_Note
*) get_data (NULL
, filedata
, offset
, 1, length
,
21819 if (pnotes
== NULL
)
21823 end
= (char*) pnotes
+ length
;
21825 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
21826 (unsigned long) offset
, (unsigned long) length
);
21828 while ((char *) external
+ sizeof (Elf_External_Note
) < end
)
21830 Elf_External_Note
* next
;
21831 Elf_Internal_Note inote
;
21833 inote
.type
= BYTE_GET (external
->type
);
21834 inote
.namesz
= BYTE_GET (external
->namesz
);
21835 inote
.namedata
= external
->name
;
21836 inote
.descsz
= BYTE_GET (external
->descsz
);
21837 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
21838 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
21840 if (inote
.descdata
< (char *) pnotes
|| inote
.descdata
>= end
)
21842 warn (_("Corrupt note: name size is too big: %lx\n"), inote
.namesz
);
21843 inote
.descdata
= inote
.namedata
;
21847 next
= (Elf_External_Note
*) (inote
.descdata
+ align_power (inote
.descsz
, 2));
21849 if ( ((char *) next
> end
)
21850 || ((char *) next
< (char *) pnotes
))
21852 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
21853 (unsigned long) ((char *) external
- (char *) pnotes
));
21854 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
21855 inote
.type
, inote
.namesz
, inote
.descsz
);
21861 /* Prevent out-of-bounds indexing. */
21862 if ( inote
.namedata
+ inote
.namesz
> end
21863 || inote
.namedata
+ inote
.namesz
< inote
.namedata
)
21865 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
21866 (unsigned long) ((char *) external
- (char *) pnotes
));
21867 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
21868 inote
.type
, inote
.namesz
, inote
.descsz
);
21872 printf (" %s: ", get_v850_elf_note_type (inote
.type
));
21874 if (! print_v850_note (& inote
))
21877 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
21878 inote
.namesz
, inote
.descsz
);
21888 process_note_sections (Filedata
* filedata
)
21890 Elf_Internal_Shdr
*section
;
21892 unsigned int n
= 0;
21895 for (i
= 0, section
= filedata
->section_headers
;
21896 i
< filedata
->file_header
.e_shnum
&& section
!= NULL
;
21899 if (section
->sh_type
== SHT_NOTE
)
21901 if (! process_notes_at (filedata
, section
,
21902 (bfd_vma
) section
->sh_offset
,
21903 (bfd_vma
) section
->sh_size
,
21904 (bfd_vma
) section
->sh_addralign
))
21909 if (( filedata
->file_header
.e_machine
== EM_V800
21910 || filedata
->file_header
.e_machine
== EM_V850
21911 || filedata
->file_header
.e_machine
== EM_CYGNUS_V850
)
21912 && section
->sh_type
== SHT_RENESAS_INFO
)
21914 if (! process_v850_notes (filedata
,
21915 (bfd_vma
) section
->sh_offset
,
21916 (bfd_vma
) section
->sh_size
))
21923 /* Try processing NOTE segments instead. */
21924 return process_corefile_note_segments (filedata
);
21930 process_notes (Filedata
* filedata
)
21932 /* If we have not been asked to display the notes then do nothing. */
21936 if (filedata
->file_header
.e_type
!= ET_CORE
)
21937 return process_note_sections (filedata
);
21939 /* No program headers means no NOTE segment. */
21940 if (filedata
->file_header
.e_phnum
> 0)
21941 return process_corefile_note_segments (filedata
);
21943 if (filedata
->is_separate
)
21944 printf (_("No notes found in linked file '%s'.\n"),
21945 filedata
->file_name
);
21947 printf (_("No notes found file.\n"));
21952 static unsigned char *
21953 display_public_gnu_attributes (unsigned char * start
,
21954 const unsigned char * const end
)
21956 printf (_(" Unknown GNU attribute: %s\n"), start
);
21958 start
+= strnlen ((char *) start
, end
- start
);
21959 display_raw_attribute (start
, end
);
21961 return (unsigned char *) end
;
21964 static unsigned char *
21965 display_generic_attribute (unsigned char * start
,
21967 const unsigned char * const end
)
21970 return (unsigned char *) end
;
21972 return display_tag_value (tag
, start
, end
);
21976 process_arch_specific (Filedata
* filedata
)
21981 switch (filedata
->file_header
.e_machine
)
21984 case EM_ARC_COMPACT
:
21985 case EM_ARC_COMPACT2
:
21986 return process_attributes (filedata
, "ARC", SHT_ARC_ATTRIBUTES
,
21987 display_arc_attribute
,
21988 display_generic_attribute
);
21990 return process_attributes (filedata
, "aeabi", SHT_ARM_ATTRIBUTES
,
21991 display_arm_attribute
,
21992 display_generic_attribute
);
21995 case EM_MIPS_RS3_LE
:
21996 return process_mips_specific (filedata
);
21999 return process_attributes (filedata
, "mspabi", SHT_MSP430_ATTRIBUTES
,
22000 display_msp430_attribute
,
22001 display_msp430_gnu_attribute
);
22004 return process_attributes (filedata
, "riscv", SHT_RISCV_ATTRIBUTES
,
22005 display_riscv_attribute
,
22006 display_generic_attribute
);
22009 return process_nds32_specific (filedata
);
22012 return process_attributes (filedata
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
22013 display_m68k_gnu_attribute
);
22017 return process_attributes (filedata
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
22018 display_power_gnu_attribute
);
22022 return process_attributes (filedata
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
22023 display_s390_gnu_attribute
);
22026 case EM_SPARC32PLUS
:
22028 return process_attributes (filedata
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
22029 display_sparc_gnu_attribute
);
22032 return process_attributes (filedata
, "c6xabi", SHT_C6000_ATTRIBUTES
,
22033 display_tic6x_attribute
,
22034 display_generic_attribute
);
22037 return process_attributes (filedata
, "csky", SHT_CSKY_ATTRIBUTES
,
22038 display_csky_attribute
, NULL
);
22041 return process_attributes (filedata
, "gnu", SHT_GNU_ATTRIBUTES
,
22042 display_public_gnu_attributes
,
22043 display_generic_attribute
);
22048 get_file_header (Filedata
* filedata
)
22050 /* Read in the identity array. */
22051 if (fread (filedata
->file_header
.e_ident
, EI_NIDENT
, 1, filedata
->handle
) != 1)
22054 /* Determine how to read the rest of the header. */
22055 switch (filedata
->file_header
.e_ident
[EI_DATA
])
22060 byte_get
= byte_get_little_endian
;
22061 byte_put
= byte_put_little_endian
;
22064 byte_get
= byte_get_big_endian
;
22065 byte_put
= byte_put_big_endian
;
22069 /* For now we only support 32 bit and 64 bit ELF files. */
22070 is_32bit_elf
= (filedata
->file_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
22072 /* Read in the rest of the header. */
22075 Elf32_External_Ehdr ehdr32
;
22077 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, filedata
->handle
) != 1)
22080 filedata
->file_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
22081 filedata
->file_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
22082 filedata
->file_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
22083 filedata
->file_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
22084 filedata
->file_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
22085 filedata
->file_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
22086 filedata
->file_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
22087 filedata
->file_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
22088 filedata
->file_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
22089 filedata
->file_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
22090 filedata
->file_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
22091 filedata
->file_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
22092 filedata
->file_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
22096 Elf64_External_Ehdr ehdr64
;
22098 /* If we have been compiled with sizeof (bfd_vma) == 4, then
22099 we will not be able to cope with the 64bit data found in
22100 64 ELF files. Detect this now and abort before we start
22101 overwriting things. */
22102 if (sizeof (bfd_vma
) < 8)
22104 error (_("This instance of readelf has been built without support for a\n\
22105 64 bit data type and so it cannot read 64 bit ELF files.\n"));
22109 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, filedata
->handle
) != 1)
22112 filedata
->file_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
22113 filedata
->file_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
22114 filedata
->file_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
22115 filedata
->file_header
.e_entry
= BYTE_GET (ehdr64
.e_entry
);
22116 filedata
->file_header
.e_phoff
= BYTE_GET (ehdr64
.e_phoff
);
22117 filedata
->file_header
.e_shoff
= BYTE_GET (ehdr64
.e_shoff
);
22118 filedata
->file_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
22119 filedata
->file_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
22120 filedata
->file_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
22121 filedata
->file_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
22122 filedata
->file_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
22123 filedata
->file_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
22124 filedata
->file_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
22131 free_filedata (Filedata
*filedata
)
22133 free (filedata
->program_interpreter
);
22134 free (filedata
->program_headers
);
22135 free (filedata
->section_headers
);
22136 free (filedata
->string_table
);
22137 free (filedata
->dump
.dump_sects
);
22138 free (filedata
->dynamic_strings
);
22139 free (filedata
->dynamic_symbols
);
22140 free (filedata
->dynamic_syminfo
);
22141 free (filedata
->dynamic_section
);
22143 while (filedata
->symtab_shndx_list
!= NULL
)
22145 elf_section_list
*next
= filedata
->symtab_shndx_list
->next
;
22146 free (filedata
->symtab_shndx_list
);
22147 filedata
->symtab_shndx_list
= next
;
22150 free (filedata
->section_headers_groups
);
22152 if (filedata
->section_groups
)
22155 struct group_list
* g
;
22156 struct group_list
* next
;
22158 for (i
= 0; i
< filedata
->group_count
; i
++)
22160 for (g
= filedata
->section_groups
[i
].root
; g
!= NULL
; g
= next
)
22167 free (filedata
->section_groups
);
22169 memset (&filedata
->section_headers
, 0,
22170 sizeof (Filedata
) - offsetof (Filedata
, section_headers
));
22174 close_file (Filedata
* filedata
)
22178 if (filedata
->handle
)
22179 fclose (filedata
->handle
);
22185 close_debug_file (void * data
)
22187 free_filedata ((Filedata
*) data
);
22188 close_file ((Filedata
*) data
);
22192 open_file (const char * pathname
, bool is_separate
)
22194 struct stat statbuf
;
22195 Filedata
* filedata
= NULL
;
22197 if (stat (pathname
, & statbuf
) < 0
22198 || ! S_ISREG (statbuf
.st_mode
))
22201 filedata
= calloc (1, sizeof * filedata
);
22202 if (filedata
== NULL
)
22205 filedata
->handle
= fopen (pathname
, "rb");
22206 if (filedata
->handle
== NULL
)
22209 filedata
->file_size
= (bfd_size_type
) statbuf
.st_size
;
22210 filedata
->file_name
= pathname
;
22211 filedata
->is_separate
= is_separate
;
22213 if (! get_file_header (filedata
))
22216 if (!get_section_headers (filedata
, false))
22224 if (filedata
->handle
)
22225 fclose (filedata
->handle
);
22232 open_debug_file (const char * pathname
)
22234 return open_file (pathname
, true);
22238 initialise_dump_sects (Filedata
* filedata
)
22240 /* Initialise the dump_sects array from the cmdline_dump_sects array.
22241 Note we do this even if cmdline_dump_sects is empty because we
22242 must make sure that the dump_sets array is zeroed out before each
22243 object file is processed. */
22244 if (filedata
->dump
.num_dump_sects
> cmdline
.num_dump_sects
)
22245 memset (filedata
->dump
.dump_sects
, 0,
22246 filedata
->dump
.num_dump_sects
* sizeof (*filedata
->dump
.dump_sects
));
22248 if (cmdline
.num_dump_sects
> 0)
22250 if (filedata
->dump
.num_dump_sects
== 0)
22251 /* A sneaky way of allocating the dump_sects array. */
22252 request_dump_bynumber (&filedata
->dump
, cmdline
.num_dump_sects
, 0);
22254 assert (filedata
->dump
.num_dump_sects
>= cmdline
.num_dump_sects
);
22255 memcpy (filedata
->dump
.dump_sects
, cmdline
.dump_sects
,
22256 cmdline
.num_dump_sects
* sizeof (*filedata
->dump
.dump_sects
));
22261 might_need_separate_debug_info (Filedata
* filedata
)
22263 /* Debuginfo files do not need further separate file loading. */
22264 if (filedata
->file_header
.e_shstrndx
== SHN_UNDEF
)
22267 /* Since do_follow_links might be enabled by default, only treat it as an
22268 indication that separate files should be loaded if setting it was a
22269 deliberate user action. */
22270 if (DEFAULT_FOR_FOLLOW_LINKS
== 0 && do_follow_links
)
22273 if (process_links
|| do_syms
|| do_unwind
22274 || dump_any_debugging
|| do_dump
|| do_debugging
)
22280 /* Process one ELF object file according to the command line options.
22281 This file may actually be stored in an archive. The file is
22282 positioned at the start of the ELF object. Returns TRUE if no
22283 problems were encountered, FALSE otherwise. */
22286 process_object (Filedata
* filedata
)
22288 bool have_separate_files
;
22292 if (! get_file_header (filedata
))
22294 error (_("%s: Failed to read file header\n"), filedata
->file_name
);
22298 /* Initialise per file variables. */
22299 for (i
= ARRAY_SIZE (filedata
->version_info
); i
--;)
22300 filedata
->version_info
[i
] = 0;
22302 for (i
= ARRAY_SIZE (filedata
->dynamic_info
); i
--;)
22303 filedata
->dynamic_info
[i
] = 0;
22304 filedata
->dynamic_info_DT_GNU_HASH
= 0;
22305 filedata
->dynamic_info_DT_MIPS_XHASH
= 0;
22307 /* Process the file. */
22309 printf (_("\nFile: %s\n"), filedata
->file_name
);
22311 initialise_dump_sects (filedata
);
22313 /* There may be some extensions in the first section header. Don't
22314 bomb if we can't read it. */
22315 get_section_headers (filedata
, true);
22317 if (! process_file_header (filedata
))
22323 /* Throw away the single section header read above, so that we
22324 re-read the entire set. */
22325 free (filedata
->section_headers
);
22326 filedata
->section_headers
= NULL
;
22328 if (! process_section_headers (filedata
))
22330 /* Without loaded section headers we cannot process lots of things. */
22331 do_unwind
= do_version
= do_dump
= do_arch
= false;
22333 if (! do_using_dynamic
)
22334 do_syms
= do_dyn_syms
= do_reloc
= false;
22337 if (! process_section_groups (filedata
))
22338 /* Without loaded section groups we cannot process unwind. */
22341 process_program_headers (filedata
);
22343 res
= process_dynamic_section (filedata
);
22345 if (! process_relocs (filedata
))
22348 if (! process_unwind (filedata
))
22351 if (! process_symbol_table (filedata
))
22354 if (! process_lto_symbol_tables (filedata
))
22357 if (! process_syminfo (filedata
))
22360 if (! process_version_sections (filedata
))
22363 if (might_need_separate_debug_info (filedata
))
22364 have_separate_files
= load_separate_debug_files (filedata
, filedata
->file_name
);
22366 have_separate_files
= false;
22368 if (! process_section_contents (filedata
))
22371 if (have_separate_files
)
22375 for (d
= first_separate_info
; d
!= NULL
; d
= d
->next
)
22377 initialise_dump_sects (d
->handle
);
22379 if (process_links
&& ! process_file_header (d
->handle
))
22381 else if (! process_section_headers (d
->handle
))
22383 else if (! process_section_contents (d
->handle
))
22385 else if (process_links
)
22387 if (! process_section_groups (d
->handle
))
22389 process_program_headers (d
->handle
);
22390 if (! process_dynamic_section (d
->handle
))
22392 if (! process_relocs (d
->handle
))
22394 if (! process_unwind (d
->handle
))
22396 if (! process_symbol_table (d
->handle
))
22398 if (! process_lto_symbol_tables (d
->handle
))
22400 if (! process_syminfo (d
->handle
))
22402 if (! process_version_sections (d
->handle
))
22404 if (! process_notes (d
->handle
))
22409 /* The file handles are closed by the call to free_debug_memory() below. */
22412 if (! process_notes (filedata
))
22415 if (! process_gnu_liblist (filedata
))
22418 if (! process_arch_specific (filedata
))
22422 free_filedata (filedata
);
22424 free_debug_memory ();
22429 /* Process an ELF archive.
22430 On entry the file is positioned just after the ARMAG string.
22431 Returns TRUE upon success, FALSE otherwise. */
22434 process_archive (Filedata
* filedata
, bool is_thin_archive
)
22436 struct archive_info arch
;
22437 struct archive_info nested_arch
;
22443 /* The ARCH structure is used to hold information about this archive. */
22444 arch
.file_name
= NULL
;
22446 arch
.index_array
= NULL
;
22447 arch
.sym_table
= NULL
;
22448 arch
.longnames
= NULL
;
22450 /* The NESTED_ARCH structure is used as a single-item cache of information
22451 about a nested archive (when members of a thin archive reside within
22452 another regular archive file). */
22453 nested_arch
.file_name
= NULL
;
22454 nested_arch
.file
= NULL
;
22455 nested_arch
.index_array
= NULL
;
22456 nested_arch
.sym_table
= NULL
;
22457 nested_arch
.longnames
= NULL
;
22459 if (setup_archive (&arch
, filedata
->file_name
, filedata
->handle
,
22460 filedata
->file_size
, is_thin_archive
,
22461 do_archive_index
) != 0)
22467 if (do_archive_index
)
22469 if (arch
.sym_table
== NULL
)
22470 error (_("%s: unable to dump the index as none was found\n"),
22471 filedata
->file_name
);
22474 unsigned long i
, l
;
22475 unsigned long current_pos
;
22477 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes "
22478 "in the symbol table)\n"),
22479 filedata
->file_name
, (unsigned long) arch
.index_num
,
22482 current_pos
= ftell (filedata
->handle
);
22484 for (i
= l
= 0; i
< arch
.index_num
; i
++)
22487 || (i
> 0 && arch
.index_array
[i
] != arch
.index_array
[i
- 1]))
22490 = get_archive_member_name_at (&arch
, arch
.index_array
[i
],
22493 if (member_name
!= NULL
)
22495 char * qualified_name
22496 = make_qualified_name (&arch
, &nested_arch
,
22499 if (qualified_name
!= NULL
)
22501 printf (_("Contents of binary %s at offset "),
22503 (void) print_vma (arch
.index_array
[i
], PREFIX_HEX
);
22505 free (qualified_name
);
22507 free (member_name
);
22511 if (l
>= arch
.sym_size
)
22513 error (_("%s: end of the symbol table reached "
22514 "before the end of the index\n"),
22515 filedata
->file_name
);
22519 /* PR 17531: file: 0b6630b2. */
22520 printf ("\t%.*s\n",
22521 (int) (arch
.sym_size
- l
), arch
.sym_table
+ l
);
22522 l
+= strnlen (arch
.sym_table
+ l
, arch
.sym_size
- l
) + 1;
22525 if (arch
.uses_64bit_indices
)
22530 if (l
< arch
.sym_size
)
22532 error (ngettext ("%s: %ld byte remains in the symbol table, "
22533 "but without corresponding entries in "
22534 "the index table\n",
22535 "%s: %ld bytes remain in the symbol table, "
22536 "but without corresponding entries in "
22537 "the index table\n",
22538 arch
.sym_size
- l
),
22539 filedata
->file_name
, arch
.sym_size
- l
);
22543 if (fseek (filedata
->handle
, current_pos
, SEEK_SET
) != 0)
22545 error (_("%s: failed to seek back to start of object files "
22546 "in the archive\n"),
22547 filedata
->file_name
);
22553 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
22554 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
22555 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
22556 && !do_section_groups
&& !do_dyn_syms
)
22558 ret
= true; /* Archive index only. */
22567 char * qualified_name
;
22569 /* Read the next archive header. */
22570 if (fseek (filedata
->handle
, arch
.next_arhdr_offset
, SEEK_SET
) != 0)
22572 error (_("%s: failed to seek to next archive header\n"),
22577 got
= fread (&arch
.arhdr
, 1, sizeof arch
.arhdr
, filedata
->handle
);
22578 if (got
!= sizeof arch
.arhdr
)
22582 /* PR 24049 - we cannot use filedata->file_name as this will
22583 have already been freed. */
22584 error (_("%s: failed to read archive header\n"), arch
.file_name
);
22589 if (memcmp (arch
.arhdr
.ar_fmag
, ARFMAG
, 2) != 0)
22591 error (_("%s: did not find a valid archive header\n"),
22597 arch
.next_arhdr_offset
+= sizeof arch
.arhdr
;
22599 filedata
->archive_file_size
= strtoul (arch
.arhdr
.ar_size
, NULL
, 10);
22601 name
= get_archive_member_name (&arch
, &nested_arch
);
22604 error (_("%s: bad archive file name\n"), arch
.file_name
);
22608 namelen
= strlen (name
);
22610 qualified_name
= make_qualified_name (&arch
, &nested_arch
, name
);
22611 if (qualified_name
== NULL
)
22613 error (_("%s: bad archive file name\n"), arch
.file_name
);
22619 if (is_thin_archive
&& arch
.nested_member_origin
== 0)
22621 /* This is a proxy for an external member of a thin archive. */
22622 Filedata
* member_filedata
;
22623 char * member_file_name
= adjust_relative_path
22624 (filedata
->file_name
, name
, namelen
);
22627 if (member_file_name
== NULL
)
22629 free (qualified_name
);
22634 member_filedata
= open_file (member_file_name
, false);
22635 if (member_filedata
== NULL
)
22637 error (_("Input file '%s' is not readable.\n"), member_file_name
);
22638 free (member_file_name
);
22639 free (qualified_name
);
22644 filedata
->archive_file_offset
= arch
.nested_member_origin
;
22645 member_filedata
->file_name
= qualified_name
;
22647 /* The call to process_object() expects the file to be at the beginning. */
22648 rewind (member_filedata
->handle
);
22650 if (! process_object (member_filedata
))
22653 close_file (member_filedata
);
22654 free (member_file_name
);
22656 else if (is_thin_archive
)
22658 Filedata thin_filedata
;
22660 memset (&thin_filedata
, 0, sizeof (thin_filedata
));
22662 /* PR 15140: Allow for corrupt thin archives. */
22663 if (nested_arch
.file
== NULL
)
22665 error (_("%s: contains corrupt thin archive: %s\n"),
22666 qualified_name
, name
);
22667 free (qualified_name
);
22674 /* This is a proxy for a member of a nested archive. */
22675 filedata
->archive_file_offset
22676 = arch
.nested_member_origin
+ sizeof arch
.arhdr
;
22678 /* The nested archive file will have been opened and setup by
22679 get_archive_member_name. */
22680 if (fseek (nested_arch
.file
, filedata
->archive_file_offset
,
22683 error (_("%s: failed to seek to archive member.\n"),
22684 nested_arch
.file_name
);
22685 free (qualified_name
);
22690 thin_filedata
.handle
= nested_arch
.file
;
22691 thin_filedata
.file_name
= qualified_name
;
22693 if (! process_object (& thin_filedata
))
22699 filedata
->archive_file_offset
= arch
.next_arhdr_offset
;
22700 filedata
->file_name
= qualified_name
;
22701 if (! process_object (filedata
))
22703 arch
.next_arhdr_offset
+= (filedata
->archive_file_size
+ 1) & -2;
22704 /* Stop looping with "negative" archive_file_size. */
22705 if (arch
.next_arhdr_offset
< filedata
->archive_file_size
)
22706 arch
.next_arhdr_offset
= -1ul;
22709 free (qualified_name
);
22713 if (nested_arch
.file
!= NULL
)
22714 fclose (nested_arch
.file
);
22715 release_archive (&nested_arch
);
22716 release_archive (&arch
);
22722 process_file (char * file_name
)
22724 Filedata
* filedata
= NULL
;
22725 struct stat statbuf
;
22726 char armag
[SARMAG
];
22729 if (stat (file_name
, &statbuf
) < 0)
22731 if (errno
== ENOENT
)
22732 error (_("'%s': No such file\n"), file_name
);
22734 error (_("Could not locate '%s'. System error message: %s\n"),
22735 file_name
, strerror (errno
));
22739 if (! S_ISREG (statbuf
.st_mode
))
22741 error (_("'%s' is not an ordinary file\n"), file_name
);
22745 filedata
= calloc (1, sizeof * filedata
);
22746 if (filedata
== NULL
)
22748 error (_("Out of memory allocating file data structure\n"));
22752 filedata
->file_name
= file_name
;
22753 filedata
->handle
= fopen (file_name
, "rb");
22754 if (filedata
->handle
== NULL
)
22756 error (_("Input file '%s' is not readable.\n"), file_name
);
22761 if (fread (armag
, SARMAG
, 1, filedata
->handle
) != 1)
22763 error (_("%s: Failed to read file's magic number\n"), file_name
);
22764 fclose (filedata
->handle
);
22769 filedata
->file_size
= (bfd_size_type
) statbuf
.st_size
;
22770 filedata
->is_separate
= false;
22772 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
22774 if (! process_archive (filedata
, false))
22777 else if (memcmp (armag
, ARMAGT
, SARMAG
) == 0)
22779 if ( ! process_archive (filedata
, true))
22784 if (do_archive_index
&& !check_all
)
22785 error (_("File %s is not an archive so its index cannot be displayed.\n"),
22788 rewind (filedata
->handle
);
22789 filedata
->archive_file_size
= filedata
->archive_file_offset
= 0;
22791 if (! process_object (filedata
))
22795 fclose (filedata
->handle
);
22796 free (filedata
->section_headers
);
22797 free (filedata
->program_headers
);
22798 free (filedata
->string_table
);
22799 free (filedata
->dump
.dump_sects
);
22802 free (ba_cache
.strtab
);
22803 ba_cache
.strtab
= NULL
;
22804 free (ba_cache
.symtab
);
22805 ba_cache
.symtab
= NULL
;
22806 ba_cache
.filedata
= NULL
;
22811 #ifdef SUPPORT_DISASSEMBLY
22812 /* Needed by the i386 disassembler. For extra credit, someone could
22813 fix this so that we insert symbolic addresses here, esp for GOT/PLT
22817 print_address (unsigned int addr
, FILE * outfile
)
22819 fprintf (outfile
,"0x%8.8x", addr
);
22822 /* Needed by the i386 disassembler. */
22825 db_task_printsym (unsigned int addr
)
22827 print_address (addr
, stderr
);
22832 main (int argc
, char ** argv
)
22836 #ifdef HAVE_LC_MESSAGES
22837 setlocale (LC_MESSAGES
, "");
22839 setlocale (LC_CTYPE
, "");
22840 bindtextdomain (PACKAGE
, LOCALEDIR
);
22841 textdomain (PACKAGE
);
22843 expandargv (&argc
, &argv
);
22845 parse_args (& cmdline
, argc
, argv
);
22847 if (optind
< (argc
- 1))
22848 /* When displaying information for more than one file,
22849 prefix the information with the file name. */
22851 else if (optind
>= argc
)
22853 /* Ensure that the warning is always displayed. */
22856 warn (_("Nothing to do.\n"));
22861 while (optind
< argc
)
22862 if (! process_file (argv
[optind
++]))
22865 free (cmdline
.dump_sects
);
22867 free (dump_ctf_symtab_name
);
22868 free (dump_ctf_strtab_name
);
22869 free (dump_ctf_parent_name
);
22871 return err
? EXIT_FAILURE
: EXIT_SUCCESS
;